From 83264b46f5e9e36489da4184de9658fcacbb9642 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20K=C3=BCrten?= <sebastian@mobanisto.de>
Date: Tue, 14 Dec 2021 11:12:44 +0100
Subject: [PATCH] Add ContactIdWrapper interface and implementations

---
 .../briarproject/briar/desktop/contact/ContactCard.kt  |  2 +-
 .../briar/desktop/contact/ContactIdWrapper.kt          |  3 +++
 .../briarproject/briar/desktop/contact/ContactItem.kt  |  2 +-
 .../briarproject/briar/desktop/contact/ContactList.kt  |  8 ++++----
 .../briar/desktop/contact/ContactListViewModel.kt      | 10 +++++-----
 .../briar/desktop/contact/ContactsViewModel.kt         |  4 ++--
 .../briar/desktop/contact/PendingContactIdWrapper.kt   |  5 +++++
 .../briar/desktop/contact/PendingContactItem.kt        |  5 ++---
 .../briar/desktop/contact/RealContactIdWrapper.kt      |  5 +++++
 .../briar/desktop/contact/RealContactItem.kt           |  5 ++---
 .../briar/desktop/conversation/PrivateMessageScreen.kt |  6 +++---
 .../desktop/introduction/IntroductionViewModel.kt      |  2 +-
 12 files changed, 34 insertions(+), 23 deletions(-)
 create mode 100644 src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt
 create mode 100644 src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt
 create mode 100644 src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt

diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
index 2ac199acf7..a09a618920 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
@@ -51,7 +51,7 @@ fun main() = preview(
 ) {
     ContactCard(
         RealContactItem(
-            contactId = ContactId(0),
+            idWrapper = RealContactIdWrapper(ContactId(0)),
             authorId = AuthorId(getRandomId()),
             name = getStringParameter("name"),
             alias = getStringParameter("alias"),
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt
new file mode 100644
index 0000000000..bdca777412
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt
@@ -0,0 +1,3 @@
+package org.briarproject.briar.desktop.contact
+
+sealed interface ContactIdWrapper
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
index 7509758e92..ddf63cf950 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
@@ -2,7 +2,7 @@ package org.briarproject.briar.desktop.contact
 
 sealed interface ContactItem {
 
-    val contactId: Any
+    val idWrapper: ContactIdWrapper
     val displayName: String
     val isConnected: Boolean
     val isEmpty: Boolean
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
index 66b96b6a6d..f8aca611b5 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
@@ -24,8 +24,8 @@ import org.briarproject.briar.desktop.ui.Constants.HEADER_SIZE
 @Composable
 fun ContactList(
     contactList: List<ContactItem>,
-    isSelected: (Any) -> Boolean,
-    selectContact: (Any) -> Unit,
+    isSelected: (ContactItem) -> Boolean,
+    selectContact: (ContactItem) -> Unit,
     filterBy: String,
     setFilterBy: (String) -> Unit,
 ) {
@@ -50,8 +50,8 @@ fun ContactList(
                 items(contactList) { contactItem ->
                     ContactCard(
                         contactItem,
-                        { selectContact(contactItem.contactId) },
-                        isSelected(contactItem.contactId)
+                        { selectContact(contactItem) },
+                        isSelected(contactItem)
                     )
                 }
             }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
index 0e671a5267..f10329afe1 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
@@ -40,16 +40,16 @@ constructor(
     }
 
     private val _filterBy = mutableStateOf("")
-    private val _selectedContactId = mutableStateOf<Any?>(null)
+    private val _selectedContactId = mutableStateOf<ContactIdWrapper?>(null)
 
     val filterBy = _filterBy.asState()
     val selectedContactId = _selectedContactId.asState()
 
-    fun selectContact(contactId: Any) {
-        _selectedContactId.value = contactId
+    fun selectContact(contactItem: ContactItem) {
+        _selectedContactId.value = contactItem.idWrapper
     }
 
-    fun isSelected(contactId: Any) = _selectedContactId.value == contactId
+    fun isSelected(contactItem: ContactItem) = _selectedContactId.value == contactItem.idWrapper
 
     override fun filterContactItem(contactItem: ContactItem) =
         contactItem.displayName.contains(_filterBy.value, ignoreCase = true)
@@ -64,7 +64,7 @@ constructor(
 
         // reset selected contact to null if not available after filtering
         val id = _selectedContactId.value
-        if (id != null && !contactList.map { it.contactId }.contains(id)) {
+        if (id != null && !contactList.map { it.idWrapper }.contains(id)) {
             _selectedContactId.value = null
         }
     }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
index 4fc4251f4d..92c3fcc22e 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
@@ -106,7 +106,7 @@ abstract class ContactsViewModel(
         _fullContactList.replaceFirst(
             {
                 if (it is RealContactItem)
-                    it.contactId == contactId
+                    it.idWrapper.contactId == contactId
                 else false
             },
             update
@@ -117,7 +117,7 @@ abstract class ContactsViewModel(
     protected open fun removeItem(contactId: ContactId) {
         _fullContactList.removeFirst {
             if (it is RealContactItem)
-                it.contactId == contactId
+                it.idWrapper.contactId == contactId
             else false
         }
         updateFilteredList()
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt
new file mode 100644
index 0000000000..dd1b013a7a
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt
@@ -0,0 +1,5 @@
+package org.briarproject.briar.desktop.contact
+
+import org.briarproject.bramble.api.contact.PendingContactId
+
+class PendingContactIdWrapper(val pendingContactId: PendingContactId) : ContactIdWrapper
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt
index 1472c4c23d..5610e7a1b0 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt
@@ -1,10 +1,9 @@
 package org.briarproject.briar.desktop.contact
 
 import org.briarproject.bramble.api.contact.PendingContact
-import org.briarproject.bramble.api.contact.PendingContactId
 
 data class PendingContactItem(
-    override val contactId: PendingContactId,
+    override val idWrapper: PendingContactIdWrapper,
     val name: String,
     val alias: String?,
     override val isConnected: Boolean,
@@ -16,7 +15,7 @@ data class PendingContactItem(
     override val displayName = if (alias == null) name else "$alias ($name)"
 
     constructor(contact: PendingContact) : this(
-        contactId = contact.id,
+        idWrapper = PendingContactIdWrapper(contact.id),
         name = contact.alias,
         alias = contact.alias,
         isConnected = false,
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt
new file mode 100644
index 0000000000..9810426dfd
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt
@@ -0,0 +1,5 @@
+package org.briarproject.briar.desktop.contact
+
+import org.briarproject.bramble.api.contact.ContactId
+
+class RealContactIdWrapper(val contactId: ContactId) : ContactIdWrapper
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt
index 100bc57975..05296b805f 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt
@@ -1,13 +1,12 @@
 package org.briarproject.briar.desktop.contact
 
 import org.briarproject.bramble.api.contact.Contact
-import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.bramble.api.identity.AuthorId
 import org.briarproject.briar.api.client.MessageTracker
 import kotlin.math.max
 
 data class RealContactItem(
-    override val contactId: ContactId,
+    override val idWrapper: RealContactIdWrapper,
     val authorId: AuthorId,
     val name: String,
     val alias: String?,
@@ -20,7 +19,7 @@ data class RealContactItem(
     override val displayName = if (alias == null) name else "$alias ($name)"
 
     constructor(contact: Contact, isConnected: Boolean, groupCount: MessageTracker.GroupCount) : this(
-        contactId = contact.id,
+        idWrapper = RealContactIdWrapper(contact.id),
         authorId = contact.author.id,
         name = contact.author.name,
         alias = contact.alias,
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
index 0637a7a5b2..fe336200cc 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
@@ -6,9 +6,9 @@ import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
-import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.briar.desktop.contact.ContactList
 import org.briarproject.briar.desktop.contact.ContactListViewModel
+import org.briarproject.briar.desktop.contact.RealContactIdWrapper
 import org.briarproject.briar.desktop.ui.UiPlaceholder
 import org.briarproject.briar.desktop.ui.VerticalDivider
 import org.briarproject.briar.desktop.viewmodel.viewModel
@@ -28,8 +28,8 @@ fun PrivateMessageScreen(
         VerticalDivider()
         Column(modifier = Modifier.weight(1f).fillMaxHeight()) {
             val id = viewModel.selectedContactId.value
-            if (id != null && id is ContactId) {
-                ConversationScreen(id)
+            if (id != null && id is RealContactIdWrapper) {
+                ConversationScreen(id.contactId)
             } else {
                 UiPlaceholder()
             }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
index 1d7e290db1..9887b78aaf 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
@@ -60,7 +60,7 @@ constructor(
 
     override fun filterContactItem(contactItem: ContactItem): Boolean {
         return if (contactItem is RealContactItem) {
-            _firstContact.value?.contactId != contactItem.contactId
+            _firstContact.value?.idWrapper != contactItem.idWrapper
         } else false
     }
 }
-- 
GitLab