Merge "Target only shared elements with shared element Transition" into lmp-dev
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index 8644c3d..0092ee7 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -1110,7 +1110,8 @@
final Transition enterTransition, final Transition sharedElementTransition,
final Transition overallTransition, final View container,
final Fragment inFragment, final Fragment outFragment,
- final ArrayList<View> hiddenFragmentViews, final boolean isBack) {
+ final ArrayList<View> hiddenFragmentViews, final boolean isBack,
+ final ArrayList<View> sharedElementTargets) {
if (enterTransition == null && sharedElementTransition == null &&
overallTransition == null) {
return null;
@@ -1129,6 +1130,15 @@
ArrayMap<String, View> namedViews = null;
if (sharedElementTransition != null) {
namedViews = mapSharedElementsIn(state, isBack, inFragment);
+ removeTargets(sharedElementTransition, sharedElementTargets);
+ sharedElementTargets.clear();
+ if (namedViews.isEmpty()) {
+ sharedElementTargets.add(state.nonExistentView);
+ } else {
+ sharedElementTargets.addAll(namedViews.values());
+ }
+
+ addTargets(sharedElementTransition, sharedElementTargets);
setEpicenterIn(namedViews, state);
@@ -1209,11 +1219,17 @@
Transition transition;
if (overlap) {
// Regular transition -- do it all together
- transition = TransitionUtils.mergeTransitions(enterTransition, exitTransition,
- sharedElementTransition);
- if (!(transition instanceof TransitionSet)) {
- transition = new TransitionSet().addTransition(transition);
+ TransitionSet transitionSet = new TransitionSet();
+ if (enterTransition != null) {
+ transitionSet.addTransition(enterTransition);
}
+ if (exitTransition != null) {
+ transitionSet.addTransition(exitTransition);
+ }
+ if (sharedElementTransition != null) {
+ transitionSet.addTransition(sharedElementTransition);
+ }
+ transition = transitionSet;
} else {
// First do exit, then enter, but allow shared element transition to happen
// during both.
@@ -1274,8 +1290,15 @@
enterTransition.addTarget(state.nonExistentView);
}
ArrayMap<String, View> namedViews = null;
+ ArrayList<View> sharedElementTargets = new ArrayList<View>();
if (sharedElementTransition != null) {
namedViews = remapSharedElements(state, outFragment, isBack);
+ if (namedViews.isEmpty()) {
+ sharedElementTargets.add(state.nonExistentView);
+ } else {
+ sharedElementTargets.addAll(namedViews.values());
+ }
+ addTargets(sharedElementTransition, sharedElementTargets);
// Notify the start of the transition.
SharedElementCallback callback = isBack ?
@@ -1312,7 +1335,7 @@
ArrayList<View> hiddenFragments = new ArrayList<View>();
ArrayList<View> enteringViews = addTransitionTargets(state, enterTransition,
sharedElementTransition, transition, sceneRoot, inFragment, outFragment,
- hiddenFragments, isBack);
+ hiddenFragments, isBack, sharedElementTargets);
transition.setNameOverrides(state.nameOverrides);
// We want to exclude hidden views later, so we need a non-null list in the
@@ -1324,7 +1347,7 @@
// Remove the view targeting after the transition starts
removeTargetedViewsFromTransitions(sceneRoot, state.nonExistentView,
enterTransition, enteringViews, exitTransition, exitingViews,
- transition, hiddenFragments);
+ sharedElementTransition, sharedElementTargets, transition, hiddenFragments);
}
}
}
@@ -1337,8 +1360,9 @@
final ViewGroup sceneRoot, final View nonExistingView,
final Transition enterTransition, final ArrayList<View> enteringViews,
final Transition exitTransition, final ArrayList<View> exitingViews,
+ final Transition sharedElementTransition, final ArrayList<View> sharedElementTargets,
final Transition overallTransition, final ArrayList<View> hiddenViews) {
- if (enterTransition != null || exitTransition != null) {
+ if (overallTransition != null) {
sceneRoot.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
@@ -1350,6 +1374,9 @@
if (exitTransition != null) {
removeTargets(exitTransition, exitingViews);
}
+ if (sharedElementTransition != null) {
+ removeTargets(sharedElementTransition, sharedElementTargets);
+ }
int numViews = hiddenViews.size();
for (int i = 0; i < numViews; i++) {
overallTransition.excludeTarget(hiddenViews.get(i), false);
diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java
index c850f71..6dede46 100644
--- a/core/java/android/transition/Transition.java
+++ b/core/java/android/transition/Transition.java
@@ -1443,9 +1443,9 @@
values.targetedTransitions.add(this);
capturePropagationValues(values);
if (start) {
- mStartValues.viewValues.put(view, values);
+ addViewValues(mStartValues, view, values);
} else {
- mEndValues.viewValues.put(view, values);
+ addViewValues(mEndValues, view, values);
}
}
} else {