Skip to content

Commit 40119da

Browse files
VelikovPetarclaude
andauthored
Improve Channel lastMessageAt calculation (#6118)
* Improve Channel lastMessageAt calculation Co-Authored-By: Claude <noreply@anthropic.com> * Update CHANGELOG Co-Authored-By: Claude <noreply@anthropic.com> * Fix margeChannelFromEvent. * Fix tests. --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 7cbcfcb commit 40119da

20 files changed

Lines changed: 559 additions & 306 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
### 🐞 Fixed
3838

3939
### ⬆️ Improved
40+
- Improve `Channel.lastMessageAt` calculation by converting it from a computed property to a stored property. [#6118](https://github.com/GetStream/stream-chat-android/pull/6118)
4041

4142
### ✅ Added
4243

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DomainMapping.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ internal class DomainMapping(
186186
membership = membership?.toDomain(),
187187
activeLiveLocations = active_live_locations.map { it.toDomain() },
188188
messageCount = message_count,
189+
lastMessageAt = last_message_at,
189190
extraData = extraData.toMutableMap(),
190191
).syncUnreadCountWithReads(currentUserIdProvider())
191192
.let(channelTransformer::transform)

stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DomainMappingTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,33 @@ internal class DomainMappingTest {
250250
assertEquals(transformedChannel, result)
251251
}
252252

253+
@Test
254+
fun `DownstreamChannelDto is correctly mapped to Channel`() {
255+
val downstreamChannelDto = randomDownstreamChannelDto()
256+
val sut = Fixture().get()
257+
val channel = with(sut) {
258+
downstreamChannelDto.toDomain()
259+
}
260+
261+
assertEquals(downstreamChannelDto.id, channel.id)
262+
assertEquals(downstreamChannelDto.type, channel.type)
263+
assertEquals(downstreamChannelDto.name ?: "", channel.name)
264+
assertEquals(downstreamChannelDto.image ?: "", channel.image)
265+
assertEquals(downstreamChannelDto.watcher_count, channel.watcherCount)
266+
assertEquals(downstreamChannelDto.filter_tags.orEmpty(), channel.filterTags)
267+
assertEquals(downstreamChannelDto.frozen, channel.frozen)
268+
assertEquals(downstreamChannelDto.created_at, channel.createdAt)
269+
assertEquals(downstreamChannelDto.deleted_at, channel.deletedAt)
270+
assertEquals(downstreamChannelDto.updated_at, channel.updatedAt)
271+
assertEquals(downstreamChannelDto.member_count, channel.memberCount)
272+
assertEquals(downstreamChannelDto.team, channel.team)
273+
assertEquals(downstreamChannelDto.cooldown, channel.cooldown)
274+
assertEquals(downstreamChannelDto.own_capabilities.toSet(), channel.ownCapabilities)
275+
assertEquals(downstreamChannelDto.message_count, channel.messageCount)
276+
assertEquals(downstreamChannelDto.last_message_at, channel.lastMessageAt)
277+
assertEquals(downstreamChannelDto.extraData, channel.extraData)
278+
}
279+
253280
@Test
254281
fun `AppSettingsResponse is correctly mapped to AppSettings`() {
255282
val response = randomAppSettingsResponse()

stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser/EventArguments.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ internal object EventArguments {
197197
members = listOf(member),
198198
memberCount = 1,
199199
config = config,
200+
lastMessageAt = date,
200201
)
201202

202203
private val channelInfo = ChannelInfo(

stream-chat-android-core/api/stream-chat-android-core.api

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,8 @@ public final class io/getstream/chat/android/models/BannedUsersSort : io/getstre
370370

371371
public final class io/getstream/chat/android/models/Channel : io/getstream/chat/android/models/CustomObject, io/getstream/chat/android/models/querysort/ComparableFieldProvider {
372372
public fun <init> ()V
373-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Map;)V
374-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Map;IILkotlin/jvm/internal/DefaultConstructorMarker;)V
373+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;Ljava/util/Map;)V
374+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;Ljava/util/Map;IILkotlin/jvm/internal/DefaultConstructorMarker;)V
375375
public final fun component1 ()Ljava/lang/String;
376376
public final fun component10 ()Lio/getstream/chat/android/models/SyncStatus;
377377
public final fun component11 ()I
@@ -399,15 +399,16 @@ public final class io/getstream/chat/android/models/Channel : io/getstream/chat/
399399
public final fun component31 ()Ljava/lang/Integer;
400400
public final fun component32 ()Lio/getstream/chat/android/models/PushPreference;
401401
public final fun component33 ()Ljava/util/List;
402-
public final fun component34 ()Ljava/util/Map;
402+
public final fun component34 ()Ljava/util/Date;
403+
public final fun component35 ()Ljava/util/Map;
403404
public final fun component4 ()Ljava/lang/String;
404405
public final fun component5 ()I
405406
public final fun component6 ()Z
406407
public final fun component7 ()Ljava/util/Date;
407408
public final fun component8 ()Ljava/util/Date;
408409
public final fun component9 ()Ljava/util/Date;
409-
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Map;)Lio/getstream/chat/android/models/Channel;
410-
public static synthetic fun copy$default (Lio/getstream/chat/android/models/Channel;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Map;IILjava/lang/Object;)Lio/getstream/chat/android/models/Channel;
410+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;Ljava/util/Map;)Lio/getstream/chat/android/models/Channel;
411+
public static synthetic fun copy$default (Lio/getstream/chat/android/models/Channel;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;Lio/getstream/chat/android/models/SyncStatus;ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/models/Config;Lio/getstream/chat/android/models/User;ILjava/lang/String;Ljava/lang/Boolean;Ljava/util/Date;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Ljava/util/List;ZLio/getstream/chat/android/models/DraftMessage;Ljava/util/List;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;Ljava/util/Map;IILjava/lang/Object;)Lio/getstream/chat/android/models/Channel;
411412
public fun equals (Ljava/lang/Object;)Z
412413
public final fun getActiveLiveLocations ()Ljava/util/List;
413414
public final fun getCachedLatestMessages ()Ljava/util/List;
@@ -475,6 +476,7 @@ public final class io/getstream/chat/android/models/Channel$Builder {
475476
public final fun withId (Ljava/lang/String;)Lio/getstream/chat/android/models/Channel$Builder;
476477
public final fun withImage (Ljava/lang/String;)Lio/getstream/chat/android/models/Channel$Builder;
477478
public final fun withIsInsideSearch (Z)Lio/getstream/chat/android/models/Channel$Builder;
479+
public final fun withLastMessageAt (Ljava/util/Date;)Lio/getstream/chat/android/models/Channel$Builder;
478480
public final fun withMemberCount (I)Lio/getstream/chat/android/models/Channel$Builder;
479481
public final fun withMembers (Ljava/util/List;)Lio/getstream/chat/android/models/Channel$Builder;
480482
public final fun withMembership (Lio/getstream/chat/android/models/Member;)Lio/getstream/chat/android/models/Channel$Builder;
@@ -547,8 +549,8 @@ public final class io/getstream/chat/android/models/ChannelConfig {
547549

548550
public final class io/getstream/chat/android/models/ChannelData {
549551
public fun <init> (Lio/getstream/chat/android/models/Channel;Ljava/util/Set;)V
550-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;)V
551-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
552+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;)V
553+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
552554
public final fun component1 ()Ljava/lang/String;
553555
public final fun component10 ()Ljava/util/Date;
554556
public final fun component11 ()I
@@ -561,15 +563,16 @@ public final class io/getstream/chat/android/models/ChannelData {
561563
public final fun component18 ()Lio/getstream/chat/android/models/PushPreference;
562564
public final fun component19 ()Ljava/util/List;
563565
public final fun component2 ()Ljava/lang/String;
566+
public final fun component20 ()Ljava/util/Date;
564567
public final fun component3 ()Ljava/lang/String;
565568
public final fun component4 ()Ljava/lang/String;
566569
public final fun component5 ()Lio/getstream/chat/android/models/User;
567570
public final fun component6 ()I
568571
public final fun component7 ()Z
569572
public final fun component8 ()Ljava/util/Date;
570573
public final fun component9 ()Ljava/util/Date;
571-
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;)Lio/getstream/chat/android/models/ChannelData;
572-
public static synthetic fun copy$default (Lio/getstream/chat/android/models/ChannelData;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;ILjava/lang/Object;)Lio/getstream/chat/android/models/ChannelData;
574+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;)Lio/getstream/chat/android/models/ChannelData;
575+
public static synthetic fun copy$default (Lio/getstream/chat/android/models/ChannelData;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/User;IZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/Map;Ljava/util/Set;Lio/getstream/chat/android/models/Member;Lio/getstream/chat/android/models/DraftMessage;Ljava/lang/Integer;Lio/getstream/chat/android/models/PushPreference;Ljava/util/List;Ljava/util/Date;ILjava/lang/Object;)Lio/getstream/chat/android/models/ChannelData;
573576
public fun equals (Ljava/lang/Object;)Z
574577
public final fun getCid ()Ljava/lang/String;
575578
public final fun getCooldown ()I
@@ -582,6 +585,7 @@ public final class io/getstream/chat/android/models/ChannelData {
582585
public final fun getFrozen ()Z
583586
public final fun getId ()Ljava/lang/String;
584587
public final fun getImage ()Ljava/lang/String;
588+
public final fun getLastMessageAt ()Ljava/util/Date;
585589
public final fun getMemberCount ()I
586590
public final fun getMembership ()Lio/getstream/chat/android/models/Member;
587591
public final fun getMessageCount ()Ljava/lang/Integer;

0 commit comments

Comments
 (0)