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 9ce788686e853..ce4f44540285d 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1272,6 +1272,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 2b589bf596827..d179338bf9478 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();