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

Commit da6f322c authored by Toshiki Kikuchi's avatar Toshiki Kikuchi
Browse files

Include background task relaunch in isFullscreenRelaunch() filter

This CL removes the visibility check in isFullscreenRelaunch() to let it
include a background fullscreen task.

The expected relaunch consequences are
- Relaunching visible fullscreen task on desktop-first
  -> Keep it fullscreen
- Relaunching invisible fullscreen task on desktop-first
  -> Keep it fullscreen
- Relaunching visible fullscreen task on touch-first
  -> Keep it fullscreen
- Relaunching invisible fullscreen task on touch-first
  -> Change it freeform if any desk is active. Otherwise, keep it
     fullscreen

Flag: com.android.window.flags.enable_desktop_first_fullscreen_refocus_bugfix
Bug: 420499923
Test: DesktopTasksControllerTest
Change-Id: I78e6298a7922d07cf0f7c784173c4c8490a2da5b
parent 23eacfbd
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -2746,7 +2746,7 @@ 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. */
    /** Returns whether a fullscreen task is being relaunched on the same display or not. */
    private fun isFullscreenRelaunch(
        triggerTask: RunningTaskInfo,
        @WindowManager.TransitionType requestType: Int,
@@ -2758,7 +2758,6 @@ class DesktopTasksController(
        return triggerTask.isFullscreen &&
            TransitionUtil.isOpeningType(requestType) &&
            existingTask.isFullscreen &&
            existingTask.isVisible &&
            existingTask.displayId == triggerTask.displayId
    }

@@ -3195,21 +3194,27 @@ class DesktopTasksController(
        task: RunningTaskInfo,
        @WindowManager.TransitionType requestType: Int,
    ): Boolean {
        val isDesktopFirst = rootTaskDisplayAreaOrganizer.isDisplayDesktopFirst(task.displayId)
        if (
            DesktopExperienceFlags.ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX.isTrue &&
                isDesktopFirst &&
                isFullscreenRelaunch(task, requestType)
        ) {
            logV("shouldFullscreenTaskLaunchSwitchToDesktop: no switch as fullscreen relaunch")
            logV(
                "shouldFullscreenTaskLaunchSwitchToDesktop: no switch as fullscreen relaunch on" +
                    " desktop-first display#%s",
                task.displayId,
            )
            return false
        }

        val isAnyDeskActive = isAnyDeskActive(task.displayId)
        val forceEnterDesktop = forceEnterDesktop(task.displayId)
        logV(
            "shouldFullscreenTaskLaunchSwitchToDesktop, isAnyDeskActive=%s, forceEnterDesktop=%s",
            "shouldFullscreenTaskLaunchSwitchToDesktop, isAnyDeskActive=%s, isDesktopFirst=%s",
            isAnyDeskActive,
            forceEnterDesktop,
            isDesktopFirst,
        )
        return isAnyDeskActive || forceEnterDesktop
        return isAnyDeskActive || isDesktopFirst
    }

    /**
+56 −2
Original line number Diff line number Diff line
@@ -6720,15 +6720,69 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX)
    fun handleRequest_fullscreenTaskRelaunch_returnNull() {
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun handleRequest_fullscreenTaskRelaunch_desktopFirst_returnNull() {
        val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
        tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM
        val task = setUpFullscreenTask()
        // Deactivate desk as fullscreen task is visible on top.
        taskRepository.getActiveDeskId(DEFAULT_DISPLAY)?.let { taskRepository.setDeskInactive(it) }

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

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

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun handleRequest_backgroundFullscreenTaskRelaunch_desktopFirst_returnNull() {
        val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
        tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM
        val task = setUpFullscreenTask(visible = false)

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

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

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun handleRequest_fullscreenTaskRelaunch_touchFirst_returnNull() {
        val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
        tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN
        val task = setUpFullscreenTask()
        // Deactivate desk as fullscreen task is visible on top.
        taskRepository.getActiveDeskId(DEFAULT_DISPLAY)?.let { taskRepository.setDeskInactive(it) }

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

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

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_FIRST_FULLSCREEN_REFOCUS_BUGFIX,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun handleRequest_backgroundFullscreenTaskRelaunch_touchFirst_moveToDesk() {
        val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
        tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN
        val task = setUpFullscreenTask(visible = false)

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

        verify(desksOrganizer).moveTaskToDesk(result!!, DEFAULT_DISPLAY, task)
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
    fun moveFocusedTaskToDesktop_noDisplayActivity_doesNothing() {