Clean up deleted users in DevicePolicyManagerService
Bug: 15405715
Change-Id: Icd958fe9378deb92f25622b341e0502d865b742f
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 043fab4..743fec5 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -1227,6 +1227,7 @@
loadSettingsLocked(getUserData(UserHandle.USER_OWNER), UserHandle.USER_OWNER);
loadDeviceOwner();
}
+ cleanUpOldUsers();
mAppOpsService = IAppOpsService.Stub.asInterface(
ServiceManager.getService(Context.APP_OPS_SERVICE));
if (mDeviceOwner != null) {
@@ -1247,6 +1248,32 @@
}
}
+ private void cleanUpOldUsers() {
+ // This is needed in case the broadcast {@link Intent.ACTION_USER_REMOVED} was not handled
+ // before reboot
+ Set<Integer> usersWithProfileOwners;
+ Set<Integer> usersWithData;
+ synchronized(this) {
+ usersWithProfileOwners = mDeviceOwner != null
+ ? mDeviceOwner.getProfileOwnerKeys() : new HashSet<Integer>();
+ usersWithData = new HashSet<Integer>();
+ for (int i = 0; i < mUserData.size(); i++) {
+ usersWithData.add(mUserData.keyAt(i));
+ }
+ }
+ List<UserInfo> allUsers = mUserManager.getUsers();
+
+ Set<Integer> deletedUsers = new HashSet<Integer>();
+ deletedUsers.addAll(usersWithProfileOwners);
+ deletedUsers.addAll(usersWithData);
+ for (UserInfo userInfo : allUsers) {
+ deletedUsers.remove(userInfo.id);
+ }
+ for (Integer userId : deletedUsers) {
+ removeUserData(userId);
+ }
+ }
+
private void handlePasswordExpirationNotification(int userHandle) {
synchronized (this) {
final long now = System.currentTimeMillis();