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

Commit 05d96116 authored by Liran Binyamin's avatar Liran Binyamin
Browse files

Skip empty transitions in TaskViewTransitions

TaskViewTransitions#startAnimation now returns false if the transition
has no changes so that other handlers can pick it up.

Bug: 432320630
Flag: EXEMPT bug fix
Test: atest TaskViewTransitionsTest
Change-Id: Ibb9bb8ab41fb0f08d8f4c6ecc51809675d1a9f0e
parent 81515a9e
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -766,6 +766,19 @@ public class TaskViewTransitions implements Transitions.TransitionHandler, TaskV
                                  @NonNull SurfaceControl.Transaction startTransaction,
                                  @NonNull SurfaceControl.Transaction finishTransaction,
                                  @NonNull Transitions.TransitionFinishCallback finishCallback) {
        if (transitionInfo == null || transitionInfo.getChanges().isEmpty()) {
            PendingTransition pending = findPending(transition);
            if (pending != null) {
                ProtoLog.e(WM_SHELL_BUBBLES, "Transitions.startAnimation(): found a transition with"
                                + "no changes that is managed by TaskViewTransitions. taskView=%d "
                                + "type=%s transition=%s", pending.mTaskView.hashCode(),
                        transitTypeToString(pending.mType), transition);
                mPending.remove(pending);
                startNextTransition();
            }
            return false;
        }

        if (!Flags.taskViewTransitionsRefactor() && !enableHandlersDebuggingMode()) {
            return startAnimationLegacy(transition, transitionInfo, startTransaction,
                    finishTransaction, finishCallback);
+63 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.wm.shell.taskview;

import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
@@ -472,6 +473,68 @@ public class TaskViewTransitionsTest extends ShellTestCase {
        assertThat(mTaskViewTransitions.hasPending()).isTrue();
    }

    @Test
    public void transitionWithNoChanges_shouldNotBeHandled() {
        IBinder transition = new Binder();
        TransitionInfo transitionInfo = new TransitionInfo(TRANSIT_CLOSE, /* flags= */ 0);
        boolean handled = mTaskViewTransitions.startAnimation(transition, transitionInfo,
                new SurfaceControl.Transaction(),
                new SurfaceControl.Transaction(),
                mock(Transitions.TransitionFinishCallback.class));

        assertThat(handled).isFalse();
    }

    @Test
    public void transitionWithNoChanges_tvtManaged_shouldStartNextTransition() {
        // enqueue an empty transition managed by TaskViewTransitions
        IBinder transition = new Binder();
        TransitionInfo transitionInfo = new TransitionInfo(TRANSIT_CLOSE, /* flags= */ 0);
        mTaskViewTransitions.enqueueRunningExternal(mTaskViewTaskController, transition);
        assertThat(mTaskViewTransitions.hasPending()).isTrue();

        // enqueue a normal transition
        mTaskViewTransitions.setTaskViewVisible(mTaskViewTaskController, true);
        TaskViewTransitions.PendingTransition pendingTransition =
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_TO_FRONT);
        assertThat(pendingTransition).isNotNull();
        assertThat(pendingTransition.mClaimed).isNull();

        IBinder pendingTransitionToken = new Binder();
        when(mTransitions.startTransition(pendingTransition.mType, pendingTransition.mWct,
                mTaskViewTransitions)).thenReturn(pendingTransitionToken);

        // dispatch the empty transition
        mTaskViewTransitions.startAnimation(transition, transitionInfo,
                new SurfaceControl.Transaction(),
                new SurfaceControl.Transaction(),
                mock(Transitions.TransitionFinishCallback.class));

        // check that the next transition was dispatched
        assertThat(pendingTransition.mClaimed).isNotNull();
    }

    @Test
    public void transitionWithNoChanges_nonTvtManaged_shouldNotStartNextTransition() {
        // enqueue a normal transition
        mTaskViewTransitions.setTaskViewVisible(mTaskViewTaskController, true);
        TaskViewTransitions.PendingTransition pendingTransition =
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_TO_FRONT);
        assertThat(pendingTransition).isNotNull();
        assertThat(pendingTransition.mClaimed).isNull();

        // dispatch an empty transition which is not managed by TaskViewTransitions
        IBinder transition = new Binder();
        TransitionInfo transitionInfo = new TransitionInfo(TRANSIT_CLOSE, /* flags= */ 0);
        mTaskViewTransitions.startAnimation(transition, transitionInfo,
                new SurfaceControl.Transaction(),
                new SurfaceControl.Transaction(),
                mock(Transitions.TransitionFinishCallback.class));

        // check that the next transition was not dispatched
        assertThat(pendingTransition.mClaimed).isNull();
    }

    private ActivityManager.RunningTaskInfo createMockTaskInfo(int taskId,
            WindowContainerToken token) {
        ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();