diff options
| author | 2024-11-06 14:40:30 +0000 | |
|---|---|---|
| committer | 2024-12-06 09:01:35 +0000 | |
| commit | 46f06f39ee8e4252a3b14b6f8a20ad12c94c7df0 (patch) | |
| tree | ef2730143f189d7854c4b3d6eacbbd78b199165f | |
| parent | 6e34e3a2f78ab8f165d4fd6255eb919b0571f718 (diff) | |
Add RemoteTransition to launch desktop tasks from recents view
Bug: 333524374
Fix: 379620787
Flag: com.android.window.flags.enable_desktop_windowing_mode
Test: DesktopTasksControllerTest
Test: DesktopModeWindowDecorViewModelTests
Change-Id: Ibac0c55b0661653f7771846bf64804e2275b0d33
5 files changed, 74 insertions, 16 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 c16c805ce28e..8fc0975ef2d5 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 @@ -376,12 +376,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 } @@ -389,6 +390,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) @@ -411,8 +413,17 @@ class DesktopTasksController( .apply { launchWindowingMode = WINDOWING_MODE_FREEFORM } .toBundle(), ) - // TODO(343149901): Add DPI changes for task launch - 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 { + // TODO(343149901): Add DPI changes for task launch + transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) @@ -426,6 +437,7 @@ class DesktopTasksController( task: RunningTaskInfo, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, + remoteTransition: RemoteTransition? = null, ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && @@ -443,12 +455,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 ) @@ -2606,9 +2627,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, + ) } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl index aac2361f717e..fa383cb55118 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl @@ -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); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index e8b02dcb7a71..d0937758a8ae 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -701,7 +701,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) { 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 c10434aa6d6f..dea79b772ef7 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 @@ -1216,14 +1216,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 diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index a4e3af47edaa..856684e0942e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -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() ) } @@ -822,7 +823,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest ) verify(mockDesktopTasksController, times(1)) - .moveTaskToDesktop(any(), any(), any()) + .moveTaskToDesktop(any(), any(), any(), anyOrNull()) } @Test |