OSDN Git Service

AAPT2: Fix issue with resource deduping
authorAdam Lesinski <adamlesinski@google.com>
Wed, 30 Aug 2017 23:12:05 +0000 (16:12 -0700)
committerAdam Lesinski <adamlesinski@google.com>
Thu, 14 Sep 2017 18:31:48 +0000 (11:31 -0700)
Resource deduping relies on the definitions of
ConfigDescription.ConflictsWith, ConfigDescription.IsCompatibleWith,
and ConfigDescription.Dominates.

ConflictsWith is supposed to ignore range-based qualifiers, like
version, density, smallest width, screen size, etc.

This was not the case for screen size, and was assumed that the
choice of screen size is mutually exclusive.

This CL fixes the assumption and includes screen size (small, normal, large, xlarge)
as a qualifier that does not conflict.

Bug: 64397629
Bug: 65645766
Test: make aapt2_tests
Change-Id: I573a6735fedd7721a10ba32902bc5d27ef99b88e
Merged-In: I573a6735fedd7721a10ba32902bc5d27ef99b88e

tools/aapt2/ConfigDescription.cpp
tools/aapt2/ConfigDescription_test.cpp

index 6a09965..a9278c1 100644 (file)
@@ -967,8 +967,6 @@ bool ConfigDescription::ConflictsWith(const ConfigDescription& o) const {
                o.screenLayout & MASK_LAYOUTDIR) ||
          !pred(screenLayout & MASK_SCREENLONG,
                o.screenLayout & MASK_SCREENLONG) ||
-         !pred(screenLayout & MASK_UI_MODE_TYPE,
-               o.screenLayout & MASK_UI_MODE_TYPE) ||
          !pred(uiMode & MASK_UI_MODE_TYPE, o.uiMode & MASK_UI_MODE_TYPE) ||
          !pred(uiMode & MASK_UI_MODE_NIGHT, o.uiMode & MASK_UI_MODE_NIGHT) ||
          !pred(screenLayout2 & MASK_SCREENROUND,
index 14a5656..1f351bf 100644 (file)
@@ -140,4 +140,16 @@ TEST(ConfigDescriptionTest, ParseVrAttribute) {
   EXPECT_EQ(std::string("vrheadset-v26"), config.toString().string());
 }
 
+TEST(ConfigDescriptionTest, RangeQualifiersDoNotConflict) {
+  using test::ParseConfigOrDie;
+
+  EXPECT_FALSE(ParseConfigOrDie("large").ConflictsWith(ParseConfigOrDie("normal-land")));
+  EXPECT_FALSE(ParseConfigOrDie("long-hdpi").ConflictsWith(ParseConfigOrDie("xhdpi")));
+  EXPECT_FALSE(ParseConfigOrDie("sw600dp").ConflictsWith(ParseConfigOrDie("sw700dp")));
+  EXPECT_FALSE(ParseConfigOrDie("v11").ConflictsWith(ParseConfigOrDie("v21")));
+  EXPECT_FALSE(ParseConfigOrDie("h600dp").ConflictsWith(ParseConfigOrDie("h300dp")));
+  EXPECT_FALSE(ParseConfigOrDie("w400dp").ConflictsWith(ParseConfigOrDie("w300dp")));
+  EXPECT_FALSE(ParseConfigOrDie("600x400").ConflictsWith(ParseConfigOrDie("300x200")));
+}
+
 }  // namespace aapt