This commit adds a third codegen mode, _exported_, in addition to the existing modes, production and test. When codegen mode is _exported_, getters are generated _only_ for flags marked as exported as well. Also the getters always look up DeviceConfig values at runtime, and have a default value of false. This only implements exported mode for Java codegen, follow-up CLs will support Rust and C++. Test: atest aconfig.test Bug: 311152507 Change-Id: Ie39379b40de072180e05d84c76361b24cc0e0d83
116 lines
3.3 KiB
Plaintext
116 lines
3.3 KiB
Plaintext
package {package_name};
|
|
// TODO(b/303773055): Remove the annotation after access issue is resolved.
|
|
import android.compat.annotation.UnsupportedAppUsage;
|
|
{{ if not is_test_mode }}
|
|
{{ if is_read_write- }}
|
|
import android.provider.DeviceConfig;
|
|
import android.provider.DeviceConfig.Properties;
|
|
{{ endif }}
|
|
/** @hide */
|
|
public final class FeatureFlagsImpl implements FeatureFlags \{
|
|
{{- if is_read_write }}
|
|
{{- for namespace_with_flags in namespace_flags }}
|
|
private static boolean {namespace_with_flags.namespace}_is_cached = false;
|
|
{{- endfor- }}
|
|
|
|
{{ for flag in flag_elements }}
|
|
{{ if library_exported }}
|
|
{{ if flag.exported }}
|
|
private static boolean {flag.method_name} = false;
|
|
{{ endif }}
|
|
|
|
{{ else }}
|
|
|
|
{{- if flag.is_read_write }}
|
|
private static boolean {flag.method_name} = {flag.default_value};
|
|
{{- endif- }}
|
|
{{ endif }}
|
|
{{ endfor }}
|
|
|
|
{{ for namespace_with_flags in namespace_flags }}
|
|
private void load_overrides_{namespace_with_flags.namespace}() \{
|
|
try \{
|
|
Properties properties = DeviceConfig.getProperties("{namespace_with_flags.namespace}");
|
|
|
|
{{- for flag in namespace_with_flags.flags }}
|
|
{{ if library_exported }}
|
|
|
|
{{ if flag.exported }}
|
|
{flag.method_name} =
|
|
properties.getBoolean("{flag.device_config_flag}", false);
|
|
{{ endif }}
|
|
|
|
{{ else }}
|
|
|
|
{{ if flag.is_read_write }}
|
|
{flag.method_name} =
|
|
properties.getBoolean("{flag.device_config_flag}", {flag.default_value});
|
|
{{ endif }}
|
|
|
|
{{ endif }}
|
|
{{ endfor }}
|
|
} catch (NullPointerException e) \{
|
|
throw new RuntimeException(
|
|
"Cannot read value from namespace {namespace_with_flags.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
|
|
);
|
|
}
|
|
{namespace_with_flags.namespace}_is_cached = true;
|
|
}
|
|
{{ endfor- }}
|
|
{{ endif- }}
|
|
|
|
{{ for flag in flag_elements }}
|
|
{{ if library_exported }}
|
|
|
|
{{ if flag.exported }}
|
|
@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 }}
|
|
|
|
{{ else }}
|
|
@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 }}
|
|
|
|
{{ endfor }}
|
|
}
|
|
{{ else }}
|
|
{#- Generate only stub if in test mode #}
|
|
/** @hide */
|
|
public final class FeatureFlagsImpl implements FeatureFlags \{
|
|
{{ for flag in flag_elements }}
|
|
@Override
|
|
@UnsupportedAppUsage
|
|
public boolean {flag.method_name}() \{
|
|
throw new UnsupportedOperationException(
|
|
"Method is not implemented.");
|
|
}
|
|
{{ endfor- }}
|
|
}
|
|
{{ endif }}
|