Switch isUserUnlocked/isUserRunning to use UMS.mUserStates
UserManager.isUserUnlocked/isUserRunning now returns state from
UMS.mUserStates that is pushed from ActivityManager.
Test: manual
Bug: 33232933
Bug: 28957340
Change-Id: Ic5f56d7d577bc336acd2bf44fab7f74feac4f7b3
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 20afed7..af16c5b 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -913,17 +913,36 @@
@Override
public boolean isUserUnlockingOrUnlocked(int userId) {
- int callingUserId = UserHandle.getCallingUserId();
- if (callingUserId != userId && !hasManageUsersPermission()) {
- if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
- throw new SecurityException(
- "You need MANAGE_USERS permission to: check isUserUnlockingOrUnlocked");
- }
- }
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlockingOrUnlocked");
return mLocalService.isUserUnlockingOrUnlocked(userId);
}
@Override
+ public boolean isUserUnlocked(int userId) {
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlocked");
+ return mLocalService.isUserUnlockingOrUnlocked(userId);
+ }
+
+ @Override
+ public boolean isUserRunning(int userId) {
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserRunning");
+ return mLocalService.isUserRunning(userId);
+ }
+
+ private void checkManageOrInteractPermIfCallerInOtherProfileGroup(int userId, String name) {
+ int callingUserId = UserHandle.getCallingUserId();
+ if (callingUserId == userId || isSameProfileGroupNoChecks(callingUserId, userId) ||
+ hasManageUsersPermission()) {
+ return;
+ }
+ if (ActivityManager.checkComponentPermission(Manifest.permission.INTERACT_ACROSS_USERS,
+ Binder.getCallingUid(), -1, true) != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("You need INTERACT_ACROSS_USERS or MANAGE_USERS permission "
+ + "to: check " + name);
+ }
+ }
+
+ @Override
public boolean isDemoUser(int userId) {
int callingUserId = UserHandle.getCallingUserId();
if (callingUserId != userId && !hasManageUsersPermission()) {
@@ -3641,6 +3660,14 @@
|| (state == UserState.STATE_RUNNING_UNLOCKED);
}
}
+
+ @Override
+ public boolean isUserUnlocked(int userId) {
+ synchronized (mUserStates) {
+ int state = mUserStates.get(userId, -1);
+ return state == UserState.STATE_RUNNING_UNLOCKED;
+ }
+ }
}
/* Remove all the users except of the system one. */