Loading services/core/java/com/android/server/pm/UserManagerService.java +94 −94 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); } } Loading
services/core/java/com/android/server/pm/UserManagerService.java +94 −94 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); } }