@@ -3585,7 +3585,7 @@ public void forceStopPackage(final String packageName, int userId) {
35853585 Slog.w(TAG, "Failed trying to unstop package "
35863586 + packageName + ": " + e);
35873587 }
3588- if (isUserRunningLocked(user)) {
3588+ if (isUserRunningLocked(user, false )) {
35893589 forceStopPackageLocked(packageName, pkgUid);
35903590 }
35913591 }
@@ -9338,6 +9338,12 @@ boolean dumpProcessesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
93389338 pw.print(" User #"); pw.print(uss.mHandle.getIdentifier());
93399339 pw.print(": "); uss.dump("", pw);
93409340 }
9341+ pw.print(" mStartedUserArray: [");
9342+ for (int i=0; i<mStartedUserArray.length; i++) {
9343+ if (i > 0) pw.print(", ");
9344+ pw.print(mStartedUserArray[i]);
9345+ }
9346+ pw.println("]");
93419347 pw.print(" mUserLru: [");
93429348 for (int i=0; i<mUserLru.size(); i++) {
93439349 if (i > 0) pw.print(", ");
@@ -14134,10 +14140,12 @@ public boolean switchUser(int userId) {
1413414140 // so we can just fairly silently bring the user back from
1413514141 // the almost-dead.
1413614142 uss.mState = UserStartedState.STATE_RUNNING;
14143+ updateStartedUserArrayLocked();
1413714144 } else if (uss.mState == UserStartedState.STATE_SHUTDOWN) {
1413814145 // This means ACTION_SHUTDOWN has been sent, so we will
1413914146 // need to treat this as a new boot of the user.
1414014147 uss.mState = UserStartedState.STATE_BOOTING;
14148+ updateStartedUserArrayLocked();
1414114149 }
1414214150
1414314151 mHandler.removeMessages(REPORT_USER_SWITCH_MSG);
@@ -14318,8 +14326,7 @@ void completeSwitchAndInitalizeLocked(UserStartedState uss) {
1431814326
1431914327 void finishUserSwitch(UserStartedState uss) {
1432014328 synchronized (this) {
14321- if ((uss.mState == UserStartedState.STATE_BOOTING
14322- || uss.mState == UserStartedState.STATE_SHUTDOWN)
14329+ if (uss.mState == UserStartedState.STATE_BOOTING
1432314330 && mStartedUsers.get(uss.mHandle.getIdentifier()) == uss) {
1432414331 uss.mState = UserStartedState.STATE_RUNNING;
1432514332 final int userId = uss.mHandle.getIdentifier();
@@ -14410,6 +14417,7 @@ public void run() {
1441014417 if (uss.mState != UserStartedState.STATE_STOPPING
1441114418 && uss.mState != UserStartedState.STATE_SHUTDOWN) {
1441214419 uss.mState = UserStartedState.STATE_STOPPING;
14420+ updateStartedUserArrayLocked();
1441314421
1441414422 long ident = Binder.clearCallingIdentity();
1441514423 try {
@@ -14514,7 +14522,7 @@ int getCurrentUserIdLocked() {
1451414522 }
1451514523
1451614524 @Override
14517- public boolean isUserRunning(int userId) {
14525+ public boolean isUserRunning(int userId, boolean orStopped ) {
1451814526 if (checkCallingPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
1451914527 != PackageManager.PERMISSION_GRANTED) {
1452014528 String msg = "Permission Denial: isUserRunning() from pid="
@@ -14525,13 +14533,19 @@ public boolean isUserRunning(int userId) {
1452514533 throw new SecurityException(msg);
1452614534 }
1452714535 synchronized (this) {
14528- return isUserRunningLocked(userId);
14536+ return isUserRunningLocked(userId, orStopped );
1452914537 }
1453014538 }
1453114539
14532- boolean isUserRunningLocked(int userId) {
14540+ boolean isUserRunningLocked(int userId, boolean orStopped ) {
1453314541 UserStartedState state = mStartedUsers.get(userId);
14534- return state != null && state.mState != UserStartedState.STATE_STOPPING
14542+ if (state == null) {
14543+ return false;
14544+ }
14545+ if (orStopped) {
14546+ return true;
14547+ }
14548+ return state.mState != UserStartedState.STATE_STOPPING
1453514549 && state.mState != UserStartedState.STATE_SHUTDOWN;
1453614550 }
1453714551
@@ -14552,9 +14566,24 @@ public int[] getRunningUserIds() {
1455214566 }
1455314567
1455414568 private void updateStartedUserArrayLocked() {
14555- mStartedUserArray = new int[mStartedUsers.size()] ;
14569+ int num = 0 ;
1455614570 for (int i=0; i<mStartedUsers.size(); i++) {
14557- mStartedUserArray[i] = mStartedUsers.keyAt(i);
14571+ UserStartedState uss = mStartedUsers.valueAt(i);
14572+ // This list does not include stopping users.
14573+ if (uss.mState != UserStartedState.STATE_STOPPING
14574+ && uss.mState != UserStartedState.STATE_SHUTDOWN) {
14575+ num++;
14576+ }
14577+ }
14578+ mStartedUserArray = new int[num];
14579+ num = 0;
14580+ for (int i=0; i<mStartedUsers.size(); i++) {
14581+ UserStartedState uss = mStartedUsers.valueAt(i);
14582+ if (uss.mState != UserStartedState.STATE_STOPPING
14583+ && uss.mState != UserStartedState.STATE_SHUTDOWN) {
14584+ mStartedUserArray[num] = mStartedUsers.keyAt(i);
14585+ num++;
14586+ }
1455814587 }
1455914588 }
1456014589
0 commit comments