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

Commit f9be5327 authored by Mady Mellor's avatar Mady Mellor Committed by Android (Google) Code Review
Browse files

Merge "Fix misplaced surface from fold -> unfold while bubbles are expanded" into udc-dev

parents c8196383 4ab85f3d
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -134,6 +134,21 @@ public class TaskViewTransitions implements Transitions.TransitionHandler {
        return null;
    }

    /**
     * Looks through the pending transitions for a opening transaction that matches the provided
     * `taskView`.
     * @param taskView the pending transition should be for this.
     */
    private PendingTransition findPendingOpeningTransition(TaskViewTaskController taskView) {
        for (int i = mPending.size() - 1; i >= 0; --i) {
            if (mPending.get(i).mTaskView != taskView) continue;
            if (TransitionUtil.isOpeningType(mPending.get(i).mType)) {
                return mPending.get(i);
            }
        }
        return null;
    }

    /**
     * Looks through the pending transitions for one matching `taskView`.
     * @param taskView the pending transition should be for this.
@@ -149,6 +164,19 @@ public class TaskViewTransitions implements Transitions.TransitionHandler {
        return null;
    }

    /**
     * Returns all the pending transitions for a given `taskView`.
     * @param taskView the pending transition should be for this.
     */
    ArrayList<PendingTransition> findAllPending(TaskViewTaskController taskView) {
        ArrayList<PendingTransition> list = new ArrayList<>();
        for (int i = mPending.size() - 1; i >= 0; --i) {
            if (mPending.get(i).mTaskView != taskView) continue;
            list.add(mPending.get(i));
        }
        return list;
    }

    private PendingTransition findPending(IBinder claimed) {
        for (int i = 0; i < mPending.size(); ++i) {
            if (mPending.get(i).mClaimed != claimed) continue;
@@ -249,9 +277,10 @@ public class TaskViewTransitions implements Transitions.TransitionHandler {
            // Task view isn't visible, the bounds will next visibility update.
            return;
        }
        if (hasPending()) {
            // There is already a transition in-flight, the window bounds will be set in
            // prepareOpenAnimation.
        PendingTransition pendingOpen = findPendingOpeningTransition(taskView);
        if (pendingOpen != null) {
            // There is already an opening transition in-flight, the window bounds will be
            // set in prepareOpenAnimation (via the window crop) if needed.
            return;
        }
        WindowContainerTransaction wct = new WindowContainerTransaction();
+99 −2
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.List;

@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@@ -58,6 +60,12 @@ public class TaskViewTransitionsTest extends ShellTestCase {
    ActivityManager.RunningTaskInfo mTaskInfo;
    @Mock
    WindowContainerToken mToken;
    @Mock
    TaskViewTaskController mTaskViewTaskController2;
    @Mock
    ActivityManager.RunningTaskInfo mTaskInfo2;
    @Mock
    WindowContainerToken mToken2;

    TaskViewTransitions mTaskViewTransitions;

@@ -73,10 +81,16 @@ public class TaskViewTransitionsTest extends ShellTestCase {
        mTaskInfo.token = mToken;
        mTaskInfo.taskId = 314;
        mTaskInfo.taskDescription = mock(ActivityManager.TaskDescription.class);
        when(mTaskViewTaskController.getTaskInfo()).thenReturn(mTaskInfo);

        mTaskInfo2 = new ActivityManager.RunningTaskInfo();
        mTaskInfo2.token = mToken2;
        mTaskInfo2.taskId = 315;
        mTaskInfo2.taskDescription = mock(ActivityManager.TaskDescription.class);
        when(mTaskViewTaskController2.getTaskInfo()).thenReturn(mTaskInfo2);

        mTaskViewTransitions = spy(new TaskViewTransitions(mTransitions));
        mTaskViewTransitions.addTaskView(mTaskViewTaskController);
        when(mTaskViewTaskController.getTaskInfo()).thenReturn(mTaskInfo);
    }

    @Test
@@ -119,7 +133,7 @@ public class TaskViewTransitionsTest extends ShellTestCase {
    }

    @Test
    public void testSetTaskBounds_taskVisibleWithPending_noTransaction() {
    public void testSetTaskBounds_taskVisibleWithPendingOpen_noTransaction() {
        assumeTrue(Transitions.ENABLE_SHELL_TRANSITIONS);

        mTaskViewTransitions.setTaskViewVisible(mTaskViewTaskController, true);
@@ -134,6 +148,43 @@ public class TaskViewTransitionsTest extends ShellTestCase {
                .isNull();
    }

    @Test
    public void testSetTaskBounds_taskVisibleWithPendingChange_transition() {
        assumeTrue(Transitions.ENABLE_SHELL_TRANSITIONS);

        mTaskViewTransitions.setTaskViewVisible(mTaskViewTaskController, true);

        // Consume the pending transition from visibility change
        TaskViewTransitions.PendingTransition pending =
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_TO_FRONT);
        assertThat(pending).isNotNull();
        mTaskViewTransitions.startAnimation(pending.mClaimed,
                mock(TransitionInfo.class),
                new SurfaceControl.Transaction(),
                new SurfaceControl.Transaction(),
                mock(Transitions.TransitionFinishCallback.class));
        // Verify it was consumed
        TaskViewTransitions.PendingTransition checkPending =
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_TO_FRONT);
        assertThat(checkPending).isNull();

        // Test that set bounds creates a new transition
        mTaskViewTransitions.setTaskBounds(mTaskViewTaskController,
                new Rect(0, 0, 100, 100));
        assertThat(mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_CHANGE))
                .isNotNull();

        // Test that set bounds again (with different bounds) creates another transition
        mTaskViewTransitions.setTaskBounds(mTaskViewTaskController,
                new Rect(0, 0, 300, 200));
        List<TaskViewTransitions.PendingTransition> pendingList =
                mTaskViewTransitions.findAllPending(mTaskViewTaskController)
                        .stream()
                        .filter(pendingTransition -> pendingTransition.mType == TRANSIT_CHANGE)
                        .toList();
        assertThat(pendingList.size()).isEqualTo(2);
    }

    @Test
    public void testSetTaskBounds_sameBounds_noTransaction() {
        assumeTrue(Transitions.ENABLE_SHELL_TRANSITIONS);
@@ -161,6 +212,16 @@ public class TaskViewTransitionsTest extends ShellTestCase {
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_CHANGE);
        assertThat(pendingBounds).isNotNull();

        // Test that setting same bounds with in-flight transition doesn't cause another one
        mTaskViewTransitions.setTaskBounds(mTaskViewTaskController,
                new Rect(0, 0, 100, 100));
        List<TaskViewTransitions.PendingTransition> pendingList =
                mTaskViewTransitions.findAllPending(mTaskViewTaskController)
                        .stream()
                        .filter(pendingTransition -> pendingTransition.mType == TRANSIT_CHANGE)
                        .toList();
        assertThat(pendingList.size()).isEqualTo(1);

        // Consume the pending bounds transaction
        mTaskViewTransitions.startAnimation(pendingBounds.mClaimed,
                mock(TransitionInfo.class),
@@ -180,6 +241,42 @@ public class TaskViewTransitionsTest extends ShellTestCase {
        assertThat(pendingBounds2).isNull();
    }


    @Test
    public void testSetTaskBounds_taskVisibleWithDifferentTaskViewPendingChange_transition() {
        assumeTrue(Transitions.ENABLE_SHELL_TRANSITIONS);

        mTaskViewTransitions.addTaskView(mTaskViewTaskController2);

        mTaskViewTransitions.setTaskViewVisible(mTaskViewTaskController, true);

        // Consume the pending transition from visibility change
        TaskViewTransitions.PendingTransition pending =
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_TO_FRONT);
        assertThat(pending).isNotNull();
        mTaskViewTransitions.startAnimation(pending.mClaimed,
                mock(TransitionInfo.class),
                new SurfaceControl.Transaction(),
                new SurfaceControl.Transaction(),
                mock(Transitions.TransitionFinishCallback.class));
        // Verify it was consumed
        TaskViewTransitions.PendingTransition checkPending =
                mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_TO_FRONT);
        assertThat(checkPending).isNull();

        // Set the second taskview as visible & check that it has a pending transition
        mTaskViewTransitions.setTaskViewVisible(mTaskViewTaskController2, true);
        TaskViewTransitions.PendingTransition pending2 =
                mTaskViewTransitions.findPending(mTaskViewTaskController2, TRANSIT_TO_FRONT);
        assertThat(pending2).isNotNull();

        // Test that set bounds on the first taskview will create a new transition
        mTaskViewTransitions.setTaskBounds(mTaskViewTaskController,
                new Rect(0, 0, 100, 100));
        assertThat(mTaskViewTransitions.findPending(mTaskViewTaskController, TRANSIT_CHANGE))
                .isNotNull();
    }

    @Test
    public void testSetTaskVisibility_taskRemoved_noNPE() {
        mTaskViewTransitions.removeTaskView(mTaskViewTaskController);