AAPT2: Allow empty group definitions
With ABI, screen density, and locale, it is possible to use a shorthand notation when the group only has a single entry. The shorthand is to leave the group empty and use a valid configuration for the group name. Test: manually ran optimize command Test: unit tests Change-Id: If2d091e587474847c6c9e9be1a29196b261cc82d
This commit is contained in:
@@ -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: "
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user