diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-05-10 07:12:34 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-05-10 07:12:34 +0000 |
commit | adc2ed66803515167ff914e2fdcc6b2afa0fdae7 (patch) | |
tree | b664b53a6115df603c0a0172a594747026dc5da2 | |
parent | dd37a87e6ae7a836f4fe7a707bb005e247d35ae0 (diff) | |
parent | 3fa0107bc3ced321d6dfd00b31c86956a57a260f (diff) | |
download | vcard-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.bp | 4 | ||||
-rw-r--r-- | java/com/android/vcard/VCardBuilder.java | 4 | ||||
-rw-r--r-- | java/com/android/vcard/VCardComposer.java | 40 | ||||
-rw-r--r-- | java/com/android/vcard/VCardConfig.java | 64 | ||||
-rw-r--r-- | java/com/android/vcard/VCardConstants.java | 2 | ||||
-rw-r--r-- | java/com/android/vcard/VCardEntry.java | 7 | ||||
-rw-r--r-- | tests/res/raw/v30_adr_types.vcf | 8 | ||||
-rw-r--r-- | tests/src/com/android/vcard/tests/VCardExporterTests.java | 96 | ||||
-rw-r--r-- | tests/src/com/android/vcard/tests/VCardImporterTests.java | 28 | ||||
-rw-r--r-- | tests/src/com/android/vcard/tests/VCardJapanizationTests.java | 5 | ||||
-rw-r--r-- | tests/src/com/android/vcard/tests/testutils/VCardVerifier.java | 24 |
11 files changed, 270 insertions, 12 deletions
@@ -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; + } } |