From 2104d79e1cd1322323b7858c515b94a92d1188a2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Aug 2024 14:59:43 +0200 Subject: [PATCH] Prevent duplicated chat rooms in conversations list when added/removed/added --- .../chat/fragment/ConversationFragment.kt | 1 + .../viewmodel/ConversationsListViewModel.kt | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index f6bbdcc38..18ea4c871 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -526,6 +526,7 @@ open class ConversationFragment : SlidingPaneChildFragment() { binding.eventsList.scrollToPosition(position) } else { Log.w("$TAG Failed to find matching message in adapter's items!") + // TODO FIXME: load original message & messages in between, then scroll to it } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt index be1308172..aa3a94100 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt @@ -189,8 +189,16 @@ class ConversationsListViewModel @UiThread constructor() : AbstractMainViewModel } val currentList = conversations.value.orEmpty() - val newList = arrayListOf() + val peerAddress = chatRoom.peerAddress + val found = currentList.find { + it.chatRoom.peerAddress.weakEqual(peerAddress) + } + if (found != null) { + Log.w("$TAG Created chat room is already in the list, skipping") + return + } + val newList = arrayListOf() val model = createConversationModel(chatRoom) if (model != null) { newList.add(model) @@ -207,18 +215,21 @@ class ConversationsListViewModel @UiThread constructor() : AbstractMainViewModel @WorkerThread private fun removeChatRoom(chatRoom: ChatRoom) { val currentList = conversations.value.orEmpty() + val peerAddress = chatRoom.peerAddress val found = currentList.find { - it.chatRoom == chatRoom + it.chatRoom.peerAddress.weakEqual(peerAddress) } if (found != null) { val newList = arrayListOf() newList.addAll(currentList) newList.remove(found) found.destroy() - Log.i("$TAG Removing chat room from list") + Log.i("$TAG Removing chat room [${peerAddress.asStringUriOnly()}] from list") conversations.postValue(newList) } else { - Log.w("$TAG Failed to find item in list matching deleted chat room") + Log.w( + "$TAG Failed to find item in list matching deleted chat room peer address [${peerAddress.asStringUriOnly()}]" + ) } showGreenToastEvent.postValue(