Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +61 −27 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.ActivityManager.RunningTaskInfo import android.app.ActivityOptions import android.app.KeyguardManager import android.app.PendingIntent import android.app.TaskInfo import android.app.WindowConfiguration.ACTIVITY_TYPE_HOME import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM Loading Loading @@ -520,7 +521,8 @@ class DesktopTasksController( return false } logV("moveBackgroundTaskToDesktop with taskId=%d", taskId) val taskIdToMinimize = bringDesktopAppsToFront(task.displayId, wct, taskId) val deskId = getDefaultDeskId(task.displayId) val runOnTransitStart = addDeskActivationChanges(deskId, wct, task) val exitResult = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, Loading Loading @@ -549,9 +551,7 @@ class DesktopTasksController( desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT) } runOnTransitStart?.invoke(transition) exitResult.asExit()?.runOnTransitionStart?.invoke(transition) return true } Loading Loading @@ -1626,7 +1626,10 @@ class DesktopTasksController( } } @Deprecated("Use activeDesk() instead.", ReplaceWith("activateDesk()")) @Deprecated( "Use addDeskActivationChanges() instead.", ReplaceWith("addDeskActivationChanges()"), ) private fun bringDesktopAppsToFront( displayId: Int, wct: WindowContainerTransaction, Loading Loading @@ -2240,7 +2243,9 @@ class DesktopTasksController( runOnTransitStart?.invoke(transition) return wct } bringDesktopAppsToFront(task.displayId, wct, task.taskId) val deskId = getDefaultDeskId(task.displayId) val runOnTransitStart = addDeskActivationChanges(deskId, wct, task) runOnTransitStart?.invoke(transition) wct.reorder(task.token, true) return wct } Loading Loading @@ -2303,25 +2308,42 @@ class DesktopTasksController( return WindowContainerTransaction().also { wct -> val deskId = getDefaultDeskId(task.displayId) addMoveToDeskTaskChanges(wct = wct, task = task, deskId = deskId) // In some launches home task is moved behind new task being launched. Make sure // that's not the case for launches in desktop. Also, if this launch is the first // one to trigger the desktop mode (e.g., when [forceEnterDesktop()]), activate the // desktop mode here. val runOnTransitStart: RunOnTransitStart? = if ( task.baseIntent.flags.and(Intent.FLAG_ACTIVITY_TASK_ON_HOME) != 0 || !isDesktopModeShowing(task.displayId) ) { bringDesktopAppsToFront(task.displayId, wct, task.taskId) // In some launches home task is moved behind new task being launched. Make // sure that's not the case for launches in desktop. Also, if this launch is // the first one to trigger the desktop mode (e.g., when // [forceEnterDesktop()]), activate the desk here. val activationRunnable = addDeskActivationChanges( deskId = deskId, wct = wct, newTask = task, addPendingLaunchTransition = true, ) wct.reorder(task.token, true) activationRunnable } else { { transition: IBinder -> // The desk was already showing and we're launching a new Task - we // might need to minimize another Task. val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId) taskIdToMinimize?.let { minimizingTaskId -> addPendingMinimizeTransition( transition, minimizingTaskId, MinimizeReason.TASK_LIMIT, ) } // Desktop Mode is already showing and we're launching a new Task - we might need to // minimize another Task. val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId) taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT) } // Also track the pending launching task. addPendingAppLaunchTransition(transition, task.taskId, taskIdToMinimize) } } runOnTransitStart?.invoke(transition) desktopImmersiveController.exitImmersiveIfApplicable( transition, wct, Loading Loading @@ -2716,11 +2738,20 @@ class DesktopTasksController( activateDesk(deskId, remoteTransition) } /** Activates the given desk but without starting a transition. */ /** * Applies the necessary [wct] changes to activate the given desk. * * When a task is being brought into a desk together with the activation, then [newTask] is not * null and may be used to run other desktop policies, such as minimizing another task if the * task limit has been exceeded. */ fun addDeskActivationChanges( deskId: Int, wct: WindowContainerTransaction, newTask: RunningTaskInfo? = null, newTask: TaskInfo? = null, // TODO: b/362720497 - should this be true in other places? Can it be calculated locally // without having to specify the value? addPendingLaunchTransition: Boolean = false, ): RunOnTransitStart? { logV("addDeskActivationChanges newTaskId=%d deskId=%d", newTask?.taskId, deskId) val newTaskIdInFront = newTask?.taskId Loading @@ -2735,6 +2766,9 @@ class DesktopTasksController( minimizeReason = MinimizeReason.TASK_LIMIT, ) } if (newTask != null && addPendingLaunchTransition) { addPendingAppLaunchTransition(transition, newTask.taskId, taskIdToMinimize) } } } prepareForDeskActivation(displayId, wct) Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +16 −4 Original line number Diff line number Diff line Loading @@ -3524,9 +3524,15 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val wct = controller.handleRequest(Binder(), createTransition(fullscreenTask)) // Make sure we reorder the new task to top, and the back task to the bottom assertThat(wct!!.hierarchyOps.size).isEqualTo(9) assertThat(wct!!.hierarchyOps.size).isEqualTo(8) wct.assertReorderAt(0, fullscreenTask, toTop = true) wct.assertReorderAt(8, freeformTasks[0], toTop = false) // Oldest task that needs to minimized is never reordered to top over Home. val taskToMinimize = freeformTasks[0] wct.assertWithoutHop { hop -> hop.container == taskToMinimize.token && hop.type == HIERARCHY_OP_TYPE_REORDER && hop.toTop == true } } @Test Loading @@ -3541,12 +3547,18 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val wct = controller.handleRequest(Binder(), createTransition(fullscreenTask)) assertThat(wct!!.hierarchyOps.size).isEqualTo(10) assertThat(wct!!.hierarchyOps.size).isEqualTo(9) wct.assertReorderAt(0, fullscreenTask, toTop = true) // Make sure we reorder the home task to the top, desktop tasks to top of them and minimized // task is under the home task. wct.assertReorderAt(1, homeTask, toTop = true) wct.assertReorderAt(9, freeformTasks[0], toTop = false) // Oldest task that needs to minimized is never reordered to top over Home. val taskToMinimize = freeformTasks[0] wct.assertWithoutHop { hop -> hop.container == taskToMinimize.token && hop.type == HIERARCHY_OP_TYPE_REORDER && hop.toTop == true } } @Test Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +61 −27 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.ActivityManager.RunningTaskInfo import android.app.ActivityOptions import android.app.KeyguardManager import android.app.PendingIntent import android.app.TaskInfo import android.app.WindowConfiguration.ACTIVITY_TYPE_HOME import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM Loading Loading @@ -520,7 +521,8 @@ class DesktopTasksController( return false } logV("moveBackgroundTaskToDesktop with taskId=%d", taskId) val taskIdToMinimize = bringDesktopAppsToFront(task.displayId, wct, taskId) val deskId = getDefaultDeskId(task.displayId) val runOnTransitStart = addDeskActivationChanges(deskId, wct, task) val exitResult = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, Loading Loading @@ -549,9 +551,7 @@ class DesktopTasksController( desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION ) taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT) } runOnTransitStart?.invoke(transition) exitResult.asExit()?.runOnTransitionStart?.invoke(transition) return true } Loading Loading @@ -1626,7 +1626,10 @@ class DesktopTasksController( } } @Deprecated("Use activeDesk() instead.", ReplaceWith("activateDesk()")) @Deprecated( "Use addDeskActivationChanges() instead.", ReplaceWith("addDeskActivationChanges()"), ) private fun bringDesktopAppsToFront( displayId: Int, wct: WindowContainerTransaction, Loading Loading @@ -2240,7 +2243,9 @@ class DesktopTasksController( runOnTransitStart?.invoke(transition) return wct } bringDesktopAppsToFront(task.displayId, wct, task.taskId) val deskId = getDefaultDeskId(task.displayId) val runOnTransitStart = addDeskActivationChanges(deskId, wct, task) runOnTransitStart?.invoke(transition) wct.reorder(task.token, true) return wct } Loading Loading @@ -2303,25 +2308,42 @@ class DesktopTasksController( return WindowContainerTransaction().also { wct -> val deskId = getDefaultDeskId(task.displayId) addMoveToDeskTaskChanges(wct = wct, task = task, deskId = deskId) // In some launches home task is moved behind new task being launched. Make sure // that's not the case for launches in desktop. Also, if this launch is the first // one to trigger the desktop mode (e.g., when [forceEnterDesktop()]), activate the // desktop mode here. val runOnTransitStart: RunOnTransitStart? = if ( task.baseIntent.flags.and(Intent.FLAG_ACTIVITY_TASK_ON_HOME) != 0 || !isDesktopModeShowing(task.displayId) ) { bringDesktopAppsToFront(task.displayId, wct, task.taskId) // In some launches home task is moved behind new task being launched. Make // sure that's not the case for launches in desktop. Also, if this launch is // the first one to trigger the desktop mode (e.g., when // [forceEnterDesktop()]), activate the desk here. val activationRunnable = addDeskActivationChanges( deskId = deskId, wct = wct, newTask = task, addPendingLaunchTransition = true, ) wct.reorder(task.token, true) activationRunnable } else { { transition: IBinder -> // The desk was already showing and we're launching a new Task - we // might need to minimize another Task. val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId) taskIdToMinimize?.let { minimizingTaskId -> addPendingMinimizeTransition( transition, minimizingTaskId, MinimizeReason.TASK_LIMIT, ) } // Desktop Mode is already showing and we're launching a new Task - we might need to // minimize another Task. val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId) taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT) } // Also track the pending launching task. addPendingAppLaunchTransition(transition, task.taskId, taskIdToMinimize) } } runOnTransitStart?.invoke(transition) desktopImmersiveController.exitImmersiveIfApplicable( transition, wct, Loading Loading @@ -2716,11 +2738,20 @@ class DesktopTasksController( activateDesk(deskId, remoteTransition) } /** Activates the given desk but without starting a transition. */ /** * Applies the necessary [wct] changes to activate the given desk. * * When a task is being brought into a desk together with the activation, then [newTask] is not * null and may be used to run other desktop policies, such as minimizing another task if the * task limit has been exceeded. */ fun addDeskActivationChanges( deskId: Int, wct: WindowContainerTransaction, newTask: RunningTaskInfo? = null, newTask: TaskInfo? = null, // TODO: b/362720497 - should this be true in other places? Can it be calculated locally // without having to specify the value? addPendingLaunchTransition: Boolean = false, ): RunOnTransitStart? { logV("addDeskActivationChanges newTaskId=%d deskId=%d", newTask?.taskId, deskId) val newTaskIdInFront = newTask?.taskId Loading @@ -2735,6 +2766,9 @@ class DesktopTasksController( minimizeReason = MinimizeReason.TASK_LIMIT, ) } if (newTask != null && addPendingLaunchTransition) { addPendingAppLaunchTransition(transition, newTask.taskId, taskIdToMinimize) } } } prepareForDeskActivation(displayId, wct) Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +16 −4 Original line number Diff line number Diff line Loading @@ -3524,9 +3524,15 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val wct = controller.handleRequest(Binder(), createTransition(fullscreenTask)) // Make sure we reorder the new task to top, and the back task to the bottom assertThat(wct!!.hierarchyOps.size).isEqualTo(9) assertThat(wct!!.hierarchyOps.size).isEqualTo(8) wct.assertReorderAt(0, fullscreenTask, toTop = true) wct.assertReorderAt(8, freeformTasks[0], toTop = false) // Oldest task that needs to minimized is never reordered to top over Home. val taskToMinimize = freeformTasks[0] wct.assertWithoutHop { hop -> hop.container == taskToMinimize.token && hop.type == HIERARCHY_OP_TYPE_REORDER && hop.toTop == true } } @Test Loading @@ -3541,12 +3547,18 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val wct = controller.handleRequest(Binder(), createTransition(fullscreenTask)) assertThat(wct!!.hierarchyOps.size).isEqualTo(10) assertThat(wct!!.hierarchyOps.size).isEqualTo(9) wct.assertReorderAt(0, fullscreenTask, toTop = true) // Make sure we reorder the home task to the top, desktop tasks to top of them and minimized // task is under the home task. wct.assertReorderAt(1, homeTask, toTop = true) wct.assertReorderAt(9, freeformTasks[0], toTop = false) // Oldest task that needs to minimized is never reordered to top over Home. val taskToMinimize = freeformTasks[0] wct.assertWithoutHop { hop -> hop.container == taskToMinimize.token && hop.type == HIERARCHY_OP_TYPE_REORDER && hop.toTop == true } } @Test Loading