diff options
author | Ricki Hirner <hirner@bitfire.at> | 2022-09-27 16:16:07 +0300 |
---|---|---|
committer | Ricki Hirner <hirner@bitfire.at> | 2022-09-27 16:17:43 +0300 |
commit | 581eac4117634bf59eba14b69acb8bb1cce95d2a (patch) | |
tree | b1d56ff2ffda56a836937b77255166635e85d383 | |
parent | 4c30847ab55eda44b3b0cee2d03a7d597a83c6aa (diff) |
Don't send Android's StructuredPostal.FORMATTED_ADDRESS as vCard LABEL anymore8-support-is_read_only-for-data-and-group-rows
- FORMATTED_ADDRESS is only used for displaying the contact on Android; it can't be set by users
- generated LABELs that don't have additional information are redundant and regularly confuse other clients and users
- the valid case that we receive a LABEL and should retain it is less important that the two cases mentioned above
4 files changed, 18 insertions, 17 deletions
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt index c9d5632..b434c26 100644 --- a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt +++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt @@ -62,7 +62,7 @@ class StructuredPostalBuilderTest { assertEquals("ZIP", result[0].values[StructuredPostal.POSTCODE]) assertEquals("Country", result[0].values[StructuredPostal.COUNTRY]) - assertEquals("Street 1\n" + + assertEquals("Street 1\n" + // European format "(Corner Street 2)\n" + "PO Box 123\n" + "Hood\n" + diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt index 0dbb278..e63ae78 100644 --- a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt +++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt @@ -45,7 +45,7 @@ class StructuredPostalHandlerTest { assertArrayEquals(arrayOf("Sampleregion"), contact.addresses[0].property.regions.toTypedArray()) assertArrayEquals(arrayOf("ZIP"), contact.addresses[0].property.postalCodes.toTypedArray()) assertArrayEquals(arrayOf("Samplecountry"), contact.addresses[0].property.countries.toTypedArray()) - assertEquals("Full Formatted Address", contact.addresses[0].property.label) + assertNull(contact.addresses[0].property.label) } diff --git a/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt index 82992fc..c593bce 100644 --- a/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt +++ b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt @@ -14,20 +14,6 @@ import java.util.* /** * Data row builder for structured addresses. - * - * Android requires a formatted address. If the contact data doesn't contain a - * formatted address, it's built like this: - * - * | field | example | - * |-------------------|------------------------------| - * | street | Sample Street 123 | - * | poBox | P/O Box 45 | - * | extended | Near the park | - * | postalCode city | 12345 Sampletown | - * | country (region) | Samplecountry (Sampleregion) | - * - * TODO: should be localized (there are many different international formats) - * */ class StructuredPostalBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact) : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) { @@ -37,6 +23,12 @@ class StructuredPostalBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Con for (labeledAddress in contact.addresses) { val address = labeledAddress.property + /* Generate the formatted address (the one contacts app show in the preview) in European format. + * + * If we wouldn't do that, the content provider would format it US-EN or JP style: + * https://android.googlesource.com/platform/packages/providers/ContactsProvider.git/+/refs/heads/android13-release/src/com/android/providers/contacts/PostalSplitter.java#84 + * + * Could be localized here (but it's still only for viewing the contact on Android and won't be put into a vCard). */ var formattedAddress = address.label if (formattedAddress.isNullOrBlank()) { val lines = LinkedList<String>() diff --git a/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt index 2dc0eda..9e9341a 100644 --- a/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt +++ b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt @@ -21,7 +21,16 @@ object StructuredPostalHandler: DataRowHandler() { val address = Address() val labeledAddress = LabeledProperty(address) - address.label = values.getAsString(StructuredPostal.FORMATTED_ADDRESS) + /* Sep 2022: We don't set the vCard LABEL anymore. Reasons: + * + * 1. It can't be entered by the user anyway because no contacts app has a separate field for "formatted address" + * [https://www.davx5.com/faq/entering-structured-addresses], which is only used as read-only field to display an address. + * 2. It confuses other CalDAV user agents which don't support LABEL (the majority). When such a client receives + * and retains the LABEL although the structured address is changed, there are two inconsistent addresses. + * [https://github.com/nextcloud/contacts/issues/1900] + */ + //address.label = values.getAsString(StructuredPostal.FORMATTED_ADDRESS) + when (values.getAsInteger(StructuredPostal.TYPE)) { StructuredPostal.TYPE_HOME -> address.types += AddressType.HOME |