summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2014-10-10 00:30:39 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-10-10 00:30:39 +0000
commitbe003a357026a54c9fd0ae65cdc909f9b0cbc384 (patch)
tree8faca3fdd58ef62a335886d2061109ce2eddba5a /libs
parentd190a5ca4c0501f01d2eb5a0359bd987cb703b0c (diff)
parentf23e3ea629f29060f34ea10a0d89c6ec22766789 (diff)
downloadframeworks_base-be003a357026a54c9fd0ae65cdc909f9b0cbc384.zip
frameworks_base-be003a357026a54c9fd0ae65cdc909f9b0cbc384.tar.gz
frameworks_base-be003a357026a54c9fd0ae65cdc909f9b0cbc384.tar.bz2
am f23e3ea6: am aeef612f: Merge "Search all packages for a given type string when looking up resources by name" into lmp-dev
* commit 'f23e3ea629f29060f34ea10a0d89c6ec22766789': Search all packages for a given type string when looking up resources by name
Diffstat (limited to 'libs')
-rw-r--r--libs/androidfw/ResourceTypes.cpp88
-rw-r--r--libs/androidfw/tests/Split_test.cpp15
2 files changed, 60 insertions, 43 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 8cef137..b5d2885 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -4175,57 +4175,61 @@ nope:
continue;
}
- const ssize_t ti = group->findType16(type, typeLen);
- if (ti < 0) {
- TABLE_NOISY(printf("Type not found in package %s\n", String8(group->name).string()));
- continue;
- }
+ const size_t packageCount = group->packages.size();
+ for (size_t pi = 0; pi < packageCount; pi++) {
+ ssize_t ti = group->packages[pi]->typeStrings.indexOfString(type, typeLen);
+ if (ti < 0) {
+ continue;
+ }
- const TypeList& typeList = group->types[ti];
- if (typeList.isEmpty()) {
- TABLE_NOISY(printf("Expected type structure not found in package %s for index %d\n",
- String8(group->name).string(), ti));
- continue;
- }
+ ti += group->packages[pi]->typeIdOffset;
- const size_t typeCount = typeList.size();
- for (size_t i = 0; i < typeCount; i++) {
- const Type* t = typeList[i];
- const ssize_t ei = t->package->keyStrings.indexOfString(name, nameLen);
- if (ei < 0) {
+ const TypeList& typeList = group->types[ti];
+ if (typeList.isEmpty()) {
+ TABLE_NOISY(printf("Expected type structure not found in package %s for index %d\n",
+ String8(group->name).string(), ti));
continue;
}
- const size_t configCount = t->configs.size();
- for (size_t j = 0; j < configCount; j++) {
- const TypeVariant tv(t->configs[j]);
- for (TypeVariant::iterator iter = tv.beginEntries();
- iter != tv.endEntries();
- iter++) {
- const ResTable_entry* entry = *iter;
- if (entry == NULL) {
- continue;
- }
+ const size_t typeCount = typeList.size();
+ for (size_t i = 0; i < typeCount; i++) {
+ const Type* t = typeList[i];
+ const ssize_t ei = t->package->keyStrings.indexOfString(name, nameLen);
+ if (ei < 0) {
+ continue;
+ }
- if (dtohl(entry->key.index) == (size_t) ei) {
- uint32_t resId = Res_MAKEID(group->id - 1, ti, iter.index());
- if (outTypeSpecFlags) {
- Entry result;
- if (getEntry(group, ti, iter.index(), NULL, &result) != NO_ERROR) {
- ALOGW("Failed to find spec flags for %s:%s/%s (0x%08x)",
- String8(group->name).string(),
- String8(String16(type, typeLen)).string(),
- String8(String16(name, nameLen)).string(),
- resId);
- return 0;
- }
- *outTypeSpecFlags = result.specFlags;
+ const size_t configCount = t->configs.size();
+ for (size_t j = 0; j < configCount; j++) {
+ const TypeVariant tv(t->configs[j]);
+ for (TypeVariant::iterator iter = tv.beginEntries();
+ iter != tv.endEntries();
+ iter++) {
+ const ResTable_entry* entry = *iter;
+ if (entry == NULL) {
+ continue;
+ }
+
+ if (dtohl(entry->key.index) == (size_t) ei) {
+ uint32_t resId = Res_MAKEID(group->id - 1, ti, iter.index());
+ if (outTypeSpecFlags) {
+ Entry result;
+ if (getEntry(group, ti, iter.index(), NULL, &result) != NO_ERROR) {
+ ALOGW("Failed to find spec flags for %s:%s/%s (0x%08x)",
+ String8(group->name).string(),
+ String8(String16(type, typeLen)).string(),
+ String8(String16(name, nameLen)).string(),
+ resId);
+ return 0;
+ }
+ *outTypeSpecFlags = result.specFlags;
- if (fakePublic) {
- *outTypeSpecFlags |= ResTable_typeSpec::SPEC_PUBLIC;
+ if (fakePublic) {
+ *outTypeSpecFlags |= ResTable_typeSpec::SPEC_PUBLIC;
+ }
}
+ return resId;
}
- return resId;
}
}
}
diff --git a/libs/androidfw/tests/Split_test.cpp b/libs/androidfw/tests/Split_test.cpp
index 82703f9..f63f566 100644
--- a/libs/androidfw/tests/Split_test.cpp
+++ b/libs/androidfw/tests/Split_test.cpp
@@ -179,7 +179,7 @@ TEST(SplitFeatureTest, TestNewResourceIsAccessible) {
EXPECT_EQ(Res_value::TYPE_STRING, val.dataType);
}
-TEST(SplitFeatureTest, TestNewResourceIsAccessibleByName) {
+TEST(SplitFeatureTest, TestNewResourceNameHasCorrectName) {
ResTable table;
ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len));
@@ -200,4 +200,17 @@ TEST(SplitFeatureTest, TestNewResourceIsAccessibleByName) {
String16(name.name, name.nameLen));
}
+TEST(SplitFeatureTest, TestNewResourceIsAccessibleByName) {
+ ResTable table;
+ ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len));
+ ASSERT_EQ(NO_ERROR, table.add(feature_arsc, feature_arsc_len));
+
+ const String16 name("test3");
+ const String16 type("string");
+ const String16 package("com.android.test.basic");
+ ASSERT_EQ(base::R::string::test3, table.identifierForName(name.string(), name.size(),
+ type.string(), type.size(),
+ package.string(), package.size()));
+}
+
} // namespace