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

Commit 785334ae authored by George Mount's avatar George Mount
Browse files

Clear reference to EnterTransitionCoordinator when done

Fixes: 141162306

When transitions have completed, the EnterTransitionCoordinator
is no longer needed, so should be cleared so that its references
can be released.

Test: ran code producing the leak
Change-Id: Ia049d88a45dc27b77fcf4ab58a444457a6b87f88
parent bea7e7fc
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -197,13 +197,21 @@ class ActivityTransitionState {
        mHasExited = false;
        ArrayList<String> sharedElementNames = mEnterActivityOptions.getSharedElementNames();
        ResultReceiver resultReceiver = mEnterActivityOptions.getResultReceiver();
        if (mEnterActivityOptions.isReturning()) {
        final boolean isReturning = mEnterActivityOptions.isReturning();
        if (isReturning) {
            restoreExitedViews();
            activity.getWindow().getDecorView().setVisibility(View.VISIBLE);
        }
        mEnterTransitionCoordinator = new EnterTransitionCoordinator(activity,
                resultReceiver, sharedElementNames, mEnterActivityOptions.isReturning(),
                mEnterActivityOptions.isCrossTask());
                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;
                    }
                });
        if (mEnterActivityOptions.isCrossTask()) {
            mExitingFrom = new ArrayList<>(mEnterActivityOptions.getSharedElementNames());
            mExitingTo = new ArrayList<>(mEnterActivityOptions.getSharedElementNames());
+14 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ 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;
@@ -66,13 +67,16 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private final boolean mIsCrossTask;
    private Drawable mReplacedBackground;
    private ArrayList<String> mPendingExitNames;
    private Runnable mOnTransitionComplete;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames, boolean isReturning, boolean isCrossTask) {
    EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames, boolean isReturning, boolean isCrossTask,
            @NonNull Runnable onTransitionComplete) {
        super(activity.getWindow(), sharedElementNames,
                getListener(activity, isReturning && !isCrossTask), isReturning);
        mActivity = activity;
        mIsCrossTask = isCrossTask;
        mOnTransitionComplete = onTransitionComplete;
        setResultReceiver(resultReceiver);
        prepareEnter();
        Bundle resultReceiverBundle = new Bundle();
@@ -578,6 +582,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                window.setBackgroundDrawable(null);
            }
        }
        if (mOnTransitionComplete != null) {
            mOnTransitionComplete.run();
            mOnTransitionComplete = null;
        }
    }

    private void sharedElementTransitionStarted() {
@@ -672,6 +680,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            mBackgroundAnimator.cancel();
            mBackgroundAnimator = null;
        }
        if (mOnTransitionComplete != null) {
            mOnTransitionComplete.run();
            mOnTransitionComplete = null;
        }
        super.clearState();
    }