diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index d81181d464176..20c0d4189ad85 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1573,6 +1573,10 @@ class RecentTasks { } else if (document || trIsDocument) { // Only one of these is a document. Not the droid we're looking for. continue; + } else if (multiTasksAllowed) { + // Neither is a document, but the new task supports multiple tasks so keep the + // existing task + continue; } } return i; 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 925b6f9601be1..6ffdb099695d2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -219,7 +219,7 @@ public class RecentTasksTest extends WindowTestsBase { } @Test - public void testAddTasksNoMultiple_expectNoTrim() { + public void testAddDocumentTasksNoMultiple_expectNoTrim() { // Add same non-multiple-task document tasks will remove the task (to re-add it) but not // trim it Task documentTask1 = createDocumentTask(".DocumentTask1"); @@ -262,7 +262,7 @@ public class RecentTasksTest extends WindowTestsBase { } @Test - public void testAddTasksMultipleDocumentTasks_expectNoTrim() { + public void testAddMultipleDocumentTasks_expectNoTrim() { // Add same multiple-task document tasks does not trim the first tasks Task documentTask1 = createDocumentTask(".DocumentTask1", FLAG_ACTIVITY_MULTIPLE_TASK); @@ -278,9 +278,33 @@ public class RecentTasksTest extends WindowTestsBase { } @Test - public void testAddTasksMultipleTasks_expectRemovedNoTrim() { - // Add multiple same-affinity non-document tasks, ensure that it removes the other task, - // but that it does not trim it + public void testAddTasks_expectRemovedNoTrim() { + // Add multiple same-affinity non-document tasks, ensure that it removes, but does not trim + // the other task + Task task1 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .build(); + Task task2 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .build(); + mRecentTasks.add(task1); + assertThat(mCallbacksRecorder.mAdded).hasSize(1); + assertThat(mCallbacksRecorder.mAdded).contains(task1); + assertThat(mCallbacksRecorder.mTrimmed).isEmpty(); + assertThat(mCallbacksRecorder.mRemoved).isEmpty(); + mCallbacksRecorder.clear(); + mRecentTasks.add(task2); + assertThat(mCallbacksRecorder.mAdded).hasSize(1); + assertThat(mCallbacksRecorder.mAdded).contains(task2); + assertThat(mCallbacksRecorder.mTrimmed).isEmpty(); + assertThat(mCallbacksRecorder.mRemoved).hasSize(1); + assertThat(mCallbacksRecorder.mRemoved).contains(task1); + } + + @Test + public void testAddMultipleTasks_expectNotRemoved() { + // Add multiple same-affinity non-document tasks with MULTIPLE_TASK, ensure that it does not + // remove the other task Task task1 = createTaskBuilder(".Task1") .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK) .build(); @@ -297,8 +321,7 @@ public class RecentTasksTest extends WindowTestsBase { assertThat(mCallbacksRecorder.mAdded).hasSize(1); assertThat(mCallbacksRecorder.mAdded).contains(task2); assertThat(mCallbacksRecorder.mTrimmed).isEmpty(); - assertThat(mCallbacksRecorder.mRemoved).hasSize(1); - assertThat(mCallbacksRecorder.mRemoved).contains(task1); + assertThat(mCallbacksRecorder.mRemoved).isEmpty(); } @Test