Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +8 −9 Original line number Diff line number Diff line Loading @@ -472,15 +472,14 @@ class DesktopTasksController( remoteTransition: RemoteTransition? = null, callback: IMoveToDesktopCallback? = null, ): Boolean { val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId) val backgroundTask = recentTasksController?.findTaskInBackground(taskId) if (runningTask == null && backgroundTask == null) { val task = shellTaskOrganizer.getRunningTaskInfo(taskId) ?: recentTasksController?.findTaskInBackground(taskId) if (task == null) { logW("moveTaskToDefaultDeskAndActivate taskId=%d not found", taskId) return false } // TODO(342378842): Instead of using default display, support multiple displays val displayId = runningTask?.displayId ?: DEFAULT_DISPLAY val deskId = getDefaultDeskId(displayId) val deskId = getDefaultDeskId(task.displayId) return moveTaskToDesk( taskId = taskId, deskId = deskId, Loading Loading @@ -532,14 +531,14 @@ class DesktopTasksController( remoteTransition: RemoteTransition? = null, callback: IMoveToDesktopCallback? = null, ): Boolean { if (recentTasksController?.findTaskInBackground(taskId) == null) { val task = recentTasksController?.findTaskInBackground(taskId) if (task == null) { logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId) return false } logV("moveBackgroundTaskToDesktop with taskId=%d", taskId) // TODO(342378842): Instead of using default display, support multiple displays val taskIdToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(DEFAULT_DISPLAY, wct, taskId) bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, taskId) val exitResult = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +37 −8 Original line number Diff line number Diff line Loading @@ -1616,7 +1616,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveTaskToDesktop_desktopWallpaperDisabled_nonRunningTask_launchesInFreeform() { val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) Loading @@ -1631,7 +1631,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveTaskToDesktop_desktopWallpaperEnabled_nonRunningTask_launchesInFreeform() { whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) Loading Loading @@ -1803,7 +1803,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) controller.moveTaskToDefaultDeskAndActivate( Loading @@ -1817,6 +1817,34 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @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, ) fun moveBackgroundTaskToDesktop_nonDefaultDisplay_reordersHomeAndWallpaperOfNonDefaultDisplay() { val homeTask = setUpHomeTask(displayId = SECOND_DISPLAY) val wallpaperToken = MockToken().token() whenever(desktopWallpaperActivityTokenProvider.getToken(SECOND_DISPLAY)) .thenReturn(wallpaperToken) val task = setUpFreeformTask(displayId = SECOND_DISPLAY, deskId = 2, background = true) controller.moveTaskToDefaultDeskAndActivate( taskId = task.taskId, transitionSource = UNKNOWN, remoteTransition = RemoteTransition(spy(TestRemoteTransition())), ) 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 fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() Loading Loading @@ -2468,7 +2496,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test fun moveTaskToFront_backgroundTask_launchesTask() { val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever( desktopMixedTransitionHandler.startLaunchTransition( Loading @@ -2490,7 +2518,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test fun moveTaskToFront_backgroundTaskBringsTasksOverLimit_minimizesBackTask() { val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } val task = createTaskInfo(1001) val task = createRecentTaskInfo(1001) whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null) whenever( desktopMixedTransitionHandler.startLaunchTransition( Loading Loading @@ -6716,7 +6744,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() if (background) { whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null) whenever(recentTasksController.findTaskInBackground(task.taskId)) .thenReturn(createTaskInfo(task.taskId)) .thenReturn(createRecentTaskInfo(taskId = task.taskId, displayId = displayId)) } else { whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) } Loading Loading @@ -7151,8 +7179,9 @@ private fun WindowContainerTransaction?.anyWindowingModeChange( } ?: false } private fun createTaskInfo(id: Int) = private fun createRecentTaskInfo(taskId: Int, displayId: Int = DEFAULT_DISPLAY) = RecentTaskInfo().apply { taskId = id this.taskId = taskId this.displayId = displayId token = WindowContainerToken(mock(IWindowContainerToken::class.java)) } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +8 −9 Original line number Diff line number Diff line Loading @@ -472,15 +472,14 @@ class DesktopTasksController( remoteTransition: RemoteTransition? = null, callback: IMoveToDesktopCallback? = null, ): Boolean { val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId) val backgroundTask = recentTasksController?.findTaskInBackground(taskId) if (runningTask == null && backgroundTask == null) { val task = shellTaskOrganizer.getRunningTaskInfo(taskId) ?: recentTasksController?.findTaskInBackground(taskId) if (task == null) { logW("moveTaskToDefaultDeskAndActivate taskId=%d not found", taskId) return false } // TODO(342378842): Instead of using default display, support multiple displays val displayId = runningTask?.displayId ?: DEFAULT_DISPLAY val deskId = getDefaultDeskId(displayId) val deskId = getDefaultDeskId(task.displayId) return moveTaskToDesk( taskId = taskId, deskId = deskId, Loading Loading @@ -532,14 +531,14 @@ class DesktopTasksController( remoteTransition: RemoteTransition? = null, callback: IMoveToDesktopCallback? = null, ): Boolean { if (recentTasksController?.findTaskInBackground(taskId) == null) { val task = recentTasksController?.findTaskInBackground(taskId) if (task == null) { logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId) return false } logV("moveBackgroundTaskToDesktop with taskId=%d", taskId) // TODO(342378842): Instead of using default display, support multiple displays val taskIdToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(DEFAULT_DISPLAY, wct, taskId) bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, taskId) val exitResult = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +37 −8 Original line number Diff line number Diff line Loading @@ -1616,7 +1616,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveTaskToDesktop_desktopWallpaperDisabled_nonRunningTask_launchesInFreeform() { val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) Loading @@ -1631,7 +1631,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveTaskToDesktop_desktopWallpaperEnabled_nonRunningTask_launchesInFreeform() { whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) Loading Loading @@ -1803,7 +1803,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) controller.moveTaskToDefaultDeskAndActivate( Loading @@ -1817,6 +1817,34 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @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, ) fun moveBackgroundTaskToDesktop_nonDefaultDisplay_reordersHomeAndWallpaperOfNonDefaultDisplay() { val homeTask = setUpHomeTask(displayId = SECOND_DISPLAY) val wallpaperToken = MockToken().token() whenever(desktopWallpaperActivityTokenProvider.getToken(SECOND_DISPLAY)) .thenReturn(wallpaperToken) val task = setUpFreeformTask(displayId = SECOND_DISPLAY, deskId = 2, background = true) controller.moveTaskToDefaultDeskAndActivate( taskId = task.taskId, transitionSource = UNKNOWN, remoteTransition = RemoteTransition(spy(TestRemoteTransition())), ) 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 fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() Loading Loading @@ -2468,7 +2496,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test fun moveTaskToFront_backgroundTask_launchesTask() { val task = createTaskInfo(1) val task = createRecentTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever( desktopMixedTransitionHandler.startLaunchTransition( Loading @@ -2490,7 +2518,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test fun moveTaskToFront_backgroundTaskBringsTasksOverLimit_minimizesBackTask() { val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } val task = createTaskInfo(1001) val task = createRecentTaskInfo(1001) whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null) whenever( desktopMixedTransitionHandler.startLaunchTransition( Loading Loading @@ -6716,7 +6744,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() if (background) { whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null) whenever(recentTasksController.findTaskInBackground(task.taskId)) .thenReturn(createTaskInfo(task.taskId)) .thenReturn(createRecentTaskInfo(taskId = task.taskId, displayId = displayId)) } else { whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) } Loading Loading @@ -7151,8 +7179,9 @@ private fun WindowContainerTransaction?.anyWindowingModeChange( } ?: false } private fun createTaskInfo(id: Int) = private fun createRecentTaskInfo(taskId: Int, displayId: Int = DEFAULT_DISPLAY) = RecentTaskInfo().apply { taskId = id this.taskId = taskId this.displayId = displayId token = WindowContainerToken(mock(IWindowContainerToken::class.java)) }