Loading services/core/java/com/android/server/wm/RecentTasks.java +5 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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 Loading @@ -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 Loading services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +7 −3 Original line number Diff line number Diff line Loading @@ -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()); } Loading Loading
services/core/java/com/android/server/wm/RecentTasks.java +5 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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 Loading @@ -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 Loading
services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +7 −3 Original line number Diff line number Diff line Loading @@ -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()); } Loading