summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt1
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt38
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt26
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt12
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()