Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +60 −45 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -370,7 +371,6 @@ final class SettingsState { mAconfigDefaultFlags = new HashMap<>(); ProtoOutputStream requests = null; Map<String, AconfigdFlagInfo> aconfigFlagMap = new HashMap<>(); synchronized (mLock) { readStateSyncLocked(); Loading @@ -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); } } Loading @@ -414,7 +414,6 @@ final class SettingsState { Map<String, AconfigdFlagInfo> aconfigdFlagMap = AconfigdJavaUtils.listFlagsValueInNewStorage(localSocket); compareFlagValueInNewStorage( aconfigFlagMap, mAconfigDefaultFlags, aconfigdFlagMap); } Loading @@ -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) { Loading @@ -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) { Loading @@ -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; Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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 Loading Loading @@ -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( Loading @@ -677,6 +691,7 @@ final class SettingsState { .setPackageName(flag.getPackage()) .setFlagName(flag.getName()) .setDefaultFlagValue(flagValue) .setIsReadWrite(isReadWrite) .build()); } } Loading packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +158 −143 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +60 −45 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -370,7 +371,6 @@ final class SettingsState { mAconfigDefaultFlags = new HashMap<>(); ProtoOutputStream requests = null; Map<String, AconfigdFlagInfo> aconfigFlagMap = new HashMap<>(); synchronized (mLock) { readStateSyncLocked(); Loading @@ -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); } } Loading @@ -414,7 +414,6 @@ final class SettingsState { Map<String, AconfigdFlagInfo> aconfigdFlagMap = AconfigdJavaUtils.listFlagsValueInNewStorage(localSocket); compareFlagValueInNewStorage( aconfigFlagMap, mAconfigDefaultFlags, aconfigdFlagMap); } Loading @@ -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) { Loading @@ -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) { Loading @@ -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; Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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 Loading Loading @@ -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( Loading @@ -677,6 +691,7 @@ final class SettingsState { .setPackageName(flag.getPackage()) .setFlagName(flag.getName()) .setDefaultFlagValue(flagValue) .setIsReadWrite(isReadWrite) .build()); } } Loading
packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +158 −143 File changed.Preview size limit exceeded, changes collapsed. Show changes