Loading api/system-current.txt +8 −8 Original line number Diff line number Diff line Loading @@ -5846,16 +5846,16 @@ package android.provider { public final class DeviceConfig { method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(String, String, boolean); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(String, String, float); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(String, String, int); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(String, String, long); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(String, String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(String, String, String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(@NonNull String, @NonNull String, boolean); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(@NonNull String, @NonNull String, float); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(@NonNull String, @NonNull String, int); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(@NonNull String, @NonNull String, long); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(@NonNull String, @NonNull String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(@NonNull String, @NonNull String, @Nullable String); method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method public static void removeOnPropertyChangedListener(@NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean); field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager"; field public static final String NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT = "activity_manager_native_boot"; field public static final String NAMESPACE_AUTOFILL = "autofill"; Loading Loading @@ -5883,7 +5883,7 @@ package android.provider { } public static interface DeviceConfig.OnPropertyChangedListener { method public void onPropertyChanged(String, String, String); method public void onPropertyChanged(@NonNull String, @NonNull String, @Nullable String); } public static interface DeviceConfig.Privacy { Loading api/test-current.txt +8 −8 Original line number Diff line number Diff line Loading @@ -2056,16 +2056,16 @@ package android.provider { public final class DeviceConfig { method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(String, String, boolean); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(String, String, float); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(String, String, int); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(String, String, long); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(String, String); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(String, String, String); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(@NonNull String, @NonNull String, boolean); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(@NonNull String, @NonNull String, float); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(@NonNull String, @NonNull String, int); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(@NonNull String, @NonNull String, long); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(@NonNull String, @NonNull String); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(@NonNull String, @NonNull String, @Nullable String); method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method public static void removeOnPropertyChangedListener(@NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean); field public static final String NAMESPACE_AUTOFILL = "autofill"; field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; } Loading @@ -2075,7 +2075,7 @@ package android.provider { } public static interface DeviceConfig.OnPropertyChangedListener { method public void onPropertyChanged(String, String, String); method public void onPropertyChanged(@NonNull String, @NonNull String, @Nullable String); } public static interface DeviceConfig.Privacy { Loading core/java/android/provider/DeviceConfig.java +28 −16 Original line number Diff line number Diff line Loading @@ -412,7 +412,7 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getProperty(String namespace, String name) { public static String getProperty(@NonNull String namespace, @NonNull String name) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); String compositeName = createCompositeName(namespace, name); return Settings.Config.getString(contentResolver, compositeName); Loading @@ -431,7 +431,8 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getString(String namespace, String name, String defaultValue) { public static String getString(@NonNull String namespace, @NonNull String name, @Nullable String defaultValue) { String value = getProperty(namespace, name); return value != null ? value : defaultValue; } Loading @@ -449,7 +450,8 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static boolean getBoolean(String namespace, String name, boolean defaultValue) { public static boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue) { String value = getProperty(namespace, name); return value != null ? Boolean.parseBoolean(value) : defaultValue; } Loading @@ -467,7 +469,7 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static int getInt(String namespace, String name, int defaultValue) { public static int getInt(@NonNull String namespace, @NonNull String name, int defaultValue) { String value = getProperty(namespace, name); if (value == null) { return defaultValue; Loading @@ -493,7 +495,7 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static long getLong(String namespace, String name, long defaultValue) { public static long getLong(@NonNull String namespace, @NonNull String name, long defaultValue) { String value = getProperty(namespace, name); if (value == null) { return defaultValue; Loading @@ -519,7 +521,8 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static float getFloat(String namespace, String name, float defaultValue) { public static float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue) { String value = getProperty(namespace, name); if (value == null) { return defaultValue; Loading Loading @@ -554,10 +557,10 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperty( String namespace, String name, String value, boolean makeDefault) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); public static boolean setProperty(@NonNull String namespace, @NonNull String name, @Nullable String value, boolean makeDefault) { String compositeName = createCompositeName(namespace, name); ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); return Settings.Config.putString(contentResolver, compositeName, value, makeDefault); } Loading Loading @@ -700,11 +703,14 @@ public final class DeviceConfig { } } private static String createCompositeName(String namespace, String name) { private static String createCompositeName(@NonNull String namespace, @NonNull String name) { Preconditions.checkNotNull(namespace); Preconditions.checkNotNull(name); return namespace + "/" + name; } private static Uri createNamespaceUri(String namespace) { private static Uri createNamespaceUri(@NonNull String namespace) { Preconditions.checkNotNull(namespace); return CONTENT_URI.buildUpon().appendPath(namespace).build(); } Loading @@ -716,7 +722,8 @@ public final class DeviceConfig { * @param namespace The namespace to increment the count for. */ @GuardedBy("sLock") private static void incrementNamespace(String namespace) { private static void incrementNamespace(@NonNull String namespace) { Preconditions.checkNotNull(namespace); Pair<ContentObserver, Integer> namespaceCount = sNamespaces.get(namespace); if (namespaceCount != null) { sNamespaces.put(namespace, new Pair<>(namespaceCount.first, namespaceCount.second + 1)); Loading @@ -725,8 +732,10 @@ public final class DeviceConfig { ContentObserver contentObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange, Uri uri) { if (uri != null) { handleChange(uri); } } }; ActivityThread.currentApplication().getContentResolver() .registerContentObserver(createNamespaceUri(namespace), true, contentObserver); Loading @@ -742,7 +751,8 @@ public final class DeviceConfig { * @param namespace The namespace to decrement the count for. */ @GuardedBy("sLock") private static void decrementNamespace(String namespace) { private static void decrementNamespace(@NonNull String namespace) { Preconditions.checkNotNull(namespace); Pair<ContentObserver, Integer> namespaceCount = sNamespaces.get(namespace); if (namespaceCount == null) { // This namespace is not registered and does not need to be decremented Loading @@ -757,7 +767,8 @@ public final class DeviceConfig { } } private static void handleChange(Uri uri) { private static void handleChange(@NonNull Uri uri) { Preconditions.checkNotNull(uri); List<String> pathSegments = uri.getPathSegments(); // pathSegments(0) is "config" final String namespace = pathSegments.get(1); Loading Loading @@ -813,7 +824,8 @@ public final class DeviceConfig { * @param name The name of the property which has changed. * @param value The new value of the property which has changed. */ void onPropertyChanged(String namespace, String name, String value); void onPropertyChanged(@NonNull String namespace, @NonNull String name, @Nullable String value); } /** Loading core/tests/coretests/src/android/provider/DeviceConfigTest.java +146 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,26 @@ public class DeviceConfigTest { assertThat(result).isNull(); } @Test public void getProperty_nullNamespace() { try { DeviceConfig.getProperty(null, sKey); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getProperty_nullName() { try { DeviceConfig.getProperty(sNamespace, null); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getString_empty() { final String default_value = "default_value"; Loading @@ -67,6 +87,12 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getString_nullDefault() { final String result = DeviceConfig.getString(sNamespace, sKey, null); assertThat(result).isNull(); } @Test public void getString_nonEmpty() { final String value = "new_value"; Loading @@ -77,6 +103,26 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(value); } @Test public void getString_nullNamespace() { try { DeviceConfig.getString(null, sKey, "default_value"); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getString_nullName() { try { DeviceConfig.getString(sNamespace, null, "default_value"); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getBoolean_empty() { final boolean default_value = true; Loading Loading @@ -104,6 +150,26 @@ public class DeviceConfigTest { assertThat(result).isFalse(); } @Test public void getBoolean_nullNamespace() { try { DeviceConfig.getBoolean(null, sKey, false); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getBoolean_nullName() { try { DeviceConfig.getBoolean(sNamespace, null, false); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getInt_empty() { final int default_value = 999; Loading Loading @@ -131,6 +197,26 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getInt_nullNamespace() { try { DeviceConfig.getInt(null, sKey, 0); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getInt_nullName() { try { DeviceConfig.getInt(sNamespace, null, 0); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getLong_empty() { final long default_value = 123456; Loading Loading @@ -158,6 +244,26 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getLong_nullNamespace() { try { DeviceConfig.getLong(null, sKey, 0); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getLong_nullName() { try { DeviceConfig.getLong(sNamespace, null, 0); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getFloat_empty() { final float default_value = 123.456f; Loading Loading @@ -185,6 +291,46 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getFloat_nullNamespace() { try { DeviceConfig.getFloat(null, sKey, 0); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getFloat_nullName() { try { DeviceConfig.getFloat(sNamespace, null, 0); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void setProperty_nullNamespace() { try { DeviceConfig.setProperty(null, sKey, sValue, false); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void setProperty_nullName() { try { DeviceConfig.setProperty(sNamespace, null, sValue, false); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void setAndGetProperty_sameNamespace() { DeviceConfig.setProperty(sNamespace, sKey, sValue, false); Loading Loading
api/system-current.txt +8 −8 Original line number Diff line number Diff line Loading @@ -5846,16 +5846,16 @@ package android.provider { public final class DeviceConfig { method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(String, String, boolean); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(String, String, float); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(String, String, int); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(String, String, long); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(String, String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(String, String, String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(@NonNull String, @NonNull String, boolean); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(@NonNull String, @NonNull String, float); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(@NonNull String, @NonNull String, int); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(@NonNull String, @NonNull String, long); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(@NonNull String, @NonNull String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(@NonNull String, @NonNull String, @Nullable String); method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method public static void removeOnPropertyChangedListener(@NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean); field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager"; field public static final String NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT = "activity_manager_native_boot"; field public static final String NAMESPACE_AUTOFILL = "autofill"; Loading Loading @@ -5883,7 +5883,7 @@ package android.provider { } public static interface DeviceConfig.OnPropertyChangedListener { method public void onPropertyChanged(String, String, String); method public void onPropertyChanged(@NonNull String, @NonNull String, @Nullable String); } public static interface DeviceConfig.Privacy { Loading
api/test-current.txt +8 −8 Original line number Diff line number Diff line Loading @@ -2056,16 +2056,16 @@ package android.provider { public final class DeviceConfig { method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(String, String, boolean); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(String, String, float); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(String, String, int); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(String, String, long); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(String, String); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(String, String, String); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(@NonNull String, @NonNull String, boolean); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(@NonNull String, @NonNull String, float); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(@NonNull String, @NonNull String, int); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(@NonNull String, @NonNull String, long); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(@NonNull String, @NonNull String); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(@NonNull String, @NonNull String, @Nullable String); method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); method public static void removeOnPropertyChangedListener(@NonNull android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean); field public static final String NAMESPACE_AUTOFILL = "autofill"; field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; } Loading @@ -2075,7 +2075,7 @@ package android.provider { } public static interface DeviceConfig.OnPropertyChangedListener { method public void onPropertyChanged(String, String, String); method public void onPropertyChanged(@NonNull String, @NonNull String, @Nullable String); } public static interface DeviceConfig.Privacy { Loading
core/java/android/provider/DeviceConfig.java +28 −16 Original line number Diff line number Diff line Loading @@ -412,7 +412,7 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getProperty(String namespace, String name) { public static String getProperty(@NonNull String namespace, @NonNull String name) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); String compositeName = createCompositeName(namespace, name); return Settings.Config.getString(contentResolver, compositeName); Loading @@ -431,7 +431,8 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getString(String namespace, String name, String defaultValue) { public static String getString(@NonNull String namespace, @NonNull String name, @Nullable String defaultValue) { String value = getProperty(namespace, name); return value != null ? value : defaultValue; } Loading @@ -449,7 +450,8 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static boolean getBoolean(String namespace, String name, boolean defaultValue) { public static boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue) { String value = getProperty(namespace, name); return value != null ? Boolean.parseBoolean(value) : defaultValue; } Loading @@ -467,7 +469,7 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static int getInt(String namespace, String name, int defaultValue) { public static int getInt(@NonNull String namespace, @NonNull String name, int defaultValue) { String value = getProperty(namespace, name); if (value == null) { return defaultValue; Loading @@ -493,7 +495,7 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static long getLong(String namespace, String name, long defaultValue) { public static long getLong(@NonNull String namespace, @NonNull String name, long defaultValue) { String value = getProperty(namespace, name); if (value == null) { return defaultValue; Loading @@ -519,7 +521,8 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static float getFloat(String namespace, String name, float defaultValue) { public static float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue) { String value = getProperty(namespace, name); if (value == null) { return defaultValue; Loading Loading @@ -554,10 +557,10 @@ public final class DeviceConfig { @SystemApi @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperty( String namespace, String name, String value, boolean makeDefault) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); public static boolean setProperty(@NonNull String namespace, @NonNull String name, @Nullable String value, boolean makeDefault) { String compositeName = createCompositeName(namespace, name); ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); return Settings.Config.putString(contentResolver, compositeName, value, makeDefault); } Loading Loading @@ -700,11 +703,14 @@ public final class DeviceConfig { } } private static String createCompositeName(String namespace, String name) { private static String createCompositeName(@NonNull String namespace, @NonNull String name) { Preconditions.checkNotNull(namespace); Preconditions.checkNotNull(name); return namespace + "/" + name; } private static Uri createNamespaceUri(String namespace) { private static Uri createNamespaceUri(@NonNull String namespace) { Preconditions.checkNotNull(namespace); return CONTENT_URI.buildUpon().appendPath(namespace).build(); } Loading @@ -716,7 +722,8 @@ public final class DeviceConfig { * @param namespace The namespace to increment the count for. */ @GuardedBy("sLock") private static void incrementNamespace(String namespace) { private static void incrementNamespace(@NonNull String namespace) { Preconditions.checkNotNull(namespace); Pair<ContentObserver, Integer> namespaceCount = sNamespaces.get(namespace); if (namespaceCount != null) { sNamespaces.put(namespace, new Pair<>(namespaceCount.first, namespaceCount.second + 1)); Loading @@ -725,8 +732,10 @@ public final class DeviceConfig { ContentObserver contentObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange, Uri uri) { if (uri != null) { handleChange(uri); } } }; ActivityThread.currentApplication().getContentResolver() .registerContentObserver(createNamespaceUri(namespace), true, contentObserver); Loading @@ -742,7 +751,8 @@ public final class DeviceConfig { * @param namespace The namespace to decrement the count for. */ @GuardedBy("sLock") private static void decrementNamespace(String namespace) { private static void decrementNamespace(@NonNull String namespace) { Preconditions.checkNotNull(namespace); Pair<ContentObserver, Integer> namespaceCount = sNamespaces.get(namespace); if (namespaceCount == null) { // This namespace is not registered and does not need to be decremented Loading @@ -757,7 +767,8 @@ public final class DeviceConfig { } } private static void handleChange(Uri uri) { private static void handleChange(@NonNull Uri uri) { Preconditions.checkNotNull(uri); List<String> pathSegments = uri.getPathSegments(); // pathSegments(0) is "config" final String namespace = pathSegments.get(1); Loading Loading @@ -813,7 +824,8 @@ public final class DeviceConfig { * @param name The name of the property which has changed. * @param value The new value of the property which has changed. */ void onPropertyChanged(String namespace, String name, String value); void onPropertyChanged(@NonNull String namespace, @NonNull String name, @Nullable String value); } /** Loading
core/tests/coretests/src/android/provider/DeviceConfigTest.java +146 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,26 @@ public class DeviceConfigTest { assertThat(result).isNull(); } @Test public void getProperty_nullNamespace() { try { DeviceConfig.getProperty(null, sKey); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getProperty_nullName() { try { DeviceConfig.getProperty(sNamespace, null); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getString_empty() { final String default_value = "default_value"; Loading @@ -67,6 +87,12 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getString_nullDefault() { final String result = DeviceConfig.getString(sNamespace, sKey, null); assertThat(result).isNull(); } @Test public void getString_nonEmpty() { final String value = "new_value"; Loading @@ -77,6 +103,26 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(value); } @Test public void getString_nullNamespace() { try { DeviceConfig.getString(null, sKey, "default_value"); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getString_nullName() { try { DeviceConfig.getString(sNamespace, null, "default_value"); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getBoolean_empty() { final boolean default_value = true; Loading Loading @@ -104,6 +150,26 @@ public class DeviceConfigTest { assertThat(result).isFalse(); } @Test public void getBoolean_nullNamespace() { try { DeviceConfig.getBoolean(null, sKey, false); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getBoolean_nullName() { try { DeviceConfig.getBoolean(sNamespace, null, false); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getInt_empty() { final int default_value = 999; Loading Loading @@ -131,6 +197,26 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getInt_nullNamespace() { try { DeviceConfig.getInt(null, sKey, 0); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getInt_nullName() { try { DeviceConfig.getInt(sNamespace, null, 0); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getLong_empty() { final long default_value = 123456; Loading Loading @@ -158,6 +244,26 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getLong_nullNamespace() { try { DeviceConfig.getLong(null, sKey, 0); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getLong_nullName() { try { DeviceConfig.getLong(sNamespace, null, 0); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getFloat_empty() { final float default_value = 123.456f; Loading Loading @@ -185,6 +291,46 @@ public class DeviceConfigTest { assertThat(result).isEqualTo(default_value); } @Test public void getFloat_nullNamespace() { try { DeviceConfig.getFloat(null, sKey, 0); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void getFloat_nullName() { try { DeviceConfig.getFloat(sNamespace, null, 0); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void setProperty_nullNamespace() { try { DeviceConfig.setProperty(null, sKey, sValue, false); Assert.fail("Null namespace should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void setProperty_nullName() { try { DeviceConfig.setProperty(sNamespace, null, sValue, false); Assert.fail("Null name should have resulted in an NPE."); } catch (NullPointerException e) { // expected } } @Test public void setAndGetProperty_sameNamespace() { DeviceConfig.setProperty(sNamespace, sKey, sValue, false); Loading