diff options
| author | 2024-03-06 15:23:29 +0000 | |
|---|---|---|
| committer | 2024-03-14 15:05:06 +0000 | |
| commit | 97fbb590077875a0882a4b273f907d522fa83bf0 (patch) | |
| tree | f4bc084f84fdf49fa4e1056b2729dda1400c76e9 | |
| parent | fe843f87e792a9e19f42a0e705d2a12f2c4a4392 (diff) | |
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
2 files changed, 54 insertions, 12 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt index 730aa620690a..5dde14bf0867 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt @@ -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 ) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt index d75553fe57ab..b593def283ae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt @@ -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 + } } |