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

Commit 009f7e5c authored by Ben Lin's avatar Ben Lin Committed by Android (Google) Code Review
Browse files

Merge changes I5fa6ce1f,I8937ab08 into main

* changes:
  DesktopTasksController: Supply displayId when creating new instance.
  DesktopTasksController: Supply displayId when re-launching bg apps.
parents d302de2b a2a9417a
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -1457,22 +1457,30 @@ class DesktopTasksController(
    ) {
        logV("moveBackgroundTaskToFront taskId=%s", taskId)
        val wct = WindowContainerTransaction()

        val deskId =
            taskRepository.getDeskIdForTask(taskId)
                ?: getOrCreateDefaultDeskId(DEFAULT_DISPLAY)
                ?: return
        val displayId =
            if (ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY.isTrue)
                taskRepository.getDisplayForDesk(deskId)
            else DEFAULT_DISPLAY
        wct.startTask(
            taskId,
            ActivityOptions.makeBasic()
                .apply { launchWindowingMode = WINDOWING_MODE_FREEFORM }
                .apply {
                    launchWindowingMode = WINDOWING_MODE_FREEFORM
                    launchDisplayId = displayId
                }
                .toBundle(),
        )
        val deskId =
            taskRepository.getDeskIdForTask(taskId)
                ?: getOrCreateDefaultDeskId(DEFAULT_DISPLAY)
                ?: return
        startLaunchTransition(
            TRANSIT_OPEN,
            wct,
            taskId,
            deskId = deskId,
            displayId = DEFAULT_DISPLAY,
            displayId = displayId,
            remoteTransition = remoteTransition,
            unminimizeReason = unminimizeReason,
        )
@@ -2823,11 +2831,16 @@ class DesktopTasksController(
                    error("Invalid windowing mode: $newTaskWindowingMode")
                }
            }
        val displayId =
            if (ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY.isTrue)
                taskRepository.getDisplayForDesk(deskId)
            else DEFAULT_DISPLAY
        return ActivityOptions.makeBasic().apply {
            launchWindowingMode = newTaskWindowingMode
            pendingIntentBackgroundActivityStartMode =
                ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS
            launchBounds = bounds
            launchDisplayId = displayId
        }
    }

+95 −0
Original line number Diff line number Diff line
@@ -3157,6 +3157,43 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        wct.assertLaunchTask(task.taskId, WINDOWING_MODE_FREEFORM)
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
        Flags.FLAG_ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY,
    )
    fun moveTaskToFront_backgroundTask_launchesTask_launchesToExistingDisplay() {
        val deskId = 2
        val taskId = 1
        val task = createRecentTaskInfo(taskId, displayId = SECOND_DISPLAY)
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = deskId)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = deskId)
        taskRepository.addTaskToDesk(
            displayId = SECOND_DISPLAY,
            deskId = deskId,
            taskId = task.taskId,
            isVisible = true,
        )
        whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)
        whenever(
                desktopMixedTransitionHandler.startLaunchTransition(
                    eq(TRANSIT_OPEN),
                    any(),
                    anyOrNull(),
                    anyOrNull(),
                    anyOrNull(),
                    anyOrNull(),
                    anyOrNull(),
                )
            )
            .thenReturn(Binder())

        controller.moveTaskToFront(task.taskId, unminimizeReason = UnminimizeReason.UNKNOWN)

        val wct = getLatestDesktopMixedTaskWct(type = TRANSIT_OPEN)
        wct.assertLaunchTaskOnDisplay(SECOND_DISPLAY)
    }

    @Test
    @DisableFlags(
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
@@ -8084,6 +8121,57 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
            .isEqualTo(WINDOWING_MODE_FREEFORM)
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
        Flags.FLAG_ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY,
    )
    fun newWindow_fromFreeformAddsNewWindow_launchesToCallingDisplay() {
        setUpLandscapeDisplay()
        val deskId = 2
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = deskId)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = deskId)
        val task = setUpFreeformTask(displayId = SECOND_DISPLAY, deskId = deskId)
        val wctCaptor = argumentCaptor<WindowContainerTransaction>()
        val transition = Binder()
        whenever(
                mMockDesktopImmersiveController.exitImmersiveIfApplicable(
                    any(),
                    anyInt(),
                    anyOrNull(),
                    any(),
                )
            )
            .thenReturn(ExitResult.NoExit)
        whenever(
                desktopMixedTransitionHandler.startLaunchTransition(
                    anyInt(),
                    any(),
                    anyOrNull(),
                    anyOrNull(),
                    anyOrNull(),
                    anyOrNull(),
                    anyOrNull(),
                )
            )
            .thenReturn(transition)

        runOpenNewWindow(task)

        verify(desktopMixedTransitionHandler)
            .startLaunchTransition(
                anyInt(),
                wctCaptor.capture(),
                anyOrNull(),
                anyOrNull(),
                anyOrNull(),
                anyOrNull(),
                anyOrNull(),
            )
        wctCaptor.firstValue.assertLaunchTaskOnDisplay(SECOND_DISPLAY)
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
    fun newWindow_fromFreeform_exitsImmersiveIfNeeded() {
@@ -10654,6 +10742,13 @@ private fun WindowContainerTransaction.assertLaunchTask(taskId: Int, windowingMo
    }
}

private fun WindowContainerTransaction.assertLaunchTaskOnDisplay(displayId: Int) {
    val keyLaunchWindowingMode = "android.activity.windowingMode"
    val keyLaunchDisplayId = "android.activity.launchDisplayId"

    assertHop { hop -> hop.launchOptions?.getInt(keyLaunchDisplayId, DEFAULT_DISPLAY) == displayId }
}

private fun WindowContainerTransaction.assertLaunchTaskAt(
    index: Int,
    taskId: Int,