diff options
author | Adam Lesinski <adamlesinski@google.com> | 2014-10-10 00:30:39 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-10 00:30:39 +0000 |
commit | be003a357026a54c9fd0ae65cdc909f9b0cbc384 (patch) | |
tree | 8faca3fdd58ef62a335886d2061109ce2eddba5a /libs | |
parent | d190a5ca4c0501f01d2eb5a0359bd987cb703b0c (diff) | |
parent | f23e3ea629f29060f34ea10a0d89c6ec22766789 (diff) | |
download | frameworks_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.cpp | 88 | ||||
-rw-r--r-- | libs/androidfw/tests/Split_test.cpp | 15 |
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 |