diff options
-rw-r--r-- | services/core/java/com/android/server/am/ActivityStack.java | 8 | ||||
-rw-r--r-- | services/core/java/com/android/server/am/ActivityStarter.java | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index fc649a1ea140..994c3dec0aad 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2587,11 +2587,14 @@ final class ActivityStack { } private void insertTaskAtTop(TaskRecord task, ActivityRecord newActivity) { + boolean isLastTaskOverHome = false; // If the moving task is over home stack, transfer its return type to next task if (task.isOverHomeStack()) { final TaskRecord nextTask = getNextTask(task); if (nextTask != null) { nextTask.setTaskToReturnTo(task.getTaskToReturnTo()); + } else { + isLastTaskOverHome = true; } } @@ -2601,7 +2604,10 @@ final class ActivityStack { ActivityStack lastStack = mStackSupervisor.getLastStack(); final boolean fromHome = lastStack.isHomeStack(); if (!isHomeStack() && (fromHome || topTask() != task)) { - int returnToType = APPLICATION_ACTIVITY_TYPE; + // If it's a last task over home - we default to keep its return to type not to + // make underlying task focused when this one will be finished. + int returnToType = isLastTaskOverHome + ? task.getTaskToReturnTo() : APPLICATION_ACTIVITY_TYPE; if (fromHome && StackId.allowTopTaskToReturnHome(mStackId)) { returnToType = lastStack.topTask() == null ? HOME_ACTIVITY_TYPE : lastStack.topTask().taskType; diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 77b450fe1fd4..53289be4294a 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1121,7 +1121,11 @@ class ActivityStarter { return START_RETURN_LOCK_TASK_MODE_VIOLATION; } if (!mMovedOtherTask) { - updateTaskReturnToType(mStartActivity.task, mLaunchFlags, topStack); + // If stack id is specified in activity options, usually it means that activity is + // launched not from currently focused stack (e.g. from SysUI or from shell) - in + // that case we check the target stack. + updateTaskReturnToType(mStartActivity.task, mLaunchFlags, + preferredLaunchStackId != INVALID_STACK_ID ? mTargetStack : topStack); } } else if (mSourceRecord != null) { if (mSupervisor.isLockTaskModeViolation(mSourceRecord.task)) { |