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

Commit fa195b90 authored by Pragya Bajoria's avatar Pragya Bajoria
Browse files

Update the DesktopTaskChangeListener logic to work correctly for task

management.

Change-Id: I2f201f5f3c8cc2915104a1231342ba018d239da7
Test: atest DesktopTaskChangeListenerTest
Test: atest DesktopRepositoryTest
Bug: 332682201
Flag:com.android.window.flags.enable_windowing_transition_handlers_observers

Change-Id: Id3460302678148a871be3009565f1325b11be682
parent ebd045fc
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)