Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskPosition.kt +24 −3 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.wm.shell.desktopmode import android.app.TaskInfo import android.content.res.Resources import android.graphics.Point import android.graphics.Rect import android.view.Gravity Loading @@ -26,6 +27,7 @@ import com.android.wm.shell.desktopmode.DesktopTaskPosition.BottomRight import com.android.wm.shell.desktopmode.DesktopTaskPosition.Center import com.android.wm.shell.desktopmode.DesktopTaskPosition.TopLeft import com.android.wm.shell.desktopmode.DesktopTaskPosition.TopRight import com.android.wm.shell.R /** * The position of a task window in desktop mode. Loading Loading @@ -122,9 +124,28 @@ fun Rect.getDesktopTaskPosition(bounds: Rect): DesktopTaskPosition { } } internal fun cascadeWindow(frame: Rect, prev: Rect, dest: Rect) { internal fun cascadeWindow(res: Resources, frame: Rect, prev: Rect, dest: Rect) { val candidateBounds = Rect(dest) val lastPos = frame.getDesktopTaskPosition(prev) val candidatePos = lastPos.next() val destCoord = candidatePos.getTopLeftCoordinates(frame, dest) var destCoord = Center.getTopLeftCoordinates(frame, candidateBounds) candidateBounds.offsetTo(destCoord.x, destCoord.y) // If the default center position is not free or if last focused window is not at the // center, get the next cascading window position. if (!prevBoundsMovedAboveThreshold(res, prev, candidateBounds) || Center != lastPos) { val nextCascadingPos = lastPos.next() destCoord = nextCascadingPos.getTopLeftCoordinates(frame, dest) } dest.offsetTo(destCoord.x, destCoord.y) } internal fun prevBoundsMovedAboveThreshold(res: Resources, prev: Rect, newBounds: Rect): Boolean { // This is the required minimum dp for a task to be touchable. val moveThresholdPx = res.getDimensionPixelSize( R.dimen.freeform_required_visible_empty_space_in_header) val leftFar = newBounds.left - prev.left > moveThresholdPx val topFar = newBounds.top - prev.top > moveThresholdPx val rightFar = prev.right - newBounds.right > moveThresholdPx val bottomFar = prev.bottom - newBounds.bottom > moveThresholdPx return leftFar || topFar || rightFar || bottomFar } libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +1 −1 Original line number Diff line number Diff line Loading @@ -1099,7 +1099,7 @@ class DesktopTasksController( .getActiveNonMinimizedOrderedTasks(taskInfo.displayId) activeTasks.firstOrNull()?.let { activeTask -> shellTaskOrganizer.getRunningTaskInfo(activeTask)?.let { cascadeWindow(stableBounds, cascadeWindow(context.resources, stableBounds, it.configuration.windowConfiguration.bounds, initialBounds) } } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +25 −2 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import com.android.internal.jank.InteractionJankMonitor import com.android.window.flags.Flags import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE import com.android.wm.shell.MockToken import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase Loading Loading @@ -724,6 +725,27 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(DesktopTaskPosition.Center) } @Test @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS) fun addMoveToDesktopChanges_defaultToCenterIfFree() { setUpLandscapeDisplay() val stableBounds = Rect() displayLayout.getStableBoundsForDesktopMode(stableBounds) val minTouchTarget = context.resources.getDimensionPixelSize( R.dimen.freeform_required_visible_empty_space_in_header) addFreeformTaskAtPosition(DesktopTaskPosition.Center, stableBounds, Rect(0, 0, 1600, 1200), Point(0, minTouchTarget + 1)) val task = setUpFullscreenTask() val wct = WindowContainerTransaction() controller.addMoveToDesktopChanges(wct, task) val finalBounds = findBoundsChange(wct, task) assertThat(stableBounds.getDesktopTaskPosition(finalBounds!!)) .isEqualTo(DesktopTaskPosition.Center) } @Test fun moveToDesktop_tdaFullscreen_windowingModeSetToFreeform() { val task = setUpFullscreenTask() Loading Loading @@ -2544,11 +2566,12 @@ class DesktopTasksControllerTest : ShellTestCase() { private fun addFreeformTaskAtPosition( pos: DesktopTaskPosition, stableBounds: Rect, bounds: Rect = DEFAULT_LANDSCAPE_BOUNDS bounds: Rect = DEFAULT_LANDSCAPE_BOUNDS, offsetPos: Point = Point(0, 0) ): RunningTaskInfo { val offset = pos.getTopLeftCoordinates(stableBounds, bounds) val prevTaskBounds = Rect(bounds) prevTaskBounds.offsetTo(offset.x, offset.y) prevTaskBounds.offsetTo(offset.x + offsetPos.x, offset.y + offsetPos.y) return setUpFreeformTask(bounds = prevTaskBounds) } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskPosition.kt +24 −3 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.wm.shell.desktopmode import android.app.TaskInfo import android.content.res.Resources import android.graphics.Point import android.graphics.Rect import android.view.Gravity Loading @@ -26,6 +27,7 @@ import com.android.wm.shell.desktopmode.DesktopTaskPosition.BottomRight import com.android.wm.shell.desktopmode.DesktopTaskPosition.Center import com.android.wm.shell.desktopmode.DesktopTaskPosition.TopLeft import com.android.wm.shell.desktopmode.DesktopTaskPosition.TopRight import com.android.wm.shell.R /** * The position of a task window in desktop mode. Loading Loading @@ -122,9 +124,28 @@ fun Rect.getDesktopTaskPosition(bounds: Rect): DesktopTaskPosition { } } internal fun cascadeWindow(frame: Rect, prev: Rect, dest: Rect) { internal fun cascadeWindow(res: Resources, frame: Rect, prev: Rect, dest: Rect) { val candidateBounds = Rect(dest) val lastPos = frame.getDesktopTaskPosition(prev) val candidatePos = lastPos.next() val destCoord = candidatePos.getTopLeftCoordinates(frame, dest) var destCoord = Center.getTopLeftCoordinates(frame, candidateBounds) candidateBounds.offsetTo(destCoord.x, destCoord.y) // If the default center position is not free or if last focused window is not at the // center, get the next cascading window position. if (!prevBoundsMovedAboveThreshold(res, prev, candidateBounds) || Center != lastPos) { val nextCascadingPos = lastPos.next() destCoord = nextCascadingPos.getTopLeftCoordinates(frame, dest) } dest.offsetTo(destCoord.x, destCoord.y) } internal fun prevBoundsMovedAboveThreshold(res: Resources, prev: Rect, newBounds: Rect): Boolean { // This is the required minimum dp for a task to be touchable. val moveThresholdPx = res.getDimensionPixelSize( R.dimen.freeform_required_visible_empty_space_in_header) val leftFar = newBounds.left - prev.left > moveThresholdPx val topFar = newBounds.top - prev.top > moveThresholdPx val rightFar = prev.right - newBounds.right > moveThresholdPx val bottomFar = prev.bottom - newBounds.bottom > moveThresholdPx return leftFar || topFar || rightFar || bottomFar }
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +1 −1 Original line number Diff line number Diff line Loading @@ -1099,7 +1099,7 @@ class DesktopTasksController( .getActiveNonMinimizedOrderedTasks(taskInfo.displayId) activeTasks.firstOrNull()?.let { activeTask -> shellTaskOrganizer.getRunningTaskInfo(activeTask)?.let { cascadeWindow(stableBounds, cascadeWindow(context.resources, stableBounds, it.configuration.windowConfiguration.bounds, initialBounds) } } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +25 −2 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import com.android.internal.jank.InteractionJankMonitor import com.android.window.flags.Flags import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE import com.android.wm.shell.MockToken import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase Loading Loading @@ -724,6 +725,27 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(DesktopTaskPosition.Center) } @Test @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS) fun addMoveToDesktopChanges_defaultToCenterIfFree() { setUpLandscapeDisplay() val stableBounds = Rect() displayLayout.getStableBoundsForDesktopMode(stableBounds) val minTouchTarget = context.resources.getDimensionPixelSize( R.dimen.freeform_required_visible_empty_space_in_header) addFreeformTaskAtPosition(DesktopTaskPosition.Center, stableBounds, Rect(0, 0, 1600, 1200), Point(0, minTouchTarget + 1)) val task = setUpFullscreenTask() val wct = WindowContainerTransaction() controller.addMoveToDesktopChanges(wct, task) val finalBounds = findBoundsChange(wct, task) assertThat(stableBounds.getDesktopTaskPosition(finalBounds!!)) .isEqualTo(DesktopTaskPosition.Center) } @Test fun moveToDesktop_tdaFullscreen_windowingModeSetToFreeform() { val task = setUpFullscreenTask() Loading Loading @@ -2544,11 +2566,12 @@ class DesktopTasksControllerTest : ShellTestCase() { private fun addFreeformTaskAtPosition( pos: DesktopTaskPosition, stableBounds: Rect, bounds: Rect = DEFAULT_LANDSCAPE_BOUNDS bounds: Rect = DEFAULT_LANDSCAPE_BOUNDS, offsetPos: Point = Point(0, 0) ): RunningTaskInfo { val offset = pos.getTopLeftCoordinates(stableBounds, bounds) val prevTaskBounds = Rect(bounds) prevTaskBounds.offsetTo(offset.x, offset.y) prevTaskBounds.offsetTo(offset.x + offsetPos.x, offset.y + offsetPos.y) return setUpFreeformTask(bounds = prevTaskBounds) } Loading