VCardEntry.java revision 4199c54c527330ac01699b176e7bca186a3aa3a4
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;
4514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<String> mNoteList;
4534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<PhoneData> mPhoneList;
4544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<EmailData> mEmailList;
4554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<PostalData> mPostalList;
4564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<OrganizationData> mOrganizationList;
4574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<ImData> mImList;
4584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<PhotoData> mPhotoList;
4594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<String> mWebsiteList;
4604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private List<List<String>> mAndroidCustomPropertyList;
4614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final int mVCardType;
4634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final Account mAccount;
4644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardEntry() {
4664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        this(VCardConfig.VCARD_TYPE_V21_GENERIC);
4674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardEntry(int vcardType) {
4704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        this(vcardType, null);
4714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardEntry(int vcardType, Account account) {
4744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardType = vcardType;
4754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mAccount = account;
4764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addPhone(int type, String data, String label, boolean isPrimary) {
4794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhoneList == null) {
4804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneList = new ArrayList<PhoneData>();
4814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final StringBuilder builder = new StringBuilder();
4834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String trimed = data.trim();
4844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String formattedNumber;
4854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (type == Phone.TYPE_PAGER || VCardConfig.refrainPhoneNumberFormatting(mVCardType)) {
4864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            formattedNumber = trimed;
4874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
4884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int length = trimed.length();
4894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (int i = 0; i < length; i++) {
4904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                char ch = trimed.charAt(i);
4914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (('0' <= ch && ch <= '9') || (i == 0 && ch == '+')) {
4924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(ch);
4934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
4944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
4954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int formattingType = VCardUtils.getPhoneNumberFormat(mVCardType);
4974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            formattedNumber = PhoneNumberUtils.formatNumber(builder.toString(), formattingType);
4984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        PhoneData phoneData = new PhoneData(type, formattedNumber, label, isPrimary);
5004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mPhoneList.add(phoneData);
5014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addNickName(final String nickName) {
5044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNickNameList == null) {
5054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mNickNameList = new ArrayList<String>();
5064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mNickNameList.add(nickName);
5084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addEmail(int type, String data, String label, boolean isPrimary){
5114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mEmailList == null) {
5124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mEmailList = new ArrayList<EmailData>();
5134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mEmailList.add(new EmailData(type, data, label, isPrimary));
5154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addPostal(int type, List<String> propValueList, String label, boolean isPrimary){
5184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPostalList == null) {
5194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPostalList = new ArrayList<PostalData>(0);
5204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mPostalList.add(new PostalData(type, propValueList, label, isPrimary));
5224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
5254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Should be called via {@link #handleOrgValue(int, List, boolean)} or
5264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * {@link #handleTitleValue(String)}.
5274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
5284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addNewOrganization(int type, final String companyName,
5294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final String departmentName,
5304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final String titleName, boolean isPrimary) {
5314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList == null) {
5324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mOrganizationList = new ArrayList<OrganizationData>();
5334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mOrganizationList.add(new OrganizationData(type, companyName,
5354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName, titleName, isPrimary));
5364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final List<String> sEmptyList =
5394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableList(new ArrayList<String>(0));
5404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
5424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Set "ORG" related values to the appropriate data. If there's more than one
5434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * {@link OrganizationData} objects, this input data are attached to the last one which
5444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * does not have valid values (not including empty but only null). If there's no
5454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * {@link OrganizationData} object, a new {@link OrganizationData} is created,
5464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * whose title is set to null.
5474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
5484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleOrgValue(final int type, List<String> orgList, boolean isPrimary) {
5494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (orgList == null) {
5504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            orgList = sEmptyList;
5514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String companyName;
5534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String departmentName;
5544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final int size = orgList.size();
5554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        switch (size) {
5564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 0: {
5574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                companyName = "";
5584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName = null;
5594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                break;
5604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 1: {
5624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                companyName = orgList.get(0);
5634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName = null;
5644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                break;
5654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            default: {  // More than 1.
5674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                companyName = orgList.get(0);
5684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // We're not sure which is the correct string for department.
5694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // In order to keep all the data, concatinate the rest of elements.
5704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                StringBuilder builder = new StringBuilder();
5714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (int i = 1; i < size; i++) {
5724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (i > 1) {
5734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.append(' ');
5744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
5754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(orgList.get(i));
5764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
5774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                departmentName = builder.toString();
5784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList == null) {
5814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Create new first organization entry, with "null" title which may be
5824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // added via handleTitleValue().
5834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNewOrganization(type, companyName, departmentName, null, isPrimary);
5844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
5854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (OrganizationData organizationData : mOrganizationList) {
5874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Not use TextUtils.isEmpty() since ORG was set but the elements might be empty.
5884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // e.g. "ORG;PREF:;" -> Both companyName and departmentName become empty but not null.
5894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (organizationData.companyName == null &&
5904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    organizationData.departmentName == null) {
5914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // Probably the "TITLE" property comes before the "ORG" property via
5924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // handleTitleLine().
5934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.companyName = companyName;
5944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.departmentName = departmentName;
5954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.isPrimary = isPrimary;
5964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
5974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
5984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
5994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // No OrganizatioData is available. Create another one, with "null" title, which may be
6004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // added via handleTitleValue().
6014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        addNewOrganization(type, companyName, departmentName, null, isPrimary);
6024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
6054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Set "title" value to the appropriate data. If there's more than one
6064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * OrganizationData objects, this input is attached to the last one which does not
6074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * have valid title value (not including empty but only null). If there's no
6084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * OrganizationData object, a new OrganizationData is created, whose company name is
6094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * set to null.
6104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
6114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleTitleValue(final String title) {
6124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList == null) {
6134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Create new first organization entry, with "null" other info, which may be
6144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // added via handleOrgValue().
6154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNewOrganization(DEFAULT_ORGANIZATION_TYPE, null, null, title, false);
6164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (OrganizationData organizationData : mOrganizationList) {
6194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (organizationData.titleName == null) {
6204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                organizationData.titleName = title;
6214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
6224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
6234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // No Organization is available. Create another one, with "null" other info, which may be
6254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // added via handleOrgValue().
6264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        addNewOrganization(DEFAULT_ORGANIZATION_TYPE, null, null, title, false);
6274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addIm(int protocol, String customProtocol, int type,
6304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String propValue, boolean isPrimary) {
6314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mImList == null) {
6324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mImList = new ArrayList<ImData>();
6334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mImList.add(new ImData(protocol, customProtocol, type, propValue, isPrimary));
6354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addNote(final String note) {
6384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNoteList == null) {
6394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mNoteList = new ArrayList<String>(1);
6404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mNoteList.add(note);
6424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void addPhotoBytes(String formatName, byte[] photoBytes, boolean isPrimary) {
6454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhotoList == null) {
6464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhotoList = new ArrayList<PhotoData>(1);
6474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final PhotoData photoData = new PhotoData(0, null, photoBytes, isPrimary);
6494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mPhotoList.add(photoData);
6504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    @SuppressWarnings("fallthrough")
6534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleNProperty(List<String> elems) {
6544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Family, Given, Middle, Prefix, Suffix. (1 - 5)
6554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        int size;
6564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (elems == null || (size = elems.size()) < 1) {
6574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (size > 5) {
6604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            size = 5;
6614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        switch (size) {
6644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // fallthrough
6654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 5: mSuffix = elems.get(4);
6664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 4: mPrefix = elems.get(3);
6674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 3: mMiddleName = elems.get(2);
6684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 2: mGivenName = elems.get(1);
6694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            default: mFamilyName = elems.get(0);
6704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
6744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Note: Some Japanese mobile phones use this field for phonetic name,
6754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     *       since vCard 2.1 does not have "SORT-STRING" type.
6764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     *       Also, in some cases, the field has some ';'s in it.
6774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     *       Assume the ';' means the same meaning in N property
6784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
6794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    @SuppressWarnings("fallthrough")
6804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handlePhoneticNameFromSound(List<String> elems) {
6814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!(TextUtils.isEmpty(mPhoneticFamilyName) &&
6824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                TextUtils.isEmpty(mPhoneticMiddleName) &&
6834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                TextUtils.isEmpty(mPhoneticGivenName))) {
6844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // This means the other properties like "X-PHONETIC-FIRST-NAME" was already found.
6854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Ignore "SOUND;X-IRMC-N".
6864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        int size;
6904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (elems == null || (size = elems.size()) < 1) {
6914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
6924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Assume that the order is "Family, Given, Middle".
6954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // This is not from specification but mere assumption. Some Japanese phones use this order.
6964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (size > 3) {
6974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            size = 3;
6984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
6994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (elems.get(0).length() > 0) {
7014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean onlyFirstElemIsNonEmpty = true;
7024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (int i = 1; i < size; i++) {
7034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (elems.get(i).length() > 0) {
7044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    onlyFirstElemIsNonEmpty = false;
7054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    break;
7064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
7074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (onlyFirstElemIsNonEmpty) {
7094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final String[] namesArray = elems.get(0).split(" ");
7104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final int nameArrayLength = namesArray.length;
7114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (nameArrayLength == 3) {
7124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    // Assume the string is "Family Middle Given".
7134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFamilyName = namesArray[0];
7144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticMiddleName = namesArray[1];
7154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticGivenName = namesArray[2];
7164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else if (nameArrayLength == 2) {
7174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    // Assume the string is "Family Given" based on the Japanese mobile
7184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    // phones' preference.
7194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFamilyName = namesArray[0];
7204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticGivenName = namesArray[1];
7214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else {
7224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFullName = elems.get(0);
7234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
7244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
7254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        switch (size) {
7294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // fallthrough
7304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 3: mPhoneticMiddleName = elems.get(2);
7314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            case 2: mPhoneticGivenName = elems.get(1);
7324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            default: mPhoneticFamilyName = elems.get(0);
7334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void addProperty(final Property property) {
7374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String propName = property.mPropertyName;
7384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final Map<String, Collection<String>> paramMap = property.mParameterMap;
7394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final List<String> propValueList = property.mPropertyValueList;
7404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        byte[] propBytes = property.mPropertyBytes;
7414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (propValueList.size() == 0) {
7434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return;
7444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
7454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String propValue = listToString(propValueList).trim();
7464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (propName.equals(VCardConstants.PROPERTY_VERSION)) {
7484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // vCard version. Ignore this.
7494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_FN)) {
7504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mFormattedName = propValue;
7514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_NAME) && mFormattedName == null) {
7524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Only in vCard 3.0. Use this if FN, which must exist in vCard 3.0 but may not
7534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // actually exist in the real vCard data, does not exist.
7544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mFormattedName = propValue;
7554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_N)) {
7564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleNProperty(propValueList);
7574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_SORT_STRING)) {
7584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticFullName = propValue;
7594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_NICKNAME) ||
7604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                propName.equals(VCardConstants.ImportOnly.PROPERTY_X_NICKNAME)) {
7614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNickName(propValue);
7624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_SOUND)) {
7634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
7644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null
7654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && typeCollection.contains(VCardConstants.PARAM_TYPE_X_IRMC_N)) {
7664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // As of 2009-10-08, Parser side does not split a property value into separated
7674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // values using ';' (in other words, propValueList.size() == 1),
7684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // which is correct behavior from the view of vCard 2.1.
7694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // But we want it to be separated, so do the separation here.
7704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final List<String> phoneticNameList =
7714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardUtils.constructListFromValue(propValue,
7724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                VCardConfig.isV30(mVCardType));
7734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                handlePhoneticNameFromSound(phoneticNameList);
7744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
7754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // Ignore this field since Android cannot understand what it is.
7764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ADR)) {
7784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean valuesAreAllEmpty = true;
7794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String value : propValueList) {
7804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (value.length() > 0) {
7814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    valuesAreAllEmpty = false;
7824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    break;
7834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
7844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (valuesAreAllEmpty) {
7864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return;
7874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
7884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int type = -1;
7904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String label = "";
7914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
7924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
7934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
7944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
7954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    typeString = typeString.toUpperCase();
7964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
7974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
7984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_HOME)) {
7994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = StructuredPostal.TYPE_HOME;
8004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = "";
8014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_WORK) ||
8024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString.equalsIgnoreCase(VCardConstants.PARAM_EXTRA_TYPE_COMPANY)) {
8034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // "COMPANY" seems emitted by Windows Mobile, which is not
8044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // specifically supported by vCard 2.1. We assume this is same
8054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // as "WORK".
8064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = StructuredPostal.TYPE_WORK;
8074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = "";
8084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_ADR_TYPE_PARCEL) ||
8094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString.equals(VCardConstants.PARAM_ADR_TYPE_DOM) ||
8104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString.equals(VCardConstants.PARAM_ADR_TYPE_INTL)) {
8114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // We do not have any appropriate way to store this information.
8124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else {
8134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (typeString.startsWith("X-") && type < 0) {
8144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString = typeString.substring(2);
8154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
8164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // vCard 3.0 allows iana-token. Also some vCard 2.1 exporters
8174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // emit non-standard types. We do not handle their values now.
8184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = StructuredPostal.TYPE_CUSTOM;
8194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = typeString;
8204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // We use "HOME" as default
8244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (type < 0) {
8254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = StructuredPostal.TYPE_HOME;
8264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addPostal(type, propValueList, label, isPrimary);
8294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_EMAIL)) {
8304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int type = -1;
8314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String label = null;
8324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
8334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
8344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
8354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
8364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    typeString = typeString.toUpperCase();
8374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
8384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
8394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_HOME)) {
8404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_HOME;
8414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_WORK)) {
8424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_WORK;
8434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (typeString.equals(VCardConstants.PARAM_TYPE_CELL)) {
8444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_MOBILE;
8454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else {
8464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (typeString.startsWith("X-") && type < 0) {
8474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            typeString = typeString.substring(2);
8484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
8494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // vCard 3.0 allows iana-token.
8504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // We may have INTERNET (specified in vCard spec),
8514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        // SCHOOL, etc.
8524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        type = Email.TYPE_CUSTOM;
8534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        label = typeString;
8544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (type < 0) {
8584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = Email.TYPE_OTHER;
8594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addEmail(type, propValue, label, isPrimary);
8614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ORG)) {
8624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // vCard specification does not specify other types.
8634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int type = Organization.TYPE_WORK;
8644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
8654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
8664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
8674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
8684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
8694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
8704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleOrgValue(type, propValueList, isPrimary);
8744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_TITLE)) {
8754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleTitleValue(propValue);
8764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_ROLE)) {
8774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // This conflicts with TITLE. Ignore for now...
8784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // handleTitleValue(propValue);
8794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_PHOTO) ||
8804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                propName.equals(VCardConstants.PROPERTY_LOGO)) {
8814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> paramMapValue = paramMap.get("VALUE");
8824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (paramMapValue != null && paramMapValue.contains("URL")) {
8834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // Currently we do not have appropriate example for testing this case.
8844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
8854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                final Collection<String> typeCollection = paramMap.get("TYPE");
8864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                String formatName = null;
8874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                boolean isPrimary = false;
8884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (typeCollection != null) {
8894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    for (String typeValue : typeCollection) {
8904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (VCardConstants.PARAM_TYPE_PREF.equals(typeValue)) {
8914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            isPrimary = true;
8924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        } else if (formatName == null){
8934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            formatName = typeValue;
8944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
8954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
8964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
8974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                addPhotoBytes(formatName, propBytes, isPrimary);
8984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
8994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_TEL)) {
9004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
9014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final Object typeObject =
9024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                VCardUtils.getPhoneTypeFromStrings(typeCollection, propValue);
9034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int type;
9044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final String label;
9054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeObject instanceof Integer) {
9064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = (Integer)typeObject;
9074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                label = null;
9084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
9094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = Phone.TYPE_CUSTOM;
9104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                label = typeObject.toString();
9114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final boolean isPrimary;
9144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null && typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
9154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = true;
9164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
9174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = false;
9184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addPhone(type, propValue, label, isPrimary);
9204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_SKYPE_PSTNNUMBER)) {
9214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // The phone number available via Skype.
9224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
9234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int type = Phone.TYPE_OTHER;
9244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final boolean isPrimary;
9254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null && typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
9264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = true;
9274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else {
9284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                isPrimary = false;
9294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addPhone(type, propValue, null, isPrimary);
9314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (sImMap.containsKey(propName)) {
9324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final int protocol = sImMap.get(propName);
9334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            boolean isPrimary = false;
9344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int type = -1;
9354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
9364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (typeCollection != null) {
9374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (String typeString : typeCollection) {
9384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
9394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        isPrimary = true;
9404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else if (type < 0) {
9414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_HOME)) {
9424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            type = Im.TYPE_HOME;
9434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        } else if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_WORK)) {
9444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            type = Im.TYPE_WORK;
9454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
9464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
9474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
9484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (type < 0) {
9504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                type = Phone.TYPE_HOME;
9514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addIm(protocol, null, type, propValue, isPrimary);
9534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_NOTE)) {
9544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            addNote(propValue);
9554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_URL)) {
9564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (mWebsiteList == null) {
9574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                mWebsiteList = new ArrayList<String>(1);
9584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
9594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mWebsiteList.add(propValue);
9604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_BDAY)) {
9614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mBirthday = propValue;
9624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_FIRST_NAME)) {
9634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticGivenName = propValue;
9644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_MIDDLE_NAME)) {
9654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticMiddleName = propValue;
9664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_LAST_NAME)) {
9674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticFamilyName = propValue;
9684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals(VCardConstants.PROPERTY_X_ANDROID_CUSTOM)) {
9694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final List<String> customPropertyList =
9704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                VCardUtils.constructListFromValue(propValue,
9714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardConfig.isV30(mVCardType));
9724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            handleAndroidCustomProperty(customPropertyList);
9734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        /*} else if (propName.equals("REV")) {
9744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Revision of this VCard entry. I think we can ignore this.
9754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("UID")) {
9764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("KEY")) {
9774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Type is X509 or PGP? I don't know how to handle this...
9784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("MAILER")) {
9794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("TZ")) {
9804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("GEO")) {
9814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("CLASS")) {
9824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // vCard 3.0 only.
9834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // e.g. CLASS:CONFIDENTIAL
9844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("PROFILE")) {
9854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // VCard 3.0 only. Must be "VCARD". I think we can ignore this.
9864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("CATEGORIES")) {
9874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // VCard 3.0 only.
9884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // e.g. CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
9894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("SOURCE")) {
9904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // VCard 3.0 only.
9914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (propName.equals("PRODID")) {
9924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // VCard 3.0 only.
9934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // To specify the identifier for the product that created
9944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // the vCard object.*/
9954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
9964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // Unknown X- words and IANA token.
9974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
9984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void handleAndroidCustomProperty(final List<String> customPropertyList) {
10014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mAndroidCustomPropertyList == null) {
10024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mAndroidCustomPropertyList = new ArrayList<List<String>>();
10034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mAndroidCustomPropertyList.add(customPropertyList);
10054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
10064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
10084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Construct the display name. The constructed data must not be null.
10094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
10104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void constructDisplayName() {
10114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // FullName (created via "FN" or "NAME" field) is prefered.
10124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!TextUtils.isEmpty(mFormattedName)) {
10134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mFormattedName;
10144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (!(TextUtils.isEmpty(mFamilyName) && TextUtils.isEmpty(mGivenName))) {
10154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = VCardUtils.constructNameFromElements(mVCardType,
10164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mFamilyName, mMiddleName, mGivenName, mPrefix, mSuffix);
10174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (!(TextUtils.isEmpty(mPhoneticFamilyName) &&
10184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                TextUtils.isEmpty(mPhoneticGivenName))) {
10194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = VCardUtils.constructNameFromElements(mVCardType,
10204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mPhoneticFamilyName, mPhoneticMiddleName, mPhoneticGivenName);
10214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mEmailList != null && mEmailList.size() > 0) {
10224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mEmailList.get(0).data;
10234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mPhoneList != null && mPhoneList.size() > 0) {
10244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mPhoneList.get(0).data;
10254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mPostalList != null && mPostalList.size() > 0) {
10264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mPostalList.get(0).getFormattedAddress(mVCardType);
10274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (mOrganizationList != null && mOrganizationList.size() > 0) {
10284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = mOrganizationList.get(0).getFormattedString();
10294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mDisplayName == null) {
10324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mDisplayName = "";
10334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
10354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
10374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Consolidate several fielsds (like mName) using name candidates,
10384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
10394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void consolidateFields() {
10404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        constructDisplayName();
10414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhoneticFullName != null) {
10434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mPhoneticFullName = mPhoneticFullName.trim();
10444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
10464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public Uri pushIntoContentResolver(ContentResolver resolver) {
10484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ArrayList<ContentProviderOperation> operationList =
10494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            new ArrayList<ContentProviderOperation>();
10504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // After applying the batch the first result's Uri is returned so it is important that
10514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // the RawContact is the first operation that gets inserted into the list
10524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContentProviderOperation.Builder builder =
10534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
10544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        String myGroupsId = null;
10554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mAccount != null) {
10564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_NAME, mAccount.name);
10574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_TYPE, mAccount.type);
10584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
10594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_NAME, null);
10604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(RawContacts.ACCOUNT_TYPE, null);
10614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        operationList.add(builder.build());
10634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!nameFieldsAreEmpty()) {
10654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
10664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
10674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
10684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.GIVEN_NAME, mGivenName);
10704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.FAMILY_NAME, mFamilyName);
10714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.MIDDLE_NAME, mMiddleName);
10724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.PREFIX, mPrefix);
10734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.SUFFIX, mSuffix);
10744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (!(TextUtils.isEmpty(mPhoneticGivenName)
10764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && TextUtils.isEmpty(mPhoneticFamilyName)
10774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    && TextUtils.isEmpty(mPhoneticMiddleName))) {
10784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_GIVEN_NAME, mPhoneticGivenName);
10794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_FAMILY_NAME, mPhoneticFamilyName);
10804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_MIDDLE_NAME, mPhoneticMiddleName);
10814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            } else if (!TextUtils.isEmpty(mPhoneticFullName)) {
10824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(StructuredName.PHONETIC_GIVEN_NAME, mPhoneticFullName);
10834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
10844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(StructuredName.DISPLAY_NAME, getDisplayName());
10864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            operationList.add(builder.build());
10874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
10894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNickNameList != null && mNickNameList.size() > 0) {
10904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String nickName : mNickNameList) {
10914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
10924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Nickname.RAW_CONTACT_ID, 0);
10934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);
10944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Nickname.TYPE, Nickname.TYPE_DEFAULT);
10954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Nickname.NAME, nickName);
10964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
10974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
10984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
10994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhoneList != null) {
11014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (PhoneData phoneData : mPhoneList) {
11024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
11044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
11054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Phone.TYPE, phoneData.type);
11074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (phoneData.type == Phone.TYPE_CUSTOM) {
11084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Phone.LABEL, phoneData.label);
11094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Phone.NUMBER, phoneData.data);
11114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (phoneData.isPrimary) {
11124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Phone.IS_PRIMARY, 1);
11134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mOrganizationList != null) {
11194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (OrganizationData organizationData : mOrganizationList) {
11204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Organization.RAW_CONTACT_ID, 0);
11224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
11234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Organization.TYPE, organizationData.type);
11244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.companyName != null) {
11254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.COMPANY, organizationData.companyName);
11264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.departmentName != null) {
11284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.DEPARTMENT, organizationData.departmentName);
11294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.titleName != null) {
11314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.TITLE, organizationData.titleName);
11324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (organizationData.isPrimary) {
11344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Organization.IS_PRIMARY, 1);
11354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mEmailList != null) {
11414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (EmailData emailData : mEmailList) {
11424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Email.RAW_CONTACT_ID, 0);
11444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
11454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Email.TYPE, emailData.type);
11474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (emailData.type == Email.TYPE_CUSTOM) {
11484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Email.LABEL, emailData.label);
11494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Email.DATA, emailData.data);
11514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (emailData.isPrimary) {
11524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Data.IS_PRIMARY, 1);
11534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPostalList != null) {
11594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (PostalData postalData : mPostalList) {
11604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                VCardUtils.insertStructuredPostalDataUsingContactsStruct(
11624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        mVCardType, builder, postalData);
11634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mImList != null) {
11684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (ImData imData : mImList) {
11694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Im.RAW_CONTACT_ID, 0);
11714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
11724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Im.TYPE, imData.type);
11734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Im.PROTOCOL, imData.protocol);
11744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (imData.protocol == Im.PROTOCOL_CUSTOM) {
11754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Im.CUSTOM_PROTOCOL, imData.customProtocol);
11764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (imData.isPrimary) {
11784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Data.IS_PRIMARY, 1);
11794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
11804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mNoteList != null) {
11844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String note : mNoteList) {
11854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Note.RAW_CONTACT_ID, 0);
11874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
11884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Note.NOTE, note);
11894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
11904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
11914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
11924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
11934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mPhotoList != null) {
11944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (PhotoData photoData : mPhotoList) {
11954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
11964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Photo.RAW_CONTACT_ID, 0);
11974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Photo.PHOTO, photoData.photoBytes);
11994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (photoData.isPrimary) {
12004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.withValue(Photo.IS_PRIMARY, 1);
12014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
12024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
12034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
12044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mWebsiteList != null) {
12074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String website : mWebsiteList) {
12084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValueBackReference(Website.RAW_CONTACT_ID, 0);
12104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Data.MIMETYPE, Website.CONTENT_ITEM_TYPE);
12114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Website.URL, website);
12124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // There's no information about the type of URL in vCard.
12134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                // We use TYPE_HOMEPAGE for safety.
12144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.withValue(Website.TYPE, Website.TYPE_HOMEPAGE);
12154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
12164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
12174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!TextUtils.isEmpty(mBirthday)) {
12204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValueBackReference(Event.RAW_CONTACT_ID, 0);
12224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
12234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Event.START_DATE, mBirthday);
12244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Event.TYPE, Event.TYPE_BIRTHDAY);
12254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            operationList.add(builder.build());
12264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mAndroidCustomPropertyList != null) {
12294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (List<String> customPropertyList : mAndroidCustomPropertyList) {
12304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                int size = customPropertyList.size();
12314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (size < 2 || TextUtils.isEmpty(customPropertyList.get(0))) {
12324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    continue;
12334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else if (size > VCardConstants.MAX_DATA_COLUMN + 1) {
12344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    size = VCardConstants.MAX_DATA_COLUMN + 1;
12354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    customPropertyList =
12364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        customPropertyList.subList(0, VCardConstants.MAX_DATA_COLUMN + 2);
12374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
12384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                int i = 0;
12404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                for (final String customPropertyValue : customPropertyList) {
12414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    if (i == 0) {
12424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        final String mimeType = customPropertyValue;
12434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0);
12454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        builder.withValue(Data.MIMETYPE, mimeType);
12464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    } else {  // 1 <= i && i <= MAX_DATA_COLUMNS
12474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        if (!TextUtils.isEmpty(customPropertyValue)) {
12484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            builder.withValue("data" + i, customPropertyValue);
12494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        }
12504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    }
12514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    i++;
12534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
12544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                operationList.add(builder.build());
12554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
12564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (myGroupsId != null) {
12594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
12604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0);
12614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
12624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.withValue(GroupMembership.GROUP_SOURCE_ID, myGroupsId);
12634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            operationList.add(builder.build());
12644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        try {
12674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            ContentProviderResult[] results = resolver.applyBatch(
12684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        ContactsContract.AUTHORITY, operationList);
12694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // the first result is always the raw_contact. return it's uri so
12704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // that it can be found later. do null checking for badly behaving
12714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            // ContentResolvers
12724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return (results == null || results.length == 0 || results[0] == null)
12734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                ? null
12744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                : results[0].uri;
12754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } catch (RemoteException e) {
12764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage()));
12774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return null;
12784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } catch (OperationApplicationException e) {
12794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage()));
12804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return null;
12814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
12824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static VCardEntry buildFromResolver(ContentResolver resolver) {
12854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return buildFromResolver(resolver, Contacts.CONTENT_URI);
12864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static VCardEntry buildFromResolver(ContentResolver resolver, Uri uri) {
12894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return null;
12914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
12924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
12934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private boolean nameFieldsAreEmpty() {
12944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return (TextUtils.isEmpty(mFamilyName)
12954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mMiddleName)
12964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mGivenName)
12974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPrefix)
12984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mSuffix)
12994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mFormattedName)
13004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticFamilyName)
13014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticMiddleName)
13024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticGivenName)
13034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                && TextUtils.isEmpty(mPhoneticFullName));
13044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public boolean isIgnorable() {
13074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return getDisplayName().length() == 0;
13084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String listToString(List<String> list){
13114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final int size = list.size();
13124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (size > 1) {
13134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            StringBuilder builder = new StringBuilder();
13144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int i = 0;
13154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (String type : list) {
13164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                builder.append(type);
13174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (i < size - 1) {
13184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    builder.append(";");
13194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
13204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
13214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return builder.toString();
13224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if (size == 1) {
13234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return list.get(0);
13244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
13254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return "";
13264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
13274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // All getter methods should be used carefully, since they may change
13304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // in the future as of 2009-10-05, on which I cannot be sure this structure
13314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // is completely consolidated.
13324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    //
13334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // Also note that these getter methods should be used only after
13344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // all properties being pushed into this object. If not, incorrect
13354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // value will "be stored in the local cache and" be returned to you.
13364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getFamilyName() {
13384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mFamilyName;
13394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getGivenName() {
13424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mGivenName;
13434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getMiddleName() {
13464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mMiddleName;
13474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPrefix() {
13504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPrefix;
13514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getSuffix() {
13544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mSuffix;
13554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getFullName() {
13584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mFormattedName;
13594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticFamilyName() {
13624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticFamilyName;
13634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticGivenName() {
13664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticGivenName;
13674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticMiddleName() {
13704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticMiddleName;
13714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getPhoneticFullName() {
13744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneticFullName;
13754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<String> getNickNameList() {
13784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mNickNameList;
13794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getBirthday() {
13824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mBirthday;
13834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<String> getNotes() {
13864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mNoteList;
13874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<PhoneData> getPhoneList() {
13904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhoneList;
13914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<EmailData> getEmailList() {
13944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mEmailList;
13954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
13964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
13974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<PostalData> getPostalList() {
13984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPostalList;
13994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<OrganizationData> getOrganizationList() {
14024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mOrganizationList;
14034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<ImData> getImList() {
14064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mImList;
14074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<PhotoData> getPhotoList() {
14104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mPhotoList;
14114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public final List<String> getWebsiteList() {
14144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mWebsiteList;
14154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
14174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public String getDisplayName() {
14184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (mDisplayName == null) {
14194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            constructDisplayName();
14204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
14214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return mDisplayName;
14224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
14234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1424