Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bitfireAT/vcard4android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicki Hirner <hirner@bitfire.at>2021-07-29 13:49:04 +0300
committerRicki Hirner <hirner@bitfire.at>2021-07-29 13:49:04 +0300
commit7bd858698d597abfa24016a2a1bde54ba35bff90 (patch)
treee62ac9e0941363481d4102e8056eaf2dc14200a2
parent3ac3015cbd7e56b3c3b226c40a557bb986111af0 (diff)
Preserve labels of unknown properties
-rw-r--r--src/main/java/at/bitfire/vcard4android/Contact.kt31
-rw-r--r--src/test/java/at/bitfire/vcard4android/ContactTest.kt14
-rw-r--r--src/test/resources/allfields-vcard3.vcf1
-rw-r--r--src/test/resources/unknown-properties-with-labels.vcf6
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