Loading tools/aapt/ResourceFilter.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -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 Loading tools/aapt/ResourceFilter.h +1 −2 Original line number Diff line number Diff line Loading @@ -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: Loading tools/aapt/tests/ResourceFilter_test.cpp +37 −0 Original line number Diff line number Diff line Loading @@ -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"))); Loading @@ -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"))); Loading Loading
tools/aapt/ResourceFilter.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -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 Loading
tools/aapt/ResourceFilter.h +1 −2 Original line number Diff line number Diff line Loading @@ -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: Loading
tools/aapt/tests/ResourceFilter_test.cpp +37 −0 Original line number Diff line number Diff line Loading @@ -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"))); Loading @@ -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"))); Loading