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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user