From e464de6b764348a102ae64417d22bbd1c80723dc Mon Sep 17 00:00:00 2001 From: Daisuke Miyakawa Date: Tue, 10 Nov 2009 21:13:05 +0900 Subject: [PATCH] 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 --- .../java/android/pim/vcard/VCardComposer.java | 61 +++++++++++++++++-- core/java/android/pim/vcard/VCardUtils.java | 9 +++ 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/core/java/android/pim/vcard/VCardComposer.java b/core/java/android/pim/vcard/VCardComposer.java index 26e38d14ec2e2..f9dce255056e1 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.Photo; 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 @@ public class VCardComposer { 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 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 @@ public class VCardComposer { } } + private List splitIfSeveralPhoneNumbersExist(final String phoneNumber) { + List phoneList = new ArrayList(); + + 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> contentValuesListMap) { final List contentValuesList = contentValuesListMap diff --git a/core/java/android/pim/vcard/VCardUtils.java b/core/java/android/pim/vcard/VCardUtils.java index 4f50103a84d7a..dd44288a881a8 100644 --- a/core/java/android/pim/vcard/VCardUtils.java +++ b/core/java/android/pim/vcard/VCardUtils.java @@ -20,6 +20,7 @@ import android.content.ContentValues; 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 @@ public class VCardUtils { 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. *