diff --git a/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt b/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt index 87ae1d8018..24f8e64021 100644 --- a/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt +++ b/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt @@ -40,6 +40,7 @@ import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.id.QualifiedID import com.wire.kalium.logic.data.notification.LocalNotification import com.wire.kalium.logic.data.notification.LocalNotificationUpdateMessageAction +import kotlinx.coroutines.delay import javax.inject.Inject import javax.inject.Singleton @@ -52,14 +53,16 @@ class MessageNotificationManager private val notificationManager: NotificationManager, private val lockCodeTimeManager: LockCodeTimeManager ) { - - fun handleNotification(newNotifications: List, userId: QualifiedID, userName: String) { + suspend fun handleNotification(newNotifications: List, userId: QualifiedID, userName: String) { if (newNotifications.isEmpty()) return addNotifications(newNotifications, userId, userName) updateNotifications(newNotifications, userId) removeSeenNotifications(newNotifications, userId) + // This delay is required to let notification manager update activeNotifications list + delay(NOTIFICATION_UPDATE_DELAY) + appLogger.i("$TAG: handled notifications: newNotifications size ${newNotifications.size}; ") } @@ -456,6 +459,7 @@ class MessageNotificationManager companion object { private const val TAG = "MessageNotificationManager" private const val MESSAGE_ID_EXTRA = "message_id" + private const val NOTIFICATION_UPDATE_DELAY = 100L /** * Update notification by adding [replyText] to the end of messages list with "You" as sender. diff --git a/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt b/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt index dbb64daacc..386a4fea6b 100644 --- a/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt +++ b/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt @@ -63,6 +63,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.datetime.Instant import java.net.UnknownHostException import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicReference @@ -476,9 +477,14 @@ class WireNotificationManager @Inject constructor( ) } - newNotifications.map { it.conversationId }.distinct().forEach { notifiedConversationId -> - markMessagesAsNotified(userId, notifiedConversationId) - } + newNotifications + .filterIsInstance() + .filter { it.messages.isNotEmpty() } + .forEach { conversation -> + val lastNotified = conversation.messages.maxOf { it.time } + markMessagesAsNotified(userId, conversation.id, lastNotified) + } + markConnectionAsNotified(userId) } } @@ -521,10 +527,11 @@ class WireNotificationManager @Inject constructor( private suspend fun markMessagesAsNotified( userId: QualifiedID, - conversationId: ConversationId? = null + conversationId: ConversationId? = null, + lastNotified: Instant? = null, ) { val markNotified = conversationId?.let { - MarkMessagesAsNotifiedUseCase.UpdateTarget.SingleConversation(conversationId) + MarkMessagesAsNotifiedUseCase.UpdateTarget.SingleConversation(conversationId, lastNotified) } ?: MarkMessagesAsNotifiedUseCase.UpdateTarget.AllConversations coreLogic.getSessionScope(userId) .messages