diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 10 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/UserController.java | 13 |
2 files changed, 17 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7dfde56c07ee..bc25a32124a3 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19900,16 +19900,14 @@ public class ActivityManagerService extends IActivityManager.Stub userId = mUserController.handleIncomingUser(callingPid, callingUid, userId, true, ALLOW_NON_FULL, "broadcast", callerPackage); - // Make sure that the user who is receiving this broadcast is running. - // If not, we will just skip it. Make an exception for shutdown broadcasts - // and upgrade steps. - - if (userId != UserHandle.USER_ALL && !mUserController.isUserRunning(userId, 0)) { + // Make sure that the user who is receiving this broadcast or its parent is running. + // If not, we will just skip it. Make an exception for shutdown broadcasts, upgrade steps. + if (userId != UserHandle.USER_ALL && !mUserController.isUserOrItsParentRunning(userId)) { if ((callingUid != SYSTEM_UID || (intent.getFlags() & Intent.FLAG_RECEIVER_BOOT_UPGRADE) == 0) && !Intent.ACTION_SHUTDOWN.equals(intent.getAction())) { Slog.w(TAG, "Skipping broadcast of " + intent - + ": user " + userId + " is stopped"); + + ": user " + userId + " and its parent (if any) are stopped"); return ActivityManager.BROADCAST_FAILED_USER_STOPPED; } } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 14260c5fb105..34621e0331e4 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1737,6 +1737,19 @@ class UserController implements Handler.Callback { } } + boolean isUserOrItsParentRunning(int userId) { + synchronized (mLock) { + if (isUserRunning(userId, 0)) { + return true; + } + final int parentUserId = mUserProfileGroupIds.get(userId, UserInfo.NO_PROFILE_GROUP_ID); + if (parentUserId == UserInfo.NO_PROFILE_GROUP_ID) { + return false; + } + return isUserRunning(parentUserId, 0); + } + } + boolean isCurrentProfile(int userId) { synchronized (mLock) { return ArrayUtils.contains(mCurrentProfileIds, userId); |