summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java14
-rw-r--r--services/core/java/com/android/server/wm/Task.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java27
3 files changed, 37 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index aea0a58c9acb..9f68d627622c 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -1586,7 +1586,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
hasBeenLaunched = false;
mStackSupervisor = supervisor;
- info.taskAffinity = getTaskAffinityWithUid(info.taskAffinity, info.applicationInfo.uid);
+ info.taskAffinity = computeTaskAffinity(info.taskAffinity, info.applicationInfo.uid,
+ launchMode);
taskAffinity = info.taskAffinity;
final String uid = Integer.toString(info.applicationInfo.uid);
if (info.windowLayout != null && info.windowLayout.windowLayoutAffinity != null
@@ -1647,17 +1648,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
/**
- * Generate the task affinity with uid. For b/35954083, Limit task affinity to uid to avoid
- * issues associated with sharing affinity across uids.
+ * Generate the task affinity with uid and activity launch mode. For b/35954083, Limit task
+ * affinity to uid to avoid issues associated with sharing affinity across uids.
*
* @param affinity The affinity of the activity.
* @param uid The user-ID that has been assigned to this application.
- * @return The task affinity with uid.
+ * @param launchMode The activity launch mode
+ * @return The task affinity
*/
- static String getTaskAffinityWithUid(String affinity, int uid) {
+ static String computeTaskAffinity(String affinity, int uid, int launchMode) {
final String uidStr = Integer.toString(uid);
if (affinity != null && !affinity.startsWith(uidStr)) {
- affinity = uidStr + ":" + affinity;
+ affinity = uidStr + (launchMode == LAUNCH_SINGLE_INSTANCE ? "-si:" : ":") + affinity;
}
return affinity;
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 5606eb676b1d..70fd860f21f2 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -6637,7 +6637,8 @@ class Task extends WindowContainer<WindowContainer> {
// Basic case: for simple app-centric recents, we need to recreate
// the task if the affinity has changed.
- final String affinity = ActivityRecord.getTaskAffinityWithUid(destAffinity, srec.getUid());
+ final String affinity = ActivityRecord.computeTaskAffinity(destAffinity, srec.getUid(),
+ srec.launchMode);
if (srec == null || srec.getTask().affinity == null
|| !srec.getTask().affinity.equals(affinity)) {
return true;
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 54c7f271e81b..9954f484f0a6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -28,6 +28,8 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
+import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -447,6 +449,31 @@ public class RecentTasksTest extends WindowTestsBase {
}
@Test
+ public void testRemoveAffinityTask() {
+ // Add task to recents
+ final String taskAffinity = "affinity";
+ final int uid = 10123;
+ final Task task1 = createTaskBuilder(".Task1").setStack(mStack).build();
+ task1.affinity = ActivityRecord.computeTaskAffinity(taskAffinity, uid, LAUNCH_MULTIPLE);
+ mRecentTasks.add(task1);
+
+ // Add another task to recents, and make sure the previous task was removed.
+ final Task task2 = createTaskBuilder(".Task2").setStack(mStack).build();
+ task2.affinity = ActivityRecord.computeTaskAffinity(taskAffinity, uid, LAUNCH_MULTIPLE);
+ mRecentTasks.add(task2);
+ assertEquals(1, mRecentTasks.getRecentTasks(MAX_VALUE, 0 /* flags */,
+ true /* getTasksAllowed */, TEST_USER_0_ID, 0).getList().size());
+
+ // Add another single-instance task to recents, and make sure no task is removed.
+ final Task task3 = createTaskBuilder(".Task3").setStack(mStack).build();
+ task3.affinity = ActivityRecord.computeTaskAffinity(taskAffinity, uid,
+ LAUNCH_SINGLE_INSTANCE);
+ mRecentTasks.add(task3);
+ assertEquals(2, mRecentTasks.getRecentTasks(MAX_VALUE, 0 /* flags */,
+ true /* getTasksAllowed */, TEST_USER_0_ID, 0).getList().size());
+ }
+
+ @Test
public void testAddTasksHomeClearUntrackedTasks_expectFinish() {
// There may be multiple tasks with the same base intent by flags (FLAG_ACTIVITY_NEW_TASK |
// FLAG_ACTIVITY_MULTIPLE_TASK). If the previous task is still active, it should be removed