Skip to content

Commit b71393b

Browse files
Xavier DucrohetAndroid (Google) Code Review
authored andcommitted
Merge "Fix aapt -G to properly support class attr in fragment." into jb-dev
2 parents b949d41 + 095cd2e commit b71393b

File tree

1 file changed

+31
-17
lines changed

1 file changed

+31
-17
lines changed

tools/aapt/Resource.cpp

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2210,7 +2210,7 @@ struct NamespaceAttributePair {
22102210

22112211
status_t
22122212
writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
2213-
const char* startTag, const KeyedVector<String8, NamespaceAttributePair>* tagAttrPairs)
2213+
const char* startTag, const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs)
22142214
{
22152215
status_t err;
22162216
ResXMLTree tree;
@@ -2254,17 +2254,21 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
22542254
} else if (tagAttrPairs != NULL) {
22552255
ssize_t tagIndex = tagAttrPairs->indexOfKey(tag);
22562256
if (tagIndex >= 0) {
2257-
const NamespaceAttributePair& nsAttr = tagAttrPairs->valueAt(tagIndex);
2258-
ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr);
2259-
if (attrIndex < 0) {
2260-
// fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
2261-
// layoutFile->getPrintableSource().string(), tree.getLineNumber(),
2262-
// tag.string(), nsAttr.ns, nsAttr.attr);
2263-
} else {
2264-
size_t len;
2265-
addProguardKeepRule(keep,
2266-
String8(tree.getAttributeStringValue(attrIndex, &len)), NULL,
2267-
layoutFile->getPrintableSource(), tree.getLineNumber());
2257+
const Vector<NamespaceAttributePair>& nsAttrVector = tagAttrPairs->valueAt(tagIndex);
2258+
for (size_t i = 0; i < nsAttrVector.size(); i++) {
2259+
const NamespaceAttributePair& nsAttr = nsAttrVector[i];
2260+
2261+
ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr);
2262+
if (attrIndex < 0) {
2263+
// fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
2264+
// layoutFile->getPrintableSource().string(), tree.getLineNumber(),
2265+
// tag.string(), nsAttr.ns, nsAttr.attr);
2266+
} else {
2267+
size_t len;
2268+
addProguardKeepRule(keep,
2269+
String8(tree.getAttributeStringValue(attrIndex, &len)), NULL,
2270+
layoutFile->getPrintableSource(), tree.getLineNumber());
2271+
}
22682272
}
22692273
}
22702274
}
@@ -2280,9 +2284,18 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
22802284
return NO_ERROR;
22812285
}
22822286

2283-
static void addTagAttrPair(KeyedVector<String8, NamespaceAttributePair>* dest,
2287+
static void addTagAttrPair(KeyedVector<String8, Vector<NamespaceAttributePair> >* dest,
22842288
const char* tag, const char* ns, const char* attr) {
2285-
dest->add(String8(tag), NamespaceAttributePair(ns, attr));
2289+
String8 tagStr(tag);
2290+
ssize_t index = dest->indexOfKey(tagStr);
2291+
2292+
if (index < 0) {
2293+
Vector<NamespaceAttributePair> vector;
2294+
vector.add(NamespaceAttributePair(ns, attr));
2295+
dest->add(tagStr, vector);
2296+
} else {
2297+
dest->editValueAt(index).add(NamespaceAttributePair(ns, attr));
2298+
}
22862299
}
22872300

22882301
status_t
@@ -2291,13 +2304,13 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
22912304
status_t err;
22922305

22932306
// tag:attribute pairs that should be checked in layout files.
2294-
KeyedVector<String8, NamespaceAttributePair> kLayoutTagAttrPairs;
2307+
KeyedVector<String8, Vector<NamespaceAttributePair> > kLayoutTagAttrPairs;
22952308
addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, "class");
22962309
addTagAttrPair(&kLayoutTagAttrPairs, "fragment", NULL, "class");
22972310
addTagAttrPair(&kLayoutTagAttrPairs, "fragment", RESOURCES_ANDROID_NAMESPACE, "name");
22982311

22992312
// tag:attribute pairs that should be checked in xml files.
2300-
KeyedVector<String8, NamespaceAttributePair> kXmlTagAttrPairs;
2313+
KeyedVector<String8, Vector<NamespaceAttributePair> > kXmlTagAttrPairs;
23012314
addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, "fragment");
23022315
addTagAttrPair(&kXmlTagAttrPairs, "header", RESOURCES_ANDROID_NAMESPACE, "fragment");
23032316

@@ -2307,7 +2320,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
23072320
const sp<AaptDir>& d = dirs.itemAt(k);
23082321
const String8& dirName = d->getLeaf();
23092322
const char* startTag = NULL;
2310-
const KeyedVector<String8, NamespaceAttributePair>* tagAttrPairs = NULL;
2323+
const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs = NULL;
23112324
if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) {
23122325
tagAttrPairs = &kLayoutTagAttrPairs;
23132326
} else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) {
@@ -2339,6 +2352,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
23392352
if (overlay.get()) {
23402353
return writeProguardForLayouts(keep, overlay);
23412354
}
2355+
23422356
return NO_ERROR;
23432357
}
23442358

0 commit comments

Comments
 (0)