diff options
6 files changed, 39 insertions, 8 deletions
| diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java index ebed1fcdb48b..27e4c85e1e02 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java @@ -63,8 +63,9 @@ public class InputConsumerController {       */      private final class InputEventReceiver extends BatchedInputEventReceiver { -        public InputEventReceiver(InputChannel inputChannel, Looper looper) { -            super(inputChannel, looper, Choreographer.getInstance()); +        InputEventReceiver(InputChannel inputChannel, Looper looper, +                Choreographer choreographer) { +            super(inputChannel, looper, choreographer);          }          @Override @@ -143,6 +144,14 @@ public class InputConsumerController {       * Registers the input consumer.       */      public void registerInputConsumer() { +        registerInputConsumer(false); +    } + +    /** +     * Registers the input consumer. +     * @param withSfVsync the flag set using sf vsync signal or no +     */ +    public void registerInputConsumer(boolean withSfVsync) {          if (mInputEventReceiver == null) {              final InputChannel inputChannel = new InputChannel();              try { @@ -152,7 +161,8 @@ public class InputConsumerController {              } catch (RemoteException e) {                  Log.e(TAG, "Failed to create input consumer", e);              } -            mInputEventReceiver = new InputEventReceiver(inputChannel, Looper.myLooper()); +            mInputEventReceiver = new InputEventReceiver(inputChannel, Looper.myLooper(), +                    withSfVsync ? Choreographer.getSfInstance() : Choreographer.getInstance());              if (mRegistrationListener != null) {                  mRegistrationListener.onRegistrationChanged(true /* isRegistered */);              } diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java index 7f7e1085d497..2980f11b3cbc 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java @@ -16,6 +16,7 @@  package com.android.systemui.pip; +import android.animation.AnimationHandler;  import android.animation.Animator;  import android.animation.ValueAnimator;  import android.annotation.IntDef; @@ -26,6 +27,7 @@ import android.view.animation.AnimationUtils;  import android.view.animation.Interpolator;  import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.graphics.SfVsyncFrameCallbackProvider;  import java.lang.annotation.Retention;  import java.lang.annotation.RetentionPolicy; @@ -79,6 +81,13 @@ public class PipAnimationController {      private PipTransitionAnimator mCurrentAnimator; +    private ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal = +            ThreadLocal.withInitial(() -> { +                AnimationHandler handler = new AnimationHandler(); +                handler.setProvider(new SfVsyncFrameCallbackProvider()); +                return handler; +            }); +      @Inject      PipAnimationController(Context context, PipSurfaceTransactionHelper helper) {          mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, @@ -135,6 +144,7 @@ public class PipAnimationController {          animator.setSurfaceTransactionHelper(mSurfaceTransactionHelper);          animator.setInterpolator(mFastOutSlowInInterpolator);          animator.setFloatValues(FRACTION_START, FRACTION_END); +        animator.setAnimationHandler(mSfAnimationHandlerThreadLocal.get());          return animator;      } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index b714bff15d8a..e38bfb441a0b 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -269,7 +269,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio              if (stackInfo != null) {                  // If SystemUI restart, and it already existed a pinned stack,                  // register the pip input consumer to ensure touch can send to it. -                mInputConsumerController.registerInputConsumer(); +                mInputConsumerController.registerInputConsumer(true /* withSfVsync */);              }          } catch (RemoteException | UnsupportedOperationException e) {              e.printStackTrace(); diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java index 8b4d932619a9..31d292fa3fd7 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java @@ -197,7 +197,7 @@ public class PipMenuActivityController {      }      public void onActivityPinned() { -        mInputConsumerController.registerInputConsumer(); +        mInputConsumerController.registerInputConsumer(true /* withSfVsync */);      }      public void onActivityUnpinned() { diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java index 2e75bab7ae32..d077666f8184 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java @@ -23,9 +23,11 @@ import android.content.Context;  import android.graphics.Rect;  import android.os.Debug;  import android.util.Log; +import android.view.Choreographer;  import androidx.dynamicanimation.animation.SpringForce; +import com.android.internal.graphics.SfVsyncFrameCallbackProvider;  import com.android.systemui.pip.PipSnapAlgorithm;  import com.android.systemui.pip.PipTaskOrganizer;  import com.android.systemui.util.FloatingContentCoordinator; @@ -68,6 +70,9 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,      /** The region that all of PIP must stay within. */      private final Rect mFloatingAllowedArea = new Rect(); +    private final SfVsyncFrameCallbackProvider mSfVsyncFrameProvider = +            new SfVsyncFrameCallbackProvider(); +      /**       * Bounds that are animated using the physics animator.       */ @@ -79,6 +84,10 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,      /** Coordinator instance for resolving conflicts with other floating content. */      private FloatingContentCoordinator mFloatingContentCoordinator; +    /** Callback that re-sizes PIP to the animated bounds. */ +    private final Choreographer.FrameCallback mResizePipVsyncCallback = +            l -> resizePipUnchecked(mAnimatedBounds); +      /**       * PhysicsAnimator instance for animating {@link #mAnimatedBounds} using physics animations.       */ @@ -89,7 +98,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,       * Update listener that resizes the PIP to {@link #mAnimatedBounds}.       */      final PhysicsAnimator.UpdateListener<Rect> mResizePipUpdateListener = -            (target, values) -> resizePipUnchecked(mAnimatedBounds); +            (target, values) -> mSfVsyncFrameProvider.postFrameCallback(mResizePipVsyncCallback);      /** FlingConfig instances provided to PhysicsAnimator for fling gestures. */      private PhysicsAnimator.FlingConfig mFlingConfigX; diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java index bafbd216b1a2..f6b212c6f19f 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java @@ -32,6 +32,8 @@ import android.hardware.input.InputManager;  import android.os.Handler;  import android.os.Looper;  import android.provider.DeviceConfig; +import android.view.BatchedInputEventReceiver; +import android.view.Choreographer;  import android.view.InputChannel;  import android.view.InputEvent;  import android.view.InputEventReceiver; @@ -323,9 +325,9 @@ public class PipResizeGestureHandler {          mMinSize.set(minX, minY);      } -    class SysUiInputEventReceiver extends InputEventReceiver { +    class SysUiInputEventReceiver extends BatchedInputEventReceiver {          SysUiInputEventReceiver(InputChannel channel, Looper looper) { -            super(channel, looper); +            super(channel, looper, Choreographer.getSfInstance());          }          public void onInputEvent(InputEvent event) { |