Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +0 −1 Original line number Diff line number Diff line Loading @@ -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 Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +22 −16 Original line number Diff line number Diff line Loading @@ -592,9 +592,14 @@ 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) Loading Loading @@ -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, Loading Loading @@ -1409,7 +1411,7 @@ class DesktopTasksController( override fun onTransitionConsumed( transition: IBinder, aborted: Boolean, finishT: Transaction? finishT: Transaction?, ) { pendingPipTransitionAndTask?.let { (pipTransition, taskId) -> if (transition == pipTransition) { Loading Loading @@ -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) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt +20 −6 Original line number Diff line number Diff line Loading @@ -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) } Loading @@ -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 Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +12 −0 Original line number Diff line number Diff line Loading @@ -441,6 +441,18 @@ class DesktopTasksLimiterTest : ShellTestCase() { assertThat(minimizedTask).isEqualTo(tasks.last().taskId) } @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() } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +0 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +22 −16 Original line number Diff line number Diff line Loading @@ -592,9 +592,14 @@ 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) Loading Loading @@ -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, Loading Loading @@ -1409,7 +1411,7 @@ class DesktopTasksController( override fun onTransitionConsumed( transition: IBinder, aborted: Boolean, finishT: Transaction? finishT: Transaction?, ) { pendingPipTransitionAndTask?.let { (pipTransition, taskId) -> if (transition == pipTransition) { Loading Loading @@ -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) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt +20 −6 Original line number Diff line number Diff line Loading @@ -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) } Loading @@ -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 Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +12 −0 Original line number Diff line number Diff line Loading @@ -441,6 +441,18 @@ class DesktopTasksLimiterTest : ShellTestCase() { assertThat(minimizedTask).isEqualTo(tasks.last().taskId) } @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() } Loading