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

Commit 0feb3b49 authored by dakinola's avatar dakinola Committed by Yvonne Lin
Browse files

Fix Animation for recent apps in the foreground

The fix introduced by ag/26400047 revealed an issue with how foreground tasks are identified. Foreground tasks were marked as the first non-app selector task on the task stack, however it doesnt actually check to see if that task is currently visible on the screen. Now we have a unique animation for the task being on the foreground, we want to ensure that a task being on foreground means it is currently visible on the screen to avoid animation jank.

Bug: 328417244
Test: manual testing
Test: atest com.android.systemui.mediaprojection.appselector.data.ShellRecentTaskListProviderTest
Flag: ACONFIG com.android.systemui.pss_app_selector_abrupt_exit_fix NEXTFOOD
Change-Id: I11a0f57138ecc1f84885467e814a15626d9c5cd1
(cherry picked from commit 97fbb590)
parent bb73b66d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ constructor(
                        it.topActivity,
                        it.baseIntent?.component,
                        it.taskDescription?.backgroundColor,
                        isForegroundTask = it.taskId in foregroundTaskIds
                        isForegroundTask = it.taskId in foregroundTaskIds && it.isVisible
                    )
                }
        }
+53 −11
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ class ShellRecentTaskListProviderTest : SysuiTestCase() {
    @Test
    fun loadRecentTasks_singleTask_returnsTaskAsNotForeground() {
        givenRecentTasks(
            createSingleTask(taskId = 1),
            createSingleTask(taskId = 1, isVisible = true),
        )

        val result = runBlocking { recentTaskListProvider.loadRecentTasks() }
@@ -90,10 +90,10 @@ class ShellRecentTaskListProviderTest : SysuiTestCase() {
    }

    @Test
    fun loadRecentTasks_multipleTasks_returnsSecondTaskAsForegroundTask() {
    fun loadRecentTasks_multipleTasks_returnsSecondVisibleTaskAsForegroundTask() {
        givenRecentTasks(
            createSingleTask(taskId = 1),
            createSingleTask(taskId = 2),
            createSingleTask(taskId = 2, isVisible = true),
            createSingleTask(taskId = 3),
        )

@@ -103,10 +103,25 @@ class ShellRecentTaskListProviderTest : SysuiTestCase() {
    }

    @Test
    fun loadRecentTasks_secondTaskIsGrouped_marksBothGroupedTasksAsForeground() {
    fun loadRecentTasks_multipleTasks_returnsSecondInvisibleTaskAsNotForegroundTask() {
        givenRecentTasks(
            createSingleTask(taskId = 1),
            createTaskPair(taskId1 = 2, taskId2 = 3),
            createSingleTask(taskId = 2, isVisible = false),
            createSingleTask(taskId = 3),
        )

        val result = runBlocking { recentTaskListProvider.loadRecentTasks() }

        assertThat(result.map { it.isForegroundTask })
            .containsExactly(false, false, false)
            .inOrder()
    }

    @Test
    fun loadRecentTasks_secondTaskIsGroupedAndVisible_marksBothGroupedTasksAsForeground() {
        givenRecentTasks(
            createSingleTask(taskId = 1),
            createTaskPair(taskId1 = 2, taskId2 = 3, isVisible = true),
            createSingleTask(taskId = 4),
        )

@@ -117,6 +132,21 @@ class ShellRecentTaskListProviderTest : SysuiTestCase() {
            .inOrder()
    }

    @Test
    fun loadRecentTasks_secondTaskIsGroupedAndInvisible_marksBothGroupedTasksAsNotForeground() {
        givenRecentTasks(
            createSingleTask(taskId = 1),
            createTaskPair(taskId1 = 2, taskId2 = 3, isVisible = false),
            createSingleTask(taskId = 4),
        )

        val result = runBlocking { recentTaskListProvider.loadRecentTasks() }

        assertThat(result.map { it.isForegroundTask })
            .containsExactly(false, false, false, false)
            .inOrder()
    }

    @Suppress("UNCHECKED_CAST")
    private fun givenRecentTasks(vararg tasks: GroupedRecentTaskInfo) {
        whenever(recentTasks.getRecentTasks(any(), any(), any(), any(), any())).thenAnswer {
@@ -136,11 +166,23 @@ class ShellRecentTaskListProviderTest : SysuiTestCase() {
            isForegroundTask = false,
        )

    private fun createSingleTask(taskId: Int): GroupedRecentTaskInfo =
        GroupedRecentTaskInfo.forSingleTask(createTaskInfo(taskId))

    private fun createTaskPair(taskId1: Int, taskId2: Int): GroupedRecentTaskInfo =
        GroupedRecentTaskInfo.forSplitTasks(createTaskInfo(taskId1), createTaskInfo(taskId2), null)
    private fun createSingleTask(taskId: Int, isVisible: Boolean = false): GroupedRecentTaskInfo =
        GroupedRecentTaskInfo.forSingleTask(createTaskInfo(taskId, isVisible))

    private fun createTaskPair(
        taskId1: Int,
        taskId2: Int,
        isVisible: Boolean = false
    ): GroupedRecentTaskInfo =
        GroupedRecentTaskInfo.forSplitTasks(
            createTaskInfo(taskId1, isVisible),
            createTaskInfo(taskId2, isVisible),
            null
        )

    private fun createTaskInfo(taskId: Int) = RecentTaskInfo().apply { this.taskId = taskId }
    private fun createTaskInfo(taskId: Int, isVisible: Boolean = false) =
        RecentTaskInfo().apply {
            this.taskId = taskId
            this.isVisible = isVisible
        }
}