diff --git a/tools/aconfig/src/codegen/cpp.rs b/tools/aconfig/src/codegen/cpp.rs index 6e3ac7b61f..000581b18b 100644 --- a/tools/aconfig/src/codegen/cpp.rs +++ b/tools/aconfig/src/codegen/cpp.rs @@ -170,6 +170,8 @@ public: virtual bool enabled_ro() = 0; + virtual bool enabled_ro_exported() = 0; + virtual bool enabled_rw() = 0; }; @@ -199,6 +201,10 @@ inline bool enabled_ro() { return true; } +inline bool enabled_ro_exported() { + return true; +} + inline bool enabled_rw() { return provider_->enabled_rw(); } @@ -220,6 +226,8 @@ bool com_android_aconfig_test_enabled_fixed_ro(); bool com_android_aconfig_test_enabled_ro(); +bool com_android_aconfig_test_enabled_ro_exported(); + bool com_android_aconfig_test_enabled_rw(); #ifdef __cplusplus @@ -265,6 +273,10 @@ public: virtual void enabled_ro(bool val) = 0; + virtual bool enabled_ro_exported() = 0; + + virtual void enabled_ro_exported(bool val) = 0; + virtual bool enabled_rw() = 0; virtual void enabled_rw(bool val) = 0; @@ -322,6 +334,14 @@ inline void enabled_ro(bool val) { provider_->enabled_ro(val); } +inline bool enabled_ro_exported() { + return provider_->enabled_ro_exported(); +} + +inline void enabled_ro_exported(bool val) { + provider_->enabled_ro_exported(val); +} + inline bool enabled_rw() { return provider_->enabled_rw(); } @@ -363,6 +383,10 @@ bool com_android_aconfig_test_enabled_ro(); void set_com_android_aconfig_test_enabled_ro(bool val); +bool com_android_aconfig_test_enabled_ro_exported(); + +void set_com_android_aconfig_test_enabled_ro_exported(bool val); + bool com_android_aconfig_test_enabled_rw(); void set_com_android_aconfig_test_enabled_rw(bool val); @@ -429,6 +453,10 @@ namespace com::android::aconfig::test { return true; } + virtual bool enabled_ro_exported() override { + return true; + } + virtual bool enabled_rw() override { if (cache_[3] == -1) { cache_[3] = server_configurable_flags::GetServerConfigurableFlag( @@ -471,6 +499,10 @@ bool com_android_aconfig_test_enabled_ro() { return true; } +bool com_android_aconfig_test_enabled_ro_exported() { + return true; +} + bool com_android_aconfig_test_enabled_rw() { return com::android::aconfig::test::enabled_rw(); } @@ -581,6 +613,19 @@ namespace com::android::aconfig::test { overrides_["enabled_ro"] = val; } + virtual bool enabled_ro_exported() override { + auto it = overrides_.find("enabled_ro_exported"); + if (it != overrides_.end()) { + return it->second; + } else { + return true; + } + } + + virtual void enabled_ro_exported(bool val) override { + overrides_["enabled_ro_exported"] = val; + } + virtual bool enabled_rw() override { auto it = overrides_.find("enabled_rw"); if (it != overrides_.end()) { @@ -661,6 +706,17 @@ void set_com_android_aconfig_test_enabled_ro(bool val) { com::android::aconfig::test::enabled_ro(val); } + +bool com_android_aconfig_test_enabled_ro_exported() { + return com::android::aconfig::test::enabled_ro_exported(); +} + + +void set_com_android_aconfig_test_enabled_ro_exported(bool val) { + com::android::aconfig::test::enabled_ro_exported(val); +} + + bool com_android_aconfig_test_enabled_rw() { return com::android::aconfig::test::enabled_rw(); } diff --git a/tools/aconfig/src/codegen/java.rs b/tools/aconfig/src/codegen/java.rs index 47ab1ecf00..f958c21bac 100644 --- a/tools/aconfig/src/codegen/java.rs +++ b/tools/aconfig/src/codegen/java.rs @@ -193,6 +193,9 @@ mod tests { @com.android.aconfig.annotations.AssumeTrueForR8 @UnsupportedAppUsage boolean enabledRo(); + @com.android.aconfig.annotations.AssumeTrueForR8 + @UnsupportedAppUsage + boolean enabledRoExported(); @UnsupportedAppUsage boolean enabledRw(); } @@ -217,6 +220,8 @@ mod tests { /** @hide */ public static final String FLAG_ENABLED_RO = "com.android.aconfig.test.enabled_ro"; /** @hide */ + public static final String FLAG_ENABLED_RO_EXPORTED = "com.android.aconfig.test.enabled_ro_exported"; + /** @hide */ public static final String FLAG_ENABLED_RW = "com.android.aconfig.test.enabled_rw"; @com.android.aconfig.annotations.AssumeFalseForR8 @@ -246,6 +251,11 @@ mod tests { public static boolean enabledRo() { return FEATURE_FLAGS.enabledRo(); } + @com.android.aconfig.annotations.AssumeTrueForR8 + @UnsupportedAppUsage + public static boolean enabledRoExported() { + return FEATURE_FLAGS.enabledRoExported(); + } @UnsupportedAppUsage public static boolean enabledRw() { return FEATURE_FLAGS.enabledRw(); @@ -295,6 +305,11 @@ mod tests { } @Override @UnsupportedAppUsage + public boolean enabledRoExported() { + return getValue(Flags.FLAG_ENABLED_RO_EXPORTED); + } + @Override + @UnsupportedAppUsage public boolean enabledRw() { return getValue(Flags.FLAG_ENABLED_RW); } @@ -324,6 +339,7 @@ mod tests { Map.entry(Flags.FLAG_DISABLED_RW_IN_OTHER_NAMESPACE, false), Map.entry(Flags.FLAG_ENABLED_FIXED_RO, false), Map.entry(Flags.FLAG_ENABLED_RO, false), + Map.entry(Flags.FLAG_ENABLED_RO_EXPORTED, false), Map.entry(Flags.FLAG_ENABLED_RW, false) ) ); @@ -442,6 +458,11 @@ mod tests { } @Override @UnsupportedAppUsage + public boolean enabledRoExported() { + return true; + } + @Override + @UnsupportedAppUsage public boolean enabledRw() { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); @@ -494,19 +515,19 @@ mod tests { import android.compat.annotation.UnsupportedAppUsage; /** @hide */ public final class Flags { - /** @hide */ - public static final String FLAG_DISABLED_RW = "com.android.aconfig.test.disabled_rw"; /** @hide */ public static final String FLAG_DISABLED_RW_EXPORTED = "com.android.aconfig.test.disabled_rw_exported"; + /** @hide */ + public static final String FLAG_ENABLED_RO_EXPORTED = "com.android.aconfig.test.enabled_ro_exported"; - @UnsupportedAppUsage - public static boolean disabledRw() { - return FEATURE_FLAGS.disabledRw(); - } @UnsupportedAppUsage public static boolean disabledRwExported() { return FEATURE_FLAGS.disabledRwExported(); } + @UnsupportedAppUsage + public static boolean enabledRoExported() { + return FEATURE_FLAGS.enabledRoExported(); + } private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl(); } "#; @@ -517,10 +538,10 @@ mod tests { import android.compat.annotation.UnsupportedAppUsage; /** @hide */ public interface FeatureFlags { - @UnsupportedAppUsage - boolean disabledRw(); @UnsupportedAppUsage boolean disabledRwExported(); + @UnsupportedAppUsage + boolean enabledRoExported(); } "#; @@ -534,17 +555,17 @@ mod tests { public final class FeatureFlagsImpl implements FeatureFlags { private static boolean aconfig_test_is_cached = false; private static boolean other_namespace_is_cached = false; - private static boolean disabledRw = false; private static boolean disabledRwExported = false; + private static boolean enabledRoExported = false; private void load_overrides_aconfig_test() { try { Properties properties = DeviceConfig.getProperties("aconfig_test"); - disabledRw = - properties.getBoolean("com.android.aconfig.test.disabled_rw", false); disabledRwExported = properties.getBoolean("com.android.aconfig.test.disabled_rw_exported", false); + enabledRoExported = + properties.getBoolean("com.android.aconfig.test.enabled_ro_exported", false); } catch (NullPointerException e) { throw new RuntimeException( "Cannot read value from namespace aconfig_test " @@ -574,15 +595,6 @@ mod tests { other_namespace_is_cached = true; } - @Override - @UnsupportedAppUsage - public boolean disabledRw() { - if (!aconfig_test_is_cached) { - load_overrides_aconfig_test(); - } - return disabledRw; - } - @Override @UnsupportedAppUsage public boolean disabledRwExported() { @@ -591,6 +603,15 @@ mod tests { } return disabledRwExported; } + + @Override + @UnsupportedAppUsage + public boolean enabledRoExported() { + if (!aconfig_test_is_cached) { + load_overrides_aconfig_test(); + } + return enabledRoExported; + } }"#; let expect_fake_feature_flags_impl_content = r#" @@ -606,13 +627,13 @@ mod tests { } @Override @UnsupportedAppUsage - public boolean disabledRw() { - return getValue(Flags.FLAG_DISABLED_RW); + public boolean disabledRwExported() { + return getValue(Flags.FLAG_DISABLED_RW_EXPORTED); } @Override @UnsupportedAppUsage - public boolean disabledRwExported() { - return getValue(Flags.FLAG_DISABLED_RW_EXPORTED); + public boolean enabledRoExported() { + return getValue(Flags.FLAG_ENABLED_RO_EXPORTED); } public void setFlag(String flagName, boolean value) { if (!this.mFlagMap.containsKey(flagName)) { @@ -640,6 +661,7 @@ mod tests { Map.entry(Flags.FLAG_DISABLED_RW_IN_OTHER_NAMESPACE, false), Map.entry(Flags.FLAG_ENABLED_FIXED_RO, false), Map.entry(Flags.FLAG_ENABLED_RO, false), + Map.entry(Flags.FLAG_ENABLED_RO_EXPORTED, false), Map.entry(Flags.FLAG_ENABLED_RW, false) ) ); @@ -739,6 +761,12 @@ mod tests { } @Override @UnsupportedAppUsage + public boolean enabledRoExported() { + throw new UnsupportedOperationException( + "Method is not implemented."); + } + @Override + @UnsupportedAppUsage public boolean enabledRw() { throw new UnsupportedOperationException( "Method is not implemented."); diff --git a/tools/aconfig/src/codegen/rust.rs b/tools/aconfig/src/codegen/rust.rs index a573793571..04be93b96a 100644 --- a/tools/aconfig/src/codegen/rust.rs +++ b/tools/aconfig/src/codegen/rust.rs @@ -158,6 +158,11 @@ impl FlagProvider { true } + /// query flag enabled_ro_exported + pub fn enabled_ro_exported(&self) -> bool { + true + } + /// query flag enabled_rw pub fn enabled_rw(&self) -> bool { *CACHED_enabled_rw @@ -203,6 +208,12 @@ pub fn enabled_ro() -> bool { true } +/// query flag enabled_ro_exported +#[inline(always)] +pub fn enabled_ro_exported() -> bool { + true +} + /// query flag enabled_rw #[inline(always)] pub fn enabled_rw() -> bool { @@ -303,6 +314,18 @@ impl FlagProvider { self.overrides.insert("enabled_ro", val); } + /// query flag enabled_ro_exported + pub fn enabled_ro_exported(&self) -> bool { + self.overrides.get("enabled_ro_exported").copied().unwrap_or( + true + ) + } + + /// set flag enabled_ro_exported + pub fn set_enabled_ro_exported(&mut self, val: bool) { + self.overrides.insert("enabled_ro_exported", val); + } + /// query flag enabled_rw pub fn enabled_rw(&self) -> bool { self.overrides.get("enabled_rw").copied().unwrap_or( @@ -401,6 +424,18 @@ pub fn set_enabled_ro(val: bool) { PROVIDER.lock().unwrap().set_enabled_ro(val); } +/// query flag enabled_ro_exported +#[inline(always)] +pub fn enabled_ro_exported() -> bool { + PROVIDER.lock().unwrap().enabled_ro_exported() +} + +/// set flag enabled_ro_exported +#[inline(always)] +pub fn set_enabled_ro_exported(val: bool) { + PROVIDER.lock().unwrap().set_enabled_ro_exported(val); +} + /// query flag enabled_rw #[inline(always)] pub fn enabled_rw() -> bool { diff --git a/tools/aconfig/src/commands.rs b/tools/aconfig/src/commands.rs index d80a31bfd1..be32bde92c 100644 --- a/tools/aconfig/src/commands.rs +++ b/tools/aconfig/src/commands.rs @@ -370,7 +370,7 @@ mod tests { assert_eq!(ProtoFlagState::ENABLED, enabled_ro.trace[2].state()); assert_eq!(ProtoFlagPermission::READ_ONLY, enabled_ro.trace[2].permission()); - assert_eq!(7, parsed_flags.parsed_flag.len()); + assert_eq!(8, parsed_flags.parsed_flag.len()); for pf in parsed_flags.parsed_flag.iter() { if pf.name() == "enabled_fixed_ro" { continue; diff --git a/tools/aconfig/src/test.rs b/tools/aconfig/src/test.rs index 2c63fefdbc..71de57ec58 100644 --- a/tools/aconfig/src/test.rs +++ b/tools/aconfig/src/test.rs @@ -62,7 +62,7 @@ parsed_flag { permission: READ_WRITE } is_fixed_read_only: false - is_exported: true + is_exported: false container: "system" metadata { purpose: PURPOSE_UNSPECIFIED @@ -72,7 +72,7 @@ parsed_flag { package: "com.android.aconfig.test" name: "disabled_rw_exported" namespace: "aconfig_test" - description: "This flag is exported" + description: "This flag is DISABLED + READ_WRITE and exported" bug: "111" state: DISABLED permission: READ_WRITE @@ -173,6 +173,31 @@ parsed_flag { purpose: PURPOSE_BUGFIX } } +parsed_flag { + package: "com.android.aconfig.test" + name: "enabled_ro_exported" + namespace: "aconfig_test" + description: "This flag is ENABLED + READ_ONLY and exported" + bug: "111" + state: ENABLED + permission: READ_ONLY + trace { + source: "tests/test.aconfig" + state: DISABLED + permission: READ_WRITE + } + trace { + source: "tests/first.values" + state: ENABLED + permission: READ_ONLY + } + is_fixed_read_only: false + is_exported: true + container: "system" + metadata { + purpose: PURPOSE_UNSPECIFIED + } +} parsed_flag { package: "com.android.aconfig.test" name: "enabled_rw" diff --git a/tools/aconfig/templates/FeatureFlagsImpl.java.template b/tools/aconfig/templates/FeatureFlagsImpl.java.template index a15c85952f..33aa605a77 100644 --- a/tools/aconfig/templates/FeatureFlagsImpl.java.template +++ b/tools/aconfig/templates/FeatureFlagsImpl.java.template @@ -71,14 +71,10 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ @Override @UnsupportedAppUsage public boolean {flag.method_name}() \{ - {{ -if flag.is_read_write }} if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } return {flag.method_name}; - {{ else }} - return {flag.default_value}; - {{ endif- }} } {{ endif }} diff --git a/tools/aconfig/tests/first.values b/tools/aconfig/tests/first.values index b248d43dbd..731ce8483f 100644 --- a/tools/aconfig/tests/first.values +++ b/tools/aconfig/tests/first.values @@ -28,6 +28,12 @@ flag_value { state: ENABLED permission: READ_ONLY } +flag_value { + package: "com.android.aconfig.test" + name: "enabled_ro_exported" + state: ENABLED + permission: READ_ONLY +} flag_value { package: "com.android.aconfig.test" name: "disabled_rw_exported" diff --git a/tools/aconfig/tests/test.aconfig b/tools/aconfig/tests/test.aconfig index 310d0a640f..014bced239 100644 --- a/tools/aconfig/tests/test.aconfig +++ b/tools/aconfig/tests/test.aconfig @@ -43,7 +43,6 @@ flag { namespace: "aconfig_test" description: "This flag is DISABLED + READ_WRITE" bug: "456" - is_exported: true } # This flag's final value calculated from: @@ -65,9 +64,17 @@ flag { } flag { - name: "disabled_rw_exported" + name: "enabled_ro_exported" namespace: "aconfig_test" - description: "This flag is exported" + description: "This flag is ENABLED + READ_ONLY and exported" bug: "111" is_exported: true -} \ No newline at end of file +} + +flag { + name: "disabled_rw_exported" + namespace: "aconfig_test" + description: "This flag is DISABLED + READ_WRITE and exported" + bug: "111" + is_exported: true +}