Rename the term "attribute"/"attr" to "parameter"/param".

We had been using "parameter"/"param" by mistake, while both vCard
formats uses theterm "attribute"/"attr". This is confusing.

Internal issue number: 2233884
This commit is contained in:
Daisuke Miyakawa
2009-11-03 17:30:19 +09:00
parent 66da163d41
commit 6cb76ac37f
6 changed files with 279 additions and 283 deletions

View File

@ -81,12 +81,7 @@ package android.pim.vcard;
public static final String PROPERTY_X_NO = "X-NO";
public static final String PROPERTY_X_DCM_HMN_MODE = "X-DCM-HMN-MODE";
// For some historical reason, we often use the term "ATTR"/"attribute" especially toward
// what is called "param" in both vCard specs, while vCard, while vCard importer side uses
// "param".
//
// TODO: Confusing. Fix it.
public static final String ATTR_TYPE = "TYPE";
public static final String PARAM_TYPE = "TYPE";
// How more than one TYPE fields are expressed is different between vCard 2.1 and vCard 3.0
//
@ -100,62 +95,62 @@ package android.pim.vcard;
//
// So we are currently not sure which type is the best; probably we will have to change which
// type should be emitted depending on the device.
public static final String ATTR_TYPE_HOME = "HOME";
public static final String ATTR_TYPE_WORK = "WORK";
public static final String ATTR_TYPE_FAX = "FAX";
public static final String ATTR_TYPE_CELL = "CELL";
public static final String ATTR_TYPE_VOICE = "VOICE";
public static final String ATTR_TYPE_INTERNET = "INTERNET";
public static final String PARAM_TYPE_HOME = "HOME";
public static final String PARAM_TYPE_WORK = "WORK";
public static final String PARAM_TYPE_FAX = "FAX";
public static final String PARAM_TYPE_CELL = "CELL";
public static final String PARAM_TYPE_VOICE = "VOICE";
public static final String PARAM_TYPE_INTERNET = "INTERNET";
// Abbreviation of "prefered" according to vCard 2.1 specification.
// We interpret this value as "primary" property during import/export.
//
// Note: Both vCard specs does anything about the requirement about this attribute,
// Note: Both vCard specs does not mention anything about the requirement for this parameter,
// but there may be some vCard importer which will get confused with more than
// one "PREF"s in one property name, while Android accepts them.
public static final String ATTR_TYPE_PREF = "PREF";
public static final String PARAM_TYPE_PREF = "PREF";
// Phone types valid in vCard and known to ContactsContract, but not so common.
public static final String ATTR_TYPE_CAR = "CAR";
public static final String ATTR_TYPE_ISDN = "ISDN";
public static final String ATTR_TYPE_PAGER = "PAGER";
public static final String ATTR_TYPE_TLX = "TLX"; // Telex
// Phone type parameters valid in vCard and known to ContactsContract, but not so common.
public static final String PARAM_TYPE_CAR = "CAR";
public static final String PARAM_TYPE_ISDN = "ISDN";
public static final String PARAM_TYPE_PAGER = "PAGER";
public static final String PARAM_TYPE_TLX = "TLX"; // Telex
// Phone types existing in vCard 2.1 but not known to ContactsContract.
// TODO: should make parser make these TYPE_CUSTOM.
public static final String ATTR_TYPE_MODEM = "MODEM";
public static final String ATTR_TYPE_MSG = "MSG";
public static final String ATTR_TYPE_BBS = "BBS";
public static final String ATTR_TYPE_VIDEO = "VIDEO";
public static final String PARAM_TYPE_MODEM = "MODEM";
public static final String PARAM_TYPE_MSG = "MSG";
public static final String PARAM_TYPE_BBS = "BBS";
public static final String PARAM_TYPE_VIDEO = "VIDEO";
// Attribute for Phones, which are not formally valid in vCard (at least 2.1).
// These types are basically encoded to "X-" attributes when composing vCard.
// Parser passes these when "X-" is added to the attribute or not.
public static final String ATTR_PHONE_EXTRA_TYPE_CALLBACK = "CALLBACK";
public static final String ATTR_PHONE_EXTRA_TYPE_RADIO = "RADIO";
public static final String ATTR_PHONE_EXTRA_TYPE_TTY_TDD = "TTY-TDD";
public static final String ATTR_PHONE_EXTRA_TYPE_ASSISTANT = "ASSISTANT";
// TYPE parameters for Phones, which are not formally valid in vCard (at least 2.1).
// These types are basically encoded to "X-" parameters when composing vCard.
// Parser passes these when "X-" is added to the parameter or not.
public static final String PARAM_PHONE_EXTRA_TYPE_CALLBACK = "CALLBACK";
public static final String PARAM_PHONE_EXTRA_TYPE_RADIO = "RADIO";
public static final String PARAM_PHONE_EXTRA_TYPE_TTY_TDD = "TTY-TDD";
public static final String PARAM_PHONE_EXTRA_TYPE_ASSISTANT = "ASSISTANT";
// vCard composer translates this type to "WORK" + "PREF". Just for parsing.
public static final String ATTR_PHONE_EXTRA_TYPE_COMPANY_MAIN = "COMPANY-MAIN";
public static final String PARAM_PHONE_EXTRA_TYPE_COMPANY_MAIN = "COMPANY-MAIN";
// vCard composer translates this type to "VOICE" Just for parsing.
public static final String ATTR_PHONE_EXTRA_TYPE_OTHER = "OTHER";
public static final String PARAM_PHONE_EXTRA_TYPE_OTHER = "OTHER";
// Attribute for addresses.
public static final String ATTR_ADR_TYPE_PARCEL = "PARCEL";
public static final String ATTR_ADR_TYPE_DOM = "DOM";
public static final String ATTR_ADR_TYPE_INTL = "INTL";
// TYPE parameters for postal addresses.
public static final String PARAM_ADR_TYPE_PARCEL = "PARCEL";
public static final String PARAM_ADR_TYPE_DOM = "DOM";
public static final String PARAM_ADR_TYPE_INTL = "INTL";
// Attribute types not officially valid but used in some vCard exporter.
// TYPE parameters not officially valid but used in some vCard exporter.
// Do not use in composer side.
public static final String ATTR_EXTRA_TYPE_COMPANY = "COMPANY";
public static final String PARAM_EXTRA_TYPE_COMPANY = "COMPANY";
// DoCoMo specific attribute. Used with "SOUND" property, which is alternate of SORT-STRING in
// DoCoMo specific type parameter. Used with "SOUND" property, which is alternate of SORT-STRING in
// vCard 3.0.
public static final String ATTR_TYPE_X_IRMC_N = "X-IRMC-N";
public static final String PARAM_TYPE_X_IRMC_N = "X-IRMC-N";
public interface ImportOnly {
public static final String PROPERTY_X_NICKNAME = "X-NICKNAME";
// Some device emits this "X-" attribute for expressing Google Talk,
// Some device emits this "X-" parameter for expressing Google Talk,
// which is specifically invalid but should be always properly accepted, and emitted
// in some special case (for that device/application).
public static final String PROPERTY_X_GOOGLE_TALK_WITH_SPACE = "X-GOOGLE TALK";

View File

@ -38,7 +38,6 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.telephony.PhoneNumberUtils;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.Log;
@ -720,8 +719,8 @@ public class ContactStruct {
propName.equals(Constants.ImportOnly.PROPERTY_X_NICKNAME)) {
addNickName(propValue);
} else if (propName.equals(Constants.PROPERTY_SOUND)) {
Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
if (typeCollection != null && typeCollection.contains(Constants.ATTR_TYPE_X_IRMC_N)) {
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
if (typeCollection != null && typeCollection.contains(Constants.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.
@ -748,25 +747,25 @@ public class ContactStruct {
int type = -1;
String label = "";
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
typeString = typeString.toUpperCase();
if (typeString.equals(Constants.ATTR_TYPE_PREF)) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (typeString.equals(Constants.ATTR_TYPE_HOME)) {
} else if (typeString.equals(Constants.PARAM_TYPE_HOME)) {
type = StructuredPostal.TYPE_HOME;
label = "";
} else if (typeString.equals(Constants.ATTR_TYPE_WORK) ||
typeString.equalsIgnoreCase(Constants.ATTR_EXTRA_TYPE_COMPANY)) {
} else if (typeString.equals(Constants.PARAM_TYPE_WORK) ||
typeString.equalsIgnoreCase(Constants.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 = "";
} else if (typeString.equals(Constants.ATTR_ADR_TYPE_PARCEL) ||
typeString.equals(Constants.ATTR_ADR_TYPE_DOM) ||
typeString.equals(Constants.ATTR_ADR_TYPE_INTL)) {
} else if (typeString.equals(Constants.PARAM_ADR_TYPE_PARCEL) ||
typeString.equals(Constants.PARAM_ADR_TYPE_DOM) ||
typeString.equals(Constants.PARAM_ADR_TYPE_INTL)) {
// We do not have any appropriate way to store this information.
} else {
if (typeString.startsWith("X-") && type < 0) {
@ -789,17 +788,17 @@ public class ContactStruct {
int type = -1;
String label = null;
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
typeString = typeString.toUpperCase();
if (typeString.equals(Constants.ATTR_TYPE_PREF)) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (typeString.equals(Constants.ATTR_TYPE_HOME)) {
} else if (typeString.equals(Constants.PARAM_TYPE_HOME)) {
type = Email.TYPE_HOME;
} else if (typeString.equals(Constants.ATTR_TYPE_WORK)) {
} else if (typeString.equals(Constants.PARAM_TYPE_WORK)) {
type = Email.TYPE_WORK;
} else if (typeString.equals(Constants.ATTR_TYPE_CELL)) {
} else if (typeString.equals(Constants.PARAM_TYPE_CELL)) {
type = Email.TYPE_MOBILE;
} else {
if (typeString.startsWith("X-") && type < 0) {
@ -821,10 +820,10 @@ public class ContactStruct {
// vCard specification does not specify other types.
final int type = Organization.TYPE_WORK;
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
if (typeString.equals(Constants.ATTR_TYPE_PREF)) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
isPrimary = true;
}
}
@ -846,7 +845,7 @@ public class ContactStruct {
boolean isPrimary = false;
if (typeCollection != null) {
for (String typeValue : typeCollection) {
if (Constants.ATTR_TYPE_PREF.equals(typeValue)) {
if (Constants.PARAM_TYPE_PREF.equals(typeValue)) {
isPrimary = true;
} else if (formatName == null){
formatName = typeValue;
@ -856,7 +855,7 @@ public class ContactStruct {
addPhotoBytes(formatName, propBytes, isPrimary);
}
} else if (propName.equals(Constants.PROPERTY_TEL)) {
final Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
final Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
final Object typeObject = VCardUtils.getPhoneTypeFromStrings(typeCollection);
final int type;
final String label;
@ -869,7 +868,7 @@ public class ContactStruct {
}
final boolean isPrimary;
if (typeCollection != null && typeCollection.contains(Constants.ATTR_TYPE_PREF)) {
if (typeCollection != null && typeCollection.contains(Constants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else {
isPrimary = false;
@ -877,12 +876,12 @@ public class ContactStruct {
addPhone(type, propValue, label, isPrimary);
} else if (propName.equals(Constants.PROPERTY_X_SKYPE_PSTNNUMBER)) {
// The phone number available via Skype.
Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
// XXX: should use TYPE_CUSTOM + the label "Skype"? (which may need localization)
int type = Phone.TYPE_OTHER;
final String label = null;
final boolean isPrimary;
if (typeCollection != null && typeCollection.contains(Constants.ATTR_TYPE_PREF)) {
if (typeCollection != null && typeCollection.contains(Constants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else {
isPrimary = false;
@ -892,15 +891,15 @@ public class ContactStruct {
final int protocol = sImMap.get(propName);
boolean isPrimary = false;
int type = -1;
final Collection<String> typeCollection = paramMap.get(Constants.ATTR_TYPE);
final Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
if (typeString.equals(Constants.ATTR_TYPE_PREF)) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (type < 0) {
if (typeString.equalsIgnoreCase(Constants.ATTR_TYPE_HOME)) {
if (typeString.equalsIgnoreCase(Constants.PARAM_TYPE_HOME)) {
type = Im.TYPE_HOME;
} else if (typeString.equalsIgnoreCase(Constants.ATTR_TYPE_WORK)) {
} else if (typeString.equalsIgnoreCase(Constants.PARAM_TYPE_WORK)) {
type = Im.TYPE_WORK;
}
}

View File

@ -131,17 +131,17 @@ public class VCardComposer {
private static final String VCARD_DATA_VCARD = "VCARD";
private static final String VCARD_DATA_PUBLIC = "PUBLIC";
private static final String VCARD_ATTR_SEPARATOR = ";";
private static final String VCARD_COL_SEPARATOR = "\r\n";
private static final String VCARD_PARAM_SEPARATOR = ";";
private static final String VCARD_END_OF_LINE = "\r\n";
private static final String VCARD_DATA_SEPARATOR = ":";
private static final String VCARD_ITEM_SEPARATOR = ";";
private static final String VCARD_WS = " ";
private static final String VCARD_ATTR_EQUAL = "=";
private static final String VCARD_PARAM_EQUAL = "=";
private static final String VCARD_ATTR_ENCODING_QP = "ENCODING=QUOTED-PRINTABLE";
private static final String VCARD_PARAM_ENCODING_QP = "ENCODING=QUOTED-PRINTABLE";
private static final String VCARD_ATTR_ENCODING_BASE64_V21 = "ENCODING=BASE64";
private static final String VCARD_ATTR_ENCODING_BASE64_V30 = "ENCODING=b";
private static final String VCARD_PARAM_ENCODING_BASE64_V21 = "ENCODING=BASE64";
private static final String VCARD_PARAM_ENCODING_BASE64_V30 = "ENCODING=b";
private static final String SHIFT_JIS = "SHIFT_JIS";
@ -309,7 +309,7 @@ public class VCardComposer {
private int mIdColumn;
private final String mCharsetString;
private final String mVCardAttributeCharset;
private final String mVCardCharsetParameter;
private boolean mTerminateIsCalled;
final private List<OneEntryHandler> mHandlerList;
@ -378,13 +378,13 @@ public class VCardComposer {
// Do not use mCharsetString bellow since it is different from "SHIFT_JIS" but
// may be "DOCOMO_SHIFT_JIS" or something like that (internal expression used in
// Android, not shown to the public).
mVCardAttributeCharset = "CHARSET=" + SHIFT_JIS;
mVCardCharsetParameter = "CHARSET=" + SHIFT_JIS;
} else if (mUsesShiftJis) {
mCharsetString = CharsetUtils.charsetForVendor(SHIFT_JIS).name();
mVCardAttributeCharset = "CHARSET=" + SHIFT_JIS;
mVCardCharsetParameter = "CHARSET=" + SHIFT_JIS;
} else {
mCharsetString = "UTF-8";
mVCardAttributeCharset = "CHARSET=UTF-8";
mVCardCharsetParameter = "CHARSET=UTF-8";
}
}
@ -743,14 +743,14 @@ public class VCardComposer {
}
builder.append(Constants.PROPERTY_N);
if (shouldAppendCharsetAttribute(Arrays.asList(
if (shouldAppendCharsetParameters(Arrays.asList(
encodedFamily, encodedGiven, encodedMiddle, encodedPrefix, encodedSuffix))) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
if (reallyUseQuotedPrintableToName) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
}
builder.append(VCARD_DATA_SEPARATOR);
@ -763,7 +763,7 @@ public class VCardComposer {
builder.append(encodedPrefix);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(encodedSuffix);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
final String formattedName;
if (!TextUtils.isEmpty(displayName)) {
@ -785,17 +785,17 @@ public class VCardComposer {
// FN property
builder.append(Constants.PROPERTY_FN);
if (shouldAppendCharsetAttribute(encodedFullname)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedFullname)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
if (reallyUseQuotedPrintableToFullname) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedFullname);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
} else if (!TextUtils.isEmpty(displayName)) {
final boolean reallyUseQuotedPrintableToDisplayName =
(!mRefrainsQPToPrimaryProperties &&
@ -806,13 +806,13 @@ public class VCardComposer {
escapeCharacters(displayName);
builder.append(Constants.PROPERTY_N);
if (shouldAppendCharsetAttribute(encodedDisplayName)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedDisplayName)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
if (reallyUseQuotedPrintableToDisplayName) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedDisplayName);
@ -820,17 +820,17 @@ public class VCardComposer {
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
if (mIsV30) {
builder.append(Constants.PROPERTY_FN);
// TODO: Not allowed formally...
if (shouldAppendCharsetAttribute(encodedDisplayName)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedDisplayName)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedDisplayName);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
} else if (mIsV30) {
// vCard 3.0 specification requires these fields.
@ -872,13 +872,13 @@ public class VCardComposer {
// Do not need to care about QP, since vCard 3.0 does not allow it.
final String encodedSortString = escapeCharacters(sortString);
if (shouldAppendCharsetAttribute(encodedSortString)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedSortString)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedSortString);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
} else if (mIsJapaneseMobilePhone) {
// Note: There is no appropriate property for expressing
// phonetic name in vCard 2.1, while there is in
@ -888,8 +888,8 @@ public class VCardComposer {
// a lot of Japanese mobile phones. This is "X-" property, so
// any parser hopefully would not get confused with this.
builder.append(Constants.PROPERTY_SOUND);
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(Constants.ATTR_TYPE_X_IRMC_N);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(Constants.PARAM_TYPE_X_IRMC_N);
boolean reallyUseQuotedPrintable =
(!mRefrainsQPToPrimaryProperties
@ -913,11 +913,11 @@ public class VCardComposer {
encodedPhoneticGivenName = escapeCharacters(phoneticGivenName);
}
if (shouldAppendCharsetAttribute(Arrays.asList(
if (shouldAppendCharsetParameters(Arrays.asList(
encodedPhoneticFamilyName, encodedPhoneticMiddleName,
encodedPhoneticGivenName))) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedPhoneticFamilyName);
@ -927,18 +927,18 @@ public class VCardComposer {
builder.append(encodedPhoneticMiddleName);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
} else if (mIsDoCoMo) {
builder.append(Constants.PROPERTY_SOUND);
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(Constants.ATTR_TYPE_X_IRMC_N);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(Constants.PARAM_TYPE_X_IRMC_N);
builder.append(VCARD_DATA_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_ITEM_SEPARATOR);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
if (mUsesDefactProperty) {
@ -952,17 +952,17 @@ public class VCardComposer {
encodedPhoneticGivenName = escapeCharacters(phoneticGivenName);
}
builder.append(Constants.PROPERTY_X_PHONETIC_FIRST_NAME);
if (shouldAppendCharsetAttribute(encodedPhoneticGivenName)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedPhoneticGivenName)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
if (reallyUseQuotedPrintable) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedPhoneticGivenName);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
if (!TextUtils.isEmpty(phoneticMiddleName)) {
final boolean reallyUseQuotedPrintable =
@ -974,17 +974,17 @@ public class VCardComposer {
encodedPhoneticMiddleName = escapeCharacters(phoneticMiddleName);
}
builder.append(Constants.PROPERTY_X_PHONETIC_MIDDLE_NAME);
if (shouldAppendCharsetAttribute(encodedPhoneticMiddleName)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedPhoneticMiddleName)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
if (reallyUseQuotedPrintable) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedPhoneticMiddleName);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
if (!TextUtils.isEmpty(phoneticFamilyName)) {
final boolean reallyUseQuotedPrintable =
@ -996,17 +996,17 @@ public class VCardComposer {
encodedPhoneticFamilyName = escapeCharacters(phoneticFamilyName);
}
builder.append(Constants.PROPERTY_X_PHONETIC_LAST_NAME);
if (shouldAppendCharsetAttribute(encodedPhoneticFamilyName)) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
if (shouldAppendCharsetParameter(encodedPhoneticFamilyName)) {
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
if (reallyUseQuotedPrintable) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedPhoneticFamilyName);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
}
}
@ -1128,10 +1128,10 @@ public class VCardComposer {
}
} else if (mIsDoCoMo) {
builder.append(Constants.PROPERTY_ADR);
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(Constants.ATTR_TYPE_HOME);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(Constants.PARAM_TYPE_HOME);
builder.append(VCARD_DATA_SEPARATOR);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
}
@ -1225,11 +1225,11 @@ public class VCardComposer {
final Integer typeAsInteger = contentValues.getAsInteger(Im.TYPE);
switch (typeAsInteger != null ? typeAsInteger : Im.TYPE_OTHER) {
case Im.TYPE_HOME: {
typeAsString = Constants.ATTR_TYPE_HOME;
typeAsString = Constants.PARAM_TYPE_HOME;
break;
}
case Im.TYPE_WORK: {
typeAsString = Constants.ATTR_TYPE_WORK;
typeAsString = Constants.PARAM_TYPE_WORK;
break;
}
case Im.TYPE_CUSTOM: {
@ -1245,19 +1245,19 @@ public class VCardComposer {
}
}
List<String> attributeList = new ArrayList<String>();
List<String> parameterList = new ArrayList<String>();
if (!TextUtils.isEmpty(typeAsString)) {
attributeList.add(typeAsString);
parameterList.add(typeAsString);
}
final Integer isPrimaryAsInteger = contentValues.getAsInteger(Im.IS_PRIMARY);
final boolean isPrimary = (isPrimaryAsInteger != null ?
(isPrimaryAsInteger > 0) : false);
if (isPrimary) {
attributeList.add(Constants.ATTR_TYPE_PREF);
parameterList.add(Constants.PARAM_TYPE_PREF);
}
appendVCardLineWithCharsetAndQPDetection(
builder, propertyName, attributeList, data);
builder, propertyName, parameterList, data);
}
}
@ -1273,7 +1273,8 @@ public class VCardComposer {
if (website != null) {
website = website.trim();
}
// Note: vCard 3.0 does not allow any attribute addition toward "URL"
// Note: vCard 3.0 does not allow any parameter addition toward "URL"
// property, while there's no document in vCard 2.1.
//
// TODO: Should we allow adding it when appropriate?
@ -1581,14 +1582,14 @@ public class VCardComposer {
final String encodedData, final String photoType) {
StringBuilder tmpBuilder = new StringBuilder();
tmpBuilder.append(Constants.PROPERTY_PHOTO);
tmpBuilder.append(VCARD_ATTR_SEPARATOR);
tmpBuilder.append(VCARD_PARAM_SEPARATOR);
if (mIsV30) {
tmpBuilder.append(VCARD_ATTR_ENCODING_BASE64_V30);
tmpBuilder.append(VCARD_PARAM_ENCODING_BASE64_V30);
} else {
tmpBuilder.append(VCARD_ATTR_ENCODING_BASE64_V21);
tmpBuilder.append(VCARD_PARAM_ENCODING_BASE64_V21);
}
tmpBuilder.append(VCARD_ATTR_SEPARATOR);
appendTypeAttribute(tmpBuilder, photoType);
tmpBuilder.append(VCARD_PARAM_SEPARATOR);
appendTypeParameter(tmpBuilder, photoType);
tmpBuilder.append(VCARD_DATA_SEPARATOR);
tmpBuilder.append(encodedData);
@ -1600,14 +1601,14 @@ public class VCardComposer {
tmpBuilder.append(tmpStr.charAt(i));
lineCount++;
if (lineCount > 72) {
tmpBuilder.append(VCARD_COL_SEPARATOR);
tmpBuilder.append(VCARD_END_OF_LINE);
tmpBuilder.append(VCARD_WS);
lineCount = 0;
}
}
builder.append(tmpBuilder.toString());
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
builder.append(VCARD_END_OF_LINE);
}
private class PostalStruct {
@ -1719,17 +1720,17 @@ public class VCardComposer {
}
}
List<String> attributeList = new ArrayList<String>();
List<String> parameterList = new ArrayList<String>();
if (isPrimary) {
attributeList.add(Constants.ATTR_TYPE_PREF);
parameterList.add(Constants.PARAM_TYPE_PREF);
}
switch (type) {
case StructuredPostal.TYPE_HOME: {
attributeList.add(Constants.ATTR_TYPE_HOME);
parameterList.add(Constants.PARAM_TYPE_HOME);
break;
}
case StructuredPostal.TYPE_WORK: {
attributeList.add(Constants.ATTR_TYPE_WORK);
parameterList.add(Constants.PARAM_TYPE_WORK);
break;
}
case StructuredPostal.TYPE_CUSTOM: {
@ -1739,7 +1740,7 @@ public class VCardComposer {
// ("IANA-token" in the vCard 3.0 is unclear...)
// Just for safety, we add "X-" at the beggining of each label.
// Also checks the label obeys with vCard 3.0 spec.
attributeList.add("X-" + label);
parameterList.add("X-" + label);
}
break;
}
@ -1754,42 +1755,42 @@ public class VCardComposer {
// Actual data construction starts from here.
// TODO: add a new version of appendVCardLine() for this purpose.
builder.append(Constants.PROPERTY_ADR);
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_PARAM_SEPARATOR);
// Attributes
// Parameters
{
boolean shouldAppendAttrSeparator = false;
if (!attributeList.isEmpty()) {
appendTypeAttributes(builder, attributeList);
shouldAppendAttrSeparator = true;
boolean shouldAppendParamSeparator = false;
if (!parameterList.isEmpty()) {
appendTypeParameters(builder, parameterList);
shouldAppendParamSeparator = true;
}
if (appendCharset) {
// Strictly, vCard 3.0 does not allow exporters to emit charset information,
// but we will add it since the information should be useful for importers,
//
// Assume no parser does not emit error with this attribute in vCard 3.0.
if (shouldAppendAttrSeparator) {
builder.append(VCARD_ATTR_SEPARATOR);
// Assume no parser does not emit error with this parameter in vCard 3.0.
if (shouldAppendParamSeparator) {
builder.append(VCARD_PARAM_SEPARATOR);
}
builder.append(mVCardAttributeCharset);
shouldAppendAttrSeparator = true;
builder.append(mVCardCharsetParameter);
shouldAppendParamSeparator = true;
}
if (reallyUseQuotedPrintable) {
if (shouldAppendAttrSeparator) {
builder.append(VCARD_ATTR_SEPARATOR);
if (shouldAppendParamSeparator) {
builder.append(VCARD_PARAM_SEPARATOR);
}
builder.append(VCARD_ATTR_ENCODING_QP);
shouldAppendAttrSeparator = true;
builder.append(VCARD_PARAM_ENCODING_QP);
shouldAppendParamSeparator = true;
}
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(addressData);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
private void appendVCardEmailLine(final StringBuilder builder,
@ -1803,7 +1804,7 @@ public class VCardComposer {
// To support mobile type at that time, this custom label had been used.
if (android.provider.Contacts.ContactMethodsColumns.MOBILE_EMAIL_TYPE_NAME
.equals(label)) {
typeAsString = Constants.ATTR_TYPE_CELL;
typeAsString = Constants.PARAM_TYPE_CELL;
} else if (mUsesAndroidProperty && !TextUtils.isEmpty(label)
&& VCardUtils.containsOnlyAlphaDigitHyphen(label)) {
typeAsString = "X-" + label;
@ -1813,11 +1814,11 @@ public class VCardComposer {
break;
}
case Email.TYPE_HOME: {
typeAsString = Constants.ATTR_TYPE_HOME;
typeAsString = Constants.PARAM_TYPE_HOME;
break;
}
case Email.TYPE_WORK: {
typeAsString = Constants.ATTR_TYPE_WORK;
typeAsString = Constants.PARAM_TYPE_WORK;
break;
}
case Email.TYPE_OTHER: {
@ -1825,7 +1826,7 @@ public class VCardComposer {
break;
}
case Email.TYPE_MOBILE: {
typeAsString = Constants.ATTR_TYPE_CELL;
typeAsString = Constants.PARAM_TYPE_CELL;
break;
}
default: {
@ -1835,23 +1836,23 @@ public class VCardComposer {
}
}
final List<String> attributeList = new ArrayList<String>();
final List<String> parameterList = new ArrayList<String>();
if (isPrimary) {
attributeList.add(Constants.ATTR_TYPE_PREF);
parameterList.add(Constants.PARAM_TYPE_PREF);
}
if (!TextUtils.isEmpty(typeAsString)) {
attributeList.add(typeAsString);
parameterList.add(typeAsString);
}
appendVCardLineWithCharsetAndQPDetection(builder, Constants.PROPERTY_EMAIL,
attributeList, rawData);
parameterList, rawData);
}
private void appendVCardTelephoneLine(final StringBuilder builder,
final Integer typeAsObject, final String label,
final String encodedData, boolean isPrimary) {
builder.append(Constants.PROPERTY_TEL);
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_PARAM_SEPARATOR);
final int typeAsPrimitive;
if (typeAsObject == null) {
@ -1860,84 +1861,84 @@ public class VCardComposer {
typeAsPrimitive = typeAsObject;
}
ArrayList<String> attributeList = new ArrayList<String>();
ArrayList<String> parameterList = new ArrayList<String>();
switch (typeAsPrimitive) {
case Phone.TYPE_HOME:
attributeList.addAll(
Arrays.asList(Constants.ATTR_TYPE_HOME, Constants.ATTR_TYPE_VOICE));
parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_HOME, Constants.PARAM_TYPE_VOICE));
break;
case Phone.TYPE_WORK:
attributeList.addAll(
Arrays.asList(Constants.ATTR_TYPE_WORK, Constants.ATTR_TYPE_VOICE));
parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_WORK, Constants.PARAM_TYPE_VOICE));
break;
case Phone.TYPE_FAX_HOME:
attributeList.addAll(
Arrays.asList(Constants.ATTR_TYPE_HOME, Constants.ATTR_TYPE_FAX));
parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_HOME, Constants.PARAM_TYPE_FAX));
break;
case Phone.TYPE_FAX_WORK:
attributeList.addAll(
Arrays.asList(Constants.ATTR_TYPE_WORK, Constants.ATTR_TYPE_FAX));
parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_WORK, Constants.PARAM_TYPE_FAX));
break;
case Phone.TYPE_MOBILE:
attributeList.add(Constants.ATTR_TYPE_CELL);
parameterList.add(Constants.PARAM_TYPE_CELL);
break;
case Phone.TYPE_PAGER:
if (mIsDoCoMo) {
// Not sure about the reason, but previous implementation had
// used "VOICE" instead of "PAGER"
attributeList.add(Constants.ATTR_TYPE_VOICE);
parameterList.add(Constants.PARAM_TYPE_VOICE);
} else {
attributeList.add(Constants.ATTR_TYPE_PAGER);
parameterList.add(Constants.PARAM_TYPE_PAGER);
}
break;
case Phone.TYPE_OTHER:
attributeList.add(Constants.ATTR_TYPE_VOICE);
parameterList.add(Constants.PARAM_TYPE_VOICE);
break;
case Phone.TYPE_CAR:
attributeList.add(Constants.ATTR_TYPE_CAR);
parameterList.add(Constants.PARAM_TYPE_CAR);
break;
case Phone.TYPE_COMPANY_MAIN:
// There's no relevant field in vCard (at least 2.1).
attributeList.add(Constants.ATTR_TYPE_WORK);
parameterList.add(Constants.PARAM_TYPE_WORK);
isPrimary = true;
break;
case Phone.TYPE_ISDN:
attributeList.add(Constants.ATTR_TYPE_ISDN);
parameterList.add(Constants.PARAM_TYPE_ISDN);
break;
case Phone.TYPE_MAIN:
isPrimary = true;
break;
case Phone.TYPE_OTHER_FAX:
attributeList.add(Constants.ATTR_TYPE_FAX);
parameterList.add(Constants.PARAM_TYPE_FAX);
break;
case Phone.TYPE_TELEX:
attributeList.add(Constants.ATTR_TYPE_TLX);
parameterList.add(Constants.PARAM_TYPE_TLX);
break;
case Phone.TYPE_WORK_MOBILE:
attributeList.addAll(
Arrays.asList(Constants.ATTR_TYPE_WORK, Constants.ATTR_TYPE_CELL));
parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_WORK, Constants.PARAM_TYPE_CELL));
break;
case Phone.TYPE_WORK_PAGER:
attributeList.add(Constants.ATTR_TYPE_WORK);
parameterList.add(Constants.PARAM_TYPE_WORK);
// See above.
if (mIsDoCoMo) {
attributeList.add(Constants.ATTR_TYPE_VOICE);
parameterList.add(Constants.PARAM_TYPE_VOICE);
} else {
attributeList.add(Constants.ATTR_TYPE_PAGER);
parameterList.add(Constants.PARAM_TYPE_PAGER);
}
break;
case Phone.TYPE_MMS:
attributeList.add(Constants.ATTR_TYPE_MSG);
parameterList.add(Constants.PARAM_TYPE_MSG);
break;
case Phone.TYPE_CUSTOM:
if (mUsesAndroidProperty && !TextUtils.isEmpty(label)
&& VCardUtils.containsOnlyAlphaDigitHyphen(label)) {
// Note: Strictly, vCard 2.1 does not allow "X-" attribute without
// Note: Strictly, vCard 2.1 does not allow "X-" parameter without
// "TYPE=" string.
attributeList.add("X-" + label);
parameterList.add("X-" + label);
} else {
// Just ignore the custom type.
attributeList.add(Constants.ATTR_TYPE_VOICE);
parameterList.add(Constants.PARAM_TYPE_VOICE);
}
break;
case Phone.TYPE_RADIO:
@ -1947,18 +1948,18 @@ public class VCardComposer {
}
if (isPrimary) {
attributeList.add(Constants.ATTR_TYPE_PREF);
parameterList.add(Constants.PARAM_TYPE_PREF);
}
if (attributeList.isEmpty()) {
if (parameterList.isEmpty()) {
appendUncommonPhoneType(builder, typeAsPrimitive);
} else {
appendTypeAttributes(builder, attributeList);
appendTypeParameters(builder, parameterList);
}
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedData);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
/**
@ -1968,11 +1969,11 @@ public class VCardComposer {
if (mIsDoCoMo) {
// The previous implementation for DoCoMo had been conservative
// about miscellaneous types.
builder.append(Constants.ATTR_TYPE_VOICE);
builder.append(Constants.PARAM_TYPE_VOICE);
} else {
String phoneAttribute = VCardUtils.getPhoneAttributeString(type);
if (phoneAttribute != null) {
appendTypeAttribute(builder, phoneAttribute);
String phoneType = VCardUtils.getPhoneTypeString(type);
if (phoneType != null) {
appendTypeParameter(builder, phoneType);
} else {
Log.e(LOG_TAG, "Unknown or unsupported (by vCard) Phone type: " + type);
}
@ -1988,12 +1989,12 @@ public class VCardComposer {
private void appendVCardLineWithCharsetAndQPDetection(final StringBuilder builder,
final String propertyName,
final List<String> attributeList, final String rawData) {
final List<String> parameterList, final String rawData) {
final boolean needCharset =
(mUsesQuotedPrintable && !VCardUtils.containsOnlyPrintableAscii(rawData));
final boolean reallyUseQuotedPrintable =
!VCardUtils.containsOnlyNonCrLfPrintableAscii(rawData);
appendVCardLine(builder, propertyName, attributeList,
appendVCardLine(builder, propertyName, parameterList,
rawData, needCharset, reallyUseQuotedPrintable);
}
@ -2010,23 +2011,23 @@ public class VCardComposer {
private void appendVCardLine(final StringBuilder builder,
final String propertyName,
final List<String> attributeList,
final List<String> parameterList,
final String rawData, final boolean needCharset,
boolean needQuotedPrintable) {
builder.append(propertyName);
if (attributeList != null && attributeList.size() > 0) {
builder.append(VCARD_ATTR_SEPARATOR);
appendTypeAttributes(builder, attributeList);
if (parameterList != null && parameterList.size() > 0) {
builder.append(VCARD_PARAM_SEPARATOR);
appendTypeParameters(builder, parameterList);
}
if (needCharset) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
final String encodedData;
if (needQuotedPrintable) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
encodedData = encodeQuotedPrintable(rawData);
} else {
// TODO: one line may be too huge, which may be invalid in vCard spec, though
@ -2036,7 +2037,7 @@ public class VCardComposer {
builder.append(VCARD_DATA_SEPARATOR);
builder.append(encodedData);
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
// appendVCardLine() variants accepting List<String>.
@ -2048,7 +2049,7 @@ public class VCardComposer {
private void appendVCardLineWithCharsetAndQPDetection(final StringBuilder builder,
final String propertyName,
final List<String> attributeList, final List<String> rawDataList) {
final List<String> parameterList, final List<String> rawDataList) {
boolean needCharset = false;
boolean reallyUseQuotedPrintable = false;
for (String rawData : rawDataList) {
@ -2065,7 +2066,7 @@ public class VCardComposer {
}
}
appendVCardLine(builder, propertyName, attributeList,
appendVCardLine(builder, propertyName, parameterList,
rawDataList, needCharset, reallyUseQuotedPrintable);
}
@ -2083,17 +2084,17 @@ public class VCardComposer {
private void appendVCardLine(final StringBuilder builder,
final String propertyName,
final List<String> attributeList,
final List<String> parameterList,
final List<String> rawDataList, final boolean needCharset,
boolean needQuotedPrintable) {
builder.append(propertyName);
if (attributeList != null && attributeList.size() > 0) {
builder.append(VCARD_ATTR_SEPARATOR);
appendTypeAttributes(builder, attributeList);
if (parameterList != null && parameterList.size() > 0) {
builder.append(VCARD_PARAM_SEPARATOR);
appendTypeParameters(builder, parameterList);
}
if (needCharset) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(mVCardAttributeCharset);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(mVCardCharsetParameter);
}
builder.append(VCARD_DATA_SEPARATOR);
@ -2101,8 +2102,8 @@ public class VCardComposer {
for (String rawData : rawDataList) {
final String encodedData;
if (needQuotedPrintable) {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_ATTR_ENCODING_QP);
builder.append(VCARD_PARAM_SEPARATOR);
builder.append(VCARD_PARAM_ENCODING_QP);
encodedData = encodeQuotedPrintable(rawData);
} else {
// TODO: one line may be too huge, which may be invalid in vCard spec, though
@ -2117,13 +2118,13 @@ public class VCardComposer {
}
builder.append(encodedData);
}
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
/**
* VCARD_ATTR_SEPARATOR must be appended before this method being called.
* VCARD_PARAM_SEPARATOR must be appended before this method being called.
*/
private void appendTypeAttributes(final StringBuilder builder,
private void appendTypeParameters(final StringBuilder builder,
final List<String> types) {
// We may have to make this comma separated form like "TYPE=DOM,WORK" in the future,
// which would be recommended way in vcard 3.0 though not valid in vCard 2.1.
@ -2132,53 +2133,54 @@ public class VCardComposer {
if (first) {
first = false;
} else {
builder.append(VCARD_ATTR_SEPARATOR);
builder.append(VCARD_PARAM_SEPARATOR);
}
appendTypeAttribute(builder, type);
appendTypeParameter(builder, type);
}
}
/**
* VCARD_ATTR_SEPARATOR must be appended before this method being called.
* VCARD_PARAM_SEPARATOR must be appended before this method being called.
*/
private void appendTypeAttribute(final StringBuilder builder, final String type) {
private void appendTypeParameter(final StringBuilder builder, final String type) {
// Refrain from using appendType() so that "TYPE=" is not be appended when the
// device is DoCoMo's (just for safety).
//
// Note: In vCard 3.0, Type strings also can be like this: "TYPE=HOME,PREF"
if ((mIsV30 || mAppendTypeParamName) && !mIsDoCoMo) {
builder.append(Constants.ATTR_TYPE).append(VCARD_ATTR_EQUAL);
builder.append(Constants.PARAM_TYPE).append(VCARD_PARAM_EQUAL);
}
builder.append(type);
}
/**
* Returns true when the property line should contain charset attribute
* Returns true when the property line should contain charset parameter
* information. This method may return true even when vCard version is 3.0.
*
* Strictly, adding charset information is invalid in VCard 3.0.
* However we'll add the info only when used charset is not UTF-8
* However we'll add the info only when charset we use is not UTF-8
* in vCard 3.0 format, since parser side may be able to use the charset
* via this field, though we may encounter another problem by adding it...
* via this field, though we may encounter another problem by adding it.
*
* e.g. Japanese mobile phones use Shift_Jis while RFC 2426
* recommends UTF-8. By adding this field, parsers may be able
* to know this text is NOT UTF-8 but Shift_Jis.
*/
private boolean shouldAppendCharsetAttribute(final String propertyValue) {
private boolean shouldAppendCharsetParameter(final String propertyValue) {
return (!VCardUtils.containsOnlyPrintableAscii(propertyValue) &&
(!mIsV30 || !mUsesUtf8));
}
private boolean shouldAppendCharsetAttribute(final List<String> propertyValueList) {
boolean shouldAppendBasically = false;
private boolean shouldAppendCharsetParameters(final List<String> propertyValueList) {
if (mIsV30 && mUsesUtf8) {
return false;
}
for (String propertyValue : propertyValueList) {
if (!VCardUtils.containsOnlyPrintableAscii(propertyValue)) {
shouldAppendBasically = true;
break;
return true;
}
}
return shouldAppendBasically && (!mIsV30 || !mUsesUtf8);
return false;
}
private String encodeQuotedPrintable(String str) {
@ -2315,11 +2317,11 @@ public class VCardComposer {
final long dateAsLong = mCursor.getLong(DATE_COLUMN_INDEX);
builder.append(VCARD_PROPERTY_X_TIMESTAMP);
builder.append(VCARD_ATTR_SEPARATOR);
appendTypeAttribute(builder, callLogTypeStr);
builder.append(VCARD_PARAM_SEPARATOR);
appendTypeParameter(builder, callLogTypeStr);
builder.append(VCARD_DATA_SEPARATOR);
builder.append(toRfc2455Format(dateAsLong));
builder.append(VCARD_COL_SEPARATOR);
builder.append(VCARD_END_OF_LINE);
}
private String createOneCallLogEntryInternal() {

View File

@ -163,7 +163,7 @@ public class VCardConfig {
* is also valid. In vCrad 3.0, this flag is unnecessary, since "TYPE=" is MUST in
* vCard 3.0 specification.
*
* If you are targeting to some importer which cannot accept type attributes (params)
* If you are targeting to some importer which cannot accept type parameters
* without "TYPE=" string (which should be rare though), please use this flag.
*
* XXX: Really rare?

View File

@ -35,7 +35,7 @@ public abstract class VCardParser {
*
* In order to avoid "misunderstanding" charset as much as possible, this method
* use "ISO-8859-1" for reading the stream. When charset is specified in some property
* (with "CHARSET=..." attribute), the string is decoded to raw bytes and encoded to
* (with "CHARSET=..." parameter), the string is decoded to raw bytes and encoded to
* the charset. This method assumes that "ISO-8859-1" has 1 to 1 mapping in all 8bit
* characters, which is not completely sure. In some cases, this "decoding-encoding"
* scheme may fail. To avoid the case,

View File

@ -40,7 +40,7 @@ public class VCardUtils {
*/
// Note that not all types are included in this map/set, since, for example, TYPE_HOME_FAX is
// converted to two attribute Strings. These only contain some minor fields valid in both
// converted to two parameter Strings. These only contain some minor fields valid in both
// vCard and current (as of 2009-08-07) Contacts structure.
private static final Map<Integer, String> sKnownPhoneTypesMap_ItoS;
private static final Set<String> sPhoneTypesSetUnknownToContacts;
@ -53,30 +53,30 @@ public class VCardUtils {
sKnownPhoneTypesMap_ItoS = new HashMap<Integer, String>();
sKnownPhoneTypeMap_StoI = new HashMap<String, Integer>();
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_CAR, Constants.ATTR_TYPE_CAR);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_TYPE_CAR, Phone.TYPE_CAR);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_PAGER, Constants.ATTR_TYPE_PAGER);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_TYPE_PAGER, Phone.TYPE_PAGER);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_ISDN, Constants.ATTR_TYPE_ISDN);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_TYPE_ISDN, Phone.TYPE_ISDN);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_CAR, Constants.PARAM_TYPE_CAR);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_TYPE_CAR, Phone.TYPE_CAR);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_PAGER, Constants.PARAM_TYPE_PAGER);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_TYPE_PAGER, Phone.TYPE_PAGER);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_ISDN, Constants.PARAM_TYPE_ISDN);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_TYPE_ISDN, Phone.TYPE_ISDN);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_TYPE_HOME, Phone.TYPE_HOME);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_TYPE_WORK, Phone.TYPE_WORK);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_TYPE_CELL, Phone.TYPE_MOBILE);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_TYPE_HOME, Phone.TYPE_HOME);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_TYPE_WORK, Phone.TYPE_WORK);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_TYPE_CELL, Phone.TYPE_MOBILE);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_PHONE_EXTRA_TYPE_OTHER, Phone.TYPE_OTHER);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_PHONE_EXTRA_TYPE_CALLBACK, Phone.TYPE_CALLBACK);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_PHONE_EXTRA_TYPE_OTHER, Phone.TYPE_OTHER);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_PHONE_EXTRA_TYPE_CALLBACK, Phone.TYPE_CALLBACK);
sKnownPhoneTypeMap_StoI.put(
Constants.ATTR_PHONE_EXTRA_TYPE_COMPANY_MAIN, Phone.TYPE_COMPANY_MAIN);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_PHONE_EXTRA_TYPE_RADIO, Phone.TYPE_RADIO);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_PHONE_EXTRA_TYPE_TTY_TDD, Phone.TYPE_TTY_TDD);
sKnownPhoneTypeMap_StoI.put(Constants.ATTR_PHONE_EXTRA_TYPE_ASSISTANT,
Constants.PARAM_PHONE_EXTRA_TYPE_COMPANY_MAIN, Phone.TYPE_COMPANY_MAIN);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_PHONE_EXTRA_TYPE_RADIO, Phone.TYPE_RADIO);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_PHONE_EXTRA_TYPE_TTY_TDD, Phone.TYPE_TTY_TDD);
sKnownPhoneTypeMap_StoI.put(Constants.PARAM_PHONE_EXTRA_TYPE_ASSISTANT,
Phone.TYPE_ASSISTANT);
sPhoneTypesSetUnknownToContacts = new HashSet<String>();
sPhoneTypesSetUnknownToContacts.add(Constants.ATTR_TYPE_MODEM);
sPhoneTypesSetUnknownToContacts.add(Constants.ATTR_TYPE_BBS);
sPhoneTypesSetUnknownToContacts.add(Constants.ATTR_TYPE_VIDEO);
sPhoneTypesSetUnknownToContacts.add(Constants.PARAM_TYPE_MODEM);
sPhoneTypesSetUnknownToContacts.add(Constants.PARAM_TYPE_BBS);
sPhoneTypesSetUnknownToContacts.add(Constants.PARAM_TYPE_VIDEO);
sKnownImPropNameMap_ItoS = new HashMap<Integer, String>();
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_AIM, Constants.PROPERTY_X_AIM);
@ -90,7 +90,7 @@ public class VCardUtils {
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_NETMEETING, Constants.PROPERTY_X_NETMEETING);
}
public static String getPhoneAttributeString(Integer type) {
public static String getPhoneTypeString(Integer type) {
return sKnownPhoneTypesMap_ItoS.get(type);
}
@ -107,9 +107,9 @@ public class VCardUtils {
if (types != null) {
for (String typeString : types) {
typeString = typeString.toUpperCase();
if (typeString.equals(Constants.ATTR_TYPE_PREF)) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
hasPref = true;
} else if (typeString.equals(Constants.ATTR_TYPE_FAX)) {
} else if (typeString.equals(Constants.PARAM_TYPE_FAX)) {
isFax = true;
} else {
if (typeString.startsWith("X-") && type < 0) {
@ -153,14 +153,14 @@ public class VCardUtils {
return sKnownImPropNameMap_ItoS.get(protocol);
}
public static boolean isValidPhoneAttribute(String phoneAttribute, int vcardType) {
public static boolean isValidPhoneType(String phoneType, int vcardType) {
// TODO: check the following.
// - it may violate vCard spec
// - it may contain non-ASCII characters
//
// TODO: use vcardType
return (phoneAttribute.startsWith("X-") || phoneAttribute.startsWith("x-") ||
sPhoneTypesSetUnknownToContacts.contains(phoneAttribute));
return (phoneType.startsWith("X-") || phoneType.startsWith("x-") ||
sPhoneTypesSetUnknownToContacts.contains(phoneType));
}
public static String[] sortNameElements(int vcardType,