diff options
4 files changed, 54 insertions, 23 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt index 50187d552b09..d404634b0db0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt @@ -239,7 +239,6 @@ class DesktopMixedTransitionHandler( pending.minimizingTask?.let { minimizingTask -> findTaskChange(info, minimizingTask) } val launchChange = findDesktopTaskLaunchChange(info, pending.launchingTask) if (launchChange == null) { - check(minimizeChange == null) check(immersiveExitChange == null) logV("No launch Change, returning") return false 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 9b7c3a4d929f..609ac0aac381 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 @@ -592,10 +592,15 @@ class DesktopTasksController( val isMinimizingToPip = taskInfo.pictureInPictureParams?.isAutoEnterEnabled() ?: false // If task is going to PiP, start a PiP transition instead of a minimize transition if (isMinimizingToPip) { - val requestInfo = TransitionRequestInfo( - TRANSIT_PIP, /* triggerTask= */ null, taskInfo, /* remoteTransition= */ null, - /* displayChange= */ null, /* flags= */ 0 - ) + val requestInfo = + TransitionRequestInfo( + TRANSIT_PIP, + /* triggerTask= */ null, + taskInfo, + /* remoteTransition= */ null, + /* displayChange= */ null, + /* flags= */ 0, + ) val requestRes = transitions.dispatchRequest(Binder(), requestInfo, /* skip= */ null) wct.merge(requestRes.second, true) pendingPipTransitionAndTask = @@ -759,15 +764,12 @@ class DesktopTasksController( displayId: Int = DEFAULT_DISPLAY, ): IBinder { val taskIdToMinimize = - if (launchingTaskId != null) { - addAndGetMinimizeChanges(displayId, wct, newTaskId = launchingTaskId) - } else { - logW("Starting desktop task launch without checking the task-limit") - // TODO(b/378920066): This currently does not respect the desktop window limit. - // It's possible that |launchingTaskId| is null when launching using an intent, and - // the task-limit should be respected then too. - null - } + addAndGetMinimizeChanges( + displayId, + wct, + newTaskId = launchingTaskId, + launchingNewIntent = launchingTaskId == null, + ) val exitImmersiveResult = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, @@ -1409,7 +1411,7 @@ class DesktopTasksController( override fun onTransitionConsumed( transition: IBinder, aborted: Boolean, - finishT: Transaction? + finishT: Transaction?, ) { pendingPipTransitionAndTask?.let { (pipTransition, taskId) -> if (transition == pipTransition) { @@ -1985,10 +1987,14 @@ class DesktopTasksController( private fun addAndGetMinimizeChanges( displayId: Int, wct: WindowContainerTransaction, - newTaskId: Int, + newTaskId: Int?, + launchingNewIntent: Boolean = false, ): Int? { if (!desktopTasksLimiter.isPresent) return null - return desktopTasksLimiter.get().addAndGetMinimizeTaskChanges(displayId, wct, newTaskId) + require(newTaskId == null || !launchingNewIntent) + return desktopTasksLimiter + .get() + .addAndGetMinimizeTaskChanges(displayId, wct, newTaskId, launchingNewIntent) } private fun addPendingMinimizeTransition(transition: IBinder, taskIdToMinimize: Int) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt index 635078e68a00..45faba6e341f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt @@ -214,12 +214,17 @@ class DesktopTasksLimiter( fun addAndGetMinimizeTaskChanges( displayId: Int, wct: WindowContainerTransaction, - newFrontTaskId: Int, + newFrontTaskId: Int?, + launchingNewIntent: Boolean = false, ): Int? { logV("addAndGetMinimizeTaskChanges, newFrontTask=%d", newFrontTaskId) val taskRepository = desktopUserRepositories.current val taskIdToMinimize = - getTaskIdToMinimize(taskRepository.getExpandedTasksOrdered(displayId), newFrontTaskId) + getTaskIdToMinimize( + taskRepository.getExpandedTasksOrdered(displayId), + newFrontTaskId, + launchingNewIntent, + ) // If it's a running task, reorder it to back. taskIdToMinimize ?.let { shellTaskOrganizer.getRunningTaskInfo(it) } @@ -242,15 +247,24 @@ class DesktopTasksLimiter( * Returns the minimized task from the list of visible tasks ordered from front to back with the * new task placed in front of other tasks. */ - fun getTaskIdToMinimize(visibleOrderedTasks: List<Int>, newTaskIdInFront: Int? = null): Int? { + fun getTaskIdToMinimize( + visibleOrderedTasks: List<Int>, + newTaskIdInFront: Int? = null, + launchingNewIntent: Boolean = false, + ): Int? { return getTaskIdToMinimize( - createOrderedTaskListWithGivenTaskInFront(visibleOrderedTasks, newTaskIdInFront) + createOrderedTaskListWithGivenTaskInFront(visibleOrderedTasks, newTaskIdInFront), + launchingNewIntent, ) } /** Returns the Task to minimize given a list of visible tasks ordered from front to back. */ - private fun getTaskIdToMinimize(visibleOrderedTasks: List<Int>): Int? { - if (visibleOrderedTasks.size <= maxTasksLimit) { + private fun getTaskIdToMinimize( + visibleOrderedTasks: List<Int>, + launchingNewIntent: Boolean, + ): Int? { + val newTasksOpening = if (launchingNewIntent) 1 else 0 + if (visibleOrderedTasks.size + newTasksOpening <= maxTasksLimit) { logV("No need to minimize; tasks below limit") // No need to minimize anything return null diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt index 39178cb2cd25..1e4d108a9cda 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt @@ -442,6 +442,18 @@ class DesktopTasksLimiterTest : ShellTestCase() { } @Test + fun getTaskToMinimize_tasksAtLimit_newIntentReturnsBackTask() { + val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } + val minimizedTask = desktopTasksLimiter.getTaskIdToMinimize( + visibleOrderedTasks = tasks.map { it.taskId }, + newTaskIdInFront = null, + launchingNewIntent = true) + + // first == front, last == back + assertThat(minimizedTask).isEqualTo(tasks.last().taskId) + } + + @Test fun minimizeTransitionReadyAndFinished_logsJankInstrumentationBeginAndEnd() { (1..<MAX_TASK_LIMIT).forEach { _ -> setUpFreeformTask() } val transition = Binder() |