diff options
5 files changed, 26 insertions, 44 deletions
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 4e9770028d84..98bb35740eb7 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -487,7 +487,7 @@ final class ActivityRecord { void setTask(TaskRecord newTask, ThumbnailHolder newThumbHolder, boolean isRoot) { if (task != null && task.removeActivity(this)) { if (task != newTask) { - mStackSupervisor.removeTask(task); + task.stack.removeTask(task); } else { Slog.d(TAG, "!!! REMOVE THIS LOG !!! setTask: nearly removed stack=" + (newTask == null ? null : newTask.stack)); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index ca6a649b4f87..287765d2db2d 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2711,7 +2711,7 @@ final class ActivityStack { r.finishLaunchTickingLocked(); } - final void removeActivityFromHistoryLocked(ActivityRecord r) { + private void removeActivityFromHistoryLocked(ActivityRecord r) { finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null); r.makeFinishing(); if (DEBUG_ADD_REMOVE) { @@ -2726,7 +2726,7 @@ final class ActivityStack { if (mStackSupervisor.isFrontStack(this) && task == topTask() && task.mOnTopOfHome) { mStackSupervisor.moveHomeToTop(); } - mStackSupervisor.removeTask(task); + removeTask(task); } r.takeFromHistory(); removeTimeoutsForActivityLocked(r); @@ -3633,14 +3633,28 @@ final class ActivityStack { return starting; } - boolean removeTask(TaskRecord task) { + void removeTask(TaskRecord task) { + mWindowManager.removeTask(task.taskId); + final ActivityRecord r = mResumedActivity; + if (r != null && r.task == task) { + mResumedActivity = null; + } + final int taskNdx = mTaskHistory.indexOf(task); final int topTaskNdx = mTaskHistory.size() - 1; if (task.mOnTopOfHome && taskNdx < topTaskNdx) { mTaskHistory.get(taskNdx + 1).mOnTopOfHome = true; } mTaskHistory.remove(task); - return mTaskHistory.isEmpty(); + + if (mTaskHistory.isEmpty()) { + if (DEBUG_STACK) Slog.i(TAG, "removeTask: moving to back stack=" + this); + if (isOnHomeDisplay()) { + mStackSupervisor.moveHomeStack(!isHomeStack()); + } + mStacks.remove(this); + mStacks.add(0, this); + } } TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent, boolean toTop) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 7c3e4741b065..6ab59a7d29a5 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -364,25 +364,6 @@ public final class ActivityStackSupervisor implements DisplayListener { return mCurTaskId; } - void removeTask(TaskRecord task) { - mWindowManager.removeTask(task.taskId); - final ActivityStack stack = task.stack; - final ActivityRecord r = stack.mResumedActivity; - if (r != null && r.task == task) { - stack.mResumedActivity = null; - } - if (stack.removeTask(task) && !stack.isHomeStack()) { - if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack); - stack.mActivityContainer.detachLocked(); - final int stackId = stack.mStackId; - final int nextStackId = mWindowManager.removeStack(stackId); - // TODO: Perhaps we need to let the ActivityManager determine the next focus... - if (stack.isOnHomeDisplay()) { - mFocusedStack = getStack(nextStackId); - } - } - } - ActivityRecord resumedAppLocked() { ActivityStack stack = getFocusedStack(); if (stack == null) { @@ -2184,7 +2165,7 @@ public final class ActivityStackSupervisor implements DisplayListener { Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); return; } - removeTask(task); + task.stack.removeTask(task); stack.addTask(task, toTop); mWindowManager.addTask(taskId, stackId, toTop); resumeTopActivitiesLocked(); diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index ef245f9d123a..aa6b0c9d8a52 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -191,14 +191,18 @@ public class TaskStack { } /** - * Delete a Task from this stack. If it is the last Task in the stack, remove this stack from - * its parent StackBox and merge the parent. + * Delete a Task from this stack. If it is the last Task in the stack, move this stack to the + * back. * @param task The Task to delete. */ void removeTask(Task task) { if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "removeTask: task=" + task); mTasks.remove(task); mDisplayContent.removeTask(task); + if (mTasks.isEmpty()) { + mDisplayContent.moveStack(this, false); + } + mDisplayContent.layoutNeeded = true; } int remove() { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f3b040ed71d4..7889247750c7 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4836,23 +4836,6 @@ public class WindowManagerService extends IWindowManager.Stub } } - public int removeStack(int stackId) { - synchronized (mWindowMap) { - final TaskStack stack = mStackIdToStack.get(stackId); - if (stack != null) { - mStackIdToStack.delete(stackId); - int nextStackId = stack.remove(); - stack.getDisplayContent().layoutNeeded = true; - requestTraversalLocked(); - if (nextStackId > HOME_STACK_ID) { - return nextStackId; - } - } - if (DEBUG_STACK) Slog.i(TAG, "removeStack: could not find stackId=" + stackId); - } - return HOME_STACK_ID; - } - public void removeTask(int taskId) { synchronized (mWindowMap) { Task task = mTaskIdToTask.get(taskId); |