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

Commit 2d53bb2d authored by xi yu's avatar xi yu
Browse files

[Bugfix][RemoteAnimation] Fix IndexOutOfBoundsException in onAnimationFinished of

RemoteAnimationController

Sometimes mPendingAnimations.remove will be called more than once in one cycle (line 255 - 270) of 
onAnimationFinished, e.g., mPendingAnimations.remove being called again in 
adapters.mAdapter.mCapturedFinishCallback.onAnimationFinished, resulting in 
IndexOutOfBoundsException.

Bug:237989368

Change-Id: Ica771f1ae4cb4ddddb7684bd964504ca9f31ea12
Test: Monkey test
parent eb681f39
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ class RemoteAnimationController implements DeathRecipient {
    final ArrayList<NonAppWindowAnimationAdapter> mPendingNonAppAnimations = new ArrayList<>();
    private final Handler mHandler;
    private final Runnable mTimeoutRunnable = () -> cancelAnimation("timeoutRunnable");
    private boolean mIsFinishing;

    private FinishedCallback mFinishedCallback;
    private boolean mCanceled;
@@ -246,6 +247,7 @@ class RemoteAnimationController implements DeathRecipient {
                mPendingAnimations.size());
        mHandler.removeCallbacks(mTimeoutRunnable);
        synchronized (mService.mGlobalLock) {
            mIsFinishing = true;
            unlinkToDeathOfRunner();
            releaseFinishedCallback();
            mService.openSurfaceTransaction();
@@ -290,6 +292,7 @@ class RemoteAnimationController implements DeathRecipient {
                throw e;
            } finally {
                mService.closeSurfaceTransaction("RemoteAnimationController#finished");
                mIsFinishing = false;
            }
        }
        setRunningRemoteAnimation(false);
@@ -501,6 +504,9 @@ class RemoteAnimationController implements DeathRecipient {

        @Override
        public void onAnimationCancelled(SurfaceControl animationLeash) {
            if (mIsFinishing) {
                return;
            }
            if (mRecord.mAdapter == this) {
                mRecord.mAdapter = null;
            } else {