diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java index c588c6bf4c7a0..2fb32aafad0ce 100644 --- a/core/java/android/transition/Transition.java +++ b/core/java/android/transition/Transition.java @@ -1451,6 +1451,8 @@ public abstract class Transition implements Cloneable { try { clone = (Transition) super.clone(); clone.mAnimators = new ArrayList(); + clone.mStartValues = new TransitionValuesMaps(); + clone.mEndValues = new TransitionValuesMaps(); } catch (CloneNotSupportedException e) {} return clone; diff --git a/core/java/android/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java index 54d801eba443b..727a98dceb9a8 100644 --- a/core/java/android/transition/TransitionManager.java +++ b/core/java/android/transition/TransitionManager.java @@ -22,6 +22,7 @@ import android.util.Log; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import java.lang.ref.WeakReference; import java.util.ArrayList; /** @@ -68,8 +69,9 @@ public class TransitionManager { ArrayMap mSceneTransitions = new ArrayMap(); ArrayMap> mScenePairTransitions = new ArrayMap>(); - private static ThreadLocal>> sRunningTransitions = - new ThreadLocal>>(); + private static ThreadLocal>>> + sRunningTransitions = + new ThreadLocal>>>(); private static ArrayList sPendingTransitions = new ArrayList(); @@ -184,20 +186,24 @@ public class TransitionManager { } private static ArrayMap> getRunningTransitions() { - ArrayMap> runningTransitions = + WeakReference>> runningTransitions = sRunningTransitions.get(); - if (runningTransitions == null) { - runningTransitions = new ArrayMap>(); + if (runningTransitions == null || runningTransitions.get() == null) { + ArrayMap> transitions = + new ArrayMap>(); + runningTransitions = new WeakReference>>( + transitions); sRunningTransitions.set(runningTransitions); } - return runningTransitions; + return runningTransitions.get(); } private static void sceneChangeRunTransition(final ViewGroup sceneRoot, final Transition transition) { if (transition != null) { final ViewTreeObserver observer = sceneRoot.getViewTreeObserver(); - observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + final ViewTreeObserver.OnPreDrawListener listener = + new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this); sPendingTransitions.remove(sceneRoot); @@ -236,7 +242,8 @@ public class TransitionManager { // values set on them again and avoid artifacts. return false; } - }); + }; + observer.addOnPreDrawListener(listener); } } @@ -355,10 +362,10 @@ public class TransitionManager { // if (transition == null) { // transition = sDefaultTransition; // } -// final Transition finalTransition = transition.clone(); -// sceneChangeSetup(sceneRoot, transition); +// final Transition transitionClone = transition.clone(); +// sceneChangeSetup(sceneRoot, transitionClone); // Scene.setCurrentScene(sceneRoot, null); -// sceneChangeRunTransition(sceneRoot, finalTransition); +// sceneChangeRunTransition(sceneRoot, transitionClone); // } } } diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java index 75d3e7c0b4e02..f49821fab1c32 100644 --- a/core/java/android/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -65,9 +65,6 @@ public abstract class Visibility extends Transition { ViewGroup endParent; } - // Temporary structure, used in calculating state in setup() and play() - private VisibilityInfo mTmpVisibilityInfo = new VisibilityInfo(); - @Override public String[] getTransitionProperties() { return sTransitionProperties; @@ -161,7 +158,7 @@ public abstract class Visibility extends Transition { private VisibilityInfo getVisibilityChangeInfo(TransitionValues startValues, TransitionValues endValues) { - final VisibilityInfo visInfo = mTmpVisibilityInfo; + final VisibilityInfo visInfo = new VisibilityInfo(); visInfo.visibilityChange = false; visInfo.fadeIn = false; if (startValues != null) { diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java index 730c4eb01cd0c..ad8b51db4a1a2 100644 --- a/core/java/android/view/ViewTreeObserver.java +++ b/core/java/android/view/ViewTreeObserver.java @@ -992,6 +992,8 @@ public final class ViewTreeObserver { mData = mDataCopy; } mDataCopy = null; + mAccess.mData.clear(); + mAccess.mSize = 0; } int size() {