Merge "aconfig: update error message in modify_parsed_flags_based_on_mode" into main
diff --git a/tools/aconfig/Android.bp b/tools/aconfig/Android.bp
index 0e3c37c..37be2dd 100644
--- a/tools/aconfig/Android.bp
+++ b/tools/aconfig/Android.bp
@@ -44,7 +44,6 @@
     protos: ["protos/aconfig.proto"],
     crate_name: "aconfig_protos",
     source_stem: "aconfig_protos",
-    use_protobuf3: true,
     host_supported: true,
 }
 
diff --git a/tools/aconfig/TEST_MAPPING b/tools/aconfig/TEST_MAPPING
index e29918f..de8d932 100644
--- a/tools/aconfig/TEST_MAPPING
+++ b/tools/aconfig/TEST_MAPPING
@@ -24,6 +24,10 @@
       "name": "aconfig.test"
     },
     {
+      // aconfig Java integration tests (host)
+      "name": "AconfigJavaHostTest"
+    },
+    {
       // aconfig Java integration tests
       "name": "aconfig.test.java"
     },
@@ -36,14 +40,22 @@
       "name": "aconfig.test.cpp.test_mode"
     },
     {
-      // aconfig C++ integration tests (production mode auto-generated code)
+      // aconfig C++ integration tests (exported mode auto-generated code)
+      "name": "aconfig.test.cpp.exported_mode"
+    },
+    {
+      // aconfig Rust integration tests (production mode auto-generated code)
       "name": "aconfig.prod_mode.test.rust"
     },
     {
-      // aconfig C++ integration tests (test mode auto-generated code)
+      // aconfig Rust integration tests (test mode auto-generated code)
       "name": "aconfig.test_mode.test.rust"
     },
     {
+      // aconfig Rust integration tests (exported mode auto-generated code)
+      "name": "aconfig.exported_mode.test.rust"
+    },
+    {
       // printflags unit tests
       "name": "printflags.test"
     }
diff --git a/tools/aconfig/templates/FeatureFlags.java.template b/tools/aconfig/templates/FeatureFlags.java.template
index d6af62c..5e67b13 100644
--- a/tools/aconfig/templates/FeatureFlags.java.template
+++ b/tools/aconfig/templates/FeatureFlags.java.template
@@ -5,10 +5,10 @@
 /** @hide */
 public interface FeatureFlags \{
 {{ for item in flag_elements }}
-{{ if library_exported }}
+{{ -if library_exported }}
     @UnsupportedAppUsage
     boolean {item.method_name}();
-{{ else }}
+{{ -else }}
 {{ -if not item.is_read_write }}
 {{ -if item.default_value }}
     @com.android.aconfig.annotations.AssumeTrueForR8
@@ -19,5 +19,5 @@
     @UnsupportedAppUsage
     boolean {item.method_name}();
 {{ endif }}
-{{ endfor }}
+{{ -endfor }}
 }
diff --git a/tools/aconfig/templates/FeatureFlagsImpl.java.template b/tools/aconfig/templates/FeatureFlagsImpl.java.template
index cf49c17..28baa41 100644
--- a/tools/aconfig/templates/FeatureFlagsImpl.java.template
+++ b/tools/aconfig/templates/FeatureFlagsImpl.java.template
@@ -1,44 +1,42 @@
 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 runtime_lookup_required- }}
+{{ -if not is_test_mode }}
+{{ -if runtime_lookup_required }}
 import android.provider.DeviceConfig;
 import android.provider.DeviceConfig.Properties;
 {{ endif }}
 /** @hide */
 public final class FeatureFlagsImpl implements FeatureFlags \{
-{{- if runtime_lookup_required }}
-{{- for namespace_with_flags in namespace_flags }}
+{{ -if runtime_lookup_required }}
+{{ -for namespace_with_flags in namespace_flags }}
     private static boolean {namespace_with_flags.namespace}_is_cached = false;
-{{- endfor- }}
+{{ -endfor- }}
 
 {{ for flag in flag_elements }}
-{{ if library_exported }}
+{{ -if library_exported }}
     private static boolean {flag.method_name} = false;
-{{ else }}
+{{ -else }}
 {{- if flag.is_read_write }}
     private static boolean {flag.method_name} = {flag.default_value};
 {{- endif- }}
-{{ endif }}
-{{ endfor }}
-
+{{ -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 }}
+{{ -for flag in namespace_with_flags.flags }}
+{{ -if library_exported }}
             {flag.method_name} =
                 properties.getBoolean("{flag.device_config_flag}", false);
-            {{ else }}
-            {{ if flag.is_read_write }}
+{{ -else }}
+{{ -if flag.is_read_write }}
             {flag.method_name} =
                 properties.getBoolean("{flag.device_config_flag}", {flag.default_value});
-            {{ endif }}
-            {{ endif }}
-            {{ endfor }}
+{{ -endif }}
+{{ -endif }}
+{{ -endfor }}
         } catch (NullPointerException e) \{
             throw new RuntimeException(
                 "Cannot read value from namespace {namespace_with_flags.namespace} "
@@ -52,27 +50,26 @@
         {namespace_with_flags.namespace}_is_cached = true;
     }
 {{ endfor- }}
-{{ endif- }}
-
-{{ for flag in flag_elements }}
+{{ -endif }}{#- end of runtime_lookup_required #}
+{{ -for flag in flag_elements }}
     @Override
     @UnsupportedAppUsage
     public boolean {flag.method_name}() \{
-    {{ -if library_exported }}
+{{ -if library_exported }}
         if (!{flag.device_config_namespace}_is_cached) \{
             load_overrides_{flag.device_config_namespace}();
         }
         return {flag.method_name};
-    {{ else }}
-    {{ -if flag.is_read_write }}
+{{ -else }}
+{{ -if flag.is_read_write }}
         if (!{flag.device_config_namespace}_is_cached) \{
             load_overrides_{flag.device_config_namespace}();
         }
         return {flag.method_name};
-    {{ else }}
+{{ -else }}
         return {flag.default_value};
-    {{ -endif- }}
-    {{ -endif }}
+{{ -endif- }}
+{{ -endif }}
     }
 {{ endfor }}
 }
diff --git a/tools/aconfig/templates/Flags.java.template b/tools/aconfig/templates/Flags.java.template
index ff942e5..34b8189 100644
--- a/tools/aconfig/templates/Flags.java.template
+++ b/tools/aconfig/templates/Flags.java.template
@@ -5,12 +5,12 @@
 
 /** @hide */
 public final class Flags \{
-{{- for item in flag_elements}}
+{{ -for item in flag_elements}}
     /** @hide */
     public static final String FLAG_{item.flag_name_constant_suffix} = "{item.device_config_flag}";
 {{- endfor }}
-{{ for item in flag_elements}}
-{{ -if library_exported }}
+{{ -for item in flag_elements}}
+{{ if library_exported }}
     @UnsupportedAppUsage
     public static boolean {item.method_name}() \{
         return FEATURE_FLAGS.{item.method_name}();
@@ -21,14 +21,14 @@
     @com.android.aconfig.annotations.AssumeTrueForR8
 {{ -else }}
     @com.android.aconfig.annotations.AssumeFalseForR8
-{{ -endif- }}
-{{ endif }}
+{{ -endif }}
+{{ -endif }}
     @UnsupportedAppUsage
     public static boolean {item.method_name}() \{
         return FEATURE_FLAGS.{item.method_name}();
     }
-{{ endif }}
-{{ endfor }}
+{{ -endif }}
+{{ -endfor }}
 {{ -if is_test_mode }}
     public static void setFeatureFlags(FeatureFlags featureFlags) \{
         Flags.FEATURE_FLAGS = featureFlags;
@@ -37,7 +37,8 @@
     public static void unsetFeatureFlags() \{
         Flags.FEATURE_FLAGS = null;
     }
-{{ endif }}
+{{ -endif }}
+
     private static FeatureFlags FEATURE_FLAGS{{ -if not is_test_mode }} = new FeatureFlagsImpl(){{ -endif- }};
 
 }
diff --git a/tools/aconfig/templates/cpp_exported_header.template b/tools/aconfig/templates/cpp_exported_header.template
index 8db9ec4..6b6daa7 100644
--- a/tools/aconfig/templates/cpp_exported_header.template
+++ b/tools/aconfig/templates/cpp_exported_header.template
@@ -6,13 +6,11 @@
 #define {package_macro}(FLAG) {package_macro}_##FLAG
 #endif
 {{ for item in class_elements }}
-
-{{ if item.is_fixed_read_only- }}
+{{ -if item.is_fixed_read_only }}
 #ifndef {package_macro}_{item.flag_macro}
 #define {package_macro}_{item.flag_macro} {item.default_value}
 #endif
 {{ -endif }}
-
 {{ -endfor }}
 {{ -endif }}
 {{ -endif }}
@@ -26,15 +24,15 @@
 class flag_provider_interface \{
 public:
     virtual ~flag_provider_interface() = default;
-    {{ for item in class_elements}}
+    {{ -for item in class_elements}}
     virtual bool {item.flag_name}() = 0;
 
-    {{ if is_test_mode }}
+    {{ -if is_test_mode }}
     virtual void {item.flag_name}(bool val) = 0;
     {{ -endif }}
     {{ -endfor }}
 
-    {{ if is_test_mode }}
+    {{ -if is_test_mode }}
     virtual void reset_flags() \{}
     {{ -endif }}
 };
@@ -43,35 +41,35 @@
 
 {{ for item in class_elements}}
 inline bool {item.flag_name}() \{
-    {{ if is_test_mode }}
+    {{ -if is_test_mode }}
     return provider_->{item.flag_name}();
-    {{ -else- }}
-    {{ if is_prod_mode- }}
-    {{ if item.readwrite- }}
+    {{ -else }}
+    {{ -if is_prod_mode }}
+    {{ -if item.readwrite }}
     return provider_->{item.flag_name}();
-    {{ -else- }}
-    {{ if item.is_fixed_read_only- }}
+    {{ -else }}
+    {{ -if item.is_fixed_read_only }}
     return {package_macro}_{item.flag_macro};
-    {{ -else- }}
+    {{ -else }}
     return {item.default_value};
     {{ -endif }}
     {{ -endif }}
-    {{ -else- }}
-    {{ if is_exported_mode- }}
+    {{ -else }}
+    {{ -if is_exported_mode }}
     return provider_->{item.flag_name}();
     {{ -endif }}
     {{ -endif }}
     {{ -endif }}
 }
 
-{{ if is_test_mode }}
+{{ -if is_test_mode }}
 inline void {item.flag_name}(bool val) \{
     provider_->{item.flag_name}(val);
 }
 {{ -endif }}
 {{ -endfor }}
 
-{{ if is_test_mode }}
+{{ -if is_test_mode }}
 inline void reset_flags() \{
     return provider_->reset_flags();
 }
@@ -85,12 +83,12 @@
 {{ for item in class_elements }}
 bool {header}_{item.flag_name}();
 
-{{ if is_test_mode }}
+{{ -if is_test_mode }}
 void set_{header}_{item.flag_name}(bool val);
 {{ -endif }}
 {{ -endfor }}
 
-{{ if is_test_mode }}
+{{ -if is_test_mode }}
 void {header}_reset_flags();
 {{ -endif }}
 
diff --git a/tools/aconfig/templates/cpp_source_file.template b/tools/aconfig/templates/cpp_source_file.template
index a10d7cb..4aec540 100644
--- a/tools/aconfig/templates/cpp_source_file.template
+++ b/tools/aconfig/templates/cpp_source_file.template
@@ -24,7 +24,7 @@
             : overrides_()
         \{}
 
-        {{ for item in class_elements }}
+{{ for item in class_elements }}
         virtual bool {item.flag_name}() override \{
             auto it = overrides_.find("{item.flag_name}");
               if (it != overrides_.end()) \{
@@ -35,7 +35,7 @@
                   "aconfig_flags.{item.device_config_namespace}",
                   "{item.device_config_flag}",
                   "{item.default_value}") == "true";
-              {{ -else- }}
+              {{ -else }}
                   return {item.default_value};
               {{ -endif }}
             }
@@ -44,7 +44,7 @@
         virtual void {item.flag_name}(bool val) override \{
             overrides_["{item.flag_name}"] = val;
         }
-        {{ -endfor }}
+{{ endfor }}
 
         virtual void reset_flags() override \{
             overrides_.clear();
@@ -56,10 +56,11 @@
     class flag_provider : public flag_provider_interface \{
     public:
 
-        {{ for item in class_elements }}
+        {{ -for item in class_elements }}
+
         virtual bool {item.flag_name}() override \{
-            {{ if is_prod_mode- }}
-            {{ if item.readwrite- }}
+            {{ -if is_prod_mode }}
+            {{ -if item.readwrite }}
             if (cache_[{item.readwrite_idx}] == -1) \{
                 cache_[{item.readwrite_idx}] = server_configurable_flags::GetServerConfigurableFlag(
                     "aconfig_flags.{item.device_config_namespace}",
@@ -67,15 +68,15 @@
                     "{item.default_value}") == "true";
             }
             return cache_[{item.readwrite_idx}];
-            {{ -else- }}
-            {{ if item.is_fixed_read_only }}
+            {{ -else }}
+            {{ -if item.is_fixed_read_only }}
             return {package_macro}_{item.flag_macro};
-            {{ -else- }}
+            {{ -else }}
             return {item.default_value};
             {{ -endif }}
             {{ -endif }}
             {{ -else- }}
-            {{ if is_exported_mode-}}
+            {{ -if is_exported_mode }}
             if (cache_[{item.readwrite_idx}] == -1) \{
                 cache_[{item.readwrite_idx}] = server_configurable_flags::GetServerConfigurableFlag(
                     "aconfig_flags.{item.device_config_namespace}",
@@ -86,7 +87,7 @@
             {{ -endif }}
             {{ -endif }}
         }
-        {{ endfor }}
+        {{ -endfor }}
     {{ if readwrite- }}
     private:
         std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1);
@@ -102,35 +103,35 @@
 
 {{ for item in class_elements }}
 bool {header}_{item.flag_name}() \{
-    {{ if is_test_mode }}
+    {{ -if is_test_mode }}
     return {cpp_namespace}::{item.flag_name}();
-    {{ -else- }}
-    {{ if is_prod_mode- }}
-    {{ if item.readwrite- }}
+    {{ -else }}
+    {{ -if is_prod_mode }}
+    {{ -if item.readwrite }}
     return {cpp_namespace}::{item.flag_name}();
-    {{ -else- }}
-    {{ if item.is_fixed_read_only }}
+    {{ -else }}
+    {{ -if item.is_fixed_read_only }}
     return {package_macro}_{item.flag_macro};
-    {{ -else- }}
+    {{ -else }}
     return {item.default_value};
     {{ -endif }}
     {{ -endif }}
-    {{ -else- }}
-    {{ if is_exported_mode- }}
+    {{ -else }}
+    {{ -if is_exported_mode }}
     return {cpp_namespace}::{item.flag_name}();
     {{ -endif }}
     {{ -endif }}
     {{ -endif }}
 }
 
-{{ if is_test_mode }}
+{{ -if is_test_mode }}
 void set_{header}_{item.flag_name}(bool val) \{
     {cpp_namespace}::{item.flag_name}(val);
 }
 {{ -endif }}
-{{ endfor-}}
+{{ endfor }}
 
-{{ if is_test_mode }}
+{{ -if is_test_mode }}
 void {header}_reset_flags() \{
      {cpp_namespace}::reset_flags();
 }
diff --git a/tools/aconfig/templates/rust_exported.template b/tools/aconfig/templates/rust_exported.template
index b31bcef..110f2d4 100644
--- a/tools/aconfig/templates/rust_exported.template
+++ b/tools/aconfig/templates/rust_exported.template
@@ -4,23 +4,22 @@
 pub struct FlagProvider;
 
 lazy_static::lazy_static! \{
-    {{ for flag in template_flags }}
+{{ for flag in template_flags }}
     /// flag value cache for {flag.name}
     static ref CACHED_{flag.name}: bool = flags_rust::GetServerConfigurableFlag(
         "aconfig_flags.{flag.device_config_namespace}",
         "{flag.device_config_flag}",
         "false") == "true";
-    {{ endfor }}
+{{ endfor }}
 }
 
 impl FlagProvider \{
-
-    {{ for flag in template_flags }}
+{{ for flag in template_flags }}
     /// query flag {flag.name}
     pub fn {flag.name}(&self) -> bool \{
         *CACHED_{flag.name}
     }
-    {{ endfor }}
+{{ endfor }}
 
 }
 
diff --git a/tools/aconfig/templates/rust_prod.template b/tools/aconfig/templates/rust_prod.template
index 30ea646..f9a2829 100644
--- a/tools/aconfig/templates/rust_prod.template
+++ b/tools/aconfig/templates/rust_prod.template
@@ -3,32 +3,32 @@
 /// flag provider
 pub struct FlagProvider;
 
-{{ if has_readwrite - }}
+{{ if has_readwrite- }}
 lazy_static::lazy_static! \{
-    {{ for flag in template_flags }}
-    {{ if flag.readwrite -}}
+{{ -for flag in template_flags }}
+    {{ -if flag.readwrite }}
     /// flag value cache for {flag.name}
     static ref CACHED_{flag.name}: bool = flags_rust::GetServerConfigurableFlag(
         "aconfig_flags.{flag.device_config_namespace}",
         "{flag.device_config_flag}",
         "{flag.default_value}") == "true";
     {{ -endif }}
-    {{ endfor }}
+{{ -endfor }}
 }
 {{ -endif }}
 
 impl FlagProvider \{
 
-    {{ for flag in template_flags }}
+{{ for flag in template_flags }}
     /// query flag {flag.name}
     pub fn {flag.name}(&self) -> bool \{
-    {{ if flag.readwrite -}}
+    {{ -if flag.readwrite }}
         *CACHED_{flag.name}
-    {{ -else- }}
+    {{ -else }}
         {flag.default_value}
     {{ -endif }}
     }
-    {{ endfor }}
+{{ endfor }}
 
 }
 
@@ -38,10 +38,10 @@
 {{ for flag in template_flags }}
 /// query flag {flag.name}
 #[inline(always)]
-{{ if flag.readwrite -}}
+{{ -if flag.readwrite }}
 pub fn {flag.name}() -> bool \{
     PROVIDER.{flag.name}()
-{{ -else- }}
+{{ -else }}
 pub fn {flag.name}() -> bool \{
     {flag.default_value}
 {{ -endif }}
diff --git a/tools/aconfig/templates/rust_test.template b/tools/aconfig/templates/rust_test.template
index fd1229b..d01f40a 100644
--- a/tools/aconfig/templates/rust_test.template
+++ b/tools/aconfig/templates/rust_test.template
@@ -9,7 +9,7 @@
 }
 
 impl FlagProvider \{
-    {{ for flag in template_flags }}
+{{ for flag in template_flags }}
     /// query flag {flag.name}
     pub fn {flag.name}(&self) -> bool \{
         self.overrides.get("{flag.name}").copied().unwrap_or(
@@ -28,7 +28,7 @@
     pub fn set_{flag.name}(&mut self, val: bool) \{
         self.overrides.insert("{flag.name}", val);
     }
-    {{ endfor }}
+{{ endfor }}
 
     /// clear all flag overrides
     pub fn reset_flags(&mut self) \{