diff --git a/api/system-current.txt b/api/system-current.txt index d7977f0ce9e9e..ce507fe8ea61b 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -31658,6 +31658,7 @@ package android.os { method public android.os.Bundle getUserRestrictions(android.os.UserHandle); method public boolean hasUserRestriction(java.lang.String); method public boolean isManagedProfile(); + method public boolean isManagedProfile(int); method public boolean isQuietModeEnabled(android.os.UserHandle); method public boolean isSystemUser(); method public boolean isUserAGoat(); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 5ef03d1cac6fd..5b7dae67392cc 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1147,8 +1147,7 @@ public class ApplicationPackageManager extends PackageManager { } private Drawable getManagedProfileIconForDensity(UserHandle user, int drawableId, int density) { - UserInfo userInfo = getUserInfo(user.getIdentifier()); - if (userInfo != null && userInfo.isManagedProfile()) { + if (isManagedProfile(user.getIdentifier())) { return getDrawableForDensity(drawableId, density); } return null; @@ -1156,8 +1155,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public CharSequence getUserBadgedLabel(CharSequence label, UserHandle user) { - UserInfo userInfo = getUserInfo(user.getIdentifier()); - if (userInfo != null && userInfo.isManagedProfile()) { + if (isManagedProfile(user.getIdentifier())) { return Resources.getSystem().getString( com.android.internal.R.string.managed_profile_label_badge, label); } @@ -2259,17 +2257,16 @@ public class ApplicationPackageManager extends PackageManager { return drawable; } - private int getBadgeResIdForUser(int userHandle) { + private int getBadgeResIdForUser(int userId) { // Return the framework-provided badge. - UserInfo userInfo = getUserInfo(userHandle); - if (userInfo != null && userInfo.isManagedProfile()) { + if (isManagedProfile(userId)) { return com.android.internal.R.drawable.ic_corp_icon_badge; } return 0; } - private UserInfo getUserInfo(int userHandle) { - return getUserManager().getUserInfo(userHandle); + private boolean isManagedProfile(int userId) { + return getUserManager().isManagedProfile(userId); } /** {@hide} */ diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index bc2566b0ef64b..c38bf3c748525 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -76,4 +76,5 @@ interface IUserManager { PersistableBundle getSeedAccountOptions(); void clearSeedAccountData(); boolean someUserHasSeedAccount(in String accountName, in String accountType); + boolean isManagedProfile(int userId); } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 0ff0154f2ed04..707d5f561ac27 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -822,8 +822,28 @@ public class UserManager { */ @SystemApi public boolean isManagedProfile() { - UserInfo user = getUserInfo(UserHandle.myUserId()); - return user != null ? user.isManagedProfile() : false; + try { + return mService.isManagedProfile(UserHandle.myUserId()); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** + * Checks if the specified user is a managed profile. + * Requires {@link android.Manifest.permission#MANAGE_USERS} permission, otherwise the caller + * must be in the same profile group of specified user. + * + * @return whether the specified user is a managed profile. + * @hide + */ + @SystemApi + public boolean isManagedProfile(@UserIdInt int userId) { + try { + return mService.isManagedProfile(userId); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } } /** @@ -964,8 +984,7 @@ public class UserManager { /** * Returns the UserInfo object describing a specific user. - * Requires {@link android.Manifest.permission#MANAGE_USERS} permission or the caller is - * in the same profile group of target user. + * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. * @param userHandle the user handle of the user whose information is being requested. * @return the UserInfo object for a specific user. * @hide diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index a3622b58cb4d7..715f1e5e43459 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1,3 +1,4 @@ + /* * Copyright (C) 2011 The Android Open Source Project * @@ -650,18 +651,27 @@ public class UserManagerService extends IUserManager.Stub { @Override public UserInfo getUserInfo(int userId) { + checkManageUsersPermission("query user"); + synchronized (mUsersLock) { + return getUserInfoLU(userId); + } + } + + @Override + public boolean isManagedProfile(int userId) { int callingUserId = UserHandle.getCallingUserId(); if (callingUserId != userId && !hasManageUsersPermission()) { synchronized (mPackagesLock) { if (!isSameProfileGroupLP(callingUserId, userId)) { throw new SecurityException( - "You need MANAGE_USERS permission to: query users outside profile" + - " group"); + "You need MANAGE_USERS permission to: check if specified user a " + + "managed profile outside your profile group"); } } } synchronized (mUsersLock) { - return getUserInfoLU(userId); + UserInfo userInfo = getUserInfoLU(userId); + return userInfo != null && userInfo.isManagedProfile(); } }