Use getStableBounds if we are in desktop mode Don't use getStableBoundsForDesktopMode as it can be incorrect if insets were updated in runtime. If already in desktop mode, getStableBounds should return correct insets. Flag: EXEMPT bug fix Bug: 406182386 Test: atest DesktopTasksControllerTest Change-Id: Iea0110cef8027b684b4c5d45f97d9a1e68d37af3
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 cbf6cb4..8357ce5 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
@@ -1631,7 +1631,8 @@ val bounds = calculateDefaultDesktopTaskBounds(displayLayout) val deskId = getOrCreateDefaultDeskId(displayId) ?: return if (DesktopModeFlags.ENABLE_CASCADING_WINDOWS.isTrue) { - cascadeWindow(bounds, displayLayout, deskId) + val stableBounds = Rect().apply { displayLayout.getStableBounds(this) } + cascadeWindow(bounds, displayLayout, deskId, stableBounds) } val pendingIntent = PendingIntent.getActivityAsUser( @@ -2909,8 +2910,9 @@ ) { val displayLayout = displayController.getDisplayLayout(task.displayId) if (displayLayout != null) { + val stableBounds = Rect().apply { displayLayout.getStableBounds(this) } val initialBounds = Rect(task.configuration.windowConfiguration.bounds) - cascadeWindow(initialBounds, displayLayout, deskId) + cascadeWindow(initialBounds, displayLayout, deskId, stableBounds) wct.setBounds(task.token, initialBounds) } } @@ -3338,9 +3340,15 @@ ) } - private fun cascadeWindow(bounds: Rect, displayLayout: DisplayLayout, deskId: Int) { - val stableBounds = Rect() - displayLayout.getStableBoundsForDesktopMode(stableBounds) + private fun cascadeWindow( + bounds: Rect, + displayLayout: DisplayLayout, + deskId: Int, + stableBounds: Rect = Rect(), + ) { + if (stableBounds.isEmpty) { + displayLayout.getStableBoundsForDesktopMode(stableBounds) + } val activeTasks = taskRepository.getExpandedTasksIdsInDeskOrdered(deskId) activeTasks
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 111d38a..24d7826 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
@@ -1239,9 +1239,12 @@ @Test @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS) fun handleRequest_newFreeformTaskLaunch_cascadeApplied() { + val stableBounds = + Rect(0, 0, DISPLAY_DIMENSION_LONG, DISPLAY_DIMENSION_SHORT - TASKBAR_FRAME_HEIGHT) + whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> + (i.arguments.first() as Rect).set(stableBounds) + } setUpLandscapeDisplay() - val stableBounds = Rect() - displayLayout.getStableBoundsForDesktopMode(stableBounds) setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS) val freeformTask = setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS, active = false) @@ -1259,7 +1262,7 @@ fun handleRequest_newFreeformTaskLaunch_newDesk_desksCascadeIndependently() { setUpLandscapeDisplay() val stableBounds = Rect() - displayLayout.getStableBoundsForDesktopMode(stableBounds) + displayLayout.getStableBounds(stableBounds) // Launch freeform tasks in default desk. setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS) @@ -1284,7 +1287,7 @@ fun handleRequest_freeformTaskAlreadyExistsInDesktopMode_cascadeNotApplied() { setUpLandscapeDisplay() val stableBounds = Rect() - displayLayout.getStableBoundsForDesktopMode(stableBounds) + displayLayout.getStableBounds(stableBounds) setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS) val freeformTask = setUpFreeformTask(bounds = DEFAULT_LANDSCAPE_BOUNDS)