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

Commit e8667cc6 authored by Zhi Dou's avatar Zhi Dou Committed by Android (Google) Code Review
Browse files

Merge "write the diff number into Settings and take care of read_only" into main

parents 88e636fd 25dd1ad5
Loading
Loading
Loading
Loading
+60 −45
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.providers.settings;

import static android.os.Process.FIRST_APPLICATION_UID;

import android.aconfig.Aconfig.flag_permission;
import android.aconfig.Aconfig.flag_state;
import android.aconfig.Aconfig.parsed_flag;
import android.aconfig.Aconfig.parsed_flags;
@@ -370,7 +371,6 @@ final class SettingsState {
        mAconfigDefaultFlags = new HashMap<>();

        ProtoOutputStream requests = null;
        Map<String, AconfigdFlagInfo> aconfigFlagMap = new HashMap<>();

        synchronized (mLock) {
            readStateSyncLocked();
@@ -390,12 +390,12 @@ final class SettingsState {

            if (enableAconfigStorageDaemon()) {
                if (isConfigSettingsKey(mKey)) {
                    aconfigFlagMap = getAllAconfigFlagsFromSettings();
                    getAllAconfigFlagsFromSettings(mAconfigDefaultFlags);
                }
            }

            if (isConfigSettingsKey(mKey)) {
                requests = handleBulkSyncToNewStorage(aconfigFlagMap);
                requests = handleBulkSyncToNewStorage(mAconfigDefaultFlags);
            }
        }

@@ -414,7 +414,6 @@ final class SettingsState {
                    Map<String, AconfigdFlagInfo> aconfigdFlagMap =
                            AconfigdJavaUtils.listFlagsValueInNewStorage(localSocket);
                    compareFlagValueInNewStorage(
                            aconfigFlagMap,
                            mAconfigDefaultFlags,
                            aconfigdFlagMap);
                }
@@ -424,7 +423,6 @@ final class SettingsState {

    // TOBO(b/312444587): remove the comparison logic after Test Mission 2.
    public int compareFlagValueInNewStorage(
            Map<String, AconfigdFlagInfo> settingFlagMap,
            Map<String, AconfigdFlagInfo> defaultFlagMap,
            Map<String, AconfigdFlagInfo> aconfigdFlagMap) {

@@ -434,9 +432,6 @@ final class SettingsState {
        for (Map.Entry<String, AconfigdFlagInfo> entry : defaultFlagMap.entrySet()) {
            String key = entry.getKey();
            AconfigdFlagInfo flag = entry.getValue();
            if (settingFlagMap.containsKey(key)) {
                flag.merge(settingFlagMap.get(key));
            }

            AconfigdFlagInfo aconfigdFlag = aconfigdFlagMap.get(key);
            if (aconfigdFlag == null) {
@@ -460,14 +455,31 @@ final class SettingsState {
            diffNum++;
        }

        String compareMarkerName = "aconfigd_marker/compare_diff_num";
        synchronized (mLock) {
            Setting markerSetting = mSettings.get(compareMarkerName);
            if (markerSetting == null) {
                markerSetting =
                        new Setting(
                                compareMarkerName,
                                String.valueOf(diffNum),
                                false,
                                "aconfig",
                                "aconfig");
                mSettings.put(compareMarkerName, markerSetting);
            }
            markerSetting.value = String.valueOf(diffNum);
        }

        if (diffNum == 0) {
            Slog.i(LOG_TAG, "Settings and new storage have same flags.");
            Slog.w(LOG_TAG, "Settings and new storage have same flags.");
        }
        return diffNum;
    }

    @GuardedBy("mLock")
    public Map<String, AconfigdFlagInfo> getAllAconfigFlagsFromSettings() {
    public int getAllAconfigFlagsFromSettings(
            @NonNull Map<String, AconfigdFlagInfo> flagInfoDefault) {
        Map<String, AconfigdFlagInfo> ret = new HashMap<>();
        int numSettings = mSettings.size();
        int num_requests = 0;
@@ -475,25 +487,24 @@ final class SettingsState {
            String name = mSettings.keyAt(i);
            Setting setting = mSettings.valueAt(i);
            AconfigdFlagInfo flag =
                    getFlagOverrideToSync(name, setting.getValue());
                    getFlagOverrideToSync(name, setting.getValue(), flagInfoDefault);
            if (flag == null) {
                continue;
            }
            String fullFlagName = flag.getFullFlagName();
            AconfigdFlagInfo prev = ret.putIfAbsent(fullFlagName,flag);
            if (prev != null) {
                prev.merge(flag);
            }
            if (flag.getIsReadWrite()) {
                ++num_requests;
            }
        }
        Slog.i(LOG_TAG, num_requests + " flag override requests created");
        return ret;
        return num_requests;
    }

    // TODO(b/341764371): migrate aconfig flag push to GMS core
    @VisibleForTesting
    @GuardedBy("mLock")
    public AconfigdFlagInfo getFlagOverrideToSync(String name, String value) {
    @Nullable
    public AconfigdFlagInfo getFlagOverrideToSync(
            String name, String value, @NonNull Map<String, AconfigdFlagInfo> flagInfoDefault) {
        int slashIdx = name.indexOf("/");
        if (slashIdx <= 0 || slashIdx >= name.length() - 1) {
            Slog.e(LOG_TAG, "invalid flag name " + name);
@@ -516,33 +527,23 @@ final class SettingsState {
            fullFlagName = fullFlagName.substring(colonIdx + 1);
            isLocal = true;
        }

        String aconfigName = namespace + "/" + fullFlagName;
        boolean isAconfig =
                mNamespaceDefaults.containsKey(namespace)
                        && mNamespaceDefaults.get(namespace).containsKey(aconfigName);
        if (!isAconfig) {
            return null;
        }

        // get package name and flag name
        int dotIdx = fullFlagName.lastIndexOf(".");
        if (dotIdx == -1) {
            Slog.e(LOG_TAG, "invalid override flag name " + name);
            return null;
        }

        AconfigdFlagInfo.Builder builder = AconfigdFlagInfo.newBuilder()
                        .setPackageName(fullFlagName.substring(0, dotIdx))
                        .setFlagName(fullFlagName.substring(dotIdx + 1))
                        .setDefaultFlagValue(mNamespaceDefaults.get(namespace).get(aconfigName));
        AconfigdFlagInfo flag = flagInfoDefault.get(fullFlagName);
        if (flag == null) {
            return null;
        }

        if (isLocal) {
            builder.setHasLocalOverride(isLocal).setBootFlagValue(value).setLocalFlagValue(value);
            flag.setLocalFlagValue(value);
        } else {
            builder.setHasServerOverride(true).setServerFlagValue(value).setBootFlagValue(value);
            flag.setServerFlagValue(value);
        }
        return builder.build();
        return flag;
    }


@@ -574,16 +575,28 @@ final class SettingsState {

                // loop over all settings and add flag override requests
                for (AconfigdFlagInfo flag : aconfigFlagMap.values()) {
                    String value =
                            flag.getHasLocalOverride()
                                    ? flag.getLocalFlagValue()
                                    : flag.getServerFlagValue();
                    // don't sync read_only flags
                    if (!flag.getIsReadWrite()) {
                        continue;
                    }

                    if (flag.getHasServerOverride()) {
                        AconfigdJavaUtils.writeFlagOverrideRequest(
                                requests,
                                flag.getPackageName(),
                                flag.getFlagName(),
                            value,
                            flag.getHasLocalOverride());
                                flag.getServerFlagValue(),
                                false);
                    }

                    if (flag.getHasLocalOverride()) {
                        AconfigdJavaUtils.writeFlagOverrideRequest(
                                requests,
                                flag.getPackageName(),
                                flag.getFlagName(),
                                flag.getLocalFlagValue(),
                                true);
                    }
                }

                // mark sync has been done
@@ -669,6 +682,7 @@ final class SettingsState {
                String fullFlagName = flag.getPackage() + "." + flag.getName();
                String flagName = flag.getNamespace() + "/" + fullFlagName;
                String flagValue = flag.getState() == flag_state.ENABLED ? "true" : "false";
                boolean isReadWrite = flag.getPermission() == flag_permission.READ_WRITE;
                defaultMap.get(flag.getNamespace()).put(flagName, flagValue);
                if (!flagInfoDefault.containsKey(fullFlagName)) {
                    flagInfoDefault.put(
@@ -677,6 +691,7 @@ final class SettingsState {
                                    .setPackageName(flag.getPackage())
                                    .setFlagName(flag.getName())
                                    .setDefaultFlagValue(flagValue)
                                    .setIsReadWrite(isReadWrite)
                                    .build());
                }
            }
+158 −143

File changed.

Preview size limit exceeded, changes collapsed.