Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4dd5dbab authored by Ted Bauer's avatar Ted Bauer
Browse files

Stage all aconfig flags in setProperties path.

Test: atest SettingsStateTest
Bug: 326598713
Change-Id: Ib06f6a740eb151036f9662da7f2d372051cc25af
parent 3034ebdc
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -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);
+45 −0
Original line number Diff line number Diff line
@@ -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));