From ccff27878090bf5a145df33d5de8dc4383aaaf59 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Wed, 4 May 2022 22:08:14 +0000 Subject: Start edge extension animations in sync Block running animations until all pending edge extensions preprocessing is completed. This does mean that we might in edge cases overlay delay animations if edge extension animations are posted before the previous ones are ready to run. Test: atest CtsWindowManagerDeviceTestCases:ActivityTransitionTests Bug: 227449117 Change-Id: If1bb0cd3fb563649a402782364baf040d2ed0e59 --- .../com/android/server/wm/SurfaceAnimationRunner.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java index 4068a97a881a..c7f8a1e2068a 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java @@ -158,7 +158,7 @@ class SurfaceAnimationRunner { void continueStartingAnimations() { synchronized (mLock) { mAnimationStartDeferred = false; - if (!mPendingAnimations.isEmpty()) { + if (!mPendingAnimations.isEmpty() && mPreProcessingAnimations.isEmpty()) { mChoreographer.postFrameCallback(this::startAnimations); } } @@ -204,7 +204,7 @@ class SurfaceAnimationRunner { mPreProcessingAnimations.remove(animationLeash); mPendingAnimations.put(animationLeash, runningAnim); - if (!mAnimationStartDeferred) { + if (!mAnimationStartDeferred && mPreProcessingAnimations.isEmpty()) { mChoreographer.postFrameCallback(this::startAnimations); } } @@ -214,7 +214,7 @@ class SurfaceAnimationRunner { if (!requiresEdgeExtension) { mPendingAnimations.put(animationLeash, runningAnim); - if (!mAnimationStartDeferred) { + if (!mAnimationStartDeferred && mPreProcessingAnimations.isEmpty()) { mChoreographer.postFrameCallback(this::startAnimations); } @@ -330,6 +330,14 @@ class SurfaceAnimationRunner { private void startAnimations(long frameTimeNanos) { synchronized (mLock) { + if (!mPreProcessingAnimations.isEmpty()) { + // We only want to start running animations once all mPreProcessingAnimations have + // been processed to ensure preprocessed animations start in sync. + // NOTE: This means we might delay running animations that require preprocessing if + // new animations that also require preprocessing are requested before the previous + // ones have finished (see b/227449117). + return; + } startPendingAnimationsLocked(); } mPowerManagerInternal.setPowerBoost(Boost.INTERACTION, 0); @@ -553,4 +561,4 @@ class SurfaceAnimationRunner { return mAnimationHandler; } } -} +} \ No newline at end of file -- cgit v1.2.3-59-g8ed1b