From db72bffcbd4270f44e957f1d50e8f28326938d7e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Oct 2023 09:58:12 +0200 Subject: [PATCH] Do not show notifications for messages received in currently displayed chat room --- .../notifications/NotificationsManager.kt | 30 +++++++++++++++++-- .../chat/fragment/ConversationFragment.kt | 16 ++++++++++ .../chat/viewmodel/ConversationViewModel.kt | 2 -- .../java/org/linphone/utils/LinphoneUtils.kt | 7 ++++- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 830daa074..da1b2c538 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -132,8 +132,15 @@ class NotificationsManager @MainThread constructor(private val context: Context) Log.i("$TAG Received ${messages.size} aggregated messages") if (corePreferences.disableChat) return + val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) + if (id == currentlyDisplayedChatRoomId) { + Log.i( + "$TAG Do not notify received messages for currently displayed chat room [$id]" + ) + return + } + if (chatRoom.muted) { - val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) Log.i("$TAG Chat room $id has been muted") return } @@ -158,8 +165,15 @@ class NotificationsManager @MainThread constructor(private val context: Context) ) if (corePreferences.disableChat) return + val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) + if (id == currentlyDisplayedChatRoomId) { + Log.i( + "$TAG Do not notify received reaction for currently displayed chat room [$id]" + ) + return + } + if (chatRoom.muted) { - val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) Log.i("$TAG Chat room $id has been muted") return } @@ -273,6 +287,8 @@ class NotificationsManager @MainThread constructor(private val context: Context) private val chatNotificationsMap: HashMap = HashMap() private val previousChatNotifications: ArrayList = arrayListOf() + private var currentlyDisplayedChatRoomId: String = "" + init { createServiceChannel() createIncomingCallNotificationChannel() @@ -294,6 +310,16 @@ class NotificationsManager @MainThread constructor(private val context: Context) } } + @AnyThread + fun setCurrentlyDisplayedChatRoomId(id: String) { + currentlyDisplayedChatRoomId = id + } + + @AnyThread + fun resetCurrentlyDisplayedChatRoomId() { + currentlyDisplayedChatRoomId = "" + } + @MainThread fun onServiceStarted(service: CoreForegroundService) { Log.i("$TAG Service has been started") 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 f08b2e9ad..9bb7fa935 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 @@ -41,6 +41,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetBehavior +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ChatConversationFragmentBinding @@ -51,6 +52,7 @@ import org.linphone.ui.main.chat.viewmodel.ConversationViewModel import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.AppUtils import org.linphone.utils.Event +import org.linphone.utils.LinphoneUtils import org.linphone.utils.hideKeyboard import org.linphone.utils.showKeyboard @@ -195,6 +197,20 @@ class ConversationFragment : GenericFragment() { } } + override fun onResume() { + super.onResume() + + val id = LinphoneUtils.getChatRoomId(args.localSipUri, args.remoteSipUri) + Log.i("$TAG Asking notifications manager not to notify chat messages for chat room [$id]") + coreContext.notificationsManager.setCurrentlyDisplayedChatRoomId(id) + } + + override fun onPause() { + coreContext.notificationsManager.resetCurrentlyDisplayedChatRoomId() + + super.onPause() + } + private fun showChatMessageLongPressMenu(chatMessageModel: ChatMessageModel) { // TODO: handle backward compat for blurring val blurEffect = RenderEffect.createBlurEffect(16F, 16F, Shader.TileMode.MIRROR) 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 fff02aa58..4e7d90b9b 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 @@ -74,8 +74,6 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { private lateinit var chatRoom: ChatRoom - private var currentFilter = "" - private val avatarsMap = hashMapOf() private val chatRoomListener = object : ChatRoomListenerStub() { diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index eaf7cdd7e..48b1103c5 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -196,7 +196,12 @@ class LinphoneUtils { localSipUri.clean() val remoteSipUri = remoteAddress.clone() remoteSipUri.clean() - return "${localSipUri.asStringUriOnly()}~${remoteSipUri.asStringUriOnly()}" + return getChatRoomId(localSipUri.asStringUriOnly(), remoteSipUri.asStringUriOnly()) + } + + @AnyThread + fun getChatRoomId(localSipUri: String, remoteSipUri: String): String { + return "$localSipUri~$remoteSipUri" } @WorkerThread