diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index d02d17febbfb9..137f77d038b6a 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -196,7 +196,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { final protected ArrayList mAllSharedElementNames; final protected ArrayList mSharedElements = new ArrayList(); final protected ArrayList mSharedElementNames = new ArrayList(); - final protected ArrayList mTransitioningViews = new ArrayList(); + protected ArrayList mTransitioningViews = new ArrayList(); protected SharedElementCallback mListener; protected ResultReceiver mResultReceiver; final private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback(); @@ -222,7 +222,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { mListener.onMapSharedElements(mAllSharedElementNames, sharedElements); mSharedElementNames.addAll(sharedElements.keySet()); mSharedElements.addAll(sharedElements.values()); - if (getViewsTransition() != null) { + if (getViewsTransition() != null && mTransitioningViews != null) { ViewGroup decorView = getDecor(); if (decorView != null) { decorView.captureTransitioningViews(mTransitioningViews); @@ -233,6 +233,9 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { } protected void stripOffscreenViews() { + if (mTransitioningViews == null) { + return; + } Rect r = new Rect(); for (int i = mTransitioningViews.size() - 1; i >= 0; i--) { View view = mTransitioningViews.get(i); @@ -592,7 +595,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { // Clear the state so that we can't hold any references accidentally and leak memory. mWindow = null; mSharedElements.clear(); - mTransitioningViews.clear(); + mTransitioningViews = null; mOriginalAlphas.clear(); mResultReceiver = null; mPendingTransition = null; diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index bfdb0eb56e249..16a3575933eb9 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -115,7 +115,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { super.viewsReady(sharedElements); mIsReadyForTransition = true; hideViews(mSharedElements); - if (getViewsTransition() != null) { + if (getViewsTransition() != null && mTransitioningViews != null) { hideViews(mTransitioningViews); } if (mIsReturning) { @@ -249,7 +249,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { mIsCanceled = true; if (getViewsTransition() == null || mIsViewsTransitionStarted) { showViews(mSharedElements, true); - } else { + } else if (mTransitioningViews != null) { mTransitioningViews.addAll(mSharedElements); } mSharedElementNames.clear(); @@ -416,7 +416,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { Transition viewsTransition = null; if (startEnterTransition) { mIsViewsTransitionStarted = true; - if (!mTransitioningViews.isEmpty()) { + if (mTransitioningViews != null && !mTransitioningViews.isEmpty()) { viewsTransition = configureTransition(getViewsTransition(), true); if (viewsTransition != null && !mIsReturning) { stripOffscreenViews(); @@ -426,11 +426,14 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { viewTransitionComplete(); } else { viewsTransition.forceVisibility(View.INVISIBLE, true); + final ArrayList transitioningViews = mTransitioningViews; viewsTransition.addListener(new ContinueTransitionListener() { @Override public void onTransitionStart(Transition transition) { mEnterViewsTransition = transition; - showViews(mTransitioningViews, false); + if (transitioningViews != null) { + showViews(transitioningViews, false); + } super.onTransitionStart(transition); } @@ -451,7 +454,8 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { TransitionManager.beginDelayedTransition(decorView, transition); if (startSharedElementTransition && !mSharedElementNames.isEmpty()) { mSharedElements.get(0).invalidate(); - } else if (startEnterTransition && !mTransitioningViews.isEmpty()) { + } else if (startEnterTransition && mTransitioningViews != null && + !mTransitioningViews.isEmpty()) { mTransitioningViews.get(0).invalidate(); } } else { diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index 41b0db6387ae7..812dfdb41d744 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -126,7 +126,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { } public void resetViews() { - showViews(mTransitioningViews, true); + if (mTransitioningViews != null) { + showViews(mTransitioningViews, true); + } showViews(mSharedElements, true); mIsHidden = true; ViewGroup decorView = getDecor(); @@ -253,7 +255,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { private void startExitTransition() { Transition transition = getExitTransition(); ViewGroup decorView = getDecor(); - if (transition != null && decorView != null) { + if (transition != null && decorView != null && mTransitioningViews != null) { TransitionManager.beginDelayedTransition(decorView, transition); mTransitioningViews.get(0).invalidate(); } else { @@ -289,19 +291,20 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { private Transition getExitTransition() { Transition viewsTransition = null; - if (!mTransitioningViews.isEmpty()) { + if (mTransitioningViews != null && !mTransitioningViews.isEmpty()) { viewsTransition = configureTransition(getViewsTransition(), true); } if (viewsTransition == null) { exitTransitionComplete(); } else { + final ArrayList transitioningViews = mTransitioningViews; viewsTransition.addListener(new ContinueTransitionListener() { @Override public void onTransitionEnd(Transition transition) { transition.removeListener(this); exitTransitionComplete(); - if (mIsHidden) { - showViews(mTransitioningViews, true); + if (mIsHidden && transitioningViews != null) { + showViews(transitioningViews, true); } if (mSharedElementBundle != null) { delayCancel();