diff options
| author | 2009-11-10 21:13:05 +0900 | |
|---|---|---|
| committer | 2009-11-11 15:42:55 +0900 | |
| commit | e464de6b764348a102ae64417d22bbd1c80723dc (patch) | |
| tree | f080bad11ca7b2d1b9320dbbe135af554a1cb572 | |
| parent | dd861689924198ed22115f0e21be1b81e159a7cc (diff) | |
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
| -rw-r--r-- | core/java/android/pim/vcard/VCardComposer.java | 61 | ||||
| -rw-r--r-- | 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 26e38d14ec2e..f9dce255056e 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<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 @@ public class VCardComposer { } } + 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 4f50103a84d7..dd44288a881a 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. * |