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:
@ -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";
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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?
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user