diff --git a/.gitignore b/.gitignore index 56cbd2768..6c785d36f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,6 @@ linphone-sdk-android/*.aar app/debug app/release app/releaseAppBundle +app/releaseWithCrashlytics keystore.properties app/src/main/res/xml/contacts.xml diff --git a/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt b/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt index 0169412cc..47dde1db1 100644 --- a/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt +++ b/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt @@ -87,9 +87,8 @@ class ChatBubbleActivity : GenericActivity() { } // Workaround for the removed notification when a chat room is marked as read - coreContext.notificationsManager.dismissNotificationUponReadChatRoom = false + coreContext.notificationsManager.disableDismissNotificationUponReadForChatRoom(chatRoom) chatRoom.markAsRead() - coreContext.notificationsManager.dismissNotificationUponReadChatRoom = true viewModel = ViewModelProvider( this, diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 6bce3d38b..b7b58b63e 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -64,6 +64,7 @@ private class Notifiable(val notificationId: Int) { var localIdentity: String? = null var myself: String? = null var remoteAddress: String? = null + var dismissNotificationUponReadChatRoom: Boolean = true } private class NotifiableMessage( @@ -102,6 +103,7 @@ class NotificationsManager(private val context: Context) { } private val chatNotificationsMap: HashMap = HashMap() private val callNotificationsMap: HashMap = HashMap() + private val previousChatNotifications: ArrayList = arrayListOf() private var currentForegroundServiceNotificationId: Int = 0 private var serviceNotification: Notification? = null @@ -110,8 +112,6 @@ class NotificationsManager(private val context: Context) { var currentlyDisplayedChatRoomAddress: String? = null - var dismissNotificationUponReadChatRoom: Boolean = true - private val listener: CoreListenerStub = object : CoreListenerStub() { override fun onCallStateChanged( core: Core, @@ -173,11 +173,18 @@ class NotificationsManager(private val context: Context) { } override fun onChatRoomRead(core: Core, chatRoom: ChatRoom) { - if (dismissNotificationUponReadChatRoom) { - Log.i("[Notifications Manager] Chat room [$chatRoom] has been marked as read, removing notification if any") - dismissChatNotification(chatRoom) + val address = chatRoom.peerAddress.asStringUriOnly() + val notifiable = chatNotificationsMap[address] + if (notifiable != null) { + if (notifiable.dismissNotificationUponReadChatRoom) { + Log.i("[Notifications Manager] Chat room [$chatRoom] has been marked as read, removing notification if any") + dismissChatNotification(chatRoom) + } else { + Log.i("[Notifications Manager] Chat room [$chatRoom] has been marked as read, not removing notification, maybe because of a chat bubble?") + } } else { - Log.i("[Notifications Manager] Chat room [$chatRoom] has been marked as read, not removing notification, maybe because of a chat bubble?") + Log.i("[Notifications Manager] Chat room [$chatRoom] has been marked as read but no notifiable found, removing notification if any") + dismissChatNotification(chatRoom) } } } @@ -203,11 +210,11 @@ class NotificationsManager(private val context: Context) { displayReplyMessageNotification(message, notifiable) } else { Log.e("[Notifications Manager] Couldn't find notification for chat room $address") - cancel(id) + cancel(id, CHAT_TAG) } } else if (state == ChatMessage.State.NotDelivered) { Log.e("[Notifications Manager] Reply wasn't delivered") - cancel(id) + cancel(id, CHAT_TAG) } } } @@ -219,7 +226,10 @@ class NotificationsManager(private val context: Context) { for (notification in manager.activeNotifications) { if (notification.tag == CALL_TAG) { Log.w("[Notifications Manager] Found existing call notification [${notification.id}], cancelling it") - manager.cancel(notification.id) + manager.cancel(CALL_TAG, notification.id) + } else if (notification.tag == CHAT_TAG) { + Log.i("[Notifications Manager] Found existing chat notification [${notification.id}]") + previousChatNotifications.add(notification.id) } } } @@ -240,7 +250,7 @@ class NotificationsManager(private val context: Context) { } for (notifiable in callNotificationsMap.values) { - notificationManager.cancel(notifiable.notificationId) + notificationManager.cancel(CALL_TAG, notifiable.notificationId) } stopForegroundNotification() @@ -252,9 +262,9 @@ class NotificationsManager(private val context: Context) { notificationManager.notify(tag, id, notification) } - fun cancel(id: Int) { - Log.i("[Notifications Manager] Canceling $id") - notificationManager.cancel(id) + fun cancel(id: Int, tag: String) { + Log.i("[Notifications Manager] Canceling [$id] with tag [$tag]") + notificationManager.cancel(tag, id) } fun resetChatNotificationCounterForSipUri(sipUri: String) { @@ -510,7 +520,7 @@ class NotificationsManager(private val context: Context) { } fun dismissMissedCallNotification() { - cancel(MISSED_CALLS_NOTIF_ID) + cancel(MISSED_CALLS_NOTIF_ID, MISSED_CALL_TAG) } fun displayCallNotification(call: Call, useAsForeground: Boolean = false) { @@ -611,7 +621,7 @@ class NotificationsManager(private val context: Context) { val address = call.remoteAddress.asStringUriOnly() val notifiable: Notifiable? = callNotificationsMap[address] if (notifiable != null) { - cancel(notifiable.notificationId) + cancel(notifiable.notificationId, CALL_TAG) callNotificationsMap.remove(address) } else { Log.w("[Notifications Manager] No notification found for call ${call.callLog.callId}") @@ -758,7 +768,23 @@ class NotificationsManager(private val context: Context) { if (notifiable != null) { Log.i("[Notifications Manager] Dismissing notification for chat room $room with id ${notifiable.notificationId}") notifiable.messages.clear() - cancel(notifiable.notificationId) + cancel(notifiable.notificationId, CHAT_TAG) + } else { + val previousNotificationId = previousChatNotifications.find { id -> id == room.creationTime.toInt() } + if (previousNotificationId != null) { + Log.i("[Notifications Manager] Found previous notification with same ID [$previousNotificationId], canceling it") + cancel(previousNotificationId, CHAT_TAG) + } + } + } + + fun disableDismissNotificationUponReadForChatRoom(chatRoom: ChatRoom) { + val address = chatRoom.peerAddress.asStringUriOnly() + val notifiable: Notifiable? = chatNotificationsMap[address] + if (notifiable != null) { + Log.i("[Notifications Manager] Prevent notification with id [${notifiable.notificationId}] from being dismissed when chat room will be marked as read") + notifiable.dismissNotificationUponReadChatRoom = false + chatNotificationsMap[address] = notifiable } }