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

Commit c8fe3628 authored by George Mount's avatar George Mount
Browse files

Clear the EnterTransitionCoordinator only after onResume.

Fixes: 141875256
Fixes: 142224519

In ActivityTransitionState, the mEnterTransitionCoordinator
was being set to null as soon as the transition finished. In
tests, transitions were being finished immediately and the
mEnterTransitionCoordinator was being set to null immediately.
That left time for the same transition to be started again
at a later time.

This waits until the onResume() is called before potentially
clearing the mEnterTransitionCoordinator. This means that all
potential other times where a new EnterTransitionCoordinator
may have been created have already passed and it is safe to
clear the mEnterTransitionCoordinator.

Test: ran ActivityTransition tests
Change-Id: I91978a3c992b533b9074409f05c006fe700d7983
parent fc2cbb96
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -204,14 +204,7 @@ class ActivityTransitionState {
        }
        mEnterTransitionCoordinator = new EnterTransitionCoordinator(activity,
                resultReceiver, sharedElementNames, mEnterActivityOptions.isReturning(),
                mEnterActivityOptions.isCrossTask(),
                () -> {
                    if (isReturning) {
                        // once it is done transitioning, we don't need the coordinator --
                        // if we kept it around, it could leak Views
                        mEnterTransitionCoordinator = null;
                    }
                });
                mEnterActivityOptions.isCrossTask());
        if (mEnterActivityOptions.isCrossTask()) {
            mExitingFrom = new ArrayList<>(mEnterActivityOptions.getSharedElementNames());
            mExitingTo = new ArrayList<>(mEnterActivityOptions.getSharedElementNames());
@@ -280,6 +273,10 @@ class ActivityTransitionState {
                            mEnterTransitionCoordinator.isWaitingForRemoteExit()) {
                        restoreExitedViews();
                        restoreReenteringViews();
                    } else if (mEnterTransitionCoordinator.isReturning()) {
                        mEnterTransitionCoordinator.runAfterTransitionsComplete(() -> {
                            mEnterTransitionCoordinator = null;
                        });
                    }
                }
            }, 1000);
+9 −4
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package android.app;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.annotation.NonNull;
import android.app.SharedElementCallback.OnSharedElementsReadyListener;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
@@ -70,13 +69,11 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private Runnable mOnTransitionComplete;

    EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames, boolean isReturning, boolean isCrossTask,
            @NonNull Runnable onTransitionComplete) {
            ArrayList<String> sharedElementNames, boolean isReturning, boolean isCrossTask) {
        super(activity.getWindow(), sharedElementNames,
                getListener(activity, isReturning && !isCrossTask), isReturning);
        mActivity = activity;
        mIsCrossTask = isCrossTask;
        mOnTransitionComplete = onTransitionComplete;
        setResultReceiver(resultReceiver);
        prepareEnter();
        Bundle resultReceiverBundle = new Bundle();
@@ -570,6 +567,14 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        return transition;
    }

    public void runAfterTransitionsComplete(Runnable onTransitionComplete) {
        if (!isTransitionRunning()) {
            onTransitionsComplete();
        } else {
            mOnTransitionComplete = onTransitionComplete;
        }
    }

    @Override
    protected void onTransitionsComplete() {
        moveSharedElementsFromOverlay();