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

Commit 20ec8a26 authored by mattsziklay's avatar mattsziklay
Browse files

Check for desk root in getFocusedNonDesktopTasks.

Adds a check for desk root in getFocusedNonDesktopTasks. The current
check for focused non-desktop tasks checks if the task is not in task
repository and is neither home nor wallpaper. Desk roots fit all these
criteria and can be focusable.

Bug: 423483536
Flag: com.android.window.flags.exclude_desk_roots_from_desktop_tasks
Test: Manual, tab tear does not no-op due to focused desk
Change-Id: I586f0c8d55af6395636e5d8849ad5c5c9afab939
parent 5c9d2f47
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -456,15 +456,16 @@ class DesktopTasksController(
    }

    /**
     * Returns all focused tasks in full screen or split screen mode in [displayId] when it is not
     * the home activity.
     * Returns all focused tasks in full screen or split screen mode in [displayId] excluding home
     * activity and desk roots.
     */
    private fun getFocusedNonDesktopTasks(displayId: Int): List<RunningTaskInfo> =
        shellTaskOrganizer.getRunningTasks(displayId).filter { taskInfo ->
            val focused = taskInfo.isFocused
            val isNotDesktop =
                if (DesktopExperienceFlags.EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS.isTrue) {
                    !taskRepository.isActiveTask(taskInfo.taskId)
                    !taskRepository.isActiveTask(taskInfo.taskId) &&
                        !taskRepository.getAllDeskIds().contains(taskInfo.taskId)
                } else {
                    taskInfo.windowingMode == WINDOWING_MODE_FULLSCREEN ||
                        taskInfo.windowingMode == WINDOWING_MODE_MULTI_WINDOW
+54 −6
Original line number Diff line number Diff line
@@ -9722,11 +9722,35 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX,
        Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun onUnhandledDrag_crossDisplayDrag() {
    fun onUnhandledDrag_crossDisplayDrag_succeedsOnFocusedFreeformTask() {
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
        setUpFreeformTask(displayId = SECOND_DISPLAY, deskId = 2)
        setUpFreeformTask(displayId = SECOND_DISPLAY, deskId = 2).apply { isFocused = true }
        testOnUnhandledDrag(
            DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR,
            PointF(1200f, 700f),
            Rect(240, 700, 2160, 1900),
            tabTearingMinimizeAnimationFlagEnabled = true,
            tabTearingLaunchAnimationFlagEnabled = true,
            destinationDisplayId = SECOND_DISPLAY,
        )
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX,
        Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION,
        Flags.FLAG_EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun onUnhandledDrag_crossDisplayDrag_succeedsOnFocusedDeskRoot() {
        val task = createFreeformTask(displayId = SECOND_DISPLAY).apply { isFocused = true }
        runningTasks.add(task)
        whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task)
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = task.taskId)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = task.taskId)
        testOnUnhandledDrag(
            DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR,
            PointF(1200f, 700f),
@@ -9737,6 +9761,27 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        )
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX,
        Flags.FLAG_ENABLE_DESKTOP_TAB_TEARING_LAUNCH_ANIMATION,
        Flags.FLAG_EXCLUDE_DESK_ROOTS_FROM_DESKTOP_TASKS,
    )
    fun onUnhandledDrag_crossDisplayDrag_noOpOnFocusedNonDesktopTask() {
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
        setUpFullscreenTask(displayId = SECOND_DISPLAY).apply { isFocused = true }
        testOnUnhandledDrag(
            DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR,
            PointF(1200f, 700f),
            Rect(240, 700, 2160, 1900),
            tabTearingMinimizeAnimationFlagEnabled = true,
            tabTearingLaunchAnimationFlagEnabled = true,
            destinationDisplayId = SECOND_DISPLAY,
            verifyNoOp = true,
        )
    }

    @Test
    fun shellController_registersUserChangeListener() {
        verify(shellController, times(2)).addUserChangeListener(any())
@@ -10769,6 +10814,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        tabTearingMinimizeAnimationFlagEnabled: Boolean,
        tabTearingLaunchAnimationFlagEnabled: Boolean,
        destinationDisplayId: Int = DEFAULT_DISPLAY,
        verifyNoOp: Boolean = false,
    ) {
        desktopState.overrideDesktopModeSupportPerDisplay[DEFAULT_DISPLAY] = true
        desktopState.overrideDesktopModeSupportPerDisplay[destinationDisplayId] = true
@@ -10822,16 +10868,17 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
            mockDragEvent,
            mockCallback as Consumer<Boolean>,
        )
        val times = if (verifyNoOp) never() else times(1)
        val arg = argumentCaptor<WindowContainerTransaction>()
        var expectedWindowingMode: Int
        val expectedWindowingMode: Int
        if (indicatorType == DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR) {
            expectedWindowingMode = WINDOWING_MODE_FULLSCREEN
            // Fullscreen launches currently use default transitions
            verify(transitions).startTransition(any(), arg.capture(), anyOrNull())
            verify(transitions, times).startTransition(any(), arg.capture(), anyOrNull())
        } else {
            expectedWindowingMode = WINDOWING_MODE_FREEFORM
            if (tabTearingMinimizeAnimationFlagEnabled || tabTearingLaunchAnimationFlagEnabled) {
                verify(desktopMixedTransitionHandler)
                verify(desktopMixedTransitionHandler, times)
                    .startLaunchTransition(
                        eq(TRANSIT_OPEN),
                        arg.capture(),
@@ -10843,10 +10890,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
                    )
            } else {
                // All other launches use a special handler.
                verify(dragAndDropTransitionHandler)
                verify(dragAndDropTransitionHandler, times)
                    .handleDropEvent(arg.capture(), eq(mockDragEvent))
            }
        }
        if (verifyNoOp) return
        assertThat(
                ActivityOptions.fromBundle(arg.firstValue.hierarchyOps[0].launchOptions)
                    .launchWindowingMode