diff options
| author | 2019-09-20 22:51:15 +0000 | |
|---|---|---|
| committer | 2019-09-20 22:51:15 +0000 | |
| commit | ea2a0eb8f53ee17da88d7df7042a6bc39a37b6a6 (patch) | |
| tree | 0066b89a3bd01e2097d785058f0c4fc57ef7ed66 | |
| parent | c75ccb89037a031eab8d8d044db00e70c2a750e3 (diff) | |
| parent | 785334aeafcbe0932b8608771b24fa7aecda1a3b (diff) | |
Merge "Clear reference to EnterTransitionCoordinator when done"
| -rw-r--r-- | core/java/android/app/ActivityTransitionState.java | 12 | ||||
| -rw-r--r-- | core/java/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 3a95839d2d12..0f9a6e63a1d2 100644 --- a/core/java/android/app/ActivityTransitionState.java +++ b/core/java/android/app/ActivityTransitionState.java @@ -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()); diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index bce243cc6108..905f47540fd9 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<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(); } |