VCardEntry.java revision c13101ba38c929d91dcb68e21165c82c19af35d7
14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2009 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License.
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage com.android.vcard;
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.accounts.Account;
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentProviderOperation;
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentProviderResult;
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentResolver;
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.OperationApplicationException;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.net.Uri;
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.os.RemoteException;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract;
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.Contacts;
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.Data;
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.RawContacts;
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Email;
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Event;
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Im;
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Nickname;
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Note;
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Organization;
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Phone;
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Photo;
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Website;
414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.telephony.PhoneNumberUtils;
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.text.TextUtils;
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.util.Log;
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.ArrayList;
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Arrays;
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Collection;
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Collections;
494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashMap;
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashSet;
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.List;
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Map;
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/**
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * This class bridges between data structure of Contact app and VCard data.
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapublic class VCardEntry {
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final String LOG_TAG = "VCardEntry";
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final static int DEFAULT_ORGANIZATION_TYPE = Organization.TYPE_WORK;
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final Map<String, Integer> sImMap = new HashMap<String, Integer>();
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    static {
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_AIM, Im.PROTOCOL_AIM);
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_MSN, Im.PROTOCOL_MSN);
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_YAHOO, Im.PROTOCOL_YAHOO);
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_ICQ, Im.PROTOCOL_ICQ);
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_JABBER, Im.PROTOCOL_JABBER);
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_SKYPE_USERNAME, Im.PROTOCOL_SKYPE);
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.PROPERTY_X_GOOGLE_TALK, Im.PROTOCOL_GOOGLE_TALK);
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sImMap.put(VCardConstants.ImportOnly.PROPERTY_X_GOOGLE_TALK_WITH_SPACE,
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                Im.PROTOCOL_GOOGLE_TALK);
744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static class PhoneData {
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int type;
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String data;
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String label;
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // isPrimary is (not final but) changable, only when there's no appropriate one existing
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // in the original VCard.
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean isPrimary;
834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public PhoneData(int type, String data, String label, boolean isPrimary) {
844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.type = type;
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.data = data;
864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.label = label;
874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.isPrimary = isPrimary;
884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean equals(Object obj) {
924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(obj instanceof PhoneData)) {
934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return false;
944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            PhoneData phoneData = (PhoneData)obj;
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (type == phoneData.type && data.equals(phoneData.data) &&
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    label.equals(phoneData.label) && isPrimary == phoneData.isPrimary);
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String toString() {
1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return String.format("type: %d, data: %s, label: %s, isPrimary: %s",
1034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    type, data, label, isPrimary);
1044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static class EmailData {
1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int type;
1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String data;
1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Used only when TYPE is TYPE_CUSTOM.
1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String label;
1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean isPrimary;
1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public EmailData(int type, String data, String label, boolean isPrimary) {
1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.type = type;
1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.data = data;
1164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.label = label;
1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.isPrimary = isPrimary;
1184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean equals(Object obj) {
1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(obj instanceof EmailData)) {
1234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return false;
1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            EmailData emailData = (EmailData)obj;
1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (type == emailData.type && data.equals(emailData.data) &&
1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    label.equals(emailData.label) && isPrimary == emailData.isPrimary);
1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String toString() {
1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return String.format("type: %d, data: %s, label: %s, isPrimary: %s",
1334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    type, data, label, isPrimary);
1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static class PostalData {
1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Determined by vCard specification.
1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // - PO Box, Extended Addr, Street, Locality, Region, Postal Code, Country Name
1404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public static final int ADDR_MAX_DATA_SIZE = 7;
1414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        private final String[] dataArray;
1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String pobox;
1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String extendedAddress;
1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String street;
1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String localty;
1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String region;
1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String postalCode;
1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String country;
1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int type;
1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String label;
1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean isPrimary;
1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public PostalData(final int type, final List<String> propValueList,
1544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final String label, boolean isPrimary) {
1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.type = type;
1564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            dataArray = new String[ADDR_MAX_DATA_SIZE];
1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int size = propValueList.size();
1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (size > ADDR_MAX_DATA_SIZE) {
1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                size = ADDR_MAX_DATA_SIZE;
1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // adr-value = 0*6(text-value ";") text-value
1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            //           ; PO Box, Extended Address, Street, Locality, Region, Postal
1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            //           ; Code, Country Name
1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            //
1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Use Iterator assuming List may be LinkedList, though actually it is
1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // always ArrayList in the current implementation.
1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int i = 0;
1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String addressElement : propValueList) {
1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                dataArray[i] = addressElement;
1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (++i >= size) {
1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    break;
1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
1754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            while (i < ADDR_MAX_DATA_SIZE) {
1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                dataArray[i++] = null;
1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.pobox = dataArray[0];
1814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.extendedAddress = dataArray[1];
1824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.street = dataArray[2];
1834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.localty = dataArray[3];
1844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.region = dataArray[4];
1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.postalCode = dataArray[5];
1864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.country = dataArray[6];
1874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.label = label;
1884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.isPrimary = isPrimary;
1894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
1924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean equals(Object obj) {
1934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(obj instanceof PostalData)) {
1944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return false;
1954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final PostalData postalData = (PostalData)obj;
1974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (Arrays.equals(dataArray, postalData.dataArray) &&
1984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    (type == postalData.type &&
1994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            (type == StructuredPostal.TYPE_CUSTOM ?
2004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                    (label == postalData.label) : true)) &&
2014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    (isPrimary == postalData.isPrimary));
2024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String getFormattedAddress(final int vcardType) {
2054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            StringBuilder builder = new StringBuilder();
2064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean empty = true;
2074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (VCardConfig.isJapaneseDevice(vcardType)) {
2084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // In Japan, the order is reversed.
2094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (int i = ADDR_MAX_DATA_SIZE - 1; i >= 0; i--) {
2104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    String addressPart = dataArray[i];
2114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (!TextUtils.isEmpty(addressPart)) {
2124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (!empty) {
2134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            builder.append(' ');
2144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        } else {
2154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            empty = false;
2164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
2174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.append(addressPart);
2184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
2194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
2204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
2214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (int i = 0; i < ADDR_MAX_DATA_SIZE; i++) {
2224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    String addressPart = dataArray[i];
2234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (!TextUtils.isEmpty(addressPart)) {
2244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (!empty) {
2254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            builder.append(' ');
2264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        } else {
2274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            empty = false;
2284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
2294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.append(addressPart);
2304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
2314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
2324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
2334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return builder.toString().trim();
2354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
2384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String toString() {
2394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return String.format("type: %d, label: %s, isPrimary: %s",
2404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    type, label, isPrimary);
2414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static class OrganizationData {
2454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int type;
2464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // non-final is Intentional: we may change the values since this info is separated into
2474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // two parts in vCard: "ORG" + "TITLE", and we have to cope with each field in
2484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // different timing.
2494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String companyName;
2504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String departmentName;
2514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String titleName;
2524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean isPrimary;
2534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public OrganizationData(int type,
2554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                String companyName,
2564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                String departmentName,
2574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                String titleName,
2584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                boolean isPrimary) {
2594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.type = type;
2604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.companyName = companyName;
2614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.departmentName = departmentName;
2624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.titleName = titleName;
2634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.isPrimary = isPrimary;
2644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
2674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean equals(Object obj) {
2684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(obj instanceof OrganizationData)) {
2694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return false;
2704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
2714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            OrganizationData organization = (OrganizationData)obj;
2724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (type == organization.type &&
2734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    TextUtils.equals(companyName, organization.companyName) &&
2744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    TextUtils.equals(departmentName, organization.departmentName) &&
2754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    TextUtils.equals(titleName, organization.titleName) &&
2764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    isPrimary == organization.isPrimary);
2774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String getFormattedString() {
2804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final StringBuilder builder = new StringBuilder();
2814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!TextUtils.isEmpty(companyName)) {
2824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.append(companyName);
2834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
2844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!TextUtils.isEmpty(departmentName)) {
2864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (builder.length() > 0) {
2874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(", ");
2884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
2894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.append(departmentName);
2904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
2914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!TextUtils.isEmpty(titleName)) {
2934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (builder.length() > 0) {
2944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(", ");
2954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
2964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.append(titleName);
2974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
2984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return builder.toString();
3004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
3034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String toString() {
3044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return String.format(
3054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "type: %d, company: %s, department: %s, title: %s, isPrimary: %s",
3064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    type, companyName, departmentName, titleName, isPrimary);
3074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static class ImData {
3114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int protocol;
3124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String customProtocol;
3134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int type;
3144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String data;
3154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final boolean isPrimary;
3164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public ImData(final int protocol, final String customProtocol, final int type,
3184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final String data, final boolean isPrimary) {
3194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.protocol = protocol;
3204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.customProtocol = customProtocol;
3214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.type = type;
3224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.data = data;
3234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.isPrimary = isPrimary;
3244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
3274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean equals(Object obj) {
3284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(obj instanceof ImData)) {
3294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return false;
3304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
3314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            ImData imData = (ImData)obj;
3324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (type == imData.type && protocol == imData.protocol
3334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && (customProtocol != null ? customProtocol.equals(imData.customProtocol) :
3344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        (imData.customProtocol == null))
3354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && (data != null ? data.equals(imData.data) : (imData.data == null))
3364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && isPrimary == imData.isPrimary);
3374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
3404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String toString() {
3414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return String.format(
3424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "type: %d, protocol: %d, custom_protcol: %s, data: %s, isPrimary: %s",
3434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    type, protocol, customProtocol, data, isPrimary);
3444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static class PhotoData {
3484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public static final String FORMAT_FLASH = "SWF";
3494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final int type;
3504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final String formatName;  // used when type is not defined in ContactsContract.
3514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final byte[] photoBytes;
3524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final boolean isPrimary;
3534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public PhotoData(int type, String formatName, byte[] photoBytes, boolean isPrimary) {
3554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.type = type;
3564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.formatName = formatName;
3574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.photoBytes = photoBytes;
3584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            this.isPrimary = isPrimary;
3594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
3624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean equals(Object obj) {
3634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(obj instanceof PhotoData)) {
3644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return false;
3654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
3664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            PhotoData photoData = (PhotoData)obj;
3674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (type == photoData.type &&
3684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    (formatName == null ? (photoData.formatName == null) :
3694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            formatName.equals(photoData.formatName)) &&
3704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    (Arrays.equals(photoBytes, photoData.photoBytes)) &&
3714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    (isPrimary == photoData.isPrimary));
3724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        @Override
3754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public String toString() {
3764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return String.format("type: %d, format: %s: size: %d, isPrimary: %s",
3774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    type, formatName, photoBytes.length, isPrimary);
3784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static class Property {
3824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        private String mPropertyName;
3834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        private Map<String, Collection<String>> mParameterMap =
3844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            new HashMap<String, Collection<String>>();
3854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        private List<String> mPropertyValueList = new ArrayList<String>();
3864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        private byte[] mPropertyBytes;
3874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void setPropertyName(final String propertyName) {
3894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPropertyName = propertyName;
3904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
3914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void addParameter(final String paramName, final String paramValue) {
3934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> values;
3944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!mParameterMap.containsKey(paramName)) {
3954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (paramName.equals("TYPE")) {
3964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    values = new HashSet<String>();
3974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else {
3984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    values = new ArrayList<String>();
3994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
4004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                mParameterMap.put(paramName, values);
4014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
4024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                values = mParameterMap.get(paramName);
4034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
4044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            values.add(paramValue);
4054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void addToPropertyValueList(final String propertyValue) {
4084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPropertyValueList.add(propertyValue);
4094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void setPropertyBytes(final byte[] propertyBytes) {
4124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPropertyBytes = propertyBytes;
4134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final Collection<String> getParameters(String type) {
4164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return mParameterMap.get(type);
4174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public final List<String> getPropertyValueList() {
4204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return mPropertyValueList;
4214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void clear() {
4244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPropertyName = null;
4254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mParameterMap.clear();
4264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPropertyValueList.clear();
4274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPropertyBytes = null;
4284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mFamilyName;
4324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mGivenName;
4334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mMiddleName;
4344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mPrefix;
4354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mSuffix;
4364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // Used only when no family nor given name is found.
4384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mFormattedName;
4394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mPhoneticFamilyName;
4414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mPhoneticGivenName;
4424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mPhoneticMiddleName;
4434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mPhoneticFullName;
4454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<String> mNickNameList;
4474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mDisplayName;
4494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String mBirthday;
451c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa    private String mAnniversary;
4524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<String> mNoteList;
4544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<PhoneData> mPhoneList;
4554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<EmailData> mEmailList;
4564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<PostalData> mPostalList;
4574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<OrganizationData> mOrganizationList;
4584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<ImData> mImList;
4594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<PhotoData> mPhotoList;
4604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<String> mWebsiteList;
4614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<List<String>> mAndroidCustomPropertyList;
4624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final int mVCardType;
4644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final Account mAccount;
4654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardEntry() {
4674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        this(VCardConfig.VCARD_TYPE_V21_GENERIC);
4684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardEntry(int vcardType) {
4714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        this(vcardType, null);
4724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardEntry(int vcardType, Account account) {
4754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardType = vcardType;
4764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mAccount = account;
4774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addPhone(int type, String data, String label, boolean isPrimary) {
4804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhoneList == null) {
4814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneList = new ArrayList<PhoneData>();
4824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final StringBuilder builder = new StringBuilder();
4844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String trimed = data.trim();
4854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String formattedNumber;
4864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (type == Phone.TYPE_PAGER || VCardConfig.refrainPhoneNumberFormatting(mVCardType)) {
4874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            formattedNumber = trimed;
4884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
4894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int length = trimed.length();
4904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (int i = 0; i < length; i++) {
4914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                char ch = trimed.charAt(i);
4924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (('0' <= ch && ch <= '9') || (i == 0 && ch == '+')) {
4934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(ch);
4944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
4954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
4964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int formattingType = VCardUtils.getPhoneNumberFormat(mVCardType);
4984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            formattedNumber = PhoneNumberUtils.formatNumber(builder.toString(), formattingType);
4994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        PhoneData phoneData = new PhoneData(type, formattedNumber, label, isPrimary);
5014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mPhoneList.add(phoneData);
5024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addNickName(final String nickName) {
5054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNickNameList == null) {
5064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mNickNameList = new ArrayList<String>();
5074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mNickNameList.add(nickName);
5094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addEmail(int type, String data, String label, boolean isPrimary){
5124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mEmailList == null) {
5134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mEmailList = new ArrayList<EmailData>();
5144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mEmailList.add(new EmailData(type, data, label, isPrimary));
5164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addPostal(int type, List<String> propValueList, String label, boolean isPrimary){
5194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPostalList == null) {
5204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPostalList = new ArrayList<PostalData>(0);
5214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mPostalList.add(new PostalData(type, propValueList, label, isPrimary));
5234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
5264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Should be called via {@link #handleOrgValue(int, List, boolean)} or
5274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * {@link #handleTitleValue(String)}.
5284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
5294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addNewOrganization(int type, final String companyName,
5304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final String departmentName,
5314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final String titleName, boolean isPrimary) {
5324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList == null) {
5334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mOrganizationList = new ArrayList<OrganizationData>();
5344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mOrganizationList.add(new OrganizationData(type, companyName,
5364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName, titleName, isPrimary));
5374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final List<String> sEmptyList =
5404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableList(new ArrayList<String>(0));
5414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
5434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Set "ORG" related values to the appropriate data. If there's more than one
5444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * {@link OrganizationData} objects, this input data are attached to the last one which
5454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * does not have valid values (not including empty but only null). If there's no
5464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * {@link OrganizationData} object, a new {@link OrganizationData} is created,
5474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * whose title is set to null.
5484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
5494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleOrgValue(final int type, List<String> orgList, boolean isPrimary) {
5504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (orgList == null) {
5514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            orgList = sEmptyList;
5524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String companyName;
5544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String departmentName;
5554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final int size = orgList.size();
5564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        switch (size) {
5574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 0: {
5584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                companyName = "";
5594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName = null;
5604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                break;
5614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 1: {
5634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                companyName = orgList.get(0);
5644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName = null;
5654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                break;
5664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            default: {  // More than 1.
5684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                companyName = orgList.get(0);
5694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // We're not sure which is the correct string for department.
5704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // In order to keep all the data, concatinate the rest of elements.
5714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                StringBuilder builder = new StringBuilder();
5724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (int i = 1; i < size; i++) {
5734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (i > 1) {
5744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.append(' ');
5754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
5764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(orgList.get(i));
5774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
5784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName = builder.toString();
5794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList == null) {
5824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Create new first organization entry, with "null" title which may be
5834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // added via handleTitleValue().
5844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNewOrganization(type, companyName, departmentName, null, isPrimary);
5854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
5864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (OrganizationData organizationData : mOrganizationList) {
5884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Not use TextUtils.isEmpty() since ORG was set but the elements might be empty.
5894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // e.g. "ORG;PREF:;" -> Both companyName and departmentName become empty but not null.
5904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (organizationData.companyName == null &&
5914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    organizationData.departmentName == null) {
5924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // Probably the "TITLE" property comes before the "ORG" property via
5934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // handleTitleLine().
5944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.companyName = companyName;
5954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.departmentName = departmentName;
5964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.isPrimary = isPrimary;
5974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
5984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // No OrganizatioData is available. Create another one, with "null" title, which may be
6014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // added via handleTitleValue().
6024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        addNewOrganization(type, companyName, departmentName, null, isPrimary);
6034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
6064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Set "title" value to the appropriate data. If there's more than one
6074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * OrganizationData objects, this input is attached to the last one which does not
6084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * have valid title value (not including empty but only null). If there's no
6094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * OrganizationData object, a new OrganizationData is created, whose company name is
6104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * set to null.
6114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
6124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleTitleValue(final String title) {
6134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList == null) {
6144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Create new first organization entry, with "null" other info, which may be
6154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // added via handleOrgValue().
6164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNewOrganization(DEFAULT_ORGANIZATION_TYPE, null, null, title, false);
6174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (OrganizationData organizationData : mOrganizationList) {
6204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (organizationData.titleName == null) {
6214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.titleName = title;
6224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
6234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
6244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // No Organization is available. Create another one, with "null" other info, which may be
6264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // added via handleOrgValue().
6274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        addNewOrganization(DEFAULT_ORGANIZATION_TYPE, null, null, title, false);
6284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addIm(int protocol, String customProtocol, int type,
6314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String propValue, boolean isPrimary) {
6324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mImList == null) {
6334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mImList = new ArrayList<ImData>();
6344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mImList.add(new ImData(protocol, customProtocol, type, propValue, isPrimary));
6364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addNote(final String note) {
6394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNoteList == null) {
6404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mNoteList = new ArrayList<String>(1);
6414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mNoteList.add(note);
6434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addPhotoBytes(String formatName, byte[] photoBytes, boolean isPrimary) {
6464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhotoList == null) {
6474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhotoList = new ArrayList<PhotoData>(1);
6484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final PhotoData photoData = new PhotoData(0, null, photoBytes, isPrimary);
6504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mPhotoList.add(photoData);
6514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    @SuppressWarnings("fallthrough")
6544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleNProperty(List<String> elems) {
6554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Family, Given, Middle, Prefix, Suffix. (1 - 5)
6564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        int size;
6574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (elems == null || (size = elems.size()) < 1) {
6584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (size > 5) {
6614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            size = 5;
6624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        switch (size) {
6654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // fallthrough
6664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 5: mSuffix = elems.get(4);
6674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 4: mPrefix = elems.get(3);
6684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 3: mMiddleName = elems.get(2);
6694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 2: mGivenName = elems.get(1);
6704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            default: mFamilyName = elems.get(0);
6714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
6754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Note: Some Japanese mobile phones use this field for phonetic name,
6764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     *       since vCard 2.1 does not have "SORT-STRING" type.
6774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     *       Also, in some cases, the field has some ';'s in it.
6784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     *       Assume the ';' means the same meaning in N property
6794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
6804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    @SuppressWarnings("fallthrough")
6814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handlePhoneticNameFromSound(List<String> elems) {
6824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!(TextUtils.isEmpty(mPhoneticFamilyName) &&
6834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                TextUtils.isEmpty(mPhoneticMiddleName) &&
6844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                TextUtils.isEmpty(mPhoneticGivenName))) {
6854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // This means the other properties like "X-PHONETIC-FIRST-NAME" was already found.
6864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Ignore "SOUND;X-IRMC-N".
6874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        int size;
6914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (elems == null || (size = elems.size()) < 1) {
6924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Assume that the order is "Family, Given, Middle".
6964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // This is not from specification but mere assumption. Some Japanese phones use this order.
6974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (size > 3) {
6984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            size = 3;
6994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (elems.get(0).length() > 0) {
7024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean onlyFirstElemIsNonEmpty = true;
7034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (int i = 1; i < size; i++) {
7044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (elems.get(i).length() > 0) {
7054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    onlyFirstElemIsNonEmpty = false;
7064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    break;
7074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
7084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (onlyFirstElemIsNonEmpty) {
7104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final String[] namesArray = elems.get(0).split(" ");
7114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final int nameArrayLength = namesArray.length;
7124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (nameArrayLength == 3) {
7134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    // Assume the string is "Family Middle Given".
7144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFamilyName = namesArray[0];
7154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticMiddleName = namesArray[1];
7164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticGivenName = namesArray[2];
7174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else if (nameArrayLength == 2) {
7184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    // Assume the string is "Family Given" based on the Japanese mobile
7194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    // phones' preference.
7204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFamilyName = namesArray[0];
7214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticGivenName = namesArray[1];
7224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else {
7234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFullName = elems.get(0);
7244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
7254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
7264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        switch (size) {
7304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // fallthrough
7314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 3: mPhoneticMiddleName = elems.get(2);
7324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 2: mPhoneticGivenName = elems.get(1);
7334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            default: mPhoneticFamilyName = elems.get(0);
7344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void addProperty(final Property property) {
7384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String propName = property.mPropertyName;
7394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final Map<String, Collection<String>> paramMap = property.mParameterMap;
7404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final List<String> propValueList = property.mPropertyValueList;
7414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        byte[] propBytes = property.mPropertyBytes;
7424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (propValueList.size() == 0) {
7444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
7454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String propValue = listToString(propValueList).trim();
7474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (propName.equals(VCardConstants.PROPERTY_VERSION)) {
7494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // vCard version. Ignore this.
7504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_FN)) {
7514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mFormattedName = propValue;
7524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_NAME) && mFormattedName == null) {
7534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Only in vCard 3.0. Use this if FN, which must exist in vCard 3.0 but may not
7544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // actually exist in the real vCard data, does not exist.
7554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mFormattedName = propValue;
7564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_N)) {
7574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleNProperty(propValueList);
7584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_SORT_STRING)) {
7594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticFullName = propValue;
7604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_NICKNAME) ||
7614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                propName.equals(VCardConstants.ImportOnly.PROPERTY_X_NICKNAME)) {
7624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNickName(propValue);
7634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_SOUND)) {
7644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
7654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null
7664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && typeCollection.contains(VCardConstants.PARAM_TYPE_X_IRMC_N)) {
7674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // As of 2009-10-08, Parser side does not split a property value into separated
7684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // values using ';' (in other words, propValueList.size() == 1),
7694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // which is correct behavior from the view of vCard 2.1.
7704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // But we want it to be separated, so do the separation here.
7714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final List<String> phoneticNameList =
7724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardUtils.constructListFromValue(propValue,
773be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa                                VCardConfig.isVersion30(mVCardType));
7744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                handlePhoneticNameFromSound(phoneticNameList);
7754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
7764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // Ignore this field since Android cannot understand what it is.
7774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ADR)) {
7794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean valuesAreAllEmpty = true;
7804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String value : propValueList) {
7814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (value.length() > 0) {
7824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    valuesAreAllEmpty = false;
7834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    break;
7844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
7854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (valuesAreAllEmpty) {
7874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
7884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int type = -1;
7914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String label = "";
7924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
7934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
7944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
7954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
7964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    typeString = typeString.toUpperCase();
7974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
7984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
7994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_HOME)) {
8004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = StructuredPostal.TYPE_HOME;
8014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = "";
8024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_WORK) ||
8034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString.equalsIgnoreCase(VCardConstants.PARAM_EXTRA_TYPE_COMPANY)) {
8044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // "COMPANY" seems emitted by Windows Mobile, which is not
8054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // specifically supported by vCard 2.1. We assume this is same
8064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // as "WORK".
8074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = StructuredPostal.TYPE_WORK;
8084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = "";
8094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_ADR_TYPE_PARCEL) ||
8104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString.equals(VCardConstants.PARAM_ADR_TYPE_DOM) ||
8114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString.equals(VCardConstants.PARAM_ADR_TYPE_INTL)) {
8124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // We do not have any appropriate way to store this information.
8134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else {
8144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (typeString.startsWith("X-") && type < 0) {
8154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString = typeString.substring(2);
8164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
8174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // vCard 3.0 allows iana-token. Also some vCard 2.1 exporters
8184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // emit non-standard types. We do not handle their values now.
8194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = StructuredPostal.TYPE_CUSTOM;
8204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = typeString;
8214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // We use "HOME" as default
8254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (type < 0) {
8264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = StructuredPostal.TYPE_HOME;
8274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addPostal(type, propValueList, label, isPrimary);
8304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_EMAIL)) {
8314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int type = -1;
8324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String label = null;
8334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
8344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
8354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
8364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
8374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    typeString = typeString.toUpperCase();
8384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
8394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
8404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_HOME)) {
8414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_HOME;
8424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_WORK)) {
8434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_WORK;
8444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_CELL)) {
8454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_MOBILE;
8464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else {
8474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (typeString.startsWith("X-") && type < 0) {
8484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString = typeString.substring(2);
8494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
8504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // vCard 3.0 allows iana-token.
8514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // We may have INTERNET (specified in vCard spec),
8524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // SCHOOL, etc.
8534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_CUSTOM;
8544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = typeString;
8554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (type < 0) {
8594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = Email.TYPE_OTHER;
8604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addEmail(type, propValue, label, isPrimary);
8624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ORG)) {
8634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // vCard specification does not specify other types.
8644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int type = Organization.TYPE_WORK;
8654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
8664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
8674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
8684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
8694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
8704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
8714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleOrgValue(type, propValueList, isPrimary);
8754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_TITLE)) {
8764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleTitleValue(propValue);
8774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ROLE)) {
8784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // This conflicts with TITLE. Ignore for now...
8794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // handleTitleValue(propValue);
8804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_PHOTO) ||
8814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                propName.equals(VCardConstants.PROPERTY_LOGO)) {
8824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> paramMapValue = paramMap.get("VALUE");
8834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (paramMapValue != null && paramMapValue.contains("URL")) {
8844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // Currently we do not have appropriate example for testing this case.
8854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
8864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final Collection<String> typeCollection = paramMap.get("TYPE");
8874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                String formatName = null;
8884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                boolean isPrimary = false;
8894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (typeCollection != null) {
8904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    for (String typeValue : typeCollection) {
8914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (VCardConstants.PARAM_TYPE_PREF.equals(typeValue)) {
8924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            isPrimary = true;
8934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        } else if (formatName == null){
8944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            formatName = typeValue;
8954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
8964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                addPhotoBytes(formatName, propBytes, isPrimary);
8994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_TEL)) {
9014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
9024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final Object typeObject =
9034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                VCardUtils.getPhoneTypeFromStrings(typeCollection, propValue);
9044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int type;
9054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final String label;
9064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeObject instanceof Integer) {
9074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = (Integer)typeObject;
9084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                label = null;
9094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
9104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = Phone.TYPE_CUSTOM;
9114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                label = typeObject.toString();
9124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final boolean isPrimary;
9154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null && typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
9164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = true;
9174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
9184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = false;
9194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addPhone(type, propValue, label, isPrimary);
9214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_SKYPE_PSTNNUMBER)) {
9224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // The phone number available via Skype.
9234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
9244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int type = Phone.TYPE_OTHER;
9254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final boolean isPrimary;
9264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null && typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
9274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = true;
9284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
9294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = false;
9304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addPhone(type, propValue, null, isPrimary);
9324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (sImMap.containsKey(propName)) {
9334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int protocol = sImMap.get(propName);
9344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
9354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int type = -1;
9364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
9374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
9384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
9394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
9404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
9414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (type < 0) {
9424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_HOME)) {
9434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            type = Im.TYPE_HOME;
9444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        } else if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_WORK)) {
9454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            type = Im.TYPE_WORK;
9464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
9474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
9484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
9494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (type < 0) {
9514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = Phone.TYPE_HOME;
9524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addIm(protocol, null, type, propValue, isPrimary);
9544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_NOTE)) {
9554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNote(propValue);
9564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_URL)) {
9574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (mWebsiteList == null) {
9584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                mWebsiteList = new ArrayList<String>(1);
9594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mWebsiteList.add(propValue);
9614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_BDAY)) {
9624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mBirthday = propValue;
963c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ANNIVERSARY)) {
964c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            mAnniversary = propValue;
9654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_FIRST_NAME)) {
9664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticGivenName = propValue;
9674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_MIDDLE_NAME)) {
9684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticMiddleName = propValue;
9694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_LAST_NAME)) {
9704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticFamilyName = propValue;
9714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_ANDROID_CUSTOM)) {
9724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final List<String> customPropertyList =
9734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                VCardUtils.constructListFromValue(propValue,
974be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa                        VCardConfig.isVersion30(mVCardType));
9754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleAndroidCustomProperty(customPropertyList);
9764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
9774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
9784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleAndroidCustomProperty(final List<String> customPropertyList) {
9814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mAndroidCustomPropertyList == null) {
9824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mAndroidCustomPropertyList = new ArrayList<List<String>>();
9834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
9844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mAndroidCustomPropertyList.add(customPropertyList);
9854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
9884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Construct the display name. The constructed data must not be null.
9894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
9904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void constructDisplayName() {
9914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // FullName (created via "FN" or "NAME" field) is prefered.
9924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!TextUtils.isEmpty(mFormattedName)) {
9934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mFormattedName;
9944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (!(TextUtils.isEmpty(mFamilyName) && TextUtils.isEmpty(mGivenName))) {
9954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = VCardUtils.constructNameFromElements(mVCardType,
9964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mFamilyName, mMiddleName, mGivenName, mPrefix, mSuffix);
9974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (!(TextUtils.isEmpty(mPhoneticFamilyName) &&
9984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                TextUtils.isEmpty(mPhoneticGivenName))) {
9994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = VCardUtils.constructNameFromElements(mVCardType,
10004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFamilyName, mPhoneticMiddleName, mPhoneticGivenName);
10014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mEmailList != null && mEmailList.size() > 0) {
10024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mEmailList.get(0).data;
10034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mPhoneList != null && mPhoneList.size() > 0) {
10044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mPhoneList.get(0).data;
10054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mPostalList != null && mPostalList.size() > 0) {
10064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mPostalList.get(0).getFormattedAddress(mVCardType);
10074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mOrganizationList != null && mOrganizationList.size() > 0) {
10084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mOrganizationList.get(0).getFormattedString();
10094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mDisplayName == null) {
10124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = "";
10134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
10154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
10174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Consolidate several fielsds (like mName) using name candidates,
10184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
10194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void consolidateFields() {
10204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        constructDisplayName();
10214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhoneticFullName != null) {
10234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticFullName = mPhoneticFullName.trim();
10244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
10264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public Uri pushIntoContentResolver(ContentResolver resolver) {
10284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ArrayList<ContentProviderOperation> operationList =
10294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            new ArrayList<ContentProviderOperation>();
10304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // After applying the batch the first result's Uri is returned so it is important that
10314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // the RawContact is the first operation that gets inserted into the list
10324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContentProviderOperation.Builder builder =
10334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
10344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        String myGroupsId = null;
10354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mAccount != null) {
10364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_NAME, mAccount.name);
10374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_TYPE, mAccount.type);
10384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
10394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_NAME, null);
10404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_TYPE, null);
10414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        operationList.add(builder.build());
10434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!nameFieldsAreEmpty()) {
10454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
10464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
10474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
10484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.GIVEN_NAME, mGivenName);
10504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.FAMILY_NAME, mFamilyName);
10514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.MIDDLE_NAME, mMiddleName);
10524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.PREFIX, mPrefix);
10534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.SUFFIX, mSuffix);
10544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(TextUtils.isEmpty(mPhoneticGivenName)
10564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && TextUtils.isEmpty(mPhoneticFamilyName)
10574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && TextUtils.isEmpty(mPhoneticMiddleName))) {
10584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_GIVEN_NAME, mPhoneticGivenName);
10594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_FAMILY_NAME, mPhoneticFamilyName);
10604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_MIDDLE_NAME, mPhoneticMiddleName);
10614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else if (!TextUtils.isEmpty(mPhoneticFullName)) {
10624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_GIVEN_NAME, mPhoneticFullName);
10634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
10644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.DISPLAY_NAME, getDisplayName());
10664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            operationList.add(builder.build());
10674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNickNameList != null && mNickNameList.size() > 0) {
10704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String nickName : mNickNameList) {
10714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
10724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Nickname.RAW_CONTACT_ID, 0);
10734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);
10744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Nickname.TYPE, Nickname.TYPE_DEFAULT);
10754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Nickname.NAME, nickName);
10764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
10774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
10784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhoneList != null) {
10814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (PhoneData phoneData : mPhoneList) {
10824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
10834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
10844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
10854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Phone.TYPE, phoneData.type);
10874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (phoneData.type == Phone.TYPE_CUSTOM) {
10884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Phone.LABEL, phoneData.label);
10894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
10904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Phone.NUMBER, phoneData.data);
10914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (phoneData.isPrimary) {
10924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Phone.IS_PRIMARY, 1);
10934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
10944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
10954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
10964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList != null) {
10994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (OrganizationData organizationData : mOrganizationList) {
11004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Organization.RAW_CONTACT_ID, 0);
11024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
11034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Organization.TYPE, organizationData.type);
11044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.companyName != null) {
11054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.COMPANY, organizationData.companyName);
11064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.departmentName != null) {
11084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.DEPARTMENT, organizationData.departmentName);
11094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.titleName != null) {
11114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.TITLE, organizationData.titleName);
11124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.isPrimary) {
11144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.IS_PRIMARY, 1);
11154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mEmailList != null) {
11214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (EmailData emailData : mEmailList) {
11224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Email.RAW_CONTACT_ID, 0);
11244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
11254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Email.TYPE, emailData.type);
11274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (emailData.type == Email.TYPE_CUSTOM) {
11284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Email.LABEL, emailData.label);
11294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Email.DATA, emailData.data);
11314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (emailData.isPrimary) {
11324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Data.IS_PRIMARY, 1);
11334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPostalList != null) {
11394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (PostalData postalData : mPostalList) {
11404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                VCardUtils.insertStructuredPostalDataUsingContactsStruct(
11424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        mVCardType, builder, postalData);
11434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mImList != null) {
11484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (ImData imData : mImList) {
11494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Im.RAW_CONTACT_ID, 0);
11514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
11524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Im.TYPE, imData.type);
11534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Im.PROTOCOL, imData.protocol);
11544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (imData.protocol == Im.PROTOCOL_CUSTOM) {
11554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Im.CUSTOM_PROTOCOL, imData.customProtocol);
11564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (imData.isPrimary) {
11584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Data.IS_PRIMARY, 1);
11594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNoteList != null) {
11644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String note : mNoteList) {
11654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Note.RAW_CONTACT_ID, 0);
11674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
11684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Note.NOTE, note);
11694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhotoList != null) {
11744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (PhotoData photoData : mPhotoList) {
11754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Photo.RAW_CONTACT_ID, 0);
11774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Photo.PHOTO, photoData.photoBytes);
11794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (photoData.isPrimary) {
11804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Photo.IS_PRIMARY, 1);
11814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mWebsiteList != null) {
11874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String website : mWebsiteList) {
11884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Website.RAW_CONTACT_ID, 0);
11904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Website.CONTENT_ITEM_TYPE);
11914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Website.URL, website);
11924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // There's no information about the type of URL in vCard.
11934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // We use TYPE_HOMEPAGE for safety.
11944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Website.TYPE, Website.TYPE_HOMEPAGE);
11954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!TextUtils.isEmpty(mBirthday)) {
12004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValueBackReference(Event.RAW_CONTACT_ID, 0);
12024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
12034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Event.START_DATE, mBirthday);
12044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Event.TYPE, Event.TYPE_BIRTHDAY);
12054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            operationList.add(builder.build());
12064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1208c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa        if (!TextUtils.isEmpty(mAnniversary)) {
1209c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
1210c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            builder.withValueBackReference(Event.RAW_CONTACT_ID, 0);
1211c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
1212c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            builder.withValue(Event.START_DATE, mBirthday);
1213c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            builder.withValue(Event.TYPE, Event.TYPE_ANNIVERSARY);
1214c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa            operationList.add(builder.build());
1215c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa        }
1216c13101ba38c929d91dcb68e21165c82c19af35d7Daisuke Miyakawa
12174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mAndroidCustomPropertyList != null) {
12184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (List<String> customPropertyList : mAndroidCustomPropertyList) {
12194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                int size = customPropertyList.size();
12204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (size < 2 || TextUtils.isEmpty(customPropertyList.get(0))) {
12214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    continue;
12224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else if (size > VCardConstants.MAX_DATA_COLUMN + 1) {
12234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    size = VCardConstants.MAX_DATA_COLUMN + 1;
12244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    customPropertyList =
12254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        customPropertyList.subList(0, VCardConstants.MAX_DATA_COLUMN + 2);
12264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
12274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                int i = 0;
12294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (final String customPropertyValue : customPropertyList) {
12304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (i == 0) {
12314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        final String mimeType = customPropertyValue;
12324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0);
12344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.withValue(Data.MIMETYPE, mimeType);
12354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else {  // 1 <= i && i <= MAX_DATA_COLUMNS
12364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (!TextUtils.isEmpty(customPropertyValue)) {
12374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            builder.withValue("data" + i, customPropertyValue);
12384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
12394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
12404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    i++;
12424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
12434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
12444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
12454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (myGroupsId != null) {
12484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0);
12504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
12514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(GroupMembership.GROUP_SOURCE_ID, myGroupsId);
12524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            operationList.add(builder.build());
12534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        try {
12564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            ContentProviderResult[] results = resolver.applyBatch(
12574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        ContactsContract.AUTHORITY, operationList);
12584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // the first result is always the raw_contact. return it's uri so
12594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // that it can be found later. do null checking for badly behaving
12604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // ContentResolvers
12614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (results == null || results.length == 0 || results[0] == null)
12624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                ? null
12634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                : results[0].uri;
12644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } catch (RemoteException e) {
12654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage()));
12664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return null;
12674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } catch (OperationApplicationException e) {
12684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage()));
12694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return null;
12704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static VCardEntry buildFromResolver(ContentResolver resolver) {
12744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return buildFromResolver(resolver, Contacts.CONTENT_URI);
12754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static VCardEntry buildFromResolver(ContentResolver resolver, Uri uri) {
12784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return null;
12804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private boolean nameFieldsAreEmpty() {
12834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return (TextUtils.isEmpty(mFamilyName)
12844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mMiddleName)
12854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mGivenName)
12864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPrefix)
12874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mSuffix)
12884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mFormattedName)
12894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticFamilyName)
12904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticMiddleName)
12914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticGivenName)
12924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticFullName));
12934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public boolean isIgnorable() {
12964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return getDisplayName().length() == 0;
12974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String listToString(List<String> list){
13004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final int size = list.size();
13014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (size > 1) {
13024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            StringBuilder builder = new StringBuilder();
13034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int i = 0;
13044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String type : list) {
13054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.append(type);
13064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (i < size - 1) {
13074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(";");
13084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
13094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
13104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return builder.toString();
13114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (size == 1) {
13124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return list.get(0);
13134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
13144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return "";
13154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
13164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // All getter methods should be used carefully, since they may change
13194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // in the future as of 2009-10-05, on which I cannot be sure this structure
13204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // is completely consolidated.
13214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    //
13224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // Also note that these getter methods should be used only after
13234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // all properties being pushed into this object. If not, incorrect
13244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // value will "be stored in the local cache and" be returned to you.
13254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getFamilyName() {
13274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mFamilyName;
13284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getGivenName() {
13314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mGivenName;
13324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getMiddleName() {
13354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mMiddleName;
13364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPrefix() {
13394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPrefix;
13404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getSuffix() {
13434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mSuffix;
13444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getFullName() {
13474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mFormattedName;
13484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticFamilyName() {
13514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticFamilyName;
13524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticGivenName() {
13554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticGivenName;
13564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticMiddleName() {
13594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticMiddleName;
13604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticFullName() {
13634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticFullName;
13644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<String> getNickNameList() {
13674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mNickNameList;
13684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getBirthday() {
13714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mBirthday;
13724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<String> getNotes() {
13754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mNoteList;
13764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<PhoneData> getPhoneList() {
13794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneList;
13804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<EmailData> getEmailList() {
13834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mEmailList;
13844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<PostalData> getPostalList() {
13874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPostalList;
13884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<OrganizationData> getOrganizationList() {
13914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mOrganizationList;
13924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<ImData> getImList() {
13954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mImList;
13964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<PhotoData> getPhotoList() {
13994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhotoList;
14004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<String> getWebsiteList() {
14034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mWebsiteList;
14044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getDisplayName() {
14074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mDisplayName == null) {
14084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            constructDisplayName();
14094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
14104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mDisplayName;
14114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1413