diff options
author | Ricki Hirner <hirner@bitfire.at> | 2021-07-29 13:49:04 +0300 |
---|---|---|
committer | Ricki Hirner <hirner@bitfire.at> | 2021-07-29 13:49:04 +0300 |
commit | 7bd858698d597abfa24016a2a1bde54ba35bff90 (patch) | |
tree | e62ac9e0941363481d4102e8056eaf2dc14200a2 | |
parent | 3ac3015cbd7e56b3c3b226c40a557bb986111af0 (diff) |
Preserve labels of unknown properties
-rw-r--r-- | src/main/java/at/bitfire/vcard4android/Contact.kt | 31 | ||||
-rw-r--r-- | src/test/java/at/bitfire/vcard4android/ContactTest.kt | 14 | ||||
-rw-r--r-- | src/test/resources/allfields-vcard3.vcf | 1 | ||||
-rw-r--r-- | src/test/resources/unknown-properties-with-labels.vcf | 6 |
4 files changed, 40 insertions, 12 deletions
diff --git a/src/main/java/at/bitfire/vcard4android/Contact.kt b/src/main/java/at/bitfire/vcard4android/Contact.kt index 0bd7dca..60d5a2f 100644 --- a/src/main/java/at/bitfire/vcard4android/Contact.kt +++ b/src/main/java/at/bitfire/vcard4android/Contact.kt @@ -131,13 +131,20 @@ class Contact { val c = Contact() // get X-ABLabels - val labels = vCard.getExtendedProperties(LabeledProperty.PROPERTY_AB_LABEL)!! - vCard.removeExtendedProperty(LabeledProperty.PROPERTY_AB_LABEL) + val labels = vCard.getExtendedProperties(LabeledProperty.PROPERTY_AB_LABEL) - fun findLabel(group: String?): String? { + fun findAndRemoveLabel(group: String?): String? { if (group == null) return null - return labels.firstOrNull { it.group.equals(group, true) }?.value + + for (label in labels) { + if (label.group.equals(group, true)) { + vCard.extendedProperties.remove(label) + return label.value + } + } + + return null } // process standard properties @@ -157,21 +164,21 @@ class Contact { c.familyName = StringUtils.trimToNull(prop.family) c.suffix = StringUtils.trimToNull(prop.suffixes.joinToString(" ")) } - is Nickname -> c.nickName = LabeledProperty(prop, findLabel(prop.group)) + is Nickname -> c.nickName = LabeledProperty(prop, findAndRemoveLabel(prop.group)) is Organization -> c.organization = prop is Title -> c.jobTitle = StringUtils.trimToNull(prop.value) is Role -> c.jobDescription = StringUtils.trimToNull(prop.value) is Telephone -> if (!prop.text.isNullOrBlank()) - c.phoneNumbers += LabeledProperty(prop, findLabel(prop.group)) + c.phoneNumbers += LabeledProperty(prop, findAndRemoveLabel(prop.group)) is Email -> if (!prop.value.isNullOrBlank()) - c.emails += LabeledProperty(prop, findLabel(prop.group)) - is Impp -> c.impps += LabeledProperty(prop, findLabel(prop.group)) - is Address -> c.addresses += LabeledProperty(prop, findLabel(prop.group)) + c.emails += LabeledProperty(prop, findAndRemoveLabel(prop.group)) + is Impp -> c.impps += LabeledProperty(prop, findAndRemoveLabel(prop.group)) + is Address -> c.addresses += LabeledProperty(prop, findAndRemoveLabel(prop.group)) is Note -> c.note = if (c.note.isNullOrEmpty()) prop.value else "${c.note}\n\n\n${prop.value}" - is Url -> c.urls += LabeledProperty(prop, findLabel(prop.group)) + is Url -> c.urls += LabeledProperty(prop, findAndRemoveLabel(prop.group)) is Categories -> c.categories.addAll(prop.values) is Birthday -> c.birthDay = checkVCard3PartialDate(prop) @@ -221,7 +228,7 @@ class Contact { PROPERTY_PHONETIC_MIDDLE_NAME -> c.phoneticMiddleName = StringUtils.trimToNull(prop.value) PROPERTY_PHONETIC_LAST_NAME -> c.phoneticFamilyName = StringUtils.trimToNull(prop.value) - PROPERTY_SIP -> c.impps += LabeledProperty(Impp("sip", prop.value), findLabel(prop.group)) + PROPERTY_SIP -> c.impps += LabeledProperty(Impp("sip", prop.value), findAndRemoveLabel(prop.group)) else -> remove = false // don't remove unknown extended properties } @@ -375,7 +382,7 @@ class Contact { jobTitle?.let { vCard.addTitle(it) } jobDescription?.let { vCard.addRole(it) } - // will be used to count "davdroidXX." property groups + // will be used to count "itemXX." property groups val labelIterator = AtomicInteger() // TODO outside function outside; make clear that it modifies labeledProperty.property fun addLabel(labeledProperty: LabeledProperty<VCardProperty>) { diff --git a/src/test/java/at/bitfire/vcard4android/ContactTest.kt b/src/test/java/at/bitfire/vcard4android/ContactTest.kt index ea2c6af..3f9682e 100644 --- a/src/test/java/at/bitfire/vcard4android/ContactTest.kt +++ b/src/test/java/at/bitfire/vcard4android/ContactTest.kt @@ -190,6 +190,15 @@ class ContactTest { assertFalse(c.unknownProperties!!.contains("REV")) } + @Test + fun testUnknownPropertiesLabels() { + // X-ABLabels belonging to unknown properties shouldn't be dropped + val c = parseContact("unknown-properties-with-labels.vcf") + assertEquals("Unknown property with label", c.displayName) + assertTrue(c.unknownProperties!!.contains("item1.X-Unknown:TestValue")) + assertTrue(c.unknownProperties!!.contains("item1.X-ABLabel:TestLabel")) + } + @Test fun testVCard3FieldsAsVCard3() { @@ -298,6 +307,11 @@ class ContactTest { assertNull(addr.property.region) assertEquals("4043", addr.property.postalCode) assertEquals("Klöster-Reich", addr.property.country) + assertEquals("BEGIN:VCARD\r\n" + + "VERSION:3.0\r\n" + + "PRODID:ez-vcard 0.11.2\r\n" + + "X-TEST;A=B:Value\r\n" + + "END:VCARD\r\n", c.unknownProperties) // NOTE assertEquals("This fax number is operational 0800 to 1715 EST, Mon-Fri.\n\n\nSecond note", c.note) diff --git a/src/test/resources/allfields-vcard3.vcf b/src/test/resources/allfields-vcard3.vcf index bec2886..af253a5 100644 --- a/src/test/resources/allfields-vcard3.vcf +++ b/src/test/resources/allfields-vcard3.vcf @@ -37,4 +37,5 @@ ANNIVERSARY:2014-08-12 RELATED;CHARSET=UTF-8;TYPE=co-worker,crush;VALUE=text:Ägidius RELATED;TYPE=parent;VALUE=text:muuuum PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAKACABAREA/8QAFgABAQEAAAAAAAAAAAAAAAAAAAgE/8QAIBAAAQQCAwEBAQAAAAAAAAAABAECAwUABgcREggUFf/aAAgBAQAAPwC/huVQw/pq74hvt0qhP16fQ2mu0hBEERRhUhV0h0g7V6ln6hDFV6J6axrEd0305XS/xR9SbWRxtLudn9HibSOLT8SW2wWBf8VsGvl3F7KPehyOFHiZAxozGorZ/UsKKrvbV6cl1VNtVX9UHe0VmJY1tiPGWGYJM2aAmCRqOjljkaqtexzVRyORVRUVFTNeMYxn/9k= +X-TEST;A=B:Value END:VCARD diff --git a/src/test/resources/unknown-properties-with-labels.vcf b/src/test/resources/unknown-properties-with-labels.vcf new file mode 100644 index 0000000..efd837e --- /dev/null +++ b/src/test/resources/unknown-properties-with-labels.vcf @@ -0,0 +1,6 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Unknown property with label +item1.X-Unknown:TestValue +item1.X-ABLabel:TestLabel +END:VCARD |