summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jordan Silva <silvajordan@google.com> 2024-11-06 14:40:30 +0000
committer Jordan Silva <silvajordan@google.com> 2024-12-06 09:01:35 +0000
commit46f06f39ee8e4252a3b14b6f8a20ad12c94c7df0 (patch)
treeef2730143f189d7854c4b3d6eacbbd78b199165f
parent6e34e3a2f78ab8f165d4fd6255eb919b0571f718 (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
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt43
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt36
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt5
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