Dont parse resource values behind disabled flags

This change makes it so that when we are parsing resources and there is
one behind a disabled flag we don't parse the value. This is primarily
to prevent disabled strings from ending up in the string pool.

Test: automated
Bug: 329436914
Flag: EXEMPT Aconfig not supported on host tools
Change-Id: I4d8683ac820a3fd20cd92c223464f912b0ac422d
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 2df9418..45bf8e3 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -690,7 +690,9 @@
         resource_format = item_iter->second.format;
       }
 
-      if (!ParseItem(parser, out_resource, resource_format)) {
+      // Don't bother parsing the item if it is behind a disabled flag
+      if (out_resource->flag_status != FlagStatus::Disabled &&
+          !ParseItem(parser, out_resource, resource_format)) {
         return false;
       }
       return true;
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index b59b165..2e6ad13 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -69,8 +69,13 @@
     return TestParse(str, ConfigDescription{});
   }
 
-  ::testing::AssertionResult TestParse(StringPiece str, const ConfigDescription& config) {
-    ResourceParserOptions parserOptions;
+  ::testing::AssertionResult TestParse(StringPiece str, ResourceParserOptions parserOptions) {
+    return TestParse(str, ConfigDescription{}, parserOptions);
+  }
+
+  ::testing::AssertionResult TestParse(
+      StringPiece str, const ConfigDescription& config,
+      ResourceParserOptions parserOptions = ResourceParserOptions()) {
     ResourceParser parser(context_->GetDiagnostics(), &table_, android::Source{"test"}, config,
                           parserOptions);
 
@@ -242,6 +247,19 @@
   EXPECT_FALSE(TestParse(R"(<string name="foo4" translatable="yes">Translate</string>)"));
 }
 
+TEST_F(ResourceParserTest, ParseStringBehindDisabledFlag) {
+  FeatureFlagProperties flag_properties(true, false);
+  ResourceParserOptions options;
+  options.feature_flag_values = {{"falseFlag", flag_properties}};
+  ASSERT_TRUE(TestParse(
+      R"(<string name="foo" android:featureFlag="falseFlag"
+              xmlns:android="http://schemas.android.com/apk/res/android">foo</string>)",
+      options));
+
+  String* str = test::GetValue<String>(&table_, "string/foo");
+  ASSERT_THAT(str, IsNull());
+}
+
 TEST_F(ResourceParserTest, IgnoreXliffTagsOtherThanG) {
   std::string input = R"(
       <string name="foo" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">