From c45c387584e12aaa81f64bd4eab1bcc04d5451d7 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Wed, 10 Oct 2018 18:24:19 -0700 Subject: 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 --- .../android/server/am/CoreSettingsObserver.java | 1 + .../server/am/CoreSettingsObserverTest.java | 37 +++++++++++++++++----- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 160c753d9540..a5984a6b622f 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 @@ final class CoreSettingsObserver extends ContentObserver { 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 fe8256eeb977..719e0edc20b7 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 @@ public class CoreSettingsObserverTest { 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 { -- cgit v1.2.3-59-g8ed1b