diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt index e38203b3afec8f3ea14023a6b7ec7dc2702a0935..a9a0e5695023544ce21a61bb7dcd31da2434cfcb 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt @@ -63,8 +63,7 @@ fun ForumScreen( ) VerticalDivider() Column(modifier = Modifier.weight(1f).fillMaxHeight()) { - val item = viewModel.selectedGroupItem.value - if (item == null) { + if (viewModel.selectedGroupId.value == null) { NoForumSelected() } else { GroupConversationScreen(viewModel.threadViewModel) diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt index a2bd6d3b8cb050ca66be6b5a2d054a24d2638560..1e5c78569aa7fa45dd0882038972c99a82747f37 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt @@ -63,14 +63,14 @@ class ForumViewModel @Inject constructor( val noForumsYet = derivedStateOf { _fullForumList.isEmpty() } - private val _selectedGroupItem = mutableStateOf<GroupItem?>(null) - val selectedGroupItem = derivedStateOf { + private val _selectedGroupId = mutableStateOf<GroupId?>(null) + val selectedGroupId = derivedStateOf { // reset selected group item to null if not part of list after filtering - val groupItem = _selectedGroupItem.value - if (groupItem == null || forumList.value.any { it.id == groupItem.id }) { - groupItem + val groupId = _selectedGroupId.value + if (groupId == null || forumList.value.any { it.id == groupId }) { + groupId } else { - _selectedGroupItem.value = null + _selectedGroupId.value = null null } } @@ -80,9 +80,18 @@ class ForumViewModel @Inject constructor( override fun onInit() { super.onInit() + // since the threadViewModel is tightly coupled to the ForumViewModel + // and not injected using the usual `viewModel()` approach, + // we have to manually call the functions for (de)initialization + threadViewModel.onInit() loadGroups() } + override fun onCleared() { + super.onCleared() + threadViewModel.onCleared() + } + override fun eventOccurred(e: Event) { when { e is GroupAddedEvent && e.group.clientId == ForumManager.CLIENT_ID -> @@ -90,7 +99,7 @@ class ForumViewModel @Inject constructor( e is GroupRemovedEvent && e.group.clientId == ForumManager.CLIENT_ID -> { removeItem(e.group.id) - if (selectedGroupItem.value?.id == e.group.id) _selectedGroupItem.value = null + if (_selectedGroupId.value == e.group.id) _selectedGroupId.value = null } e is ForumPostReceivedEvent -> { @@ -126,18 +135,19 @@ class ForumViewModel @Inject constructor( } fun selectGroup(groupItem: GroupItem) { - _selectedGroupItem.value = groupItem + if (_selectedGroupId.value == groupItem.id) return + _selectedGroupId.value = groupItem.id threadViewModel.setGroupItem(groupItem, this::addOwnPost) } - fun isSelected(groupId: GroupId) = _selectedGroupItem.value?.id == groupId + fun isSelected(groupId: GroupId) = _selectedGroupId.value == groupId fun setFilterBy(filter: String) { _filterBy.value = filter } private fun addOwnPost(header: ForumPostHeader) { - selectedGroupItem.value?.id?.let { id -> updateItem(id) { it.updateOnPostReceived(header) } } + selectedGroupId.value?.let { id -> updateItem(id) { it.updateOnPostReceived(header) } } } private fun addItem(forumItem: ForumItem) = _fullForumList.add(forumItem) diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt index 2996d0c2da48c7216329414365292fd7a4a092c6..67a4355bc158cd7e159178e033a1af820b41d871 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt @@ -28,7 +28,7 @@ class Loaded( val messageTree: MessageTreeImpl<ThreadItem>, val scrollTo: MessageId? = null, ) : PostsState() { - val posts: MutableList<ThreadItem> = messageTree.depthFirstOrder() + val posts: List<ThreadItem> = messageTree.depthFirstOrder() @UiExecutor fun unreadBeforeIndex(index: Int): UnreadPostInfo { diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt index b196a0232a6c6a6557aacc3a777e42bf5c05e0a7..4b62526064823cbe621aa0977e878089fefb69b1 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt @@ -24,6 +24,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import mu.KotlinLogging import org.briarproject.bramble.api.crypto.CryptoExecutor import org.briarproject.bramble.api.db.TransactionManager import org.briarproject.bramble.api.event.Event @@ -43,7 +44,6 @@ import org.briarproject.briar.desktop.threading.BriarExecutors import org.briarproject.briar.desktop.threading.UiExecutor import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel import org.briarproject.briar.desktop.viewmodel.asState -import org.slf4j.LoggerFactory.getLogger import java.lang.Long.max import javax.inject.Inject @@ -59,7 +59,7 @@ class ThreadedConversationViewModel @Inject constructor( ) : EventListenerDbViewModel(briarExecutors, lifecycleManager, db, eventBus) { companion object { - private val LOG = getLogger(ThreadedConversationViewModel::class.java) + private val LOG = KotlinLogging.logger {} } lateinit var groupItem: GroupItem