Loading core/java/android/transition/Transition.java +37 −19 Original line number Diff line number Diff line Loading @@ -690,11 +690,18 @@ public abstract class Transition implements Cloneable { for (int i = 0; i < startValuesListCount; ++i) { TransitionValues start = startValuesList.get(i); TransitionValues end = endValuesList.get(i); // Only bother trying to animate with valid values that differ between start/end boolean isInvalidStart = start != null && !isValidTarget(start.view); boolean isInvalidEnd = end != null && !isValidTarget(end.view); boolean isChanged = start != end && (start == null || !start.equals(end)); if (isChanged && !isInvalidStart && !isInvalidEnd) { if (start != null && !start.targetedTransitions.contains(this)) { start = null; } if (end != null && !end.targetedTransitions.contains(this)) { end = null; } if (start == null && end == null) { continue; } // Only bother trying to animate with values that differ between start/end boolean isChanged = start == null || end == null || areValuesChanged(start, end); if (isChanged) { if (DBG) { View view = (end != null) ? end.view : start.view; Log.d(LOG_TAG, " differing start/end values for view " + view); Loading Loading @@ -1415,11 +1422,12 @@ public abstract class Transition implements Cloneable { } else { captureEndValues(values); } values.targetedTransitions.add(this); capturePropagationValues(values); if (start) { addViewValues(mStartValues, view, values, true); addViewValues(mStartValues, view, values); } else { addViewValues(mEndValues, view, values, true); addViewValues(mEndValues, view, values); } } } Loading @@ -1432,6 +1440,7 @@ public abstract class Transition implements Cloneable { } else { captureEndValues(values); } values.targetedTransitions.add(this); capturePropagationValues(values); if (start) { mStartValues.viewValues.put(view, values); Loading Loading @@ -1460,7 +1469,7 @@ public abstract class Transition implements Cloneable { } static void addViewValues(TransitionValuesMaps transitionValuesMaps, View view, TransitionValues transitionValues, boolean setTransientState) { View view, TransitionValues transitionValues) { transitionValuesMaps.viewValues.put(view, transitionValues); int id = view.getId(); if (id >= 0) { Loading Loading @@ -1489,15 +1498,11 @@ public abstract class Transition implements Cloneable { // Duplicate item IDs: cannot match by item ID. View alreadyMatched = transitionValuesMaps.itemIdValues.get(itemId); if (alreadyMatched != null) { if (setTransientState) { alreadyMatched.setHasTransientState(false); } transitionValuesMaps.itemIdValues.put(itemId, null); } } else { if (setTransientState) { view.setHasTransientState(true); } transitionValuesMaps.itemIdValues.put(itemId, view); } } Loading Loading @@ -1562,11 +1567,12 @@ public abstract class Transition implements Cloneable { } else { captureEndValues(values); } values.targetedTransitions.add(this); capturePropagationValues(values); if (start) { addViewValues(mStartValues, view, values, true); addViewValues(mStartValues, view, values); } else { addViewValues(mEndValues, view, values, true); addViewValues(mEndValues, view, values); } } if (view instanceof ViewGroup) { Loading Loading @@ -1731,8 +1737,10 @@ public abstract class Transition implements Cloneable { if (oldInfo != null && oldInfo.view != null && oldInfo.windowId == windowId) { TransitionValues oldValues = oldInfo.values; View oldView = oldInfo.view; TransitionValues newValues = getMatchedTransitionValues(oldView, true); boolean cancel = oldInfo.transition.areValuesChanged(oldValues, newValues); TransitionValues startValues = getTransitionValues(oldView, true); TransitionValues endValues = getMatchedTransitionValues(oldView, true); boolean cancel = (startValues != null || endValues != null) && oldInfo.transition.areValuesChanged(oldValues, endValues); if (cancel) { if (anim.isRunning() || anim.isStarted()) { if (DBG) { Loading Loading @@ -1784,7 +1792,17 @@ public abstract class Transition implements Cloneable { String key) { Object oldValue = oldValues.values.get(key); Object newValue = newValues.values.get(key); boolean changed = (oldValue != null && newValue != null && !oldValue.equals(newValue)); boolean changed; if (oldValue == null && newValue == null) { // both are null changed = false; } else if (oldValue == null || newValue == null) { // one is null changed = true; } else { // neither is null changed = !oldValue.equals(newValue); } if (DBG && changed) { Log.d(LOG_TAG, "Transition.playTransition: " + "oldValue != newValue for " + key + Loading core/java/android/transition/TransitionSet.java +2 −20 Original line number Diff line number Diff line Loading @@ -388,8 +388,6 @@ public class TransitionSet extends Transition { protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues, TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList, ArrayList<TransitionValues> endValuesList) { startValues = removeExcludes(startValues); endValues = removeExcludes(endValues); long startDelay = getStartDelay(); int numTransitions = mTransitions.size(); for (int i = 0; i < numTransitions; i++) { Loading @@ -409,24 +407,6 @@ public class TransitionSet extends Transition { } } private TransitionValuesMaps removeExcludes(TransitionValuesMaps values) { if (mTargetIds.isEmpty() && mTargetIdExcludes == null && mTargetTypeExcludes == null && mTargetNames == null && mTargetTypes == null && mTargetExcludes == null && mTargetNameExcludes == null && mTargets.isEmpty()) { return values; } TransitionValuesMaps included = new TransitionValuesMaps(); int numValues = values.viewValues.size(); for (int i = 0; i < numValues; i++) { View view = values.viewValues.keyAt(i); if (isValidTarget(view)) { addViewValues(included, view, values.viewValues.valueAt(i), false); } } return included; } /** * @hide */ Loading Loading @@ -470,6 +450,7 @@ public class TransitionSet extends Transition { for (Transition childTransition : mTransitions) { if (childTransition.isValidTarget(transitionValues.view)) { childTransition.captureStartValues(transitionValues); transitionValues.targetedTransitions.add(childTransition); } } } Loading @@ -481,6 +462,7 @@ public class TransitionSet extends Transition { for (Transition childTransition : mTransitions) { if (childTransition.isValidTarget(transitionValues.view)) { childTransition.captureEndValues(transitionValues); transitionValues.targetedTransitions.add(childTransition); } } } Loading core/java/android/transition/TransitionValues.java +6 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.util.ArrayMap; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Map; /** Loading Loading @@ -52,6 +53,11 @@ public class TransitionValues { */ public final Map<String, Object> values = new ArrayMap<String, Object>(); /** * The Transitions that targeted this view. */ final ArrayList<Transition> targetedTransitions = new ArrayList<Transition>(); @Override public boolean equals(Object other) { if (other instanceof TransitionValues) { Loading Loading
core/java/android/transition/Transition.java +37 −19 Original line number Diff line number Diff line Loading @@ -690,11 +690,18 @@ public abstract class Transition implements Cloneable { for (int i = 0; i < startValuesListCount; ++i) { TransitionValues start = startValuesList.get(i); TransitionValues end = endValuesList.get(i); // Only bother trying to animate with valid values that differ between start/end boolean isInvalidStart = start != null && !isValidTarget(start.view); boolean isInvalidEnd = end != null && !isValidTarget(end.view); boolean isChanged = start != end && (start == null || !start.equals(end)); if (isChanged && !isInvalidStart && !isInvalidEnd) { if (start != null && !start.targetedTransitions.contains(this)) { start = null; } if (end != null && !end.targetedTransitions.contains(this)) { end = null; } if (start == null && end == null) { continue; } // Only bother trying to animate with values that differ between start/end boolean isChanged = start == null || end == null || areValuesChanged(start, end); if (isChanged) { if (DBG) { View view = (end != null) ? end.view : start.view; Log.d(LOG_TAG, " differing start/end values for view " + view); Loading Loading @@ -1415,11 +1422,12 @@ public abstract class Transition implements Cloneable { } else { captureEndValues(values); } values.targetedTransitions.add(this); capturePropagationValues(values); if (start) { addViewValues(mStartValues, view, values, true); addViewValues(mStartValues, view, values); } else { addViewValues(mEndValues, view, values, true); addViewValues(mEndValues, view, values); } } } Loading @@ -1432,6 +1440,7 @@ public abstract class Transition implements Cloneable { } else { captureEndValues(values); } values.targetedTransitions.add(this); capturePropagationValues(values); if (start) { mStartValues.viewValues.put(view, values); Loading Loading @@ -1460,7 +1469,7 @@ public abstract class Transition implements Cloneable { } static void addViewValues(TransitionValuesMaps transitionValuesMaps, View view, TransitionValues transitionValues, boolean setTransientState) { View view, TransitionValues transitionValues) { transitionValuesMaps.viewValues.put(view, transitionValues); int id = view.getId(); if (id >= 0) { Loading Loading @@ -1489,15 +1498,11 @@ public abstract class Transition implements Cloneable { // Duplicate item IDs: cannot match by item ID. View alreadyMatched = transitionValuesMaps.itemIdValues.get(itemId); if (alreadyMatched != null) { if (setTransientState) { alreadyMatched.setHasTransientState(false); } transitionValuesMaps.itemIdValues.put(itemId, null); } } else { if (setTransientState) { view.setHasTransientState(true); } transitionValuesMaps.itemIdValues.put(itemId, view); } } Loading Loading @@ -1562,11 +1567,12 @@ public abstract class Transition implements Cloneable { } else { captureEndValues(values); } values.targetedTransitions.add(this); capturePropagationValues(values); if (start) { addViewValues(mStartValues, view, values, true); addViewValues(mStartValues, view, values); } else { addViewValues(mEndValues, view, values, true); addViewValues(mEndValues, view, values); } } if (view instanceof ViewGroup) { Loading Loading @@ -1731,8 +1737,10 @@ public abstract class Transition implements Cloneable { if (oldInfo != null && oldInfo.view != null && oldInfo.windowId == windowId) { TransitionValues oldValues = oldInfo.values; View oldView = oldInfo.view; TransitionValues newValues = getMatchedTransitionValues(oldView, true); boolean cancel = oldInfo.transition.areValuesChanged(oldValues, newValues); TransitionValues startValues = getTransitionValues(oldView, true); TransitionValues endValues = getMatchedTransitionValues(oldView, true); boolean cancel = (startValues != null || endValues != null) && oldInfo.transition.areValuesChanged(oldValues, endValues); if (cancel) { if (anim.isRunning() || anim.isStarted()) { if (DBG) { Loading Loading @@ -1784,7 +1792,17 @@ public abstract class Transition implements Cloneable { String key) { Object oldValue = oldValues.values.get(key); Object newValue = newValues.values.get(key); boolean changed = (oldValue != null && newValue != null && !oldValue.equals(newValue)); boolean changed; if (oldValue == null && newValue == null) { // both are null changed = false; } else if (oldValue == null || newValue == null) { // one is null changed = true; } else { // neither is null changed = !oldValue.equals(newValue); } if (DBG && changed) { Log.d(LOG_TAG, "Transition.playTransition: " + "oldValue != newValue for " + key + Loading
core/java/android/transition/TransitionSet.java +2 −20 Original line number Diff line number Diff line Loading @@ -388,8 +388,6 @@ public class TransitionSet extends Transition { protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues, TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList, ArrayList<TransitionValues> endValuesList) { startValues = removeExcludes(startValues); endValues = removeExcludes(endValues); long startDelay = getStartDelay(); int numTransitions = mTransitions.size(); for (int i = 0; i < numTransitions; i++) { Loading @@ -409,24 +407,6 @@ public class TransitionSet extends Transition { } } private TransitionValuesMaps removeExcludes(TransitionValuesMaps values) { if (mTargetIds.isEmpty() && mTargetIdExcludes == null && mTargetTypeExcludes == null && mTargetNames == null && mTargetTypes == null && mTargetExcludes == null && mTargetNameExcludes == null && mTargets.isEmpty()) { return values; } TransitionValuesMaps included = new TransitionValuesMaps(); int numValues = values.viewValues.size(); for (int i = 0; i < numValues; i++) { View view = values.viewValues.keyAt(i); if (isValidTarget(view)) { addViewValues(included, view, values.viewValues.valueAt(i), false); } } return included; } /** * @hide */ Loading Loading @@ -470,6 +450,7 @@ public class TransitionSet extends Transition { for (Transition childTransition : mTransitions) { if (childTransition.isValidTarget(transitionValues.view)) { childTransition.captureStartValues(transitionValues); transitionValues.targetedTransitions.add(childTransition); } } } Loading @@ -481,6 +462,7 @@ public class TransitionSet extends Transition { for (Transition childTransition : mTransitions) { if (childTransition.isValidTarget(transitionValues.view)) { childTransition.captureEndValues(transitionValues); transitionValues.targetedTransitions.add(childTransition); } } } Loading
core/java/android/transition/TransitionValues.java +6 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.util.ArrayMap; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Map; /** Loading Loading @@ -52,6 +53,11 @@ public class TransitionValues { */ public final Map<String, Object> values = new ArrayMap<String, Object>(); /** * The Transitions that targeted this view. */ final ArrayList<Transition> targetedTransitions = new ArrayList<Transition>(); @Override public boolean equals(Object other) { if (other instanceof TransitionValues) { Loading