Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt +22 −3 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ class DesktopTilingWindowDecoration( when (snapPosition) { SnapPosition.LEFT -> desktopUserRepositories.current.addLeftTiledTaskToDesk(displayId, taskId, deskId) SnapPosition.RIGHT -> desktopUserRepositories.current.addRightTiledTaskToDesk(displayId, taskId, deskId) } Loading Loading @@ -225,10 +226,26 @@ class DesktopTilingWindowDecoration( } } private fun abandonTilingSession() { rightTaskResizingHelper?.taskInfo?.let { removeTaskIfTiled(taskId = it.taskId, taskVanished = true, shouldDelayUpdate = true) } leftTaskResizingHelper?.taskInfo?.let { removeTaskIfTiled(taskId = it.taskId, taskVanished = true, shouldDelayUpdate = true) } } private fun initTilingForDisplayIfNeeded(config: Configuration, firstTiledApp: Boolean) { if (leftTaskResizingHelper != null && rightTaskResizingHelper != null) { if (!isTilingManagerInitialised) { desktopTilingDividerWindowManager = initTilingManagerForDisplay(displayId, config) if (desktopTilingDividerWindowManager == null) { logE( "Could not initialise the tiling divider window manager, abandoning tiling session" ) abandonTilingSession() return } isTilingManagerInitialised = true if (DesktopExperienceFlags.ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS.isTrue) { Loading Loading @@ -284,8 +301,7 @@ class DesktopTilingWindowDecoration( ) } // a leash to present the divider on top of, without re-parenting. val relativeLeash = leftTaskResizingHelper?.windowDecoration?.taskSurface ?: return tilingManager val relativeLeash = leftTaskResizingHelper?.windowDecoration?.taskSurface ?: return null tilingManager?.generateViewHost(relativeLeash) return tilingManager } Loading Loading @@ -805,7 +821,6 @@ class DesktopTilingWindowDecoration( */ fun moveTiledPairToFront(taskId: Int, isFocusedOnDisplay: Boolean): Boolean { if (!isTilingManagerInitialised) return false if (!isFocusedOnDisplay) return false // If a task that isn't tiled is being focused, let the generic handler do the work. Loading Loading @@ -961,4 +976,8 @@ class DesktopTilingWindowDecoration( private fun logV(msg: String, vararg arguments: Any?) { ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } private fun logE(msg: String, vararg arguments: Any?) { ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } } libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt +16 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.view.WindowManager.TRANSIT_TO_FRONT import android.window.TransitionInfo import android.window.TransitionInfo.Change import android.window.WindowContainerTransaction import androidx.test.annotation.UiThreadTest import androidx.test.filters.SmallTest import com.android.internal.jank.InteractionJankMonitor import com.android.wm.shell.RootTaskDisplayAreaOrganizer Loading Loading @@ -319,11 +320,13 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_alreadyInFrontStillReorder() { val task1 = createVisibleTask() val task2 = createVisibleTask() val stableBounds = STABLE_BOUNDS_MOCK whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(stableBounds) } Loading @@ -331,6 +334,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(userRepositories.current.isVisibleTask(eq(task1.taskId))).thenReturn(true) whenever(userRepositories.current.isVisibleTask(eq(task2.taskId))).thenReturn(true) whenever(windowDecoration.taskSurface).thenReturn(mock()) tilingDecoration.onAppTiled( task1, Loading Loading @@ -362,11 +366,13 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_uponTilingFocusedTasks() { val task1 = createVisibleTask() val task2 = createVisibleTask() val stableBounds = STABLE_BOUNDS_MOCK whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(stableBounds) } Loading @@ -374,6 +380,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(userRepositories.current.isVisibleTask(eq(task1.taskId))).thenReturn(true) whenever(userRepositories.current.isVisibleTask(eq(task2.taskId))).thenReturn(true) whenever(windowDecoration.taskSurface).thenReturn(mock()) task1.isFocused = true task2.isFocused = true Loading @@ -399,6 +406,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_bringToFront() { val task1 = createVisibleTask() val task2 = createVisibleTask() Loading @@ -411,6 +419,8 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(windowDecoration.taskSurface).thenReturn(surfaceControlMock) whenever(userRepositories.current.isVisibleTask(any())).thenReturn(true) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) tilingDecoration.onAppTiled( task1, windowDecoration, Loading @@ -437,6 +447,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_taskInfoNotUpdated_bringToFront() { val task1 = createVisibleTask() val task2 = createVisibleTask() Loading @@ -449,6 +460,11 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(windowDecoration.taskSurface).thenReturn(surfaceControlMock) whenever(userRepositories.current.isVisibleTask(any())).thenReturn(true) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(stableBounds) } tilingDecoration.onAppTiled( task1, windowDecoration, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecoration.kt +22 −3 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ class DesktopTilingWindowDecoration( when (snapPosition) { SnapPosition.LEFT -> desktopUserRepositories.current.addLeftTiledTaskToDesk(displayId, taskId, deskId) SnapPosition.RIGHT -> desktopUserRepositories.current.addRightTiledTaskToDesk(displayId, taskId, deskId) } Loading Loading @@ -225,10 +226,26 @@ class DesktopTilingWindowDecoration( } } private fun abandonTilingSession() { rightTaskResizingHelper?.taskInfo?.let { removeTaskIfTiled(taskId = it.taskId, taskVanished = true, shouldDelayUpdate = true) } leftTaskResizingHelper?.taskInfo?.let { removeTaskIfTiled(taskId = it.taskId, taskVanished = true, shouldDelayUpdate = true) } } private fun initTilingForDisplayIfNeeded(config: Configuration, firstTiledApp: Boolean) { if (leftTaskResizingHelper != null && rightTaskResizingHelper != null) { if (!isTilingManagerInitialised) { desktopTilingDividerWindowManager = initTilingManagerForDisplay(displayId, config) if (desktopTilingDividerWindowManager == null) { logE( "Could not initialise the tiling divider window manager, abandoning tiling session" ) abandonTilingSession() return } isTilingManagerInitialised = true if (DesktopExperienceFlags.ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS.isTrue) { Loading Loading @@ -284,8 +301,7 @@ class DesktopTilingWindowDecoration( ) } // a leash to present the divider on top of, without re-parenting. val relativeLeash = leftTaskResizingHelper?.windowDecoration?.taskSurface ?: return tilingManager val relativeLeash = leftTaskResizingHelper?.windowDecoration?.taskSurface ?: return null tilingManager?.generateViewHost(relativeLeash) return tilingManager } Loading Loading @@ -805,7 +821,6 @@ class DesktopTilingWindowDecoration( */ fun moveTiledPairToFront(taskId: Int, isFocusedOnDisplay: Boolean): Boolean { if (!isTilingManagerInitialised) return false if (!isFocusedOnDisplay) return false // If a task that isn't tiled is being focused, let the generic handler do the work. Loading Loading @@ -961,4 +976,8 @@ class DesktopTilingWindowDecoration( private fun logV(msg: String, vararg arguments: Any?) { ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } private fun logE(msg: String, vararg arguments: Any?) { ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } }
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingWindowDecorationTest.kt +16 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.view.WindowManager.TRANSIT_TO_FRONT import android.window.TransitionInfo import android.window.TransitionInfo.Change import android.window.WindowContainerTransaction import androidx.test.annotation.UiThreadTest import androidx.test.filters.SmallTest import com.android.internal.jank.InteractionJankMonitor import com.android.wm.shell.RootTaskDisplayAreaOrganizer Loading Loading @@ -319,11 +320,13 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_alreadyInFrontStillReorder() { val task1 = createVisibleTask() val task2 = createVisibleTask() val stableBounds = STABLE_BOUNDS_MOCK whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(stableBounds) } Loading @@ -331,6 +334,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(userRepositories.current.isVisibleTask(eq(task1.taskId))).thenReturn(true) whenever(userRepositories.current.isVisibleTask(eq(task2.taskId))).thenReturn(true) whenever(windowDecoration.taskSurface).thenReturn(mock()) tilingDecoration.onAppTiled( task1, Loading Loading @@ -362,11 +366,13 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_uponTilingFocusedTasks() { val task1 = createVisibleTask() val task2 = createVisibleTask() val stableBounds = STABLE_BOUNDS_MOCK whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(stableBounds) } Loading @@ -374,6 +380,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(userRepositories.current.isVisibleTask(eq(task1.taskId))).thenReturn(true) whenever(userRepositories.current.isVisibleTask(eq(task2.taskId))).thenReturn(true) whenever(windowDecoration.taskSurface).thenReturn(mock()) task1.isFocused = true task2.isFocused = true Loading @@ -399,6 +406,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_bringToFront() { val task1 = createVisibleTask() val task2 = createVisibleTask() Loading @@ -411,6 +419,8 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(windowDecoration.taskSurface).thenReturn(surfaceControlMock) whenever(userRepositories.current.isVisibleTask(any())).thenReturn(true) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) tilingDecoration.onAppTiled( task1, windowDecoration, Loading @@ -437,6 +447,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { } @Test @UiThreadTest fun taskTiled_broughtToFront_taskInfoNotUpdated_bringToFront() { val task1 = createVisibleTask() val task2 = createVisibleTask() Loading @@ -449,6 +460,11 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() { whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width) whenever(windowDecoration.taskSurface).thenReturn(surfaceControlMock) whenever(userRepositories.current.isVisibleTask(any())).thenReturn(true) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout) whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(stableBounds) } tilingDecoration.onAppTiled( task1, windowDecoration, Loading