Allow adding a user while still removing other users

When at the user limit, removing and adding a user causes a race
condition where the deleted user is still being removed and adding
another one fails.

This change excludes deleted users from the counting to compare
against the limit.

Also fix an ArrayIndexOutOfBounds recently introduced in AppOpsService.

Bug: 13282768
Change-Id: Ib79659e7604396583a280dbbc560b288a6d9051c
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 131d05b..fd180bf 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -511,8 +511,16 @@
      * Check if we've hit the limit of how many users can be created.
      */
     private boolean isUserLimitReachedLocked() {
-        int nUsers = mUsers.size();
-        return nUsers >= UserManager.getMaxSupportedUsers();
+        int aliveUserCount = 0;
+        final int totalUserCount = mUsers.size();
+        // Skip over users being removed
+        for (int i = 0; i < totalUserCount; i++) {
+            UserInfo user = mUsers.valueAt(i);
+            if (!mRemovingUserIds.get(user.id)) {
+                aliveUserCount++;
+            }
+        }
+        return aliveUserCount >= UserManager.getMaxSupportedUsers();
     }
 
     /**