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
This commit is contained in:
Pablo Gamito
2022-05-04 22:08:14 +00:00
parent 5ecc0793a1
commit ccff278780

View File

@@ -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;
}
}
}
}