From 4f1df4faed1300699bdda4ac9435532c0743ecf8 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Tue, 15 Oct 2013 15:44:14 -0700 Subject: Restore window manager stack order on user switch. Only the activity stacks were being restored. Also add needed debug logs. Fixes bug 11223831. Change-Id: Ief42688721c49e8cea14277619c797bf7c25b859 --- .../java/com/android/server/am/ActivityStack.java | 9 ++++++--- .../android/server/am/ActivityStackSupervisor.java | 21 +++++++++++++-------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 77f874fa341c..d50246032353 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -551,9 +551,6 @@ final class ActivityStack { * Move the activities around in the stack to bring a user to the foreground. */ final void switchUserLocked(int userId) { - if (VALIDATE_TOKENS) { - validateAppTokensLocked(); - } if (mCurrentUser == userId) { return; } @@ -564,11 +561,16 @@ final class ActivityStack { for (int i = 0; i < index; ++i) { TaskRecord task = mTaskHistory.get(i); if (task.userId == userId) { + if (DEBUG_TASKS) Slog.d(TAG, "switchUserLocked: stack=" + getStackId() + + " moving " + task + " to top"); mTaskHistory.remove(i); mTaskHistory.add(task); --index; } } + if (VALIDATE_TOKENS) { + validateAppTokensLocked(); + } } void minimalResumeActivityLocked(ActivityRecord r) { @@ -2951,6 +2953,7 @@ final class ActivityStack { for (int taskNdx = top; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); if (task.isHomeTask()) { + if (DEBUG_TASKS || DEBUG_STACK) Slog.d(TAG, "moveHomeTaskToTop: moving " + task); mTaskHistory.remove(taskNdx); mTaskHistory.add(top, task); mWindowManager.moveTaskToTop(task.taskId); diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java index 040f0ac5581a..da9c4e8277a1 100644 --- a/services/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/java/com/android/server/am/ActivityStackSupervisor.java @@ -68,9 +68,8 @@ import android.os.SystemClock; import android.os.UserHandle; import android.util.EventLog; import android.util.Slog; -import android.util.SparseArray; +import android.util.SparseIntArray; -import android.util.SparseBooleanArray; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.os.TransferPipe; import com.android.server.am.ActivityManagerService.PendingActivityLaunch; @@ -204,8 +203,8 @@ public final class ActivityStackSupervisor { */ final PowerManager.WakeLock mGoingToSleep; - /** State of the stacks when user switched, indexed by userId. */ - SparseBooleanArray mUserHomeInFront = new SparseBooleanArray(2); + /** Stack id of the front stack when user switched, indexed by userId. */ + SparseIntArray mUserStackInFront = new SparseIntArray(2); public ActivityStackSupervisor(ActivityManagerService service, Context context, Looper looper) { @@ -1927,7 +1926,7 @@ public final class ActivityStackSupervisor { } void removeUserLocked(int userId) { - mUserHomeInFront.delete(userId); + mUserStackInFront.delete(userId); } /** @@ -2248,8 +2247,8 @@ public final class ActivityStackSupervisor { } boolean switchUserLocked(int userId, UserStartedState uss) { - mUserHomeInFront.put(mCurrentUser, isFrontStack(mHomeStack)); - final boolean homeInFront = mUserHomeInFront.get(userId, true); + mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId()); + final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); mCurrentUser = userId; mStartingUsers.add(uss); @@ -2257,7 +2256,13 @@ public final class ActivityStackSupervisor { mStacks.get(stackNdx).switchUserLocked(userId); } + ActivityStack stack = getStack(restoreStackId); + if (stack == null) { + stack = mHomeStack; + } + final boolean homeInFront = stack.isHomeStack(); moveHomeStack(homeInFront); + mWindowManager.moveTaskToTop(stack.topTask().taskId); return homeInFront; } @@ -2351,7 +2356,7 @@ public final class ActivityStackSupervisor { pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState)); pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout); pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId); - pw.print(prefix); pw.println("mUserHomeInFront: " + mUserHomeInFront); + pw.print(prefix); pw.println("mUserStackInFront: " + mUserStackInFront); } ArrayList getDumpActivitiesLocked(String name) { -- cgit v1.2.3-59-g8ed1b