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

Commit b4e183fb authored by Zhi Dou's avatar Zhi Dou Committed by Gerrit Code Review
Browse files

Merge "Revert^2 "remove file check"" into main

parents 64fe724e da6ff4a4
Loading
Loading
Loading
Loading
+14 −97
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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;
            }
        }
+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();
@@ -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.