From c790b6c65a964345017d397c08ac8958e3621914 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 19 Mar 2018 11:23:25 -0700 Subject: [PATCH] Fix issue with multiple recent tasks showing after restarting the device - A task's activity type is not persisted to disk, so a strict activity type comparison will fail to find and remove a reloaded task in the recents list. Instead, check for a compatible activity type (which accounts for a task with an undefined type) Bug: 75286152 Test: atest FrameworksServicesTests:RecentTasksTest Test: atest FrameworksServicesTests:TaskPersisterTest Change-Id: I3a858ebcdaca310bcc9acbcd4167a62a88466743 --- .../com/android/server/am/RecentTasks.java | 4 +-- .../android/server/am/RecentTasksTest.java | 33 +++++++++++++++++-- .../android/server/am/TaskPersisterTest.java | 3 ++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index fc8b624f6b7e6..3cb36ea58b79c 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -1239,15 +1239,13 @@ class RecentTasks { */ private int findRemoveIndexForAddTask(TaskRecord task) { final int recentsCount = mTasks.size(); - final int taskActivityType = task.getActivityType(); final Intent intent = task.intent; final boolean document = intent != null && intent.isDocument(); int maxRecents = task.maxRecents - 1; for (int i = 0; i < recentsCount; i++) { final TaskRecord tr = mTasks.get(i); - final int trActivityType = tr.getActivityType(); if (task != tr) { - if (taskActivityType != trActivityType || task.userId != tr.userId) { + if (!task.hasCompatibleActivityType(tr)) { continue; } final Intent trIntent = tr.intent; diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java index 376f5b1937164..77653872e5ee8 100644 --- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java +++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java @@ -42,11 +42,13 @@ import static java.lang.Integer.MAX_VALUE; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; import android.app.ActivityManager.RunningTaskInfo; +import android.app.WindowConfiguration; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.UserInfo; +import android.content.res.Configuration; import android.graphics.Rect; import android.os.Bundle; import android.os.Debug; @@ -101,8 +103,8 @@ public class RecentTasksTest extends ActivityTestsBase { private TestRecentTasks mRecentTasks; private TestRunningTasks mRunningTasks; - private static ArrayList mTasks = new ArrayList<>(); - private static ArrayList mSameDocumentTasks = new ArrayList<>(); + private ArrayList mTasks; + private ArrayList mSameDocumentTasks; private CallbacksRecorder mCallbacksRecorder; @@ -155,12 +157,14 @@ public class RecentTasksTest extends ActivityTestsBase { mRecentTasks.registerCallback(mCallbacksRecorder); QUIET_USER_INFO.flags = UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE; + mTasks = new ArrayList<>(); mTasks.add(createTaskBuilder(".Task1").build()); mTasks.add(createTaskBuilder(".Task2").build()); mTasks.add(createTaskBuilder(".Task3").build()); mTasks.add(createTaskBuilder(".Task4").build()); mTasks.add(createTaskBuilder(".Task5").build()); + mSameDocumentTasks = new ArrayList<>(); mSameDocumentTasks.add(createDocumentTask(".DocumentTask1")); mSameDocumentTasks.add(createDocumentTask(".DocumentTask1")); } @@ -294,7 +298,32 @@ public class RecentTasksTest extends ActivityTestsBase { assertTrue(mCallbacksRecorder.added.contains(task2)); assertTrue(mCallbacksRecorder.trimmed.isEmpty()); assertTrue(mCallbacksRecorder.removed.isEmpty()); + } + @Test + public void testAddTaskCompatibleActivityType_expectRemove() throws Exception { + Configuration config1 = new Configuration(); + config1.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED); + TaskRecord task1 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .setStack(mStack) + .build(); + task1.onConfigurationChanged(config1); + assertTrue(task1.getActivityType() == ACTIVITY_TYPE_UNDEFINED); + mRecentTasks.add(task1); + mCallbacksRecorder.clear(); + + TaskRecord task2 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .setStack(mStack) + .build(); + assertTrue(task2.getActivityType() == ACTIVITY_TYPE_STANDARD); + mRecentTasks.add(task2); + assertTrue(mCallbacksRecorder.added.size() == 1); + assertTrue(mCallbacksRecorder.added.contains(task2)); + assertTrue(mCallbacksRecorder.trimmed.isEmpty()); + assertTrue(mCallbacksRecorder.removed.size() == 1); + assertTrue(mCallbacksRecorder.removed.contains(task1)); } @Test diff --git a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java index ea207f1f19101..9e6055d55e0f1 100644 --- a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java +++ b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java @@ -29,6 +29,9 @@ import com.android.server.am.TaskPersister; import java.io.File; import java.util.Random; +/** + * atest FrameworksServicesTests:TaskPersisterTest + */ public class TaskPersisterTest extends AndroidTestCase { private static final String TEST_USER_NAME = "AM-Test-User";