Loading tools/aconfig/aconfig/src/codegen/java.rs +14 −97 Original line number Diff line number Diff line Loading @@ -513,86 +513,27 @@ mod tests { package com.android.aconfig.test; // TODO(b/303773055): Remove the annotation after access issue is resolved. import android.compat.annotation.UnsupportedAppUsage; import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.aconfig.storage.StorageInternalReader; import java.nio.file.Files; import java.nio.file.Paths; /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage")); private static volatile boolean isCached = false; private static volatile boolean aconfig_test_is_cached = false; private static volatile boolean other_namespace_is_cached = false; private static boolean disabledRw = false; private static boolean disabledRwExported = false; private static boolean disabledRwInOtherNamespace = false; private static boolean enabledRw = true; private void init() { StorageInternalReader reader = null; boolean foundPackage = true; try { reader = new StorageInternalReader("system", "com.android.aconfig.test"); StorageInternalReader reader = new StorageInternalReader("system", "com.android.aconfig.test"); disabledRw = reader.getBooleanFlagValue(1); disabledRwExported = reader.getBooleanFlagValue(2); enabledRw = reader.getBooleanFlagValue(8); disabledRwInOtherNamespace = reader.getBooleanFlagValue(3); } catch (Exception e) { foundPackage = false; // pass } disabledRw = foundPackage ? reader.getBooleanFlagValue(1) : false; disabledRwExported = foundPackage ? reader.getBooleanFlagValue(2) : false; enabledRw = foundPackage ? reader.getBooleanFlagValue(8) : true; disabledRwInOtherNamespace = foundPackage ? reader.getBooleanFlagValue(3) : false; isCached = true; } private void load_overrides_aconfig_test() { final long ident = Binder.clearCallingIdentity(); try { Properties properties = DeviceConfig.getProperties("aconfig_test"); disabledRw = properties.getBoolean(Flags.FLAG_DISABLED_RW, false); disabledRwExported = properties.getBoolean(Flags.FLAG_DISABLED_RW_EXPORTED, false); enabledRw = properties.getBoolean(Flags.FLAG_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 ); } catch (SecurityException e) { // for isolated process case, skip loading flag value from the storage, use the default } finally { Binder.restoreCallingIdentity(ident); } aconfig_test_is_cached = true; } private void load_overrides_other_namespace() { final long ident = Binder.clearCallingIdentity(); try { Properties properties = DeviceConfig.getProperties("other_namespace"); disabledRwInOtherNamespace = properties.getBoolean(Flags.FLAG_DISABLED_RW_IN_OTHER_NAMESPACE, 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 ); } catch (SecurityException e) { // for isolated process case, skip loading flag value from the storage, use the default } finally { Binder.restoreCallingIdentity(ident); } other_namespace_is_cached = true; } @Override @com.android.aconfig.annotations.AconfigFlagAccessor Loading @@ -604,45 +545,27 @@ mod tests { @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean disabledRw() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); } } return disabledRw; } @Override @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean disabledRwExported() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); } } return disabledRwExported; } @Override @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean disabledRwInOtherNamespace() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!other_namespace_is_cached) { load_overrides_other_namespace(); } } return disabledRwInOtherNamespace; } @Override Loading Loading @@ -673,15 +596,9 @@ mod tests { @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean enabledRw() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); } } return enabledRw; } } Loading tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template +42 −58 Original line number Diff line number Diff line package {package_name}; {{ -if not is_test_mode }} {{ -if allow_instrumentation }} {{ if not library_exported- }} {{ if not library_exported- }}{#- only new storage for prod mode #} // TODO(b/303773055): Remove the annotation after access issue is resolved. import android.compat.annotation.UnsupportedAppUsage; {{ -endif }} {{ -if runtime_lookup_required }} import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; {{ -if not library_exported }} import android.aconfig.storage.StorageInternalReader; import java.nio.file.Files; import java.nio.file.Paths; {{ -endif }} {{ -endif }} /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if runtime_lookup_required }} {{ -if not library_exported }} private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage")); private static volatile boolean isCached = false; {{ -endif }} {{ -for namespace_with_flags in namespace_flags }} private static volatile boolean {namespace_with_flags.namespace}_is_cached = false; {{ -endfor- }} {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endfor }} {{ if not library_exported }} private void init() \{ StorageInternalReader reader = null; boolean foundPackage = true; try \{ reader = new StorageInternalReader("{container}", "{package_name}"); } catch (Exception e) \{ foundPackage = false; } StorageInternalReader reader = new StorageInternalReader("{container}", "{package_name}"); {{ for namespace_with_flags in namespace_flags }} {{ -for flag in namespace_with_flags.flags }} {{ if flag.is_read_write }} {flag.method_name} = foundPackage ? reader.getBooleanFlagValue({flag.flag_offset}) : {flag.default_value}; {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset}); {{ endif }} {{ -endfor }} {{ -endfor }} } catch (Exception e) \{ // pass } isCached = true; } {{ endif }} {{ -endif }}{#- end of runtime_lookup_required #} {{ -for flag in flag_elements }} @Override @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean {flag.method_name}() \{ {{ -if flag.is_read_write }} if (!isCached) \{ init(); } return {flag.method_name}; {{ -else }} return {flag.default_value}; {{ -endif }} } {{ endfor }} } {{ -else- }}{#- device config for exproted mode #} import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -for namespace_with_flags in namespace_flags }} private static volatile boolean {namespace_with_flags.namespace}_is_cached = false; {{ -endfor- }} {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endfor }} {{ for namespace_with_flags in namespace_flags }} private void load_overrides_{namespace_with_flags.namespace}() \{ final long ident = Binder.clearCallingIdentity(); Loading Loading @@ -84,40 +91,17 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {namespace_with_flags.namespace}_is_cached = true; } {{ endfor- }} {{ -endif }}{#- end of runtime_lookup_required #} {{ -for flag in flag_elements }} @Override {{ -if not library_exported }} @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage {{ -endif }} public boolean {flag.method_name}() \{ {{ -if not library_exported }} {{ -if flag.is_read_write }} if (isReadFromNew) \{ if (!isCached) \{ init(); } } else \{ if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } } return {flag.method_name}; {{ -else }} return {flag.default_value}; {{ -endif }} {{ else }} if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } return {flag.method_name}; {{ -endif }} } {{ endfor }} } {{ -endif- }} {#- end exported mode #} {{ else }} {#- else for allow_instrumentation is not enabled #} {{ if not library_exported- }} // TODO(b/303773055): Remove the annotation after access issue is resolved. Loading Loading
tools/aconfig/aconfig/src/codegen/java.rs +14 −97 Original line number Diff line number Diff line Loading @@ -513,86 +513,27 @@ mod tests { package com.android.aconfig.test; // TODO(b/303773055): Remove the annotation after access issue is resolved. import android.compat.annotation.UnsupportedAppUsage; import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.aconfig.storage.StorageInternalReader; import java.nio.file.Files; import java.nio.file.Paths; /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags { private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage")); private static volatile boolean isCached = false; private static volatile boolean aconfig_test_is_cached = false; private static volatile boolean other_namespace_is_cached = false; private static boolean disabledRw = false; private static boolean disabledRwExported = false; private static boolean disabledRwInOtherNamespace = false; private static boolean enabledRw = true; private void init() { StorageInternalReader reader = null; boolean foundPackage = true; try { reader = new StorageInternalReader("system", "com.android.aconfig.test"); StorageInternalReader reader = new StorageInternalReader("system", "com.android.aconfig.test"); disabledRw = reader.getBooleanFlagValue(1); disabledRwExported = reader.getBooleanFlagValue(2); enabledRw = reader.getBooleanFlagValue(8); disabledRwInOtherNamespace = reader.getBooleanFlagValue(3); } catch (Exception e) { foundPackage = false; // pass } disabledRw = foundPackage ? reader.getBooleanFlagValue(1) : false; disabledRwExported = foundPackage ? reader.getBooleanFlagValue(2) : false; enabledRw = foundPackage ? reader.getBooleanFlagValue(8) : true; disabledRwInOtherNamespace = foundPackage ? reader.getBooleanFlagValue(3) : false; isCached = true; } private void load_overrides_aconfig_test() { final long ident = Binder.clearCallingIdentity(); try { Properties properties = DeviceConfig.getProperties("aconfig_test"); disabledRw = properties.getBoolean(Flags.FLAG_DISABLED_RW, false); disabledRwExported = properties.getBoolean(Flags.FLAG_DISABLED_RW_EXPORTED, false); enabledRw = properties.getBoolean(Flags.FLAG_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 ); } catch (SecurityException e) { // for isolated process case, skip loading flag value from the storage, use the default } finally { Binder.restoreCallingIdentity(ident); } aconfig_test_is_cached = true; } private void load_overrides_other_namespace() { final long ident = Binder.clearCallingIdentity(); try { Properties properties = DeviceConfig.getProperties("other_namespace"); disabledRwInOtherNamespace = properties.getBoolean(Flags.FLAG_DISABLED_RW_IN_OTHER_NAMESPACE, 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 ); } catch (SecurityException e) { // for isolated process case, skip loading flag value from the storage, use the default } finally { Binder.restoreCallingIdentity(ident); } other_namespace_is_cached = true; } @Override @com.android.aconfig.annotations.AconfigFlagAccessor Loading @@ -604,45 +545,27 @@ mod tests { @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean disabledRw() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); } } return disabledRw; } @Override @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean disabledRwExported() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); } } return disabledRwExported; } @Override @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean disabledRwInOtherNamespace() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!other_namespace_is_cached) { load_overrides_other_namespace(); } } return disabledRwInOtherNamespace; } @Override Loading Loading @@ -673,15 +596,9 @@ mod tests { @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean enabledRw() { if (isReadFromNew) { if (!isCached) { init(); } } else { if (!aconfig_test_is_cached) { load_overrides_aconfig_test(); } } return enabledRw; } } Loading
tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template +42 −58 Original line number Diff line number Diff line package {package_name}; {{ -if not is_test_mode }} {{ -if allow_instrumentation }} {{ if not library_exported- }} {{ if not library_exported- }}{#- only new storage for prod mode #} // TODO(b/303773055): Remove the annotation after access issue is resolved. import android.compat.annotation.UnsupportedAppUsage; {{ -endif }} {{ -if runtime_lookup_required }} import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; {{ -if not library_exported }} import android.aconfig.storage.StorageInternalReader; import java.nio.file.Files; import java.nio.file.Paths; {{ -endif }} {{ -endif }} /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if runtime_lookup_required }} {{ -if not library_exported }} private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage")); private static volatile boolean isCached = false; {{ -endif }} {{ -for namespace_with_flags in namespace_flags }} private static volatile boolean {namespace_with_flags.namespace}_is_cached = false; {{ -endfor- }} {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endfor }} {{ if not library_exported }} private void init() \{ StorageInternalReader reader = null; boolean foundPackage = true; try \{ reader = new StorageInternalReader("{container}", "{package_name}"); } catch (Exception e) \{ foundPackage = false; } StorageInternalReader reader = new StorageInternalReader("{container}", "{package_name}"); {{ for namespace_with_flags in namespace_flags }} {{ -for flag in namespace_with_flags.flags }} {{ if flag.is_read_write }} {flag.method_name} = foundPackage ? reader.getBooleanFlagValue({flag.flag_offset}) : {flag.default_value}; {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset}); {{ endif }} {{ -endfor }} {{ -endfor }} } catch (Exception e) \{ // pass } isCached = true; } {{ endif }} {{ -endif }}{#- end of runtime_lookup_required #} {{ -for flag in flag_elements }} @Override @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage public boolean {flag.method_name}() \{ {{ -if flag.is_read_write }} if (!isCached) \{ init(); } return {flag.method_name}; {{ -else }} return {flag.default_value}; {{ -endif }} } {{ endfor }} } {{ -else- }}{#- device config for exproted mode #} import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -for namespace_with_flags in namespace_flags }} private static volatile boolean {namespace_with_flags.namespace}_is_cached = false; {{ -endfor- }} {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endfor }} {{ for namespace_with_flags in namespace_flags }} private void load_overrides_{namespace_with_flags.namespace}() \{ final long ident = Binder.clearCallingIdentity(); Loading Loading @@ -84,40 +91,17 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {namespace_with_flags.namespace}_is_cached = true; } {{ endfor- }} {{ -endif }}{#- end of runtime_lookup_required #} {{ -for flag in flag_elements }} @Override {{ -if not library_exported }} @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage {{ -endif }} public boolean {flag.method_name}() \{ {{ -if not library_exported }} {{ -if flag.is_read_write }} if (isReadFromNew) \{ if (!isCached) \{ init(); } } else \{ if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } } return {flag.method_name}; {{ -else }} return {flag.default_value}; {{ -endif }} {{ else }} if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } return {flag.method_name}; {{ -endif }} } {{ endfor }} } {{ -endif- }} {#- end exported mode #} {{ else }} {#- else for allow_instrumentation is not enabled #} {{ if not library_exported- }} // TODO(b/303773055): Remove the annotation after access issue is resolved. Loading