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

Commit d49e7696 authored by Ted Bauer's avatar Ted Bauer Committed by Android Build Coastguard Worker
Browse files

fix: ignore XML value in DeviceConfig for RO flags

Make DeviceConfig.getProperty/getProperties return no XML values for
read-only aconfig flags. Only in-memory defaults are now returned.

In general, for read-only flags, this is not needed, since aconfig
codegen compiles away DeviceConfig reads. This addresses a problem with
exported flags, that read from DC even if read-only.

Flag: com.android.providers.settings.ignore_xml_for_read_only_flags
Bug: 345007098
Test: confirmed a read-only flag is not flipped in DeviceConfig
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:13ece1352d789289a2e049d8500f2a5ace0b949d)
Merged-In: I366c989f1aa8caabd00d0b502785b68142cba927
Change-Id: I366c989f1aa8caabd00d0b502785b68142cba927
parent 72208bf0
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import static com.android.providers.settings.SettingsState.isSystemSettingsKey;
import static com.android.providers.settings.SettingsState.makeKey;

import android.Manifest;
import android.aconfigd.AconfigdFlagInfo;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -1369,10 +1370,27 @@ public class SettingsProvider extends ContentProvider {
                }
            }

            Map<String, AconfigdFlagInfo> aconfigFlagInfos =
                    settingsState.getAconfigDefaultFlags();

            for (int i = 0; i < nameCount; i++) {
                String name = names.get(i);
                Setting setting = settingsState.getSettingLocked(name);
                if (prefix == null || setting.getName().startsWith(prefix)) {
                if (prefix == null || name.startsWith(prefix)) {
                    if (Flags.ignoreXmlForReadOnlyFlags()) {
                        int slashIndex = name.indexOf("/");
                        boolean validSlashIndex = slashIndex != -1
                                && slashIndex != 0
                                && slashIndex != name.length();
                        if (validSlashIndex) {
                            String flagName = name.substring(slashIndex + 1);
                            AconfigdFlagInfo flagInfo = aconfigFlagInfos.get(flagName);
                            if (flagInfo != null && !flagInfo.getIsReadWrite()) {
                                continue;
                            }
                        }
                    }

                    flagsToValues.put(setting.getName(), setting.getValue());
                }
            }
+7 −0
Original line number Diff line number Diff line
@@ -765,6 +765,13 @@ final class SettingsState {
        }
    }

    @NonNull
    public Map<String, AconfigdFlagInfo> getAconfigDefaultFlags() {
        synchronized (mLock) {
            return mAconfigDefaultFlags;
        }
    }

    // The settings provider must hold its lock when calling here.
    public Setting getSettingLocked(String name) {
        if (TextUtils.isEmpty(name)) {
+11 −0
Original line number Diff line number Diff line
@@ -41,3 +41,14 @@ flag {
    description: "If this flag is detected as true on boot, writes a logfile to track storage migration correctness."
    bug: "328444881"
}

flag {
    name: "ignore_xml_for_read_only_flags"
    namespace: "core_experiments_team_internal"
    description: "When enabled, ignore any flag in the SettingsProvider XML for RO flags."
    bug: "345007098"
    is_fixed_read_only: true
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}