summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chong Zhang <chz@google.com> 2016-08-05 20:14:27 +0000
committer android-build-merger <android-build-merger@google.com> 2016-08-05 20:14:27 +0000
commita7250e4291043e40149cdebb8ea6a98288df61e1 (patch)
treedb28ad329d381d85377860ae426f8de40ec392fe
parent29b3931615d14876d44a10bb4d05fc79e8181e0a (diff)
parentc35df3de2f8a56f83c5019d85e7100cf8ce1d94e (diff)
Fix WM missing stack/task when activity is force stopped and restarted am: d9d35bdfcf
am: c35df3de2f Change-Id: I9ca53012b924278e32465536ad12b98dd887ac9a
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java17
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java10
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java18
3 files changed, 37 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index e31df57f56d4..ece1ee95f320 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -781,20 +781,25 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
}
+ static int nextTaskIdForUser(int taskId, int userId) {
+ int nextTaskId = taskId + 1;
+ if (nextTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) {
+ // Wrap around as there will be smaller task ids that are available now.
+ nextTaskId -= MAX_TASK_IDS_PER_USER;
+ }
+ return nextTaskId;
+ }
+
int getNextTaskIdForUserLocked(int userId) {
final int currentTaskId = mCurTaskIdForUser.get(userId, userId * MAX_TASK_IDS_PER_USER);
// for a userId u, a taskId can only be in the range
// [u*MAX_TASK_IDS_PER_USER, (u+1)*MAX_TASK_IDS_PER_USER-1], so if MAX_TASK_IDS_PER_USER
// was 10, user 0 could only have taskIds 0 to 9, user 1: 10 to 19, user 2: 20 to 29, so on.
- int candidateTaskId = currentTaskId;
+ int candidateTaskId = nextTaskIdForUser(currentTaskId, userId);
while (mRecentTasks.taskIdTakenForUserLocked(candidateTaskId, userId)
|| anyTaskForIdLocked(candidateTaskId, !RESTORE_FROM_RECENTS,
INVALID_STACK_ID) != null) {
- candidateTaskId++;
- if (candidateTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) {
- // Wrap around as there will be smaller task ids that are available now.
- candidateTaskId -= MAX_TASK_IDS_PER_USER;
- }
+ candidateTaskId = nextTaskIdForUser(candidateTaskId, userId);
if (candidateTaskId == currentTaskId) {
// Something wrong!
// All MAX_TASK_IDS_PER_USER task ids are taken up by running tasks for this user
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index fba439f8ca60..1d57872b2fbc 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -191,6 +191,16 @@ class DisplayContent {
return mHomeStack;
}
+ TaskStack getStackById(int stackId) {
+ for (int i = mStacks.size() - 1; i >= 0; --i) {
+ final TaskStack stack = mStacks.get(i);
+ if (stack.mStackId == stackId) {
+ return stack;
+ }
+ }
+ return null;
+ }
+
void updateDisplayInfo() {
mDisplay.getDisplayInfo(mDisplayInfo);
mDisplay.getMetrics(mDisplayMetrics);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 10aaf5811e3c..c66f09cd792e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -5047,18 +5047,32 @@ public class WindowManagerService extends IWindowManager.Stub
try {
synchronized (mWindowMap) {
final DisplayContent displayContent = mDisplayContents.get(displayId);
+ boolean attachedToDisplay = false;
if (displayContent != null) {
TaskStack stack = mStackIdToStack.get(stackId);
if (stack == null) {
if (DEBUG_STACK) Slog.d(TAG_WM, "attachStack: stackId=" + stackId);
- stack = new TaskStack(this, stackId);
+
+ stack = displayContent.getStackById(stackId);
+ if (stack != null) {
+ // It's already attached to the display. Detach and re-attach
+ // because onTop might change, and be sure to clear mDeferDetach!
+ displayContent.detachStack(stack);
+ stack.mDeferDetach = false;
+ attachedToDisplay = true;
+ } else {
+ stack = new TaskStack(this, stackId);
+ }
+
mStackIdToStack.put(stackId, stack);
if (stackId == DOCKED_STACK_ID) {
getDefaultDisplayContentLocked().mDividerControllerLocked
.notifyDockedStackExistsChanged(true);
}
}
- stack.attachDisplayContent(displayContent);
+ if (!attachedToDisplay) {
+ stack.attachDisplayContent(displayContent);
+ }
displayContent.attachStack(stack, onTop);
if (stack.getRawFullscreen()) {
return null;