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
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index b77381c..4439a24 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 @@
+ 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 @@
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);
}
}