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

Commit 23eacfbd authored by Toshiki Kikuchi's avatar Toshiki Kikuchi
Browse files

Keep it fullscreen when fullscreen app relaunches

This CL prevents the desktop-first policy from forcefully changing the
windowing mode of the fullscreen app if it’s a relaunch of the existing
visible fullscreen app.

Flag: com.android.window.flags.enable_desktop_first_fullscreen_refocus_bugfix
Bug: 417908426
Bug: 419621913
Test: DesktopTasksControllerTest#handleRequest_fullscreenTaskRelaunch_returnNull
Change-Id: I5a6b12f44dda0371f4be954fcdf986e06abae0e7
parent aa3956e4
Loading
Loading
Loading
Loading
+32 −4
Original line number Diff line number Diff line
@@ -2646,7 +2646,8 @@ class DesktopTasksController(
                isIncompatibleTask(triggerTask) ->
                    handleIncompatibleTaskLaunch(triggerTask, transition)
                // Check if fullscreen task should be updated
                triggerTask.isFullscreen -> handleFullscreenTaskLaunch(triggerTask, transition)
                triggerTask.isFullscreen ->
                    handleFullscreenTaskLaunch(triggerTask, transition, request.type)
                // Check if freeform task should be updated
                triggerTask.isFreeform -> handleFreeformTaskLaunch(triggerTask, transition)
                else -> {
@@ -2685,7 +2686,7 @@ class DesktopTasksController(
            triggerTask.isFullscreen -> {
                // Trigger fullscreen task will enter desktop, so any existing immersive task
                // should exit.
                shouldFullscreenTaskLaunchSwitchToDesktop(triggerTask)
                shouldFullscreenTaskLaunchSwitchToDesktop(triggerTask, info.type)
            }
            triggerTask.isFreeform -> {
                // Trigger freeform task will enter desktop, so any existing immersive task should
@@ -2745,6 +2746,22 @@ class DesktopTasksController(
            TransitionUtil.isOpeningType(request.type) &&
            taskRepository.isActiveTask(triggerTask.taskId))

    /** Returns whether a visible fullscreen task is being relaunched on the same display or not. */
    private fun isFullscreenRelaunch(
        triggerTask: RunningTaskInfo,
        @WindowManager.TransitionType requestType: Int,
    ): Boolean {
        // Do not treat fullscreen-in-desktop as fullscreen.
        if (taskRepository.isActiveTask(triggerTask.taskId)) return false

        val existingTask = shellTaskOrganizer.getRunningTaskInfo(triggerTask.taskId) ?: return false
        return triggerTask.isFullscreen &&
            TransitionUtil.isOpeningType(requestType) &&
            existingTask.isFullscreen &&
            existingTask.isVisible &&
            existingTask.displayId == triggerTask.displayId
    }

    private fun isIncompatibleTask(task: RunningTaskInfo) =
        desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(task)

@@ -3086,9 +3103,10 @@ class DesktopTasksController(
    private fun handleFullscreenTaskLaunch(
        task: RunningTaskInfo,
        transition: IBinder,
        @WindowManager.TransitionType requestType: Int,
    ): WindowContainerTransaction? {
        logV("handleFullscreenTaskLaunch")
        if (shouldFullscreenTaskLaunchSwitchToDesktop(task)) {
        if (shouldFullscreenTaskLaunchSwitchToDesktop(task, requestType)) {
            logD("Switch fullscreen task to freeform on transition: taskId=%d", task.taskId)
            return WindowContainerTransaction().also { wct ->
                val deskId = getOrCreateDefaultDeskId(task.displayId) ?: return@also
@@ -3173,7 +3191,17 @@ class DesktopTasksController(
    private fun shouldFreeformTaskLaunchSwitchToFullscreen(task: RunningTaskInfo): Boolean =
        !isAnyDeskActive(task.displayId)

    private fun shouldFullscreenTaskLaunchSwitchToDesktop(task: RunningTaskInfo): Boolean {
    private fun shouldFullscreenTaskLaunchSwitchToDesktop(
        task: RunningTaskInfo,
        @WindowManager.TransitionType requestType: Int,
    ): Boolean {
        if (
            DesktopExperienceFlags.ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX.isTrue &&
                isFullscreenRelaunch(task, requestType)
        ) {
            logV("shouldFullscreenTaskLaunchSwitchToDesktop: no switch as fullscreen relaunch")
            return false
        }
        val isAnyDeskActive = isAnyDeskActive(task.displayId)
        val forceEnterDesktop = forceEnterDesktop(task.displayId)
        logV(
+21 −8
Original line number Diff line number Diff line
@@ -1344,7 +1344,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        // Create new active desk and launch new task.
        taskRepository.addDesk(DEFAULT_DISPLAY, deskId = 2)
        taskRepository.setActiveDesk(displayId = DEFAULT_DISPLAY, deskId = 2)
        val newDeskTask = setUpFullscreenTask(displayId = DEFAULT_DISPLAY)
        val newDeskTask = createFullscreenTask(displayId = DEFAULT_DISPLAY)
        val wct = controller.handleRequest(Binder(), createTransition(newDeskTask))

        // New task should be cascaded independently of tasks in other desks.
@@ -5689,7 +5689,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        markTaskVisible(freeformTask)

        val task =
            setUpFullscreenTask().apply {
            createFullscreenTask().apply {
                isActivityStackTransparent = true
                isTopActivityNoDisplay = true
                numActivities = 1
@@ -5711,7 +5711,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        markTaskVisible(freeformTask)

        val task =
            setUpFullscreenTask().apply {
            createFullscreenTask().apply {
                isActivityStackTransparent = true
                isTopActivityNoDisplay = true
                numActivities = 1
@@ -5835,7 +5835,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        val topTransparentTask = setUpFullscreenTask(displayId = DEFAULT_DISPLAY)
        taskRepository.setTopTransparentFullscreenTaskData(DEFAULT_DISPLAY, topTransparentTask)

        val task = setUpFullscreenTask(displayId = DEFAULT_DISPLAY)
        val task = createFullscreenTask(displayId = DEFAULT_DISPLAY)

        val result = controller.handleRequest(Binder(), createTransition(task))
        assertThat(result?.changes?.get(task.token.asBinder())?.windowingMode)
@@ -5931,7 +5931,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
            context.resources.getString(com.android.internal.R.string.config_systemUi)
        val baseComponent = ComponentName(systemUIPackageName, /* cls= */ "")
        val task =
            setUpFullscreenTask().apply {
            createFullscreenTask().apply {
                baseActivity = baseComponent
                isTopActivityNoDisplay = true
            }
@@ -5956,7 +5956,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
            context.resources.getString(com.android.internal.R.string.config_systemUi)
        val baseComponent = ComponentName(systemUIPackageName, /* cls= */ "")
        val task =
            setUpFullscreenTask(displayId = DEFAULT_DISPLAY).apply {
            createFullscreenTask(displayId = DEFAULT_DISPLAY).apply {
                baseActivity = baseComponent
                isTopActivityNoDisplay = true
            }
@@ -6719,6 +6719,16 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        assertNull(result, "Should not handle request")
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX)
    fun handleRequest_fullscreenTaskRelaunch_returnNull() {
        val task = setUpFullscreenTask()

        val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_OPEN))

        assertNull(result, "Should not handle request")
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
    fun moveFocusedTaskToDesktop_noDisplayActivity_doesNothing() {
@@ -9546,7 +9556,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
    @Test
    fun handleRequest_fullscreenLaunchToDesktop_attemptsImmersiveExit() {
        setUpFreeformTask()
        val task = setUpFullscreenTask()
        val task = createFullscreenTask()
        val binder = Binder()

        controller.handleRequest(binder, createTransition(task))
@@ -9674,7 +9684,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
    fun shouldPlayDesktopAnimation_fullscreenEntersDesktop_plays() {
        // At least one freeform task to be in a desktop.
        val existingTask = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
        val triggerTask = setUpFullscreenTask(displayId = DEFAULT_DISPLAY)
        val triggerTask = createFullscreenTask(displayId = DEFAULT_DISPLAY)
        assertThat(controller.isAnyDeskActive(triggerTask.displayId)).isTrue()
        taskRepository.setTaskInFullImmersiveState(
            displayId = existingTask.displayId,
@@ -10509,6 +10519,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        enableUserFullscreenOverride: Boolean = false,
        enableSystemFullscreenOverride: Boolean = false,
        aspectRatioOverrideApplied: Boolean = false,
        visible: Boolean = true,
    ): RunningTaskInfo {
        val task = createFullscreenTask(displayId)
        val activityInfo = ActivityInfo()
@@ -10557,6 +10568,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
                    appCompatTaskInfo.topActivityAppBounds.set(0, 0, 1600, 1200)
                }
            }
            isVisible = visible
        }
        whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task)
        runningTasks.add(task)
@@ -10710,6 +10722,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
            FlagsParameterization.allCombinationsOf(
                Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
                Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX,
                Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX,
            )
    }
}