summaryrefslogtreecommitdiff
path: root/tools/aconfig/src/codegen_java.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aconfig/src/codegen_java.rs')
-rw-r--r--tools/aconfig/src/codegen_java.rs155
1 files changed, 112 insertions, 43 deletions
diff --git a/tools/aconfig/src/codegen_java.rs b/tools/aconfig/src/codegen_java.rs
index 05ee0d759f..5470cb3e36 100644
--- a/tools/aconfig/src/codegen_java.rs
+++ b/tools/aconfig/src/codegen_java.rs
@@ -16,7 +16,7 @@
use anyhow::Result;
use serde::Serialize;
-use std::collections::BTreeSet;
+use std::collections::{BTreeMap, BTreeSet};
use std::path::PathBuf;
use tinytemplate::TinyTemplate;
@@ -34,12 +34,14 @@ where
{
let flag_elements: Vec<FlagElement> =
parsed_flags_iter.map(|pf| create_flag_element(package, pf)).collect();
+ let namespace_flags = gen_flags_by_namespace(&flag_elements);
let properties_set: BTreeSet<String> =
flag_elements.iter().map(|fe| format_property_name(&fe.device_config_namespace)).collect();
let is_read_write = flag_elements.iter().any(|elem| elem.is_read_write);
let is_test_mode = codegen_mode == CodegenMode::Test;
let context = Context {
flag_elements,
+ namespace_flags,
is_test_mode,
is_read_write,
properties_set,
@@ -72,16 +74,44 @@ where
.collect::<Result<Vec<OutputFile>>>()
}
+fn gen_flags_by_namespace(flags: &[FlagElement]) -> Vec<NamespaceFlags> {
+ let mut namespace_to_flag: BTreeMap<String, Vec<FlagElement>> = BTreeMap::new();
+
+ for flag in flags {
+ match namespace_to_flag.get_mut(&flag.device_config_namespace) {
+ Some(flag_list) => flag_list.push(flag.clone()),
+ None => {
+ namespace_to_flag.insert(flag.device_config_namespace.clone(), vec![flag.clone()]);
+ }
+ }
+ }
+
+ namespace_to_flag
+ .iter()
+ .map(|(namespace, flags)| NamespaceFlags {
+ namespace: namespace.to_string(),
+ flags: flags.clone(),
+ })
+ .collect()
+}
+
#[derive(Serialize)]
struct Context {
pub flag_elements: Vec<FlagElement>,
+ pub namespace_flags: Vec<NamespaceFlags>,
pub is_test_mode: bool,
pub is_read_write: bool,
pub properties_set: BTreeSet<String>,
pub package_name: String,
}
-#[derive(Serialize)]
+#[derive(Serialize, Debug)]
+struct NamespaceFlags {
+ pub namespace: String,
+ pub flags: Vec<FlagElement>,
+}
+
+#[derive(Serialize, Clone, Debug)]
struct FlagElement {
pub default_value: bool,
pub device_config_namespace: String,
@@ -148,6 +178,8 @@ mod tests {
boolean disabledRo();
@UnsupportedAppUsage
boolean disabledRw();
+ @UnsupportedAppUsage
+ boolean disabledRw2();
@com.android.aconfig.annotations.AssumeTrueForR8
@UnsupportedAppUsage
boolean enabledFixedRo();
@@ -170,6 +202,8 @@ mod tests {
/** @hide */
public static final String FLAG_DISABLED_RW = "com.android.aconfig.test.disabled_rw";
/** @hide */
+ public static final String FLAG_DISABLED_RW_2 = "com.android.aconfig.test.disabled_rw_2";
+ /** @hide */
public static final String FLAG_ENABLED_FIXED_RO = "com.android.aconfig.test.enabled_fixed_ro";
/** @hide */
public static final String FLAG_ENABLED_RO = "com.android.aconfig.test.enabled_ro";
@@ -185,6 +219,10 @@ mod tests {
public static boolean disabledRw() {
return FEATURE_FLAGS.disabledRw();
}
+ @UnsupportedAppUsage
+ public static boolean disabledRw2() {
+ return FEATURE_FLAGS.disabledRw2();
+ }
@com.android.aconfig.annotations.AssumeTrueForR8
@UnsupportedAppUsage
public static boolean enabledFixedRo() {
@@ -224,6 +262,11 @@ mod tests {
}
@Override
@UnsupportedAppUsage
+ public boolean disabledRw2() {
+ return getValue(Flags.FLAG_DISABLED_RW_2);
+ }
+ @Override
+ @UnsupportedAppUsage
public boolean enabledFixedRo() {
return getValue(Flags.FLAG_ENABLED_FIXED_RO);
}
@@ -259,6 +302,7 @@ mod tests {
Map.ofEntries(
Map.entry(Flags.FLAG_DISABLED_RO, false),
Map.entry(Flags.FLAG_DISABLED_RW, false),
+ Map.entry(Flags.FLAG_DISABLED_RW_2, false),
Map.entry(Flags.FLAG_ENABLED_FIXED_RO, false),
Map.entry(Flags.FLAG_ENABLED_RO, false),
Map.entry(Flags.FLAG_ENABLED_RW, false)
@@ -289,7 +333,52 @@ mod tests {
import android.provider.DeviceConfig.Properties;
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags {
- private Properties mPropertiesAconfigTest;
+ private static boolean aconfig_test_is_cached = false;
+ private static boolean other_namespace_is_cached = false;
+ private static boolean disabledRw = false;
+ private static boolean disabledRw2 = false;
+ private static boolean enabledRw = true;
+
+
+ private void load_overrides_aconfig_test() {
+ try {
+ Properties properties = DeviceConfig.getProperties("aconfig_test");
+ disabledRw =
+ properties.getBoolean("com.android.aconfig.test.disabled_rw", false);
+ enabledRw =
+ properties.getBoolean("com.android.aconfig.test.enabled_rw", true);
+ } catch (NullPointerException e) {
+ throw new RuntimeException(
+ "Cannot read value from namespace aconfig_test "
+ + "from DeviceConfig. It could be that the code using flag "
+ + "executed before SettingsProvider initialization. Please use "
+ + "fixed read-only flag by adding is_fixed_read_only: true in "
+ + "flag declaration.",
+ e
+ );
+ }
+ aconfig_test_is_cached = true;
+ }
+
+ private void load_overrides_other_namespace() {
+ try {
+ Properties properties = DeviceConfig.getProperties("other_namespace");
+ disabledRw2 =
+ properties.getBoolean("com.android.aconfig.test.disabled_rw_2", false);
+ } catch (NullPointerException e) {
+ throw new RuntimeException(
+ "Cannot read value from namespace other_namespace "
+ + "from DeviceConfig. It could be that the code using flag "
+ + "executed before SettingsProvider initialization. Please use "
+ + "fixed read-only flag by adding is_fixed_read_only: true in "
+ + "flag declaration.",
+ e
+ );
+ }
+ other_namespace_is_cached = true;
+ }
+
+
@Override
@UnsupportedAppUsage
public boolean disabledRo() {
@@ -298,18 +387,18 @@ mod tests {
@Override
@UnsupportedAppUsage
public boolean disabledRw() {
- if (mPropertiesAconfigTest == null) {
- mPropertiesAconfigTest =
- getProperties(
- "aconfig_test",
- "com.android.aconfig.test.disabled_rw"
- );
+ if (!aconfig_test_is_cached) {
+ load_overrides_aconfig_test();
}
- return mPropertiesAconfigTest
- .getBoolean(
- "com.android.aconfig.test.disabled_rw",
- false
- );
+ return disabledRw;
+ }
+ @Override
+ @UnsupportedAppUsage
+ public boolean disabledRw2() {
+ if (!other_namespace_is_cached) {
+ load_overrides_other_namespace();
+ }
+ return disabledRw2;
}
@Override
@UnsupportedAppUsage
@@ -324,36 +413,10 @@ mod tests {
@Override
@UnsupportedAppUsage
public boolean enabledRw() {
- if (mPropertiesAconfigTest == null) {
- mPropertiesAconfigTest =
- getProperties(
- "aconfig_test",
- "com.android.aconfig.test.enabled_rw"
- );
- }
- return mPropertiesAconfigTest
- .getBoolean(
- "com.android.aconfig.test.enabled_rw",
- true
- );
- }
- private Properties getProperties(
- String namespace,
- String flagName) {
- Properties properties = null;
- try {
- properties = DeviceConfig.getProperties(namespace);
- } catch (NullPointerException e) {
- throw new RuntimeException(
- "Cannot read value of flag " + flagName + " from DeviceConfig. "
- + "It could be that the code using flag executed "
- + "before SettingsProvider initialization. "
- + "Please use fixed read-only flag by adding "
- + "is_fixed_read_only: true in flag declaration.",
- e
- );
+ if (!aconfig_test_is_cached) {
+ load_overrides_aconfig_test();
}
- return properties;
+ return enabledRw;
}
}
"#;
@@ -426,6 +489,12 @@ mod tests {
}
@Override
@UnsupportedAppUsage
+ public boolean disabledRw2() {
+ throw new UnsupportedOperationException(
+ "Method is not implemented.");
+ }
+ @Override
+ @UnsupportedAppUsage
public boolean enabledFixedRo() {
throw new UnsupportedOperationException(
"Method is not implemented.");