Merge change Icaf78440 into eclair-mr2

* changes:
  Split vCard composer into two parts: VCardComposer and VCardBuilder.
This commit is contained in:
Android (Google) Code Review
2009-11-16 21:31:49 -08:00
8 changed files with 2109 additions and 1986 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -18,8 +18,7 @@ package android.pim.vcard;
/**
* Constants used in both exporter and importer code.
*/
/* package */ class Constants {
public class VCardConstants {
public static final String VERSION_V21 = "2.1";
public static final String VERSION_V30 = "3.0";
@@ -148,6 +147,6 @@ package android.pim.vcard;
/* package */ static final int MAX_CHARACTER_NUMS_QP = 76;
static final int MAX_CHARACTER_NUMS_BASE64_V30 = 75;
private Constants() {
private VCardConstants() {
}
}

View File

@@ -65,14 +65,14 @@ public class VCardEntry {
private static final Map<String, Integer> sImMap = new HashMap<String, Integer>();
static {
sImMap.put(Constants.PROPERTY_X_AIM, Im.PROTOCOL_AIM);
sImMap.put(Constants.PROPERTY_X_MSN, Im.PROTOCOL_MSN);
sImMap.put(Constants.PROPERTY_X_YAHOO, Im.PROTOCOL_YAHOO);
sImMap.put(Constants.PROPERTY_X_ICQ, Im.PROTOCOL_ICQ);
sImMap.put(Constants.PROPERTY_X_JABBER, Im.PROTOCOL_JABBER);
sImMap.put(Constants.PROPERTY_X_SKYPE_USERNAME, Im.PROTOCOL_SKYPE);
sImMap.put(Constants.PROPERTY_X_GOOGLE_TALK, Im.PROTOCOL_GOOGLE_TALK);
sImMap.put(Constants.ImportOnly.PROPERTY_X_GOOGLE_TALK_WITH_SPACE,
sImMap.put(VCardConstants.PROPERTY_X_AIM, Im.PROTOCOL_AIM);
sImMap.put(VCardConstants.PROPERTY_X_MSN, Im.PROTOCOL_MSN);
sImMap.put(VCardConstants.PROPERTY_X_YAHOO, Im.PROTOCOL_YAHOO);
sImMap.put(VCardConstants.PROPERTY_X_ICQ, Im.PROTOCOL_ICQ);
sImMap.put(VCardConstants.PROPERTY_X_JABBER, Im.PROTOCOL_JABBER);
sImMap.put(VCardConstants.PROPERTY_X_SKYPE_USERNAME, Im.PROTOCOL_SKYPE);
sImMap.put(VCardConstants.PROPERTY_X_GOOGLE_TALK, Im.PROTOCOL_GOOGLE_TALK);
sImMap.put(VCardConstants.ImportOnly.PROPERTY_X_GOOGLE_TALK_WITH_SPACE,
Im.PROTOCOL_GOOGLE_TALK);
}
@@ -749,24 +749,25 @@ public class VCardEntry {
}
final String propValue = listToString(propValueList).trim();
if (propName.equals(Constants.PROPERTY_VERSION)) {
if (propName.equals(VCardConstants.PROPERTY_VERSION)) {
// vCard version. Ignore this.
} else if (propName.equals(Constants.PROPERTY_FN)) {
} else if (propName.equals(VCardConstants.PROPERTY_FN)) {
mFullName = propValue;
} else if (propName.equals(Constants.PROPERTY_NAME) && mFullName == null) {
} else if (propName.equals(VCardConstants.PROPERTY_NAME) && mFullName == null) {
// Only in vCard 3.0. Use this if FN, which must exist in vCard 3.0 but may not
// actually exist in the real vCard data, does not exist.
mFullName = propValue;
} else if (propName.equals(Constants.PROPERTY_N)) {
} else if (propName.equals(VCardConstants.PROPERTY_N)) {
handleNProperty(propValueList);
} else if (propName.equals(Constants.PROPERTY_SORT_STRING)) {
} else if (propName.equals(VCardConstants.PROPERTY_SORT_STRING)) {
mPhoneticFullName = propValue;
} else if (propName.equals(Constants.PROPERTY_NICKNAME) ||
propName.equals(Constants.ImportOnly.PROPERTY_X_NICKNAME)) {
} else if (propName.equals(VCardConstants.PROPERTY_NICKNAME) ||
propName.equals(VCardConstants.ImportOnly.PROPERTY_X_NICKNAME)) {
addNickName(propValue);
} else if (propName.equals(Constants.PROPERTY_SOUND)) {
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
if (typeCollection != null && typeCollection.contains(Constants.PARAM_TYPE_X_IRMC_N)) {
} else if (propName.equals(VCardConstants.PROPERTY_SOUND)) {
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null
&& typeCollection.contains(VCardConstants.PARAM_TYPE_X_IRMC_N)) {
// As of 2009-10-08, Parser side does not split a property value into separated
// values using ';' (in other words, propValueList.size() == 1),
// which is correct behavior from the view of vCard 2.1.
@@ -778,7 +779,7 @@ public class VCardEntry {
} else {
// Ignore this field since Android cannot understand what it is.
}
} else if (propName.equals(Constants.PROPERTY_ADR)) {
} else if (propName.equals(VCardConstants.PROPERTY_ADR)) {
boolean valuesAreAllEmpty = true;
for (String value : propValueList) {
if (value.length() > 0) {
@@ -793,25 +794,25 @@ public class VCardEntry {
int type = -1;
String label = "";
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
typeString = typeString.toUpperCase();
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (typeString.equals(Constants.PARAM_TYPE_HOME)) {
} else if (typeString.equals(VCardConstants.PARAM_TYPE_HOME)) {
type = StructuredPostal.TYPE_HOME;
label = "";
} else if (typeString.equals(Constants.PARAM_TYPE_WORK) ||
typeString.equalsIgnoreCase(Constants.PARAM_EXTRA_TYPE_COMPANY)) {
} else if (typeString.equals(VCardConstants.PARAM_TYPE_WORK) ||
typeString.equalsIgnoreCase(VCardConstants.PARAM_EXTRA_TYPE_COMPANY)) {
// "COMPANY" seems emitted by Windows Mobile, which is not
// specifically supported by vCard 2.1. We assume this is same
// as "WORK".
type = StructuredPostal.TYPE_WORK;
label = "";
} else if (typeString.equals(Constants.PARAM_ADR_TYPE_PARCEL) ||
typeString.equals(Constants.PARAM_ADR_TYPE_DOM) ||
typeString.equals(Constants.PARAM_ADR_TYPE_INTL)) {
} else if (typeString.equals(VCardConstants.PARAM_ADR_TYPE_PARCEL) ||
typeString.equals(VCardConstants.PARAM_ADR_TYPE_DOM) ||
typeString.equals(VCardConstants.PARAM_ADR_TYPE_INTL)) {
// We do not have any appropriate way to store this information.
} else {
if (typeString.startsWith("X-") && type < 0) {
@@ -830,21 +831,21 @@ public class VCardEntry {
}
addPostal(type, propValueList, label, isPrimary);
} else if (propName.equals(Constants.PROPERTY_EMAIL)) {
} else if (propName.equals(VCardConstants.PROPERTY_EMAIL)) {
int type = -1;
String label = null;
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
typeString = typeString.toUpperCase();
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (typeString.equals(Constants.PARAM_TYPE_HOME)) {
} else if (typeString.equals(VCardConstants.PARAM_TYPE_HOME)) {
type = Email.TYPE_HOME;
} else if (typeString.equals(Constants.PARAM_TYPE_WORK)) {
} else if (typeString.equals(VCardConstants.PARAM_TYPE_WORK)) {
type = Email.TYPE_WORK;
} else if (typeString.equals(Constants.PARAM_TYPE_CELL)) {
} else if (typeString.equals(VCardConstants.PARAM_TYPE_CELL)) {
type = Email.TYPE_MOBILE;
} else {
if (typeString.startsWith("X-") && type < 0) {
@@ -862,26 +863,26 @@ public class VCardEntry {
type = Email.TYPE_OTHER;
}
addEmail(type, propValue, label, isPrimary);
} else if (propName.equals(Constants.PROPERTY_ORG)) {
} else if (propName.equals(VCardConstants.PROPERTY_ORG)) {
// vCard specification does not specify other types.
final int type = Organization.TYPE_WORK;
boolean isPrimary = false;
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
}
}
}
handleOrgValue(type, propValueList, isPrimary);
} else if (propName.equals(Constants.PROPERTY_TITLE)) {
} else if (propName.equals(VCardConstants.PROPERTY_TITLE)) {
handleTitleValue(propValue);
} else if (propName.equals(Constants.PROPERTY_ROLE)) {
} else if (propName.equals(VCardConstants.PROPERTY_ROLE)) {
// This conflicts with TITLE. Ignore for now...
// handleTitleValue(propValue);
} else if (propName.equals(Constants.PROPERTY_PHOTO) ||
propName.equals(Constants.PROPERTY_LOGO)) {
} else if (propName.equals(VCardConstants.PROPERTY_PHOTO) ||
propName.equals(VCardConstants.PROPERTY_LOGO)) {
Collection<String> paramMapValue = paramMap.get("VALUE");
if (paramMapValue != null && paramMapValue.contains("URL")) {
// Currently we do not have appropriate example for testing this case.
@@ -891,7 +892,7 @@ public class VCardEntry {
boolean isPrimary = false;
if (typeCollection != null) {
for (String typeValue : typeCollection) {
if (Constants.PARAM_TYPE_PREF.equals(typeValue)) {
if (VCardConstants.PARAM_TYPE_PREF.equals(typeValue)) {
isPrimary = true;
} else if (formatName == null){
formatName = typeValue;
@@ -900,8 +901,8 @@ public class VCardEntry {
}
addPhotoBytes(formatName, propBytes, isPrimary);
}
} else if (propName.equals(Constants.PROPERTY_TEL)) {
final Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
} else if (propName.equals(VCardConstants.PROPERTY_TEL)) {
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
final Object typeObject =
VCardUtils.getPhoneTypeFromStrings(typeCollection, propValue);
final int type;
@@ -915,18 +916,18 @@ public class VCardEntry {
}
final boolean isPrimary;
if (typeCollection != null && typeCollection.contains(Constants.PARAM_TYPE_PREF)) {
if (typeCollection != null && typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else {
isPrimary = false;
}
addPhone(type, propValue, label, isPrimary);
} else if (propName.equals(Constants.PROPERTY_X_SKYPE_PSTNNUMBER)) {
} else if (propName.equals(VCardConstants.PROPERTY_X_SKYPE_PSTNNUMBER)) {
// The phone number available via Skype.
Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
final int type = Phone.TYPE_OTHER;
final boolean isPrimary;
if (typeCollection != null && typeCollection.contains(Constants.PARAM_TYPE_PREF)) {
if (typeCollection != null && typeCollection.contains(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else {
isPrimary = false;
@@ -936,15 +937,15 @@ public class VCardEntry {
final int protocol = sImMap.get(propName);
boolean isPrimary = false;
int type = -1;
final Collection<String> typeCollection = paramMap.get(Constants.PARAM_TYPE);
final Collection<String> typeCollection = paramMap.get(VCardConstants.PARAM_TYPE);
if (typeCollection != null) {
for (String typeString : typeCollection) {
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
isPrimary = true;
} else if (type < 0) {
if (typeString.equalsIgnoreCase(Constants.PARAM_TYPE_HOME)) {
if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_HOME)) {
type = Im.TYPE_HOME;
} else if (typeString.equalsIgnoreCase(Constants.PARAM_TYPE_WORK)) {
} else if (typeString.equalsIgnoreCase(VCardConstants.PARAM_TYPE_WORK)) {
type = Im.TYPE_WORK;
}
}
@@ -954,22 +955,22 @@ public class VCardEntry {
type = Phone.TYPE_HOME;
}
addIm(protocol, null, type, propValue, isPrimary);
} else if (propName.equals(Constants.PROPERTY_NOTE)) {
} else if (propName.equals(VCardConstants.PROPERTY_NOTE)) {
addNote(propValue);
} else if (propName.equals(Constants.PROPERTY_URL)) {
} else if (propName.equals(VCardConstants.PROPERTY_URL)) {
if (mWebsiteList == null) {
mWebsiteList = new ArrayList<String>(1);
}
mWebsiteList.add(propValue);
} else if (propName.equals(Constants.PROPERTY_BDAY)) {
} else if (propName.equals(VCardConstants.PROPERTY_BDAY)) {
mBirthday = propValue;
} else if (propName.equals(Constants.PROPERTY_X_PHONETIC_FIRST_NAME)) {
} else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_FIRST_NAME)) {
mPhoneticGivenName = propValue;
} else if (propName.equals(Constants.PROPERTY_X_PHONETIC_MIDDLE_NAME)) {
} else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_MIDDLE_NAME)) {
mPhoneticMiddleName = propValue;
} else if (propName.equals(Constants.PROPERTY_X_PHONETIC_LAST_NAME)) {
} else if (propName.equals(VCardConstants.PROPERTY_X_PHONETIC_LAST_NAME)) {
mPhoneticFamilyName = propValue;
} else if (propName.equals(Constants.PROPERTY_X_ANDROID_CUSTOM)) {
} else if (propName.equals(VCardConstants.PROPERTY_X_ANDROID_CUSTOM)) {
final List<String> customPropertyList =
VCardUtils.constructListFromValue(propValue,
VCardConfig.isV30(mVCardType));
@@ -1247,10 +1248,10 @@ public class VCardEntry {
int size = customPropertyList.size();
if (size < 2 || TextUtils.isEmpty(customPropertyList.get(0))) {
continue;
} else if (size > Constants.MAX_DATA_COLUMN + 1) {
size = Constants.MAX_DATA_COLUMN + 1;
} else if (size > VCardConstants.MAX_DATA_COLUMN + 1) {
size = VCardConstants.MAX_DATA_COLUMN + 1;
customPropertyList =
customPropertyList.subList(0, Constants.MAX_DATA_COLUMN + 2);
customPropertyList.subList(0, VCardConstants.MAX_DATA_COLUMN + 2);
}
int i = 0;

View File

@@ -178,7 +178,7 @@ public class VCardParser_V21 extends VCardParser {
}
protected String getVersionString() {
return Constants.VERSION_V21;
return VCardConstants.VERSION_V21;
}
/**

View File

@@ -84,7 +84,7 @@ public class VCardParser_V30 extends VCardParser_V21 {
@Override
protected String getVersionString() {
return Constants.VERSION_V30;
return VCardConstants.VERSION_V30;
}
@Override

View File

@@ -50,41 +50,44 @@ public class VCardUtils {
sKnownPhoneTypesMap_ItoS = new HashMap<Integer, String>();
sKnownPhoneTypeMap_StoI = new HashMap<String, Integer>();
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);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_CAR, VCardConstants.PARAM_TYPE_CAR);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_TYPE_CAR, Phone.TYPE_CAR);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_PAGER, VCardConstants.PARAM_TYPE_PAGER);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_TYPE_PAGER, Phone.TYPE_PAGER);
sKnownPhoneTypesMap_ItoS.put(Phone.TYPE_ISDN, VCardConstants.PARAM_TYPE_ISDN);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_TYPE_ISDN, Phone.TYPE_ISDN);
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(VCardConstants.PARAM_TYPE_HOME, Phone.TYPE_HOME);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_TYPE_WORK, Phone.TYPE_WORK);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_TYPE_CELL, Phone.TYPE_MOBILE);
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(VCardConstants.PARAM_PHONE_EXTRA_TYPE_OTHER, Phone.TYPE_OTHER);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_PHONE_EXTRA_TYPE_CALLBACK,
Phone.TYPE_CALLBACK);
sKnownPhoneTypeMap_StoI.put(
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,
VCardConstants.PARAM_PHONE_EXTRA_TYPE_COMPANY_MAIN, Phone.TYPE_COMPANY_MAIN);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_PHONE_EXTRA_TYPE_RADIO, Phone.TYPE_RADIO);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_PHONE_EXTRA_TYPE_TTY_TDD,
Phone.TYPE_TTY_TDD);
sKnownPhoneTypeMap_StoI.put(VCardConstants.PARAM_PHONE_EXTRA_TYPE_ASSISTANT,
Phone.TYPE_ASSISTANT);
sPhoneTypesUnknownToContactsSet = new HashSet<String>();
sPhoneTypesUnknownToContactsSet.add(Constants.PARAM_TYPE_MODEM);
sPhoneTypesUnknownToContactsSet.add(Constants.PARAM_TYPE_BBS);
sPhoneTypesUnknownToContactsSet.add(Constants.PARAM_TYPE_VIDEO);
sPhoneTypesUnknownToContactsSet.add(VCardConstants.PARAM_TYPE_MODEM);
sPhoneTypesUnknownToContactsSet.add(VCardConstants.PARAM_TYPE_BBS);
sPhoneTypesUnknownToContactsSet.add(VCardConstants.PARAM_TYPE_VIDEO);
sKnownImPropNameMap_ItoS = new HashMap<Integer, String>();
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_AIM, Constants.PROPERTY_X_AIM);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_MSN, Constants.PROPERTY_X_MSN);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_YAHOO, Constants.PROPERTY_X_YAHOO);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_SKYPE, Constants.PROPERTY_X_SKYPE_USERNAME);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_GOOGLE_TALK, Constants.PROPERTY_X_GOOGLE_TALK);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_ICQ, Constants.PROPERTY_X_ICQ);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_JABBER, Constants.PROPERTY_X_JABBER);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_QQ, Constants.PROPERTY_X_QQ);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_NETMEETING, Constants.PROPERTY_X_NETMEETING);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_AIM, VCardConstants.PROPERTY_X_AIM);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_MSN, VCardConstants.PROPERTY_X_MSN);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_YAHOO, VCardConstants.PROPERTY_X_YAHOO);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_SKYPE, VCardConstants.PROPERTY_X_SKYPE_USERNAME);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_GOOGLE_TALK,
VCardConstants.PROPERTY_X_GOOGLE_TALK);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_ICQ, VCardConstants.PROPERTY_X_ICQ);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_JABBER, VCardConstants.PROPERTY_X_JABBER);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_QQ, VCardConstants.PROPERTY_X_QQ);
sKnownImPropNameMap_ItoS.put(Im.PROTOCOL_NETMEETING, VCardConstants.PROPERTY_X_NETMEETING);
// \u643A\u5E2F\u96FB\u8A71 = Full-width Hiragana "Keitai-Denwa" (mobile phone)
// \u643A\u5E2F = Full-width Hiragana "Keitai" (mobile phone)
@@ -119,9 +122,9 @@ public class VCardUtils {
continue;
}
typeString = typeString.toUpperCase();
if (typeString.equals(Constants.PARAM_TYPE_PREF)) {
if (typeString.equals(VCardConstants.PARAM_TYPE_PREF)) {
hasPref = true;
} else if (typeString.equals(Constants.PARAM_TYPE_FAX)) {
} else if (typeString.equals(VCardConstants.PARAM_TYPE_FAX)) {
isFax = true;
} else {
if (typeString.startsWith("X-") && type < 0) {

View File

@@ -26,6 +26,7 @@ import android.provider.ContactsContract.CommonDataKinds.Note;
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.Relation;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
@@ -52,12 +53,13 @@ public class VCardExporterTests extends VCardTestsBase {
VCardVerifier verifier = new VCardVerifier(resolver, V21);
verifier.addPropertyNodesVerifierElem()
.addNodeWithoutOrder("FN", "Roid Ando")
.addNodeWithoutOrder("N", "Ando;Roid;;;", Arrays.asList("Ando", "Roid", "", "", ""));
.addNodeWithoutOrder("N", "Ando;Roid;;;",
Arrays.asList("Ando", "Roid", "", "", ""));
verifier.verify();
}
private void testStructuredNameBasic(int version) {
final boolean isV30 = VCardConfig.isV30(version);
private void testStructuredNameBasic(int vcardType) {
final boolean isV30 = VCardConfig.isV30(vcardType);
ExportTestResolver resolver = new ExportTestResolver();
resolver.buildContactEntry().buildData(StructuredName.CONTENT_ITEM_TYPE)
@@ -70,7 +72,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_GIVEN_NAME, "AppropriatePhoneticGiven")
.put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
PropertyNodesVerifierElem elem = verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("N",
"AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
@@ -107,8 +109,8 @@ public class VCardExporterTests extends VCardTestsBase {
* which presume that there's only one property toward each of "N", "FN", etc.
* Note that more than one "N", "FN", etc. properties are acceptable in vCard spec.
*/
private void testStructuredNameUsePrimaryCommon(int version) {
final boolean isV30 = (version == V30);
private void testStructuredNameUsePrimaryCommon(int vcardType) {
final boolean isV30 = (vcardType == V30);
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -146,7 +148,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle2")
.put(StructuredName.IS_PRIMARY, 1);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
PropertyNodesVerifierElem elem = verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("N",
"AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
@@ -181,8 +183,8 @@ public class VCardExporterTests extends VCardTestsBase {
* Tests that only "super primary" StructuredName is emitted.
* See also the comment in {@link #testStructuredNameUsePrimaryCommon(int)}.
*/
private void testStructuredNameUseSuperPrimaryCommon(int version) {
final boolean isV30 = (version == V30);
private void testStructuredNameUseSuperPrimaryCommon(int vcardType) {
final boolean isV30 = (vcardType == V30);
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -231,7 +233,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle3")
.put(StructuredName.IS_PRIMARY, 1);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
PropertyNodesVerifierElem elem = verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("N",
"AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
@@ -274,14 +276,14 @@ public class VCardExporterTests extends VCardTestsBase {
verifier.verify();
}
private void testPhoneBasicCommon(int version) {
private void testPhoneBasicCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
resolver.buildContactEntry().buildData(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "1")
.put(Phone.TYPE, Phone.TYPE_HOME);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("TEL", "1", new TypeSet("HOME"));
@@ -299,7 +301,7 @@ public class VCardExporterTests extends VCardTestsBase {
/**
* Tests that vCard composer emits corresponding type param which we expect.
*/
private void testPhoneVariousTypeSupport(int version) {
private void testPhoneVariousTypeSupport(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -352,7 +354,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Phone.NUMBER, "160")
.put(Phone.TYPE, Phone.TYPE_MMS);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("TEL", "10", new TypeSet("HOME"))
.addNodeWithoutOrder("TEL", "20", new TypeSet("WORK"))
@@ -384,7 +386,7 @@ public class VCardExporterTests extends VCardTestsBase {
/**
* Tests that "PREF"s are emitted appropriately.
*/
private void testPhonePrefHandlingCommon(int version) {
private void testPhonePrefHandlingCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Phone.CONTENT_ITEM_TYPE)
@@ -402,7 +404,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Phone.NUMBER, "4")
.put(Phone.TYPE, Phone.TYPE_FAX_WORK);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("TEL", "4", new TypeSet("WORK", "FAX"))
.addNodeWithoutOrder("TEL", "3", new TypeSet("HOME", "FAX", "PREF"))
@@ -475,12 +477,12 @@ public class VCardExporterTests extends VCardTestsBase {
testMiscPhoneTypeHandling(V30);
}
private void testEmailBasicCommon(int version) {
private void testEmailBasicCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
resolver.buildContactEntry().buildData(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "sample@example.com");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("EMAIL", "sample@example.com");
@@ -496,7 +498,7 @@ public class VCardExporterTests extends VCardTestsBase {
testEmailBasicCommon(V30);
}
private void testEmailVariousTypeSupportCommon(int version) {
private void testEmailVariousTypeSupportCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -513,7 +515,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Email.DATA, "type_other@example.com")
.put(Email.TYPE, Email.TYPE_OTHER);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("EMAIL", "type_home@example.com", new TypeSet("HOME"))
@@ -532,7 +534,7 @@ public class VCardExporterTests extends VCardTestsBase {
testEmailVariousTypeSupportCommon(V30);
}
private void testEmailPrefHandlingCommon(int version) {
private void testEmailPrefHandlingCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -544,7 +546,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Email.DATA, "type_notype@example.com")
.put(Email.IS_PRIMARY, 1);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("EMAIL", "type_notype@example.com", new TypeSet("PREF"))
@@ -561,7 +563,7 @@ public class VCardExporterTests extends VCardTestsBase {
testEmailPrefHandlingCommon(V30);
}
private void testPostalOnlyWithStructuredDataCommon(int version) {
private void testPostalOnlyWithStructuredDataCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
// adr-value = 0*6(text-value ";") text-value
@@ -575,7 +577,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredPostal.REGION, "Region")
.put(StructuredPostal.POSTCODE, "100")
.put(StructuredPostal.COUNTRY, "Country");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("ADR", "Pobox;Neighborhood;Street;City;Region;100;Country",
Arrays.asList("Pobox", "Neighborhood", "Street", "City",
@@ -592,14 +594,14 @@ public class VCardExporterTests extends VCardTestsBase {
testPostalOnlyWithStructuredDataCommon(V30);
}
private void testPostalOnlyWithFormattedAddressCommon(int version) {
private void testPostalOnlyWithFormattedAddressCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
resolver.buildContactEntry().buildData(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.FORMATTED_ADDRESS,
"Formatted address CA 123-334 United Statue");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithOrder("ADR", ";Formatted address CA 123-334 United Statue;;;;;",
Arrays.asList("", "Formatted address CA 123-334 United Statue",
@@ -620,7 +622,7 @@ public class VCardExporterTests extends VCardTestsBase {
* Tests that the vCard composer honors formatted data when it is available
* even when it is partial.
*/
private void testPostalWithBothStructuredAndFormattedCommon(int version) {
private void testPostalWithBothStructuredAndFormattedCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
resolver.buildContactEntry().buildData(StructuredPostal.CONTENT_ITEM_TYPE)
@@ -629,7 +631,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredPostal.FORMATTED_ADDRESS,
"Formatted address CA 123-334 United Statue"); // Should be ignored
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("ADR", "Pobox;;;;;;Country",
Arrays.asList("Pobox", "", "", "", "", "", "Country"),
@@ -646,7 +648,7 @@ public class VCardExporterTests extends VCardTestsBase {
testPostalWithBothStructuredAndFormattedCommon(V30);
}
private void testOrganizationCommon(int version) {
private void testOrganizationCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Organization.CONTENT_ITEM_TYPE)
@@ -668,7 +670,7 @@ public class VCardExporterTests extends VCardTestsBase {
.putNull(Organization.DEPARTMENT)
.put(Organization.TITLE, "TitleXYZYX");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
// Currently we do not use group but depend on the order.
verifier.addPropertyNodesVerifierElemWithEmptyName()
@@ -690,7 +692,7 @@ public class VCardExporterTests extends VCardTestsBase {
testOrganizationCommon(V30);
}
private void testImVariousTypeSupportCommon(int version) {
private void testImVariousTypeSupportCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -732,7 +734,7 @@ public class VCardExporterTests extends VCardTestsBase {
// No determined way to express unknown type...
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("X-JABBER", "jabber")
.addNodeWithoutOrder("X-ICQ", "icq")
@@ -755,7 +757,7 @@ public class VCardExporterTests extends VCardTestsBase {
testImVariousTypeSupportCommon(V30);
}
private void testImPrefHandlingCommon(int version) {
private void testImPrefHandlingCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -769,7 +771,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Im.TYPE, Im.TYPE_HOME)
.put(Im.IS_PRIMARY, 1);
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("X-AIM", "aim1")
.addNodeWithoutOrder("X-AIM", "aim2", new TypeSet("HOME", "PREF"));
@@ -785,7 +787,7 @@ public class VCardExporterTests extends VCardTestsBase {
testImPrefHandlingCommon(V30);
}
private void testWebsiteCommon(int version) {
private void testWebsiteCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -798,7 +800,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Website.TYPE, Website.TYPE_FTP);
// We drop TYPE information since vCard (especially 3.0) does not allow us to emit it.
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("URL", "ftp://ftp.example.android.com/index.html")
.addNodeWithoutOrder("URL", "http://website.example.android.com/index.html");
@@ -813,7 +815,19 @@ public class VCardExporterTests extends VCardTestsBase {
testWebsiteCommon(V30);
}
private void testEventCommon(int version) {
private String getAndroidPropValue(final String mimeType, String value,
Integer type) {
return getAndroidPropValue(mimeType, value, type, null);
}
private String getAndroidPropValue(final String mimeType, String value,
Integer type, String label) {
return (mimeType + ";" + value + ";"
+ (type != null ? type : "") + ";"
+ (label != null ? label : "") + ";;;;;;;;;;;;");
}
private void testEventCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -832,12 +846,22 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Event.START_DATE, "When the Tower of Hanoi with 64 rings is completed.");
entry.buildData(Event.CONTENT_ITEM_TYPE)
.put(Event.TYPE, Event.TYPE_BIRTHDAY)
.put(Event.START_DATE, "2009-05-19");
.put(Event.START_DATE, "2009-05-19"); // Should be ignored.
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithoutOrder("BDAY", "2008-10-22");
.addNodeWithoutOrder("BDAY", "2008-10-22")
.addNodeWithoutOrder("X-ANDROID-CUSTOM",
getAndroidPropValue(
Event.CONTENT_ITEM_TYPE, "1982-06-16", Event.TYPE_ANNIVERSARY))
.addNodeWithoutOrder("X-ANDROID-CUSTOM",
getAndroidPropValue(
Event.CONTENT_ITEM_TYPE, "2018-03-12", Event.TYPE_OTHER))
.addNodeWithoutOrder("X-ANDROID-CUSTOM",
getAndroidPropValue(
Event.CONTENT_ITEM_TYPE,
"When the Tower of Hanoi with 64 rings is completed.",
Event.TYPE_CUSTOM, "The last day"));
verifier.verify();
}
@@ -849,7 +873,7 @@ public class VCardExporterTests extends VCardTestsBase {
testEventCommon(V30);
}
private void testNoteCommon(int version) {
private void testNoteCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
@@ -859,7 +883,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Note.NOTE, "note2")
.put(Note.IS_PRIMARY, 1); // Just ignored.
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElemWithEmptyName()
.addNodeWithOrder("NOTE", "note1")
.addNodeWithOrder("NOTE", "note2");
@@ -875,8 +899,8 @@ public class VCardExporterTests extends VCardTestsBase {
testNoteCommon(V30);
}
private void testPhotoCommon(int version) {
final boolean isV30 = version == V30;
private void testPhotoCommon(int vcardType) {
final boolean isV30 = vcardType == V30;
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
@@ -886,7 +910,7 @@ public class VCardExporterTests extends VCardTestsBase {
ContentValues contentValuesForPhoto = new ContentValues();
contentValuesForPhoto.put("ENCODING", (isV30 ? "b" : "BASE64"));
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElem()
.addNodeWithoutOrder("FN", "PhotoTest")
.addNodeWithoutOrder("N", "PhotoTest;;;;",
@@ -905,8 +929,31 @@ public class VCardExporterTests extends VCardTestsBase {
testPhotoCommon(V30);
}
private void testRelationCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Relation.CONTENT_ITEM_TYPE)
.put(Relation.TYPE, Relation.TYPE_MOTHER)
.put(Relation.NAME, "Ms. Mother");
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
ImportVerifierElem elem = verifier.addImportVerifier();
elem.addExpected(Relation.CONTENT_ITEM_TYPE)
.put(Relation.TYPE, Relation.TYPE_MOTHER)
.put(Relation.NAME, "Ms. Mother");
verifier.verify();
}
public void testRelationV21() {
testRelationCommon(V21);
}
public void testRelationV30() {
testRelationCommon(V30);
}
public void testV30HandleEscape() {
final int version = V30;
final int vcardType = V30;
ExportTestResolver resolver = new ExportTestResolver();
resolver.buildContactEntry().buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\\")
@@ -914,7 +961,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.MIDDLE_NAME, ",")
.put(StructuredName.PREFIX, "\n")
.put(StructuredName.DISPLAY_NAME, "[<{Unescaped:Asciis}>]");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
// Verifies the vCard String correctly escapes each character which must be escaped.
verifier.addLineVerifier()
.addExpected("N:\\\\;\\;;\\,;\\n;")
@@ -960,7 +1007,7 @@ public class VCardExporterTests extends VCardTestsBase {
verifier.verify();
}
private void testPickUpNonEmptyContentValuesCommon(int version) {
private void testPickUpNonEmptyContentValuesCommon(int vcardType) {
ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
@@ -975,7 +1022,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.FAMILY_NAME, "family3");
entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "family4");
VCardVerifier verifier = new VCardVerifier(resolver, version);
VCardVerifier verifier = new VCardVerifier(resolver, vcardType);
verifier.addPropertyNodesVerifierElem()
.addNodeWithoutOrder("N", Arrays.asList("family2", "", "", "", ""))
.addNodeWithoutOrder("FN", "family2");