diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index e3f55a21fddfc..8ecd608040e17 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -191,7 +191,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { */ public static final int MSG_SEND_SHARED_ELEMENT_DESTINATION = 108; - final private Window mWindow; + private Window mWindow; final protected ArrayList mAllSharedElementNames; final protected ArrayList mSharedElements = new ArrayList(); final protected ArrayList mSharedElementNames = new ArrayList(); @@ -507,6 +507,17 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { return bundle; } + protected void clearState() { + // Clear the state so that we can't hold any references accidentally and leak memory. + mWindow = null; + mAllSharedElementNames.clear(); + mSharedElements.clear(); + mSharedElementNames.clear(); + mTransitioningViews.clear(); + mResultReceiver = null; + mPendingTransition = null; + } + protected long getFadeDuration() { return getWindow().getTransitionBackgroundFadeDuration(); } diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java index 1e1781963ac59..030424607dfec 100644 --- a/core/java/android/app/ActivityTransitionState.java +++ b/core/java/android/app/ActivityTransitionState.java @@ -215,6 +215,17 @@ class ActivityTransitionState { restoreExitedViews(); } + public void clear() { + mEnteringNames = null; + mExitingFrom = null; + mExitingTo = null; + mExitingToView = null; + mCalledExitCoordinator = null; + mEnterTransitionCoordinator = null; + mEnterActivityOptions = null; + mExitTransitionCoordinators = null; + } + private void restoreExitedViews() { if (mCalledExitCoordinator != null) { mCalledExitCoordinator.resetViews(); diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index 1033248d048c0..2dacb10f082b6 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -134,6 +134,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { transition.addListener(new Transition.TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { + transition.removeListener(this); setViewVisibility(mSharedElements, View.INVISIBLE); ViewGroupOverlay overlay = getDecor().getOverlay(); if (mSharedElementSnapshots != null) { @@ -196,8 +197,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { @Override public void handleMessage(Message msg) { mIsCanceled = true; - mActivity.finish(); - mActivity = null; + finish(); } }; mHandler.sendEmptyMessageDelayed(MSG_CANCEL, MAX_WAIT_MS); @@ -269,6 +269,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { viewsTransition.addListener(new ContinueTransitionListener() { @Override public void onTransitionEnd(Transition transition) { + transition.removeListener(this); exitTransitionComplete(); if (mIsHidden) { setViewVisibility(mTransitioningViews, View.VISIBLE); @@ -295,6 +296,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { sharedElementTransition.addListener(new ContinueTransitionListener() { @Override public void onTransitionEnd(Transition transition) { + transition.removeListener(this); sharedElementTransitionComplete(); if (mIsHidden) { setViewVisibility(mSharedElements, View.VISIBLE); @@ -364,15 +366,31 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { private void finishIfNecessary() { if (mIsReturning && mExitNotified && mActivity != null && mSharedElementSnapshots == null) { - mActivity.finish(); - mActivity.overridePendingTransition(0, 0); - mActivity = null; + finish(); } if (!mIsReturning && mExitNotified) { mActivity = null; // don't need it anymore } } + private void finish() { + mActivity.mActivityTransitionState.clear(); + // Clear the state so that we can't hold any references accidentally and leak memory. + mHandler.removeMessages(MSG_CANCEL); + mHandler = null; + mActivity.finish(); + mActivity.overridePendingTransition(0, 0); + mActivity = null; + mSharedElementBundle = null; + if (mBackgroundAnimator != null) { + mBackgroundAnimator.cancel(); + mBackgroundAnimator = null; + } + mExitSharedElementBundle = null; + mSharedElementSnapshots = null; + clearState(); + } + @Override protected Transition getViewsTransition() { if (mIsReturning) {