Do not reuse non-leaf tasks for the starting activity

TV Settings activities were started in home stack because home stack
was originally created from TV Settings FallbackHome activity. So, it
was being reused for the Settings activities.

Only looks for the reused task from leaf tasks and also not setting
task affinity on non-leaf tasks.

Bug: 154517501
Test: start Settings activities and not landing on home stack
Change-Id: I07cb0e40248fd2a37f8e9cfe71d13651aed25207
This commit is contained in:
Louis Chang
2020-05-14 13:40:16 +08:00
parent a24033d8aa
commit 87ca32eb79
3 changed files with 29 additions and 2 deletions

View File

@@ -327,7 +327,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
documentData = isDocument ? intent.getData() : null;
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + target + " in " + parent);
parent.forAllTasks(this);
parent.forAllLeafTasks(this);
}
void clear() {

View File

@@ -942,7 +942,7 @@ class Task extends WindowContainer<WindowContainer> {
return;
}
affinity = info.taskAffinity;
affinity = isLeafTask() ? info.taskAffinity : null;
if (intent == null) {
// If this task already has an intent associated with it, don't set the root
// affinity -- we don't want it changing after initially set, but the initially
@@ -3399,6 +3399,24 @@ class Task extends WindowContainer<WindowContainer> {
return callback.apply(this);
}
@Override
boolean forAllLeafTasks(Function<Task, Boolean> callback) {
boolean isLeafTask = true;
for (int i = mChildren.size() - 1; i >= 0; --i) {
final Task child = mChildren.get(i).asTask();
if (child != null) {
isLeafTask = false;
if (child.forAllLeafTasks(callback)) {
return true;
}
}
}
if (isLeafTask) {
return callback.apply(this);
}
return false;
}
@Override
Task getTask(Predicate<Task> callback, boolean traverseTopToBottom) {
final Task t = super.getTask(callback, traverseTopToBottom);

View File

@@ -1552,6 +1552,15 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return false;
}
boolean forAllLeafTasks(Function<Task, Boolean> callback) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
if (mChildren.get(i).forAllLeafTasks(callback)) {
return true;
}
}
return false;
}
/**
* For all tasks at or below this container call the callback.
*