am 7f319c47: am 1dc550fa: Merge "Fix packing of values at offset 16."

* commit '7f319c47c8f5e947638eb1e5e73789ff83123bba':
  Fix packing of values at offset 16.
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index b84bee8..1dec977 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -1597,9 +1597,9 @@
       out[0] = in[0];
       out[1] = in[1];
   } else {
-      uint8_t first = (in[0] - base) & 0x00ef;
-      uint8_t second = (in[1] - base) & 0x00ef;
-      uint8_t third = (in[2] - base) & 0x00ef;
+      uint8_t first = (in[0] - base) & 0x007f;
+      uint8_t second = (in[1] - base) & 0x007f;
+      uint8_t third = (in[2] - base) & 0x007f;
 
       out[0] = (0x80 | (third << 2) | (second >> 3));
       out[1] = ((second << 5) | first);
diff --git a/libs/androidfw/tests/ResourceTypes_test.cpp b/libs/androidfw/tests/ResourceTypes_test.cpp
index 4888b4a..139f868 100644
--- a/libs/androidfw/tests/ResourceTypes_test.cpp
+++ b/libs/androidfw/tests/ResourceTypes_test.cpp
@@ -75,6 +75,30 @@
      EXPECT_EQ(0, out[3]);
 }
 
+TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterLanguageAtOffset16) {
+     ResTable_config config;
+     config.packLanguage("tgp");
+
+     // We had a bug where we would accidentally mask
+     // the 5th bit of both bytes
+     //
+     // packed[0] = 1011 1100
+     // packed[1] = 1101 0011
+     //
+     // which is equivalent to:
+     // 1  [0]   [1]   [2]
+     // 1-01111-00110-10011
+     EXPECT_EQ(0xbc, config.language[0]);
+     EXPECT_EQ(0xd3, config.language[1]);
+
+     char out[4] = { 1, 1, 1, 1};
+     config.unpackLanguage(out);
+     EXPECT_EQ('t', out[0]);
+     EXPECT_EQ('g', out[1]);
+     EXPECT_EQ('p', out[2]);
+     EXPECT_EQ(0, out[3]);
+}
+
 TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterRegion) {
      ResTable_config config;
      config.packRegion("419");