summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorEric Fischer <enf@google.com>2011-09-27 16:09:41 -0700
committerEric Fischer <enf@google.com>2011-09-27 16:09:41 -0700
commit914f7e683a01f15f8830810c49eaecc31bc554a6 (patch)
tree702278393601f3f27b0ec0213246c8ea3bf70d09 /tools
parent006e6ef2e6349f5b3f9ef27c81750f007f56c69a (diff)
downloadframeworks_base-914f7e683a01f15f8830810c49eaecc31bc554a6.zip
frameworks_base-914f7e683a01f15f8830810c49eaecc31bc554a6.tar.gz
frameworks_base-914f7e683a01f15f8830810c49eaecc31bc554a6.tar.bz2
Don't lose product variant strings that also vary between locales.
Localized strings with product variants were not being included in the APK, apparently because the check to ensure that a different variation of the string had not already been included in the APK was matching the version of it from the default, untranslated configuration. Now check to make sure that the string not only exists but also exists in the correct configuration. Bug 5372711 Change-Id: I52975570b75e0f11827dc6bcf1cb4a987d0541aa
Diffstat (limited to 'tools')
-rw-r--r--tools/aapt/ResourceTable.cpp33
-rw-r--r--tools/aapt/ResourceTable.h5
2 files changed, 37 insertions, 1 deletions
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 81b924a..99f74c6 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -695,7 +695,7 @@ status_t parseAndAddEntry(Bundle* bundle,
if (isInProductList(product, String16(bundleProduct))) {
;
} else if (strcmp16(String16("default").string(), product.string()) == 0 &&
- !outTable->hasBagOrEntry(myPackage, curType, ident)) {
+ !outTable->hasBagOrEntry(myPackage, curType, ident, config)) {
;
} else {
return NO_ERROR;
@@ -1823,6 +1823,37 @@ bool ResourceTable::hasBagOrEntry(const String16& package,
return false;
}
+bool ResourceTable::hasBagOrEntry(const String16& package,
+ const String16& type,
+ const String16& name,
+ const ResTable_config& config) const
+{
+ // First look for this in the included resources...
+ uint32_t rid = mAssets->getIncludedResources()
+ .identifierForName(name.string(), name.size(),
+ type.string(), type.size(),
+ package.string(), package.size());
+ if (rid != 0) {
+ return true;
+ }
+
+ sp<Package> p = mPackages.valueFor(package);
+ if (p != NULL) {
+ sp<Type> t = p->getTypes().valueFor(type);
+ if (t != NULL) {
+ sp<ConfigList> c = t->getConfigs().valueFor(name);
+ if (c != NULL) {
+ sp<Entry> e = c->getEntries().valueFor(config);
+ if (e != NULL) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
bool ResourceTable::hasBagOrEntry(const String16& ref,
const String16* defType,
const String16* defPackage)
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
index 734c541..80f2192 100644
--- a/tools/aapt/ResourceTable.h
+++ b/tools/aapt/ResourceTable.h
@@ -124,6 +124,11 @@ public:
const String16& type,
const String16& name) const;
+ bool hasBagOrEntry(const String16& package,
+ const String16& type,
+ const String16& name,
+ const ResTable_config& config) const;
+
bool hasBagOrEntry(const String16& ref,
const String16* defType = NULL,
const String16* defPackage = NULL);