diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 6631a3e61e77d..e357572667d5c 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1433,20 +1433,18 @@ class RecentTasks { /** @return whether the given task can be trimmed even if it is outside the visible range. */ protected boolean isTrimmable(Task task) { - final Task rootTask = task.getRootTask(); - - // No stack for task, just trim it - if (rootTask == null) { + // The task was detached, just trim it. + if (!task.isAttached()) { return true; } // Ignore tasks from different displays // TODO (b/115289124): No Recents on non-default displays. - if (!rootTask.isOnHomeDisplay()) { + if (!task.isOnHomeDisplay()) { return false; } - final Task rootHomeTask = rootTask.getDisplayArea().getRootHomeTask(); + final Task rootHomeTask = task.getDisplayArea().getRootHomeTask(); // Home task does not exist. Don't trim the task. if (rootHomeTask == null) { return false; 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 5d6a5c0b51677..73404eb6f0fd9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -641,7 +641,6 @@ public class RecentTasksTest extends WindowTestsBase { @Test public void testVisibleTasks_excludedFromRecents() { - mRecentTasks.setOnlyTestVisibleRange(); mRecentTasks.setParameters(-1 /* min */, 4 /* max */, -1 /* ms */); Task excludedTask1 = createTaskBuilder(".ExcludedTask1") @@ -650,15 +649,26 @@ public class RecentTasksTest extends WindowTestsBase { Task excludedTask2 = createTaskBuilder(".ExcludedTask2") .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) .build(); + Task detachedExcludedTask = createTaskBuilder(".DetachedExcludedTask") + .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + .build(); + // Move home to front so other task can satisfy the condition in RecentTasks#isTrimmable. + mRootWindowContainer.getDefaultTaskDisplayArea().getRootHomeTask().moveToFront("test"); + // Avoid Task#autoRemoveFromRecents when removing from parent. + detachedExcludedTask.setHasBeenVisible(true); + detachedExcludedTask.removeImmediately(); + assertFalse(detachedExcludedTask.isAttached()); + + mRecentTasks.add(detachedExcludedTask); mRecentTasks.add(excludedTask1); mRecentTasks.add(mTasks.get(0)); mRecentTasks.add(mTasks.get(1)); mRecentTasks.add(mTasks.get(2)); mRecentTasks.add(excludedTask2); - // The last excluded task should be trimmed, while the first-most excluded task should not - triggerTrimAndAssertTrimmed(excludedTask1); + // Except the first-most excluded task, other excluded tasks should be trimmed. + triggerTrimAndAssertTrimmed(excludedTask1, detachedExcludedTask); } @Test