Update CoreSettingsObserver internal state correctly.
When a setting gets deleted, it needs to be removed from
CoreSettingsObserver internal state too.
Bug: 117555066
Test: atest services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
Change-Id: I7c488f941bf7e6ee652b784b6d41e95a48138f5a
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index 160c753..a5984a6 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -121,6 +121,7 @@
value = Settings.Global.getString(context.getContentResolver(), setting);
}
if (value == null) {
+ snapshot.remove(setting);
continue;
}
Class<?> type = entry.getValue();
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
index fe8256e..719e0ed 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -132,15 +132,36 @@
settingsBundle.containsKey(TEST_SETTING_SYSTEM_STRING));
}
+ @Test
+ public void testPopulateSettings_settingDeleted() {
+ Settings.Secure.putInt(mContentResolver, TEST_SETTING_SECURE_INT, TEST_INT);
+ Settings.Global.putFloat(mContentResolver, TEST_SETTING_GLOBAL_FLOAT, TEST_FLOAT);
+ Settings.System.putString(mContentResolver, TEST_SETTING_SYSTEM_STRING, TEST_STRING);
+
+ Bundle settingsBundle = getPopulatedBundle();
+
+ assertEquals("Unexpected value of " + TEST_SETTING_SECURE_INT,
+ TEST_INT, settingsBundle.getInt(TEST_SETTING_SECURE_INT));
+ assertEquals("Unexpected value of " + TEST_SETTING_GLOBAL_FLOAT,
+ TEST_FLOAT, settingsBundle.getFloat(TEST_SETTING_GLOBAL_FLOAT), 0);
+ assertEquals("Unexpected value of " + TEST_SETTING_SYSTEM_STRING,
+ TEST_STRING, settingsBundle.getString(TEST_SETTING_SYSTEM_STRING));
+
+ Settings.Global.putString(mContentResolver, TEST_SETTING_GLOBAL_FLOAT, null);
+ settingsBundle = getPopulatedBundle();
+
+ assertFalse("Bundle should not contain " + TEST_SETTING_GLOBAL_FLOAT,
+ settingsBundle.containsKey(TEST_SETTING_GLOBAL_FLOAT));
+ assertEquals("Unexpected value of " + TEST_SETTING_SECURE_INT,
+ TEST_INT, settingsBundle.getInt(TEST_SETTING_SECURE_INT));
+ assertEquals("Unexpected value of " + TEST_SETTING_SYSTEM_STRING,
+ TEST_STRING, settingsBundle.getString(TEST_SETTING_SYSTEM_STRING));
+
+ }
+
private Bundle getPopulatedBundle() {
- final Bundle settingsBundle = new Bundle();
- mCoreSettingsObserver.populateSettings(settingsBundle,
- CoreSettingsObserver.sGlobalSettingToTypeMap);
- mCoreSettingsObserver.populateSettings(settingsBundle,
- CoreSettingsObserver.sSecureSettingToTypeMap);
- mCoreSettingsObserver.populateSettings(settingsBundle,
- CoreSettingsObserver.sSystemSettingToTypeMap);
- return settingsBundle;
+ mCoreSettingsObserver.onChange(false);
+ return mCoreSettingsObserver.getCoreSettingsLocked();
}
private class TestInjector extends Injector {