diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java index 9f79d212a7b9d..9082323452c98 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java @@ -73,6 +73,11 @@ class FluidResizeTaskPositioner implements DragPositioningCallback { mWindowDecoration.mTaskInfo.configuration.windowConfiguration.getBounds()); mRepositionStartPoint.set(x, y); mDragStartListener.onDragStart(mWindowDecoration.mTaskInfo.taskId); + if (mCtrlType != CTRL_TYPE_UNDEFINED && !mWindowDecoration.mTaskInfo.isFocused) { + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.reorder(mWindowDecoration.mTaskInfo.token, true); + mTaskOrganizer.applyTransaction(wct); + } mRepositionTaskBounds.set(mTaskBoundsAtDragStart); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java index 5253fb84a4be1..3a3ac4ca7d0c4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java @@ -78,6 +78,11 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mRepositionStartPoint.set(x, y); if (isResizing()) { mDesktopWindowDecoration.showResizeVeil(); + if (!mDesktopWindowDecoration.mTaskInfo.isFocused) { + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.reorder(mDesktopWindowDecoration.mTaskInfo.token, true); + mTaskOrganizer.applyTransaction(wct); + } } mHasDragResized = false; mDragStartListener.onDragStart(mDesktopWindowDecoration.mTaskInfo.taskId); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt index 282a19e8e9a5f..69604ddf0af12 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt @@ -565,6 +565,55 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { bounds == configuration.windowConfiguration.bounds } + @Test + fun testDragResize_resize_resizingTaskReorderedToTopWhenNotFocused() { + mockWindowDecoration.mTaskInfo.isFocused = false + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT, // Resize right + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Verify task is reordered to top + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.hierarchyOps.any { hierarchyOps -> + hierarchyOps.container == taskBinder && hierarchyOps.toTop } + }) + } + + @Test + fun testDragResize_resize_resizingTaskNotReorderedToTopWhenFocused() { + mockWindowDecoration.mTaskInfo.isFocused = true + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT, // Resize right + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Verify task is not reordered to top + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.hierarchyOps.any { hierarchyOps -> + hierarchyOps.container == taskBinder && hierarchyOps.toTop } + }) + } + + @Test + fun testDragResize_drag_draggedTaskNotReorderedToTop() { + mockWindowDecoration.mTaskInfo.isFocused = false + taskPositioner.onDragPositioningStart( + CTRL_TYPE_UNDEFINED, // drag + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Verify task is not reordered to top since task is already brought to top before dragging + // begins + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.hierarchyOps.any { hierarchyOps -> + hierarchyOps.container == taskBinder && hierarchyOps.toTop } + }) + } + companion object { private const val TASK_ID = 5 private const val MIN_WIDTH = 10 diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt index 217bdbb07447f..445a73a2ad384 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt @@ -271,6 +271,55 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { }) } + @Test + fun testDragResize_resize_resizingTaskReorderedToTopWhenNotFocused() { + mockDesktopWindowDecoration.mTaskInfo.isFocused = false + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT, // Resize right + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Verify task is reordered to top + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.hierarchyOps.any { hierarchyOps -> + hierarchyOps.container == taskBinder && hierarchyOps.toTop } + }) + } + + @Test + fun testDragResize_resize_resizingTaskNotReorderedToTopWhenFocused() { + mockDesktopWindowDecoration.mTaskInfo.isFocused = true + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT, // Resize right + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Verify task is not reordered to top + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.hierarchyOps.any { hierarchyOps -> + hierarchyOps.container == taskBinder && hierarchyOps.toTop } + }) + } + + @Test + fun testDragResize_drag_draggedTaskNotReorderedToTop() { + mockDesktopWindowDecoration.mTaskInfo.isFocused = false + taskPositioner.onDragPositioningStart( + CTRL_TYPE_UNDEFINED, // drag + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Verify task is not reordered to top since task is already brought to top before dragging + // begins + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.hierarchyOps.any { hierarchyOps -> + hierarchyOps.container == taskBinder && hierarchyOps.toTop } + }) + } + companion object { private const val TASK_ID = 5 private const val MIN_WIDTH = 10