Merge "Move upgradeUserTypesLU code" into sc-dev

This commit is contained in:
Adam Bookatz
2021-03-20 01:08:09 +00:00
committed by Android (Google) Code Review

View File

@@ -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);
}
}