Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +36 −26 Original line number Diff line number Diff line Loading @@ -2599,7 +2599,7 @@ class DesktopTasksController( } val shouldRestoreToSnap = isMaximized && isTaskSnappedToHalfScreen(taskInfo, destinationBounds) isMaximized && isTaskSnappedToHalfScreen(taskInfo.displayId, destinationBounds) logD("willMaximize = %s", willMaximize) logD("shouldRestoreToSnap = %s", shouldRestoreToSnap) Loading Loading @@ -2663,21 +2663,42 @@ class DesktopTasksController( ) } private fun isMaximizedToStableBoundsEdges( taskInfo: RunningTaskInfo, stableBounds: Rect, ): Boolean { val currentTaskBounds = taskInfo.configuration.windowConfiguration.bounds return isTaskBoundsEqual(currentTaskBounds, stableBounds) private fun isMaximizedToStableBoundsEdges(displayId: Int, taskBounds: Rect): Boolean { val displayLayout = displayController.getDisplayLayout(displayId) ?: return false val stableBounds = Rect().also { displayLayout.getStableBounds(it) } return isTaskBoundsEqual(taskBounds, stableBounds) } /** Returns if current task bound is snapped to half screen */ private fun isTaskSnappedToHalfScreen( taskInfo: RunningTaskInfo, taskBounds: Rect = taskInfo.configuration.windowConfiguration.bounds, ): Boolean = getSnapBounds(taskInfo.displayId, SnapPosition.LEFT) == taskBounds || getSnapBounds(taskInfo.displayId, SnapPosition.RIGHT) == taskBounds private fun isTaskSnappedToHalfScreen(displayId: Int, taskBounds: Rect): Boolean = getSnapBounds(displayId, SnapPosition.LEFT) == taskBounds || getSnapBounds(displayId, SnapPosition.RIGHT) == taskBounds /** * Update the rounding state of the taskbar on the given display, based on the task with ID * [taskId] having bounds [newBounds]. */ fun updateTaskbarRoundingOnTaskResize(displayId: Int, taskId: Int, newBounds: Rect) { val otherTasksRequireTaskbarRounding = doesAnyTaskRequireTaskbarRounding( displayId, shellController.currentUserId, excludeTaskId = taskId, ) val resizedTaskRequiresTaskbarRounding = doesTaskRequireTaskbarRounding(displayId, newBounds) taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate( otherTasksRequireTaskbarRounding || resizedTaskRequiresTaskbarRounding ) } private fun doesTaskRequireTaskbarRounding(displayId: Int, taskBounds: Rect): Boolean { val isSnappedToHalfScreen = isTaskSnappedToHalfScreen(displayId, taskBounds) val isMaximizedToBothEdges = isMaximizedToStableBoundsEdges(displayId, taskBounds) logD("isTaskSnappedToHalfScreen(taskInfo) = %s", isSnappedToHalfScreen) logD("isMaximizedToStableBoundsEdges(taskInfo, stableBounds) = %s", isMaximizedToBothEdges) return isSnappedToHalfScreen || isMaximizedToBothEdges } @VisibleForTesting fun doesAnyTaskRequireTaskbarRounding( Loading @@ -2693,21 +2714,10 @@ class DesktopTasksController( .filterNot { taskId -> taskId == excludeTaskId } .any { taskId -> val taskInfo = shellTaskOrganizer.getRunningTaskInfo(taskId) ?: return false val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) val stableBounds = Rect().also { displayLayout?.getStableBounds(it) } logD("taskInfo = %s", taskInfo) logD( "isTaskSnappedToHalfScreen(taskInfo) = %s", isTaskSnappedToHalfScreen(taskInfo), ) logD( "isMaximizedToStableBoundsEdges(taskInfo, stableBounds) = %s", isMaximizedToStableBoundsEdges(taskInfo, stableBounds), ) isTaskSnappedToHalfScreen(taskInfo) || isMaximizedToStableBoundsEdges(taskInfo, stableBounds) val taskBounds = taskInfo.configuration.windowConfiguration.bounds doesTaskRequireTaskbarRounding(displayId, taskBounds) } logD("doesAnyTaskRequireTaskbarRounding = %s", doesAnyTaskRequireTaskbarRounding) return doesAnyTaskRequireTaskbarRounding } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +6 −3 Original line number Diff line number Diff line Loading @@ -2288,7 +2288,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mMainHandler, mMultiDisplayDragMoveIndicatorController, mShellDesktopState, mDesktopConfig); mDesktopConfig, mDesktopTasksController); windowDecoration.setTaskDragResizer(taskPositioner); final DesktopModeTouchEventListener touchEventListener = Loading Loading @@ -2632,7 +2633,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, Handler handler, MultiDisplayDragMoveIndicatorController multiDisplayDragMoveIndicatorController, DesktopState desktopState, DesktopConfig desktopConfig) { DesktopConfig desktopConfig, DesktopTasksController desktopTasksController) { final TaskPositioner taskPositioner = desktopConfig.isVeiledResizeEnabled() // TODO(b/383632995): Update when the flag is launched. ? (DesktopExperienceFlags.ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG.isTrue() Loading @@ -2644,7 +2646,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, interactionJankMonitor, handler, multiDisplayDragMoveIndicatorController, desktopState) desktopState, desktopTasksController) : new VeiledResizeTaskPositioner( taskOrganizer, windowDecoration, Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt +17 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.MultiDisplayDragMoveBoundsCalculator import com.android.wm.shell.common.MultiDisplayDragMoveIndicatorController import com.android.wm.shell.desktopmode.DesktopTasksController import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.shared.desktopmode.DesktopState import com.android.wm.shell.transition.Transitions Loading @@ -57,6 +58,7 @@ class MultiDisplayVeiledResizeTaskPositioner( @ShellMainThread private val handler: Handler, private val multiDisplayDragMoveIndicatorController: MultiDisplayDragMoveIndicatorController, private val desktopState: DesktopState, private val desktopTasksController: DesktopTasksController, ) : TaskPositioner, Transitions.TransitionHandler, DisplayController.OnDisplaysChangedListener { private val dragEventListeners = Loading @@ -76,6 +78,7 @@ class MultiDisplayVeiledResizeTaskPositioner( private var isResizingOrAnimatingResize = false @Surface.Rotation private var rotation = 0 private var startDisplayId = 0 private var hasMoved = false private val displayIds = mutableSetOf<Int>() constructor( Loading @@ -87,6 +90,7 @@ class MultiDisplayVeiledResizeTaskPositioner( @ShellMainThread handler: Handler, multiDisplayDragMoveIndicatorController: MultiDisplayDragMoveIndicatorController, desktopState: DesktopState, desktopTasksController: DesktopTasksController, ) : this( taskOrganizer, windowDecoration, Loading @@ -97,6 +101,7 @@ class MultiDisplayVeiledResizeTaskPositioner( handler, multiDisplayDragMoveIndicatorController, desktopState, desktopTasksController, ) init { Loading @@ -110,6 +115,7 @@ class MultiDisplayVeiledResizeTaskPositioner( windowDecoration.taskInfo.configuration.windowConfiguration.bounds ) repositionStartPoint[x] = y hasMoved = false if (isResizing) { // Capture CUJ for re-sizing window in DW mode. interactionJankMonitor.begin( Loading Loading @@ -219,6 +225,17 @@ class MultiDisplayVeiledResizeTaskPositioner( t.setFrameTimeline(Choreographer.getInstance().vsyncId) t.apply() } if (!hasMoved) { // Update taskbar rounding once the drag/resize has registered a move event - in case // the moved task is no longer maximized. Only call this once per resize/drag so we // don't call into Launcher with each drag/resize frame to try to update the taskbar. desktopTasksController.updateTaskbarRoundingOnTaskResize( displayId, windowDecoration.taskInfo.taskId, Rect(repositionTaskBounds), ) hasMoved = true } return Rect(repositionTaskBounds) } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt +1 −0 Original line number Diff line number Diff line Loading @@ -297,6 +297,7 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { any(), any(), any(), any(), ) ) .thenReturn(mockTaskPositioner) Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositionerTest.kt +54 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.MultiDisplayDragMoveIndicatorController import com.android.wm.shell.common.MultiDisplayTestUtil.TestDisplay import com.android.wm.shell.desktopmode.DesktopTasksController import com.android.wm.shell.shared.desktopmode.FakeDesktopState import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TransitionFinishCallback Loading Loading @@ -97,6 +98,7 @@ class MultiDisplayVeiledResizeTaskPositionerTest : ShellTestCase() { private val mockSurfaceControl = mock<SurfaceControl>() private val mockMultiDisplayDragMoveIndicatorController = mock<MultiDisplayDragMoveIndicatorController>() private val mockDesktopTasksController = mock<DesktopTasksController>() private lateinit var resources: TestableResources private lateinit var spyDisplayLayout0: DisplayLayout private lateinit var spyDisplayLayout1: DisplayLayout Loading Loading @@ -171,6 +173,7 @@ class MultiDisplayVeiledResizeTaskPositionerTest : ShellTestCase() { mainHandler, mockMultiDisplayDragMoveIndicatorController, desktopState, mockDesktopTasksController, ) } Loading Loading @@ -620,6 +623,57 @@ class MultiDisplayVeiledResizeTaskPositionerTest : ShellTestCase() { verify(spyDisplayLayout1, times(1)).getStableBounds(any()) } @Test fun testDragResize_moved_updatesTaskbarRounding() = runOnUiThread { val moveBounds = Rect(STARTING_BOUNDS) moveBounds.union(moveBounds.right + 100, moveBounds.bottom + 100) taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, DISPLAY_ID_0, STARTING_BOUNDS.right.toFloat(), STARTING_BOUNDS.bottom.toFloat(), ) taskPositioner.onDragPositioningMove( DISPLAY_ID_0, moveBounds.right.toFloat(), moveBounds.bottom.toFloat(), ) verify(mockDesktopTasksController) .updateTaskbarRoundingOnTaskResize(DISPLAY_ID_0, TASK_ID, moveBounds) } @Test fun testDragResize_movedSeveralTimes_updatesTaskbarRoundingOnce() = runOnUiThread { val firstmoveBounds = Rect(STARTING_BOUNDS) firstmoveBounds.union(firstmoveBounds.right + 100, firstmoveBounds.bottom + 100) val secondMoveBounds = Rect(firstmoveBounds) secondMoveBounds.union(secondMoveBounds.right + 100, secondMoveBounds.bottom + 100) taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, DISPLAY_ID_0, STARTING_BOUNDS.right.toFloat(), STARTING_BOUNDS.bottom.toFloat(), ) taskPositioner.onDragPositioningMove( DISPLAY_ID_0, firstmoveBounds.right.toFloat(), firstmoveBounds.bottom.toFloat(), ) taskPositioner.onDragPositioningMove( DISPLAY_ID_0, secondMoveBounds.right.toFloat() + 100, secondMoveBounds.bottom.toFloat() + 100, ) verify(mockDesktopTasksController) .updateTaskbarRoundingOnTaskResize(DISPLAY_ID_0, TASK_ID, firstmoveBounds) verify(mockDesktopTasksController, never()) .updateTaskbarRoundingOnTaskResize(DISPLAY_ID_0, TASK_ID, secondMoveBounds) } @Test fun testClose() = runOnUiThread { verify(mockDisplayController, times(1)).addDisplayWindowListener(eq(taskPositioner)) Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +36 −26 Original line number Diff line number Diff line Loading @@ -2599,7 +2599,7 @@ class DesktopTasksController( } val shouldRestoreToSnap = isMaximized && isTaskSnappedToHalfScreen(taskInfo, destinationBounds) isMaximized && isTaskSnappedToHalfScreen(taskInfo.displayId, destinationBounds) logD("willMaximize = %s", willMaximize) logD("shouldRestoreToSnap = %s", shouldRestoreToSnap) Loading Loading @@ -2663,21 +2663,42 @@ class DesktopTasksController( ) } private fun isMaximizedToStableBoundsEdges( taskInfo: RunningTaskInfo, stableBounds: Rect, ): Boolean { val currentTaskBounds = taskInfo.configuration.windowConfiguration.bounds return isTaskBoundsEqual(currentTaskBounds, stableBounds) private fun isMaximizedToStableBoundsEdges(displayId: Int, taskBounds: Rect): Boolean { val displayLayout = displayController.getDisplayLayout(displayId) ?: return false val stableBounds = Rect().also { displayLayout.getStableBounds(it) } return isTaskBoundsEqual(taskBounds, stableBounds) } /** Returns if current task bound is snapped to half screen */ private fun isTaskSnappedToHalfScreen( taskInfo: RunningTaskInfo, taskBounds: Rect = taskInfo.configuration.windowConfiguration.bounds, ): Boolean = getSnapBounds(taskInfo.displayId, SnapPosition.LEFT) == taskBounds || getSnapBounds(taskInfo.displayId, SnapPosition.RIGHT) == taskBounds private fun isTaskSnappedToHalfScreen(displayId: Int, taskBounds: Rect): Boolean = getSnapBounds(displayId, SnapPosition.LEFT) == taskBounds || getSnapBounds(displayId, SnapPosition.RIGHT) == taskBounds /** * Update the rounding state of the taskbar on the given display, based on the task with ID * [taskId] having bounds [newBounds]. */ fun updateTaskbarRoundingOnTaskResize(displayId: Int, taskId: Int, newBounds: Rect) { val otherTasksRequireTaskbarRounding = doesAnyTaskRequireTaskbarRounding( displayId, shellController.currentUserId, excludeTaskId = taskId, ) val resizedTaskRequiresTaskbarRounding = doesTaskRequireTaskbarRounding(displayId, newBounds) taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate( otherTasksRequireTaskbarRounding || resizedTaskRequiresTaskbarRounding ) } private fun doesTaskRequireTaskbarRounding(displayId: Int, taskBounds: Rect): Boolean { val isSnappedToHalfScreen = isTaskSnappedToHalfScreen(displayId, taskBounds) val isMaximizedToBothEdges = isMaximizedToStableBoundsEdges(displayId, taskBounds) logD("isTaskSnappedToHalfScreen(taskInfo) = %s", isSnappedToHalfScreen) logD("isMaximizedToStableBoundsEdges(taskInfo, stableBounds) = %s", isMaximizedToBothEdges) return isSnappedToHalfScreen || isMaximizedToBothEdges } @VisibleForTesting fun doesAnyTaskRequireTaskbarRounding( Loading @@ -2693,21 +2714,10 @@ class DesktopTasksController( .filterNot { taskId -> taskId == excludeTaskId } .any { taskId -> val taskInfo = shellTaskOrganizer.getRunningTaskInfo(taskId) ?: return false val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) val stableBounds = Rect().also { displayLayout?.getStableBounds(it) } logD("taskInfo = %s", taskInfo) logD( "isTaskSnappedToHalfScreen(taskInfo) = %s", isTaskSnappedToHalfScreen(taskInfo), ) logD( "isMaximizedToStableBoundsEdges(taskInfo, stableBounds) = %s", isMaximizedToStableBoundsEdges(taskInfo, stableBounds), ) isTaskSnappedToHalfScreen(taskInfo) || isMaximizedToStableBoundsEdges(taskInfo, stableBounds) val taskBounds = taskInfo.configuration.windowConfiguration.bounds doesTaskRequireTaskbarRounding(displayId, taskBounds) } logD("doesAnyTaskRequireTaskbarRounding = %s", doesAnyTaskRequireTaskbarRounding) return doesAnyTaskRequireTaskbarRounding } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +6 −3 Original line number Diff line number Diff line Loading @@ -2288,7 +2288,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mMainHandler, mMultiDisplayDragMoveIndicatorController, mShellDesktopState, mDesktopConfig); mDesktopConfig, mDesktopTasksController); windowDecoration.setTaskDragResizer(taskPositioner); final DesktopModeTouchEventListener touchEventListener = Loading Loading @@ -2632,7 +2633,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, Handler handler, MultiDisplayDragMoveIndicatorController multiDisplayDragMoveIndicatorController, DesktopState desktopState, DesktopConfig desktopConfig) { DesktopConfig desktopConfig, DesktopTasksController desktopTasksController) { final TaskPositioner taskPositioner = desktopConfig.isVeiledResizeEnabled() // TODO(b/383632995): Update when the flag is launched. ? (DesktopExperienceFlags.ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG.isTrue() Loading @@ -2644,7 +2646,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, interactionJankMonitor, handler, multiDisplayDragMoveIndicatorController, desktopState) desktopState, desktopTasksController) : new VeiledResizeTaskPositioner( taskOrganizer, windowDecoration, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt +17 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.MultiDisplayDragMoveBoundsCalculator import com.android.wm.shell.common.MultiDisplayDragMoveIndicatorController import com.android.wm.shell.desktopmode.DesktopTasksController import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.shared.desktopmode.DesktopState import com.android.wm.shell.transition.Transitions Loading @@ -57,6 +58,7 @@ class MultiDisplayVeiledResizeTaskPositioner( @ShellMainThread private val handler: Handler, private val multiDisplayDragMoveIndicatorController: MultiDisplayDragMoveIndicatorController, private val desktopState: DesktopState, private val desktopTasksController: DesktopTasksController, ) : TaskPositioner, Transitions.TransitionHandler, DisplayController.OnDisplaysChangedListener { private val dragEventListeners = Loading @@ -76,6 +78,7 @@ class MultiDisplayVeiledResizeTaskPositioner( private var isResizingOrAnimatingResize = false @Surface.Rotation private var rotation = 0 private var startDisplayId = 0 private var hasMoved = false private val displayIds = mutableSetOf<Int>() constructor( Loading @@ -87,6 +90,7 @@ class MultiDisplayVeiledResizeTaskPositioner( @ShellMainThread handler: Handler, multiDisplayDragMoveIndicatorController: MultiDisplayDragMoveIndicatorController, desktopState: DesktopState, desktopTasksController: DesktopTasksController, ) : this( taskOrganizer, windowDecoration, Loading @@ -97,6 +101,7 @@ class MultiDisplayVeiledResizeTaskPositioner( handler, multiDisplayDragMoveIndicatorController, desktopState, desktopTasksController, ) init { Loading @@ -110,6 +115,7 @@ class MultiDisplayVeiledResizeTaskPositioner( windowDecoration.taskInfo.configuration.windowConfiguration.bounds ) repositionStartPoint[x] = y hasMoved = false if (isResizing) { // Capture CUJ for re-sizing window in DW mode. interactionJankMonitor.begin( Loading Loading @@ -219,6 +225,17 @@ class MultiDisplayVeiledResizeTaskPositioner( t.setFrameTimeline(Choreographer.getInstance().vsyncId) t.apply() } if (!hasMoved) { // Update taskbar rounding once the drag/resize has registered a move event - in case // the moved task is no longer maximized. Only call this once per resize/drag so we // don't call into Launcher with each drag/resize frame to try to update the taskbar. desktopTasksController.updateTaskbarRoundingOnTaskResize( displayId, windowDecoration.taskInfo.taskId, Rect(repositionTaskBounds), ) hasMoved = true } return Rect(repositionTaskBounds) } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt +1 −0 Original line number Diff line number Diff line Loading @@ -297,6 +297,7 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() { any(), any(), any(), any(), ) ) .thenReturn(mockTaskPositioner) Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositionerTest.kt +54 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.MultiDisplayDragMoveIndicatorController import com.android.wm.shell.common.MultiDisplayTestUtil.TestDisplay import com.android.wm.shell.desktopmode.DesktopTasksController import com.android.wm.shell.shared.desktopmode.FakeDesktopState import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TransitionFinishCallback Loading Loading @@ -97,6 +98,7 @@ class MultiDisplayVeiledResizeTaskPositionerTest : ShellTestCase() { private val mockSurfaceControl = mock<SurfaceControl>() private val mockMultiDisplayDragMoveIndicatorController = mock<MultiDisplayDragMoveIndicatorController>() private val mockDesktopTasksController = mock<DesktopTasksController>() private lateinit var resources: TestableResources private lateinit var spyDisplayLayout0: DisplayLayout private lateinit var spyDisplayLayout1: DisplayLayout Loading Loading @@ -171,6 +173,7 @@ class MultiDisplayVeiledResizeTaskPositionerTest : ShellTestCase() { mainHandler, mockMultiDisplayDragMoveIndicatorController, desktopState, mockDesktopTasksController, ) } Loading Loading @@ -620,6 +623,57 @@ class MultiDisplayVeiledResizeTaskPositionerTest : ShellTestCase() { verify(spyDisplayLayout1, times(1)).getStableBounds(any()) } @Test fun testDragResize_moved_updatesTaskbarRounding() = runOnUiThread { val moveBounds = Rect(STARTING_BOUNDS) moveBounds.union(moveBounds.right + 100, moveBounds.bottom + 100) taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, DISPLAY_ID_0, STARTING_BOUNDS.right.toFloat(), STARTING_BOUNDS.bottom.toFloat(), ) taskPositioner.onDragPositioningMove( DISPLAY_ID_0, moveBounds.right.toFloat(), moveBounds.bottom.toFloat(), ) verify(mockDesktopTasksController) .updateTaskbarRoundingOnTaskResize(DISPLAY_ID_0, TASK_ID, moveBounds) } @Test fun testDragResize_movedSeveralTimes_updatesTaskbarRoundingOnce() = runOnUiThread { val firstmoveBounds = Rect(STARTING_BOUNDS) firstmoveBounds.union(firstmoveBounds.right + 100, firstmoveBounds.bottom + 100) val secondMoveBounds = Rect(firstmoveBounds) secondMoveBounds.union(secondMoveBounds.right + 100, secondMoveBounds.bottom + 100) taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, DISPLAY_ID_0, STARTING_BOUNDS.right.toFloat(), STARTING_BOUNDS.bottom.toFloat(), ) taskPositioner.onDragPositioningMove( DISPLAY_ID_0, firstmoveBounds.right.toFloat(), firstmoveBounds.bottom.toFloat(), ) taskPositioner.onDragPositioningMove( DISPLAY_ID_0, secondMoveBounds.right.toFloat() + 100, secondMoveBounds.bottom.toFloat() + 100, ) verify(mockDesktopTasksController) .updateTaskbarRoundingOnTaskResize(DISPLAY_ID_0, TASK_ID, firstmoveBounds) verify(mockDesktopTasksController, never()) .updateTaskbarRoundingOnTaskResize(DISPLAY_ID_0, TASK_ID, secondMoveBounds) } @Test fun testClose() = runOnUiThread { verify(mockDisplayController, times(1)).addDisplayWindowListener(eq(taskPositioner)) Loading