Loading core/java/android/app/ActivityTransitionState.java +11 −1 Original line number Diff line number Diff line Loading @@ -206,7 +206,7 @@ class ActivityTransitionState { } private void startEnter() { if (mEnterActivityOptions.isReturning()) { if (mEnterTransitionCoordinator.isReturning()) { if (mExitingToView != null) { mEnterTransitionCoordinator.viewInstancesReady(mExitingFrom, mExitingTo, mExitingToView); Loading Loading @@ -238,6 +238,7 @@ class ActivityTransitionState { public void onResume() { restoreExitedViews(); restoreReenteringViews(); } public void clear() { Loading @@ -258,6 +259,15 @@ class ActivityTransitionState { } } private void restoreReenteringViews() { if (mEnterTransitionCoordinator != null && mEnterTransitionCoordinator.isReturning()) { mEnterTransitionCoordinator.forceViewsToAppear(); mExitingFrom = null; mExitingTo = null; mExitingToView = null; } } public boolean startExitBackTransition(final Activity activity) { if (mEnteringNames == null) { return false; Loading core/java/android/app/EnterTransitionCoordinator.java +56 −10 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroupOverlay; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.Window; import android.view.accessibility.AccessibilityEvent; Loading Loading @@ -57,6 +58,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private boolean mAreViewsReady; private boolean mIsViewsTransitionStarted; private Transition mEnterViewsTransition; private OnPreDrawListener mViewsReadyListener; public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, ArrayList<String> sharedElementNames, boolean isReturning) { Loading Loading @@ -138,15 +140,16 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { (sharedElements.isEmpty() || !sharedElements.valueAt(0).isLayoutRequested()))) { viewsReady(sharedElements); } else { decor.getViewTreeObserver() .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { mViewsReadyListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mViewsReadyListener = null; decor.getViewTreeObserver().removeOnPreDrawListener(this); viewsReady(sharedElements); return true; } }); }; decor.getViewTreeObserver().addOnPreDrawListener(mViewsReadyListener); } } Loading Loading @@ -241,6 +244,50 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } } /** * This is called onResume. If an Activity is resuming and the transitions * haven't started yet, force the views to appear. This is likely to be * caused by the top Activity finishing before the transitions started. * In that case, we can finish any transition that was started, but we * should cancel any pending transition and just bring those Views visible. */ public void forceViewsToAppear() { if (!mIsReturning) { return; } if (!mIsReadyForTransition) { mIsReadyForTransition = true; final ViewGroup decor = getDecor(); if (decor != null && mViewsReadyListener != null) { decor.getViewTreeObserver().removeOnPreDrawListener(mViewsReadyListener); mViewsReadyListener = null; } showViews(mTransitioningViews, true); mSharedElements.clear(); mAllSharedElementNames.clear(); mTransitioningViews.clear(); mIsReadyForTransition = true; viewsTransitionComplete(); sharedElementTransitionComplete(); } else { if (!mSharedElementTransitionStarted) { moveSharedElementsFromOverlay(); mSharedElementTransitionStarted = true; showViews(mSharedElements, true); mSharedElements.clear(); sharedElementTransitionComplete(); } if (!mIsViewsTransitionStarted) { mIsViewsTransitionStarted = true; showViews(mTransitioningViews, true); mTransitioningViews.clear(); viewsTransitionComplete(); } cancelPendingTransitions(); } mAreViewsReady = true; } private void cancel() { if (!mIsCanceled) { mIsCanceled = true; Loading Loading @@ -659,5 +706,4 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } }); } } Loading
core/java/android/app/ActivityTransitionState.java +11 −1 Original line number Diff line number Diff line Loading @@ -206,7 +206,7 @@ class ActivityTransitionState { } private void startEnter() { if (mEnterActivityOptions.isReturning()) { if (mEnterTransitionCoordinator.isReturning()) { if (mExitingToView != null) { mEnterTransitionCoordinator.viewInstancesReady(mExitingFrom, mExitingTo, mExitingToView); Loading Loading @@ -238,6 +238,7 @@ class ActivityTransitionState { public void onResume() { restoreExitedViews(); restoreReenteringViews(); } public void clear() { Loading @@ -258,6 +259,15 @@ class ActivityTransitionState { } } private void restoreReenteringViews() { if (mEnterTransitionCoordinator != null && mEnterTransitionCoordinator.isReturning()) { mEnterTransitionCoordinator.forceViewsToAppear(); mExitingFrom = null; mExitingTo = null; mExitingToView = null; } } public boolean startExitBackTransition(final Activity activity) { if (mEnteringNames == null) { return false; Loading
core/java/android/app/EnterTransitionCoordinator.java +56 −10 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroupOverlay; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.Window; import android.view.accessibility.AccessibilityEvent; Loading Loading @@ -57,6 +58,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private boolean mAreViewsReady; private boolean mIsViewsTransitionStarted; private Transition mEnterViewsTransition; private OnPreDrawListener mViewsReadyListener; public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, ArrayList<String> sharedElementNames, boolean isReturning) { Loading Loading @@ -138,15 +140,16 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { (sharedElements.isEmpty() || !sharedElements.valueAt(0).isLayoutRequested()))) { viewsReady(sharedElements); } else { decor.getViewTreeObserver() .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { mViewsReadyListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mViewsReadyListener = null; decor.getViewTreeObserver().removeOnPreDrawListener(this); viewsReady(sharedElements); return true; } }); }; decor.getViewTreeObserver().addOnPreDrawListener(mViewsReadyListener); } } Loading Loading @@ -241,6 +244,50 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } } /** * This is called onResume. If an Activity is resuming and the transitions * haven't started yet, force the views to appear. This is likely to be * caused by the top Activity finishing before the transitions started. * In that case, we can finish any transition that was started, but we * should cancel any pending transition and just bring those Views visible. */ public void forceViewsToAppear() { if (!mIsReturning) { return; } if (!mIsReadyForTransition) { mIsReadyForTransition = true; final ViewGroup decor = getDecor(); if (decor != null && mViewsReadyListener != null) { decor.getViewTreeObserver().removeOnPreDrawListener(mViewsReadyListener); mViewsReadyListener = null; } showViews(mTransitioningViews, true); mSharedElements.clear(); mAllSharedElementNames.clear(); mTransitioningViews.clear(); mIsReadyForTransition = true; viewsTransitionComplete(); sharedElementTransitionComplete(); } else { if (!mSharedElementTransitionStarted) { moveSharedElementsFromOverlay(); mSharedElementTransitionStarted = true; showViews(mSharedElements, true); mSharedElements.clear(); sharedElementTransitionComplete(); } if (!mIsViewsTransitionStarted) { mIsViewsTransitionStarted = true; showViews(mTransitioningViews, true); mTransitioningViews.clear(); viewsTransitionComplete(); } cancelPendingTransitions(); } mAreViewsReady = true; } private void cancel() { if (!mIsCanceled) { mIsCanceled = true; Loading Loading @@ -659,5 +706,4 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } }); } }