diff options
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7381e5e22efe..a0b75b5de711 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 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + 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(); |