diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index dd4dd5f5ef96e..f71bd7288532f 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1630,12 +1630,16 @@ class Task extends TaskFragment { } ActivityRecord performClearTop(ActivityRecord newR, int launchFlags) { + // The task should be preserved for putting new activity in case the last activity is + // finished if it is normal launch mode and not single top ("clear-task-top"). + mReuseTask = true; mTaskSupervisor.beginDeferResume(); final ActivityRecord result; try { result = clearTopActivities(newR, launchFlags); } finally { mTaskSupervisor.endDeferResume(); + mReuseTask = false; } return result; } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 636c6bc77e0a2..9304761fc1c96 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -258,6 +258,20 @@ public class TaskTests extends WindowTestsBase { assertNull(task1.isInTask(activity2)); } + @Test + public void testPerformClearTop() { + final Task task = createTask(mDisplayContent); + final ActivityRecord activity1 = new ActivityBuilder(mAtm).setTask(task).build(); + final ActivityRecord activity2 = new ActivityBuilder(mAtm).setTask(task).build(); + // Detach from process so the activities can be removed from hierarchy when finishing. + activity1.detachFromProcess(); + activity2.detachFromProcess(); + assertNull(task.performClearTop(activity1, 0 /* launchFlags */)); + assertFalse(task.hasChild()); + // In real case, the task should be preserved for adding new activity. + assertTrue(task.isAttached()); + } + @Test public void testRemoveChildForOverlayTask() { final Task task = createTask(mDisplayContent);