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

Commit 97fbb590 authored by dakinola's avatar dakinola Committed by Daniel Akinola
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
parent fe843f87
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
        }
}