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

Commit e979fca9 authored by Ted Bauer's avatar Ted Bauer Committed by Android (Google) Code Review
Browse files

Merge "Stage all aconfig flags in setProperties path." into main

parents 9e5b2f19 4dd5dbab
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));