summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-05-10 07:12:34 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-05-10 07:12:34 +0000
commitadc2ed66803515167ff914e2fdcc6b2afa0fdae7 (patch)
treeb664b53a6115df603c0a0172a594747026dc5da2
parentdd37a87e6ae7a836f4fe7a707bb005e247d35ae0 (diff)
parent3fa0107bc3ced321d6dfd00b31c86956a57a260f (diff)
downloadvcard-android13-mainline-conscrypt-release.tar.gz
Snap for 8564071 from 3fa0107bc3ced321d6dfd00b31c86956a57a260f to mainline-conscrypt-releaseaml_con_331413000aml_con_331411000aml_con_331312000aml_con_331115000aml_con_331011010android13-mainline-conscrypt-release
Change-Id: Iafcac698f6811454e4b4e999eb4ef5b4c3b08a0d
-rw-r--r--Android.bp4
-rw-r--r--java/com/android/vcard/VCardBuilder.java4
-rw-r--r--java/com/android/vcard/VCardComposer.java40
-rw-r--r--java/com/android/vcard/VCardConfig.java64
-rw-r--r--java/com/android/vcard/VCardConstants.java2
-rw-r--r--java/com/android/vcard/VCardEntry.java7
-rw-r--r--tests/res/raw/v30_adr_types.vcf8
-rw-r--r--tests/src/com/android/vcard/tests/VCardExporterTests.java96
-rw-r--r--tests/src/com/android/vcard/tests/VCardImporterTests.java28
-rw-r--r--tests/src/com/android/vcard/tests/VCardJapanizationTests.java5
-rw-r--r--tests/src/com/android/vcard/tests/testutils/VCardVerifier.java24
11 files changed, 270 insertions, 12 deletions
diff --git a/Android.bp b/Android.bp
index 25fc4e3..ac8ca69 100644
--- a/Android.bp
+++ b/Android.bp
@@ -23,4 +23,8 @@ java_library {
sdk_version: "9",
srcs: ["java/**/*.java"],
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.bluetooth",
+ ],
}
diff --git a/java/com/android/vcard/VCardBuilder.java b/java/com/android/vcard/VCardBuilder.java
index d273347..c938d04 100644
--- a/java/com/android/vcard/VCardBuilder.java
+++ b/java/com/android/vcard/VCardBuilder.java
@@ -1489,6 +1489,10 @@ public class VCardBuilder {
break;
}
case StructuredPostal.TYPE_OTHER: {
+ // {@code TYPE_OTHER} will be treated as a "custom type" in that a "X-" will be
+ // similarly prepended. According to RFC 2426, this constitutes a valid "x-name",
+ // which constitutes a valid "adr-type".
+ parameterList.add("X-" + VCardConstants.PARAM_ADR_EXTRA_TYPE_OTHER);
break;
}
default: {
diff --git a/java/com/android/vcard/VCardComposer.java b/java/com/android/vcard/VCardComposer.java
index 7b59c7d..ac278c3 100644
--- a/java/com/android/vcard/VCardComposer.java
+++ b/java/com/android/vcard/VCardComposer.java
@@ -599,22 +599,40 @@ public class VCardComposer {
return "";
} else {
final VCardBuilder builder = new VCardBuilder(mVCardType, mCharset);
- builder.appendNameProperties(contentValuesListMap.get(StructuredName.CONTENT_ITEM_TYPE))
- .appendNickNames(contentValuesListMap.get(Nickname.CONTENT_ITEM_TYPE))
+ builder.appendNameProperties(contentValuesListMap.get(
+ StructuredName.CONTENT_ITEM_TYPE))
.appendPhones(contentValuesListMap.get(Phone.CONTENT_ITEM_TYPE),
mPhoneTranslationCallback)
- .appendEmails(contentValuesListMap.get(Email.CONTENT_ITEM_TYPE))
- .appendPostals(contentValuesListMap.get(StructuredPostal.CONTENT_ITEM_TYPE))
- .appendOrganizations(contentValuesListMap.get(Organization.CONTENT_ITEM_TYPE))
- .appendWebsites(contentValuesListMap.get(Website.CONTENT_ITEM_TYPE));
+ .appendRelation(contentValuesListMap.get(Relation.CONTENT_ITEM_TYPE))
+ .appendIms(contentValuesListMap.get(Im.CONTENT_ITEM_TYPE))
+ .appendSipAddresses(contentValuesListMap.get(SipAddress.CONTENT_ITEM_TYPE));
+
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_NICKNAME_EXPORT) == 0) {
+ builder.appendNickNames(contentValuesListMap.get(Nickname.CONTENT_ITEM_TYPE));
+ }
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_EMAIL_EXPORT) == 0) {
+ builder.appendEmails(contentValuesListMap.get(Email.CONTENT_ITEM_TYPE));
+ }
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_ADDRESS_EXPORT) == 0) {
+ builder.appendPostals(contentValuesListMap.get(
+ StructuredPostal.CONTENT_ITEM_TYPE));
+ }
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_ORGANIZATION_EXPORT) == 0) {
+ builder.appendOrganizations(contentValuesListMap.get(
+ Organization.CONTENT_ITEM_TYPE));
+ }
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_WEBSITES_EXPORT) == 0) {
+ builder.appendWebsites(contentValuesListMap.get(Website.CONTENT_ITEM_TYPE));
+ }
if ((mVCardType & VCardConfig.FLAG_REFRAIN_IMAGE_EXPORT) == 0) {
builder.appendPhotos(contentValuesListMap.get(Photo.CONTENT_ITEM_TYPE));
}
- builder.appendNotes(contentValuesListMap.get(Note.CONTENT_ITEM_TYPE))
- .appendEvents(contentValuesListMap.get(Event.CONTENT_ITEM_TYPE))
- .appendIms(contentValuesListMap.get(Im.CONTENT_ITEM_TYPE))
- .appendSipAddresses(contentValuesListMap.get(SipAddress.CONTENT_ITEM_TYPE))
- .appendRelation(contentValuesListMap.get(Relation.CONTENT_ITEM_TYPE));
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_NOTES_EXPORT) == 0) {
+ builder.appendNotes(contentValuesListMap.get(Note.CONTENT_ITEM_TYPE));
+ }
+ if ((mVCardType & VCardConfig.FLAG_REFRAIN_EVENTS_EXPORT) == 0) {
+ builder.appendEvents(contentValuesListMap.get(Event.CONTENT_ITEM_TYPE));
+ }
return builder.toString();
}
}
diff --git a/java/com/android/vcard/VCardConfig.java b/java/com/android/vcard/VCardConfig.java
index 006241e..675880e 100644
--- a/java/com/android/vcard/VCardConfig.java
+++ b/java/com/android/vcard/VCardConfig.java
@@ -245,6 +245,70 @@ public class VCardConfig {
*/
public static final int FLAG_REFRAIN_IMAGE_EXPORT = 0x00800000;
+ /**
+ * <P>
+ * The flag asking exporter to refrain events export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_EVENTS_EXPORT = 0x00400000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain addess export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_ADDRESS_EXPORT = 0x00200000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain email export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_EMAIL_EXPORT = 0x00100000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain organization export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_ORGANIZATION_EXPORT = 0x00080000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain notes export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_NOTES_EXPORT = 0x00040000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain phonetic name export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_PHONETIC_NAME_EXPORT = 0x00020000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain websites export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_WEBSITES_EXPORT = 0x00010000;
+
+ /**
+ * <P>
+ * The flag asking exporter to refrain nickname export.
+ * </P>
+ * @hide will be deleted in the near future.
+ */
+ public static final int FLAG_REFRAIN_NICKNAME_EXPORT = 0x00008000;
+
//// The followings are VCard types available from importer/exporter. ////
/**
diff --git a/java/com/android/vcard/VCardConstants.java b/java/com/android/vcard/VCardConstants.java
index 67c07b7..ed0c34e 100644
--- a/java/com/android/vcard/VCardConstants.java
+++ b/java/com/android/vcard/VCardConstants.java
@@ -153,6 +153,8 @@ public class VCardConstants {
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";
+ // {@link VCardBuilder} translates this type to "X-OTHER".
+ public static final String PARAM_ADR_EXTRA_TYPE_OTHER = "OTHER";
public static final String PARAM_LANGUAGE = "LANGUAGE";
diff --git a/java/com/android/vcard/VCardEntry.java b/java/com/android/vcard/VCardEntry.java
index ee60578..8054bb7 100644
--- a/java/com/android/vcard/VCardEntry.java
+++ b/java/com/android/vcard/VCardEntry.java
@@ -2223,6 +2223,13 @@ public class VCardEntry {
} else {
label = typeStringOrg;
}
+ // {@link ContactsContract} has a {@link StructuredPostal.TYPE_OTHER}, so
+ // if the custom type is "other", map it from {@code TYPE_CUSTOM} to
+ // {@code TYPE_OTHER}.
+ if (VCardConstants.PARAM_ADR_EXTRA_TYPE_OTHER.equals(label.toUpperCase())) {
+ type = StructuredPostal.TYPE_OTHER;
+ label = null;
+ }
}
}
}
diff --git a/tests/res/raw/v30_adr_types.vcf b/tests/res/raw/v30_adr_types.vcf
new file mode 100644
index 0000000..55dd1b4
--- /dev/null
+++ b/tests/res/raw/v30_adr_types.vcf
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Familyname;Givenname;;;
+FN:Givenname Familyname
+ADR;TYPE=WORK:;;1010 Technology Pkwy\, Silicon City\, Somecountry;;;;
+ADR;TYPE=X-Other:;;123 Main St\, Anytown\, Anywhere;;;;
+ADR;TYPE=X-School:;;112358 Academic Lane\, College Town\, Someplace Great;;;;
+END:VCARD
diff --git a/tests/src/com/android/vcard/tests/VCardExporterTests.java b/tests/src/com/android/vcard/tests/VCardExporterTests.java
index 42f9445..910e3f7 100644
--- a/tests/src/com/android/vcard/tests/VCardExporterTests.java
+++ b/tests/src/com/android/vcard/tests/VCardExporterTests.java
@@ -17,6 +17,7 @@
package com.android.vcard.tests;
import com.android.vcard.VCardConfig;
+import com.android.vcard.VCardConstants;
import com.android.vcard.tests.testutils.ContactEntry;
import com.android.vcard.tests.testutils.PropertyNodesVerifierElem;
import com.android.vcard.tests.testutils.PropertyNodesVerifierElem.TypeSet;
@@ -885,6 +886,45 @@ public class VCardExporterTests extends VCardTestsBase {
testPostalWithBothStructuredAndFormattedCommon(V40);
}
+ private void testPostalAddressTypeHandlingCommon(int vcardType) {
+ mVerifier.initForExportTest(vcardType);
+
+ ContactEntry entry = mVerifier.addInputEntry();
+ entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.STREET, "1010 Technology Pkwy")
+ .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK);
+ entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.STREET, "123 Main St")
+ .put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER);
+ entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.STREET, "112358 Academic Lane")
+ .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
+ .put(StructuredPostal.LABEL, "School");
+
+ PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElemWithEmptyName();
+ elem.addExpectedNode("ADR",
+ Arrays.asList("", "", "1010 Technology Pkwy", "", "", "", ""),
+ new TypeSet(VCardConstants.PARAM_TYPE_WORK));
+ elem.addExpectedNode("ADR",
+ Arrays.asList("", "", "123 Main St", "", "", "", ""),
+ new TypeSet("X-" + VCardConstants.PARAM_ADR_EXTRA_TYPE_OTHER));
+ elem.addExpectedNode("ADR",
+ Arrays.asList("", "", "112358 Academic Lane", "", "", "", ""),
+ new TypeSet("X-School"));
+ }
+
+ public void testPostalAddressTypeHandlingV21() {
+ testPostalAddressTypeHandlingCommon(V21);
+ }
+
+ public void testPostalAddressTypeHandlingV30() {
+ testPostalAddressTypeHandlingCommon(V30);
+ }
+
+ public void testPostalAddressTypeHandlingV40() {
+ testPostalAddressTypeHandlingCommon(V40);
+ }
+
private void testOrganizationCommon(int vcardType) {
mVerifier.initForExportTest(vcardType);
ContactEntry entry = mVerifier.addInputEntry();
@@ -1319,4 +1359,60 @@ public class VCardExporterTests extends VCardTestsBase {
mVerifier.addPropertyNodesVerifierElemWithEmptyName()
.addExpectedNode("TEL", "sip:android@example.com");
}
+
+ public void testRefrainFlags() {
+ int vCardType = V30;
+ vCardType |= VCardConfig.FLAG_REFRAIN_ADDRESS_EXPORT |
+ VCardConfig.FLAG_REFRAIN_EMAIL_EXPORT |
+ VCardConfig.FLAG_REFRAIN_EMAIL_EXPORT |
+ VCardConfig.FLAG_REFRAIN_ORGANIZATION_EXPORT |
+ VCardConfig.FLAG_REFRAIN_WEBSITES_EXPORT |
+ VCardConfig.FLAG_REFRAIN_NOTES_EXPORT |
+ VCardConfig.FLAG_REFRAIN_NICKNAME_EXPORT |
+ VCardConfig.FLAG_REFRAIN_EVENTS_EXPORT |
+ VCardConfig.FLAG_REFRAIN_IMAGE_EXPORT;
+
+ mVerifier.initForExportTest(vCardType);
+
+ final ContactEntry entry = mVerifier.addInputEntry();
+ entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
+ .put(StructuredName.DISPLAY_NAME, StructuredName.CONTENT_ITEM_TYPE);
+ entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.FORMATTED_ADDRESS, StructuredPostal.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Email.CONTENT_ITEM_TYPE)
+ .put(Email.ADDRESS, Email.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Organization.CONTENT_ITEM_TYPE)
+ .put(Organization.COMPANY, Organization.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Website.CONTENT_ITEM_TYPE)
+ .put(Website.URL, Website.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Note.CONTENT_ITEM_TYPE)
+ .put(Note.NOTE, Note.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Nickname.CONTENT_ITEM_TYPE)
+ .put(Nickname.NAME, Nickname.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Event.CONTENT_ITEM_TYPE)
+ .put(Event.START_DATE, Event.CONTENT_ITEM_TYPE);
+ entry.addContentValues(Photo.CONTENT_ITEM_TYPE)
+ .put(Photo.PHOTO_FILE_ID, Photo.CONTENT_ITEM_TYPE);
+
+ final String vcard = mVerifier.buildVCardForExportTest();
+
+ assertFalse("Address should not be present.",
+ vcard.contains(StructuredPostal.CONTENT_ITEM_TYPE));
+ assertFalse("Email should not be present.",
+ vcard.contains(Email.CONTENT_ITEM_TYPE));
+ assertFalse("Organization should not be present.",
+ vcard.contains(Organization.CONTENT_ITEM_TYPE));
+ assertFalse("Website should not be present.",
+ vcard.contains(Website.CONTENT_ITEM_TYPE));
+ assertFalse("Note should not be present.",
+ vcard.contains(Note.CONTENT_ITEM_TYPE));
+ assertFalse("Nickname should not be present.",
+ vcard.contains(Nickname.CONTENT_ITEM_TYPE));
+ assertFalse("Event should not be present.",
+ vcard.contains(Event.CONTENT_ITEM_TYPE));
+ assertFalse("Photo should not be present.",
+ vcard.contains(Photo.CONTENT_ITEM_TYPE));
+ assertTrue("Name should be present. ",
+ vcard.contains(StructuredName.CONTENT_ITEM_TYPE));
+ }
}
diff --git a/tests/src/com/android/vcard/tests/VCardImporterTests.java b/tests/src/com/android/vcard/tests/VCardImporterTests.java
index 7b4e669..b4713d0 100644
--- a/tests/src/com/android/vcard/tests/VCardImporterTests.java
+++ b/tests/src/com/android/vcard/tests/VCardImporterTests.java
@@ -555,6 +555,34 @@ public class VCardImporterTests extends VCardTestsBase {
testComplicatedCase_Parsing(V21, R.raw.v21_complicated);
}
+ public void testV30adr_types_various() {
+ mVerifier.initForImportTest(V30, R.raw.v30_adr_types);
+ ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
+ elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
+ .put(StructuredName.FAMILY_NAME, "Familyname")
+ .put(StructuredName.GIVEN_NAME, "Givenname")
+ .put(StructuredName.DISPLAY_NAME, "Givenname Familyname");
+ elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
+ .put(StructuredPostal.STREET,
+ "1010 Technology Pkwy, Silicon City, Somecountry")
+ .put(StructuredPostal.FORMATTED_ADDRESS,
+ "1010 Technology Pkwy, Silicon City, Somecountry");
+ elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER)
+ .put(StructuredPostal.STREET,
+ "123 Main St, Anytown, Anywhere")
+ .put(StructuredPostal.FORMATTED_ADDRESS,
+ "123 Main St, Anytown, Anywhere");
+ elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
+ .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
+ .put(StructuredPostal.LABEL, "School")
+ .put(StructuredPostal.STREET,
+ "112358 Academic Lane, College Town, Someplace Great")
+ .put(StructuredPostal.FORMATTED_ADDRESS,
+ "112358 Academic Lane, College Town, Someplace Great");
+ }
+
public void testV30ComplicatedCase_Parsing() {
testComplicatedCase_Parsing(V30, R.raw.v30_complicated);
}
diff --git a/tests/src/com/android/vcard/tests/VCardJapanizationTests.java b/tests/src/com/android/vcard/tests/VCardJapanizationTests.java
index 19f70df..5921e31 100644
--- a/tests/src/com/android/vcard/tests/VCardJapanizationTests.java
+++ b/tests/src/com/android/vcard/tests/VCardJapanizationTests.java
@@ -23,6 +23,7 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import com.android.vcard.VCardConfig;
+import com.android.vcard.VCardConstants;
import com.android.vcard.tests.testutils.ContactEntry;
import com.android.vcard.tests.testutils.ContentValuesBuilder;
import com.android.vcard.tests.testutils.PropertyNodesVerifierElem;
@@ -325,7 +326,9 @@ public class VCardJapanizationTests extends VCardTestsBase {
.addExpectedNode("X-REDUCTION", "")
.addExpectedNode("X-NO", "")
.addExpectedNode("X-DCM-HMN-MODE", "")
- .addExpectedNode("ADR", Arrays.asList("2", "", "", "", "", "", ""));
+ .addExpectedNode("ADR",
+ Arrays.asList("2", "", "", "", "", "", ""),
+ new TypeSet("X-" + VCardConstants.PARAM_ADR_EXTRA_TYPE_OTHER));
}
/**
diff --git a/tests/src/com/android/vcard/tests/testutils/VCardVerifier.java b/tests/src/com/android/vcard/tests/testutils/VCardVerifier.java
index 3e787de..7c40382 100644
--- a/tests/src/com/android/vcard/tests/testutils/VCardVerifier.java
+++ b/tests/src/com/android/vcard/tests/testutils/VCardVerifier.java
@@ -372,4 +372,28 @@ public class VCardVerifier {
composer.terminate();
}
}
+
+ public String buildVCardForExportTest() {
+ final CustomMockContext context = new CustomMockContext(mExportTestResolver);
+ final ContentResolver resolver = context.getContentResolver();
+ final VCardComposer composer = new VCardComposer(context, mVCardType, mCharset);
+ // projection is ignored.
+ final Cursor cursor = resolver.query(CONTACTS_TEST_CONTENT_URI, null, null, null, null);
+ if (!composer.init(cursor)) {
+ AndroidTestCase.fail("init() failed. Reason: " + composer.getErrorReason());
+ }
+ AndroidTestCase.assertFalse(composer.isAfterLast());
+
+ Method mockGetEntityIteratorMethod = null;
+ try {
+ mockGetEntityIteratorMethod = getMockGetEntityIteratorMethod();
+ } catch (Exception e) {
+ AndroidTestCase.fail("Exception thrown: " + e);
+ }
+ AndroidTestCase.assertNotNull(mockGetEntityIteratorMethod);
+ final String vcard = composer.createOneEntry(mockGetEntityIteratorMethod);
+ AndroidTestCase.assertNotNull(vcard);
+ composer.terminate();
+ return vcard;
+ }
}