Loading core/java/android/app/Activity.java +9 −2 Original line number Diff line number Diff line Loading @@ -4678,7 +4678,7 @@ public class Activity extends ContextThemeWrapper if (decor != null) { decor.cancelPendingInputEvents(); } if (options != null && !isTopOfTask()) { if (options != null) { mActivityTransitionState.startExitOutTransition(this, options); } } Loading Loading @@ -4882,6 +4882,7 @@ public class Activity extends ContextThemeWrapper Bundle options) throws IntentSender.SendIntentException { try { options = transferSpringboardActivityOptions(options); String resolvedType = null; if (fillInIntent != null) { fillInIntent.migrateExtraStreamToClipData(); Loading @@ -4898,6 +4899,12 @@ public class Activity extends ContextThemeWrapper throw new IntentSender.SendIntentException(); } Instrumentation.checkStartActivityResult(result, null); if (options != null) { // Only when the options are not null, as the intent can point to something other // than an Activity. cancelInputsAndStartExitTransition(options); } } catch (RemoteException e) { } if (requestCode >= 0) { Loading Loading @@ -6471,7 +6478,7 @@ public class Activity extends ContextThemeWrapper * * @return true if this is the topmost, non-finishing activity in its task. */ private boolean isTopOfTask() { final boolean isTopOfTask() { if (mToken == null || mWindow == null) { return false; } Loading core/java/android/app/ActivityTransitionCoordinator.java +7 −2 Original line number Diff line number Diff line Loading @@ -193,6 +193,13 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { */ public static final int MSG_SHARED_ELEMENT_DESTINATION = 107; /** * Sent by Activity#startActivity to notify the entering activity that enter animation for * back is allowed. If this message is not received, the default exit animation will run when * backing out of an activity (instead of the 'reverse' shared element transition). */ public static final int MSG_ALLOW_RETURN_TRANSITION = 108; private Window mWindow; final protected ArrayList<String> mAllSharedElementNames; final protected ArrayList<View> mSharedElements = new ArrayList<View>(); Loading Loading @@ -346,8 +353,6 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { return new ArrayList<View>(mSharedElements); } public ArrayList<String> getAllSharedElementNames() { return mAllSharedElementNames; } protected Transition setTargets(Transition transition, boolean add) { if (transition == null || (add && (mTransitioningViews == null || mTransitioningViews.isEmpty()))) { Loading core/java/android/app/ActivityTransitionState.java +24 −12 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ import java.util.ArrayList; */ class ActivityTransitionState { private static final String ENTERING_SHARED_ELEMENTS = "android:enteringSharedElements"; private static final String PENDING_EXIT_SHARED_ELEMENTS = "android:pendingExitSharedElements"; private static final String EXITING_MAPPED_FROM = "android:exitingMappedFrom"; Loading @@ -43,9 +43,9 @@ class ActivityTransitionState { /** * The shared elements that the calling Activity has said that they transferred to this * Activity. * Activity and will be transferred back during exit animation. */ private ArrayList<String> mEnteringNames; private ArrayList<String> mPendingExitNames; /** * The names of shared elements that were shared to the called Activity. Loading Loading @@ -112,8 +112,7 @@ class ActivityTransitionState { public int addExitTransitionCoordinator(ExitTransitionCoordinator exitTransitionCoordinator) { if (mExitTransitionCoordinators == null) { mExitTransitionCoordinators = new SparseArray<WeakReference<ExitTransitionCoordinator>>(); mExitTransitionCoordinators = new SparseArray<>(); } WeakReference<ExitTransitionCoordinator> ref = new WeakReference(exitTransitionCoordinator); // clean up old references: Loading @@ -132,7 +131,7 @@ class ActivityTransitionState { public void readState(Bundle bundle) { if (bundle != null) { if (mEnterTransitionCoordinator == null || mEnterTransitionCoordinator.isReturning()) { mEnteringNames = bundle.getStringArrayList(ENTERING_SHARED_ELEMENTS); mPendingExitNames = bundle.getStringArrayList(PENDING_EXIT_SHARED_ELEMENTS); } if (mEnterTransitionCoordinator == null) { mExitingFrom = bundle.getStringArrayList(EXITING_MAPPED_FROM); Loading @@ -141,9 +140,21 @@ class ActivityTransitionState { } } /** * Returns the element names to be used for exit animation. It caches the list internally so * that it is preserved through activty destroy and restore. */ private ArrayList<String> getPendingExitNames() { if (mPendingExitNames == null && mEnterTransitionCoordinator != null) { mPendingExitNames = mEnterTransitionCoordinator.getPendingExitSharedElementNames(); } return mPendingExitNames; } public void saveState(Bundle bundle) { if (mEnteringNames != null) { bundle.putStringArrayList(ENTERING_SHARED_ELEMENTS, mEnteringNames); ArrayList<String> pendingExitNames = getPendingExitNames(); if (pendingExitNames != null) { bundle.putStringArrayList(PENDING_EXIT_SHARED_ELEMENTS, pendingExitNames); } if (mExitingFrom != null) { bundle.putStringArrayList(EXITING_MAPPED_FROM, mExitingFrom); Loading Loading @@ -226,7 +237,7 @@ class ActivityTransitionState { } } else { mEnterTransitionCoordinator.namedViewsReady(null, null); mEnteringNames = mEnterTransitionCoordinator.getAllSharedElementNames(); mPendingExitNames = null; } mExitingFrom = null; Loading Loading @@ -268,7 +279,7 @@ class ActivityTransitionState { } public void clear() { mEnteringNames = null; mPendingExitNames = null; mExitingFrom = null; mExitingTo = null; mExitingToView = null; Loading Loading @@ -296,7 +307,8 @@ class ActivityTransitionState { } public boolean startExitBackTransition(final Activity activity) { if (mEnteringNames == null || mCalledExitCoordinator != null) { ArrayList<String> pendingExitNames = getPendingExitNames(); if (pendingExitNames == null || mCalledExitCoordinator != null) { return false; } else { if (!mHasExited) { Loading @@ -315,7 +327,7 @@ class ActivityTransitionState { } mReturnExitCoordinator = new ExitTransitionCoordinator(activity, activity.getWindow(), activity.mEnterTransitionListener, mEnteringNames, activity.getWindow(), activity.mEnterTransitionListener, pendingExitNames, null, null, true); if (enterViewsTransition != null && decor != null) { enterViewsTransition.resume(decor); Loading core/java/android/app/EnterTransitionCoordinator.java +10 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private OneShotPreDrawListener mViewsReadyListener; private final boolean mIsCrossTask; private Drawable mReplacedBackground; private ArrayList<String> mPendingExitNames; public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, ArrayList<String> sharedElementNames, boolean isReturning, boolean isCrossTask) { Loading Loading @@ -249,6 +250,11 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { case MSG_CANCEL: cancel(); break; case MSG_ALLOW_RETURN_TRANSITION: if (!mIsCanceled) { mPendingExitNames = mAllSharedElementNames; } break; } } Loading @@ -256,6 +262,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { return mIsReturning && mResultReceiver != null; } public ArrayList<String> getPendingExitSharedElementNames() { return mPendingExitNames; } /** * 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 Loading core/java/android/app/ExitTransitionCoordinator.java +5 −0 Original line number Diff line number Diff line Loading @@ -433,6 +433,11 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { if (!mSharedElementNotified) { mSharedElementNotified = true; delayCancel(); if (!mActivity.isTopOfTask()) { mResultReceiver.send(MSG_ALLOW_RETURN_TRANSITION, null); } if (mListener == null) { mResultReceiver.send(MSG_TAKE_SHARED_ELEMENTS, mSharedElementBundle); notifyExitComplete(); Loading Loading
core/java/android/app/Activity.java +9 −2 Original line number Diff line number Diff line Loading @@ -4678,7 +4678,7 @@ public class Activity extends ContextThemeWrapper if (decor != null) { decor.cancelPendingInputEvents(); } if (options != null && !isTopOfTask()) { if (options != null) { mActivityTransitionState.startExitOutTransition(this, options); } } Loading Loading @@ -4882,6 +4882,7 @@ public class Activity extends ContextThemeWrapper Bundle options) throws IntentSender.SendIntentException { try { options = transferSpringboardActivityOptions(options); String resolvedType = null; if (fillInIntent != null) { fillInIntent.migrateExtraStreamToClipData(); Loading @@ -4898,6 +4899,12 @@ public class Activity extends ContextThemeWrapper throw new IntentSender.SendIntentException(); } Instrumentation.checkStartActivityResult(result, null); if (options != null) { // Only when the options are not null, as the intent can point to something other // than an Activity. cancelInputsAndStartExitTransition(options); } } catch (RemoteException e) { } if (requestCode >= 0) { Loading Loading @@ -6471,7 +6478,7 @@ public class Activity extends ContextThemeWrapper * * @return true if this is the topmost, non-finishing activity in its task. */ private boolean isTopOfTask() { final boolean isTopOfTask() { if (mToken == null || mWindow == null) { return false; } Loading
core/java/android/app/ActivityTransitionCoordinator.java +7 −2 Original line number Diff line number Diff line Loading @@ -193,6 +193,13 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { */ public static final int MSG_SHARED_ELEMENT_DESTINATION = 107; /** * Sent by Activity#startActivity to notify the entering activity that enter animation for * back is allowed. If this message is not received, the default exit animation will run when * backing out of an activity (instead of the 'reverse' shared element transition). */ public static final int MSG_ALLOW_RETURN_TRANSITION = 108; private Window mWindow; final protected ArrayList<String> mAllSharedElementNames; final protected ArrayList<View> mSharedElements = new ArrayList<View>(); Loading Loading @@ -346,8 +353,6 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { return new ArrayList<View>(mSharedElements); } public ArrayList<String> getAllSharedElementNames() { return mAllSharedElementNames; } protected Transition setTargets(Transition transition, boolean add) { if (transition == null || (add && (mTransitioningViews == null || mTransitioningViews.isEmpty()))) { Loading
core/java/android/app/ActivityTransitionState.java +24 −12 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ import java.util.ArrayList; */ class ActivityTransitionState { private static final String ENTERING_SHARED_ELEMENTS = "android:enteringSharedElements"; private static final String PENDING_EXIT_SHARED_ELEMENTS = "android:pendingExitSharedElements"; private static final String EXITING_MAPPED_FROM = "android:exitingMappedFrom"; Loading @@ -43,9 +43,9 @@ class ActivityTransitionState { /** * The shared elements that the calling Activity has said that they transferred to this * Activity. * Activity and will be transferred back during exit animation. */ private ArrayList<String> mEnteringNames; private ArrayList<String> mPendingExitNames; /** * The names of shared elements that were shared to the called Activity. Loading Loading @@ -112,8 +112,7 @@ class ActivityTransitionState { public int addExitTransitionCoordinator(ExitTransitionCoordinator exitTransitionCoordinator) { if (mExitTransitionCoordinators == null) { mExitTransitionCoordinators = new SparseArray<WeakReference<ExitTransitionCoordinator>>(); mExitTransitionCoordinators = new SparseArray<>(); } WeakReference<ExitTransitionCoordinator> ref = new WeakReference(exitTransitionCoordinator); // clean up old references: Loading @@ -132,7 +131,7 @@ class ActivityTransitionState { public void readState(Bundle bundle) { if (bundle != null) { if (mEnterTransitionCoordinator == null || mEnterTransitionCoordinator.isReturning()) { mEnteringNames = bundle.getStringArrayList(ENTERING_SHARED_ELEMENTS); mPendingExitNames = bundle.getStringArrayList(PENDING_EXIT_SHARED_ELEMENTS); } if (mEnterTransitionCoordinator == null) { mExitingFrom = bundle.getStringArrayList(EXITING_MAPPED_FROM); Loading @@ -141,9 +140,21 @@ class ActivityTransitionState { } } /** * Returns the element names to be used for exit animation. It caches the list internally so * that it is preserved through activty destroy and restore. */ private ArrayList<String> getPendingExitNames() { if (mPendingExitNames == null && mEnterTransitionCoordinator != null) { mPendingExitNames = mEnterTransitionCoordinator.getPendingExitSharedElementNames(); } return mPendingExitNames; } public void saveState(Bundle bundle) { if (mEnteringNames != null) { bundle.putStringArrayList(ENTERING_SHARED_ELEMENTS, mEnteringNames); ArrayList<String> pendingExitNames = getPendingExitNames(); if (pendingExitNames != null) { bundle.putStringArrayList(PENDING_EXIT_SHARED_ELEMENTS, pendingExitNames); } if (mExitingFrom != null) { bundle.putStringArrayList(EXITING_MAPPED_FROM, mExitingFrom); Loading Loading @@ -226,7 +237,7 @@ class ActivityTransitionState { } } else { mEnterTransitionCoordinator.namedViewsReady(null, null); mEnteringNames = mEnterTransitionCoordinator.getAllSharedElementNames(); mPendingExitNames = null; } mExitingFrom = null; Loading Loading @@ -268,7 +279,7 @@ class ActivityTransitionState { } public void clear() { mEnteringNames = null; mPendingExitNames = null; mExitingFrom = null; mExitingTo = null; mExitingToView = null; Loading Loading @@ -296,7 +307,8 @@ class ActivityTransitionState { } public boolean startExitBackTransition(final Activity activity) { if (mEnteringNames == null || mCalledExitCoordinator != null) { ArrayList<String> pendingExitNames = getPendingExitNames(); if (pendingExitNames == null || mCalledExitCoordinator != null) { return false; } else { if (!mHasExited) { Loading @@ -315,7 +327,7 @@ class ActivityTransitionState { } mReturnExitCoordinator = new ExitTransitionCoordinator(activity, activity.getWindow(), activity.mEnterTransitionListener, mEnteringNames, activity.getWindow(), activity.mEnterTransitionListener, pendingExitNames, null, null, true); if (enterViewsTransition != null && decor != null) { enterViewsTransition.resume(decor); Loading
core/java/android/app/EnterTransitionCoordinator.java +10 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private OneShotPreDrawListener mViewsReadyListener; private final boolean mIsCrossTask; private Drawable mReplacedBackground; private ArrayList<String> mPendingExitNames; public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, ArrayList<String> sharedElementNames, boolean isReturning, boolean isCrossTask) { Loading Loading @@ -249,6 +250,11 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { case MSG_CANCEL: cancel(); break; case MSG_ALLOW_RETURN_TRANSITION: if (!mIsCanceled) { mPendingExitNames = mAllSharedElementNames; } break; } } Loading @@ -256,6 +262,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { return mIsReturning && mResultReceiver != null; } public ArrayList<String> getPendingExitSharedElementNames() { return mPendingExitNames; } /** * 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 Loading
core/java/android/app/ExitTransitionCoordinator.java +5 −0 Original line number Diff line number Diff line Loading @@ -433,6 +433,11 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { if (!mSharedElementNotified) { mSharedElementNotified = true; delayCancel(); if (!mActivity.isTopOfTask()) { mResultReceiver.send(MSG_ALLOW_RETURN_TRANSITION, null); } if (mListener == null) { mResultReceiver.send(MSG_TAKE_SHARED_ELEMENTS, mSharedElementBundle); notifyExitComplete(); Loading