Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +19 −6 Original line number Diff line number Diff line Loading @@ -707,23 +707,36 @@ final class SettingsState { // Update/add new keys for (String key : keyValues.keySet()) { String value = keyValues.get(key); // Rename key if it's an aconfig flag. String flagName = key; if (Flags.stageAllAconfigFlags() && isConfigSettingsKey(mKey)) { int slashIndex = flagName.indexOf("/"); boolean stageFlag = slashIndex > 0 && slashIndex != flagName.length(); boolean isAconfig = trunkFlagMap != null && trunkFlagMap.containsKey(flagName); if (stageFlag && isAconfig) { String flagWithoutNamespace = flagName.substring(slashIndex + 1); flagName = "staged/" + namespace + "*" + flagWithoutNamespace; } } String oldValue = null; Setting state = mSettings.get(key); Setting state = mSettings.get(flagName); if (state == null) { state = new Setting(key, value, false, packageName, null); mSettings.put(key, state); changedKeys.add(key); // key was added state = new Setting(flagName, value, false, packageName, null); mSettings.put(flagName, state); changedKeys.add(flagName); // key was added } else if (state.value != value) { oldValue = state.value; state.update(value, false, packageName, null, true, /* overrideableByRestore */ false); changedKeys.add(key); // key was updated changedKeys.add(flagName); // key was updated } else { // this key/value already exists, no change and no logging necessary continue; } FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, key, value, state.value, FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, flagName, value, state.value, oldValue, /* tag */ null, /* make default */ false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__UPDATED); addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, state); Loading packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +45 −0 Original line number Diff line number Diff line Loading @@ -739,6 +739,51 @@ public class SettingsStateTest { } } @Test @RequiresFlagsEnabled(Flags.FLAG_STAGE_ALL_ACONFIG_FLAGS) public void testSetSettingsLockedStagesAconfigFlags() throws Exception { int configKey = SettingsState.makeKey(SettingsState.SETTINGS_TYPE_CONFIG, 0); SettingsState settingsState = new SettingsState( InstrumentationRegistry.getContext(), mLock, mSettingsFile, configKey, SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); String prefix = "test_namespace"; String packageName = "com.android.flags"; Map<String, String> keyValues = Map.of("test_namespace/com.android.flags.flag3", "true"); parsed_flags flags = parsed_flags .newBuilder() .addParsedFlag(parsed_flag .newBuilder() .setPackage(packageName) .setName("flag3") .setNamespace(prefix) .setDescription("test flag") .addBug("12345678") .setState(Aconfig.flag_state.DISABLED) .setPermission(Aconfig.flag_permission.READ_WRITE)) .build(); synchronized (mLock) { settingsState.loadAconfigDefaultValues( flags.toByteArray(), settingsState.getAconfigDefaultValues()); List<String> updates = settingsState.setSettingsLocked("test_namespace/", keyValues, packageName); assertEquals(1, updates.size()); assertEquals(updates.get(0), "staged/test_namespace*com.android.flags.flag3"); SettingsState.Setting s; s = settingsState.getSettingLocked("test_namespace/com.android.flags.flag3"); assertNull(s.getValue()); s = settingsState.getSettingLocked("staged/test_namespace*com.android.flags.flag3"); assertEquals("true", s.getValue()); } } @Test public void testsetSettingsLockedKeepTrunkDefault() throws Exception { final PrintStream os = new PrintStream(new FileOutputStream(mSettingsFile)); Loading Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +19 −6 Original line number Diff line number Diff line Loading @@ -707,23 +707,36 @@ final class SettingsState { // Update/add new keys for (String key : keyValues.keySet()) { String value = keyValues.get(key); // Rename key if it's an aconfig flag. String flagName = key; if (Flags.stageAllAconfigFlags() && isConfigSettingsKey(mKey)) { int slashIndex = flagName.indexOf("/"); boolean stageFlag = slashIndex > 0 && slashIndex != flagName.length(); boolean isAconfig = trunkFlagMap != null && trunkFlagMap.containsKey(flagName); if (stageFlag && isAconfig) { String flagWithoutNamespace = flagName.substring(slashIndex + 1); flagName = "staged/" + namespace + "*" + flagWithoutNamespace; } } String oldValue = null; Setting state = mSettings.get(key); Setting state = mSettings.get(flagName); if (state == null) { state = new Setting(key, value, false, packageName, null); mSettings.put(key, state); changedKeys.add(key); // key was added state = new Setting(flagName, value, false, packageName, null); mSettings.put(flagName, state); changedKeys.add(flagName); // key was added } else if (state.value != value) { oldValue = state.value; state.update(value, false, packageName, null, true, /* overrideableByRestore */ false); changedKeys.add(key); // key was updated changedKeys.add(flagName); // key was updated } else { // this key/value already exists, no change and no logging necessary continue; } FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, key, value, state.value, FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, flagName, value, state.value, oldValue, /* tag */ null, /* make default */ false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__UPDATED); addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, state); Loading
packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +45 −0 Original line number Diff line number Diff line Loading @@ -739,6 +739,51 @@ public class SettingsStateTest { } } @Test @RequiresFlagsEnabled(Flags.FLAG_STAGE_ALL_ACONFIG_FLAGS) public void testSetSettingsLockedStagesAconfigFlags() throws Exception { int configKey = SettingsState.makeKey(SettingsState.SETTINGS_TYPE_CONFIG, 0); SettingsState settingsState = new SettingsState( InstrumentationRegistry.getContext(), mLock, mSettingsFile, configKey, SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); String prefix = "test_namespace"; String packageName = "com.android.flags"; Map<String, String> keyValues = Map.of("test_namespace/com.android.flags.flag3", "true"); parsed_flags flags = parsed_flags .newBuilder() .addParsedFlag(parsed_flag .newBuilder() .setPackage(packageName) .setName("flag3") .setNamespace(prefix) .setDescription("test flag") .addBug("12345678") .setState(Aconfig.flag_state.DISABLED) .setPermission(Aconfig.flag_permission.READ_WRITE)) .build(); synchronized (mLock) { settingsState.loadAconfigDefaultValues( flags.toByteArray(), settingsState.getAconfigDefaultValues()); List<String> updates = settingsState.setSettingsLocked("test_namespace/", keyValues, packageName); assertEquals(1, updates.size()); assertEquals(updates.get(0), "staged/test_namespace*com.android.flags.flag3"); SettingsState.Setting s; s = settingsState.getSettingLocked("test_namespace/com.android.flags.flag3"); assertNull(s.getValue()); s = settingsState.getSettingLocked("staged/test_namespace*com.android.flags.flag3"); assertEquals("true", s.getValue()); } } @Test public void testsetSettingsLockedKeepTrunkDefault() throws Exception { final PrintStream os = new PrintStream(new FileOutputStream(mSettingsFile)); Loading