Do not call out of the settings provider with a lock held

bug:20443441

Change-Id: I704520b75f5deaeeb1b4098cda0783c667e8cdd1
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index ad710a6..1dba942e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -201,14 +201,14 @@
     @GuardedBy("mLock")
     private SettingsRegistry mSettingsRegistry;
 
-    @GuardedBy("mLock")
-    private UserManager mUserManager;
+    // We have to call in the user manager with no lock held,
+    private volatile UserManager mUserManager;
 
-    @GuardedBy("mLock")
-    private AppOpsManager mAppOpsManager;
+    // We have to call in the app ops manager with no lock held,
+    private volatile AppOpsManager mAppOpsManager;
 
-    @GuardedBy("mLock")
-    private PackageManager mPackageManager;
+    // We have to call in the package manager with no lock held,
+    private volatile PackageManager mPackageManager;
 
     @Override
     public boolean onCreate() {
@@ -224,44 +224,46 @@
 
     @Override
     public Bundle call(String method, String name, Bundle args) {
-        synchronized (mLock) {
-            final int requestingUserId = getRequestingUserId(args);
-            switch (method) {
-                case Settings.CALL_METHOD_GET_GLOBAL: {
-                    Setting setting = getGlobalSettingLocked(name);
-                    return packageValueForCallResult(setting);
-                }
-
-                case Settings.CALL_METHOD_GET_SECURE: {
-                    Setting setting = getSecureSettingLocked(name, requestingUserId);
-                    return packageValueForCallResult(setting);
-                }
-
-                case Settings.CALL_METHOD_GET_SYSTEM: {
-                    Setting setting = getSystemSettingLocked(name, requestingUserId);
-                    return packageValueForCallResult(setting);
-                }
-
-                case Settings.CALL_METHOD_PUT_GLOBAL: {
-                    String value = getSettingValue(args);
-                    insertGlobalSettingLocked(name, value, requestingUserId);
-                } break;
-
-                case Settings.CALL_METHOD_PUT_SECURE: {
-                    String value = getSettingValue(args);
-                    insertSecureSettingLocked(name, value, requestingUserId);
-                } break;
-
-                case Settings.CALL_METHOD_PUT_SYSTEM: {
-                    String value = getSettingValue(args);
-                    insertSystemSettingLocked(name, value, requestingUserId);
-                } break;
-
-                default: {
-                    Slog.w(LOG_TAG, "call() with invalid method: " + method);
-                } break;
+        final int requestingUserId = getRequestingUserId(args);
+        switch (method) {
+            case Settings.CALL_METHOD_GET_GLOBAL: {
+                Setting setting = getGlobalSetting(name);
+                return packageValueForCallResult(setting);
             }
+
+            case Settings.CALL_METHOD_GET_SECURE: {
+                Setting setting = getSecureSetting(name, requestingUserId);
+                return packageValueForCallResult(setting);
+            }
+
+            case Settings.CALL_METHOD_GET_SYSTEM: {
+                Setting setting = getSystemSetting(name, requestingUserId);
+                return packageValueForCallResult(setting);
+            }
+
+            case Settings.CALL_METHOD_PUT_GLOBAL: {
+                String value = getSettingValue(args);
+                insertGlobalSetting(name, value, requestingUserId);
+                break;
+            }
+
+            case Settings.CALL_METHOD_PUT_SECURE: {
+                String value = getSettingValue(args);
+                insertSecureSetting(name, value, requestingUserId);
+                break;
+            }
+
+            case Settings.CALL_METHOD_PUT_SYSTEM: {
+                String value = getSettingValue(args);
+                insertSystemSetting(name, value, requestingUserId);
+                break;
+            }
+
+            default: {
+                Slog.w(LOG_TAG, "call() with invalid method: " + method);
+            } break;
         }
+
         return null;
     }
 
@@ -271,7 +273,7 @@
         if (TextUtils.isEmpty(args.name)) {
             return "vnd.android.cursor.dir/" + args.table;
         } else {
-                return "vnd.android.cursor.item/" + args.table;
+            return "vnd.android.cursor.item/" + args.table;
         }
     }
 
@@ -290,40 +292,38 @@
             return new MatrixCursor(normalizedProjection, 0);
         }
 
-        synchronized (mLock) {
-            switch (args.table) {
-                case TABLE_GLOBAL: {
-                    if (args.name != null) {
-                        Setting setting = getGlobalSettingLocked(args.name);
-                        return packageSettingForQuery(setting, normalizedProjection);
-                    } else {
-                        return getAllGlobalSettingsLocked(projection);
-                    }
+        switch (args.table) {
+            case TABLE_GLOBAL: {
+                if (args.name != null) {
+                    Setting setting = getGlobalSetting(args.name);
+                    return packageSettingForQuery(setting, normalizedProjection);
+                } else {
+                    return getAllGlobalSettings(projection);
                 }
+            }
 
-                case TABLE_SECURE: {
-                    final int userId = UserHandle.getCallingUserId();
-                    if (args.name != null) {
-                        Setting setting = getSecureSettingLocked(args.name, userId);
-                        return packageSettingForQuery(setting, normalizedProjection);
-                    } else {
-                        return getAllSecureSettingsLocked(userId, projection);
-                    }
+            case TABLE_SECURE: {
+                final int userId = UserHandle.getCallingUserId();
+                if (args.name != null) {
+                    Setting setting = getSecureSetting(args.name, userId);
+                    return packageSettingForQuery(setting, normalizedProjection);
+                } else {
+                    return getAllSecureSettings(userId, projection);
                 }
+            }
 
-                case TABLE_SYSTEM: {
-                    final int userId = UserHandle.getCallingUserId();
-                    if (args.name != null) {
-                        Setting setting = getSystemSettingLocked(args.name, userId);
-                        return packageSettingForQuery(setting, normalizedProjection);
-                    } else {
-                        return getAllSystemSettingsLocked(userId, projection);
-                    }
+            case TABLE_SYSTEM: {
+                final int userId = UserHandle.getCallingUserId();
+                if (args.name != null) {
+                    Setting setting = getSystemSetting(args.name, userId);
+                    return packageSettingForQuery(setting, normalizedProjection);
+                } else {
+                    return getAllSystemSettings(userId, projection);
                 }
+            }
 
-                default: {
-                    throw new IllegalArgumentException("Invalid Uri path:" + uri);
-                }
+            default: {
+                throw new IllegalArgumentException("Invalid Uri path:" + uri);
             }
         }
     }
@@ -348,29 +348,27 @@
 
         String value = values.getAsString(Settings.Secure.VALUE);
 
-        synchronized (mLock) {
-            switch (table) {
-                case TABLE_GLOBAL: {
-                    if (insertGlobalSettingLocked(name, value, UserHandle.getCallingUserId())) {
-                        return Uri.withAppendedPath(Settings.Global.CONTENT_URI, name);
-                    }
-                } break;
-
-                case TABLE_SECURE: {
-                    if (insertSecureSettingLocked(name, value, UserHandle.getCallingUserId())) {
-                        return Uri.withAppendedPath(Settings.Secure.CONTENT_URI, name);
-                    }
-                } break;
-
-                case TABLE_SYSTEM: {
-                    if (insertSystemSettingLocked(name, value, UserHandle.getCallingUserId())) {
-                        return Uri.withAppendedPath(Settings.System.CONTENT_URI, name);
-                    }
-                } break;
-
-                default: {
-                    throw new IllegalArgumentException("Bad Uri path:" + uri);
+        switch (table) {
+            case TABLE_GLOBAL: {
+                if (insertGlobalSetting(name, value, UserHandle.getCallingUserId())) {
+                    return Uri.withAppendedPath(Settings.Global.CONTENT_URI, name);
                 }
+            } break;
+
+            case TABLE_SECURE: {
+                if (insertSecureSetting(name, value, UserHandle.getCallingUserId())) {
+                    return Uri.withAppendedPath(Settings.Secure.CONTENT_URI, name);
+                }
+            } break;
+
+            case TABLE_SYSTEM: {
+                if (insertSystemSetting(name, value, UserHandle.getCallingUserId())) {
+                    return Uri.withAppendedPath(Settings.System.CONTENT_URI, name);
+                }
+            } break;
+
+            default: {
+                throw new IllegalArgumentException("Bad Uri path:" + uri);
             }
         }
 
@@ -412,26 +410,25 @@
             return 0;
         }
 
-        synchronized (mLock) {
-            switch (args.table) {
-                case TABLE_GLOBAL: {
-                    final int userId = UserHandle.getCallingUserId();
-                    return deleteGlobalSettingLocked(args.name, userId) ? 1 : 0;
-                }
 
-                case TABLE_SECURE: {
-                    final int userId = UserHandle.getCallingUserId();
-                    return deleteSecureSettingLocked(args.name, userId) ? 1 : 0;
-                }
+        switch (args.table) {
+            case TABLE_GLOBAL: {
+                final int userId = UserHandle.getCallingUserId();
+                return deleteGlobalSetting(args.name, userId) ? 1 : 0;
+            }
 
-                case TABLE_SYSTEM: {
-                    final int userId = UserHandle.getCallingUserId();
-                    return deleteSystemSettingLocked(args.name, userId) ? 1 : 0;
-                }
+            case TABLE_SECURE: {
+                final int userId = UserHandle.getCallingUserId();
+                return deleteSecureSetting(args.name, userId) ? 1 : 0;
+            }
 
-                default: {
-                    throw new IllegalArgumentException("Bad Uri path:" + uri);
-                }
+            case TABLE_SYSTEM: {
+                final int userId = UserHandle.getCallingUserId();
+                return deleteSystemSetting(args.name, userId) ? 1 : 0;
+            }
+
+            default: {
+                throw new IllegalArgumentException("Bad Uri path:" + uri);
             }
         }
     }
@@ -454,26 +451,24 @@
             return 0;
         }
 
-        synchronized (mLock) {
-            switch (args.table) {
-                case TABLE_GLOBAL: {
-                    final int userId = UserHandle.getCallingUserId();
-                    return updateGlobalSettingLocked(args.name, value, userId) ? 1 : 0;
-                }
+        switch (args.table) {
+            case TABLE_GLOBAL: {
+                final int userId = UserHandle.getCallingUserId();
+                return updateGlobalSetting(args.name, value, userId) ? 1 : 0;
+            }
 
-                case TABLE_SECURE: {
-                    final int userId = UserHandle.getCallingUserId();
-                    return updateSecureSettingLocked(args.name, value, userId) ? 1 : 0;
-                }
+            case TABLE_SECURE: {
+                final int userId = UserHandle.getCallingUserId();
+                return updateSecureSetting(args.name, value, userId) ? 1 : 0;
+            }
 
-                case TABLE_SYSTEM: {
-                    final int userId = UserHandle.getCallingUserId();
-                    return updateSystemSettingLocked(args.name, value, userId) ? 1 : 0;
-                }
+            case TABLE_SYSTEM: {
+                final int userId = UserHandle.getCallingUserId();
+                return updateSystemSetting(args.name, value, userId) ? 1 : 0;
+            }
 
-                default: {
-                    throw new IllegalArgumentException("Invalid Uri path:" + uri);
-                }
+            default: {
+                throw new IllegalArgumentException("Invalid Uri path:" + uri);
             }
         }
     }
@@ -504,18 +499,18 @@
     private void dumpForUser(int userId, PrintWriter pw) {
         if (userId == UserHandle.USER_OWNER) {
             pw.println("GLOBAL SETTINGS (user " + userId + ")");
-            Cursor globalCursor = getAllGlobalSettingsLocked(ALL_COLUMNS);
+            Cursor globalCursor = getAllGlobalSettings(ALL_COLUMNS);
             dumpSettings(globalCursor, pw);
             pw.println();
         }
 
         pw.println("SECURE SETTINGS (user " + userId + ")");
-        Cursor secureCursor = getAllSecureSettingsLocked(userId, ALL_COLUMNS);
+        Cursor secureCursor = getAllSecureSettings(userId, ALL_COLUMNS);
         dumpSettings(secureCursor, pw);
         pw.println();
 
         pw.println("SYSTEM SETTINGS (user " + userId + ")");
-        Cursor systemCursor = getAllSystemSettingsLocked(userId, ALL_COLUMNS);
+        Cursor systemCursor = getAllSystemSettings(userId, ALL_COLUMNS);
         dumpSettings(systemCursor, pw);
         pw.println();
     }
@@ -575,64 +570,68 @@
                 UserHandle.ALL, true);
     }
 
-    private Cursor getAllGlobalSettingsLocked(String[] projection) {
+    private Cursor getAllGlobalSettings(String[] projection) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "getAllGlobalSettingsLocked()");
+            Slog.v(LOG_TAG, "getAllGlobalSettings()");
         }
 
-        // Get the settings.
-        SettingsState settingsState = mSettingsRegistry.getSettingsLocked(
-                SettingsRegistry.SETTINGS_TYPE_GLOBAL, UserHandle.USER_OWNER);
+        synchronized (mLock) {
+            // Get the settings.
+            SettingsState settingsState = mSettingsRegistry.getSettingsLocked(
+                    SettingsRegistry.SETTINGS_TYPE_GLOBAL, UserHandle.USER_OWNER);
 
-        List<String> names = settingsState.getSettingNamesLocked();
+            List<String> names = settingsState.getSettingNamesLocked();
 
-        final int nameCount = names.size();
+            final int nameCount = names.size();
 
-        String[] normalizedProjection = normalizeProjection(projection);
-        MatrixCursor result = new MatrixCursor(normalizedProjection, nameCount);
+            String[] normalizedProjection = normalizeProjection(projection);
+            MatrixCursor result = new MatrixCursor(normalizedProjection, nameCount);
 
-        // Anyone can get the global settings, so no security checks.
-        for (int i = 0; i < nameCount; i++) {
-            String name = names.get(i);
-            Setting setting = settingsState.getSettingLocked(name);
-            appendSettingToCursor(result, setting);
+            // Anyone can get the global settings, so no security checks.
+            for (int i = 0; i < nameCount; i++) {
+                String name = names.get(i);
+                Setting setting = settingsState.getSettingLocked(name);
+                appendSettingToCursor(result, setting);
+            }
+
+            return result;
         }
-
-        return result;
     }
 
-    private Setting getGlobalSettingLocked(String name) {
+    private Setting getGlobalSetting(String name) {
         if (DEBUG) {
             Slog.v(LOG_TAG, "getGlobalSetting(" + name + ")");
         }
 
         // Get the value.
-        return mSettingsRegistry.getSettingLocked(SettingsRegistry.SETTINGS_TYPE_GLOBAL,
-                UserHandle.USER_OWNER, name);
-    }
-
-    private boolean updateGlobalSettingLocked(String name, String value, int requestingUserId) {
-        if (DEBUG) {
-            Slog.v(LOG_TAG, "updateGlobalSettingLocked(" + name + ", " + value + ")");
+        synchronized (mLock) {
+            return mSettingsRegistry.getSettingLocked(SettingsRegistry.SETTINGS_TYPE_GLOBAL,
+                    UserHandle.USER_OWNER, name);
         }
-        return mutateGlobalSettingLocked(name, value, requestingUserId, MUTATION_OPERATION_UPDATE);
     }
 
-    private boolean insertGlobalSettingLocked(String name, String value, int requestingUserId) {
+    private boolean updateGlobalSetting(String name, String value, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "insertGlobalSettingLocked(" + name + ", " + value + ")");
+            Slog.v(LOG_TAG, "updateGlobalSetting(" + name + ", " + value + ")");
         }
-        return mutateGlobalSettingLocked(name, value, requestingUserId, MUTATION_OPERATION_INSERT);
+        return mutateGlobalSetting(name, value, requestingUserId, MUTATION_OPERATION_UPDATE);
     }
 
-    private boolean deleteGlobalSettingLocked(String name, int requestingUserId) {
+    private boolean insertGlobalSetting(String name, String value, int requestingUserId) {
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "insertGlobalSetting(" + name + ", " + value + ")");
+        }
+        return mutateGlobalSetting(name, value, requestingUserId, MUTATION_OPERATION_INSERT);
+    }
+
+    private boolean deleteGlobalSetting(String name, int requestingUserId) {
         if (DEBUG) {
             Slog.v(LOG_TAG, "deleteGlobalSettingLocked(" + name + ")");
         }
-        return mutateGlobalSettingLocked(name, null, requestingUserId, MUTATION_OPERATION_DELETE);
+        return mutateGlobalSetting(name, null, requestingUserId, MUTATION_OPERATION_DELETE);
     }
 
-    private boolean mutateGlobalSettingLocked(String name, String value, int requestingUserId,
+    private boolean mutateGlobalSetting(String name, String value, int requestingUserId,
             int operation) {
         // Make sure the caller can change the settings - treated as secure.
         enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);
@@ -651,28 +650,32 @@
         }
 
         // Perform the mutation.
-        switch (operation) {
-            case MUTATION_OPERATION_INSERT: {
-                return mSettingsRegistry.insertSettingLocked(SettingsRegistry.SETTINGS_TYPE_GLOBAL,
-                        UserHandle.USER_OWNER, name, value, getCallingPackage());
-            }
+        synchronized (mLock) {
+            switch (operation) {
+                case MUTATION_OPERATION_INSERT: {
+                    return mSettingsRegistry
+                            .insertSettingLocked(SettingsRegistry.SETTINGS_TYPE_GLOBAL,
+                                    UserHandle.USER_OWNER, name, value, getCallingPackage());
+                }
 
-            case MUTATION_OPERATION_DELETE: {
-                return mSettingsRegistry.deleteSettingLocked(
-                        SettingsRegistry.SETTINGS_TYPE_GLOBAL,
-                        UserHandle.USER_OWNER, name);
-            }
+                case MUTATION_OPERATION_DELETE: {
+                    return mSettingsRegistry.deleteSettingLocked(
+                            SettingsRegistry.SETTINGS_TYPE_GLOBAL,
+                            UserHandle.USER_OWNER, name);
+                }
 
-            case MUTATION_OPERATION_UPDATE: {
-                return mSettingsRegistry.updateSettingLocked(SettingsRegistry.SETTINGS_TYPE_GLOBAL,
-                        UserHandle.USER_OWNER, name, value, getCallingPackage());
+                case MUTATION_OPERATION_UPDATE: {
+                    return mSettingsRegistry
+                            .updateSettingLocked(SettingsRegistry.SETTINGS_TYPE_GLOBAL,
+                                    UserHandle.USER_OWNER, name, value, getCallingPackage());
+                }
             }
         }
 
         return false;
     }
 
-    private Cursor getAllSecureSettingsLocked(int userId, String[] projection) {
+    private Cursor getAllSecureSettings(int userId, String[] projection) {
         if (DEBUG) {
             Slog.v(LOG_TAG, "getAllSecureSettings(" + userId + ")");
         }
@@ -680,34 +683,36 @@
         // Resolve the userId on whose behalf the call is made.
         final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(userId);
 
-        List<String> names = mSettingsRegistry.getSettingsNamesLocked(
-                SettingsRegistry.SETTINGS_TYPE_SECURE, callingUserId);
+        synchronized (mLock) {
+            List<String> names = mSettingsRegistry.getSettingsNamesLocked(
+                    SettingsRegistry.SETTINGS_TYPE_SECURE, callingUserId);
 
-        final int nameCount = names.size();
+            final int nameCount = names.size();
 
-        String[] normalizedProjection = normalizeProjection(projection);
-        MatrixCursor result = new MatrixCursor(normalizedProjection, nameCount);
+            String[] normalizedProjection = normalizeProjection(projection);
+            MatrixCursor result = new MatrixCursor(normalizedProjection, nameCount);
 
-        for (int i = 0; i < nameCount; i++) {
-            String name = names.get(i);
+            for (int i = 0; i < nameCount; i++) {
+                String name = names.get(i);
+                // Determine the owning user as some profile settings are cloned from the parent.
+                final int owningUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId,
+                        name);
 
-            // Determine the owning user as some profile settings are cloned from the parent.
-            final int owningUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId, name);
+                // Special case for location (sigh).
+                if (isLocationProvidersAllowedRestricted(name, callingUserId, owningUserId)) {
+                    return null;
+                }
 
-            // Special case for location (sigh).
-            if (isLocationProvidersAllowedRestricted(name, callingUserId, owningUserId)) {
-                return null;
+                Setting setting = mSettingsRegistry.getSettingLocked(
+                        SettingsRegistry.SETTINGS_TYPE_SECURE, owningUserId, name);
+                appendSettingToCursor(result, setting);
             }
 
-            Setting setting = mSettingsRegistry.getSettingLocked(
-                    SettingsRegistry.SETTINGS_TYPE_SECURE, owningUserId, name);
-            appendSettingToCursor(result, setting);
+            return result;
         }
-
-        return result;
     }
 
-    private Setting getSecureSettingLocked(String name, int requestingUserId) {
+    private Setting getSecureSetting(String name, int requestingUserId) {
         if (DEBUG) {
             Slog.v(LOG_TAG, "getSecureSetting(" + name + ", " + requestingUserId + ")");
         }
@@ -724,37 +729,39 @@
         }
 
         // Get the value.
-        return mSettingsRegistry.getSettingLocked(SettingsRegistry.SETTINGS_TYPE_SECURE,
-                owningUserId, name);
+        synchronized (mLock) {
+            return mSettingsRegistry.getSettingLocked(SettingsRegistry.SETTINGS_TYPE_SECURE,
+                    owningUserId, name);
+        }
     }
 
-    private boolean insertSecureSettingLocked(String name, String value, int requestingUserId) {
+    private boolean insertSecureSetting(String name, String value, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "insertSecureSettingLocked(" + name + ", " + value + ", "
+            Slog.v(LOG_TAG, "insertSecureSetting(" + name + ", " + value + ", "
                     + requestingUserId + ")");
         }
 
-        return mutateSecureSettingLocked(name, value, requestingUserId, MUTATION_OPERATION_INSERT);
+        return mutateSecureSetting(name, value, requestingUserId, MUTATION_OPERATION_INSERT);
     }
 
-    private boolean deleteSecureSettingLocked(String name, int requestingUserId) {
+    private boolean deleteSecureSetting(String name, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "deleteSecureSettingLocked(" + name + ", " + requestingUserId + ")");
+            Slog.v(LOG_TAG, "deleteSecureSetting(" + name + ", " + requestingUserId + ")");
         }
 
-        return mutateSecureSettingLocked(name, null, requestingUserId, MUTATION_OPERATION_DELETE);
+        return mutateSecureSetting(name, null, requestingUserId, MUTATION_OPERATION_DELETE);
     }
 
-    private boolean updateSecureSettingLocked(String name, String value, int requestingUserId) {
+    private boolean updateSecureSetting(String name, String value, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "updateSecureSettingLocked(" + name + ", " + value + ", "
+            Slog.v(LOG_TAG, "updateSecureSetting(" + name + ", " + value + ", "
                     + requestingUserId + ")");
         }
 
-        return mutateSecureSettingLocked(name, value, requestingUserId, MUTATION_OPERATION_UPDATE);
+        return mutateSecureSetting(name, value, requestingUserId, MUTATION_OPERATION_UPDATE);
     }
 
-    private boolean mutateSecureSettingLocked(String name, String value, int requestingUserId,
+    private boolean mutateSecureSetting(String name, String value, int requestingUserId,
             int operation) {
         // Make sure the caller can change the settings.
         enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);
@@ -786,58 +793,65 @@
         }
 
         // Mutate the value.
-        switch(operation) {
-            case MUTATION_OPERATION_INSERT: {
-                return mSettingsRegistry.insertSettingLocked(SettingsRegistry.SETTINGS_TYPE_SECURE,
-                        owningUserId, name, value, getCallingPackage());
-            }
+        synchronized (mLock) {
+            switch (operation) {
+                case MUTATION_OPERATION_INSERT: {
+                    return mSettingsRegistry
+                            .insertSettingLocked(SettingsRegistry.SETTINGS_TYPE_SECURE,
+                                    owningUserId, name, value, getCallingPackage());
+                }
 
-            case MUTATION_OPERATION_DELETE: {
-                return mSettingsRegistry.deleteSettingLocked(
-                        SettingsRegistry.SETTINGS_TYPE_SECURE,
-                        owningUserId, name);
-            }
+                case MUTATION_OPERATION_DELETE: {
+                    return mSettingsRegistry.deleteSettingLocked(
+                            SettingsRegistry.SETTINGS_TYPE_SECURE,
+                            owningUserId, name);
+                }
 
-            case MUTATION_OPERATION_UPDATE: {
-                return mSettingsRegistry.updateSettingLocked(SettingsRegistry.SETTINGS_TYPE_SECURE,
-                        owningUserId, name, value, getCallingPackage());
+                case MUTATION_OPERATION_UPDATE: {
+                    return mSettingsRegistry
+                            .updateSettingLocked(SettingsRegistry.SETTINGS_TYPE_SECURE,
+                                    owningUserId, name, value, getCallingPackage());
+                }
             }
         }
 
         return false;
     }
 
-    private Cursor getAllSystemSettingsLocked(int userId, String[] projection) {
+    private Cursor getAllSystemSettings(int userId, String[] projection) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "getAllSecureSystemLocked(" + userId + ")");
+            Slog.v(LOG_TAG, "getAllSecureSystem(" + userId + ")");
         }
 
         // Resolve the userId on whose behalf the call is made.
         final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(userId);
 
-        List<String> names = mSettingsRegistry.getSettingsNamesLocked(
-                SettingsRegistry.SETTINGS_TYPE_SYSTEM, callingUserId);
+        synchronized (mLock) {
+            List<String> names = mSettingsRegistry.getSettingsNamesLocked(
+                    SettingsRegistry.SETTINGS_TYPE_SYSTEM, callingUserId);
 
-        final int nameCount = names.size();
+            final int nameCount = names.size();
 
-        String[] normalizedProjection = normalizeProjection(projection);
-        MatrixCursor result = new MatrixCursor(normalizedProjection, nameCount);
+            String[] normalizedProjection = normalizeProjection(projection);
+            MatrixCursor result = new MatrixCursor(normalizedProjection, nameCount);
 
-        for (int i = 0; i < nameCount; i++) {
-            String name = names.get(i);
+            for (int i = 0; i < nameCount; i++) {
+                String name = names.get(i);
 
-            // Determine the owning user as some profile settings are cloned from the parent.
-            final int owningUserId = resolveOwningUserIdForSystemSettingLocked(callingUserId, name);
+                // Determine the owning user as some profile settings are cloned from the parent.
+                final int owningUserId = resolveOwningUserIdForSystemSettingLocked(callingUserId,
+                        name);
 
-            Setting setting = mSettingsRegistry.getSettingLocked(
-                    SettingsRegistry.SETTINGS_TYPE_SYSTEM, owningUserId, name);
-            appendSettingToCursor(result, setting);
+                Setting setting = mSettingsRegistry.getSettingLocked(
+                        SettingsRegistry.SETTINGS_TYPE_SYSTEM, owningUserId, name);
+                appendSettingToCursor(result, setting);
+            }
+
+            return result;
         }
-
-        return result;
     }
 
-    private Setting getSystemSettingLocked(String name, int requestingUserId) {
+    private Setting getSystemSetting(String name, int requestingUserId) {
         if (DEBUG) {
             Slog.v(LOG_TAG, "getSystemSetting(" + name + ", " + requestingUserId + ")");
         }
@@ -849,37 +863,39 @@
         final int owningUserId = resolveOwningUserIdForSystemSettingLocked(callingUserId, name);
 
         // Get the value.
-        return mSettingsRegistry.getSettingLocked(SettingsRegistry.SETTINGS_TYPE_SYSTEM,
-                owningUserId, name);
+        synchronized (mLock) {
+            return mSettingsRegistry.getSettingLocked(SettingsRegistry.SETTINGS_TYPE_SYSTEM,
+                    owningUserId, name);
+        }
     }
 
-    private boolean insertSystemSettingLocked(String name, String value, int requestingUserId) {
+    private boolean insertSystemSetting(String name, String value, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "insertSystemSettingLocked(" + name + ", " + value + ", "
+            Slog.v(LOG_TAG, "insertSystemSetting(" + name + ", " + value + ", "
                     + requestingUserId + ")");
         }
 
-        return mutateSystemSettingLocked(name, value, requestingUserId, MUTATION_OPERATION_INSERT);
+        return mutateSystemSetting(name, value, requestingUserId, MUTATION_OPERATION_INSERT);
     }
 
-    private boolean deleteSystemSettingLocked(String name, int requestingUserId) {
+    private boolean deleteSystemSetting(String name, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "deleteSystemSettingLocked(" + name + ", " + requestingUserId + ")");
+            Slog.v(LOG_TAG, "deleteSystemSetting(" + name + ", " + requestingUserId + ")");
         }
 
-        return mutateSystemSettingLocked(name, null, requestingUserId, MUTATION_OPERATION_DELETE);
+        return mutateSystemSetting(name, null, requestingUserId, MUTATION_OPERATION_DELETE);
     }
 
-    private boolean updateSystemSettingLocked(String name, String value, int requestingUserId) {
+    private boolean updateSystemSetting(String name, String value, int requestingUserId) {
         if (DEBUG) {
-            Slog.v(LOG_TAG, "updateSystemSettingLocked(" + name + ", " + value + ", "
+            Slog.v(LOG_TAG, "updateSystemSetting(" + name + ", " + value + ", "
                     + requestingUserId + ")");
         }
 
-        return mutateSystemSettingLocked(name, value, requestingUserId, MUTATION_OPERATION_UPDATE);
+        return mutateSystemSetting(name, value, requestingUserId, MUTATION_OPERATION_UPDATE);
     }
 
-    private boolean mutateSystemSettingLocked(String name, String value, int runAsUserId,
+    private boolean mutateSystemSetting(String name, String value, int runAsUserId,
             int operation) {
         // Make sure the caller can change the settings.
         enforceWritePermission(Manifest.permission.WRITE_SETTINGS);
@@ -904,27 +920,31 @@
         }
 
         // Mutate the value.
-        switch (operation) {
-            case MUTATION_OPERATION_INSERT: {
-                validateSystemSettingValue(name, value);
-                return mSettingsRegistry.insertSettingLocked(SettingsRegistry.SETTINGS_TYPE_SYSTEM,
-                        owningUserId, name, value, getCallingPackage());
+        synchronized (mLock) {
+            switch (operation) {
+                case MUTATION_OPERATION_INSERT: {
+                    validateSystemSettingValue(name, value);
+                    return mSettingsRegistry
+                            .insertSettingLocked(SettingsRegistry.SETTINGS_TYPE_SYSTEM,
+                                    owningUserId, name, value, getCallingPackage());
+                }
+
+                case MUTATION_OPERATION_DELETE: {
+                    return mSettingsRegistry.deleteSettingLocked(
+                            SettingsRegistry.SETTINGS_TYPE_SYSTEM,
+                            owningUserId, name);
+                }
+
+                case MUTATION_OPERATION_UPDATE: {
+                    validateSystemSettingValue(name, value);
+                    return mSettingsRegistry
+                            .updateSettingLocked(SettingsRegistry.SETTINGS_TYPE_SYSTEM,
+                                    owningUserId, name, value, getCallingPackage());
+                }
             }
 
-            case MUTATION_OPERATION_DELETE: {
-                return mSettingsRegistry.deleteSettingLocked(
-                        SettingsRegistry.SETTINGS_TYPE_SYSTEM,
-                        owningUserId, name);
-            }
-
-            case MUTATION_OPERATION_UPDATE: {
-                validateSystemSettingValue(name, value);
-                return mSettingsRegistry.updateSettingLocked(SettingsRegistry.SETTINGS_TYPE_SYSTEM,
-                        owningUserId, name, value, getCallingPackage());
-            }
+            return false;
         }
-
-        return false;
     }
 
     private void validateSystemSettingValue(String name, String value) {
@@ -1043,6 +1063,7 @@
         // user info is a cached instance, so just look up instead of cache.
         final long identity = Binder.clearCallingIdentity();
         try {
+            // Just a lookup and not reentrant, so holding a lock is fine.
             UserInfo userInfo = mUserManager.getProfileParent(userId);
             return (userInfo != null) ? userInfo.id : userId;
         } finally {
@@ -1088,7 +1109,7 @@
         // skip prefix
         value = value.substring(1);
 
-        Setting settingValue = getSecureSettingLocked(
+        Setting settingValue = getSecureSetting(
                 Settings.Secure.LOCATION_PROVIDERS_ALLOWED, owningUserId);
 
         String oldProviders = (settingValue != null) ? settingValue.getValue() : "";