Make vCard exporter check invalid phone numbers and re-format them if needed. Do not merge.

This change is based on the change I319bf9ee, but different in that there's no test, since
test framework for vCard code is just in MR2, not in MR1.

Internal issue number: 2246410

Dr.NO: Hiroshi
diff --git a/core/java/android/pim/vcard/VCardComposer.java b/core/java/android/pim/vcard/VCardComposer.java
index 26e38d1..f9dce25 100644
--- a/core/java/android/pim/vcard/VCardComposer.java
+++ b/core/java/android/pim/vcard/VCardComposer.java
@@ -41,6 +41,8 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.telephony.PhoneNumberUtils;
+import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
 import android.text.format.Time;
 import android.util.CharsetUtils;
@@ -1171,13 +1173,39 @@
                 if (TextUtils.isEmpty(phoneNumber)) {
                     continue;
                 }
-                phoneLineExists = true;
                 int type = (typeAsObject != null ? typeAsObject : Phone.TYPE_HOME);
-                // TODO: Premature, since this allows two phone numbers which are
-                //        same from the view of phone number format (e.g. "100" v.s. "1-0-0")
-                if (!phoneSet.contains(phoneNumber)) {
-                    phoneSet.add(phoneNumber);
-                    appendVCardTelephoneLine(builder, type, label, phoneNumber);
+
+                phoneLineExists = true;
+                if (type == Phone.TYPE_PAGER) {
+                    phoneLineExists = true;
+                    if (!phoneSet.contains(phoneNumber)) {
+                        phoneSet.add(phoneNumber);
+                        appendVCardTelephoneLine(builder, type, label, phoneNumber);
+                    }
+                } else {
+                    // The entry "may" have several phone numbers when the contact entry is
+                    // corrupted because of its original source.
+                    //
+                    // e.g. I encountered the entry like the following.
+                    // "111-222-3333 (Miami)\n444-555-6666 (Broward; 305-653-6796 (Miami); ..."
+                    // This kind of entry is not able to be inserted via Android devices, but
+                    // possible if the source of the data is already corrupted.
+                    List<String> phoneNumberList = splitIfSeveralPhoneNumbersExist(phoneNumber);
+                    if (phoneNumberList.isEmpty()) {
+                        continue;
+                    }
+                    phoneLineExists = true;
+                    for (String actualPhoneNumber : phoneNumberList) {
+                        if (!phoneSet.contains(actualPhoneNumber)) {
+                            final int format = VCardUtils.getPhoneNumberFormat(mVCardType);
+                            SpannableStringBuilder tmpBuilder =
+                                new SpannableStringBuilder(actualPhoneNumber);
+                            PhoneNumberUtils.formatNumber(tmpBuilder, format);
+                            final String formattedPhoneNumber = tmpBuilder.toString();
+                            phoneSet.add(actualPhoneNumber);
+                            appendVCardTelephoneLine(builder, type, label, formattedPhoneNumber);
+                        }
+                    }
                 }
             }
         }
@@ -1187,6 +1215,27 @@
         }
     }
 
+    private List<String> splitIfSeveralPhoneNumbersExist(final String phoneNumber) {
+        List<String> phoneList = new ArrayList<String>();
+
+        StringBuilder builder = new StringBuilder();
+        final int length = phoneNumber.length();
+        for (int i = 0; i < length; i++) {
+            final char ch = phoneNumber.charAt(i);
+            if (Character.isDigit(ch)) {
+                builder.append(ch);
+            } else if ((ch == ';' || ch == '\n') && builder.length() > 0) {
+                phoneList.add(builder.toString());
+                builder = new StringBuilder();
+            }
+        }
+        if (builder.length() > 0) {
+            phoneList.add(builder.toString());
+        }
+
+        return phoneList;
+    }
+
     private void appendEmails(final StringBuilder builder,
             final Map<String, List<ContentValues>> contentValuesListMap) {
         final List<ContentValues> contentValuesList = contentValuesListMap
diff --git a/core/java/android/pim/vcard/VCardUtils.java b/core/java/android/pim/vcard/VCardUtils.java
index 4f50103..dd44288 100644
--- a/core/java/android/pim/vcard/VCardUtils.java
+++ b/core/java/android/pim/vcard/VCardUtils.java
@@ -20,6 +20,7 @@
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
 import java.util.Collection;
@@ -168,6 +169,14 @@
         return list;
     }
 
+    public static int getPhoneNumberFormat(final int vcardType) {
+        if (VCardConfig.isJapaneseDevice(vcardType)) {
+            return PhoneNumberUtils.FORMAT_JAPAN;
+        } else {
+            return PhoneNumberUtils.FORMAT_NANP;
+        }
+    }
+
     /**
      * Inserts postal data into the builder object.
      *