From d4c7c00f7c8a2627dead4148ccc89b3a083193aa Mon Sep 17 00:00:00 2001
From: ialokim <ialokim@mailbox.org>
Date: Fri, 26 Nov 2021 23:46:58 +0100
Subject: [PATCH] migrate ContactsViewModel to use DatabaseExecutor

---
 .../desktop/contact/ContactsViewModel.kt      | 33 ++++++++++++-------
 .../briar/desktop/utils/ListUtils.kt          |  5 +++
 2 files changed, 26 insertions(+), 12 deletions(-)

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 f47505f687..2d4080b4ed 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
@@ -14,10 +14,12 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager
 import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent
 import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent
 import org.briarproject.briar.api.conversation.ConversationManager
+import org.briarproject.briar.desktop.utils.clearAndAddAll
 import org.briarproject.briar.desktop.utils.removeFirst
 import org.briarproject.briar.desktop.utils.replaceFirst
 import org.briarproject.briar.desktop.viewmodel.BriarExecutors
 import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
+import org.briarproject.briar.desktop.viewmodel.UiExecutor
 
 abstract class ContactsViewModel(
     protected val contactManager: ContactManager,
@@ -41,27 +43,32 @@ abstract class ContactsViewModel(
     protected open fun filterContactItem(contactItem: ContactItem) = true
 
     open fun loadContacts() {
-        _fullContactList.apply {
-            clear()
-            addAll(
-                contactManager.contacts.map { contact ->
+        loadOnDbThreadWithTransaction(
+            task = { txn ->
+                contactManager.getContacts(txn).map { contact ->
                     ContactItem(
                         contact,
                         connectionRegistry.isConnected(contact.id),
-                        conversationManager.getGroupCount(contact.id),
+                        conversationManager.getGroupCount(txn, contact.id),
                     )
                 }
-            )
-        }
-        updateFilteredList()
+            },
+            onResult = { contactList ->
+                _fullContactList.clearAndAddAll(contactList)
+                updateFilteredList()
+            },
+            onError = { e ->
+                LOG.error("Error while loading contacts", e)
+            }
+        )
     }
 
     // todo: when migrated to StateFlow, this could be done implicitly instead
+    @UiExecutor
     protected open fun updateFilteredList() {
-        _filteredContactList.apply {
-            clear()
-            addAll(_fullContactList.filter(::filterContactItem).sortedByDescending { it.timestamp })
-        }
+        _filteredContactList.clearAndAddAll(
+            _fullContactList.filter(::filterContactItem).sortedByDescending { it.timestamp }
+        )
     }
 
     override fun eventOccurred(e: Event?) {
@@ -85,11 +92,13 @@ abstract class ContactsViewModel(
         }
     }
 
+    @UiExecutor
     protected open fun updateItem(contactId: ContactId, update: (ContactItem) -> ContactItem) {
         _fullContactList.replaceFirst({ it.contactId == contactId }, update)
         updateFilteredList()
     }
 
+    @UiExecutor
     protected open fun removeItem(contactId: ContactId) {
         _fullContactList.removeFirst { it.contactId == contactId }
         updateFilteredList()
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/utils/ListUtils.kt b/src/main/kotlin/org/briarproject/briar/desktop/utils/ListUtils.kt
index 5f4b3cd609..0ca3ae7a71 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/utils/ListUtils.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/utils/ListUtils.kt
@@ -1,5 +1,10 @@
 package org.briarproject.briar.desktop.utils
 
+fun <T> MutableList<T>.clearAndAddAll(elements: Collection<T>) {
+    clear()
+    addAll(elements)
+}
+
 fun <T> MutableList<T>.replaceIf(predicate: (T) -> Boolean, transformation: (T) -> T) {
     val li = listIterator()
     while (li.hasNext()) {
-- 
GitLab