summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Graciela Putri <gracielawputri@google.com> 2024-08-14 08:24:22 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-08-14 08:24:22 +0000
commitf4c52eaba53742a2addf481b72a2134a079a7c3b (patch)
tree4e83b844d61800dee45395db4837813e098cd803
parent49e8ac3ef24b1f244c9d64fa1ee6d5c54bda316e (diff)
parent9838460262f68f18e828f24bb83b1918a3c114fd (diff)
Merge "Cascade freeform tasks if not visible" into main
-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 f54b44b29683..ecbb1ffff8b7 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
@@ -1045,6 +1045,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)
}
@@ -1134,18 +1145,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)
}
@@ -1180,6 +1182,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 7bb54498b877..18c62282f035 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()
@@ -2816,14 +2851,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