Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e1f4be17 authored by Marybeth Fair's avatar Marybeth Fair Committed by Automerger Merge Worker
Browse files

Merge "aconfig: Split FeatureFlagsImpl templates." into main am: e8ac1cdd

parents efb861c5 e8ac1cdd
Loading
Loading
Loading
Loading
+58 −4
Original line number Diff line number Diff line
@@ -74,10 +74,7 @@ where
    };
    let mut template = TinyTemplate::new();
    template.add_template("Flags.java", include_str!("../../templates/Flags.java.template"))?;
    template.add_template(
        "FeatureFlagsImpl.java",
        include_str!("../../templates/FeatureFlagsImpl.java.template"),
    )?;
    add_feature_flags_impl_template(&context, &mut template)?;
    template.add_template(
        "FeatureFlags.java",
        include_str!("../../templates/FeatureFlags.java.template"),
@@ -233,6 +230,63 @@ fn format_property_name(property_name: &str) -> String {
    format!("mProperties{}{}", &name[0..1].to_ascii_uppercase(), &name[1..])
}

fn add_feature_flags_impl_template(
    context: &Context,
    template: &mut TinyTemplate,
) -> Result<(), tinytemplate::error::Error> {
    if context.is_test_mode {
        // Test mode has its own template, so use regardless of any other settings.
        template.add_template(
            "FeatureFlagsImpl.java",
            include_str!("../../templates/FeatureFlagsImpl.test_mode.java.template"),
        )?;
        return Ok(());
    }

    println!("lib exported: {}", context.library_exported);
    println!("new_exp: {}", context.new_exported);
    println!("allow in: {}", context.allow_instrumentation);
    match (context.library_exported, context.new_exported, context.allow_instrumentation) {
        // Exported library with new_exported enabled, use new storage exported template.
        (true, true, _) => {
            println!("new exported template");
            template.add_template(
                "FeatureFlagsImpl.java",
                include_str!("../../templates/FeatureFlagsImpl.exported.java.template"),
            )?;
        }

        // Exported library with new_exported NOT enabled, use legacy (device
        // config) template, because regardless of allow_instrumentation, we use
        // device config for exported libs if new_exported isn't enabled.
        // Remove once new_exported is fully rolled out.
        (true, false, _) => {
            println!("old exported, old template");
            template.add_template(
                "FeatureFlagsImpl.java",
                include_str!("../../templates/FeatureFlagsImpl.java.template"),
            )?;
        }

        // New storage internal mode.
        (false, _, true) => {
            template.add_template(
                "FeatureFlagsImpl.java",
                include_str!("../../templates/FeatureFlagsImpl.new_storage.java.template"),
            )?;
        }

        // Device config internal mode. Use legacy (device config) template.
        (false, _, false) => {
            template.add_template(
                "FeatureFlagsImpl.java",
                include_str!("../../templates/FeatureFlagsImpl.java.template"),
            )?;
        }
    };
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
+44 −0
Original line number Diff line number Diff line
package {package_name}; {#- CODEGEN FOR EXPORTED MODE FOR NEW STORAGE #}

import android.os.Build;
import android.os.flagging.AconfigPackage;
import android.util.Log;
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
    private static final String TAG = "FeatureFlagsImplExport";
    private static volatile boolean isCached = false;
{{ for flag in flag_elements }}
    private static boolean {flag.method_name} = false;
{{ -endfor }} {#- end flag_elements #}
    private void init() \{
        try \{
            AconfigPackage reader = AconfigPackage.load("{package_name}");
            {{ -for namespace_with_flags in namespace_flags }}
            {{ -for flag in namespace_with_flags.flags }}
            {{ -if flag.finalized_sdk_present }}
            {flag.method_name} = Build.VERSION.SDK_INT >= {flag.finalized_sdk_value} ? true : reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value});
            {{ - else }} {#- else finalized_sdk_present #}
            {flag.method_name} = reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value});
            {{ -endif}}  {#- end finalized_sdk_present#}
            {{ -endfor }} {#- end namespace_with_flags.flags #}
            {{ -endfor }} {#- end namespace_flags #}
        } catch (Exception e) \{
            // pass
            Log.e(TAG, e.toString());
        } catch (LinkageError e) \{
            // for mainline module running on older devices.
            // This should be replaces to version check, after the version bump.
            Log.e(TAG, e.toString());
        }
        isCached = true;
    }
{{ -for flag in flag_elements }}
    @Override
    public boolean {flag.method_name}() \{
        if (!isCached) \{
            init();
        }
        return {flag.method_name};
    }
{{ endfor }} {#- end flag_elements #}
}
+20 −20
Original line number Diff line number Diff line
@@ -8,11 +8,11 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
{{ if is_platform_container }}
import android.os.flagging.PlatformAconfigPackageInternal;
{{ -else }}
{{ -else }} {#- else is_platform_container #}
import android.os.flagging.AconfigPackageInternal;
{{ -endif }}
{{ -endif }} {#- end of is_platform_container#}
import android.util.Log;
{{ -endif }}
{{ -endif }} {#- end of runtime_lookup_required#}
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if runtime_lookup_required }}
@@ -21,21 +21,21 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ for flag in flag_elements }}
{{ -if flag.is_read_write }}
    private static boolean {flag.method_name} = {flag.default_value};
{{ -endif }}
{{ -endif }} {#- end of is_read_write#}
{{ -endfor }}

    private void init() \{
        try \{
{{ if is_platform_container }}
            PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("{package_name}", {package_fingerprint});
{{ -else }}
{{ -else }} {#- else is_platform_container #}
            AconfigPackageInternal reader = AconfigPackageInternal.load("{package_name}", {package_fingerprint});
{{ -endif }}
{{ -endif }} {#- end of is_platform_container#}
        {{ -for namespace_with_flags in namespace_flags }}
        {{ -for flag in namespace_with_flags.flags }}
        {{ -if flag.is_read_write }}
            {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset});
        {{ -endif }}
        {{ -endif }} {#- is_read_write#}
        {{ -endfor }}
        {{ -endfor }}
        } catch (Exception e) \{
@@ -58,9 +58,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
            init();
        }
        return {flag.method_name};
{{ -else }}
{{ -else }}{#- else is_read_write #}
        return {flag.default_value};
{{ -endif }}
{{ -endif }}  {#- end of is_read_write#}
    }
{{ endfor }}
}
@@ -83,9 +83,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
            {{ -for flag in namespace_with_flags.flags }}
            {{ -if flag.finalized_sdk_present }}
            {flag.method_name} = Build.VERSION.SDK_INT >= {flag.finalized_sdk_value} ? true : reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value});
            {{ - else }}
            {{ - else }} {#- else finalized_sdk_present #}
            {flag.method_name} = reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value});
            {{ -endif}}
            {{ -endif}}  {#- end of finalized_sdk_present#}
            {{ -endfor }}
            {{ -endfor }}
        } catch (Exception e) \{
@@ -120,7 +120,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ for flag in flag_elements }}
{{ -if flag.is_read_write }}
    private static boolean {flag.method_name} = {flag.default_value};
{{ -endif }}
{{ -endif }}  {#- end of is_read_write#}
{{ -endfor }}
{{ for namespace_with_flags in namespace_flags }}
    private void load_overrides_{namespace_with_flags.namespace}() \{
@@ -131,7 +131,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if flag.is_read_write }}
            {flag.method_name} =
                properties.getBoolean(Flags.FLAG_{flag.flag_name_constant_suffix}, {flag.default_value});
{{ -endif }}
{{ -endif }}  {#- end of is_read_write#}
{{ -endfor }}
        } catch (NullPointerException e) \{
            throw new RuntimeException(
@@ -166,13 +166,13 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ if not library_exported- }}
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import android.compat.annotation.UnsupportedAppUsage;
{{ -endif }}
{{ -endif }} {#- end of not library_exported#}

{{ -if runtime_lookup_required }}
import android.os.Binder;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
{{ -endif }}
{{ -endif }}  {#- end of runtime_lookup_required#}
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if runtime_lookup_required }}
@@ -183,7 +183,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ for flag in flag_elements }}
{{- if flag.is_read_write }}
    private static boolean {flag.method_name} = {flag.default_value};
{{ -endif }}
{{ -endif }} {#- end of is_read_write#}
{{ -endfor }}
{{ for namespace_with_flags in namespace_flags }}
    private void load_overrides_{namespace_with_flags.namespace}() \{
@@ -194,7 +194,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if flag.is_read_write }}
            {flag.method_name} =
                properties.getBoolean(Flags.FLAG_{flag.flag_name_constant_suffix}, {flag.default_value});
{{ -endif }}
{{ -endif }} {#- end of is_read_write#}
{{ -endfor }}
        } catch (NullPointerException e) \{
            throw new RuntimeException(
@@ -217,16 +217,16 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if not library_exported }}
    @com.android.aconfig.annotations.AconfigFlagAccessor
    @UnsupportedAppUsage
{{ -endif }}
{{ -endif }}{#- end of not library_exported #}
    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 }}
{{ -else }} {#- else is_read_write #}
        return {flag.default_value};
{{ -endif }}
{{ -endif }}{#- end of is_read_write #}
    }
{{ endfor }}
}
+63 −0
Original line number Diff line number Diff line
package {package_name}; {#- CODEGEN FOR INTERNAL MODE FOR NEW STORAGE #}
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import android.compat.annotation.UnsupportedAppUsage;
{{ -if runtime_lookup_required }}
import android.os.Build;
{{ if is_platform_container }}
import android.os.flagging.PlatformAconfigPackageInternal;
{{ -else }} {#- else is_platform_container #}
import android.os.flagging.AconfigPackageInternal;
{{ -endif }} {#- end of is_platform_container#}
import android.util.Log;
{{ -endif }} {#- end of runtime_lookup_required#}
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if runtime_lookup_required }}
    private static final String TAG = "FeatureFlagsImpl";
    private static volatile boolean isCached = false;
{{ for flag in flag_elements }}
{{ -if flag.is_read_write }}
    private static boolean {flag.method_name} = {flag.default_value};
{{ -endif }} {#- end of is_read_write#}
{{ -endfor }} {#- else flag_elements #}

    private void init() \{
        try \{
{{ if is_platform_container }}
            PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("{package_name}", {package_fingerprint});
{{ -else }} {#- else is_platform_container #}
            AconfigPackageInternal reader = AconfigPackageInternal.load("{package_name}", {package_fingerprint});
{{ -endif }} {#- end of is_platform_container#}
        {{ -for namespace_with_flags in namespace_flags }}
        {{ -for flag in namespace_with_flags.flags }}
        {{ -if flag.is_read_write }}
            {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset});
        {{ -endif }} {#- is_read_write#}
        {{ -endfor }} {#- else namespace_with_flags.flags #}
        {{ -endfor }}  {#- else namespace_flags #}
        } catch (Exception e) \{
            Log.e(TAG, e.toString());
        } catch (LinkageError e) \{
            // for mainline module running on older devices.
            // This should be replaces to version check, after the version bump.
            Log.e(TAG, e.toString());
        }
        isCached = true;
    }
{{ -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 }}{#- else is_read_write #}
        return {flag.default_value};
{{ -endif }}  {#- end of is_read_write#}
    }
{{ endfor }} {#- else flag_elements #}
}
+14 −0
Original line number Diff line number Diff line
package {package_name}; {#- CODEGEN FOR TEST MODE #}
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ for flag in flag_elements }}
    @Override
{{ -if not library_exported }}
    @com.android.aconfig.annotations.AconfigFlagAccessor
{{ -endif }}
    public boolean {flag.method_name}() \{
        throw new UnsupportedOperationException(
            "Method is not implemented.");
    }
{{ endfor- }}
}