Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 452a5296 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change I319bf9ee into eclair-mr2

* changes:
  Make vCard exporter check invalid phone numbers and re-format them if needed.
parents 61a2c04f f2ad61c8
Loading
Loading
Loading
Loading
+51 −6
Original line number Diff line number Diff line
@@ -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,14 +1094,37 @@ 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 (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
+9 −0
Original line number Diff line number Diff line
@@ -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.
     * 
+14 −0
Original line number Diff line number Diff line
@@ -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();
    }
}