Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccff2787 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

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
parent 5ecc0793
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -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);