From 29e66d28692daa133d91beaf3cded052e825d3da Mon Sep 17 00:00:00 2001 From: PetarVelikov Date: Wed, 20 Nov 2024 11:28:09 +0100 Subject: [PATCH] [PBE-3749] Update NotificationMarkUnreadEvent with threadId for thread events. --- .../api/stream-chat-android-client.api | 12 +++++++----- .../chat/android/client/api2/mapping/EventMapping.kt | 1 + .../chat/android/client/api2/model/dto/EventDtos.kt | 1 + .../chat/android/client/events/ChatEvent.kt | 1 + .../event/handler/internal/EventHandlerSequential.kt | 4 ++-- .../logic/querythreads/internal/QueryThreadsLogic.kt | 8 ++------ .../querythreads/internal/QueryThreadsLogicTest.kt | 4 +++- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/stream-chat-android-client/api/stream-chat-android-client.api b/stream-chat-android-client/api/stream-chat-android-client.api index 52a72e38b3c..4f36c345e72 100644 --- a/stream-chat-android-client/api/stream-chat-android-client.api +++ b/stream-chat-android-client/api/stream-chat-android-client.api @@ -1766,14 +1766,15 @@ public final class io/getstream/chat/android/client/events/NotificationMarkReadE } public final class io/getstream/chat/android/client/events/NotificationMarkUnreadEvent : io/getstream/chat/android/client/events/CidEvent, io/getstream/chat/android/client/events/HasUnreadCounts, io/getstream/chat/android/client/events/UserEvent { - public fun (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;I)V - public synthetic fun (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;I)V + public synthetic fun (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Ljava/lang/String; public final fun component10 ()I public final fun component11 ()Ljava/lang/String; public final fun component12 ()Ljava/util/Date; public final fun component13 ()Ljava/lang/String; - public final fun component14 ()I + public final fun component14 ()Ljava/lang/String; + public final fun component15 ()I public final fun component2 ()Ljava/util/Date; public final fun component3 ()Ljava/lang/String; public final fun component4 ()Lio/getstream/chat/android/models/User; @@ -1782,8 +1783,8 @@ public final class io/getstream/chat/android/client/events/NotificationMarkUnrea public final fun component7 ()Ljava/lang/String; public final fun component8 ()I public final fun component9 ()I - public final fun copy (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;I)Lio/getstream/chat/android/client/events/NotificationMarkUnreadEvent; - public static synthetic fun copy$default (Lio/getstream/chat/android/client/events/NotificationMarkUnreadEvent;Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;IILjava/lang/Object;)Lio/getstream/chat/android/client/events/NotificationMarkUnreadEvent; + public final fun copy (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;I)Lio/getstream/chat/android/client/events/NotificationMarkUnreadEvent; + public static synthetic fun copy$default (Lio/getstream/chat/android/client/events/NotificationMarkUnreadEvent;Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lio/getstream/chat/android/client/events/NotificationMarkUnreadEvent; public fun equals (Ljava/lang/Object;)Z public fun getChannelId ()Ljava/lang/String; public fun getChannelType ()Ljava/lang/String; @@ -1793,6 +1794,7 @@ public final class io/getstream/chat/android/client/events/NotificationMarkUnrea public final fun getLastReadMessageAt ()Ljava/util/Date; public final fun getLastReadMessageId ()Ljava/lang/String; public fun getRawCreatedAt ()Ljava/lang/String; + public final fun getThreadId ()Ljava/lang/String; public fun getTotalUnreadCount ()I public fun getType ()Ljava/lang/String; public fun getUnreadChannels ()I diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/EventMapping.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/EventMapping.kt index 99f678ae10b..aeab166d8b3 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/EventMapping.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/EventMapping.kt @@ -516,6 +516,7 @@ private fun NotificationMarkUnreadEventDto.toDomain(currentUserId: UserId?): Not lastReadMessageId = last_read_message_id, lastReadMessageAt = last_read_at.date, unreadMessages = unread_messages, + threadId = thread_id, unreadThreads = unread_threads, ) } diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt index 9814f952588..05deef94d6f 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt @@ -287,6 +287,7 @@ internal data class NotificationMarkUnreadEventDto( val unread_messages: Int, val total_unread_count: Int, val unread_channels: Int, + val thread_id: String? = null, val unread_threads: Int = 0, ) : ChatEventDto() diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/events/ChatEvent.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/events/ChatEvent.kt index 00d7fe7df67..9fd21070f9f 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/events/ChatEvent.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/events/ChatEvent.kt @@ -449,6 +449,7 @@ public data class NotificationMarkUnreadEvent( val firstUnreadMessageId: String, val lastReadMessageAt: Date, val lastReadMessageId: String?, + val threadId: String? = null, val unreadThreads: Int = 0, ) : CidEvent(), UserEvent, HasUnreadCounts diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt index 53a71740481..bfe43da36e9 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt @@ -714,8 +714,8 @@ internal class EventHandlerSequential( ?.updateReads(event.toChannelUserRead()) ?.let(batch::addChannel) // Update corresponding thread if event was received for marking a thread as unread - if (event.lastReadMessageId == null) { - threadFromPendingUpdateOrRepo(batch, event.firstUnreadMessageId) + event.threadId?.let { threadId -> + threadFromPendingUpdateOrRepo(batch, threadId) ?.markAsUnreadByUser(event.user, event.createdAt) ?.let(batch::addThread) } diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogic.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogic.kt index dafd68102b6..aa513660d88 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogic.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogic.kt @@ -219,12 +219,8 @@ internal class QueryThreadsLogic( * @param event The [NotificationMarkUnreadEvent] informing about the read state change. */ private fun markThreadAsUnread(event: NotificationMarkUnreadEvent) { - // At the moment, this event does not return the thread id, - // so this is the only way to identify that this event is related to a thread - val isUnreadThread = event.lastReadMessageId == null - if (isUnreadThread) { - stateLogic.markThreadAsUnreadByUser(event.firstUnreadMessageId, event.user, event.createdAt) - } + val threadId = event.threadId ?: return + stateLogic.markThreadAsUnreadByUser(threadId, event.user, event.createdAt) } /** diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogicTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogicTest.kt index cf24cf868ef..d61c3ff175a 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogicTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querythreads/internal/QueryThreadsLogicTest.kt @@ -348,6 +348,7 @@ internal class QueryThreadsLogicTest { lastReadMessageId = "mId1", lastReadMessageAt = Date(), firstUnreadMessageId = "mId2", + threadId = null, unreadMessages = 1, ) val stateLogic = mock() @@ -374,6 +375,7 @@ internal class QueryThreadsLogicTest { lastReadMessageId = null, lastReadMessageAt = Date(), firstUnreadMessageId = "mId1", + threadId = "mId1", unreadMessages = 1, ) val stateLogic = mock() @@ -383,7 +385,7 @@ internal class QueryThreadsLogicTest { // when logic.handleEvents(listOf(event)) // then - verify(stateLogic, times(1)).markThreadAsUnreadByUser(event.firstUnreadMessageId, event.user, event.createdAt) + verify(stateLogic, times(1)).markThreadAsUnreadByUser(event.threadId!!, event.user, event.createdAt) } @Test