diff options
-rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 578 |
1 files changed, 246 insertions, 332 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 4e2fad0bece2..95d7039859b5 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -40,7 +40,6 @@ import static com.android.providers.settings.SettingsState.getUserIdFromKey; import static com.android.providers.settings.SettingsState.isConfigSettingsKey; import static com.android.providers.settings.SettingsState.isGlobalSettingsKey; import static com.android.providers.settings.SettingsState.isSecureSettingsKey; -import static com.android.providers.settings.SettingsState.isSsaidSettingsKey; import static com.android.providers.settings.SettingsState.isSystemSettingsKey; import static com.android.providers.settings.SettingsState.makeKey; @@ -412,6 +411,9 @@ public class SettingsProvider extends ContentProvider { SettingsState.cacheSystemPackageNamesAndSystemSignature(getContext()); synchronized (mLock) { mSettingsRegistry.migrateAllLegacySettingsIfNeededLocked(); + for (UserInfo user : mUserManager.getAliveUsers()) { + mSettingsRegistry.ensureSettingsForUserLocked(user.id); + } mSettingsRegistry.syncSsaidTableOnStartLocked(); } mHandler.post(() -> { @@ -427,65 +429,53 @@ public class SettingsProvider extends ContentProvider { public Bundle call(String method, String name, Bundle args) { final int requestingUserId = getRequestingUserId(args); switch (method) { - case Settings.CALL_METHOD_GET_CONFIG: { + case Settings.CALL_METHOD_GET_CONFIG -> { Setting setting = getConfigSetting(name); return packageValueForCallResult(SETTINGS_TYPE_CONFIG, name, requestingUserId, setting, isTrackingGeneration(args)); } - - case Settings.CALL_METHOD_GET_GLOBAL: { + case Settings.CALL_METHOD_GET_GLOBAL -> { Setting setting = getGlobalSetting(name); return packageValueForCallResult(SETTINGS_TYPE_GLOBAL, name, requestingUserId, setting, isTrackingGeneration(args)); } - - case Settings.CALL_METHOD_GET_SECURE: { + case Settings.CALL_METHOD_GET_SECURE -> { Setting setting = getSecureSetting(name, requestingUserId); return packageValueForCallResult(SETTINGS_TYPE_SECURE, name, requestingUserId, setting, isTrackingGeneration(args)); } - - case Settings.CALL_METHOD_GET_SYSTEM: { + case Settings.CALL_METHOD_GET_SYSTEM -> { Setting setting = getSystemSetting(name, requestingUserId); return packageValueForCallResult(SETTINGS_TYPE_SYSTEM, name, requestingUserId, setting, isTrackingGeneration(args)); } - - case Settings.CALL_METHOD_PUT_CONFIG: { + case Settings.CALL_METHOD_PUT_CONFIG -> { String value = getSettingValue(args); final boolean makeDefault = getSettingMakeDefault(args); insertConfigSetting(name, value, makeDefault); - break; } - - case Settings.CALL_METHOD_PUT_GLOBAL: { + case Settings.CALL_METHOD_PUT_GLOBAL -> { String value = getSettingValue(args); String tag = getSettingTag(args); final boolean makeDefault = getSettingMakeDefault(args); final boolean overrideableByRestore = getSettingOverrideableByRestore(args); insertGlobalSetting(name, value, tag, makeDefault, requestingUserId, false, overrideableByRestore); - break; } - - case Settings.CALL_METHOD_PUT_SECURE: { + case Settings.CALL_METHOD_PUT_SECURE -> { String value = getSettingValue(args); String tag = getSettingTag(args); final boolean makeDefault = getSettingMakeDefault(args); final boolean overrideableByRestore = getSettingOverrideableByRestore(args); insertSecureSetting(name, value, tag, makeDefault, requestingUserId, false, overrideableByRestore); - break; } - - case Settings.CALL_METHOD_PUT_SYSTEM: { + case Settings.CALL_METHOD_PUT_SYSTEM -> { String value = getSettingValue(args); boolean overrideableByRestore = getSettingOverrideableByRestore(args); insertSystemSetting(name, value, requestingUserId, overrideableByRestore); - break; } - - case Settings.CALL_METHOD_SET_ALL_CONFIG: { + case Settings.CALL_METHOD_SET_ALL_CONFIG -> { String prefix = getSettingPrefix(args); Map<String, String> flags = getSettingFlags(args); Bundle result = new Bundle(); @@ -493,120 +483,96 @@ public class SettingsProvider extends ContentProvider { setAllConfigSettings(prefix, flags)); return result; } - - case Settings.CALL_METHOD_SET_SYNC_DISABLED_MODE_CONFIG: { + case Settings.CALL_METHOD_SET_SYNC_DISABLED_MODE_CONFIG -> { final int mode = getSyncDisabledMode(args); setSyncDisabledModeConfig(mode); - break; } - - case Settings.CALL_METHOD_GET_SYNC_DISABLED_MODE_CONFIG: { + case Settings.CALL_METHOD_GET_SYNC_DISABLED_MODE_CONFIG -> { Bundle result = new Bundle(); result.putInt(Settings.KEY_CONFIG_GET_SYNC_DISABLED_MODE_RETURN, getSyncDisabledModeConfig()); return result; } - - case Settings.CALL_METHOD_RESET_CONFIG: { + case Settings.CALL_METHOD_RESET_CONFIG -> { final int mode = getResetModeEnforcingPermission(args); String prefix = getSettingPrefix(args); resetConfigSetting(mode, prefix); - break; } - - case Settings.CALL_METHOD_RESET_GLOBAL: { + case Settings.CALL_METHOD_RESET_GLOBAL -> { final int mode = getResetModeEnforcingPermission(args); String tag = getSettingTag(args); resetGlobalSetting(requestingUserId, mode, tag); - break; } - - case Settings.CALL_METHOD_RESET_SECURE: { + case Settings.CALL_METHOD_RESET_SECURE -> { final int mode = getResetModeEnforcingPermission(args); String tag = getSettingTag(args); resetSecureSetting(requestingUserId, mode, tag); - break; } - - case Settings.CALL_METHOD_RESET_SYSTEM: { + case Settings.CALL_METHOD_RESET_SYSTEM -> { final int mode = getResetModeEnforcingPermission(args); String tag = getSettingTag(args); resetSystemSetting(requestingUserId, mode, tag); - break; } - - case Settings.CALL_METHOD_DELETE_CONFIG: { - int rows = deleteConfigSetting(name) ? 1 : 0; + case Settings.CALL_METHOD_DELETE_CONFIG -> { + int rows = deleteConfigSetting(name) ? 1 : 0; Bundle result = new Bundle(); result.putInt(RESULT_ROWS_DELETED, rows); return result; } - - case Settings.CALL_METHOD_DELETE_GLOBAL: { + case Settings.CALL_METHOD_DELETE_GLOBAL -> { int rows = deleteGlobalSetting(name, requestingUserId, false) ? 1 : 0; Bundle result = new Bundle(); result.putInt(RESULT_ROWS_DELETED, rows); return result; } - - case Settings.CALL_METHOD_DELETE_SECURE: { + case Settings.CALL_METHOD_DELETE_SECURE -> { int rows = deleteSecureSetting(name, requestingUserId, false) ? 1 : 0; Bundle result = new Bundle(); result.putInt(RESULT_ROWS_DELETED, rows); return result; } - - case Settings.CALL_METHOD_DELETE_SYSTEM: { + case Settings.CALL_METHOD_DELETE_SYSTEM -> { int rows = deleteSystemSetting(name, requestingUserId) ? 1 : 0; Bundle result = new Bundle(); result.putInt(RESULT_ROWS_DELETED, rows); return result; } - - case Settings.CALL_METHOD_LIST_CONFIG: { + case Settings.CALL_METHOD_LIST_CONFIG -> { String prefix = getSettingPrefix(args); Bundle result = packageValuesForCallResult(prefix, getAllConfigFlags(prefix), isTrackingGeneration(args)); reportDeviceConfigAccess(prefix); return result; } - - case Settings.CALL_METHOD_REGISTER_MONITOR_CALLBACK_CONFIG: { + case Settings.CALL_METHOD_REGISTER_MONITOR_CALLBACK_CONFIG -> { RemoteCallback callback = args.getParcelable( Settings.CALL_METHOD_MONITOR_CALLBACK_KEY); setMonitorCallback(callback); - break; } - - case Settings.CALL_METHOD_UNREGISTER_MONITOR_CALLBACK_CONFIG: { + case Settings.CALL_METHOD_UNREGISTER_MONITOR_CALLBACK_CONFIG -> { clearMonitorCallback(); - break; } - - case Settings.CALL_METHOD_LIST_GLOBAL: { + case Settings.CALL_METHOD_LIST_GLOBAL -> { Bundle result = new Bundle(); result.putStringArrayList(RESULT_SETTINGS_LIST, buildSettingsList(getAllGlobalSettings(null))); return result; } - - case Settings.CALL_METHOD_LIST_SECURE: { + case Settings.CALL_METHOD_LIST_SECURE -> { Bundle result = new Bundle(); result.putStringArrayList(RESULT_SETTINGS_LIST, buildSettingsList(getAllSecureSettings(requestingUserId, null))); return result; } - - case Settings.CALL_METHOD_LIST_SYSTEM: { + case Settings.CALL_METHOD_LIST_SYSTEM -> { Bundle result = new Bundle(); result.putStringArrayList(RESULT_SETTINGS_LIST, buildSettingsList(getAllSystemSettings(requestingUserId, null))); return result; } - - default: { + default -> { Slog.w(LOG_TAG, "call() with invalid method: " + method); - } break; + } } return null; @@ -638,7 +604,7 @@ public class SettingsProvider extends ContentProvider { } switch (args.table) { - case TABLE_GLOBAL: { + case TABLE_GLOBAL -> { if (args.name != null) { Setting setting = getGlobalSetting(args.name); return packageSettingForQuery(setting, normalizedProjection); @@ -646,8 +612,7 @@ public class SettingsProvider extends ContentProvider { return getAllGlobalSettings(projection); } } - - case TABLE_SECURE: { + case TABLE_SECURE -> { final int userId = UserHandle.getCallingUserId(); if (args.name != null) { Setting setting = getSecureSetting(args.name, userId); @@ -656,8 +621,7 @@ public class SettingsProvider extends ContentProvider { return getAllSecureSettings(userId, projection); } } - - case TABLE_SYSTEM: { + case TABLE_SYSTEM -> { final int userId = UserHandle.getCallingUserId(); if (args.name != null) { Setting setting = getSystemSetting(args.name, userId); @@ -666,8 +630,7 @@ public class SettingsProvider extends ContentProvider { return getAllSystemSettings(userId, projection); } } - - default: { + default -> { throw new IllegalArgumentException("Invalid Uri path:" + uri); } } @@ -708,30 +671,27 @@ public class SettingsProvider extends ContentProvider { String value = values.getAsString(Settings.Secure.VALUE); switch (table) { - case TABLE_GLOBAL: { + case TABLE_GLOBAL -> { if (insertGlobalSetting(name, value, null, false, UserHandle.getCallingUserId(), false, /* overrideableByRestore */ false)) { - return Uri.withAppendedPath(Settings.Global.CONTENT_URI, name); + return Uri.withAppendedPath(Global.CONTENT_URI, name); } - } break; - - case TABLE_SECURE: { + } + case TABLE_SECURE -> { if (insertSecureSetting(name, value, null, false, UserHandle.getCallingUserId(), false, /* overrideableByRestore */ false)) { - return Uri.withAppendedPath(Settings.Secure.CONTENT_URI, name); + return Uri.withAppendedPath(Secure.CONTENT_URI, name); } - } break; - - case TABLE_SYSTEM: { + } + case TABLE_SYSTEM -> { if (insertSystemSetting(name, value, UserHandle.getCallingUserId(), /* overridableByRestore */ false)) { return Uri.withAppendedPath(Settings.System.CONTENT_URI, name); } - } break; - - default: { + } + default -> { throw new IllegalArgumentException("Bad Uri path:" + uri); } } @@ -775,22 +735,19 @@ public class SettingsProvider extends ContentProvider { } switch (args.table) { - case TABLE_GLOBAL: { + case TABLE_GLOBAL -> { final int userId = UserHandle.getCallingUserId(); return deleteGlobalSetting(args.name, userId, false) ? 1 : 0; } - - case TABLE_SECURE: { + case TABLE_SECURE -> { final int userId = UserHandle.getCallingUserId(); return deleteSecureSetting(args.name, userId, false) ? 1 : 0; } - - case TABLE_SYSTEM: { + case TABLE_SYSTEM -> { final int userId = UserHandle.getCallingUserId(); return deleteSystemSetting(args.name, userId) ? 1 : 0; } - - default: { + default -> { throw new IllegalArgumentException("Bad Uri path:" + uri); } } @@ -816,24 +773,21 @@ public class SettingsProvider extends ContentProvider { String value = values.getAsString(Settings.Secure.VALUE); switch (args.table) { - case TABLE_GLOBAL: { + case TABLE_GLOBAL -> { final int userId = UserHandle.getCallingUserId(); return updateGlobalSetting(args.name, value, null, false, userId, false) ? 1 : 0; } - - case TABLE_SECURE: { + case TABLE_SECURE -> { final int userId = UserHandle.getCallingUserId(); return updateSecureSetting(args.name, value, null, false, userId, false) ? 1 : 0; } - - case TABLE_SYSTEM: { + case TABLE_SYSTEM -> { final int userId = UserHandle.getCallingUserId(); return updateSystemSetting(args.name, value, userId) ? 1 : 0; } - - default: { + default -> { throw new IllegalArgumentException("Invalid Uri path:" + uri); } } @@ -1034,27 +988,38 @@ public class SettingsProvider extends ContentProvider { private void registerBroadcastReceivers() { IntentFilter userFilter = new IntentFilter(); + userFilter.addAction(Intent.ACTION_USER_ADDED); userFilter.addAction(Intent.ACTION_USER_REMOVED); userFilter.addAction(Intent.ACTION_USER_STOPPED); getContext().registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + if (intent.getAction() == null) { + return; + } final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, - UserHandle.USER_SYSTEM); + UserHandle.USER_NULL); + if (userId == UserHandle.USER_NULL) { + return; + } switch (intent.getAction()) { - case Intent.ACTION_USER_REMOVED: { + case Intent.ACTION_USER_ADDED -> { + synchronized (mLock) { + mSettingsRegistry.ensureSettingsForUserLocked(userId); + } + } + case Intent.ACTION_USER_REMOVED -> { synchronized (mLock) { mSettingsRegistry.removeUserStateLocked(userId, true); } - } break; - - case Intent.ACTION_USER_STOPPED: { + } + case Intent.ACTION_USER_STOPPED -> { synchronized (mLock) { mSettingsRegistry.removeUserStateLocked(userId, false); } - } break; + } } } }, userFilter); @@ -1350,26 +1315,24 @@ public class SettingsProvider extends ContentProvider { // Perform the mutation. synchronized (mLock) { switch (operation) { - case MUTATION_OPERATION_INSERT: { + case MUTATION_OPERATION_INSERT -> { enforceDeviceConfigWritePermission(getContext(), Collections.singleton(name)); return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM, name, value, null, makeDefault, true, callingPackage, false, null, /* overrideableByRestore */ false); } - - case MUTATION_OPERATION_DELETE: { + case MUTATION_OPERATION_DELETE -> { enforceDeviceConfigWritePermission(getContext(), Collections.singleton(name)); return mSettingsRegistry.deleteSettingLocked(SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM, name, false, null); } - - case MUTATION_OPERATION_RESET: { + case MUTATION_OPERATION_RESET -> { enforceDeviceConfigWritePermission(getContext(), getAllConfigFlags(prefix).keySet()); - mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_CONFIG, + return mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM, callingPackage, mode, null, prefix); - } return true; + } } } @@ -1523,7 +1486,7 @@ public class SettingsProvider extends ContentProvider { enforceHasAtLeastOnePermission(Manifest.permission.WRITE_SECURE_SETTINGS); // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(requestingUserId); // If this is a setting that is currently restricted for this user, do not allow // unrestricting changes. @@ -1536,28 +1499,25 @@ public class SettingsProvider extends ContentProvider { // Perform the mutation. synchronized (mLock) { switch (operation) { - case MUTATION_OPERATION_INSERT: { + case MUTATION_OPERATION_INSERT -> { return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM, name, value, tag, makeDefault, callingPackage, forceNotify, CRITICAL_GLOBAL_SETTINGS, overrideableByRestore); } - - case MUTATION_OPERATION_DELETE: { + case MUTATION_OPERATION_DELETE -> { return mSettingsRegistry.deleteSettingLocked(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM, name, forceNotify, CRITICAL_GLOBAL_SETTINGS); } - - case MUTATION_OPERATION_UPDATE: { + case MUTATION_OPERATION_UPDATE -> { return mSettingsRegistry.updateSettingLocked(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM, name, value, tag, makeDefault, callingPackage, forceNotify, CRITICAL_GLOBAL_SETTINGS); } - - case MUTATION_OPERATION_RESET: { - mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_GLOBAL, + case MUTATION_OPERATION_RESET -> { + return mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM, callingPackage, mode, tag); - } return true; + } } } @@ -1580,12 +1540,12 @@ public class SettingsProvider extends ContentProvider { } // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(userId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(userId); // The relevant "calling package" userId will be the owning userId for some // profiles, and we can't do the lookup inside our [lock held] loop, so work out // up front who the effective "new SSAID" user ID for that settings name will be. - final int ssaidUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId, + final int ssaidUserId = resolveOwningUserIdForSecureSetting(callingUserId, Settings.Secure.ANDROID_ID); final PackageInfo ssaidCallingPkg = getCallingPackageInfo(ssaidUserId); @@ -1600,7 +1560,7 @@ public class SettingsProvider extends ContentProvider { 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, + final int owningUserId = resolveOwningUserIdForSecureSetting(callingUserId, name); if (!isSecureSettingAccessible(name)) { @@ -1638,13 +1598,13 @@ public class SettingsProvider extends ContentProvider { } // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(requestingUserId); // Ensure the caller can access the setting. enforceSettingReadable(name, SETTINGS_TYPE_SECURE, UserHandle.getCallingUserId()); // Determine the owning user as some profile settings are cloned from the parent. - final int owningUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId, name); + final int owningUserId = resolveOwningUserIdForSecureSetting(callingUserId, name); if (!isSecureSettingAccessible(name)) { // This caller is not permitted to access this setting. Pretend the setting doesn't @@ -1811,7 +1771,7 @@ public class SettingsProvider extends ContentProvider { enforceHasAtLeastOnePermission(Manifest.permission.WRITE_SECURE_SETTINGS); // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(requestingUserId); // If this is a setting that is currently restricted for this user, do not allow // unrestricting changes. @@ -1820,7 +1780,7 @@ public class SettingsProvider extends ContentProvider { } // Determine the owning user as some profile settings are cloned from the parent. - final int owningUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId, name); + final int owningUserId = resolveOwningUserIdForSecureSetting(callingUserId, name); // Only the owning user can change the setting. if (owningUserId != callingUserId) { @@ -1832,28 +1792,25 @@ public class SettingsProvider extends ContentProvider { // Mutate the value. synchronized (mLock) { switch (operation) { - case MUTATION_OPERATION_INSERT: { + case MUTATION_OPERATION_INSERT -> { return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_SECURE, owningUserId, name, value, tag, makeDefault, callingPackage, forceNotify, CRITICAL_SECURE_SETTINGS, overrideableByRestore); } - - case MUTATION_OPERATION_DELETE: { + case MUTATION_OPERATION_DELETE -> { return mSettingsRegistry.deleteSettingLocked(SETTINGS_TYPE_SECURE, owningUserId, name, forceNotify, CRITICAL_SECURE_SETTINGS); } - - case MUTATION_OPERATION_UPDATE: { + case MUTATION_OPERATION_UPDATE -> { return mSettingsRegistry.updateSettingLocked(SETTINGS_TYPE_SECURE, owningUserId, name, value, tag, makeDefault, callingPackage, forceNotify, CRITICAL_SECURE_SETTINGS); } - - case MUTATION_OPERATION_RESET: { - mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_SECURE, + case MUTATION_OPERATION_RESET -> { + return mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_SECURE, UserHandle.USER_SYSTEM, callingPackage, mode, tag); - } return true; + } } } @@ -1866,7 +1823,7 @@ public class SettingsProvider extends ContentProvider { } // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(userId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(userId); synchronized (mLock) { List<String> names = getSettingsNamesLocked(SETTINGS_TYPE_SYSTEM, callingUserId); @@ -1903,7 +1860,7 @@ public class SettingsProvider extends ContentProvider { } // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(requestingUserId); // Ensure the caller can access the setting. enforceSettingReadable(name, SETTINGS_TYPE_SYSTEM, UserHandle.getCallingUserId()); @@ -1978,7 +1935,7 @@ public class SettingsProvider extends ContentProvider { } // Resolve the userId on whose behalf the call is made. - final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(runAsUserId); + final int callingUserId = resolveCallingUserIdEnforcingPermissions(runAsUserId); if (isSettingRestrictedForUser(name, callingUserId, value, Binder.getCallingUid())) { Slog.e(LOG_TAG, "UserId: " + callingUserId + " is disallowed to change system " @@ -2012,37 +1969,30 @@ public class SettingsProvider extends ContentProvider { // Mutate the value. synchronized (mLock) { switch (operation) { - case MUTATION_OPERATION_INSERT: { + case MUTATION_OPERATION_INSERT -> { validateSystemSettingValue(name, value); success = mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_SYSTEM, owningUserId, name, value, null, false, callingPackage, false, null, overrideableByRestore); - break; } - - case MUTATION_OPERATION_DELETE: { + case MUTATION_OPERATION_DELETE -> { success = mSettingsRegistry.deleteSettingLocked(SETTINGS_TYPE_SYSTEM, owningUserId, name, false, null); - break; } - - case MUTATION_OPERATION_UPDATE: { + case MUTATION_OPERATION_UPDATE -> { validateSystemSettingValue(name, value); success = mSettingsRegistry.updateSettingLocked(SETTINGS_TYPE_SYSTEM, owningUserId, name, value, null, false, callingPackage, false, null); - break; } - - case MUTATION_OPERATION_RESET: { + case MUTATION_OPERATION_RESET -> { success = mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_SYSTEM, runAsUserId, callingPackage, mode, tag); - break; } - - default: + default -> { success = false; Slog.e(LOG_TAG, "Unknown operation code: " + operation); + } } } @@ -2113,8 +2063,8 @@ public class SettingsProvider extends ContentProvider { * Returns {@code true} if the specified secure setting should be accessible to the caller. */ private boolean isSecureSettingAccessible(String name) { - switch (name) { - case "bluetooth_address": + return switch (name) { + case "bluetooth_address" -> // BluetoothManagerService for some reason stores the Android's Bluetooth MAC // address in this secure setting. Secure settings can normally be read by any app, // which thus enables them to bypass the recently introduced restrictions on access @@ -2122,22 +2072,23 @@ public class SettingsProvider extends ContentProvider { // To mitigate this we make this setting available only to callers privileged to see // this device's MAC addresses, same as through public API // BluetoothAdapter.getAddress() (see BluetoothManagerService for details). - return getContext().checkCallingOrSelfPermission( - Manifest.permission.LOCAL_MAC_ADDRESS) == PackageManager.PERMISSION_GRANTED; - default: - return true; - } + getContext().checkCallingOrSelfPermission(Manifest.permission.LOCAL_MAC_ADDRESS) + == PackageManager.PERMISSION_GRANTED; + default -> true; + }; } - private int resolveOwningUserIdForSecureSettingLocked(int userId, String setting) { - return resolveOwningUserIdLocked(userId, sSecureCloneToManagedSettings, setting); + private int resolveOwningUserIdForSecureSetting(int userId, String setting) { + // no need to lock because sSecureCloneToManagedSettings is never modified + return resolveOwningUserId(userId, sSecureCloneToManagedSettings, setting); } + @GuardedBy("mLock") private int resolveOwningUserIdForSystemSettingLocked(int userId, String setting) { final int parentId; // Resolves dependency if setting has a dependency and the calling user has a parent if (sSystemCloneFromParentOnDependency.containsKey(setting) - && (parentId = getGroupParentLocked(userId)) != userId) { + && (parentId = getGroupParent(userId)) != userId) { // The setting has a dependency and the profile has a parent String dependency = sSystemCloneFromParentOnDependency.get(setting); // Lookup the dependency setting as ourselves, some callers may not have access to it. @@ -2151,11 +2102,11 @@ public class SettingsProvider extends ContentProvider { Binder.restoreCallingIdentity(token); } } - return resolveOwningUserIdLocked(userId, sSystemCloneToManagedSettings, setting); + return resolveOwningUserId(userId, sSystemCloneToManagedSettings, setting); } - private int resolveOwningUserIdLocked(int userId, Set<String> keys, String name) { - final int parentId = getGroupParentLocked(userId); + private int resolveOwningUserId(int userId, Set<String> keys, String name) { + final int parentId = getGroupParent(userId); if (parentId != userId && keys.contains(name)) { return parentId; } @@ -2174,9 +2125,8 @@ public class SettingsProvider extends ContentProvider { } switch (operation) { - case MUTATION_OPERATION_INSERT: - // Insert updates. - case MUTATION_OPERATION_UPDATE: { + // Insert updates. + case MUTATION_OPERATION_INSERT, MUTATION_OPERATION_UPDATE -> { if (Settings.System.PUBLIC_SETTINGS.contains(name)) { return; } @@ -2192,9 +2142,8 @@ public class SettingsProvider extends ContentProvider { warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk( packageInfo.applicationInfo.targetSdkVersion, name); - } break; - - case MUTATION_OPERATION_DELETE: { + } + case MUTATION_OPERATION_DELETE -> { if (Settings.System.PUBLIC_SETTINGS.contains(name) || Settings.System.PRIVATE_SETTINGS.contains(name)) { throw new IllegalArgumentException("You cannot delete system defined" @@ -2212,34 +2161,26 @@ public class SettingsProvider extends ContentProvider { warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk( packageInfo.applicationInfo.targetSdkVersion, name); - } break; + } } } - private Set<String> getInstantAppAccessibleSettings(int settingsType) { - switch (settingsType) { - case SETTINGS_TYPE_GLOBAL: - return Settings.Global.INSTANT_APP_SETTINGS; - case SETTINGS_TYPE_SECURE: - return Settings.Secure.INSTANT_APP_SETTINGS; - case SETTINGS_TYPE_SYSTEM: - return Settings.System.INSTANT_APP_SETTINGS; - default: - throw new IllegalArgumentException("Invalid settings type: " + settingsType); - } + private static Set<String> getInstantAppAccessibleSettings(int settingsType) { + return switch (settingsType) { + case SETTINGS_TYPE_GLOBAL -> Global.INSTANT_APP_SETTINGS; + case SETTINGS_TYPE_SECURE -> Secure.INSTANT_APP_SETTINGS; + case SETTINGS_TYPE_SYSTEM -> Settings.System.INSTANT_APP_SETTINGS; + default -> throw new IllegalArgumentException("Invalid settings type: " + settingsType); + }; } - private Set<String> getOverlayInstantAppAccessibleSettings(int settingsType) { - switch (settingsType) { - case SETTINGS_TYPE_GLOBAL: - return OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS; - case SETTINGS_TYPE_SYSTEM: - return OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS; - case SETTINGS_TYPE_SECURE: - return OVERLAY_ALLOWED_SECURE_INSTANT_APP_SETTINGS; - default: - throw new IllegalArgumentException("Invalid settings type: " + settingsType); - } + private static Set<String> getOverlayInstantAppAccessibleSettings(int settingsType) { + return switch (settingsType) { + case SETTINGS_TYPE_GLOBAL -> OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS; + case SETTINGS_TYPE_SYSTEM -> OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS; + case SETTINGS_TYPE_SECURE -> OVERLAY_ALLOWED_SECURE_INSTANT_APP_SETTINGS; + default -> throw new IllegalArgumentException("Invalid settings type: " + settingsType); + }; } @GuardedBy("mLock") @@ -2270,7 +2211,7 @@ public class SettingsProvider extends ContentProvider { switch (settingName) { // missing READ_PRIVILEGED_PHONE_STATE permission protection // see alternative API {@link SubscriptionManager#getPreferredDataSubscriptionId() - case Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION: + case Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION -> { // app-compat handling, not break apps targeting on previous SDKs. if (CompatChanges.isChangeEnabled( ENFORCE_READ_PERMISSION_FOR_MULTI_SIM_DATA_CALL)) { @@ -2278,7 +2219,7 @@ public class SettingsProvider extends ContentProvider { Manifest.permission.READ_PRIVILEGED_PHONE_STATE, "access global settings MULTI_SIM_DATA_CALL_SUBSCRIPTION"); } - break; + } } if (!ai.isInstantApp()) { return; @@ -2306,23 +2247,22 @@ public class SettingsProvider extends ContentProvider { final Set<String> readableFields; final ArrayMap<String, Integer> readableFieldsWithMaxTargetSdk; switch (settingsType) { - case SETTINGS_TYPE_GLOBAL: + case SETTINGS_TYPE_GLOBAL -> { allFields = sAllGlobalSettings; readableFields = sReadableGlobalSettings; readableFieldsWithMaxTargetSdk = sReadableGlobalSettingsWithMaxTargetSdk; - break; - case SETTINGS_TYPE_SYSTEM: + } + case SETTINGS_TYPE_SYSTEM -> { allFields = sAllSystemSettings; readableFields = sReadableSystemSettings; readableFieldsWithMaxTargetSdk = sReadableSystemSettingsWithMaxTargetSdk; - break; - case SETTINGS_TYPE_SECURE: + } + case SETTINGS_TYPE_SECURE -> { allFields = sAllSecureSettings; readableFields = sReadableSecureSettings; readableFieldsWithMaxTargetSdk = sReadableSecureSettingsWithMaxTargetSdk; - break; - default: - throw new IllegalArgumentException("Invalid settings type: " + settingsType); + } + default -> throw new IllegalArgumentException("Invalid settings type: " + settingsType); } if (allFields.contains(settingName)) { @@ -2380,7 +2320,7 @@ public class SettingsProvider extends ContentProvider { throw new IllegalStateException("Calling package doesn't exist"); } - private int getGroupParentLocked(int userId) { + private int getGroupParent(int userId) { // Most frequent use case. if (userId == UserHandle.USER_SYSTEM) { return userId; @@ -2480,7 +2420,7 @@ public class SettingsProvider extends ContentProvider { } } - private static int resolveCallingUserIdEnforcingPermissionsLocked(int requestingUserId) { + private static int resolveCallingUserIdEnforcingPermissions(int requestingUserId) { if (requestingUserId == UserHandle.getCallingUserId()) { return requestingUserId; } @@ -2654,28 +2594,28 @@ public class SettingsProvider extends ContentProvider { private static int getResetModeEnforcingPermission(Bundle args) { final int mode = (args != null) ? args.getInt(Settings.CALL_METHOD_RESET_MODE_KEY) : 0; switch (mode) { - case Settings.RESET_MODE_UNTRUSTED_DEFAULTS: { + case Settings.RESET_MODE_UNTRUSTED_DEFAULTS -> { if (!isCallerSystemOrShellOrRootOnDebuggableBuild()) { throw new SecurityException("Only system, shell/root on a " + "debuggable build can reset to untrusted defaults"); } return mode; } - case Settings.RESET_MODE_UNTRUSTED_CHANGES: { + case Settings.RESET_MODE_UNTRUSTED_CHANGES -> { if (!isCallerSystemOrShellOrRootOnDebuggableBuild()) { throw new SecurityException("Only system, shell/root on a " + "debuggable build can reset untrusted changes"); } return mode; } - case Settings.RESET_MODE_TRUSTED_DEFAULTS: { + case Settings.RESET_MODE_TRUSTED_DEFAULTS -> { if (!isCallerSystemOrShellOrRootOnDebuggableBuild()) { throw new SecurityException("Only system, shell/root on a " + "debuggable build can reset to trusted defaults"); } return mode; } - case Settings.RESET_MODE_PACKAGE_DEFAULTS: { + case Settings.RESET_MODE_PACKAGE_DEFAULTS -> { return mode; } } @@ -2736,21 +2676,18 @@ public class SettingsProvider extends ContentProvider { String column = cursor.getColumnName(i); switch (column) { - case Settings.NameValueTable._ID: { + case Settings.NameValueTable._ID -> { values[i] = setting.getId(); - } break; - - case Settings.NameValueTable.NAME: { + } + case Settings.NameValueTable.NAME -> { values[i] = setting.getName(); - } break; - - case Settings.NameValueTable.VALUE: { + } + case Settings.NameValueTable.VALUE -> { values[i] = setting.getValue(); - } break; - - case Settings.NameValueTable.IS_PRESERVED_IN_RESTORE: { + } + case Settings.NameValueTable.IS_PRESERVED_IN_RESTORE -> { values[i] = String.valueOf(setting.isValuePreservedInRestore()); - } break; + } } } @@ -2762,19 +2699,11 @@ public class SettingsProvider extends ContentProvider { } private String resolveCallingPackage() { - switch (Binder.getCallingUid()) { - case Process.ROOT_UID: { - return "root"; - } - - case Process.SHELL_UID: { - return "com.android.shell"; - } - - default: { - return getCallingPackage(); - } - } + return switch (Binder.getCallingUid()) { + case Process.ROOT_UID -> "root"; + case Process.SHELL_UID -> "com.android.shell"; + default -> getCallingPackage(); + }; } private static final class Arguments { @@ -2796,17 +2725,17 @@ public class SettingsProvider extends ContentProvider { public Arguments(Uri uri, String where, String[] whereArgs, boolean supportAll) { final int segmentSize = uri.getPathSegments().size(); switch (segmentSize) { - case 1: { + case 1 -> { if (where != null && (WHERE_PATTERN_WITH_PARAM_NO_BRACKETS.matcher(where).matches() - || WHERE_PATTERN_WITH_PARAM_IN_BRACKETS.matcher(where).matches()) + || WHERE_PATTERN_WITH_PARAM_IN_BRACKETS.matcher(where).matches()) && whereArgs.length == 1) { name = whereArgs[0]; table = computeTableForSetting(uri, name); return; } else if (where != null && (WHERE_PATTERN_NO_PARAM_NO_BRACKETS.matcher(where).matches() - || WHERE_PATTERN_NO_PARAM_IN_BRACKETS.matcher(where).matches())) { + || WHERE_PATTERN_NO_PARAM_IN_BRACKETS.matcher(where).matches())) { final int startIndex = Math.max(where.indexOf("'"), where.indexOf("\"")) + 1; final int endIndex = Math.max(where.lastIndexOf("'"), @@ -2819,15 +2748,14 @@ public class SettingsProvider extends ContentProvider { table = computeTableForSetting(uri, null); return; } - } break; - - case 2: { + } + case 2 -> { if (where == null && whereArgs == null) { name = uri.getPathSegments().get(1); table = computeTableForSetting(uri, name); return; } - } break; + } } EventLogTags.writeUnsupportedSettingsQuery( @@ -2960,6 +2888,7 @@ public class SettingsProvider extends ContentProvider { mBackupManager = new BackupManager(getContext()); } + @GuardedBy("mLock") private void generateUserKeyLocked(int userId) { // Generate a random key for each user used for creating a new ssaid. final byte[] keyBytes = new byte[32]; @@ -2983,6 +2912,7 @@ public class SettingsProvider extends ContentProvider { return ByteBuffer.allocate(4).putInt(data.length).array(); } + @GuardedBy("mLock") public Setting generateSsaidLocked(PackageInfo callingPkg, int userId) { // Read the user's key from the ssaid table. Setting userKeySetting = getSettingLocked(SETTINGS_TYPE_SSAID, userId, SSAID_USER_KEY); @@ -3044,6 +2974,7 @@ public class SettingsProvider extends ContentProvider { return getSettingLocked(SETTINGS_TYPE_SSAID, userId, uid); } + @GuardedBy("mLock") private void syncSsaidTableOnStartLocked() { // Verify that each user's packages and ssaid's are in sync. for (UserInfo user : mUserManager.getAliveUsers()) { @@ -3078,15 +3009,17 @@ public class SettingsProvider extends ContentProvider { } } + @GuardedBy("mLock") public List<String> getSettingsNamesLocked(int type, int userId) { final int key = makeKey(type, userId); - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState == null) { return new ArrayList<>(); } return settingsState.getSettingNamesLocked(); } + @GuardedBy("mLock") public SparseBooleanArray getKnownUsersLocked() { SparseBooleanArray users = new SparseBooleanArray(); for (int i = mSettingsStates.size()-1; i >= 0; i--) { @@ -3095,17 +3028,19 @@ public class SettingsProvider extends ContentProvider { return users; } + @GuardedBy("mLock") @Nullable public SettingsState getSettingsLocked(int type, int userId) { final int key = makeKey(type, userId); - return peekSettingsStateLocked(key); + return mSettingsStates.get(key); } - public boolean ensureSettingsForUserLocked(int userId) { + @GuardedBy("mLock") + public void ensureSettingsForUserLocked(int userId) { // First make sure this user actually exists. if (mUserManager.getUserInfo(userId) == null) { Slog.wtf(LOG_TAG, "Requested user " + userId + " does not exist"); - return false; + return; } // Migrate the setting for this user if needed. @@ -3143,9 +3078,9 @@ public class SettingsProvider extends ContentProvider { // Upgrade the settings to the latest version. UpgradeController upgrader = new UpgradeController(userId); upgrader.upgradeIfNeededLocked(); - return true; } + @GuardedBy("mLock") private void ensureSettingsStateLocked(int key) { if (mSettingsStates.get(key) == null) { final int maxBytesPerPackage = getMaxBytesPerPackageForType(getTypeFromKey(key)); @@ -3155,6 +3090,7 @@ public class SettingsProvider extends ContentProvider { } } + @GuardedBy("mLock") public void removeUserStateLocked(int userId, boolean permanently) { // We always keep the global settings in memory. @@ -3166,12 +3102,7 @@ public class SettingsProvider extends ContentProvider { mSettingsStates.remove(systemKey); systemSettingsState.destroyLocked(null); } else { - systemSettingsState.destroyLocked(new Runnable() { - @Override - public void run() { - mSettingsStates.remove(systemKey); - } - }); + systemSettingsState.destroyLocked(() -> mSettingsStates.remove(systemKey)); } } @@ -3183,12 +3114,7 @@ public class SettingsProvider extends ContentProvider { mSettingsStates.remove(secureKey); secureSettingsState.destroyLocked(null); } else { - secureSettingsState.destroyLocked(new Runnable() { - @Override - public void run() { - mSettingsStates.remove(secureKey); - } - }); + secureSettingsState.destroyLocked(() -> mSettingsStates.remove(secureKey)); } } @@ -3200,12 +3126,7 @@ public class SettingsProvider extends ContentProvider { mSettingsStates.remove(ssaidKey); ssaidSettingsState.destroyLocked(null); } else { - ssaidSettingsState.destroyLocked(new Runnable() { - @Override - public void run() { - mSettingsStates.remove(ssaidKey); - } - }); + ssaidSettingsState.destroyLocked(() -> mSettingsStates.remove(ssaidKey)); } } @@ -3213,6 +3134,7 @@ public class SettingsProvider extends ContentProvider { mGenerationRegistry.onUserRemoved(userId); } + @GuardedBy("mLock") public boolean insertSettingLocked(int type, int userId, String name, String value, String tag, boolean makeDefault, String packageName, boolean forceNotify, Set<String> criticalSettings, boolean overrideableByRestore) { @@ -3220,6 +3142,7 @@ public class SettingsProvider extends ContentProvider { packageName, forceNotify, criticalSettings, overrideableByRestore); } + @GuardedBy("mLock") public boolean insertSettingLocked(int type, int userId, String name, String value, String tag, boolean makeDefault, boolean forceNonSystemPackage, String packageName, boolean forceNotify, Set<String> criticalSettings, boolean overrideableByRestore) { @@ -3232,7 +3155,7 @@ public class SettingsProvider extends ContentProvider { boolean success = false; boolean wasUnsetNonPredefinedSetting = false; - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState != null) { if (!isSettingPreDefined(name, type) && !settingsState.hasSetting(name)) { wasUnsetNonPredefinedSetting = true; @@ -3264,9 +3187,10 @@ public class SettingsProvider extends ContentProvider { * Set Config Settings using consumed keyValues, returns true if the keyValues can be set, * false otherwise. */ + @GuardedBy("mLock") public boolean setConfigSettingsLocked(int key, String prefix, Map<String, String> keyValues, String packageName) { - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState != null) { if (settingsState.isNewConfigBannedLocked(prefix, keyValues)) { return false; @@ -3283,12 +3207,13 @@ public class SettingsProvider extends ContentProvider { return true; } + @GuardedBy("mLock") public boolean deleteSettingLocked(int type, int userId, String name, boolean forceNotify, Set<String> criticalSettings) { final int key = makeKey(type, userId); boolean success = false; - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState != null) { success = settingsState.deleteSettingLocked(name); } @@ -3306,13 +3231,14 @@ public class SettingsProvider extends ContentProvider { return success; } + @GuardedBy("mLock") public boolean updateSettingLocked(int type, int userId, String name, String value, String tag, boolean makeDefault, String packageName, boolean forceNotify, Set<String> criticalSettings) { final int key = makeKey(type, userId); boolean success = false; - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState != null) { success = settingsState.updateSettingLocked(name, value, tag, makeDefault, packageName); @@ -3331,10 +3257,11 @@ public class SettingsProvider extends ContentProvider { return success; } + @GuardedBy("mLock") public Setting getSettingLocked(int type, int userId, String name) { final int key = makeKey(type, userId); - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState == null) { return null; } @@ -3352,16 +3279,18 @@ public class SettingsProvider extends ContentProvider { return Global.SECURE_FRP_MODE.equals(setting.getName()); } + @GuardedBy("mLock") public boolean resetSettingsLocked(int type, int userId, String packageName, int mode, String tag) { return resetSettingsLocked(type, userId, packageName, mode, tag, /*prefix=*/ null); } + @GuardedBy("mLock") public boolean resetSettingsLocked(int type, int userId, String packageName, int mode, String tag, @Nullable String prefix) { final int key = makeKey(type, userId); - SettingsState settingsState = peekSettingsStateLocked(key); + SettingsState settingsState = mSettingsStates.get(key); if (settingsState == null) { return false; } @@ -3369,7 +3298,7 @@ public class SettingsProvider extends ContentProvider { boolean success = false; banConfigurationIfNecessary(type, prefix, settingsState); switch (mode) { - case Settings.RESET_MODE_PACKAGE_DEFAULTS: { + case Settings.RESET_MODE_PACKAGE_DEFAULTS -> { for (String name : settingsState.getSettingNamesLocked()) { boolean someSettingChanged = false; Setting setting = settingsState.getSettingLocked(name); @@ -3389,9 +3318,8 @@ public class SettingsProvider extends ContentProvider { success = true; } } - } break; - - case Settings.RESET_MODE_UNTRUSTED_DEFAULTS: { + } + case Settings.RESET_MODE_UNTRUSTED_DEFAULTS -> { for (String name : settingsState.getSettingNamesLocked()) { boolean someSettingChanged = false; Setting setting = settingsState.getSettingLocked(name); @@ -3411,9 +3339,8 @@ public class SettingsProvider extends ContentProvider { success = true; } } - } break; - - case Settings.RESET_MODE_UNTRUSTED_CHANGES: { + } + case Settings.RESET_MODE_UNTRUSTED_CHANGES -> { for (String name : settingsState.getSettingNamesLocked()) { boolean someSettingChanged = false; Setting setting = settingsState.getSettingLocked(name); @@ -3439,9 +3366,8 @@ public class SettingsProvider extends ContentProvider { success = true; } } - } break; - - case Settings.RESET_MODE_TRUSTED_DEFAULTS: { + } + case Settings.RESET_MODE_TRUSTED_DEFAULTS -> { for (String name : settingsState.getSettingNamesLocked()) { Setting setting = settingsState.getSettingLocked(name); boolean someSettingChanged = false; @@ -3464,11 +3390,12 @@ public class SettingsProvider extends ContentProvider { success = true; } } - } break; + } } return success; } + @GuardedBy("mLock") public void removeSettingsForPackageLocked(String packageName, int userId) { // Global and secure settings are signature protected. Apps signed // by the platform certificate are generally not uninstalled and @@ -3482,6 +3409,7 @@ public class SettingsProvider extends ContentProvider { } } + @GuardedBy("mLock") public void onUidRemovedLocked(int uid) { final SettingsState ssaidSettings = getSettingsLocked(SETTINGS_TYPE_SSAID, UserHandle.getUserId(uid)); @@ -3490,19 +3418,7 @@ public class SettingsProvider extends ContentProvider { } } - @Nullable - private SettingsState peekSettingsStateLocked(int key) { - SettingsState settingsState = mSettingsStates.get(key); - if (settingsState != null) { - return settingsState; - } - - if (!ensureSettingsForUserLocked(getUserIdFromKey(key))) { - return null; - } - return mSettingsStates.get(key); - } - + @GuardedBy("mLock") private void migrateAllLegacySettingsIfNeededLocked() { final int key = makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM); File globalFile = getSettingsFile(key); @@ -3538,6 +3454,7 @@ public class SettingsProvider extends ContentProvider { } } + @GuardedBy("mLock") private void migrateLegacySettingsForUserIfNeededLocked(int userId) { // Every user has secure settings and if no file we need to migrate. final int secureKey = makeKey(SETTINGS_TYPE_SECURE, userId); @@ -3552,6 +3469,7 @@ public class SettingsProvider extends ContentProvider { migrateLegacySettingsForUserLocked(dbHelper, database, userId); } + @GuardedBy("mLock") private void migrateLegacySettingsForUserLocked(DatabaseHelper dbHelper, SQLiteDatabase database, int userId) { // Move over the system settings. @@ -3596,6 +3514,7 @@ public class SettingsProvider extends ContentProvider { } } + @GuardedBy("mLock") private void migrateLegacySettingsLocked(SettingsState settingsState, SQLiteDatabase database, String table) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); @@ -3630,7 +3549,7 @@ public class SettingsProvider extends ContentProvider { } } - @GuardedBy("secureSettings.mLock") + @GuardedBy("mLock") private void ensureSecureSettingAndroidIdSetLocked(SettingsState secureSettings) { Setting value = secureSettings.getSettingLocked(Settings.Secure.ANDROID_ID); @@ -3706,6 +3625,7 @@ public class SettingsProvider extends ContentProvider { name, type, changeType); } + @GuardedBy("mLock") private void notifyForConfigSettingsChangeLocked(int key, String prefix, List<String> changedSettings) { @@ -3787,30 +3707,18 @@ public class SettingsProvider extends ContentProvider { } } - private File getSettingsFile(int key) { - if (isConfigSettingsKey(key)) { - final int userId = getUserIdFromKey(key); - return new File(Environment.getUserSystemDirectory(userId), - SETTINGS_FILE_CONFIG); - } else if (isGlobalSettingsKey(key)) { - final int userId = getUserIdFromKey(key); - return new File(Environment.getUserSystemDirectory(userId), - SETTINGS_FILE_GLOBAL); - } else if (isSystemSettingsKey(key)) { - final int userId = getUserIdFromKey(key); - return new File(Environment.getUserSystemDirectory(userId), - SETTINGS_FILE_SYSTEM); - } else if (isSecureSettingsKey(key)) { - final int userId = getUserIdFromKey(key); - return new File(Environment.getUserSystemDirectory(userId), - SETTINGS_FILE_SECURE); - } else if (isSsaidSettingsKey(key)) { - final int userId = getUserIdFromKey(key); - return new File(Environment.getUserSystemDirectory(userId), - SETTINGS_FILE_SSAID); - } else { - throw new IllegalArgumentException("Invalid settings key:" + key); - } + private static File getSettingsFile(int key) { + final int userId = getUserIdFromKey(key); + final int type = getTypeFromKey(key); + final File userSystemDirectory = Environment.getUserSystemDirectory(userId); + return switch (type) { + case SETTINGS_TYPE_CONFIG -> new File(userSystemDirectory, SETTINGS_FILE_CONFIG); + case SETTINGS_TYPE_GLOBAL -> new File(userSystemDirectory, SETTINGS_FILE_GLOBAL); + case SETTINGS_TYPE_SYSTEM -> new File(userSystemDirectory, SETTINGS_FILE_SYSTEM); + case SETTINGS_TYPE_SECURE -> new File(userSystemDirectory, SETTINGS_FILE_SECURE); + case SETTINGS_TYPE_SSAID -> new File(userSystemDirectory, SETTINGS_FILE_SSAID); + default -> throw new IllegalArgumentException("Invalid settings key:" + key); + }; } private Uri getNotificationUriFor(int key, String name) { @@ -3833,14 +3741,11 @@ public class SettingsProvider extends ContentProvider { private int getMaxBytesPerPackageForType(int type) { switch (type) { - case SETTINGS_TYPE_CONFIG: - case SETTINGS_TYPE_GLOBAL: - case SETTINGS_TYPE_SECURE: - case SETTINGS_TYPE_SSAID: { + case SETTINGS_TYPE_CONFIG, SETTINGS_TYPE_GLOBAL, SETTINGS_TYPE_SECURE, + SETTINGS_TYPE_SSAID -> { return SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED; } - - default: { + default -> { return SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED; } } @@ -3857,7 +3762,7 @@ public class SettingsProvider extends ContentProvider { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_NOTIFY_URI_CHANGED: { + case MSG_NOTIFY_URI_CHANGED -> { final int userId = msg.arg1; Uri uri = (Uri) msg.obj; try { @@ -3868,12 +3773,11 @@ public class SettingsProvider extends ContentProvider { if (DEBUG) { Slog.v(LOG_TAG, "Notifying for " + userId + ": " + uri); } - } break; - - case MSG_NOTIFY_DATA_CHANGED: { + } + case MSG_NOTIFY_DATA_CHANGED -> { mBackupManager.dataChanged(); scheduleWriteFallbackFilesJob(); - } break; + } } } } @@ -3887,6 +3791,7 @@ public class SettingsProvider extends ContentProvider { mUserId = userId; } + @GuardedBy("mLock") public void upgradeIfNeededLocked() { // The version of all settings for a user is the same (all users have secure). SettingsState secureSettings = getSettingsLocked( @@ -3944,18 +3849,22 @@ public class SettingsProvider extends ContentProvider { systemSettings.setVersionLocked(newVersion); } + @GuardedBy("mLock") private SettingsState getGlobalSettingsLocked() { return getSettingsLocked(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM); } + @GuardedBy("mLock") private SettingsState getSecureSettingsLocked(int userId) { return getSettingsLocked(SETTINGS_TYPE_SECURE, userId); } + @GuardedBy("mLock") private SettingsState getSsaidSettingsLocked(int userId) { return getSettingsLocked(SETTINGS_TYPE_SSAID, userId); } + @GuardedBy("mLock") private SettingsState getSystemSettingsLocked(int userId) { return getSettingsLocked(SETTINGS_TYPE_SYSTEM, userId); } @@ -5399,7 +5308,7 @@ public class SettingsProvider extends ContentProvider { // next version step. // If this is a new profile, check if a secure setting exists for the // owner of the profile and use that value for the work profile. - int owningId = resolveOwningUserIdForSecureSettingLocked(userId, + int owningId = resolveOwningUserIdForSecureSetting(userId, NOTIFICATION_BUBBLES); Setting previous = getGlobalSettingsLocked() .getSettingLocked("notification_bubbles"); @@ -6068,18 +5977,22 @@ public class SettingsProvider extends ContentProvider { return currentVersion; } + @GuardedBy("mLock") private void initGlobalSettingsDefaultValLocked(String key, boolean val) { initGlobalSettingsDefaultValLocked(key, val ? "1" : "0"); } + @GuardedBy("mLock") private void initGlobalSettingsDefaultValLocked(String key, int val) { initGlobalSettingsDefaultValLocked(key, String.valueOf(val)); } + @GuardedBy("mLock") private void initGlobalSettingsDefaultValLocked(String key, long val) { initGlobalSettingsDefaultValLocked(key, String.valueOf(val)); } + @GuardedBy("mLock") private void initGlobalSettingsDefaultValLocked(String key, String val) { final SettingsState globalSettings = getGlobalSettingsLocked(); Setting currentSetting = globalSettings.getSettingLocked(key); @@ -6198,6 +6111,7 @@ public class SettingsProvider extends ContentProvider { } } + @GuardedBy("mLock") private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings, int userId) { List<String> names = settings.getSettingNamesLocked(); |