diff options
| author | Daisuke Miyakawa <dmiyakawa@google.com> | 2009-11-10 09:27:08 +0900 |
|---|---|---|
| committer | Daisuke Miyakawa <dmiyakawa@google.com> | 2009-11-10 09:29:04 +0900 |
| commit | f2ad61c83da509270b8c5e9583b503ced928315d (patch) | |
| tree | 2ae8f8b023290e76b982cbd9f11c6e9e1855430b /core/java/android/pim | |
| parent | 26c91fa694464c79de39988f9f42cee375ff0a14 (diff) | |
| download | frameworks_base-f2ad61c83da509270b8c5e9583b503ced928315d.zip frameworks_base-f2ad61c83da509270b8c5e9583b503ced928315d.tar.gz frameworks_base-f2ad61c83da509270b8c5e9583b503ced928315d.tar.bz2 | |
Make vCard exporter check invalid phone numbers and re-format them if needed.
Also add a unit test for the case.
Internal issue number: 2246410
Diffstat (limited to 'core/java/android/pim')
| -rw-r--r-- | core/java/android/pim/vcard/VCardComposer.java | 57 | ||||
| -rw-r--r-- | core/java/android/pim/vcard/VCardUtils.java | 9 |
2 files changed, 60 insertions, 6 deletions
diff --git a/core/java/android/pim/vcard/VCardComposer.java b/core/java/android/pim/vcard/VCardComposer.java index 9d72c5f..5a14f5f 100644 --- a/core/java/android/pim/vcard/VCardComposer.java +++ b/core/java/android/pim/vcard/VCardComposer.java @@ -41,6 +41,7 @@ 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.TextUtils; import android.text.format.Time; import android.util.CharsetUtils; @@ -1093,13 +1094,36 @@ public class VCardComposer { if (TextUtils.isEmpty(phoneNumber)) { continue; } - phoneLineExists = true; int type = (typeAsObject != null ? typeAsObject : DEFAULT_PHONE_TYPE); - // 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, isPrimary); + if (type == Phone.TYPE_PAGER) { + phoneLineExists = true; + if (!phoneSet.contains(phoneNumber)) { + phoneSet.add(phoneNumber); + appendVCardTelephoneLine(builder, type, label, phoneNumber, isPrimary); + } + } 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); + final String formattedPhoneNumber = + PhoneNumberUtils.formatNumber(actualPhoneNumber, format); + phoneSet.add(actualPhoneNumber); + appendVCardTelephoneLine(builder, type, label, + formattedPhoneNumber, isPrimary); + } + } } } } @@ -1109,6 +1133,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 05e6730..9e5dbb5 100644 --- a/core/java/android/pim/vcard/VCardUtils.java +++ b/core/java/android/pim/vcard/VCardUtils.java @@ -21,6 +21,7 @@ import android.provider.ContactsContract.Data; import android.provider.ContactsContract.CommonDataKinds.Im; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; +import android.telephony.PhoneNumberUtils; import android.text.TextUtils; import java.util.ArrayList; @@ -204,6 +205,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. * |
