Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +36 −7 Original line number Diff line number Diff line Loading @@ -383,12 +383,13 @@ class DesktopTasksController( taskId: Int, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, ): Boolean { val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId) if (runningTask == null) { return moveBackgroundTaskToDesktop(taskId, wct, transitionSource) return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition) } moveRunningTaskToDesktop(runningTask, wct, transitionSource) moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition) return true } Loading @@ -396,6 +397,7 @@ class DesktopTasksController( taskId: Int, wct: WindowContainerTransaction, transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, ): Boolean { if (recentTasksController?.findTaskInBackground(taskId) == null) { logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId) Loading @@ -418,8 +420,17 @@ class DesktopTasksController( .apply { launchWindowingMode = WINDOWING_MODE_FREEFORM } .toBundle(), ) val transition: IBinder if (remoteTransition != null) { val transitionType = transitionType(remoteTransition) val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition) transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler) remoteTransitionHandler.setTransition(transition) } else { // TODO(343149901): Add DPI changes for task launch val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) Loading @@ -433,6 +444,7 @@ class DesktopTasksController( task: RunningTaskInfo, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && Loading @@ -450,12 +462,21 @@ class DesktopTasksController( excludeTaskId = task.taskId, reason = DesktopImmersiveController.ExitReason.TASK_LAUNCH, ) // Bring other apps to front first val taskIdToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId) addMoveToDesktopChanges(wct, task) val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) val transition: IBinder if (remoteTransition != null) { val transitionType = transitionType(remoteTransition) val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition) transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler) remoteTransitionHandler.setTransition(transition) } else { transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) Loading Loading @@ -2657,9 +2678,17 @@ class DesktopTasksController( } } override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) { override fun moveToDesktop( taskId: Int, transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition?, ) { executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c -> c.moveTaskToDesktop(taskId, transitionSource = transitionSource) c.moveTaskToDesktop( taskId, transitionSource = transitionSource, remoteTransition = remoteTransition, ) } } Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,8 @@ interface IDesktopMode { oneway void setTaskListener(IDesktopTaskListener listener); /** Move a task with given `taskId` to desktop */ void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource); void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource, in @nullable RemoteTransition remoteTransition); /** Remove desktop on the given display */ oneway void removeDesktop(int displayId); Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +2 −1 Original line number Diff line number Diff line Loading @@ -717,7 +717,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // App sometimes draws before the insets from WindowDecoration#relayout have // been added, so they must be added here decoration.addCaptionInset(wct); mDesktopTasksController.moveTaskToDesktop(taskId, wct, source); mDesktopTasksController.moveTaskToDesktop(taskId, wct, source, /* remoteTransition= */ null); decoration.closeHandleMenu(); if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +31 −5 Original line number Diff line number Diff line Loading @@ -1217,14 +1217,40 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test fun moveRunningTaskToDesktop_deviceSupported_taskIsMovedToDesktop() { val task = setUpFullscreenTask() @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) whenever( transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture()) ).thenReturn(Binder()) controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN) val task = createTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) controller.moveTaskToDesktop( taskId = task.taskId, transitionSource = UNKNOWN, remoteTransition = RemoteTransition(spy(TestRemoteTransition()))) val wct = getLatestEnterDesktopWct() assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM) verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) } @Test fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) whenever( transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture()) ).thenReturn(Binder()) controller.moveRunningTaskToDesktop( task = setUpFullscreenTask(), transitionSource = UNKNOWN, remoteTransition = RemoteTransition(spy(TestRemoteTransition()))) verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) } @Test Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +3 −2 Original line number Diff line number Diff line Loading @@ -591,7 +591,8 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest verify(mockDesktopTasksController).moveTaskToDesktop( eq(decor.mTaskInfo.taskId), any(), eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON), anyOrNull() ) } Loading Loading @@ -824,7 +825,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest ) verify(mockDesktopTasksController, times(1)) .moveTaskToDesktop(any(), any(), any()) .moveTaskToDesktop(any(), any(), any(), anyOrNull()) } @Test Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +36 −7 Original line number Diff line number Diff line Loading @@ -383,12 +383,13 @@ class DesktopTasksController( taskId: Int, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, ): Boolean { val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId) if (runningTask == null) { return moveBackgroundTaskToDesktop(taskId, wct, transitionSource) return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition) } moveRunningTaskToDesktop(runningTask, wct, transitionSource) moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition) return true } Loading @@ -396,6 +397,7 @@ class DesktopTasksController( taskId: Int, wct: WindowContainerTransaction, transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, ): Boolean { if (recentTasksController?.findTaskInBackground(taskId) == null) { logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId) Loading @@ -418,8 +420,17 @@ class DesktopTasksController( .apply { launchWindowingMode = WINDOWING_MODE_FREEFORM } .toBundle(), ) val transition: IBinder if (remoteTransition != null) { val transitionType = transitionType(remoteTransition) val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition) transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler) remoteTransitionHandler.setTransition(transition) } else { // TODO(343149901): Add DPI changes for task launch val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) Loading @@ -433,6 +444,7 @@ class DesktopTasksController( task: RunningTaskInfo, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && Loading @@ -450,12 +462,21 @@ class DesktopTasksController( excludeTaskId = task.taskId, reason = DesktopImmersiveController.ExitReason.TASK_LAUNCH, ) // Bring other apps to front first val taskIdToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId) addMoveToDesktopChanges(wct, task) val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) val transition: IBinder if (remoteTransition != null) { val transitionType = transitionType(remoteTransition) val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition) transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler) remoteTransitionHandler.setTransition(transition) } else { transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) Loading Loading @@ -2657,9 +2678,17 @@ class DesktopTasksController( } } override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) { override fun moveToDesktop( taskId: Int, transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition?, ) { executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c -> c.moveTaskToDesktop(taskId, transitionSource = transitionSource) c.moveTaskToDesktop( taskId, transitionSource = transitionSource, remoteTransition = remoteTransition, ) } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,8 @@ interface IDesktopMode { oneway void setTaskListener(IDesktopTaskListener listener); /** Move a task with given `taskId` to desktop */ void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource); void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource, in @nullable RemoteTransition remoteTransition); /** Remove desktop on the given display */ oneway void removeDesktop(int displayId); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +2 −1 Original line number Diff line number Diff line Loading @@ -717,7 +717,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // App sometimes draws before the insets from WindowDecoration#relayout have // been added, so they must be added here decoration.addCaptionInset(wct); mDesktopTasksController.moveTaskToDesktop(taskId, wct, source); mDesktopTasksController.moveTaskToDesktop(taskId, wct, source, /* remoteTransition= */ null); decoration.closeHandleMenu(); if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +31 −5 Original line number Diff line number Diff line Loading @@ -1217,14 +1217,40 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test fun moveRunningTaskToDesktop_deviceSupported_taskIsMovedToDesktop() { val task = setUpFullscreenTask() @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) whenever( transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture()) ).thenReturn(Binder()) controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN) val task = createTaskInfo(1) whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null) whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task) controller.moveTaskToDesktop( taskId = task.taskId, transitionSource = UNKNOWN, remoteTransition = RemoteTransition(spy(TestRemoteTransition()))) val wct = getLatestEnterDesktopWct() assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM) verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) } @Test fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) whenever( transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture()) ).thenReturn(Binder()) controller.moveRunningTaskToDesktop( task = setUpFullscreenTask(), transitionSource = UNKNOWN, remoteTransition = RemoteTransition(spy(TestRemoteTransition()))) verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) } @Test Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +3 −2 Original line number Diff line number Diff line Loading @@ -591,7 +591,8 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest verify(mockDesktopTasksController).moveTaskToDesktop( eq(decor.mTaskInfo.taskId), any(), eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON), anyOrNull() ) } Loading Loading @@ -824,7 +825,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest ) verify(mockDesktopTasksController, times(1)) .moveTaskToDesktop(any(), any(), any()) .moveTaskToDesktop(any(), any(), any(), anyOrNull()) } @Test Loading