From e5f3b1db82b756fd5fd8dfb24b3829c4b35ce2b4 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Thu, 18 May 2023 14:10:05 -0700 Subject: [PATCH] Update recent tasks when task moves to top When a task is moved to the top, ensure that the recents entry is moved to the top at the same time. Bug: 280468885 Test: atest WmTests:RecentTasksTest Change-Id: I780893fd0dc05cb85e9d8473c1feb089593d9793 --- .../com/android/server/wm/RecentTasks.java | 6 +++- .../core/java/com/android/server/wm/Task.java | 4 +++ .../server/wm/ActivityStarterTests.java | 3 ++ .../android/server/wm/RecentTasksTest.java | 36 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index e47787e97f20a..9ef5ed051a13e 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1104,6 +1104,10 @@ class RecentTasks { // front unless overridden by the provided activity options mTasks.remove(taskIndex); mTasks.add(0, task); + if (taskIndex != 0) { + // Only notify when position changes + mTaskNotificationController.notifyTaskListUpdated(); + } if (DEBUG_RECENTS) { Slog.d(TAG_RECENTS, "addRecent: moving to top " + task @@ -1552,7 +1556,7 @@ class RecentTasks { task.affinity != null && task.affinity.equals(t.affinity); final boolean sameIntent = intent != null && intent.filterEquals(trIntent); boolean multiTasksAllowed = false; - final int flags = intent.getFlags(); + final int flags = intent != null ? intent.getFlags() : 0; if ((flags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NEW_DOCUMENT)) != 0 && (flags & FLAG_ACTIVITY_MULTIPLE_TASK) != 0) { multiTasksAllowed = true; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index bb6f8056acda7..7b7dd85acfc16 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1271,6 +1271,10 @@ class Task extends TaskFragment { if (isPersistable) { mLastTimeMoved = System.currentTimeMillis(); } + if (toTop && inRecents) { + // If task is in recents, ensure it is at the top + mTaskSupervisor.mRecentTasks.add(this); + } } // Close up recents linked list. diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 2671e771aa598..8b8744b3527b9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -1702,6 +1702,9 @@ public class ActivityStarterTests extends WindowTestsBase { @Test public void testRecordActivityMovementBeforeDeliverToTop() { + // Mock recents as task is only marked to be in recents + mAtm.mTaskSupervisor.setRecentTasks(mock(RecentTasks.class)); + final Task task = new TaskBuilder(mAtm.mTaskSupervisor).build(); final ActivityRecord activityBot = new ActivityBuilder(mAtm).setTask(task).build(); final ActivityRecord activityTop = new ActivityBuilder(mAtm).setTask(task).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 10f4158205e6a..a24e6fb570f1a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -49,10 +49,12 @@ import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static java.lang.Integer.MAX_VALUE; @@ -1138,6 +1140,40 @@ public class RecentTasksTest extends WindowTestsBase { verify(controller, times(2)).notifyTaskListUpdated(); } + @Test + public void addTask_taskAlreadyInRecentsMovedToTop_callsTaskNotificationController() { + final Task firstTask = createTaskBuilder(".Task").build(); + final Task secondTask = createTaskBuilder(".Task2").build(); + + mRecentTasks.add(firstTask); + mRecentTasks.add(secondTask); + + TaskChangeNotificationController controller = + mAtm.getTaskChangeNotificationController(); + clearInvocations(controller); + + // Add firstTask back to top + mRecentTasks.add(firstTask); + verify(controller).notifyTaskListUpdated(); + } + + @Test + public void addTask_taskAlreadyInRecentsOnTop_doesNotNotify() { + final Task firstTask = createTaskBuilder(".Task").build(); + final Task secondTask = createTaskBuilder(".Task2").build(); + + mRecentTasks.add(firstTask); + mRecentTasks.add(secondTask); + + TaskChangeNotificationController controller = + mAtm.getTaskChangeNotificationController(); + clearInvocations(controller); + + // Add secondTask to top again + mRecentTasks.add(secondTask); + verifyZeroInteractions(controller); + } + @Test public void removeTask_callsTaskNotificationController() { final Task task = createTaskBuilder(".Task").build();