summaryrefslogtreecommitdiffstats
path: root/libs/androidfw
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2014-11-17 12:17:16 -0800
committerAdam Lesinski <adamlesinski@google.com>2014-11-17 12:17:16 -0800
commit11bdd5b10b5f921b657283fa94463263171218d5 (patch)
treef439482e80559f310178bb050de770ca86fb0b23 /libs/androidfw
parenta9a3e24835b08828aa252bf079067a5f810a0792 (diff)
parent06d8b7b8d216cbfcd4cd987649672a5856ccd797 (diff)
downloadframeworks_base-11bdd5b10b5f921b657283fa94463263171218d5.zip
frameworks_base-11bdd5b10b5f921b657283fa94463263171218d5.tar.gz
frameworks_base-11bdd5b10b5f921b657283fa94463263171218d5.tar.bz2
Merge commit '06d8b7b8' into manualmerge
Conflicts: core/jni/android_util_AssetManager.cpp Change-Id: I77b72d0d3ec8184ccd97419e4c76b7d55b1a52ca
Diffstat (limited to 'libs/androidfw')
-rw-r--r--libs/androidfw/ResourceTypes.cpp10
-rw-r--r--libs/androidfw/tests/Android.mk1
-rw-r--r--libs/androidfw/tests/AttributeFinder_test.cpp111
3 files changed, 119 insertions, 3 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 39f175f..5d4e12f 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -1220,7 +1220,11 @@ uint32_t ResXMLParser::getAttributeNameResID(size_t idx) const
{
int32_t id = getAttributeNameID(idx);
if (id >= 0 && (size_t)id < mTree.mNumResIds) {
- return dtohl(mTree.mResIds[id]);
+ uint32_t resId = dtohl(mTree.mResIds[id]);
+ if (mTree.mDynamicRefTable != NULL) {
+ mTree.mDynamicRefTable->lookupResourceId(&resId);
+ }
+ return resId;
}
return 0;
}
@@ -6142,11 +6146,11 @@ status_t DynamicRefTable::lookupResourceId(uint32_t* resId) const {
// Do a proper lookup.
uint8_t translatedId = mLookupTable[packageId];
if (translatedId == 0) {
- ALOGE("DynamicRefTable(0x%02x): No mapping for build-time package ID 0x%02x.",
+ ALOGV("DynamicRefTable(0x%02x): No mapping for build-time package ID 0x%02x.",
(uint8_t)mAssignedPackageId, (uint8_t)packageId);
for (size_t i = 0; i < 256; i++) {
if (mLookupTable[i] != 0) {
- ALOGE("e[0x%02x] -> 0x%02x", (uint8_t)i, mLookupTable[i]);
+ ALOGV("e[0x%02x] -> 0x%02x", (uint8_t)i, mLookupTable[i]);
}
}
return UNKNOWN_ERROR;
diff --git a/libs/androidfw/tests/Android.mk b/libs/androidfw/tests/Android.mk
index dd45200..58b78b5 100644
--- a/libs/androidfw/tests/Android.mk
+++ b/libs/androidfw/tests/Android.mk
@@ -20,6 +20,7 @@
# ==========================================================
LOCAL_PATH:= $(call my-dir)
testFiles := \
+ AttributeFinder_test.cpp \
ByteBucketArray_test.cpp \
Config_test.cpp \
ConfigLocale_test.cpp \
diff --git a/libs/androidfw/tests/AttributeFinder_test.cpp b/libs/androidfw/tests/AttributeFinder_test.cpp
new file mode 100644
index 0000000..664709c
--- /dev/null
+++ b/libs/androidfw/tests/AttributeFinder_test.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <androidfw/AttributeFinder.h>
+
+#include <gtest/gtest.h>
+
+using android::BackTrackingAttributeFinder;
+
+class MockAttributeFinder : public BackTrackingAttributeFinder<MockAttributeFinder, int> {
+public:
+ MockAttributeFinder(const uint32_t* attrs, int len)
+ : BackTrackingAttributeFinder(0, len) {
+ mAttrs = new uint32_t[len];
+ memcpy(mAttrs, attrs, sizeof(*attrs) * len);
+ }
+
+ ~MockAttributeFinder() {
+ delete mAttrs;
+ }
+
+ inline uint32_t getAttribute(const int index) const {
+ return mAttrs[index];
+ }
+
+private:
+ uint32_t* mAttrs;
+};
+
+static const uint32_t sortedAttributes[] = {
+ 0x01010000, 0x01010001, 0x01010002, 0x01010004,
+ 0x02010001, 0x02010010, 0x7f010001
+};
+
+static const uint32_t packageUnsortedAttributes[] = {
+ 0x02010001, 0x02010010, 0x01010000, 0x01010001,
+ 0x01010002, 0x01010004, 0x7f010001
+};
+
+TEST(AttributeFinderTest, IteratesSequentially) {
+ const int end = sizeof(sortedAttributes) / sizeof(*sortedAttributes);
+ MockAttributeFinder finder(sortedAttributes, end);
+
+ EXPECT_EQ(0, finder.find(0x01010000));
+ EXPECT_EQ(1, finder.find(0x01010001));
+ EXPECT_EQ(2, finder.find(0x01010002));
+ EXPECT_EQ(3, finder.find(0x01010004));
+ EXPECT_EQ(4, finder.find(0x02010001));
+ EXPECT_EQ(5, finder.find(0x02010010));
+ EXPECT_EQ(6, finder.find(0x7f010001));
+ EXPECT_EQ(end, finder.find(0x7f010002));
+}
+
+TEST(AttributeFinderTest, PackagesAreOutOfOrder) {
+ const int end = sizeof(sortedAttributes) / sizeof(*sortedAttributes);
+ MockAttributeFinder finder(sortedAttributes, end);
+
+ EXPECT_EQ(6, finder.find(0x7f010001));
+ EXPECT_EQ(end, finder.find(0x7f010002));
+ EXPECT_EQ(4, finder.find(0x02010001));
+ EXPECT_EQ(5, finder.find(0x02010010));
+ EXPECT_EQ(0, finder.find(0x01010000));
+ EXPECT_EQ(1, finder.find(0x01010001));
+ EXPECT_EQ(2, finder.find(0x01010002));
+ EXPECT_EQ(3, finder.find(0x01010004));
+}
+
+TEST(AttributeFinderTest, SomeAttributesAreNotFound) {
+ const int end = sizeof(sortedAttributes) / sizeof(*sortedAttributes);
+ MockAttributeFinder finder(sortedAttributes, end);
+
+ EXPECT_EQ(0, finder.find(0x01010000));
+ EXPECT_EQ(1, finder.find(0x01010001));
+ EXPECT_EQ(2, finder.find(0x01010002));
+ EXPECT_EQ(end, finder.find(0x01010003));
+ EXPECT_EQ(3, finder.find(0x01010004));
+ EXPECT_EQ(end, finder.find(0x01010005));
+ EXPECT_EQ(end, finder.find(0x01010006));
+ EXPECT_EQ(4, finder.find(0x02010001));
+ EXPECT_EQ(end, finder.find(0x02010002));
+}
+
+TEST(AttributeFinderTest, FindAttributesInPackageUnsortedAttributeList) {
+ const int end = sizeof(packageUnsortedAttributes) / sizeof(*packageUnsortedAttributes);
+ MockAttributeFinder finder(packageUnsortedAttributes, end);
+
+ EXPECT_EQ(2, finder.find(0x01010000));
+ EXPECT_EQ(3, finder.find(0x01010001));
+ EXPECT_EQ(4, finder.find(0x01010002));
+ EXPECT_EQ(end, finder.find(0x01010003));
+ EXPECT_EQ(5, finder.find(0x01010004));
+ EXPECT_EQ(end, finder.find(0x01010005));
+ EXPECT_EQ(end, finder.find(0x01010006));
+ EXPECT_EQ(0, finder.find(0x02010001));
+ EXPECT_EQ(end, finder.find(0x02010002));
+ EXPECT_EQ(1, finder.find(0x02010010));
+ EXPECT_EQ(6, finder.find(0x7f010001));
+}