diff options
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt | 34 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl | 3 | 
2 files changed, 27 insertions, 10 deletions
| diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 57a59c946f98..b723337cc894 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -659,6 +659,7 @@ class DesktopTasksController(          }          val wct = WindowContainerTransaction() +        if (!task.isFreeform) addMoveToDesktopChanges(wct, task, displayId)          wct.reparent(task.token, displayAreaInfo.token, true /* onTop */)          transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) @@ -1245,7 +1246,7 @@ class DesktopTasksController(          val bounds = when (newTaskWindowingMode) {              WINDOWING_MODE_FREEFORM -> {                  displayController.getDisplayLayout(callingTask.displayId) -                    ?.let { getInitialBounds(it, callingTask) } +                    ?.let { getInitialBounds(it, callingTask, callingTask.displayId) }              }              WINDOWING_MODE_MULTI_WINDOW -> {                  Rect() @@ -1311,7 +1312,7 @@ class DesktopTasksController(              val displayLayout = displayController.getDisplayLayout(task.displayId)              if (displayLayout != null) {                  val initialBounds = Rect(task.configuration.windowConfiguration.bounds) -                cascadeWindow(task, initialBounds, displayLayout) +                cascadeWindow(initialBounds, displayLayout, task.displayId)                  wct.setBounds(task.token, initialBounds)              }          } @@ -1399,13 +1400,19 @@ class DesktopTasksController(          return if (wct.isEmpty) null else wct      } +    /** +     * Apply all changes required when task is first added to desktop. Uses the task's current +     * display by default to apply initial bounds and placement relative to the display. +     * Use a different [displayId] if the task should be moved to a different display. +     */      @VisibleForTesting      fun addMoveToDesktopChanges(          wct: WindowContainerTransaction, -        taskInfo: RunningTaskInfo +        taskInfo: RunningTaskInfo, +        displayId: Int = taskInfo.displayId,      ) { -        val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return -        val tdaInfo = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(taskInfo.displayId)!! +        val displayLayout = displayController.getDisplayLayout(displayId) ?: return +        val tdaInfo = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(displayId)!!          val tdaWindowingMode = tdaInfo.configuration.windowConfiguration.windowingMode          val targetWindowingMode =              if (tdaWindowingMode == WINDOWING_MODE_FREEFORM) { @@ -1414,7 +1421,7 @@ class DesktopTasksController(              } else {                  WINDOWING_MODE_FREEFORM              } -        val initialBounds = getInitialBounds(displayLayout, taskInfo) +        val initialBounds = getInitialBounds(displayLayout, taskInfo, displayId)          if (canChangeTaskPosition(taskInfo)) {              wct.setBounds(taskInfo.token, initialBounds) @@ -1428,7 +1435,8 @@ class DesktopTasksController(      private fun getInitialBounds(          displayLayout: DisplayLayout, -        taskInfo: RunningTaskInfo +        taskInfo: RunningTaskInfo, +        displayId: Int,      ): Rect {          val bounds = if (ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS.isTrue) {              calculateInitialBounds(displayLayout, taskInfo) @@ -1437,7 +1445,7 @@ class DesktopTasksController(          }          if (DesktopModeFlags.ENABLE_CASCADING_WINDOWS.isTrue) { -            cascadeWindow(taskInfo, bounds, displayLayout) +            cascadeWindow(bounds, displayLayout, displayId)          }          return bounds      } @@ -1466,11 +1474,11 @@ class DesktopTasksController(          }      } -    private fun cascadeWindow(task: TaskInfo, bounds: Rect, displayLayout: DisplayLayout) { +    private fun cascadeWindow(bounds: Rect, displayLayout: DisplayLayout, displayId: Int) {          val stableBounds = Rect()          displayLayout.getStableBoundsForDesktopMode(stableBounds) -        val activeTasks = taskRepository.getActiveNonMinimizedOrderedTasks(task.displayId) +        val activeTasks = taskRepository.getActiveNonMinimizedOrderedTasks(displayId)          activeTasks.firstOrNull()?.let { activeTask ->              shellTaskOrganizer.getRunningTaskInfo(activeTask)?.let {                  cascadeWindow(context.resources, stableBounds, @@ -2069,6 +2077,12 @@ class DesktopTasksController(                  c.removeDesktop(displayId)              }          } + +        override fun moveToExternalDisplay(taskId: Int) { +            executeRemoteCallWithTaskPermission(controller, "moveTaskToExternalDisplay") { c -> +                c.moveToNextDisplay(taskId) +            } +        }      }      private fun logV(msg: String, vararg arguments: Any?) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl index 86351e364cdd..c27813de5358 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl @@ -52,4 +52,7 @@ interface IDesktopMode {      /** Remove desktop on the given display */      oneway void removeDesktop(int displayId); + +    /** Move a task with given `taskId` to external display */ +    void moveToExternalDisplay(int taskId);  }
\ No newline at end of file |