diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 188 |
1 files changed, 94 insertions, 94 deletions
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 8283ac668d5e..fe19956ce8ce 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2861,6 +2861,100 @@ public class UserManagerService extends IUserManager.Stub { } } + @GuardedBy("mUsersLock") + @VisibleForTesting + void upgradeUserTypesLU(@NonNull List<UserTypeFactory.UserTypeUpgrade> upgradeOps, + @NonNull ArrayMap<String, UserTypeDetails> userTypes, + final int formerUserTypeVersion, + @NonNull Set<Integer> userIdsToWrite) { + for (UserTypeFactory.UserTypeUpgrade userTypeUpgrade : upgradeOps) { + if (DBG) { + Slog.i(LOG_TAG, "Upgrade: " + userTypeUpgrade.getFromType() + " to: " + + userTypeUpgrade.getToType() + " maxVersion: " + + userTypeUpgrade.getUpToVersion()); + } + + // upgrade user type if version up to getUpToVersion() + if (formerUserTypeVersion <= userTypeUpgrade.getUpToVersion()) { + for (int i = 0; i < mUsers.size(); i++) { + UserData userData = mUsers.valueAt(i); + if (userTypeUpgrade.getFromType().equals(userData.info.userType)) { + final UserTypeDetails newUserType = userTypes.get( + userTypeUpgrade.getToType()); + + if (newUserType == null) { + throw new IllegalStateException( + "Upgrade destination user type not defined: " + + userTypeUpgrade.getToType()); + } + + upgradeProfileToTypeLU(userData.info, newUserType); + userIdsToWrite.add(userData.info.id); + } + } + } + } + } + + /** + * Changes the user type of a profile to a new user type. + * @param userInfo The user to be updated. + * @param newUserType The new user type. + */ + @GuardedBy("mUsersLock") + @VisibleForTesting + void upgradeProfileToTypeLU(@NonNull UserInfo userInfo, @NonNull UserTypeDetails newUserType) { + Slog.i(LOG_TAG, "Upgrading user " + userInfo.id + + " from " + userInfo.userType + + " to " + newUserType.getName()); + + if (!userInfo.isProfile()) { + throw new IllegalStateException( + "Can only upgrade profile types. " + userInfo.userType + + " is not a profile type."); + } + + // Exceeded maximum profiles for parent user: log error, but allow upgrade + if (!canAddMoreProfilesToUser(newUserType.getName(), userInfo.profileGroupId, false)) { + Slog.w(LOG_TAG, + "Exceeded maximum profiles of type " + newUserType.getName() + " for user " + + userInfo.id + ". Maximum allowed= " + + newUserType.getMaxAllowedPerParent()); + } + + final UserTypeDetails oldUserType = mUserTypes.get(userInfo.userType); + final int oldFlags; + if (oldUserType != null) { + oldFlags = oldUserType.getDefaultUserInfoFlags(); + } else { + // if oldUserType is missing from config_user_types.xml -> can only assume FLAG_PROFILE + oldFlags = UserInfo.FLAG_PROFILE; + } + + //convert userData to newUserType + userInfo.userType = newUserType.getName(); + // remove old default flags and add newUserType's default flags + userInfo.flags = newUserType.getDefaultUserInfoFlags() | (userInfo.flags ^ oldFlags); + + // merge existing base restrictions with the new type's default restrictions + synchronized (mRestrictionsLock) { + if (!BundleUtils.isEmpty(newUserType.getDefaultRestrictions())) { + final Bundle newRestrictions = BundleUtils.clone( + mBaseUserRestrictions.getRestrictions(userInfo.id)); + UserRestrictionsUtils.merge(newRestrictions, + newUserType.getDefaultRestrictions()); + updateUserRestrictionsInternalLR(newRestrictions, userInfo.id); + if (DBG) { + Slog.i(LOG_TAG, "Updated user " + userInfo.id + + " restrictions to " + newRestrictions); + } + } + } + + // re-compute badge index + userInfo.profileBadge = getFreeProfileBadgeLU(userInfo.profileGroupId, userInfo.userType); + } + @GuardedBy({"mPackagesLock", "mRestrictionsLock"}) private void fallbackToSingleUserLP() { int flags = UserInfo.FLAG_SYSTEM | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN @@ -5759,98 +5853,4 @@ public class UserManagerService extends IUserManager.Stub { } return mDevicePolicyManagerInternal; } - - @GuardedBy("mUsersLock") - @VisibleForTesting - void upgradeUserTypesLU(@NonNull List<UserTypeFactory.UserTypeUpgrade> upgradeOps, - @NonNull ArrayMap<String, UserTypeDetails> userTypes, - final int formerUserTypeVersion, - @NonNull Set<Integer> userIdsToWrite) { - for (UserTypeFactory.UserTypeUpgrade userTypeUpgrade : upgradeOps) { - if (DBG) { - Slog.i(LOG_TAG, "Upgrade: " + userTypeUpgrade.getFromType() + " to: " - + userTypeUpgrade.getToType() + " maxVersion: " - + userTypeUpgrade.getUpToVersion()); - } - - // upgrade user type if version up to getUpToVersion() - if (formerUserTypeVersion <= userTypeUpgrade.getUpToVersion()) { - for (int i = 0; i < mUsers.size(); i++) { - UserData userData = mUsers.valueAt(i); - if (userTypeUpgrade.getFromType().equals(userData.info.userType)) { - final UserTypeDetails newUserType = userTypes.get( - userTypeUpgrade.getToType()); - - if (newUserType == null) { - throw new IllegalStateException( - "Upgrade destination user type not defined: " - + userTypeUpgrade.getToType()); - } - - upgradeProfileToTypeLU(userData.info, newUserType); - userIdsToWrite.add(userData.info.id); - } - } - } - } - } - - /** - * Changes the user type of a profile to a new user type. - * @param userInfo The user to be updated. - * @param newUserType The new user type. - */ - @GuardedBy("mUsersLock") - @VisibleForTesting - void upgradeProfileToTypeLU(@NonNull UserInfo userInfo, @NonNull UserTypeDetails newUserType) { - Slog.i(LOG_TAG, "Upgrading user " + userInfo.id - + " from " + userInfo.userType - + " to " + newUserType.getName()); - - if (!userInfo.isProfile()) { - throw new IllegalStateException( - "Can only upgrade profile types. " + userInfo.userType - + " is not a profile type."); - } - - // Exceeded maximum profiles for parent user: log error, but allow upgrade - if (!canAddMoreProfilesToUser(newUserType.getName(), userInfo.profileGroupId, false)) { - Slog.w(LOG_TAG, - "Exceeded maximum profiles of type " + newUserType.getName() + " for user " - + userInfo.id + ". Maximum allowed= " - + newUserType.getMaxAllowedPerParent()); - } - - final UserTypeDetails oldUserType = mUserTypes.get(userInfo.userType); - final int oldFlags; - if (oldUserType != null) { - oldFlags = oldUserType.getDefaultUserInfoFlags(); - } else { - // if oldUserType is missing from config_user_types.xml -> can only assume FLAG_PROFILE - oldFlags = UserInfo.FLAG_PROFILE; - } - - //convert userData to newUserType - userInfo.userType = newUserType.getName(); - // remove old default flags and add newUserType's default flags - userInfo.flags = newUserType.getDefaultUserInfoFlags() | (userInfo.flags ^ oldFlags); - - // merge existing base restrictions with the new type's default restrictions - synchronized (mRestrictionsLock) { - if (!BundleUtils.isEmpty(newUserType.getDefaultRestrictions())) { - final Bundle newRestrictions = BundleUtils.clone( - mBaseUserRestrictions.getRestrictions(userInfo.id)); - UserRestrictionsUtils.merge(newRestrictions, - newUserType.getDefaultRestrictions()); - updateUserRestrictionsInternalLR(newRestrictions, userInfo.id); - if (DBG) { - Slog.i(LOG_TAG, "Updated user " + userInfo.id - + " restrictions to " + newRestrictions); - } - } - } - - // re-compute badge index - userInfo.profileBadge = getFreeProfileBadgeLU(userInfo.profileGroupId, userInfo.userType); - } } |