diff options
author | 2025-02-26 10:22:02 -0800 | |
---|---|---|
committer | 2025-02-26 10:22:02 -0800 | |
commit | 509c26ac1a8479a2090fe3799ea5f281996d74ef (patch) | |
tree | 6965540d9552b476c00de9bc975326bdbd424c27 | |
parent | 82dd4dbeedb1a3eb2177af3d273bee2dcf34764f (diff) | |
parent | dd0112e1d8392ea33de59ae1932a669fe20d0796 (diff) |
Merge "[26/N] Desks: Apply desk activation logic when moving task to next display" into main
2 files changed, 114 insertions, 14 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 644c5b0553b9..e0860ded823c 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 @@ -1321,25 +1321,23 @@ class DesktopTasksController( applyFreeformDisplayChange(wct, task, displayId) } - val activationRunnable: RunOnTransitStart? if (DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) { desksOrganizer.moveTaskToDesk(wct, destinationDeskId, task) - prepareForDeskActivation(displayId, wct) - desksOrganizer.activateDesk(wct, destinationDeskId) - activationRunnable = { transition -> - desksTransitionObserver.addPendingTransition( - DeskTransition.ActiveDeskWithTask( - token = transition, - displayId = displayId, - deskId = destinationDeskId, - enterTaskId = task.taskId, - ) - ) - } } else { wct.reparent(task.token, displayAreaInfo.token, /* onTop= */ true) - activationRunnable = null } + addDeskActivationChanges(destinationDeskId, wct) + val activationRunnable: RunOnTransitStart = { transition -> + desksTransitionObserver.addPendingTransition( + DeskTransition.ActiveDeskWithTask( + token = transition, + displayId = displayId, + deskId = destinationDeskId, + enterTaskId = task.taskId, + ) + ) + } + if (Flags.enableDisplayFocusInShellTransitions()) { // Bring the destination display to top with includingParents=true, so that the // destination display gains the display focus, which makes the top task in the display 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 8805071e34b1..076ce08931d6 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 @@ -2786,6 +2786,73 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() } @Test + @DisableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) + fun moveToNextDisplay_toDesktopInOtherDisplay_bringsExistingTasksToFront() { + val transition = Binder() + val sourceDeskId = 0 + val targetDeskId = 2 + taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = targetDeskId) + taskRepository.setDeskInactive(deskId = targetDeskId) + // Set up two display ids + whenever(rootTaskDisplayAreaOrganizer.displayIds) + .thenReturn(intArrayOf(DEFAULT_DISPLAY, SECOND_DISPLAY)) + // Create a mock for the target display area: second display + val secondDisplayArea = DisplayAreaInfo(MockToken().token(), SECOND_DISPLAY, 0) + whenever(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(SECOND_DISPLAY)) + .thenReturn(secondDisplayArea) + whenever(transitions.startTransition(eq(TRANSIT_CHANGE), any(), anyOrNull())) + .thenReturn(transition) + val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY, deskId = sourceDeskId) + val task2 = setUpFreeformTask(displayId = SECOND_DISPLAY, deskId = targetDeskId) + + controller.moveToNextDisplay(task1.taskId) + + // Existing desktop task in the target display is moved to front. + val wct = getLatestTransition() + wct.assertReorder(task2.token, /* toTop= */ true) + } + + @Test + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY, + Flags.FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY, + Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER, + ) + @DisableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) + fun moveToNextDisplay_toDesktopInOtherDisplay_movesHomeAndWallpaperToFront() { + val homeTask = setUpHomeTask(displayId = SECOND_DISPLAY) + whenever(desktopWallpaperActivityTokenProvider.getToken(SECOND_DISPLAY)) + .thenReturn(wallpaperToken) + val transition = Binder() + val sourceDeskId = 0 + val targetDeskId = 2 + taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = targetDeskId) + taskRepository.setDeskInactive(deskId = targetDeskId) + // Set up two display ids + whenever(rootTaskDisplayAreaOrganizer.displayIds) + .thenReturn(intArrayOf(DEFAULT_DISPLAY, SECOND_DISPLAY)) + // Create a mock for the target display area: second display + val secondDisplayArea = DisplayAreaInfo(MockToken().token(), SECOND_DISPLAY, 0) + whenever(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(SECOND_DISPLAY)) + .thenReturn(secondDisplayArea) + whenever(transitions.startTransition(eq(TRANSIT_CHANGE), any(), anyOrNull())) + .thenReturn(transition) + val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY, deskId = sourceDeskId) + + controller.moveToNextDisplay(task1.taskId) + + // Home / Wallpaper should be moved to front as the background of desktop tasks, otherwise + // fullscreen (non-desktop) tasks could remain visible. + val wct = getLatestTransition() + val homeReorderIndex = wct.indexOfReorder(homeTask, toTop = true) + val wallpaperReorderIndex = wct.indexOfReorder(wallpaperToken, toTop = true) + assertThat(homeReorderIndex).isNotEqualTo(-1) + assertThat(wallpaperReorderIndex).isNotEqualTo(-1) + // Wallpaper last, to be in front of Home. + assertThat(wallpaperReorderIndex).isGreaterThan(homeReorderIndex) + } + + @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun moveToNextDisplay_toDeskInOtherDisplay_movesToDeskAndActivates() { val transition = Binder() @@ -2859,6 +2926,35 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() } @Test + fun moveToNextDisplay_movingToDesktop_sendsTaskbarRoundingUpdate() { + val transition = Binder() + val sourceDeskId = 1 + val targetDeskId = 2 + taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = targetDeskId) + taskRepository.setDeskInactive(deskId = targetDeskId) + // Set up two display ids + whenever(rootTaskDisplayAreaOrganizer.displayIds) + .thenReturn(intArrayOf(DEFAULT_DISPLAY, SECOND_DISPLAY)) + // Create a mock for the target display area: second display + val secondDisplayArea = DisplayAreaInfo(MockToken().token(), SECOND_DISPLAY, 0) + whenever(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(SECOND_DISPLAY)) + .thenReturn(secondDisplayArea) + whenever(transitions.startTransition(eq(TRANSIT_CHANGE), any(), anyOrNull())) + .thenReturn(transition) + + val task = setUpFreeformTask(displayId = DEFAULT_DISPLAY, deskId = sourceDeskId) + taskRepository.addTaskToDesk( + displayId = DEFAULT_DISPLAY, + deskId = sourceDeskId, + taskId = task.taskId, + isVisible = true, + ) + controller.moveToNextDisplay(task.taskId) + + verify(taskbarDesktopTaskListener).onTaskbarCornerRoundingUpdate(anyBoolean()) + } + + @Test fun getTaskWindowingMode() { val fullscreenTask = setUpFullscreenTask() val freeformTask = setUpFreeformTask() @@ -6791,6 +6887,12 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() return arg.lastValue } + private fun getLatestTransition(): WindowContainerTransaction { + val arg = argumentCaptor<WindowContainerTransaction>() + verify(transitions).startTransition(any(), arg.capture(), anyOrNull()) + return arg.lastValue + } + private fun getLatestEnterDesktopWct(): WindowContainerTransaction { val arg = argumentCaptor<WindowContainerTransaction>() verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any()) |