[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
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user