From 785334aeafcbe0932b8608771b24fa7aecda1a3b Mon Sep 17 00:00:00 2001 From: George Mount Date: Thu, 19 Sep 2019 11:21:14 -0700 Subject: [PATCH] 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 --- .../android/app/ActivityTransitionState.java | 12 ++++++++++-- .../android/app/EnterTransitionCoordinator.java | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java index 3a95839d2d122..0f9a6e63a1d29 100644 --- a/core/java/android/app/ActivityTransitionState.java +++ b/core/java/android/app/ActivityTransitionState.java @@ -197,13 +197,21 @@ class ActivityTransitionState { mHasExited = false; ArrayList 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()); diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index bce243cc61086..905f47540fd99 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -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 mPendingExitNames; + private Runnable mOnTransitionComplete; - public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, - ArrayList sharedElementNames, boolean isReturning, boolean isCrossTask) { + EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, + ArrayList 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(); }