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
diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java
index 3a95839..0f9a6e6 100644
--- a/core/java/android/app/ActivityTransitionState.java
+++ b/core/java/android/app/ActivityTransitionState.java
@@ -197,13 +197,21 @@
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 bce243c..905f475 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -18,6 +18,7 @@
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 @@
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 @@
window.setBackgroundDrawable(null);
}
}
+ if (mOnTransitionComplete != null) {
+ mOnTransitionComplete.run();
+ mOnTransitionComplete = null;
+ }
}
private void sharedElementTransitionStarted() {
@@ -672,6 +680,10 @@
mBackgroundAnimator.cancel();
mBackgroundAnimator = null;
}
+ if (mOnTransitionComplete != null) {
+ mOnTransitionComplete.run();
+ mOnTransitionComplete = null;
+ }
super.clearState();
}