summaryrefslogtreecommitdiff
path: root/tools/aapt2/SourceXmlPullParser.cpp
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2015-04-24 19:19:30 -0700
committerAdam Lesinski <adamlesinski@google.com>2015-05-04 16:43:24 -0700
commit24aad163bc88cb10d2275385e9afc3de7f342d65 (patch)
tree361fc0b3fbef5f68a16f357ae9d2bed5e93efbf5 /tools/aapt2/SourceXmlPullParser.cpp
parentab2581398c812917145088590bd18eb83f3a2ea6 (diff)
Add namespace handling in attribute values
Previously, you could only reference namespace prefixes in attribute names: <View xmlns:appcompat="http://schemas.android.com/apk/res/android.support.v7.appcompat" appcompat:name="hey" ... Now you can also reference them in resource names within an attribute value: ... android:text="@appcompat:string/confirm" ... Which will be treated as "@android.support.v7.appcompat:string/confirm". Change-Id: Ib076e867a990c80cf877a704eb77cd1ef0b23b52
Diffstat (limited to 'tools/aapt2/SourceXmlPullParser.cpp')
-rw-r--r--tools/aapt2/SourceXmlPullParser.cpp37
1 files changed, 36 insertions, 1 deletions
diff --git a/tools/aapt2/SourceXmlPullParser.cpp b/tools/aapt2/SourceXmlPullParser.cpp
index cb6a3c07d268..8099044f616d 100644
--- a/tools/aapt2/SourceXmlPullParser.cpp
+++ b/tools/aapt2/SourceXmlPullParser.cpp
@@ -17,6 +17,7 @@
#include <iostream>
#include <string>
+#include "Maybe.h"
#include "SourceXmlPullParser.h"
#include "Util.h"
@@ -66,7 +67,25 @@ SourceXmlPullParser::Event SourceXmlPullParser::next() {
}
}
- return getEvent();
+ Event event = getEvent();
+
+ // Record namespace prefixes and package names so that we can do our own
+ // handling of references that use namespace aliases.
+ if (event == Event::kStartNamespace || event == Event::kEndNamespace) {
+ Maybe<std::u16string> result = util::extractPackageFromNamespace(getNamespaceUri());
+ if (event == Event::kStartNamespace) {
+ if (result) {
+ mPackageAliases.emplace_back(getNamespacePrefix(), result.value());
+ }
+ } else {
+ if (result) {
+ assert(mPackageAliases.back().second == result.value());
+ mPackageAliases.pop_back();
+ }
+ }
+ }
+
+ return event;
}
SourceXmlPullParser::Event SourceXmlPullParser::getEvent() const {
@@ -112,6 +131,22 @@ const std::u16string& SourceXmlPullParser::getNamespaceUri() const {
return mEventQueue.front().data2;
}
+bool SourceXmlPullParser::applyPackageAlias(std::u16string* package,
+ const std::u16string& defaultPackage) const {
+ const auto endIter = mPackageAliases.rend();
+ for (auto iter = mPackageAliases.rbegin(); iter != endIter; ++iter) {
+ if (iter->first == *package) {
+ if (iter->second.empty()) {
+ *package = defaultPackage;
+ } else {
+ *package = iter->second;
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
const std::u16string& SourceXmlPullParser::getElementNamespace() const {
const Event currentEvent = getEvent();
if (currentEvent != Event::kStartElement && currentEvent != Event::kEndElement) {