From 206b9faa09ada62ce07026301723805b687e9892 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Thu, 2 Jun 2016 13:18:01 -0700 Subject: [PATCH] Fix task selection logic When task was selected for activity launched with flag FLAG_ACTIVITY_NEW_TASK first matching task was omitted if there was another match lower in stack. This lead to task shuffling in same stack. Bug: 28848683 Change-Id: I94e55693fc7ed926fc151ba988d257bd2417dd45 --- .../com/android/server/am/ActivityStack.java | 23 ++++++++++--------- .../android/server/am/ActivityStarter.java | 2 +- .../com/android/server/am/TaskRecord.java | 4 ++-- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index b77381c6bae20..4439a24a4b077 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -785,17 +785,8 @@ final class ActivityStack { + taskIntent.getComponent().flattenToShortString() + "/aff=" + r.task.rootAffinity + " to new cls=" + intent.getComponent().flattenToShortString() + "/aff=" + info.taskAffinity); - if (!isDocument && !taskIsDocument - && result.r == null && task.canMatchRootAffinity()) { - if (task.rootAffinity.equals(target.taskAffinity)) { - if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!"); - // It is possible for multiple tasks to have the same root affinity especially - // if they are in separate stacks. We save off this candidate, but keep looking - // to see if there is a better candidate. - result.r = r; - result.matchedByRootAffinity = true; - } - } else if (taskIntent != null && taskIntent.getComponent() != null && + // TODO Refactor to remove duplications. Check if logic can be simplified. + if (taskIntent != null && taskIntent.getComponent() != null && taskIntent.getComponent().compareTo(cls) == 0 && Objects.equals(documentData, taskDocumentData)) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!"); @@ -815,6 +806,16 @@ final class ActivityStack { result.r = r; result.matchedByRootAffinity = false; break; + } else if (!isDocument && !taskIsDocument + && result.r == null && task.canMatchRootAffinity()) { + if (task.rootAffinity.equals(target.taskAffinity)) { + if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!"); + // It is possible for multiple tasks to have the same root affinity especially + // if they are in separate stacks. We save off this candidate, but keep looking + // to see if there is a better candidate. + result.r = r; + result.matchedByRootAffinity = true; + } } else if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Not a match: " + task); } } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 710193776b873..858fe543cc8d4 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1556,7 +1556,7 @@ class ActivityStarter { } intentActivity.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); - } else if (!intentActivity.task.isSameIntentResolution(mStartActivity)) { + } else if (!intentActivity.task.isSameIntentFilter(mStartActivity)) { // In this case we are launching the root activity of the task, but with a // different intent. We should start a new instance on top. mAddingToTask = true; diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 578fc44e7832d..8932e4bbafc4f 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -492,10 +492,10 @@ final class TaskRecord { } /** - * Return true if the input activity has the same intent resolution as the intent this task + * Return true if the input activity has the same intent filter as the intent this task * record is based on (normally the root activity intent). */ - boolean isSameIntentResolution(ActivityRecord r) { + boolean isSameIntentFilter(ActivityRecord r) { final Intent intent = new Intent(r.intent); // Correct the activity intent for aliasing. The task record intent will always be based on // the real activity that will be launched not the alias, so we need to use an intent with