From b04b36eaadb2f3e56206d8ae157df06bb89f9866 Mon Sep 17 00:00:00 2001 From: Dake Gu Date: Fri, 8 Aug 2014 11:22:30 -0700 Subject: [PATCH] Transition: remap if views in calling activity became invalid In activity back, the calling activity might have re-constructed UI, the accepted views captured in calling activity was detached and no longer valid. Re-query the calling activity for shared element in such case. If the app has reconstructed UI of calling activity, it is app's responsibility to assign same transition name to new view where it desires to transition back to. b/16853679 Change-Id: Ia6729c6082fbaf54c2ce17f695d5b8d66bd9187d --- .../android/app/ActivityTransitionState.java | 5 ++--- .../app/EnterTransitionCoordinator.java | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java index 4f556a8697f95..4f3b02c0a86e5 100644 --- a/core/java/android/app/ActivityTransitionState.java +++ b/core/java/android/app/ActivityTransitionState.java @@ -193,7 +193,8 @@ class ActivityTransitionState { private void startEnter() { if (mEnterActivityOptions.isReturning()) { if (mExitingToView != null) { - mEnterTransitionCoordinator.viewInstancesReady(mExitingFrom, mExitingToView); + mEnterTransitionCoordinator.viewInstancesReady(mExitingFrom, mExitingTo, + mExitingToView); } else { mEnterTransitionCoordinator.namedViewsReady(mExitingFrom, mExitingTo); } @@ -248,8 +249,6 @@ class ActivityTransitionState { mEnterTransitionCoordinator.cancelEnter(); mEnterTransitionCoordinator = null; } - ArrayMap sharedElements = new ArrayMap(); - activity.getWindow().getDecorView().findNamedViews(sharedElements); ExitTransitionCoordinator exitCoordinator = new ExitTransitionCoordinator(activity, mEnteringNames, null, null, true); diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index b5d362d79ac21..3f1eee1c268ce 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.ResultReceiver; +import android.text.TextUtils; import android.transition.Transition; import android.transition.TransitionManager; import android.util.ArrayMap; @@ -82,8 +83,22 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { }); } - public void viewInstancesReady(ArrayList accepted, ArrayList localViews) { - triggerViewsReady(mapSharedElements(accepted, localViews)); + public void viewInstancesReady(ArrayList accepted, ArrayList localNames, + ArrayList localViews) { + boolean remap = false; + for (int i = 0; i < localViews.size(); i++) { + View view = localViews.get(i); + if (!TextUtils.equals(view.getTransitionName(), localNames.get(i)) + || !view.isAttachedToWindow()) { + remap = true; + break; + } + } + if (remap) { + triggerViewsReady(mapNamedElements(accepted, localNames)); + } else { + triggerViewsReady(mapSharedElements(accepted, localViews)); + } } public void namedViewsReady(ArrayList accepted, ArrayList localNames) {