Make detached task trimmable

Otherwise Task#isOnHomeDisplay also returns false for a detached
task, which causes a task without activities is not trimmable
even if it is exclude-from-recent.

Fix: 185481296
Test: atest RecentTasksTest#testVisibleTasks_excludedFromRecents
Change-Id: I66d494376bc750563b914b18e9f4a999913c70e9
This commit is contained in:
Riddle Hsu
2021-04-16 17:16:30 +08:00
parent e356c06ba5
commit b0267bd0c5
2 changed files with 17 additions and 9 deletions

View File

@@ -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;

View File

@@ -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