Merge "Make sure Tiling knows when a task is focused" into main
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt
index 61963cd..0e40a53 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt
@@ -103,7 +103,7 @@
     fun moveTaskToFrontIfTiled(taskInfo: RunningTaskInfo): Boolean {
         return tilingTransitionHandlerByDisplayId
             .get(taskInfo.displayId)
-            ?.moveTiledPairToFront(taskInfo) ?: false
+            ?.moveTiledPairToFront(taskInfo, isTaskFocused = true) ?: false
     }
 
     fun onOverviewAnimationStateChange(isRunning: Boolean) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt
index 1c593c03..418b8ec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt
@@ -230,14 +230,14 @@
             ResizeTrigger.TILING_DIVIDER,
             motionEvent,
             leftTiledTask.taskInfo,
-            displayController
+            displayController,
         )
 
         desktopModeEventLogger.logTaskResizingStarted(
             ResizeTrigger.TILING_DIVIDER,
             motionEvent,
             rightTiledTask.taskInfo,
-            displayController
+            displayController,
         )
     }
 
@@ -303,7 +303,7 @@
             leftTiledTask.taskInfo,
             leftTiledTask.newBounds.height(),
             leftTiledTask.newBounds.width(),
-            displayController
+            displayController,
         )
 
         desktopModeEventLogger.logTaskResizingEnded(
@@ -312,7 +312,7 @@
             rightTiledTask.taskInfo,
             rightTiledTask.newBounds.height(),
             rightTiledTask.newBounds.width(),
-            displayController
+            displayController,
         )
 
         if (leftTiledTask.newBounds == leftTiledTask.bounds) {
@@ -471,9 +471,9 @@
         }
     }
 
+    // Only called if [taskInfo] relates to a focused task
     private fun isTilingFocusRemoved(taskInfo: RunningTaskInfo): Boolean {
-        return taskInfo.isFocused &&
-            isTilingFocused &&
+        return isTilingFocused &&
             taskInfo.taskId != leftTaskResizingHelper?.taskInfo?.taskId &&
             taskInfo.taskId != rightTaskResizingHelper?.taskInfo?.taskId
     }
@@ -484,9 +484,9 @@
         }
     }
 
+    // Only called if [taskInfo] relates to a focused task
     private fun isTilingRefocused(taskInfo: RunningTaskInfo): Boolean {
         return !isTilingFocused &&
-            taskInfo.isFocused &&
             (taskInfo.taskId == leftTaskResizingHelper?.taskInfo?.taskId ||
                 taskInfo.taskId == rightTaskResizingHelper?.taskInfo?.taskId)
     }
@@ -573,9 +573,19 @@
         removeTaskIfTiled(taskId, taskVanished = true, shouldDelayUpdate = true)
     }
 
-    fun moveTiledPairToFront(taskInfo: RunningTaskInfo): Boolean {
+    /**
+     * Moves the tiled pair to the front of the task stack, if the [taskInfo] is focused and one of
+     * the two tiled tasks.
+     *
+     * If specified, [isTaskFocused] will override [RunningTaskInfo.isFocused]. This is to be used
+     * when called when the task will be focused, but the [taskInfo] hasn't been updated yet.
+     */
+    fun moveTiledPairToFront(taskInfo: RunningTaskInfo, isTaskFocused: Boolean? = null): Boolean {
         if (!isTilingManagerInitialised) return false
 
+        val isFocused = isTaskFocused ?: taskInfo.isFocused
+        if (!isFocused) return false
+
         // If a task that isn't tiled is being focused, let the generic handler do the work.
         if (isTilingFocusRemoved(taskInfo)) {
             isTilingFocused = false
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt
index d44c015..d8c1a11 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModelTest.kt
@@ -24,8 +24,8 @@
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.common.DisplayController
 import com.android.wm.shell.common.SyncTransactionQueue
-import com.android.wm.shell.desktopmode.DesktopRepository
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger
+import com.android.wm.shell.desktopmode.DesktopRepository
 import com.android.wm.shell.desktopmode.DesktopTasksController
 import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask
 import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator
@@ -130,7 +130,8 @@
         )
         desktopTilingDecorViewModel.moveTaskToFrontIfTiled(task1)
 
-        verify(desktopTilingDecoration, times(1)).moveTiledPairToFront(any())
+        verify(desktopTilingDecoration, times(1))
+            .moveTiledPairToFront(any(), isTaskFocused = eq(true))
     }
 
     @Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt
index 057d8fa3..d7b971d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt
@@ -328,6 +328,37 @@
     }
 
     @Test
+    fun taskTiled_broughtToFront_taskInfoNotUpdated_bringToFront() {
+        val task1 = createFreeformTask()
+        val task2 = createFreeformTask()
+        val task3 = createFreeformTask()
+        val stableBounds = STABLE_BOUNDS_MOCK
+        whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
+            (i.arguments.first() as Rect).set(stableBounds)
+        }
+        whenever(context.resources).thenReturn(resources)
+        whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width)
+        whenever(desktopWindowDecoration.getLeash()).thenReturn(surfaceControlMock)
+        whenever(desktopRepository.isVisibleTask(any())).thenReturn(true)
+        tilingDecoration.onAppTiled(
+            task1,
+            desktopWindowDecoration,
+            DesktopTasksController.SnapPosition.RIGHT,
+            BOUNDS,
+        )
+        tilingDecoration.onAppTiled(
+            task2,
+            desktopWindowDecoration,
+            DesktopTasksController.SnapPosition.LEFT,
+            BOUNDS,
+        )
+
+        assertThat(tilingDecoration.moveTiledPairToFront(task3, isTaskFocused = true)).isFalse()
+        assertThat(tilingDecoration.moveTiledPairToFront(task1, isTaskFocused = true)).isTrue()
+        verify(transitions, times(1)).startTransition(eq(TRANSIT_TO_FRONT), any(), eq(null))
+    }
+
+    @Test
     fun taskTiledTasks_NotResized_BeforeTouchEndArrival() {
         // Setup
         val task1 = createFreeformTask()