summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daisuke Miyakawa <dmiyakawa@google.com> 2009-11-10 21:13:05 +0900
committer Daisuke Miyakawa <dmiyakawa@google.com> 2009-11-11 15:42:55 +0900
commite464de6b764348a102ae64417d22bbd1c80723dc (patch)
treef080bad11ca7b2d1b9320dbbe135af554a1cb572
parentdd861689924198ed22115f0e21be1b81e159a7cc (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.java61
-rw-r--r--core/java/android/pim/vcard/VCardUtils.java9
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.
*