summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andrii Kulian <akulian@google.com> 2016-06-28 16:34:02 -0700
committer Andrii Kulian <akulian@google.com> 2016-07-01 01:02:47 +0000
commitdc0f8933da69f7d462bf256f34f5e9d6dab653f5 (patch)
tree4c204fb03c3ca247758a0621c73b9b948c826f6a
parent15783f00736899776e749d2ae93140caffa5ec40 (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.java8
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java6
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)) {