From 77df2ee9deb5635fabb2280ada5b3f3d01dd8e1b Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Thu, 24 Oct 2013 12:47:07 -0700 Subject: [PATCH] Track window position with task position. Windows were previously ordered by TaskStack/ActivityStack order. This change provides a data structure in DisplayContent that tracks task movement. Previously Recents and Home activity windows were always adjacent because they were on the same stack. With this change windows from other activities can be placed between the two. Fixes bug 11338594. Change-Id: Ie34443ff22f330d015141d97db79370c54920d28 --- .../com/android/server/wm/DisplayContent.java | 48 +++++++++++++------ .../java/com/android/server/wm/TaskStack.java | 2 + .../server/wm/WindowManagerService.java | 8 ++-- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java index afa4f78b51de3..52f2325d3d337 100644 --- a/services/java/com/android/server/wm/DisplayContent.java +++ b/services/java/com/android/server/wm/DisplayContent.java @@ -107,7 +107,7 @@ class DisplayContent { Region mTouchExcludeRegion = new Region(); /** Save allocating when retrieving tasks */ - ArrayList mTmpTasks = new ArrayList(); + ArrayList mTaskHistory = new ArrayList(); /** Save allocating when calculating rects */ Rect mTmpRect = new Rect(); @@ -163,7 +163,7 @@ class DisplayContent { void moveStack(TaskStack stack, boolean toTop) { mStackHistory.remove(stack); mStackHistory.add(toTop ? mStackHistory.size() : 0, stack); - mService.moveStackWindowsLocked(stack); + mService.moveStackWindowsLocked(this); } public boolean isPrivate() { @@ -175,14 +175,35 @@ class DisplayContent { * @return All the Tasks, in order, on this display. */ ArrayList getTasks() { - mTmpTasks.clear(); - final int numStacks = mStackHistory.size(); - for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - mTmpTasks.addAll(mStackHistory.get(stackNdx).getTasks()); + return mTaskHistory; + } + + void addTask(Task task, boolean toTop) { + mTaskHistory.remove(task); + + final int userId = task.mUserId; + int taskNdx; + final int numTasks = mTaskHistory.size(); + if (toTop) { + for (taskNdx = numTasks - 1; taskNdx >= 0; --taskNdx) { + if (mTaskHistory.get(taskNdx).mUserId == userId) { + break; + } + } + ++taskNdx; + } else { + for (taskNdx = 0; taskNdx < numTasks; ++taskNdx) { + if (mTaskHistory.get(taskNdx).mUserId == userId) { + break; + } + } } - if (WindowManagerService.DEBUG_LAYERS) Slog.i(TAG, "getTasks: mStackHistory=" + - mStackHistory); - return mTmpTasks; + + mTaskHistory.add(taskNdx, task); + } + + void removeTask(Task task) { + mTaskHistory.remove(task); } TaskStack getHomeStack() { @@ -205,10 +226,9 @@ class DisplayContent { /** @return The number of tokens in all of the Tasks on this display. */ int numTokens() { - getTasks(); int count = 0; - for (int taskNdx = mTmpTasks.size() - 1; taskNdx >= 0; --taskNdx) { - count += mTmpTasks.get(taskNdx).mAppTokens.size(); + for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { + count += mTaskHistory.get(taskNdx).mAppTokens.size(); } return count; } @@ -469,8 +489,8 @@ class DisplayContent { pw.println(); pw.println(" Application tokens in Z order:"); getTasks(); - for (int taskNdx = mTmpTasks.size() - 1; taskNdx >= 0; --taskNdx) { - AppTokenList tokens = mTmpTasks.get(taskNdx).mAppTokens; + for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { + AppTokenList tokens = mTaskHistory.get(taskNdx).mAppTokens; for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { final AppWindowToken wtoken = tokens.get(tokenNdx); pw.print(" App #"); pw.print(ndx--); diff --git a/services/java/com/android/server/wm/TaskStack.java b/services/java/com/android/server/wm/TaskStack.java index 2347a19f40945..34bef68aeb7c9 100644 --- a/services/java/com/android/server/wm/TaskStack.java +++ b/services/java/com/android/server/wm/TaskStack.java @@ -120,6 +120,7 @@ public class TaskStack { mTasks.add(stackNdx, task); task.mStack = this; + mDisplayContent.addTask(task, toTop); return mDisplayContent.moveHomeStackBox(mStackId == HOME_STACK_ID); } @@ -145,6 +146,7 @@ public class TaskStack { if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "removeTask: task=" + task); mStackBox.makeDirty(); mTasks.remove(task); + mDisplayContent.removeTask(task); } int remove() { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index abc2b2b998e7b..4fe204c1d8624 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -4733,11 +4733,9 @@ public class WindowManagerService extends IWindowManager.Stub return index; } - void moveStackWindowsLocked(TaskStack stack) { - DisplayContent displayContent = stack.getDisplayContent(); - + void moveStackWindowsLocked(DisplayContent displayContent) { // First remove all of the windows from the list. - final ArrayList tasks = stack.getTasks(); + final ArrayList tasks = displayContent.getTasks(); final int numTasks = tasks.size(); for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) { AppTokenList tokens = tasks.get(taskNdx).mAppTokens; @@ -4813,7 +4811,7 @@ public class WindowManagerService extends IWindowManager.Stub } final TaskStack stack = task.mStack; stack.moveTaskToBottom(task); - moveStackWindowsLocked(stack); + moveStackWindowsLocked(stack.getDisplayContent()); } } finally { Binder.restoreCallingIdentity(origId);