From ded00052b52ed8fd21819bb308627cf30132bfb1 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Aug 2024 22:40:47 +0200 Subject: [PATCH] Use chatMessage.markAsRead() newly added API --- .../main/chat/fragment/ConversationFragment.kt | 10 ++++++++-- .../chat/fragment/ConversationsListFragment.kt | 15 +++++++++++++++ .../ui/main/chat/model/ConversationModel.kt | 7 +++++++ .../linphone/ui/main/chat/model/MessageModel.kt | 8 ++++++++ .../chat/viewmodel/ConversationViewModel.kt | 10 ++++------ .../ui/main/viewmodel/AbstractMainViewModel.kt | 17 ++++++++++++----- .../ui/main/viewmodel/SharedMainViewModel.kt | 8 +++++++- .../chat_conversation_attachments_area_cell.xml | 3 +-- 8 files changed, 62 insertions(+), 16 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 eaa811dcb..12a2d5e32 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 @@ -973,8 +973,14 @@ open class ConversationFragment : SlidingPaneChildFragment() { viewModel.markAsRead() } else { val firstUnread = adapter.currentList[firstUnreadMessagePosition] - (firstUnread.model as MessageModel).isRead = true - viewModel.markFirstUnreadMessageAsRead() + if (firstUnread.model is MessageModel) { + Log.i("$TAG Marking only first message (to which user scrolled to) as read") + firstUnread.model.markAsRead() + viewModel.updateUnreadMessageCount() + sharedViewModel.updateUnreadMessageCountForCurrentConversationEvent.postValue( + Event(true) + ) + } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index e22b23c7e..19e8e9c99 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -281,6 +281,21 @@ class ConversationsListFragment : AbstractMainFragment() { } } + sharedViewModel.updateUnreadMessageCountForCurrentConversationEvent.observe( + viewLifecycleOwner + ) { + it.consume { + val displayChatRoom = sharedViewModel.displayedChatRoom + if (displayChatRoom != null) { + val found = listViewModel.conversations.value.orEmpty().find { model -> + model.chatRoom == displayChatRoom + } + found?.updateUnreadCount() + } + listViewModel.updateUnreadMessagesCount() + } + } + // AbstractMainFragment related listViewModel.title.value = getString(R.string.bottom_navigation_conversations_label) diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt index ef07fa3c3..130cd9891 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt @@ -196,6 +196,13 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { } } + @UiThread + fun updateUnreadCount() { + coreContext.postOnCoreThread { + unreadMessageCount.postValue(chatRoom.unreadMessagesCount) + } + } + @UiThread fun toggleMute() { coreContext.postOnCoreThread { diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt index 8328a1585..39422d41c 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt @@ -346,6 +346,14 @@ class MessageModel @WorkerThread constructor( } } + @UiThread + fun markAsRead() { + coreContext.postOnCoreThread { + Log.i("$TAG Marking chat message with ID [$id] as read") + chatMessage.markAsRead() + } + } + @WorkerThread fun updateAvatarModel() { val avatar = coreContext.contactsManager.getContactAvatarModelForAddress( diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index 9020f87a8..16dc04b29 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -410,12 +410,9 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo } @UiThread - fun markFirstUnreadMessageAsRead() { - // As we can't mark a single message as read in our SDK, small workaround - // TODO FIXME: when SDK will support chatMessage.markAsRead(), use it - val unreadCount = unreadMessagesCount.value ?: 0 - if (unreadCount > 1) { - unreadMessagesCount.value = unreadCount - 1 + fun updateUnreadMessageCount() { + coreContext.postOnCoreThread { + unreadMessagesCount.postValue(chatRoom.unreadMessagesCount) } } @@ -476,6 +473,7 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo @UiThread fun markAsRead() { coreContext.postOnCoreThread { + if (chatRoom.unreadMessagesCount == 0) return@postOnCoreThread Log.i("$TAG Marking chat room as read") chatRoom.markAsRead() } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt index d7a8cd10a..30cc516c4 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt @@ -117,12 +117,12 @@ open class AbstractMainViewModel @UiThread constructor() : GenericViewModel() { chatRoom: ChatRoom, messages: Array ) { - updateUnreadMessagesCount() + computeUnreadMessagesCount() } @WorkerThread override fun onChatRoomRead(core: Core, chatRoom: ChatRoom) { - updateUnreadMessagesCount() + computeUnreadMessagesCount() } @WorkerThread @@ -157,7 +157,7 @@ open class AbstractMainViewModel @UiThread constructor() : GenericViewModel() { account.postValue(AccountModel(defaultAccount)) } - updateUnreadMessagesCount() + computeUnreadMessagesCount() updateMissedCallsCount() updateAvailableMenus() @@ -251,6 +251,13 @@ open class AbstractMainViewModel @UiThread constructor() : GenericViewModel() { navigateToMeetingsEvent.value = Event(true) } + @UiThread + fun updateUnreadMessagesCount() { + coreContext.postOnCoreThread { + computeUnreadMessagesCount() + } + } + @WorkerThread fun updateMissedCallsCount() { val account = LinphoneUtils.getDefaultAccount() @@ -263,7 +270,7 @@ open class AbstractMainViewModel @UiThread constructor() : GenericViewModel() { } @WorkerThread - fun updateUnreadMessagesCount() { + fun computeUnreadMessagesCount() { val account = LinphoneUtils.getDefaultAccount() val count = account?.unreadChatMessageCount ?: coreContext.core.unreadChatMessageCount val moreThanOne = count > 1 @@ -305,7 +312,7 @@ open class AbstractMainViewModel @UiThread constructor() : GenericViewModel() { account.value?.destroy() account.postValue(AccountModel(defaultAccount ?: core.accountList.first())) - updateUnreadMessagesCount() + computeUnreadMessagesCount() updateMissedCallsCount() } else { Log.e("$TAG Accounts list no supposed to be empty!") diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index a5a4baf25..b4b8c835c 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -111,7 +111,9 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { val filesToShareFromIntent = MutableLiveData>() - val messageToForwardEvent = MutableLiveData>() + val messageToForwardEvent: MutableLiveData> by lazy { + MutableLiveData>() + } var displayedChatRoom: ChatRoom? = null // Prevents the need to go look for the chat room val showConversationEvent: MutableLiveData>> by lazy { @@ -141,6 +143,10 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + val updateUnreadMessageCountForCurrentConversationEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + /* Meetings related */ var displayedMeeting: ConferenceInfo? = null // Prevents the need to go look for the conference info diff --git a/app/src/main/res/layout/chat_conversation_attachments_area_cell.xml b/app/src/main/res/layout/chat_conversation_attachments_area_cell.xml index 93935ff9e..fec6cc38d 100644 --- a/app/src/main/res/layout/chat_conversation_attachments_area_cell.xml +++ b/app/src/main/res/layout/chat_conversation_attachments_area_cell.xml @@ -1,7 +1,6 @@ + xmlns:app="http://schemas.android.com/apk/res-auto">