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

bug:20443441

Change-Id: I704520b75f5deaeeb1b4098cda0783c667e8cdd1
This commit is contained in:
Svetoslav
2015-05-20 17:01:10 -07:00
parent d8ecc5aee4
commit 7ec28e8513

View File

@@ -201,14 +201,14 @@ public class SettingsProvider extends ContentProvider {
@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 @@ public class SettingsProvider extends ContentProvider {
@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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
}
// 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 @@ public class SettingsProvider extends ContentProvider {
// 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 @@ public class SettingsProvider extends ContentProvider {
}
// 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 @@ public class SettingsProvider extends ContentProvider {
}
// 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 @@ public class SettingsProvider extends ContentProvider {
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 @@ public class SettingsProvider extends ContentProvider {
}
// 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 @@ public class SettingsProvider extends ContentProvider {
// 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 @@ public class SettingsProvider extends ContentProvider {
// skip prefix
value = value.substring(1);
Setting settingValue = getSecureSettingLocked(
Setting settingValue = getSecureSetting(
Settings.Secure.LOCATION_PROVIDERS_ALLOWED, owningUserId);
String oldProviders = (settingValue != null) ? settingValue.getValue() : "";