Loading packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +12 −10 Original line number Diff line number Diff line Loading @@ -26,9 +26,10 @@ import android.os.Debug; import android.util.Log; import android.view.Choreographer; import androidx.dynamicanimation.animation.AnimationHandler; import androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackScheduler; 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; Loading Loading @@ -74,9 +75,6 @@ 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(); /** * Temporary bounds used when PIP is being dragged or animated. These bounds are applied to PIP * using {@link PipTaskOrganizer#scheduleUserResizePip}, so that we can animate shrinking into Loading @@ -94,8 +92,13 @@ 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; private ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal = ThreadLocal.withInitial(() -> { FrameCallbackScheduler scheduler = runnable -> Choreographer.getSfInstance().postFrameCallback(t -> runnable.run()); AnimationHandler handler = new AnimationHandler(scheduler); return handler; }); /** * PhysicsAnimator instance for animating {@link #mTemporaryBounds} using physics animations. Loading Loading @@ -171,16 +174,15 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, mSnapAlgorithm = snapAlgorithm; mFloatingContentCoordinator = floatingContentCoordinator; mPipTaskOrganizer.registerPipTransitionCallback(mPipTransitionCallback); mTemporaryBoundsPhysicsAnimator.setCustomAnimationHandler( mSfAnimationHandlerThreadLocal.get()); mResizePipVsyncCallback = l -> { mResizePipUpdateListener = (target, values) -> { if (!mTemporaryBounds.isEmpty()) { mPipTaskOrganizer.scheduleUserResizePip( mBounds, mTemporaryBounds, null); } }; mResizePipUpdateListener = (target, values) -> mSfVsyncFrameProvider.postFrameCallback(mResizePipVsyncCallback); } @NonNull Loading packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt +42 −6 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.os.Looper import android.util.ArrayMap import android.util.Log import android.view.View import androidx.dynamicanimation.animation.AnimationHandler import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.FlingAnimation import androidx.dynamicanimation.animation.FloatPropertyCompat Loading Loading @@ -123,6 +124,12 @@ class PhysicsAnimator<T> private constructor (target: T) { /** FlingConfig to use by default for properties whose fling configs were not provided. */ private var defaultFling: FlingConfig = globalDefaultFling /** * AnimationHandler to use if it need custom AnimationHandler, if this is null, it will use * the default AnimationHandler in the DynamicAnimation. */ private var customAnimationHandler: AnimationHandler? = null /** * Internal listeners that respond to DynamicAnimations updating and ending, and dispatch to * the listeners provided via [addUpdateListener] and [addEndListener]. This allows us to add Loading Loading @@ -447,6 +454,14 @@ class PhysicsAnimator<T> private constructor (target: T) { this.defaultFling = defaultFling } /** * Set the custom AnimationHandler for all aniatmion in this animator. Set this with null for * restoring to default AnimationHandler. */ fun setCustomAnimationHandler(handler: AnimationHandler) { this.customAnimationHandler = handler } /** Starts the animations! */ fun start() { startAction() Loading Loading @@ -501,10 +516,13 @@ class PhysicsAnimator<T> private constructor (target: T) { // springs) on this property before flinging. cancel(animatedProperty) // Apply the custom animation handler if it not null val flingAnim = getFlingAnimation(animatedProperty, target) flingAnim.animationHandler = customAnimationHandler ?: flingAnim.animationHandler // Apply the configuration and start the animation. getFlingAnimation(animatedProperty, target) .also { flingConfig.applyToAnimation(it) } .start() flingAnim.also { flingConfig.applyToAnimation(it) }.start() } } Loading @@ -516,6 +534,21 @@ class PhysicsAnimator<T> private constructor (target: T) { if (flingConfig == null) { // Apply the configuration and start the animation. val springAnim = getSpringAnimation(animatedProperty, target) // If customAnimationHander is exist and has not been set to the animation, // it should set here. if (customAnimationHandler != null && springAnim.animationHandler != customAnimationHandler) { // Cancel the animation before set animation handler if (springAnim.isRunning) { cancel(animatedProperty) } // Apply the custom animation handler if it not null springAnim.animationHandler = customAnimationHandler ?: springAnim.animationHandler } // Apply the configuration and start the animation. springConfig.applyToAnimation(springAnim) animationStartActions.add(springAnim::start) } else { Loading Loading @@ -570,10 +603,13 @@ class PhysicsAnimator<T> private constructor (target: T) { } } // Apply the custom animation handler if it not null val springAnim = getSpringAnimation(animatedProperty, target) springAnim.animationHandler = customAnimationHandler ?: springAnim.animationHandler // Apply the configuration and start the spring animation. getSpringAnimation(animatedProperty, target) .also { springConfig.applyToAnimation(it) } .start() springAnim.also { springConfig.applyToAnimation(it) }.start() } } }) Loading Loading
packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +12 −10 Original line number Diff line number Diff line Loading @@ -26,9 +26,10 @@ import android.os.Debug; import android.util.Log; import android.view.Choreographer; import androidx.dynamicanimation.animation.AnimationHandler; import androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackScheduler; 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; Loading Loading @@ -74,9 +75,6 @@ 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(); /** * Temporary bounds used when PIP is being dragged or animated. These bounds are applied to PIP * using {@link PipTaskOrganizer#scheduleUserResizePip}, so that we can animate shrinking into Loading @@ -94,8 +92,13 @@ 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; private ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal = ThreadLocal.withInitial(() -> { FrameCallbackScheduler scheduler = runnable -> Choreographer.getSfInstance().postFrameCallback(t -> runnable.run()); AnimationHandler handler = new AnimationHandler(scheduler); return handler; }); /** * PhysicsAnimator instance for animating {@link #mTemporaryBounds} using physics animations. Loading Loading @@ -171,16 +174,15 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, mSnapAlgorithm = snapAlgorithm; mFloatingContentCoordinator = floatingContentCoordinator; mPipTaskOrganizer.registerPipTransitionCallback(mPipTransitionCallback); mTemporaryBoundsPhysicsAnimator.setCustomAnimationHandler( mSfAnimationHandlerThreadLocal.get()); mResizePipVsyncCallback = l -> { mResizePipUpdateListener = (target, values) -> { if (!mTemporaryBounds.isEmpty()) { mPipTaskOrganizer.scheduleUserResizePip( mBounds, mTemporaryBounds, null); } }; mResizePipUpdateListener = (target, values) -> mSfVsyncFrameProvider.postFrameCallback(mResizePipVsyncCallback); } @NonNull Loading
packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt +42 −6 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.os.Looper import android.util.ArrayMap import android.util.Log import android.view.View import androidx.dynamicanimation.animation.AnimationHandler import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.FlingAnimation import androidx.dynamicanimation.animation.FloatPropertyCompat Loading Loading @@ -123,6 +124,12 @@ class PhysicsAnimator<T> private constructor (target: T) { /** FlingConfig to use by default for properties whose fling configs were not provided. */ private var defaultFling: FlingConfig = globalDefaultFling /** * AnimationHandler to use if it need custom AnimationHandler, if this is null, it will use * the default AnimationHandler in the DynamicAnimation. */ private var customAnimationHandler: AnimationHandler? = null /** * Internal listeners that respond to DynamicAnimations updating and ending, and dispatch to * the listeners provided via [addUpdateListener] and [addEndListener]. This allows us to add Loading Loading @@ -447,6 +454,14 @@ class PhysicsAnimator<T> private constructor (target: T) { this.defaultFling = defaultFling } /** * Set the custom AnimationHandler for all aniatmion in this animator. Set this with null for * restoring to default AnimationHandler. */ fun setCustomAnimationHandler(handler: AnimationHandler) { this.customAnimationHandler = handler } /** Starts the animations! */ fun start() { startAction() Loading Loading @@ -501,10 +516,13 @@ class PhysicsAnimator<T> private constructor (target: T) { // springs) on this property before flinging. cancel(animatedProperty) // Apply the custom animation handler if it not null val flingAnim = getFlingAnimation(animatedProperty, target) flingAnim.animationHandler = customAnimationHandler ?: flingAnim.animationHandler // Apply the configuration and start the animation. getFlingAnimation(animatedProperty, target) .also { flingConfig.applyToAnimation(it) } .start() flingAnim.also { flingConfig.applyToAnimation(it) }.start() } } Loading @@ -516,6 +534,21 @@ class PhysicsAnimator<T> private constructor (target: T) { if (flingConfig == null) { // Apply the configuration and start the animation. val springAnim = getSpringAnimation(animatedProperty, target) // If customAnimationHander is exist and has not been set to the animation, // it should set here. if (customAnimationHandler != null && springAnim.animationHandler != customAnimationHandler) { // Cancel the animation before set animation handler if (springAnim.isRunning) { cancel(animatedProperty) } // Apply the custom animation handler if it not null springAnim.animationHandler = customAnimationHandler ?: springAnim.animationHandler } // Apply the configuration and start the animation. springConfig.applyToAnimation(springAnim) animationStartActions.add(springAnim::start) } else { Loading Loading @@ -570,10 +603,13 @@ class PhysicsAnimator<T> private constructor (target: T) { } } // Apply the custom animation handler if it not null val springAnim = getSpringAnimation(animatedProperty, target) springAnim.animationHandler = customAnimationHandler ?: springAnim.animationHandler // Apply the configuration and start the spring animation. getSpringAnimation(animatedProperty, target) .also { springConfig.applyToAnimation(it) } .start() springAnim.also { springConfig.applyToAnimation(it) }.start() } } }) Loading