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()