Merge "Fix importing SHIFT_JIS vcard with backslash byte breakage"
diff --git a/java/com/android/vcard/VCardParserImpl_V21.java b/java/com/android/vcard/VCardParserImpl_V21.java
index 386d626..e8655a8 100644
--- a/java/com/android/vcard/VCardParserImpl_V21.java
+++ b/java/com/android/vcard/VCardParserImpl_V21.java
@@ -685,8 +685,8 @@
             }
 
             ArrayList<String> propertyValueList = new ArrayList<String>();
-            String value = VCardUtils.convertStringCharset(
-                    maybeUnescapeText(propertyRawValue), sourceCharset, targetCharset);
+            String value = maybeUnescapeText(VCardUtils.convertStringCharset(
+                    propertyRawValue, sourceCharset, targetCharset));
             propertyValueList.add(value);
             property.setValues(propertyValueList);
             for (VCardInterpreter interpreter : mInterpreterList) {
@@ -720,12 +720,12 @@
                 encodedValueList.add(encoded);
             }
         } else {
-            final String propertyValue = getPotentialMultiline(propertyRawValue);
-            final List<String> rawValueList =
+            final String propertyValue = VCardUtils.convertStringCharset(
+                    getPotentialMultiline(propertyRawValue), sourceCharset, targetCharset);
+            final List<String> valueList =
                     VCardUtils.constructListFromValue(propertyValue, getVersion());
-            for (String rawValue : rawValueList) {
-                encodedValueList.add(VCardUtils.convertStringCharset(
-                        rawValue, sourceCharset, targetCharset));
+            for (String value : valueList) {
+                encodedValueList.add(value);
             }
         }
 
diff --git a/tests/res/raw/v21_japanese_3.vcf b/tests/res/raw/v21_japanese_3.vcf
new file mode 100644
index 0000000..e54124d
--- /dev/null
+++ b/tests/res/raw/v21_japanese_3.vcf
@@ -0,0 +1,5 @@
+BEGIN:VCARD
+VERSION:2.1
+FN;CHARSET=SHIFT_JIS:ˆÉ”\ Œ\ˆê ˆÉ—\
+N;CHARSET=SHIFT_JIS:ˆÉ”\;Œ\ˆê;ˆÉ—\;;
+END:VCARD
diff --git a/tests/res/raw/v30_japanese.vcf b/tests/res/raw/v30_japanese.vcf
new file mode 100644
index 0000000..8ab7674
--- /dev/null
+++ b/tests/res/raw/v30_japanese.vcf
@@ -0,0 +1,5 @@
+BEGIN:VCARD
+VERSION:3.0
+FN;CHARSET=SHIFT_JIS:ˆÉ”\ Œ\ˆê ˆÉ—\
+N;CHARSET=SHIFT_JIS:ˆÉ”\;Œ\ˆê;ˆÉ—\;;
+END:VCARD
diff --git a/tests/src/com/android/vcard/tests/VCardImporterTests.java b/tests/src/com/android/vcard/tests/VCardImporterTests.java
index 12addd6..6091826 100644
--- a/tests/src/com/android/vcard/tests/VCardImporterTests.java
+++ b/tests/src/com/android/vcard/tests/VCardImporterTests.java
@@ -869,6 +869,39 @@
                 .put(Note.NOTE, "\u30E1\u30E2");
     }
 
+    public void testV21Japanese3_Parsing() {
+        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_japanese_3);
+        mVerifier.addPropertyNodesVerifierElem()
+                .addExpectedNodeWithOrder("N", "\u4f0a\u80fd;\u572d\u4e00;\u4f0a\u4e88;;",
+                        Arrays.asList("\u4f0a\u80fd", "\u572d\u4e00", "\u4f0a\u4e88",
+                                "", ""),
+                        null, mContentValuesForSJis, null, null)
+                .addExpectedNodeWithOrder("FN", "\u4f0a\u80fd\u0020\u572d\u4e00\u0020\u4f0a\u4e88",
+                        null, null, mContentValuesForSJis, null, null);
+    }
+
+    public void testV21Japanese3_Parsing_Utf8() {
+        mVerifier.initForImportTest(V21, R.raw.v21_japanese_3);
+        mVerifier.addPropertyNodesVerifierElem()
+                .addExpectedNodeWithOrder("N", "\u4f0a\u80fd;\u572d\u4e00;\u4f0a\u4e88;;",
+                        Arrays.asList("\u4f0a\u80fd", "\u572d\u4e00", "\u4f0a\u4e88",
+                                "", ""),
+                        null, mContentValuesForSJis, null, null)
+                .addExpectedNodeWithOrder("FN", "\u4f0a\u80fd\u0020\u572d\u4e00\u0020\u4f0a\u4e88",
+                        null, null, mContentValuesForSJis, null, null);
+    }
+
+    public void testV30Japanese_Parsing() {
+        mVerifier.initForImportTest(V30, R.raw.v30_japanese);
+        mVerifier.addPropertyNodesVerifierElem()
+                .addExpectedNodeWithOrder("N", "\u4f0a\u80fd;\u572d\u4e00;\u4f0a\u4e88;;",
+                        Arrays.asList("\u4f0a\u80fd", "\u572d\u4e00", "\u4f0a\u4e88",
+                                "", ""),
+                        null, mContentValuesForSJis, null, null)
+                .addExpectedNodeWithOrder("FN", "\u4f0a\u80fd\u0020\u572d\u4e00\u0020\u4f0a\u4e88",
+                        null, null, mContentValuesForSJis, null, null);
+    }
+
     public void testV21MultipleEntryCase_Parse() {
         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_multiple_entry);
         mVerifier.addPropertyNodesVerifierElem()