diff options
2 files changed, 59 insertions, 1 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index b723337cc894..e078c7e14bd4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -1185,7 +1185,13 @@ class DesktopTasksController( val options = createNewWindowOptions(callingTask) if (options.launchWindowingMode == WINDOWING_MODE_FREEFORM) { wct.startTask(requestedTaskId, options.toBundle()) - transitions.startTransition(TRANSIT_OPEN, wct, null) + val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask( + callingTask.displayId, wct, requestedTaskId) + val runOnTransit = immersiveTransitionHandler + .exitImmersiveIfApplicable(wct, callingTask.displayId) + val transition = transitions.startTransition(TRANSIT_OPEN, wct, null) + addPendingMinimizeTransition(transition, taskToMinimize) + runOnTransit?.invoke(transition) } else { val splitPosition = splitScreenController.determineNewInstancePosition(callingTask) splitScreenController.startTask(requestedTaskId, splitPosition, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index b3c10d64c3a3..6531e2a04ada 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -2984,6 +2984,58 @@ class DesktopTasksControllerTest : ShellTestCase() { .launchWindowingMode).isEqualTo(WINDOWING_MODE_FREEFORM) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES) + fun openInstance_fromFreeform_minimizesIfNeeded() { + setUpLandscapeDisplay() + val homeTask = setUpHomeTask() + val freeformTasks = (1..MAX_TASK_LIMIT + 1).map { _ -> setUpFreeformTask() } + val oldestTask = freeformTasks.first() + val newestTask = freeformTasks.last() + + runOpenInstance(newestTask, freeformTasks[1].taskId) + + val wct = getLatestWct(type = TRANSIT_OPEN) + // Home is moved to front of everything. + assertThat( + wct.hierarchyOps.any { hop -> + hop.container == homeTask.token.asBinder() && hop.toTop + } + ).isTrue() + // And the oldest task isn't moved in front of home, effectively minimizing it. + assertThat( + wct.hierarchyOps.none { hop -> + hop.container == oldestTask.token.asBinder() && hop.toTop + } + ).isTrue() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES) + fun openInstance_fromFreeform_exitsImmersiveIfNeeded() { + setUpLandscapeDisplay() + val homeTask = setUpHomeTask() + val freeformTask = setUpFreeformTask() + val immersiveTask = setUpFreeformTask() + taskRepository.setTaskInFullImmersiveState( + displayId = immersiveTask.displayId, + taskId = immersiveTask.taskId, + immersive = true + ) + val runOnStartTransit = RunOnStartTransitionCallback() + val transition = Binder() + whenever(transitions.startTransition(eq(TRANSIT_OPEN), any(), anyOrNull())) + .thenReturn(transition) + whenever(mockDesktopFullImmersiveTransitionHandler + .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId))).thenReturn(runOnStartTransit) + + runOpenInstance(immersiveTask, freeformTask.taskId) + + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId)) + runOnStartTransit.assertOnlyInvocation(transition) + } + private fun runOpenInstance( callingTask: RunningTaskInfo, requestedTaskId: Int |