Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import io.getstream.chat.android.client.events.NewMessageEvent
import io.getstream.chat.android.client.events.NotificationAddedToChannelEvent
import io.getstream.chat.android.client.events.NotificationChannelDeletedEvent
import io.getstream.chat.android.client.events.NotificationChannelMutesUpdatedEvent
import io.getstream.chat.android.client.events.NotificationChannelPartialUpdatedEvent
import io.getstream.chat.android.client.events.NotificationChannelTruncatedEvent
import io.getstream.chat.android.client.events.NotificationMarkReadEvent
import io.getstream.chat.android.client.events.NotificationMarkUnreadEvent
Expand Down Expand Up @@ -599,6 +600,22 @@ public fun randomNewMessageEvent(
)
}

public fun randomNotificationChannelPartialUpdatedEvent(
createdAt: Date = randomDate(),
cid: String = randomCID(),
channelType: String = randomString(),
channelId: String = randomString(),
channel: Channel = randomChannel(),
): NotificationChannelPartialUpdatedEvent = NotificationChannelPartialUpdatedEvent(
type = EventType.NOTIFICATION_CHANNEL_PARTIAL_UPDATED,
createdAt = createdAt,
rawCreatedAt = streamFormatter.format(createdAt),
cid = cid,
channelType = channelType,
channelId = channelId,
channel = channel,
)

public fun randomNotificationChannelTruncatedEvent(
createdAt: Date = randomDate(),
cid: String = randomCID(),
Expand Down
23 changes: 23 additions & 0 deletions stream-chat-android-client/api/stream-chat-android-client.api
Original file line number Diff line number Diff line change
Expand Up @@ -1954,6 +1954,29 @@ public final class io/getstream/chat/android/client/events/NotificationChannelMu
public fun toString ()Ljava/lang/String;
}

public final class io/getstream/chat/android/client/events/NotificationChannelPartialUpdatedEvent : io/getstream/chat/android/client/events/CidEvent, io/getstream/chat/android/client/events/HasChannel {
public fun <init> (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Channel;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/util/Date;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun component7 ()Lio/getstream/chat/android/models/Channel;
public final fun copy (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Channel;)Lio/getstream/chat/android/client/events/NotificationChannelPartialUpdatedEvent;
public static synthetic fun copy$default (Lio/getstream/chat/android/client/events/NotificationChannelPartialUpdatedEvent;Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Channel;ILjava/lang/Object;)Lio/getstream/chat/android/client/events/NotificationChannelPartialUpdatedEvent;
public fun equals (Ljava/lang/Object;)Z
public fun getChannel ()Lio/getstream/chat/android/models/Channel;
public fun getChannelId ()Ljava/lang/String;
public fun getChannelType ()Ljava/lang/String;
public fun getCid ()Ljava/lang/String;
public fun getCreatedAt ()Ljava/util/Date;
public fun getRawCreatedAt ()Ljava/lang/String;
public fun getType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class io/getstream/chat/android/client/events/NotificationChannelTruncatedEvent : io/getstream/chat/android/client/events/CidEvent, io/getstream/chat/android/client/events/HasChannel, io/getstream/chat/android/client/events/HasGroupedUnreadChannels, io/getstream/chat/android/client/events/HasUnreadCounts {
public fun <init> (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Channel;IILjava/util/Map;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Channel;IILjava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import io.getstream.chat.android.client.api2.model.dto.DeliveryReceiptsDto
import io.getstream.chat.android.client.api2.model.dto.DeviceDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamChannelDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamChannelMuteDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamChannelPartialUpdateDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamChannelUserRead
import io.getstream.chat.android.client.api2.model.dto.DownstreamDraftDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamFlagDto
Expand Down Expand Up @@ -193,6 +194,24 @@ internal class DomainMapping(
).syncUnreadCountWithReads(currentUserIdProvider())
.let(channelTransformer::transform)

/**
* Transforms [DownstreamChannelPartialUpdateDto] into a [Channel] holding only the fields the DTO carries.
* Like for a full channel, the server's `disabled` flag is kept in [Channel.extraData] and the channel
* transformer is applied, so the fields it carries replace local values that were transformed too.
*/
internal fun DownstreamChannelPartialUpdateDto.toDomain(): Channel =
Channel(
id = id,
type = type,
name = name ?: "",
image = image ?: "",
frozen = frozen,
createdAt = created_at,
updatedAt = updated_at,
team = team,
extraData = (extraData + (CHANNEL_DISABLED_FIELD to disabled)).toMutableMap(),
).let(channelTransformer::transform)

internal fun DownstreamChannelDto.toChannelInfo(): ChannelInfo =
ChannelInfo(
cid = cid,
Expand Down Expand Up @@ -923,5 +942,6 @@ internal class DomainMapping(
private companion object {
private const val FIELD_LAST_MESSAGE_AT = "last_message_at"
private const val FIELD_LAST_UPDATED = "last_updated"
private const val CHANNEL_DISABLED_FIELD = "disabled"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import io.getstream.chat.android.client.api2.model.dto.NotificationAddedToChannelEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelDeletedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelMutesUpdatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelPartialUpdatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelTruncatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationInviteAcceptedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationInviteRejectedEventDto
Expand Down Expand Up @@ -120,6 +121,7 @@
import io.getstream.chat.android.client.events.NotificationAddedToChannelEvent
import io.getstream.chat.android.client.events.NotificationChannelDeletedEvent
import io.getstream.chat.android.client.events.NotificationChannelMutesUpdatedEvent
import io.getstream.chat.android.client.events.NotificationChannelPartialUpdatedEvent
import io.getstream.chat.android.client.events.NotificationChannelTruncatedEvent
import io.getstream.chat.android.client.events.NotificationInviteAcceptedEvent
import io.getstream.chat.android.client.events.NotificationInviteRejectedEvent
Expand Down Expand Up @@ -168,7 +170,7 @@
*/
@Suppress("LongMethod")
internal fun ChatEventDto.toDomain(): ChatEvent {
return when (this) {

Check warning on line 173 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/EventMapping.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Reduce the number of when branches from 67 to at most 30.

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFAMXR75gVmBRCbJfaD&open=AaFAMXR75gVmBRCbJfaD&pullRequest=6835
is NewMessageEventDto -> toDomain()
is ChannelDeletedEventDto -> toDomain()
is ChannelHiddenEventDto -> toDomain()
Expand Down Expand Up @@ -197,6 +199,7 @@
is NotificationAddedToChannelEventDto -> toDomain()
is NotificationChannelDeletedEventDto -> toDomain()
is NotificationChannelMutesUpdatedEventDto -> toDomain()
is NotificationChannelPartialUpdatedEventDto -> toDomain()
is NotificationChannelTruncatedEventDto -> toDomain()
is NotificationInviteAcceptedEventDto -> toDomain()
is NotificationInviteRejectedEventDto -> toDomain()
Expand Down Expand Up @@ -540,6 +543,22 @@
)
}

/**
* Transforms [NotificationChannelPartialUpdatedEventDto] to [NotificationChannelPartialUpdatedEvent].
*/
private fun NotificationChannelPartialUpdatedEventDto.toDomain(): NotificationChannelPartialUpdatedEvent =
with(domainMapping) {
NotificationChannelPartialUpdatedEvent(
type = type,
createdAt = created_at.date,
rawCreatedAt = created_at.rawDate,
cid = cid,
channelType = channel_type,
channelId = channel_id,
channel = channel.toDomain(),
)
}

/**
* Transforms [NotificationChannelTruncatedEventDto] to [NotificationChannelTruncatedEvent].
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,25 @@
val extraData: Map<String, Any>,
) : ExtraDataDto

/**
* Model holding the channel fields delivered with `notification.channel_partial_updated` events. Like in
* [DownstreamChannelDto], the custom fields are at the top level of the channel and are collected in [extraData].
*/
@JsonClass(generateAdapter = true)
internal data class DownstreamChannelPartialUpdateDto(
val cid: String,
val id: String,
val type: String,
val name: String?,
val image: String?,
val created_at: Date?,

Check warning on line 63 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/ChannelDtos.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this parameter to match the regular expression ^`?[_a-z][a-zA-Z0-9]*`?$

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFAMXJ95gVmBRCbJfZ-&open=AaFAMXJ95gVmBRCbJfZ-&pullRequest=6835
val updated_at: Date?,

Check warning on line 64 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/ChannelDtos.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this parameter to match the regular expression ^`?[_a-z][a-zA-Z0-9]*`?$

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFAMXJ95gVmBRCbJfZ_&open=AaFAMXJ95gVmBRCbJfZ_&pullRequest=6835
val frozen: Boolean,
val disabled: Boolean,
val team: String = "",
val extraData: Map<String, Any>,
) : ExtraDataDto

/**
* Model holding custom channel fields delivered with `message.new` events.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,16 @@
val grouped_unread_channels: Map<String, Int>? = null,
) : ChatEventDto()

@JsonClass(generateAdapter = true)
internal data class NotificationChannelPartialUpdatedEventDto(
val type: String,
val created_at: ExactDate,

Check warning on line 266 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this parameter to match the regular expression ^`?[_a-z][a-zA-Z0-9]*`?$

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFAMXQV5gVmBRCbJfaA&open=AaFAMXQV5gVmBRCbJfaA&pullRequest=6835
val cid: String,
val channel_type: String,

Check warning on line 268 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this parameter to match the regular expression ^`?[_a-z][a-zA-Z0-9]*`?$

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFAMXQV5gVmBRCbJfaB&open=AaFAMXQV5gVmBRCbJfaB&pullRequest=6835
val channel_id: String,

Check warning on line 269 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/EventDtos.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this parameter to match the regular expression ^`?[_a-z][a-zA-Z0-9]*`?$

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFAMXQV5gVmBRCbJfaC&open=AaFAMXQV5gVmBRCbJfaC&pullRequest=6835
val channel: DownstreamChannelPartialUpdateDto,
) : ChatEventDto()

@JsonClass(generateAdapter = true)
internal data class NotificationInviteAcceptedEventDto(
val type: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import io.getstream.chat.android.client.events.NewMessageEvent
import io.getstream.chat.android.client.events.NotificationAddedToChannelEvent
import io.getstream.chat.android.client.events.NotificationChannelDeletedEvent
import io.getstream.chat.android.client.events.NotificationChannelMutesUpdatedEvent
import io.getstream.chat.android.client.events.NotificationChannelPartialUpdatedEvent
import io.getstream.chat.android.client.events.NotificationChannelTruncatedEvent
import io.getstream.chat.android.client.events.NotificationInviteAcceptedEvent
import io.getstream.chat.android.client.events.NotificationInviteRejectedEvent
Expand Down Expand Up @@ -277,6 +278,7 @@ public class ChannelClient internal constructor(
is NewMessageEvent -> event.cid == cid
is NotificationAddedToChannelEvent -> event.cid == cid
is NotificationChannelDeletedEvent -> event.cid == cid
is NotificationChannelPartialUpdatedEvent -> event.cid == cid
is NotificationChannelTruncatedEvent -> event.cid == cid
is NotificationInviteAcceptedEvent -> event.cid == cid
is NotificationInviteRejectedEvent -> event.cid == cid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,25 @@ public data class NotificationChannelMutesUpdatedEvent(
override val me: User,
) : ChatEvent(), HasOwnUser

/**
* Triggered when a channel is partially updated, for members of the channel who are not watching it. Members who
* are watching it receive [ChannelUpdatedEvent] instead.
*
* The [channel] carries only part of the channel data: [Channel.id], [Channel.type], [Channel.name], [Channel.image],
* [Channel.frozen], [Channel.team], [Channel.createdAt], [Channel.updatedAt] and [Channel.extraData] (the complete
* custom data, plus the `disabled` flag). Other fields, such as members, messages, reads, config and
* [Channel.lastMessageAt], keep their default values.
*/
public data class NotificationChannelPartialUpdatedEvent(
override val type: String,
override val createdAt: Date,
override val rawCreatedAt: String,
override val cid: String,
override val channelType: String,
override val channelId: String,
override val channel: Channel,
) : CidEvent(), HasChannel

/**
* Triggered when a channels' history is truncated
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import io.getstream.chat.android.client.parser2.adapters.AttachmentDtoAdapter
import io.getstream.chat.android.client.parser2.adapters.CreatePollRequestAdapter
import io.getstream.chat.android.client.parser2.adapters.DateAdapter
import io.getstream.chat.android.client.parser2.adapters.DownstreamChannelDtoAdapter
import io.getstream.chat.android.client.parser2.adapters.DownstreamChannelPartialUpdateDtoAdapter
import io.getstream.chat.android.client.parser2.adapters.DownstreamMemberDtoAdapter
import io.getstream.chat.android.client.parser2.adapters.DownstreamMessageDtoAdapter
import io.getstream.chat.android.client.parser2.adapters.DownstreamModerationDetailsDtoAdapter
Expand Down Expand Up @@ -71,6 +72,7 @@ internal class MoshiChatParser(
.add(DownstreamModerationDetailsDtoAdapter)
.add(UpstreamMessageDtoAdapter)
.add(DownstreamChannelDtoAdapter)
.add(DownstreamChannelPartialUpdateDtoAdapter)
.add(AttachmentDtoAdapter)
.add(DownstreamReactionDtoAdapter)
.add(UpstreamReactionDtoAdapter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import com.squareup.moshi.ToJson
import io.getstream.chat.android.client.api2.model.dto.DownstreamChannelDto
import io.getstream.chat.android.client.api2.model.dto.DownstreamChannelPartialUpdateDto

internal object DownstreamChannelDtoAdapter :
CustomObjectDtoAdapter<DownstreamChannelDto>(DownstreamChannelDto::class) {
Expand All @@ -37,3 +38,19 @@ internal object DownstreamChannelDtoAdapter :
@Suppress("UNUSED_PARAMETER")
fun toJson(jsonWriter: JsonWriter, value: DownstreamChannelDto): Unit = error("Can't convert this to Json")
}

internal object DownstreamChannelPartialUpdateDtoAdapter :
CustomObjectDtoAdapter<DownstreamChannelPartialUpdateDto>(DownstreamChannelPartialUpdateDto::class) {

@FromJson
fun fromJson(
jsonReader: JsonReader,
mapAdapter: JsonAdapter<MutableMap<String, Any>>,
channelAdapter: JsonAdapter<DownstreamChannelPartialUpdateDto>,
): DownstreamChannelPartialUpdateDto? = parseWithExtraData(jsonReader, mapAdapter, channelAdapter)

@ToJson
@Suppress("UNUSED_PARAMETER")
fun toJson(jsonWriter: JsonWriter, value: DownstreamChannelPartialUpdateDto): Unit =
error("Can't convert this to Json")
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import io.getstream.chat.android.client.api2.model.dto.NotificationAddedToChannelEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelDeletedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelMutesUpdatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelPartialUpdatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationChannelTruncatedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationInviteAcceptedEventDto
import io.getstream.chat.android.client.api2.model.dto.NotificationInviteRejectedEventDto
Expand Down Expand Up @@ -151,6 +152,8 @@
private val notificationChannelDeletedEventAdapter = moshi.adapter(NotificationChannelDeletedEventDto::class.java)
private val notificationChannelTruncatedEventAdapter =
moshi.adapter(NotificationChannelTruncatedEventDto::class.java)
private val notificationChannelPartialUpdatedEventAdapter =
moshi.adapter(NotificationChannelPartialUpdatedEventDto::class.java)
private val userPresenceChangedEventAdapter = moshi.adapter(UserPresenceChangedEventDto::class.java)
private val userUpdatedEventAdapter = moshi.adapter(UserUpdatedEventDto::class.java)
private val userDeletedEventAdapter = moshi.adapter(UserDeletedEventDto::class.java)
Expand Down Expand Up @@ -183,7 +186,7 @@

val map: Map<String, Any?> = mapAdapter.fromJson(reader)!!.filterValues { it != null }

val adapter = when (val type = map["type"] as? String) {

Check warning on line 189 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/parser2/adapters/EventAdapter.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Reduce the number of when branches from 58 to at most 30.

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AaFD9wRbCCnMqbDg5gQ6&open=AaFD9wRbCCnMqbDg5gQ6&pullRequest=6835
EventType.HEALTH_CHECK -> when {
map.containsKey("me") -> connectedEventAdapter
else -> healthEventAdapter
Expand Down Expand Up @@ -233,6 +236,7 @@
EventType.NOTIFICATION_CHANNEL_MUTES_UPDATED -> notificationChannelMutesUpdatedEventAdapter
EventType.NOTIFICATION_CHANNEL_DELETED -> notificationChannelDeletedEventAdapter
EventType.NOTIFICATION_CHANNEL_TRUNCATED -> notificationChannelTruncatedEventAdapter
EventType.NOTIFICATION_CHANNEL_PARTIAL_UPDATED -> notificationChannelPartialUpdatedEventAdapter
EventType.USER_PRESENCE_CHANGED -> userPresenceChangedEventAdapter
EventType.USER_UPDATED -> userUpdatedEventAdapter
EventType.USER_DELETED -> userDeletedEventAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,30 @@ internal fun createNotificationChannelDeletedEventStringJson() =
""".trimIndent(),
)

internal fun createNotificationChannelPartialUpdatedEventStringJson() =
createChatEventStringJson(
"notification.channel_partial_updated",
"""
"channel_type": "channelType",
"channel_id": "channelId",
"cid": "channelType:channelId",
"team": "team1",
"channel": {
"id": "channelId",
"type": "channelType",
"cid": "channelType:channelId",
"created_at": "2020-06-29T06:14:28.000Z",
"updated_at": "2020-06-29T06:14:28.000Z",
"frozen": true,
"disabled": false,
"team": "team1",
"name": "Channel name",
"image": "https://example.com/channel.png",
"group": "current"
}
""".trimIndent(),
)

internal fun createNotificationChannelTruncatedEventStringJson() =
createChatEventStringJson(
"notification.channel_truncated",
Expand Down
Loading
Loading