From c215a4fb2f6ef739e3f1a8d627bca3a3a063b879 Mon Sep 17 00:00:00 2001 From: riddle_hsu Date: Sat, 27 Dec 2014 12:10:45 +0800 Subject: [PATCH] [ActivityManager] Set appropriate relation of task to home All below cases should return to home but the top will be Settings. The initial steps are 1.Launch Settings from home 2.Press home key 3.Launch activity A in task X from home Case 1 4.A starts activity B in task Y and calls moveTaskToBack Case 2 4.A starts activity B in task X and calls moveTaskToBack 5.B calls finish Case 3 4.A launches activity B in task Y 5.B launches A with NEW_TASK (bring existed task) 6.A calls finish return to B 7.B calls finish Case 4 4.A launches activity B in task X 5.B launches C in task X 6.C launches A with flag NEW_TASK and CLEAR_TOP 7.A calls finish Solution: Transfer return-to to next adjacent task. Change-Id: Icdad980eec64e081d15679600da07cf4431e40d6 --- .../com/android/server/am/ActivityStack.java | 36 +++++++++++++++++-- 1 file changed, 34 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 0c23e585fa380..4714ed1c310f2 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1927,9 +1927,31 @@ final class ActivityStack { return true; } + private TaskRecord getNextTask(TaskRecord targetTask) { + final int index = mTaskHistory.indexOf(targetTask); + if (index >= 0) { + final int numTasks = mTaskHistory.size(); + for (int i = index + 1; i < numTasks; ++i) { + TaskRecord task = mTaskHistory.get(i); + if (task.userId == targetTask.userId) { + return task; + } + } + } + return null; + } + private void insertTaskAtTop(TaskRecord task) { + // 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()); + } + } + // If this is being moved to the top by another activity or being launched from the home - // activity, set mOnTopOfHome accordingly. + // activity, set mTaskToReturnTo accordingly. if (isOnHomeDisplay()) { ActivityStack lastStack = mStackSupervisor.getLastStack(); final boolean fromHome = lastStack.isHomeStack(); @@ -3588,6 +3610,15 @@ final class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare to back transition: task=" + taskId); + boolean prevIsHome = false; + if (tr.isOverHomeStack()) { + final TaskRecord nextTask = getNextTask(tr); + if (nextTask != null) { + nextTask.setTaskToReturnTo(tr.getTaskToReturnTo()); + } else { + prevIsHome = true; + } + } mTaskHistory.remove(tr); mTaskHistory.add(0, tr); updateTaskMovement(tr, false); @@ -3623,7 +3654,8 @@ final class ActivityStack { } final TaskRecord task = mResumedActivity != null ? mResumedActivity.task : null; - if (task == tr && tr.isOverHomeStack() || numTasks <= 1 && isOnHomeDisplay()) { + if (prevIsHome || task == tr && tr.isOverHomeStack() + || numTasks <= 1 && isOnHomeDisplay()) { if (!mService.mBooting && !mService.mBooted) { // Not ready yet! return false;