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

Commit 2a0824e2 authored by Pragya Bajoria's avatar Pragya Bajoria Committed by Android (Google) Code Review
Browse files

Merge "Update the DesktopTaskChangeListener logic to work correctly for task management." into main

parents 59c660c4 fa195b90
Loading
Loading
Loading
Loading
+32 −14
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser
            desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId)
            return
        }
        if (isFreeformTask(taskInfo)) {
        if (isFreeformTask(taskInfo) && !desktopRepository.isActiveTask(taskInfo.taskId)) {
            desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible)
        }
    }
@@ -44,23 +44,33 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser
        logD("onTaskChanging for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        if (!desktopRepository.isActiveTask(taskInfo.taskId)) return

        // TODO: b/394281403 - with multiple desks, it's possible to have a non-freeform task
        //  inside a desk, so this should be decoupled from windowing mode.
        //  Also, changes in/out of desks are handled by the [DesksTransitionObserver], which has
        //  more specific information about the desk involved in the transition, which might be
        //  more accurate than assuming it's always the default/active desk in the display, as this
        //  method does.
        // Case 1: Freeform task is changed in Desktop Mode.
        if (isFreeformTask(taskInfo)) {
            if (taskInfo.isVisible) {
                desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible)
        // Case 1: When the task change is from a task in the desktop repository which is now
        // fullscreen,
        // remove the task from the desktop repository since it is no longer a freeform task.
        if (!isFreeformTask(taskInfo)) {
            if (desktopRepository.isActiveTask(taskInfo.taskId)) {
                desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId)
            }
            desktopRepository.updateTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible)
        } else { // Task change is a freeform task
            if (!desktopRepository.isActiveTask(taskInfo.taskId)) {
                // Case 2: When the task change is a freeform visible task, but the task is not
                // yet active in the desktop repository, adds task to desktop repository.
                desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible)
            } else {
            // Case 2: Freeform task is changed outside Desktop Mode.
            desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId)
                // Case 3: When the task change is a freeform task which already exists as an active
                // task in the desktop repository, updates the task state.
                desktopRepository.updateTask(
                    taskInfo.displayId,
                    taskInfo.taskId,
                    taskInfo.isVisible,
                )
            }
        }
    }

@@ -82,14 +92,22 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser
        logD("onTaskMovingToFront for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        if (!desktopRepository.isActiveTask(taskInfo.taskId)) return
        if (!isFreeformTask(taskInfo)) {
        // When the task change is from a task in the desktop repository which is now fullscreen,
        // remove the task from the desktop repository since it is no longer a freeform task.
        if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) {
            desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId)
        }
        if (isFreeformTask(taskInfo)) {
            // If the task is already active in the repository, then it only moves the task to the
            // front.
            desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible)
        }
    }

    override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) {
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        if (!desktopRepository.isActiveTask(taskInfo.taskId)) return
        logD("onTaskMovingToBack for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        // TODO: b/367268953 - Connect this with DesktopRepository.
    }
@@ -101,7 +119,7 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser
        if (!desktopRepository.isActiveTask(taskInfo.taskId)) return
        // TODO: b/370038902 - Handle Activity#finishAndRemoveTask.
        if (
            !DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue() ||
            !DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue ||
                desktopRepository.isClosingTask(taskInfo.taskId)
        ) {
            // A task that's vanishing should be removed:
+43 −13
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskOpening_fullscreenTask_notActiveDesktopTask_noop() {
    fun onTaskOpening_fullscreenTask_nonActiveDesktopTask_noop() {
        val task = createFullscreenTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false)

@@ -68,7 +68,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskOpening_freeformTask_activeDesktopTask_removesTaskFromRepo() {
    fun onTaskOpening_fullscreenTask_taskIsActiveInDesktopRepo_removesTaskFromDesktopRepo() {
        val task = createFullscreenTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)

@@ -78,19 +78,20 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskOpening_freeformTask_visibleDesktopTask_addsTaskToRepository() {
    fun onTaskOpening_freeformTask_activeInDesktopRepository_noop() {
        val task = createFreeformTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false)
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)

        desktopTaskChangeListener.onTaskOpening(task)

        verify(desktopUserRepositories.current).addTask(task.displayId, task.taskId, task.isVisible)
        verify(desktopUserRepositories.current, never())
            .addTask(task.displayId, task.taskId, task.isVisible)
    }

    @Test
    fun onTaskOpening_freeformTask_nonVisibleDesktopTask_addsTaskToRepository() {
    fun onTaskOpening_freeformTask_notActiveInDesktopRepo_addsTaskToRepository() {
        val task = createFreeformTask().apply { isVisible = false }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false)

        desktopTaskChangeListener.onTaskOpening(task)

@@ -98,7 +99,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskChanging_freeformTaskOutsideDesktop_removesTaskFromRepo() {
    fun onTaskChanging_fullscreenTask_activeInDesktopRepository_removesTaskFromRepo() {
        val task = createFullscreenTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)

@@ -108,7 +109,27 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskChanging_visibleTaskInDesktop_updatesTaskVisibility() {
    fun onTaskChanging_fullscreenTask_nonActiveInDesktopRepo_noop() {
        val task = createFullscreenTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false)

        desktopTaskChangeListener.onTaskChanging(task)

        verify(desktopUserRepositories.current, never()).removeTask(task.displayId, task.taskId)
    }

    @Test
    fun onTaskChanging_freeformTask_nonActiveTaskInDesktopRepo_addsTaskToDesktopRepo() {
        val task = createFreeformTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false)

        desktopTaskChangeListener.onTaskChanging(task)

        verify(desktopUserRepositories.current).addTask(task.displayId, task.taskId, task.isVisible)
    }

    @Test
    fun onTaskChanging_freeformTask_activeVisibleTaskInDesktopRepo_updatesTaskVisibility() {
        val task = createFreeformTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)

@@ -119,7 +140,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskChanging_nonVisibleTask_updatesTaskVisibility() {
    fun onTaskChanging_freeformTask_activeNonVisibleTask_updatesTaskVisibility() {
        val task = createFreeformTask().apply { isVisible = false }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)

@@ -130,7 +151,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskMovingToFront_freeformTaskOutsideDesktop_removesTaskFromRepo() {
    fun onTaskMovingToFront_fullscreenTask_activeTaskInDesktopRepo_removesTaskFromRepo() {
        val task = createFullscreenTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)

@@ -140,9 +161,18 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    }

    @Test
    fun onTaskMovingToFront_freeformTaskOutsideDesktop_addsTaskToRepo() {
    fun onTaskMovingToFront_fullscreenTask_nonActiveTaskInDesktopRepo_noop() {
        val task = createFullscreenTask().apply { isVisible = true }
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true)
        whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false)

        desktopTaskChangeListener.onTaskMovingToFront(task)

        verify(desktopUserRepositories.current, never()).removeTask(task.displayId, task.taskId)
    }

    @Test
    fun onTaskMovingToFront_freeformTask_addsTaskToRepo() {
        val task = createFreeformTask().apply { isVisible = true }

        desktopTaskChangeListener.onTaskMovingToFront(task)