summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Graciela Wissen Putri <gracielawputri@google.com> 2024-08-12 16:32:47 +0000
committer Graciela Wissen Putri <gracielawputri@google.com> 2024-08-13 14:12:38 +0000
commit9838460262f68f18e828f24bb83b1918a3c114fd (patch)
treee468bacd42a0a1e4efd98b26b9c1ea4c3a546e78
parent0d20e8d9a860486f5b059b93c4154fc7477d5559 (diff)
Cascade freeform tasks if not visible
Apply cascading effect to tasks launched in freeform in desktop mode if task has not been added to desktop yet via handleFullscreenTaskLaunch. This can happen with a trampoline activity which will inherit freeform windowing mode from its source task and launch via handleFreeformTaskLaunch. Flag: com.android.window.flags.enable_cascading_windows Fix: 357645618 Test: atest DesktopTasksControllerTest Open Gmail -> Compose Open Play Store -> open installed app Open Chrome -> new window Change-Id: Ifd282ac726f2f8486ab0be5ed7214f2922279f01
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt37
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt44
2 files changed, 67 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 e154da58028a..9c467b71f8f7 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
@@ -1043,6 +1043,17 @@ class DesktopTasksController(
wct.reorder(task.token, true)
return wct
}
+ // If task is already visible, it must have been handled already and added to desktop mode.
+ // Cascade task only if it's not visible yet.
+ if (DesktopModeFlags.CASCADING_WINDOWS.isEnabled(context)
+ && !taskRepository.isVisibleTask(task.taskId)) {
+ val displayLayout = displayController.getDisplayLayout(task.displayId)
+ if (displayLayout != null) {
+ val initialBounds = Rect(task.configuration.windowConfiguration.bounds)
+ cascadeWindow(task, initialBounds, displayLayout)
+ wct.setBounds(task.token, initialBounds)
+ }
+ }
if (useDesktopOverrideDensity()) {
wct.setDensityDpi(task.token, DESKTOP_DENSITY_OVERRIDE)
}
@@ -1127,18 +1138,9 @@ class DesktopTasksController(
}
if (DesktopModeFlags.CASCADING_WINDOWS.isEnabled(context)) {
- val stableBounds = Rect()
- displayLayout.getStableBoundsForDesktopMode(stableBounds)
-
- val activeTasks = taskRepository
- .getActiveNonMinimizedOrderedTasks(taskInfo.displayId)
- activeTasks.firstOrNull()?.let { activeTask ->
- shellTaskOrganizer.getRunningTaskInfo(activeTask)?.let {
- cascadeWindow(context.resources, stableBounds,
- it.configuration.windowConfiguration.bounds, initialBounds)
- }
- }
+ cascadeWindow(taskInfo, initialBounds, displayLayout)
}
+
if (canChangeTaskPosition(taskInfo)) {
wct.setBounds(taskInfo.token, initialBounds)
}
@@ -1173,6 +1175,19 @@ class DesktopTasksController(
}
}
+ private fun cascadeWindow(task: TaskInfo, bounds: Rect, displayLayout: DisplayLayout) {
+ val stableBounds = Rect()
+ displayLayout.getStableBoundsForDesktopMode(stableBounds)
+
+ val activeTasks = taskRepository.getActiveNonMinimizedOrderedTasks(task.displayId)
+ activeTasks.firstOrNull()?.let { activeTask ->
+ shellTaskOrganizer.getRunningTaskInfo(activeTask)?.let {
+ cascadeWindow(context.resources, stableBounds,
+ it.configuration.windowConfiguration.bounds, bounds)
+ }
+ }
+ }
+
/**
* Adds split screen changes to a transaction. Note that bounds are not reset here due to
* animation; see {@link onDesktopSplitSelectAnimComplete}
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 92f705097c33..105df466aebb 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
@@ -641,6 +641,41 @@ class DesktopTasksControllerTest : ShellTestCase() {
@Test
@EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS)
+ fun handleRequest_newFreeformTaskLaunch_cascadeApplied() {
+ assumeTrue(ENABLE_SHELL_TRANSITIONS)
+ setUpLandscapeDisplay()
+ val stableBounds = Rect()
+ displayLayout.getStableBoundsForDesktopMode(stableBounds)
+
+ setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS)
+ val freeformTask = setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS, active = false)
+
+ val wct = controller.handleRequest(Binder(), createTransition(freeformTask))
+
+ assertNotNull(wct, "should handle request")
+ val finalBounds = findBoundsChange(wct, freeformTask)
+ assertThat(stableBounds.getDesktopTaskPosition(finalBounds!!))
+ .isEqualTo(DesktopTaskPosition.BottomRight)
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS)
+ fun handleRequest_freeformTaskAlreadyExistsInDesktopMode_cascadeNotApplied() {
+ assumeTrue(ENABLE_SHELL_TRANSITIONS)
+ setUpLandscapeDisplay()
+ val stableBounds = Rect()
+ displayLayout.getStableBoundsForDesktopMode(stableBounds)
+
+ setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS)
+ val freeformTask = setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS)
+
+ val wct = controller.handleRequest(Binder(), createTransition(freeformTask))
+
+ assertNull(wct, "should not handle request")
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS)
fun addMoveToDesktopChanges_positionBottomRight() {
setUpLandscapeDisplay()
val stableBounds = Rect()
@@ -2691,14 +2726,17 @@ class DesktopTasksControllerTest : ShellTestCase() {
private fun setUpFreeformTask(
displayId: Int = DEFAULT_DISPLAY,
- bounds: Rect? = null
+ bounds: Rect? = null,
+ active: Boolean = true
): RunningTaskInfo {
val task = createFreeformTask(displayId, bounds)
val activityInfo = ActivityInfo()
task.topActivityInfo = activityInfo
whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task)
- taskRepository.addActiveTask(displayId, task.taskId)
- taskRepository.updateTaskVisibility(displayId, task.taskId, visible = true)
+ if (active) {
+ taskRepository.addActiveTask(displayId, task.taskId)
+ taskRepository.updateTaskVisibility(displayId, task.taskId, visible = true)
+ }
taskRepository.addOrMoveFreeformTaskToTop(displayId, task.taskId)
runningTasks.add(task)
return task