diff options
| author | 2016-06-28 16:34:02 -0700 | |
|---|---|---|
| committer | 2016-07-01 01:02:47 +0000 | |
| commit | dc0f8933da69f7d462bf256f34f5e9d6dab653f5 (patch) | |
| tree | 4c204fb03c3ca247758a0621c73b9b948c826f6a | |
| parent | 15783f00736899776e749d2ae93140caffa5ec40 (diff) | |
Don't update task to return to type for last task over home
Resizing docked stack to fullscreen size results in dismissal of
docked stack and moving of tasks to fullscreen stack. When tasks,
which were originally launched from home or recents, are inserted
on top of fullscreen stack, their mTaskToReturnTo value was
overwritten.
This CL doesn't allow to overwrite this field of task if there is
no next task in stack and it was launched from home or recents.
Also this reveals issue b/29342752. When app is moved to PiP mode,
system UI shows another overlay activity in separate task in PiP
stack with hint to user. In ActivityStarter#startActivityUnchecked
some logic assumes that new activity is launched from focused stack.
But PiP stack is not focusable, so we end up thinking that overlay
activity was launched from home stack. This sets mTaskToReturnTo of
overlay task to HOME_ACTIVITY_TYPE instead of
APPLICATION_ACTIVITY_TYPE.
This CL checks if stack id is specified and checks preferred stack
if available instead of currently focused one.
Bug: 29237751
Change-Id: I3a55b84d6a57be758705db51dec60592683e4e02
| -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 4ead64b6915b..35a22f3abd94 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 7b3f65a728bf..1b62dbcacd77 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1095,7 +1095,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)) { |