Do not start tasks on ActivityViews unless explicit
New tasks were being started on ActivityViews because they matched packages. This fix enforces a rule that new tasks can only be started on ActivityViews if they are explicitly targeted for that ActivityView. Fixes bug 15162447. Change-Id: I9ccb72171b5cda0897a0b9ffe4cbebfbb0d92c2c
This commit is contained in:
@@ -1194,8 +1194,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
requestCode = sourceRecord.requestCode;
|
||||
sourceRecord.resultTo = null;
|
||||
if (resultRecord != null) {
|
||||
resultRecord.removeResultsLocked(
|
||||
sourceRecord, resultWho, requestCode);
|
||||
resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode);
|
||||
}
|
||||
if (sourceRecord.launchedFromUid == callingUid) {
|
||||
// The new activity is being launched from the same uid as the previous
|
||||
@@ -1334,7 +1333,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
return err;
|
||||
}
|
||||
|
||||
ActivityStack adjustStackFocus(ActivityRecord r) {
|
||||
ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) {
|
||||
final TaskRecord task = r.task;
|
||||
if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
|
||||
if (task != null) {
|
||||
@@ -1359,7 +1358,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
return container.mStack;
|
||||
}
|
||||
|
||||
if (mFocusedStack != mHomeStack) {
|
||||
if (mFocusedStack != mHomeStack && (!newTask ||
|
||||
mFocusedStack.mActivityContainer.isEligibleForNewTasks())) {
|
||||
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
|
||||
"adjustStackFocus: Have a focused stack=" + mFocusedStack);
|
||||
return mFocusedStack;
|
||||
@@ -1484,7 +1484,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
sourceStack = null;
|
||||
}
|
||||
|
||||
if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
|
||||
if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
|
||||
// For whatever reason this activity is being launched into a new
|
||||
// task... yet the caller has requested a result back. Well, that
|
||||
// is pretty messed up, so instead immediately send back a cancel
|
||||
@@ -1727,7 +1727,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
// Should this be considered a new task?
|
||||
if (r.resultTo == null && !addingToTask
|
||||
&& (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
|
||||
targetStack = adjustStackFocus(r);
|
||||
newTask = true;
|
||||
targetStack = adjustStackFocus(r, newTask);
|
||||
targetStack.moveToFront();
|
||||
if (reuseTask == null) {
|
||||
r.setTask(targetStack.createTaskRecord(getNextTaskId(),
|
||||
@@ -1739,7 +1740,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
} else {
|
||||
r.setTask(reuseTask, reuseTask, true);
|
||||
}
|
||||
newTask = true;
|
||||
if (!movedHome) {
|
||||
if ((launchFlags &
|
||||
(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
|
||||
@@ -1803,7 +1803,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
// This not being started from an existing activity, and not part
|
||||
// of a new task... just put it in the top task, though these days
|
||||
// this case should never happen.
|
||||
targetStack = adjustStackFocus(r);
|
||||
targetStack = adjustStackFocus(r, newTask);
|
||||
targetStack.moveToFront();
|
||||
ActivityRecord prev = targetStack.topActivity();
|
||||
r.setTask(prev != null ? prev.task
|
||||
@@ -2235,7 +2235,12 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
|
||||
final ActivityStack stack = stacks.get(stackNdx);
|
||||
if (!r.isApplicationActivity() && !stack.isHomeStack()) {
|
||||
if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack);
|
||||
if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (home activity) " + stack);
|
||||
continue;
|
||||
}
|
||||
if (!stack.mActivityContainer.isEligibleForNewTasks()) {
|
||||
if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (new task not allowed) " +
|
||||
stack);
|
||||
continue;
|
||||
}
|
||||
final ActivityRecord ar = stack.findTaskLocked(r);
|
||||
@@ -3131,6 +3136,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
void setDrawn() {
|
||||
}
|
||||
|
||||
// You can always start a new task on a regular ActivityStack.
|
||||
boolean isEligibleForNewTasks() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return mIdString + (mActivityDisplay == null ? "N" : "A");
|
||||
@@ -3211,6 +3221,12 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
}
|
||||
}
|
||||
|
||||
// Never start a new task on an ActivityView if it isn't explicitly specified.
|
||||
@Override
|
||||
boolean isEligibleForNewTasks() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void setSurfaceIfReady() {
|
||||
if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReady: mDrawn=" + mDrawn +
|
||||
" mContainerState=" + mContainerState + " mSurface=" + mSurface);
|
||||
|
||||
Reference in New Issue
Block a user