diff options
| author | 2024-08-14 08:24:22 +0000 | |
|---|---|---|
| committer | 2024-08-14 08:24:22 +0000 | |
| commit | f4c52eaba53742a2addf481b72a2134a079a7c3b (patch) | |
| tree | 4e83b844d61800dee45395db4837813e098cd803 | |
| parent | 49e8ac3ef24b1f244c9d64fa1ee6d5c54bda316e (diff) | |
| parent | 9838460262f68f18e828f24bb83b1918a3c114fd (diff) | |
Merge "Cascade freeform tasks if not visible" into main
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 |