summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-06-22 19:19:20 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-06-22 19:19:20 +0000
commit340e55d091722a51d55fe2c2d71a8ffe4cd8b966 (patch)
tree7f4bc334ad5c14b8c88daf13064435278cee2fa2
parent296855fe7651cbcf3cec7743da6fa5bed58f7db1 (diff)
parent0a2b53f36acd3ac9da5cb9e5df4dc3eec9315666 (diff)
Merge "Add a guard on UserController to avoid user switches when not ready." into rvc-dev
-rw-r--r--services/core/java/com/android/server/am/UserController.java18
1 files changed, 18 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index f2c4e4428af2..2d8d2c32a4c3 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -348,6 +348,17 @@ class UserController implements Handler.Callback {
@GuardedBy("mUserIdToUserJourneyMap")
private final SparseArray<UserJourneySession> mUserIdToUserJourneyMap = new SparseArray<>();
+ /**
+ * Sets on {@link #setInitialConfig(boolean, int, boolean)}, which is called by
+ * {@code ActivityManager} when the system is started.
+ *
+ * <p>It's useful to ignore external operations (i.e., originated outside {@code system_server},
+ * like from {@code adb shell am switch-user})) that could happen before such call is made and
+ * the system is ready.
+ */
+ @GuardedBy("mLock")
+ private boolean mInitialized;
+
UserController(ActivityManagerService service) {
this(new Injector(service));
}
@@ -372,6 +383,7 @@ class UserController implements Handler.Callback {
mUserSwitchUiEnabled = userSwitchUiEnabled;
mMaxRunningUsers = maxRunningUsers;
mDelayUserDataLocking = delayUserDataLocking;
+ mInitialized = true;
}
}
@@ -1587,6 +1599,11 @@ class UserController implements Handler.Callback {
}
boolean userSwitchUiEnabled;
synchronized (mLock) {
+ if (!mInitialized) {
+ Slog.e(TAG, "Cannot switch to User #" + targetUserId
+ + ": UserController not ready yet");
+ return false;
+ }
mTargetUserId = targetUserId;
userSwitchUiEnabled = mUserSwitchUiEnabled;
}
@@ -2422,6 +2439,7 @@ class UserController implements Handler.Callback {
pw.println(" mDelayUserDataLocking:" + mDelayUserDataLocking);
pw.println(" mMaxRunningUsers:" + mMaxRunningUsers);
pw.println(" mUserSwitchUiEnabled:" + mUserSwitchUiEnabled);
+ pw.println(" mInitialized:" + mInitialized);
}
}