From 344aed2df4da72577cd28ffeffe61b4940544f0c Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Mon, 4 Oct 2021 14:18:39 +0200 Subject: Contact: list of members is now a Set (was: List) --- .../java/at/bitfire/vcard4android/CachedGroupMembership.kt | 14 ++++++++++++++ src/main/java/at/bitfire/vcard4android/Contact.kt | 5 ++--- .../java/at/bitfire/vcard4android/ContactReaderTest.kt | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/bitfire/vcard4android/CachedGroupMembership.kt b/src/main/java/at/bitfire/vcard4android/CachedGroupMembership.kt index 4cd2310..0a06838 100644 --- a/src/main/java/at/bitfire/vcard4android/CachedGroupMembership.kt +++ b/src/main/java/at/bitfire/vcard4android/CachedGroupMembership.kt @@ -10,6 +10,20 @@ package at.bitfire.vcard4android import android.provider.ContactsContract.RawContacts.Data +/** + * Represents a "cached group membership" row. Cached group memberships exist only + * for one reason, which _only_ applies to the vCard4 (KIND/MEMBER) group method: + * + * Every group has its list of members. When a contact's group memberships are changed, + * the contact is automatically set to dirty, but the group itself is not! + * + * So we keep a copy of all group membership rows as "cached memberships". At the + * beginning of every sync, the group memberships of every contact are compared with + * its cached group memberships. If they differ, the respective contact group + * is set to dirty (because its memberships have changed). + * + * Cached group memberships must not be used for anything else that detecting dirty groups. + */ object CachedGroupMembership { const val CONTENT_ITEM_TYPE = "x.davdroid/cached-group-membership" diff --git a/src/main/java/at/bitfire/vcard4android/Contact.kt b/src/main/java/at/bitfire/vcard4android/Contact.kt index 442b1bc..98618f8 100644 --- a/src/main/java/at/bitfire/vcard4android/Contact.kt +++ b/src/main/java/at/bitfire/vcard4android/Contact.kt @@ -12,8 +12,6 @@ import at.bitfire.vcard4android.property.CustomScribes.registerCustomScribes import at.bitfire.vcard4android.property.XAbDate import ezvcard.VCardVersion import ezvcard.io.text.VCardReader -import ezvcard.parameter.EmailType -import ezvcard.parameter.TelephoneType import ezvcard.property.* import org.apache.commons.lang3.builder.HashCodeBuilder import org.apache.commons.lang3.builder.ReflectionToStringBuilder @@ -21,6 +19,7 @@ import java.io.IOException import java.io.OutputStream import java.io.Reader import java.util.* +import kotlin.collections.HashSet /** * Data class for a contact; between vCards and the Android contacts provider. @@ -40,7 +39,7 @@ class Contact { var group = false /** list of UIDs of group members without urn:uuid prefix (only meaningful if [group] is true) */ - val members = LinkedList() + val members = mutableSetOf() var displayName: String? = null var prefix: String? = null diff --git a/src/test/java/at/bitfire/vcard4android/ContactReaderTest.kt b/src/test/java/at/bitfire/vcard4android/ContactReaderTest.kt index 2928f45..1351b8e 100644 --- a/src/test/java/at/bitfire/vcard4android/ContactReaderTest.kt +++ b/src/test/java/at/bitfire/vcard4android/ContactReaderTest.kt @@ -167,7 +167,7 @@ class ContactReaderTest { kind = Kind.group() members += Member("member1") }) - assertEquals("member1", c.members.first) + assertEquals("member1", c.members.first()) } @Test @@ -185,7 +185,7 @@ class ContactReaderTest { kind = Kind.group() members += Member("urn:uuid:be829cf2-4244-42f8-bd4c-ab39b4b5fcd3") }) - assertEquals("be829cf2-4244-42f8-bd4c-ab39b4b5fcd3", c.members.first) + assertEquals("be829cf2-4244-42f8-bd4c-ab39b4b5fcd3", c.members.first()) } @Test -- cgit v1.2.3