diff options
4 files changed, 88 insertions, 37 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt index 1eac64506a05..113e3d067a90 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt @@ -314,29 +314,22 @@ class DesktopRepository( return false } - /** - * Adds given task to the closing task list for [displayId]'s active desk. - * - * TODO: b/389960283 - add explicit [deskId] argument. - */ - fun addClosingTask(displayId: Int, taskId: Int) { - val activeDesk = - desktopData.getActiveDesk(displayId) - ?: error("Expected active desk in display: $displayId") - if (activeDesk.closingTasks.add(taskId)) { - logD( - "Added closing task=%d displayId=%d deskId=%d", - taskId, - displayId, - activeDesk.deskId, - ) + /** Adds given task to the closing task list of its desk. */ + fun addClosingTask(displayId: Int, deskId: Int?, taskId: Int) { + val desk = + deskId?.let { desktopData.getDesk(it) } + ?: checkNotNull(desktopData.getActiveDesk(displayId)) { + "Expected active desk in display: $displayId" + } + if (desk.closingTasks.add(taskId)) { + logD("Added closing task=%d displayId=%d deskId=%d", taskId, displayId, desk.deskId) } else { // If the task hasn't been removed from closing list after it disappeared. logW( "Task with taskId=%d displayId=%d deskId=%d is already closing", taskId, displayId, - activeDesk.deskId, + desk.deskId, ) } } 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 01a539ac8205..cdbf9d901e9c 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 @@ -801,6 +801,9 @@ class DesktopTasksController( ): ((IBinder) -> Unit) { val taskId = taskInfo.taskId val deskId = taskRepository.getDeskIdForTask(taskInfo.taskId) + if (deskId == null && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) { + error("Did not find desk for task: $taskId") + } snapEventHandler.removeTaskIfTiled(displayId, taskId) val shouldExitDesktop = willExitDesktop( @@ -818,7 +821,7 @@ class DesktopTasksController( shouldEndUpAtHome = true, ) - taskRepository.addClosingTask(displayId, taskId) + taskRepository.addClosingTask(displayId = displayId, deskId = deskId, taskId = taskId) taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate( doesAnyTaskRequireTaskbarRounding(displayId, taskId) ) @@ -1251,9 +1254,9 @@ class DesktopTasksController( // home. if (Flags.enablePerDisplayDesktopWallpaperActivity()) { performDesktopExitCleanupIfNeeded( - task.taskId, - task.displayId, - wct, + taskId = task.taskId, + displayId = task.displayId, + wct = wct, forceToFullscreen = false, // TODO: b/371096166 - Temporary turing home relaunch off to prevent home stealing // display focus. Remove shouldEndUpAtHome = false when home focus handling @@ -1820,6 +1823,7 @@ class DesktopTasksController( private fun performDesktopExitCleanupIfNeeded( taskId: Int, + deskId: Int? = null, displayId: Int, wct: WindowContainerTransaction, forceToFullscreen: Boolean, @@ -1833,13 +1837,14 @@ class DesktopTasksController( // |RunOnTransitStart| when the transition is started. return performDesktopExitCleanUp( wct = wct, - deskId = null, + deskId = deskId, displayId = displayId, willExitDesktop = true, shouldEndUpAtHome = shouldEndUpAtHome, ) } + /** TODO: b/394268248 - update [deskId] to be non-null. */ private fun performDesktopExitCleanUp( wct: WindowContainerTransaction, deskId: Int?, @@ -2390,17 +2395,28 @@ class DesktopTasksController( ): WindowContainerTransaction? { logV("handleTaskClosing") if (!isDesktopModeShowing(task.displayId)) return null + val deskId = taskRepository.getDeskIdForTask(task.taskId) + if (deskId == null && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) { + return null + } val wct = WindowContainerTransaction() - performDesktopExitCleanupIfNeeded( - task.taskId, - task.displayId, - wct, - forceToFullscreen = false, - ) + val deactivationRunnable = + performDesktopExitCleanupIfNeeded( + taskId = task.taskId, + deskId = deskId, + displayId = task.displayId, + wct = wct, + forceToFullscreen = false, + ) + deactivationRunnable?.invoke(transition) if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) { - taskRepository.addClosingTask(task.displayId, task.taskId) + taskRepository.addClosingTask( + displayId = task.displayId, + deskId = deskId, + taskId = task.taskId, + ) snapEventHandler.removeTaskIfTiled(task.displayId, task.taskId) } @@ -2604,9 +2620,9 @@ class DesktopTasksController( wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) performDesktopExitCleanupIfNeeded( - taskInfo.taskId, - taskInfo.displayId, - wct, + taskId = taskInfo.taskId, + displayId = taskInfo.displayId, + wct = wct, forceToFullscreen = false, shouldEndUpAtHome = false, ) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt index ed9b97d264f7..9bff287e314a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt @@ -333,7 +333,7 @@ class DesktopRepositoryTest(flags: FlagsParameterization) : ShellTestCase() { @Test fun isOnlyVisibleNonClosingTask_singleVisibleClosingTask() { repo.updateTask(DEFAULT_DISPLAY, taskId = 1, isVisible = true) - repo.addClosingTask(DEFAULT_DISPLAY, 1) + repo.addClosingTask(displayId = DEFAULT_DISPLAY, deskId = 0, taskId = 1) // A visible task that's closing assertThat(repo.isVisibleTask(1)).isTrue() 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 9cc6e62f1214..2e63c4f51792 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 @@ -2827,7 +2827,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun onDesktopWindowClose_singleActiveTask_isClosing() { val task = setUpFreeformTask() - taskRepository.addClosingTask(DEFAULT_DISPLAY, task.taskId) + taskRepository.addClosingTask(displayId = DEFAULT_DISPLAY, deskId = 0, taskId = task.taskId) val wct = WindowContainerTransaction() controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) @@ -2864,7 +2864,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() - taskRepository.addClosingTask(DEFAULT_DISPLAY, task2.taskId) + taskRepository.addClosingTask( + displayId = DEFAULT_DISPLAY, + deskId = 0, + taskId = task2.taskId, + ) val wct = WindowContainerTransaction() controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task1) @@ -3996,7 +4000,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY) val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY) - taskRepository.addClosingTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId) + taskRepository.addClosingTask( + displayId = DEFAULT_DISPLAY, + deskId = 0, + taskId = task2.taskId, + ) val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_TO_BACK)) @@ -4107,6 +4115,36 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() } @Test + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY, + Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER, + Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND, + ) + fun handleRequest_closeTransition_onlyDesktopTask_deactivatesDesk() { + val task = setUpFreeformTask() + + controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE)) + + verify(desksOrganizer).deactivateDesk(any(), /* deskId= */ eq(0)) + } + + @Test + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY, + Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER, + Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND, + ) + fun handleRequest_closeTransition_onlyDesktopTask_addsDeactivatesDeskTransition() { + val transition = Binder() + val task = setUpFreeformTask() + + controller.handleRequest(transition, createTransition(task, type = TRANSIT_CLOSE)) + + verify(desksTransitionsObserver) + .addPendingTransition(DeskTransition.DeactivateDesk(token = transition, deskId = 0)) + } + + @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_closeTransition_multipleTasks_noWallpaper_doesNotHandle() { val task1 = setUpFreeformTask() @@ -4139,7 +4177,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY) val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY) - taskRepository.addClosingTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId) + taskRepository.addClosingTask( + displayId = DEFAULT_DISPLAY, + deskId = 0, + taskId = task2.taskId, + ) val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE)) |