summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2014-08-22 23:24:59 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-08-22 23:25:00 +0000
commit4bf859a9ecfe5050a1cf6b6c1372c152ff28f705 (patch)
tree27235e6998a730dc095c3ca1c1415c019f7ca205
parentc7639333f8c42efad80ad9304544c7a892b7d81f (diff)
parenta5cc002bfe7ca8a6536549189b44e7143c8611dc (diff)
downloadframeworks_base-4bf859a9ecfe5050a1cf6b6c1372c152ff28f705.zip
frameworks_base-4bf859a9ecfe5050a1cf6b6c1372c152ff28f705.tar.gz
frameworks_base-4bf859a9ecfe5050a1cf6b6c1372c152ff28f705.tar.bz2
Merge "AAPT: Filtering resource fix" into lmp-dev
-rw-r--r--tools/aapt/ResourceFilter.cpp18
-rw-r--r--tools/aapt/ResourceFilter.h3
-rw-r--r--tools/aapt/tests/ResourceFilter_test.cpp37
3 files changed, 52 insertions, 6 deletions
diff --git a/tools/aapt/ResourceFilter.cpp b/tools/aapt/ResourceFilter.cpp
index de8b4fc..fc95e14 100644
--- a/tools/aapt/ResourceFilter.cpp
+++ b/tools/aapt/ResourceFilter.cpp
@@ -56,24 +56,34 @@ WeakResourceFilter::match(const ResTable_config& config) const
return true;
}
+ uint32_t matchedAxis = 0x0;
const size_t N = mConfigs.size();
for (size_t i = 0; i < N; i++) {
const std::pair<ConfigDescription, uint32_t>& entry = mConfigs[i];
uint32_t diff = entry.first.diff(config);
if ((diff & entry.second) == 0) {
- return true;
+ // Mark the axis that was matched.
+ matchedAxis |= entry.second;
} else if ((diff & entry.second) == ResTable_config::CONFIG_LOCALE) {
// If the locales differ, but the languages are the same and
// the locale we are matching only has a language specified,
// we match.
- if (config.language[0] && memcmp(config.language, entry.first.language, sizeof(config.language)) == 0) {
+ if (config.language[0] &&
+ memcmp(config.language, entry.first.language, sizeof(config.language)) == 0) {
if (config.country[0] == 0) {
- return true;
+ matchedAxis |= ResTable_config::CONFIG_LOCALE;
}
}
+ } else if ((diff & entry.second) == ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE) {
+ // Special case if the smallest screen width doesn't match. We check that the
+ // config being matched has a smaller screen width than the filter specified.
+ if (config.smallestScreenWidthDp != 0 &&
+ config.smallestScreenWidthDp < entry.first.smallestScreenWidthDp) {
+ matchedAxis |= ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE;
+ }
}
}
- return false;
+ return matchedAxis == (mConfigMask & mask);
}
status_t
diff --git a/tools/aapt/ResourceFilter.h b/tools/aapt/ResourceFilter.h
index f459584..d6430c0 100644
--- a/tools/aapt/ResourceFilter.h
+++ b/tools/aapt/ResourceFilter.h
@@ -24,8 +24,7 @@ public:
};
/**
- * Implements logic for parsing and handling "-c" and "--preferred-configurations"
- * options.
+ * Implements logic for parsing and handling "-c" options.
*/
class WeakResourceFilter : public ResourceFilter {
public:
diff --git a/tools/aapt/tests/ResourceFilter_test.cpp b/tools/aapt/tests/ResourceFilter_test.cpp
index b55379e..bbc2e02 100644
--- a/tools/aapt/tests/ResourceFilter_test.cpp
+++ b/tools/aapt/tests/ResourceFilter_test.cpp
@@ -75,6 +75,17 @@ TEST(WeakResourceFilterTest, MatchesConfigWithSameValueAxisAndOtherUnrelatedAxis
EXPECT_TRUE(filter.match(config));
}
+TEST(WeakResourceFilterTest, MatchesConfigWithOneMatchingAxis) {
+ WeakResourceFilter filter;
+ ASSERT_EQ(NO_ERROR, filter.parse(String8("fr_FR,sw360dp,normal,en_US")));
+
+ ConfigDescription config;
+ config.language[0] = 'e';
+ config.language[1] = 'n';
+
+ EXPECT_TRUE(filter.match(config));
+}
+
TEST(WeakResourceFilterTest, DoesNotMatchConfigWithDifferentValueAxis) {
WeakResourceFilter filter;
ASSERT_EQ(NO_ERROR, filter.parse(String8("fr")));
@@ -86,6 +97,32 @@ TEST(WeakResourceFilterTest, DoesNotMatchConfigWithDifferentValueAxis) {
EXPECT_FALSE(filter.match(config));
}
+TEST(WeakResourceFilterTest, DoesNotMatchWhenOneQualifierIsExplicitlyNotMatched) {
+ WeakResourceFilter filter;
+ ASSERT_EQ(NO_ERROR, filter.parse(String8("fr_FR,en_US,normal,large,xxhdpi,sw320dp")));
+
+ ConfigDescription config;
+ config.language[0] = 'f';
+ config.language[1] = 'r';
+ config.smallestScreenWidthDp = 600;
+ config.version = 13;
+
+ EXPECT_FALSE(filter.match(config));
+}
+
+TEST(WeakResourceFilterTest, MatchesSmallestWidthWhenSmaller) {
+ WeakResourceFilter filter;
+ ASSERT_EQ(NO_ERROR, filter.parse(String8("sw600dp")));
+
+ ConfigDescription config;
+ config.language[0] = 'f';
+ config.language[1] = 'r';
+ config.smallestScreenWidthDp = 320;
+ config.version = 13;
+
+ EXPECT_TRUE(filter.match(config));
+}
+
TEST(WeakResourceFilterTest, MatchesConfigWithSameLanguageButNoRegionSpecified) {
WeakResourceFilter filter;
ASSERT_EQ(NO_ERROR, filter.parse(String8("de-rDE")));