Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf68aad3 authored by George Mount's avatar George Mount
Browse files

Fix problem with Animators pausing the wrong Window.

Bug 13347005

Because Windows can share a UI thread, pausing/resuming
Animators in transitions can affect other Windows. This
isolates the pause/resume to the Window being operated
on.

Change-Id: Iac84a0a2c838f30c309eea4931467ba758c6ba78
parent 1f97d0ae
Loading
Loading
Loading
Loading
+20 −8
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOverlay;
import android.view.WindowId;
import android.widget.ListView;
import android.widget.Spinner;

@@ -496,7 +497,8 @@ public abstract class Transition implements Cloneable {
                            view = (start != null) ? start.view : null;
                        }
                        if (animator != null) {
                            AnimationInfo info = new AnimationInfo(view, getName(), infoValues);
                            AnimationInfo info = new AnimationInfo(view, getName(),
                                    sceneRoot.getWindowId(), infoValues);
                            runningAnimators.put(animator, info);
                            mAnimators.add(animator);
                        }
@@ -1199,14 +1201,18 @@ public abstract class Transition implements Cloneable {
     *
     * @hide
     */
    public void pause() {
    public void pause(View sceneRoot) {
        if (!mEnded) {
            ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
            int numOldAnims = runningAnimators.size();
            WindowId windowId = sceneRoot.getWindowId();
            for (int i = numOldAnims - 1; i >= 0; i--) {
                AnimationInfo info = runningAnimators.valueAt(i);
                if (info.view != null && windowId.equals(info.windowId)) {
                    Animator anim = runningAnimators.keyAt(i);
                    anim.pause();
                }
            }
            if (mListeners != null && mListeners.size() > 0) {
                ArrayList<TransitionListener> tmpListeners =
                        (ArrayList<TransitionListener>) mListeners.clone();
@@ -1226,15 +1232,19 @@ public abstract class Transition implements Cloneable {
     *
     * @hide
     */
    public void resume() {
    public void resume(View sceneRoot) {
        if (mPaused) {
            if (!mEnded) {
                ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
                int numOldAnims = runningAnimators.size();
                WindowId windowId = sceneRoot.getWindowId();
                for (int i = numOldAnims - 1; i >= 0; i--) {
                    AnimationInfo info = runningAnimators.valueAt(i);
                    if (info.view != null && windowId.equals(info.windowId)) {
                        Animator anim = runningAnimators.keyAt(i);
                        anim.resume();
                    }
                }
                if (mListeners != null && mListeners.size() > 0) {
                    ArrayList<TransitionListener> tmpListeners =
                            (ArrayList<TransitionListener>) mListeners.clone();
@@ -1644,11 +1654,13 @@ public abstract class Transition implements Cloneable {
        public View view;
        String name;
        TransitionValues values;
        WindowId windowId;

        AnimationInfo(View view, String name, TransitionValues values) {
        AnimationInfo(View view, String name, WindowId windowId, TransitionValues values) {
            this.view = view;
            this.name = name;
            this.values = values;
            this.windowId = windowId;
        }
    }

+3 −3
Original line number Diff line number Diff line
@@ -302,7 +302,7 @@ public class TransitionManager {
            ArrayList<Transition> runningTransitions = getRunningTransitions().get(mSceneRoot);
            if (runningTransitions != null && runningTransitions.size() > 0) {
                for (Transition runningTransition : runningTransitions) {
                    runningTransition.resume();
                    runningTransition.resume(mSceneRoot);
                }
            }
            mTransition.clearValues(true);
@@ -335,7 +335,7 @@ public class TransitionManager {
            mTransition.captureValues(mSceneRoot, false);
            if (previousRunningTransitions != null) {
                for (Transition runningTransition : previousRunningTransitions) {
                    runningTransition.resume();
                    runningTransition.resume(mSceneRoot);
                }
            }
            mTransition.playTransition(mSceneRoot);
@@ -351,7 +351,7 @@ public class TransitionManager {

        if (runningTransitions != null && runningTransitions.size() > 0) {
            for (Transition runningTransition : runningTransitions) {
                runningTransition.pause();
                runningTransition.pause(sceneRoot);
            }
        }

+6 −6
Original line number Diff line number Diff line
@@ -317,21 +317,21 @@ public class TransitionSet extends Transition {

    /** @hide */
    @Override
    public void pause() {
        super.pause();
    public void pause(View sceneRoot) {
        super.pause(sceneRoot);
        int numTransitions = mTransitions.size();
        for (int i = 0; i < numTransitions; ++i) {
            mTransitions.get(i).pause();
            mTransitions.get(i).pause(sceneRoot);
        }
    }

    /** @hide */
    @Override
    public void resume() {
        super.resume();
    public void resume(View sceneRoot) {
        super.resume(sceneRoot);
        int numTransitions = mTransitions.size();
        for (int i = 0; i < numTransitions; ++i) {
            mTransitions.get(i).resume();
            mTransitions.get(i).resume(sceneRoot);
        }
    }