• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1package {package_name};
2
3{{ if not library_exported- }}
4// TODO(b/303773055): Remove the annotation after access issue is resolved.
5import android.compat.annotation.UnsupportedAppUsage;
6{{ -endif }}
7import java.util.Arrays;
8{{ -if library_exported }}
9import java.util.HashMap;
10import java.util.Map;
11{{ -endif }}
12import java.util.HashSet;
13import java.util.List;
14import java.util.Set;
15import java.util.function.BiPredicate;
16import java.util.function.Predicate;
17{{ -if library_exported }}
18import android.os.Build;
19{{ -endif }}
20
21{{ -if single_exported_file }}
22{{ -if library_exported }}
23@Deprecated {#- PREFER ExportedFlags #}
24{{ -endif }}
25{{ -else }}
26/** @hide */
27{{ -endif }}
28public class CustomFeatureFlags implements FeatureFlags \{
29
30    private BiPredicate<String, Predicate<FeatureFlags>> mGetValueImpl;
31
32    public CustomFeatureFlags(BiPredicate<String, Predicate<FeatureFlags>> getValueImpl) \{
33        mGetValueImpl = getValueImpl;
34    }
35
36{{ -for item in flag_elements}}
37    @Override
38{{ if not library_exported }}    @UnsupportedAppUsage{{ -endif }}
39    public boolean {item.method_name}() \{
40        return getValue(Flags.FLAG_{item.flag_name_constant_suffix},
41            FeatureFlags::{item.method_name});
42    }
43{{ endfor }}
44
45{{ -if not library_exported }}
46    public boolean isFlagReadOnlyOptimized(String flagName) \{
47        if (mReadOnlyFlagsSet.contains(flagName) &&
48            isOptimizationEnabled()) \{
49                return true;
50        }
51        return false;
52    }
53
54    @com.android.aconfig.annotations.AssumeTrueForR8
55    private boolean isOptimizationEnabled() \{
56        return false;
57    }
58{{ -endif }}
59
60    protected boolean getValue(String flagName, Predicate<FeatureFlags> getter) \{
61        return mGetValueImpl.test(flagName, getter);
62    }
63
64    public List<String> getFlagNames() \{
65        return Arrays.asList(
66            {{ -for item in flag_elements }}
67            Flags.FLAG_{item.flag_name_constant_suffix}
68            {{ -if not @last }},{{ endif }}
69            {{ -endfor }}
70        );
71    }
72
73    private Set<String> mReadOnlyFlagsSet = new HashSet<>(
74        Arrays.asList(
75            {{ -for item in flag_elements }}
76            {{ -if not item.is_read_write }}
77            Flags.FLAG_{item.flag_name_constant_suffix},
78            {{ -endif }}
79            {{ -endfor }}
80            ""{# The empty string here is to resolve the ending comma #}
81        )
82    );
83
84{{ -if library_exported }}
85    private Map<String, Integer> mFinalizedFlags = new HashMap<>(
86        Map.ofEntries(
87            {{ -for item in flag_elements }}
88            {{ -if item.finalized_sdk_present }}
89            Map.entry(Flags.FLAG_{item.flag_name_constant_suffix}, {item.finalized_sdk_value}),
90            {{ -endif }}
91            {{ -endfor }}
92            Map.entry("", Integer.MAX_VALUE){# The empty entry to avoid empty entries #}
93        )
94    );
95
96    public boolean isFlagFinalized(String flagName) \{
97        if (!mFinalizedFlags.containsKey(flagName)) \{
98            return false;
99        }
100        return Build.VERSION.SDK_INT >= mFinalizedFlags.get(flagName);
101    }
102{{ -endif }}
103}
104