Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa10505c authored by Adam Lesinski's avatar Adam Lesinski
Browse files

AAPT2: Accept aliases defined for external resource types

Resource types that are typically stored outside of the resource table
(like layout, xml, drawable) can only have aliases (reference to another
resource).

Change-Id: Idb768801f02bb142e5be5e438904f221499bd756
parent 83f2255f
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -345,10 +345,23 @@ bool ResourceParser::parseResources(XmlPullParser* parser) {
            result = parseSymbol(parser, &parsedResource);
        } else if (elementName == u"public-group") {
            result = parsePublicGroup(parser, &parsedResource);
        } else {
            // Try parsing the elementName (or type) as a resource. These shall only be
            // resources like 'layout' or 'xml' and they can only be references.
            if (const ResourceType* type = parseResourceType(elementName)) {
                parsedResource.name.type = *type;
                parsedResource.value = parseXml(parser, android::ResTable_map::TYPE_REFERENCE,
                                                false);
                if (!parsedResource.value) {
                    mDiag->error(DiagMessage(parsedResource.source) << "invalid value for type '"
                                 << *type << "'. Expected a reference");
                    result = false;
                }
            } else {
                mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber()))
                            << "unknown resource type '" << elementName << "'");
            }
        }

        if (result) {
            // We successfully parsed the resource.
+8 −0
Original line number Diff line number Diff line
@@ -521,4 +521,12 @@ TEST_F(ResourceParserTest, AutoIncrementIdsInPublicGroup) {
    EXPECT_EQ(ResourceId(0x01010041), actualId);
}

TEST_F(ResourceParserTest, ExternalTypesShouldOnlyBeReferences) {
    std::string input = R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF";
    ASSERT_TRUE(testParse(input));

    input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF";
    ASSERT_FALSE(testParse(input));
}

} // namespace aapt