From 82a0b9788387020e0f79f1a4b068ce8d7a3ba52f Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 1 Dec 2020 16:39:20 -0800 Subject: [PATCH] [SettingsProvider] fix the removing of old keys BUG: 174611691 Test: atest android.provider.DeviceConfigTest with ag/13130208. Change-Id: I94b5a314c60b873a6dec5f4a05b3aa154cd530ca --- .../com/android/providers/settings/SettingsState.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index b061df1423bac..40b0fcff3aaca 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -496,11 +496,14 @@ final class SettingsState { public List setSettingsLocked(String prefix, Map keyValues, String packageName) { List changedKeys = new ArrayList<>(); + final Iterator> iterator = mSettings.entrySet().iterator(); // Delete old keys with the prefix that are not part of the new set. - for (int i = 0; i < mSettings.keySet().size(); ++i) { - String key = mSettings.keyAt(i); - if (key.startsWith(prefix) && !keyValues.containsKey(key)) { - Setting oldState = mSettings.remove(key); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + final String key = entry.getKey(); + final Setting oldState = entry.getValue(); + if (key != null && key.startsWith(prefix) && !keyValues.containsKey(key)) { + iterator.remove(); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, key, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false,