summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/RecentTasks.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java10
2 files changed, 12 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 1b58fc1d2d3e..851b533a550d 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -1426,8 +1426,8 @@ class RecentTasks {
private void removeUnreachableHiddenTasks(int windowingMode) {
for (int i = mHiddenTasks.size() - 1; i >= 0; i--) {
final Task hiddenTask = mHiddenTasks.get(i);
- if (!hiddenTask.hasChild()) {
- // The task was removed by other path.
+ if (!hiddenTask.hasChild() || hiddenTask.inRecents) {
+ // The task was removed by other path or it became reachable (added to recents).
mHiddenTasks.remove(i);
continue;
}
@@ -1449,6 +1449,9 @@ class RecentTasks {
* of task as the given one.
*/
private void removeForAddTask(Task task) {
+ // The adding task will be in recents so it is not hidden.
+ mHiddenTasks.remove(task);
+
final int removeIndex = findRemoveIndexForAddTask(task);
if (removeIndex == -1) {
// Nothing to trim
@@ -1460,8 +1463,6 @@ class RecentTasks {
// callbacks here.
final Task removedTask = mTasks.remove(removeIndex);
if (removedTask != task) {
- // The added task is in recents so it is not hidden.
- mHiddenTasks.remove(task);
if (removedTask.hasChild()) {
// A non-empty task is replaced by a new task. Because the removed task is no longer
// managed by the recent tasks list, add it to the hidden list to prevent the task
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 5005c07832ab..fd169018782b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -464,15 +464,19 @@ public class RecentTasksTest extends ActivityTestsBase {
mRecentTasks.add(task1);
final Task task2 = taskBuilder.apply(true /* visible */);
mRecentTasks.add(task2);
- // Only the last task is kept in recents and the previous 2 tasks will becomes untracked
+ final Task task3 = createTaskBuilder(className).build();
+ mRecentTasks.add(task3);
+ // Only the last added task is kept in recents and the previous 2 tasks will become hidden
// tasks because their intents are identical.
- mRecentTasks.add(createTaskBuilder(className).build());
+ mRecentTasks.add(task1);
// Go home to trigger the removal of untracked tasks.
mRecentTasks.add(createTaskBuilder(".Home").setStack(mTaskContainer.getRootHomeTask())
.build());
+ // The task was added into recents again so it is not hidden and shouldn't be removed.
+ assertNotNull(task1.getTopNonFinishingActivity());
// All activities in the invisible task should be finishing or removed.
- assertNull(task1.getTopNonFinishingActivity());
+ assertNull(task3.getTopNonFinishingActivity());
// The visible task should not be affected.
assertNotNull(task2.getTopNonFinishingActivity());
}