Merge change I319bf9ee into eclair-mr2

* changes:
  Make vCard exporter check invalid phone numbers and re-format them if needed.
This commit is contained in:
Android (Google) Code Review
2009-11-09 16:35:44 -08:00
3 changed files with 74 additions and 6 deletions

View File

@@ -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

View File

@@ -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.
*

View File

@@ -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();
}
}