Allow non-owner users to have managed profiles.
In the split system user model:
The only users that are not allowed to have managed profiles are:
- purely system user (user 0)
- guest users
- restricted profiles
- managed profiles
In the non-split system user model, the behavior does not change:
only the primary user can have managed profiles.
BUG:22956426
Change-Id: If908c30f110fd3e740770174f050c9b6cf87ce1b
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index fcfb5e8..0f33544 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -132,7 +132,7 @@
private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms
- // Maximum number of managed profiles permitted is 1. This cannot be increased
+ // Maximum number of managed profiles permitted per user is 1. This cannot be increased
// without first making sure that the rest of the framework is prepared for it.
private static final int MAX_MANAGED_PROFILES = 1;
@@ -625,7 +625,7 @@
}
@Override
- public boolean canAddMoreManagedProfiles() {
+ public boolean canAddMoreManagedProfiles(int userId) {
checkManageUsersPermission("check if more managed profiles can be added.");
if (ActivityManager.isLowRamDeviceStatic()) {
return false;
@@ -634,10 +634,14 @@
PackageManager.FEATURE_MANAGED_USERS)) {
return false;
}
+ // Limit number of managed profiles that can be created
+ int managedProfilesCount = getProfiles(userId, true).size() - 1;
+ if (managedProfilesCount >= MAX_MANAGED_PROFILES) {
+ return false;
+ }
synchronized(mPackagesLock) {
- // Limit number of managed profiles that can be created
- if (numberOfUsersOfTypeLocked(UserInfo.FLAG_MANAGED_PROFILE, true)
- >= MAX_MANAGED_PROFILES) {
+ UserInfo userInfo = getUserInfoLocked(userId);
+ if (!userInfo.canHaveProfile()) {
return false;
}
int usersCount = getAliveUsersExcludingGuestsCountLocked();
@@ -1236,10 +1240,6 @@
@Override
public UserInfo createProfileForUser(String name, int flags, int userId) {
checkManageUsersPermission("Only the system can create users");
- if (userId != UserHandle.USER_OWNER) {
- Slog.w(LOG_TAG, "Only user owner can have profiles");
- return null;
- }
return createUserInternal(name, flags, userId);
}
@@ -1271,7 +1271,8 @@
parent = getUserInfoLocked(parentId);
if (parent == null) return null;
}
- if (isManagedProfile && !canAddMoreManagedProfiles()) {
+ if (isManagedProfile && !canAddMoreManagedProfiles(parentId)) {
+ Log.e(LOG_TAG, "Cannot add more managed profiles for user " + parentId);
return null;
}
if (!isGuest && !isManagedProfile && isUserLimitReachedLocked()) {