From dc0f8933da69f7d462bf256f34f5e9d6dab653f5 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Tue, 28 Jun 2016 16:34:02 -0700 Subject: 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 --- services/core/java/com/android/server/am/ActivityStack.java | 8 +++++++- 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)) { -- cgit v1.2.3-59-g8ed1b