Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82a6c7a9 authored by Orhan Uysal's avatar Orhan Uysal
Browse files

Launch the app if it's not running onMovedToFront

This method is used by taskbar to move an app to the front. With the
latest back nav changes, minimized apps can be non-running. With this
change if the apps are not running we launch them instead.

Bug: 369981804
Test: atest DesktopTasksControllerTest
Flag: com.android.window.flags.enable_desktop_windowing_back_navigation
Change-Id: Icb4872eb5ed3ecf10a87e068fb2e14422569768f
parent 02c31289
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -543,7 +543,29 @@ class DesktopTasksController(

    /** Move a task to the front */
    fun moveTaskToFront(taskId: Int) {
        shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { task -> moveTaskToFront(task) }
        val task = shellTaskOrganizer.getRunningTaskInfo(taskId)
        if (task == null) moveBackgroundTaskToFront(taskId) else moveTaskToFront(task)
    }

    /**
     * Launch a background task in desktop. Note that this should be used when we are already in
     * desktop. If outside of desktop and want to launch a background task in desktop, use
     * [moveBackgroundTaskToDesktop] instead.
     */
    private fun moveBackgroundTaskToFront(taskId: Int) {
        logV("moveBackgroundTaskToFront taskId=%s", taskId)
        val wct = WindowContainerTransaction()
        // TODO: b/342378842 - Instead of using default display, support multiple displays
        val taskToMinimize: RunningTaskInfo? =
            addAndGetMinimizeChangesIfNeeded(DEFAULT_DISPLAY, wct, taskId)
        wct.startTask(
            taskId,
            ActivityOptions.makeBasic().apply {
                launchWindowingMode = WINDOWING_MODE_FREEFORM
            }.toBundle(),
        )
        val transition = transitions.startTransition(TRANSIT_OPEN, wct, null /* handler */)
        addPendingMinimizeTransition(transition, taskToMinimize)
    }

    /** Move a task to the front */
@@ -551,7 +573,8 @@ class DesktopTasksController(
        logV("moveTaskToFront taskId=%s", taskInfo.taskId)
        val wct = WindowContainerTransaction()
        wct.reorder(taskInfo.token, true)
        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(taskInfo.displayId, wct, taskInfo)
        val taskToMinimize =
            addAndGetMinimizeChangesIfNeeded(taskInfo.displayId, wct, taskInfo.taskId)
        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
            val transition = transitions.startTransition(TRANSIT_TO_FRONT, wct, null /* handler */)
            addPendingMinimizeTransition(transition, taskToMinimize)
@@ -1247,7 +1270,7 @@ class DesktopTasksController(
        }
        // Desktop Mode is showing and we're launching a new Task - we might need to minimize
        // a Task.
        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task)
        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId)
        if (taskToMinimize != null) {
            addPendingMinimizeTransition(transition, taskToMinimize)
            return wct
@@ -1273,7 +1296,8 @@ class DesktopTasksController(

                // Desktop Mode is already showing and we're launching a new Task - we might need to
                // minimize another Task.
                val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task)
                val taskToMinimize =
                    addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId)
                addPendingMinimizeTransition(transition, taskToMinimize)
            }
        }
@@ -1415,12 +1439,12 @@ class DesktopTasksController(
    private fun addAndGetMinimizeChangesIfNeeded(
        displayId: Int,
        wct: WindowContainerTransaction,
        newTaskInfo: RunningTaskInfo
        newTaskId: Int
    ): RunningTaskInfo? {
        if (!desktopTasksLimiter.isPresent) return null
        return desktopTasksLimiter
            .get()
            .addAndGetMinimizeTaskChangesIfNeeded(displayId, wct, newTaskInfo)
            .addAndGetMinimizeTaskChangesIfNeeded(displayId, wct, newTaskId)
    }

    private fun addPendingMinimizeTransition(
+3 −3
Original line number Diff line number Diff line
@@ -208,15 +208,15 @@ class DesktopTasksLimiter (
    fun addAndGetMinimizeTaskChangesIfNeeded(
            displayId: Int,
            wct: WindowContainerTransaction,
            newFrontTaskInfo: RunningTaskInfo,
            newFrontTaskId: Int,
    ): RunningTaskInfo? {
        ProtoLog.v(
                ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
                "DesktopTasksLimiter: addMinimizeBackTaskChangesIfNeeded, newFrontTask=%d",
                newFrontTaskInfo.taskId)
            newFrontTaskId)
        val newTaskListOrderedFrontToBack = createOrderedTaskListWithGivenTaskInFront(
                taskRepository.getActiveNonMinimizedOrderedTasks(displayId),
                newFrontTaskInfo.taskId)
            newFrontTaskId)
        val taskToMinimize = getTaskToMinimizeIfNeeded(newTaskListOrderedFrontToBack)
        if (taskToMinimize != null) {
            wct.reorder(taskToMinimize.token, false /* onTop */)
+26 −0
Original line number Diff line number Diff line
@@ -1347,6 +1347,32 @@ class DesktopTasksControllerTest : ShellTestCase() {
    wct.assertReorderAt(1, freeformTasks[1], toTop = false)
  }

  @Test
  fun moveTaskToFront_backgroundTask_launchesTask() {
    val task = createTaskInfo(1)
    whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)

    controller.moveTaskToFront(task.taskId)

    val wct = getLatestWct(type = TRANSIT_OPEN)
    assertThat(wct.hierarchyOps).hasSize(1)
    wct.assertLaunchTaskAt(0, task.taskId, WINDOWING_MODE_FREEFORM)
  }

  @Test
  fun moveTaskToFront_backgroundTaskBringsTasksOverLimit_minimizesBackTask() {
    val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() }
    val task = createTaskInfo(1001)
    whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null)

    controller.moveTaskToFront(task.taskId)

    val wct = getLatestWct(type = TRANSIT_OPEN)
    assertThat(wct.hierarchyOps.size).isEqualTo(2) // launch + minimize
    wct.assertReorderAt(0, freeformTasks[0], toTop = false)
    wct.assertLaunchTaskAt(1, task.taskId, WINDOWING_MODE_FREEFORM)
  }

  @Test
  fun moveToNextDisplay_noOtherDisplays() {
    whenever(rootTaskDisplayAreaOrganizer.displayIds).thenReturn(intArrayOf(DEFAULT_DISPLAY))
+3 −3
Original line number Diff line number Diff line
@@ -291,7 +291,7 @@ class DesktopTasksLimiterTest : ShellTestCase() {
                desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded(
                        displayId = DEFAULT_DISPLAY,
                        wct = wct,
                        newFrontTaskInfo = setUpFreeformTask())
                        newFrontTaskId = setUpFreeformTask().taskId)

        assertThat(minimizedTaskId).isNull()
        assertThat(wct.hierarchyOps).isEmpty() // No reordering operations added
@@ -307,7 +307,7 @@ class DesktopTasksLimiterTest : ShellTestCase() {
                desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded(
                        displayId = DEFAULT_DISPLAY,
                        wct = wct,
                        newFrontTaskInfo = setUpFreeformTask())
                        newFrontTaskId = setUpFreeformTask().taskId)

        assertThat(minimizedTaskId).isEqualTo(tasks.first())
        assertThat(wct.hierarchyOps.size).isEqualTo(1)
@@ -325,7 +325,7 @@ class DesktopTasksLimiterTest : ShellTestCase() {
                desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded(
                        displayId = 0,
                        wct = wct,
                        newFrontTaskInfo = setUpFreeformTask())
                        newFrontTaskId = setUpFreeformTask().taskId)

        assertThat(minimizedTaskId).isNull()
        assertThat(wct.hierarchyOps).isEmpty() // No reordering operations added