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
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index e47787e..9ef5ed0 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 @@
// 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 @@
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 bb6f805..7b7dd85 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 @@
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 2671e77..8b8744b 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 @@
@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 10f4158..a24e6fb 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.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;
@@ -1139,6 +1141,40 @@
}
@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();