From 939df096be11d242c8f3473954c7c10c371cf142 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 9 Apr 2019 17:13:50 -0700 Subject: Add odm and oem policies This change adds parsing, encoding, and validating of odm and oem overlayable policies to aapt2, libandroidfw, and idmap2. Bug: 121033532 Test: aapt2_tests, idmap2_tests Change-Id: Ifc0d4b6c9f9c37e06b2988abade69dbb277c50c2 --- tools/aapt2/ResourceParser.cpp | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'tools/aapt2/ResourceParser.cpp') diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index 5e8d870488c4..fe401e22c50e 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -1143,34 +1143,38 @@ bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource } else if (Maybe maybe_type = xml::FindNonEmptyAttribute(parser, "type")) { // Parse the polices separated by vertical bar characters to allow for specifying multiple // policies. Items within the policy tag will have the specified policy. - for (StringPiece part : util::Tokenize(maybe_type.value(), '|')) { + static const auto kPolicyMap = + ImmutableMap::CreatePreSorted({ + {"odm", OverlayableItem::Policy::kOdm}, + {"oem", OverlayableItem::Policy::kOem}, + {"product", OverlayableItem::Policy::kProduct}, + {"public", OverlayableItem::Policy::kPublic}, + {"signature", OverlayableItem::Policy::kSignature}, + {"system", OverlayableItem::Policy::kSystem}, + {"vendor", OverlayableItem::Policy::kVendor}, + }); + + for (const StringPiece& part : util::Tokenize(maybe_type.value(), '|')) { StringPiece trimmed_part = util::TrimWhitespace(part); - if (trimmed_part == "public") { - current_policies |= OverlayableItem::Policy::kPublic; - } else if (trimmed_part == "product") { - current_policies |= OverlayableItem::Policy::kProduct; - } else if (trimmed_part == "system") { - current_policies |= OverlayableItem::Policy::kSystem; - } else if (trimmed_part == "vendor") { - current_policies |= OverlayableItem::Policy::kVendor; - } else if (trimmed_part == "signature") { - current_policies |= OverlayableItem::Policy::kSignature; - } else { + const auto policy = kPolicyMap.find(trimmed_part); + if (policy == kPolicyMap.end()) { diag_->Error(DiagMessage(element_source) << " has unsupported type '" << trimmed_part << "'"); error = true; continue; } + + current_policies |= policy->second; } } else { diag_->Error(DiagMessage(element_source) - << " must have a 'type' attribute"); + << " must have a 'type' attribute"); error = true; continue; } } else if (!ShouldIgnoreElement(element_namespace, element_name)) { diag_->Error(DiagMessage(element_source) << "invalid element <" << element_name << "> " - << " in "); + << " in "); error = true; break; } -- cgit v1.2.3-59-g8ed1b