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

Commit 2c646503 authored by Liran Binyamin's avatar Liran Binyamin Committed by Android (Google) Code Review
Browse files

Merge "Skip empty transitions in TaskViewTransitions" into main

parents 22bdb248 05d96116
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();