diff options
-rw-r--r-- | tools/aapt2/configuration/ConfigurationParser.cpp | 56 | ||||
-rw-r--r-- | tools/aapt2/configuration/ConfigurationParser_test.cpp | 84 |
2 files changed, 139 insertions, 1 deletions
diff --git a/tools/aapt2/configuration/ConfigurationParser.cpp b/tools/aapt2/configuration/ConfigurationParser.cpp index ebc523f096db..655268bc73f9 100644 --- a/tools/aapt2/configuration/ConfigurationParser.cpp +++ b/tools/aapt2/configuration/ConfigurationParser.cpp @@ -526,6 +526,16 @@ bool AbiGroupTagHandler(PostProcessingConfiguration* config, Element* root_eleme auto& group = config->abi_groups[label]; bool valid = true; + // Special case for empty abi-group tag. Label will be used as the ABI. + if (root_element->GetChildElements().empty()) { + auto abi = kStringToAbiMap.find(label); + if (abi == kStringToAbiMap.end()) { + return false; + } + group.push_back(abi->second); + return true; + } + for (auto* child : root_element->GetChildElements()) { if (child->name != "abi") { diag->Error(DiagMessage() << "Unexpected element in ABI group: " << child->name); @@ -534,7 +544,13 @@ bool AbiGroupTagHandler(PostProcessingConfiguration* config, Element* root_eleme for (auto& node : child->children) { xml::Text* t; if ((t = NodeCast<xml::Text>(node.get())) != nullptr) { - group.push_back(kStringToAbiMap.at(TrimWhitespace(t->text).to_string())); + auto abi = kStringToAbiMap.find(TrimWhitespace(t->text).to_string()); + if (abi != kStringToAbiMap.end()) { + group.push_back(abi->second); + } else { + diag->Error(DiagMessage() << "Could not parse ABI value: " << t->text); + valid = false; + } break; } } @@ -554,6 +570,25 @@ bool ScreenDensityGroupTagHandler(PostProcessingConfiguration* config, Element* auto& group = config->screen_density_groups[label]; bool valid = true; + // Special case for empty screen-density-group tag. Label will be used as the screen density. + if (root_element->GetChildElements().empty()) { + ConfigDescription config_descriptor; + bool parsed = ConfigDescription::Parse(label, &config_descriptor); + if (parsed && + (config_descriptor.CopyWithoutSdkVersion().diff(ConfigDescription::DefaultConfig()) == + android::ResTable_config::CONFIG_DENSITY)) { + // Copy the density with the minimum SDK version stripped out. + group.push_back(config_descriptor.CopyWithoutSdkVersion()); + } else { + diag->Error(DiagMessage() + << "Could not parse config descriptor for empty screen-density-group: " + << label); + valid = false; + } + + return valid; + } + for (auto* child : root_element->GetChildElements()) { if (child->name != "screen-density") { diag->Error(DiagMessage() << "Unexpected root_element in screen density group: " @@ -595,6 +630,25 @@ bool LocaleGroupTagHandler(PostProcessingConfiguration* config, Element* root_el auto& group = config->locale_groups[label]; bool valid = true; + // Special case to auto insert a locale for an empty group. Label will be used for locale. + if (root_element->GetChildElements().empty()) { + ConfigDescription config_descriptor; + bool parsed = ConfigDescription::Parse(label, &config_descriptor); + if (parsed && + (config_descriptor.CopyWithoutSdkVersion().diff(ConfigDescription::DefaultConfig()) == + android::ResTable_config::CONFIG_LOCALE)) { + // Copy the locale with the minimum SDK version stripped out. + group.push_back(config_descriptor.CopyWithoutSdkVersion()); + } else { + diag->Error(DiagMessage() + << "Could not parse config descriptor for empty screen-density-group: " + << label); + valid = false; + } + + return valid; + } + for (auto* child : root_element->GetChildElements()) { if (child->name != "locale") { diag->Error(DiagMessage() << "Unexpected root_element in screen density group: " diff --git a/tools/aapt2/configuration/ConfigurationParser_test.cpp b/tools/aapt2/configuration/ConfigurationParser_test.cpp index 3f356d78bbfe..da00511fd192 100644 --- a/tools/aapt2/configuration/ConfigurationParser_test.cpp +++ b/tools/aapt2/configuration/ConfigurationParser_test.cpp @@ -338,6 +338,32 @@ TEST_F(ConfigurationParserTest, AbiGroupAction) { ASSERT_THAT(out, ElementsAre(Abi::kArmV7a, Abi::kArm64V8a)); } +TEST_F(ConfigurationParserTest, AbiGroupAction_EmptyGroup) { + static constexpr const char* xml = R"xml(<abi-group label="arm64-v8a"/>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_TRUE(ok); + + EXPECT_THAT(config.abi_groups, SizeIs(1ul)); + ASSERT_EQ(1u, config.abi_groups.count("arm64-v8a")); + + auto& out = config.abi_groups["arm64-v8a"]; + ASSERT_THAT(out, ElementsAre(Abi::kArm64V8a)); +} + +TEST_F(ConfigurationParserTest, AbiGroupAction_InvalidEmptyGroup) { + static constexpr const char* xml = R"xml(<abi-group label="arm"/>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_FALSE(ok); +} + TEST_F(ConfigurationParserTest, ScreenDensityGroupAction) { static constexpr const char* xml = R"xml( <screen-density-group label="large"> @@ -368,6 +394,35 @@ TEST_F(ConfigurationParserTest, ScreenDensityGroupAction) { ASSERT_THAT(out, ElementsAre(xhdpi, xxhdpi, xxxhdpi)); } +TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_EmtpyGroup) { + static constexpr const char* xml = R"xml(<screen-density-group label="xhdpi"/>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_TRUE(ok); + + EXPECT_THAT(config.screen_density_groups, SizeIs(1ul)); + ASSERT_EQ(1u, config.screen_density_groups.count("xhdpi")); + + ConfigDescription xhdpi; + xhdpi.density = ResTable_config::DENSITY_XHIGH; + + auto& out = config.screen_density_groups["xhdpi"]; + ASSERT_THAT(out, ElementsAre(xhdpi)); +} + +TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_InvalidEmtpyGroup) { + static constexpr const char* xml = R"xml(<screen-density-group label="really-big-screen"/>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_FALSE(ok); +} + TEST_F(ConfigurationParserTest, LocaleGroupAction) { static constexpr const char* xml = R"xml( <locale-group label="europe"> @@ -396,6 +451,35 @@ TEST_F(ConfigurationParserTest, LocaleGroupAction) { ASSERT_THAT(out, ElementsAre(en, es, fr, de)); } +TEST_F(ConfigurationParserTest, LocaleGroupAction_EmtpyGroup) { + static constexpr const char* xml = R"xml(<locale-group label="en"/>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_TRUE(ok); + + ASSERT_EQ(1ul, config.locale_groups.size()); + ASSERT_EQ(1u, config.locale_groups.count("en")); + + const auto& out = config.locale_groups["en"]; + + ConfigDescription en = test::ParseConfigOrDie("en"); + + ASSERT_THAT(out, ElementsAre(en)); +} + +TEST_F(ConfigurationParserTest, LocaleGroupAction_InvalidEmtpyGroup) { + static constexpr const char* xml = R"xml(<locale-group label="arm64"/>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_FALSE(ok); +} + TEST_F(ConfigurationParserTest, AndroidSdkGroupAction) { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> |