summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaisuke Miyakawa <dmiyakawa@google.com>2009-11-10 09:27:08 +0900
committerDaisuke Miyakawa <dmiyakawa@google.com>2009-11-10 09:29:04 +0900
commitf2ad61c83da509270b8c5e9583b503ced928315d (patch)
tree2ae8f8b023290e76b982cbd9f11c6e9e1855430b
parent26c91fa694464c79de39988f9f42cee375ff0a14 (diff)
downloadframeworks_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
-rw-r--r--core/java/android/pim/vcard/VCardComposer.java57
-rw-r--r--core/java/android/pim/vcard/VCardUtils.java9
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java14
3 files changed, 74 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.
*
diff --git a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java
index 727d33b..cdecd3b 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java
@@ -889,4 +889,18 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Nickname.NAME, "Nicky");
verifier.verify();
}
+
+ public void testTolerateBrokenPhoneNumberEntryV21() {
+ ExportTestResolver resolver = new ExportTestResolver();
+ resolver.buildContactEntry().buildData(Phone.CONTENT_ITEM_TYPE)
+ .put(Phone.TYPE, Phone.TYPE_HOME)
+ .put(Phone.NUMBER, "111-222-3333 (Miami)\n444-5555-666 (Tokyo);"
+ + "777-888-9999 (Chicago);111-222-3333 (Miami)");
+ VCardVerifier verifier = new VCardVerifier(resolver, V21);
+ verifier.addPropertyNodesVerifierWithEmptyName()
+ .addNodeWithoutOrder("TEL", "111-222-3333", new TypeSet("HOME"))
+ .addNodeWithoutOrder("TEL", "444-555-5666", new TypeSet("HOME"))
+ .addNodeWithoutOrder("TEL", "777-888-9999", new TypeSet("HOME"));
+ verifier.verify();
+ }
}