in com/android/vcard/VCardEntry.java [2126:2417]
public void addProperty(final VCardProperty property) {
final String propertyName = property.getName();
final Map<String, Collection<String>> paramMap = property.getParameterMap();
final List<String> propertyValueList = property.getValueList();
byte[] propertyBytes = property.getByteValue();
if ((propertyValueList == null || propertyValueList.size() == 0)
&& propertyBytes == null) {
return;
}
final String propValue = (propertyValueList != null
? listToString(propertyValueList).trim()
: null);
if (propertyName.equals(VCardConstants.PROPERTY_VERSION)) {
// vCard version. Ignore this.
} else if (propertyName.equals(VCardConstants.PROPERTY_FN)) {
mNameData.mFormatted = propValue;
} else if (propertyName.equals(VCardConstants.PROPERTY_NAME)) {
// Only in vCard 3.0. Use this if FN doesn't exist though it is
// required in vCard 3.0.
if (TextUtils.isEmpty(mNameData.mFormatted)) {
mNameData.mFormatted = propValue;
}
} else if (propertyName.equals(VCardConstants.PROPERTY_N)) {
handleNProperty(propertyValueList, paramMap);
} else if (propertyName.equals(VCardConstants.PROPERTY_SORT_STRING)) {
mNameData.mSortString = propValue;
} else if (propertyName.equals(VCardConstants.PROPERTY_NICKNAME)
|| propertyName.equals(VCardConstants.ImportOnly.PROPERTY_X_NICKNAME)) {
addNickName(propValue);
} else if (propertyName.equals(VCardConstants.PROPERTY_SOUND)) {
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null
&& typeCollection.contains(VCardConstants.PARAM_TYPE_X_IRMC_N)) {
// As of 2009-10-08, Parser side does not split a property value into separated
// values using ';' (in other words, propValueList.size() == 1),
// which is correct behavior from the view of vCard 2.1.
// But we want it to be separated, so do the separation here.
final List<String> phoneticNameList = VCardUtils.constructListFromValue(propValue,
mVCardType);
handlePhoneticNameFromSound(phoneticNameList);
} else {
// Ignore this field since Android cannot understand what it is.
}
} else if (propertyName.equals(VCardConstants.PROPERTY_ADR)) {
boolean valuesAreAllEmpty = true;
for (String value : propertyValueList) {
if (!TextUtils.isEmpty(value)) {
valuesAreAllEmpty = false;
break;
}
}
if (valuesAreAllEmpty) {
return;
}
int type = -1;
String label = null;
boolean isPrimary = false;
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (final String typeStringOrg : typeCollection) {
final String typeStringUpperCase = typeStringOrg.toUpperCase();
if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_HOME)) {
type = StructuredPostal.TYPE_HOME;
label = null;
} else if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_WORK)
|| typeStringUpperCase
.equalsIgnoreCase(VCardConstants.PARAM_EXTRA_TYPE_COMPANY)) {
// "COMPANY" seems emitted by Windows Mobile, which is not
// specifically supported by vCard 2.1. We assume this is same
// as "WORK".
type = StructuredPostal.TYPE_WORK;
label = null;
} else if (typeStringUpperCase.equals(VCardConstants.PARAM_ADR_TYPE_PARCEL)
|| typeStringUpperCase.equals(VCardConstants.PARAM_ADR_TYPE_DOM)
|| typeStringUpperCase.equals(VCardConstants.PARAM_ADR_TYPE_INTL)) {
// We do not have any appropriate way to store this information.
} else if (type < 0) { // If no other type is specified before.
type = StructuredPostal.TYPE_CUSTOM;
if (typeStringUpperCase.startsWith("X-")) { // If X- or x-
label = typeStringOrg.substring(2);
} else {
label = typeStringOrg;
}
}
}
}
// We use "HOME" as default
if (type < 0) {
type = StructuredPostal.TYPE_HOME;
}
addPostal(type, propertyValueList, label, isPrimary);
} else if (propertyName.equals(VCardConstants.PROPERTY_EMAIL)) {
int type = -1;
String label = null;
boolean isPrimary = false;
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (final String typeStringOrg : typeCollection) {
final String typeStringUpperCase = typeStringOrg.toUpperCase();
if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_HOME)) {
type = Email.TYPE_HOME;
} else if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_WORK)) {
type = Email.TYPE_WORK;
} else if (typeStringUpperCase.equals(VCardConstants.PARAM_TYPE_CELL)) {
type = Email.TYPE_MOBILE;
} else if (type < 0) { // If no other type is specified before
if (typeStringUpperCase.startsWith("X-")) { // If X- or x-
label = typeStringOrg.substring(2);
} else {
label = typeStringOrg;
}
type = Email.TYPE_CUSTOM;
}
}
}
if (type < 0) {
type = Email.TYPE_OTHER;
}
addEmail(type, propValue, label, isPrimary);
} else if (propertyName.equals(VCardConstants.PROPERTY_ORG)) {
// vCard specification does not specify other types.
final int type = Organization.TYPE_WORK;
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
}
}
}
handleOrgValue(type, propertyValueList, paramMap, isPrimary);
} else if (propertyName.equals(VCardConstants.PROPERTY_TITLE)) {
handleTitleValue(propValue);
} else if (propertyName.equals(VCardConstants.PROPERTY_ROLE)) {
// This conflicts with TITLE. Ignore for now...
// handleTitleValue(propValue);
} else if (propertyName.equals(VCardConstants.PROPERTY_PHOTO)
|| propertyName.equals(VCardConstants.PROPERTY_LOGO)) {
Collection<String> paramMapValue = paramMap.get("VALUE");
if (paramMapValue != null && paramMapValue.contains("URL")) {
// Currently we do not have appropriate example for testing this case.
} else {
final Collection<String> typeCollection = paramMap.get("TYPE");
String formatName = null;
boolean isPrimary = false;
if (typeCollection != null) {
for (String typeValue : typeCollection) {
if (VCardConstants.PARAM_TYPE_PREF.equals(typeValue)) {
isPrimary = true;
} else if (formatName == null) {
formatName = typeValue;
}
}
}
addPhotoBytes(formatName, propertyBytes, isPrimary);
}
} else if (propertyName.equals(VCardConstants.PROPERTY_TEL)) {
String phoneNumber = null;
boolean isSip = false;
if (VCardConfig.isVersion40(mVCardType)) {
// Given propValue is in URI format, not in phone number format used until
// vCard 3.0.
if (propValue.startsWith("sip:")) {
isSip = true;
} else if (propValue.startsWith("tel:")) {
phoneNumber = propValue.substring(4);
} else {
// We don't know appropriate way to handle the other schemas. Also,
// we may still have non-URI phone number. To keep given data as much as
// we can, just save original value here.
phoneNumber = propValue;
}
} else {
phoneNumber = propValue;
}
if (isSip) {
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
handleSipCase(propValue, typeCollection);
} else {
if (propValue.length() == 0) {
return;
}
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
final Object typeObject = VCardUtils.getPhoneTypeFromStrings(typeCollection,
phoneNumber);
final int type;
final String label;
if (typeObject instanceof Integer) {
type = (Integer) typeObject;
label = null;
} else {
type = Phone.TYPE_CUSTOM;
label = typeObject.toString();
}
final boolean isPrimary;
if (typeCollection != null &&
typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else {
isPrimary = false;
}
addPhone(type, phoneNumber, label, isPrimary);
}
} else if (propertyName.equals(VCardConstants.PROPERTY_X_SKYPE_PSTNNUMBER)) {
// The phone number available via Skype.
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
final int type = Phone.TYPE_OTHER;
final boolean isPrimary;
if (typeCollection != null
&& typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else {
isPrimary = false;
}
addPhone(type, propValue, null, isPrimary);
} else if (sImMap.containsKey(propertyName)) {
final int protocol = sImMap.get(propertyName);
boolean isPrimary = false;
int type = -1;
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (type < 0) {
if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_HOME)) {
type = Im.TYPE_HOME;
} else if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_WORK)) {
type = Im.TYPE_WORK;
}
}
}
}
if (type < 0) {
type = Im.TYPE_HOME;
}
addIm(protocol, null, propValue, type, isPrimary);
} else if (propertyName.equals(VCardConstants.PROPERTY_NOTE)) {
addNote(propValue);
} else if (propertyName.equals(VCardConstants.PROPERTY_URL)) {
if (mWebsiteList == null) {
mWebsiteList = new ArrayList<WebsiteData>(1);
}
mWebsiteList.add(new WebsiteData(propValue));
} else if (propertyName.equals(VCardConstants.PROPERTY_BDAY)) {
mBirthday = new BirthdayData(propValue);
} else if (propertyName.equals(VCardConstants.PROPERTY_ANNIVERSARY)) {
mAnniversary = new AnniversaryData(propValue);
} else if (propertyName.equals(VCardConstants.PROPERTY_X_PHONETIC_FIRST_NAME)) {
mNameData.mPhoneticGiven = propValue;
} else if (propertyName.equals(VCardConstants.PROPERTY_X_PHONETIC_MIDDLE_NAME)) {
mNameData.mPhoneticMiddle = propValue;
} else if (propertyName.equals(VCardConstants.PROPERTY_X_PHONETIC_LAST_NAME)) {
mNameData.mPhoneticFamily = propValue;
} else if (propertyName.equals(VCardConstants.PROPERTY_IMPP)) {
// See also RFC 4770 (for vCard 3.0)
if (propValue.startsWith("sip:")) {
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
handleSipCase(propValue, typeCollection);
}
} else if (propertyName.equals(VCardConstants.PROPERTY_X_SIP)) {
if (!TextUtils.isEmpty(propValue)) {
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
handleSipCase(propValue, typeCollection);
}
} else if (propertyName.equals(VCardConstants.PROPERTY_X_ANDROID_CUSTOM)) {
final List<String> customPropertyList = VCardUtils.constructListFromValue(propValue,
mVCardType);
handleAndroidCustomProperty(customPropertyList);
} else if (propertyName.toUpperCase().startsWith("X-")) {
// Catch all for X- properties. The caller can decide what to do with these.
if (mUnknownXData == null) {
mUnknownXData = new ArrayList<Pair<String, String>>();
}
mUnknownXData.add(new Pair<String, String>(propertyName, propValue));
} else {
}
// Be careful when adding some logic here, as some blocks above may use "return".
}