Merge "Slate ephemeral user deletion in systemReady()" into sc-dev

This commit is contained in:
Adam Bookatz
2021-06-03 00:26:15 +00:00
committed by Android (Google) Code Review
2 changed files with 29 additions and 5 deletions

View File

@@ -24228,7 +24228,13 @@ public class PackageManagerService extends IPackageManager.Stub
mPermissionManager.onSystemReady(); mPermissionManager.onSystemReady();
int[] grantPermissionsUserIds = EMPTY_INT_ARRAY; int[] grantPermissionsUserIds = EMPTY_INT_ARRAY;
for (int userId : UserManagerService.getInstance().getUserIds()) { final List<UserInfo> livingUsers = mInjector.getUserManagerInternal().getUsers(
/* excludePartial= */ true,
/* excludeDying= */ true,
/* excludePreCreated= */ false);
final int livingUserCount = livingUsers.size();
for (int i = 0; i < livingUserCount; i++) {
final int userId = livingUsers.get(i).id;
if (mPmInternal.isPermissionUpgradeNeeded(userId)) { if (mPmInternal.isPermissionUpgradeNeeded(userId)) {
grantPermissionsUserIds = ArrayUtils.appendInt( grantPermissionsUserIds = ArrayUtils.appendInt(
grantPermissionsUserIds, userId); grantPermissionsUserIds, userId);

View File

@@ -699,6 +699,8 @@ public class UserManagerService extends IUserManager.Stub {
mContext.registerReceiver(mConfigurationChangeReceiver, mContext.registerReceiver(mConfigurationChangeReceiver,
new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED), new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED),
null, mHandler); null, mHandler);
markEphemeralUsersForRemoval();
} }
/** /**
@@ -709,17 +711,33 @@ public class UserManagerService extends IUserManager.Stub {
return mLocalService; return mLocalService;
} }
/** Marks all ephemeral users as slated for deletion. **/
private void markEphemeralUsersForRemoval() {
synchronized (mUsersLock) {
final int userSize = mUsers.size();
for (int i = 0; i < userSize; i++) {
final UserInfo ui = mUsers.valueAt(i).info;
if (ui.isEphemeral() && !ui.preCreated && ui.id != UserHandle.USER_SYSTEM) {
addRemovingUserIdLocked(ui.id);
ui.partial = true;
ui.flags |= UserInfo.FLAG_DISABLED;
}
}
}
}
/* Prunes out any partially created or partially removed users. */
void cleanupPartialUsers() { void cleanupPartialUsers() {
// Prune out any partially created, partially removed and ephemeral users.
ArrayList<UserInfo> partials = new ArrayList<>(); ArrayList<UserInfo> partials = new ArrayList<>();
synchronized (mUsersLock) { synchronized (mUsersLock) {
final int userSize = mUsers.size(); final int userSize = mUsers.size();
for (int i = 0; i < userSize; i++) { for (int i = 0; i < userSize; i++) {
UserInfo ui = mUsers.valueAt(i).info; UserInfo ui = mUsers.valueAt(i).info;
if ((ui.partial || ui.guestToRemove || (ui.isEphemeral() && !ui.preCreated)) if ((ui.partial || ui.guestToRemove) && ui.id != UserHandle.USER_SYSTEM) {
&& i != 0) {
partials.add(ui); partials.add(ui);
addRemovingUserIdLocked(ui.id); if (!mRemovingUserIds.get(ui.id)) {
addRemovingUserIdLocked(ui.id);
}
ui.partial = true; ui.partial = true;
} }
} }