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