Skip to content
Snippets Groups Projects
Verified Commit d4c7c00f authored by Mikolai Gütschow's avatar Mikolai Gütschow
Browse files

migrate ContactsViewModel to use DatabaseExecutor

parent 213894ef
Branches
Tags
1 merge request!55Query data from Briar outside of UI thread
...@@ -14,10 +14,12 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager ...@@ -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.ContactConnectedEvent
import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent
import org.briarproject.briar.api.conversation.ConversationManager 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.removeFirst
import org.briarproject.briar.desktop.utils.replaceFirst import org.briarproject.briar.desktop.utils.replaceFirst
import org.briarproject.briar.desktop.viewmodel.BriarExecutors import org.briarproject.briar.desktop.viewmodel.BriarExecutors
import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
import org.briarproject.briar.desktop.viewmodel.UiExecutor
abstract class ContactsViewModel( abstract class ContactsViewModel(
protected val contactManager: ContactManager, protected val contactManager: ContactManager,
...@@ -41,27 +43,32 @@ abstract class ContactsViewModel( ...@@ -41,27 +43,32 @@ abstract class ContactsViewModel(
protected open fun filterContactItem(contactItem: ContactItem) = true protected open fun filterContactItem(contactItem: ContactItem) = true
open fun loadContacts() { open fun loadContacts() {
_fullContactList.apply { loadOnDbThreadWithTransaction(
clear() task = { txn ->
addAll( contactManager.getContacts(txn).map { contact ->
contactManager.contacts.map { contact ->
ContactItem( ContactItem(
contact, contact,
connectionRegistry.isConnected(contact.id), connectionRegistry.isConnected(contact.id),
conversationManager.getGroupCount(contact.id), conversationManager.getGroupCount(txn, contact.id),
)
}
) )
} }
},
onResult = { contactList ->
_fullContactList.clearAndAddAll(contactList)
updateFilteredList() updateFilteredList()
},
onError = { e ->
LOG.error("Error while loading contacts", e)
}
)
} }
// todo: when migrated to StateFlow, this could be done implicitly instead // todo: when migrated to StateFlow, this could be done implicitly instead
@UiExecutor
protected open fun updateFilteredList() { protected open fun updateFilteredList() {
_filteredContactList.apply { _filteredContactList.clearAndAddAll(
clear() _fullContactList.filter(::filterContactItem).sortedByDescending { it.timestamp }
addAll(_fullContactList.filter(::filterContactItem).sortedByDescending { it.timestamp }) )
}
} }
override fun eventOccurred(e: Event?) { override fun eventOccurred(e: Event?) {
...@@ -85,11 +92,13 @@ abstract class ContactsViewModel( ...@@ -85,11 +92,13 @@ abstract class ContactsViewModel(
} }
} }
@UiExecutor
protected open fun updateItem(contactId: ContactId, update: (ContactItem) -> ContactItem) { protected open fun updateItem(contactId: ContactId, update: (ContactItem) -> ContactItem) {
_fullContactList.replaceFirst({ it.contactId == contactId }, update) _fullContactList.replaceFirst({ it.contactId == contactId }, update)
updateFilteredList() updateFilteredList()
} }
@UiExecutor
protected open fun removeItem(contactId: ContactId) { protected open fun removeItem(contactId: ContactId) {
_fullContactList.removeFirst { it.contactId == contactId } _fullContactList.removeFirst { it.contactId == contactId }
updateFilteredList() updateFilteredList()
......
package org.briarproject.briar.desktop.utils 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) { fun <T> MutableList<T>.replaceIf(predicate: (T) -> Boolean, transformation: (T) -> T) {
val li = listIterator() val li = listIterator()
while (li.hasNext()) { while (li.hasNext()) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment