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