Skip to content

Commit f4808c1

Browse files
committed
Wire enhanced-mention fields through Message
1 parent 4560c3d commit f4808c1

23 files changed

Lines changed: 516 additions & 47 deletions

File tree

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ import io.getstream.chat.android.client.api2.model.dto.DownstreamThreadInfoDto
5050
import io.getstream.chat.android.client.api2.model.dto.DownstreamThreadParticipantDto
5151
import io.getstream.chat.android.client.api2.model.dto.DownstreamUserBlockDto
5252
import io.getstream.chat.android.client.api2.model.dto.DownstreamUserDto
53+
import io.getstream.chat.android.client.api2.model.dto.DownstreamUserGroupDto
54+
import io.getstream.chat.android.client.api2.model.dto.DownstreamUserGroupMemberDto
5355
import io.getstream.chat.android.client.api2.model.dto.DownstreamVoteDto
5456
import io.getstream.chat.android.client.api2.model.dto.PrivacySettingsDto
5557
import io.getstream.chat.android.client.api2.model.dto.ReadReceiptsDto
@@ -121,6 +123,8 @@ import io.getstream.chat.android.models.UnreadCounts
121123
import io.getstream.chat.android.models.UnreadThread
122124
import io.getstream.chat.android.models.User
123125
import io.getstream.chat.android.models.UserBlock
126+
import io.getstream.chat.android.models.UserGroup
127+
import io.getstream.chat.android.models.UserGroupMember
124128
import io.getstream.chat.android.models.UserId
125129
import io.getstream.chat.android.models.UserTransformer
126130
import io.getstream.chat.android.models.Vote
@@ -130,7 +134,7 @@ import io.getstream.chat.android.models.querysort.QuerySorter
130134
import io.getstream.chat.android.models.querysort.SortDirection
131135
import java.util.Date
132136

133-
@Suppress("TooManyFunctions")
137+
@Suppress("TooManyFunctions", "LargeClass")
134138
internal class DomainMapping(
135139
val currentUserIdProvider: () -> UserId?,
136140
private val channelTransformer: ChannelTransformer,
@@ -225,6 +229,10 @@ internal class DomainMapping(
225229
messageId = id,
226230
),
227231
mentionedUsers = mentioned_users.map { it.toDomain() },
232+
mentionedHere = mentioned_here ?: false,
233+
mentionedChannel = mentioned_channel ?: false,
234+
mentionedGroups = mentioned_groups.map { it.toDomain() },
235+
mentionedRoles = mentioned_roles,
228236
ownReactions = own_reactions.toDomain(
229237
messageId = id,
230238
),
@@ -672,6 +680,7 @@ internal class DomainMapping(
672680
messageRemindersEnabled = user_message_reminders ?: false,
673681
sharedLocationsEnabled = shared_locations ?: false,
674682
markMessagesPending = mark_messages_pending,
683+
pushLevel = push_level,
675684
)
676685

677686
/**
@@ -930,6 +939,24 @@ internal class DomainMapping(
930939
return QuerySortByField<Channel>().desc(field)
931940
}
932941

942+
internal fun DownstreamUserGroupDto.toDomain(): UserGroup = UserGroup(
943+
id = id,
944+
name = name,
945+
description = description,
946+
team = team_id.orEmpty(),
947+
members = members.map { it.toDomain() },
948+
createdBy = created_by,
949+
createdAt = created_at,
950+
updatedAt = updated_at,
951+
)
952+
953+
internal fun DownstreamUserGroupMemberDto.toDomain(): UserGroupMember = UserGroupMember(
954+
groupId = group_id,
955+
userId = user_id,
956+
isAdmin = is_admin,
957+
createdAt = created_at,
958+
)
959+
933960
private companion object {
934961
private const val FIELD_LAST_MESSAGE_AT = "last_message_at"
935962
private const val FIELD_LAST_UPDATED = "last_updated"

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import io.getstream.chat.android.models.MessageType
4747
import io.getstream.chat.android.models.Mute
4848
import io.getstream.chat.android.models.Reaction
4949
import io.getstream.chat.android.models.User
50+
import io.getstream.chat.android.models.UserGroup
5051
import io.getstream.chat.android.models.UserTransformer
5152

5253
internal class DtoMapping(
@@ -134,6 +135,10 @@ internal class DtoMapping(
134135
id = id,
135136
type = upstreamType,
136137
mentioned_users = mentionedUsersIds,
138+
mentioned_here = mentionedHere,
139+
mentioned_channel = mentionedChannel,
140+
mentioned_group_ids = mentionedGroups.map(UserGroup::id),
141+
mentioned_roles = mentionedRoles,
137142
parent_id = parentId,
138143
pin_expires = pinExpires,
139144
pinned = pinned,

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/ConfigDto.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ internal data class ConfigDto(
4747
val user_message_reminders: Boolean?,
4848
val shared_locations: Boolean?,
4949
val mark_messages_pending: Boolean,
50+
val push_level: String? = null,
5051
)

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/dto/MessageDtos.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ internal data class UpstreamMessageDto(
3838
val id: String,
3939
val type: String,
4040
val mentioned_users: List<String>,
41+
val mentioned_here: Boolean = false,
42+
val mentioned_channel: Boolean = false,
43+
val mentioned_group_ids: List<String> = emptyList(),
44+
val mentioned_roles: List<String> = emptyList(),
4145
val parent_id: String?,
4246
val pin_expires: Date?,
4347
val pinned: Boolean?,
@@ -75,6 +79,10 @@ internal data class DownstreamMessageDto(
7579
val id: String,
7680
val latest_reactions: List<DownstreamReactionDto>,
7781
val mentioned_users: List<DownstreamUserDto>,
82+
val mentioned_here: Boolean? = null,
83+
val mentioned_channel: Boolean? = null,
84+
val mentioned_groups: List<DownstreamUserGroupDto> = emptyList(),
85+
val mentioned_roles: List<String> = emptyList(),
7886
val own_reactions: List<DownstreamReactionDto>,
7987
val parent_id: String?,
8088
val pin_expires: Date?,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright (c) 2014-2026 Stream.io Inc. All rights reserved.
3+
*
4+
* Licensed under the Stream License;
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://github.com/GetStream/stream-chat-android/blob/main/LICENSE
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.getstream.chat.android.client.api2.model.dto
18+
19+
import com.squareup.moshi.JsonClass
20+
import java.util.Date
21+
22+
@JsonClass(generateAdapter = true)
23+
internal data class DownstreamUserGroupDto(
24+
val id: String,
25+
val name: String,
26+
val description: String? = null,
27+
val team_id: String? = null,
28+
val members: List<DownstreamUserGroupMemberDto> = emptyList(),
29+
val created_by: String? = null,
30+
val created_at: Date? = null,
31+
val updated_at: Date? = null,
32+
)
33+
34+
@JsonClass(generateAdapter = true)
35+
internal data class DownstreamUserGroupMemberDto(
36+
val group_id: String,
37+
val user_id: String,
38+
val is_admin: Boolean = false,
39+
val created_at: Date? = null,
40+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2014-2026 Stream.io Inc. All rights reserved.
3+
*
4+
* Licensed under the Stream License;
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://github.com/GetStream/stream-chat-android/blob/main/LICENSE
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.getstream.chat.android.client.internal.offline.repository.database.converter.internal
18+
19+
import androidx.room.TypeConverter
20+
import com.squareup.moshi.adapter
21+
import io.getstream.chat.android.models.UserGroup
22+
23+
internal class UserGroupConverter {
24+
25+
@OptIn(ExperimentalStdlibApi::class)
26+
private val listAdapter = moshi.adapter<List<UserGroup>>()
27+
28+
@TypeConverter
29+
fun userGroupListToString(groups: List<UserGroup>?): String? = groups?.let(listAdapter::toJson)
30+
31+
@TypeConverter
32+
fun stringToUserGroupList(data: String?): List<UserGroup>? {
33+
if (data.isNullOrEmpty() || data == "null") return emptyList()
34+
return listAdapter.fromJson(data)
35+
}
36+
}

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/database/internal/ChatDatabase.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import io.getstream.chat.android.client.internal.offline.repository.database.con
4040
import io.getstream.chat.android.client.internal.offline.repository.database.converter.internal.ReminderInfoConverter
4141
import io.getstream.chat.android.client.internal.offline.repository.database.converter.internal.SetConverter
4242
import io.getstream.chat.android.client.internal.offline.repository.database.converter.internal.SyncStatusConverter
43+
import io.getstream.chat.android.client.internal.offline.repository.database.converter.internal.UserGroupConverter
4344
import io.getstream.chat.android.client.internal.offline.repository.database.converter.internal.UserMuteConverter
4445
import io.getstream.chat.android.client.internal.offline.repository.database.converter.internal.VoteConverter
4546
import io.getstream.chat.android.client.internal.offline.repository.domain.channel.internal.ChannelDao
@@ -88,7 +89,7 @@ import io.getstream.chat.android.client.internal.offline.repository.domain.user.
8889
ThreadOrderEntity::class,
8990
DraftMessageEntity::class,
9091
],
91-
version = 200,
92+
version = 201,
9293
exportSchema = false,
9394
)
9495
@TypeConverters(
@@ -112,6 +113,7 @@ import io.getstream.chat.android.client.internal.offline.repository.domain.user.
112113
LocationConverter::class,
113114
PushPreferenceConverter::class,
114115
UserMuteConverter::class,
116+
UserGroupConverter::class,
115117
)
116118
internal abstract class ChatDatabase : RoomDatabase() {
117119
abstract fun queryChannelsDao(): QueryChannelsDao

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/domain/channelconfig/internal/ChannelConfigEntity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ internal data class ChannelConfigInnerEntity(
5050
val blocklistBehavior: String,
5151
val messageRemindersEnabled: Boolean,
5252
val markMessagesPending: Boolean,
53+
val pushLevel: String? = null,
5354
)
5455

5556
@Entity(

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/domain/channelconfig/internal/ChannelConfigMapper.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ internal fun ChannelConfig.toEntity(): ChannelConfigEntity = ChannelConfigEntity
4646
blocklistBehavior = blocklistBehavior,
4747
messageRemindersEnabled = messageRemindersEnabled,
4848
markMessagesPending = markMessagesPending,
49+
pushLevel = pushLevel,
4950
)
5051
},
5152
commands = config.commands.map { it.toEntity(type) },
@@ -78,6 +79,7 @@ internal fun ChannelConfigEntity.toModel(): ChannelConfig = ChannelConfig(
7879
commands = commands.map(CommandInnerEntity::toModel),
7980
messageRemindersEnabled = messageRemindersEnabled,
8081
markMessagesPending = markMessagesPending,
82+
pushLevel = pushLevel,
8183
)
8284
},
8385
)

stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/offline/repository/domain/message/internal/MessageEntity.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import io.getstream.chat.android.client.internal.offline.repository.domain.messa
2525
import io.getstream.chat.android.client.internal.offline.repository.domain.message.channelinfo.internal.ChannelInfoEntity
2626
import io.getstream.chat.android.client.internal.offline.repository.domain.reaction.internal.ReactionEntity
2727
import io.getstream.chat.android.models.SyncStatus
28+
import io.getstream.chat.android.models.UserGroup
2829
import java.util.Date
2930

3031
internal data class MessageEntity(
@@ -77,6 +78,14 @@ internal data class MessageInnerEntity(
7778
val remoteMentionedUserIds: List<String> = emptyList(),
7879
/** the users to be mentioned in this message */
7980
val mentionedUsersId: List<String> = emptyList(),
81+
/** whether this message includes an `@here` mention */
82+
val mentionedHere: Boolean = false,
83+
/** whether this message includes an `@channel` mention */
84+
val mentionedChannel: Boolean = false,
85+
/** the user groups mentioned in this message */
86+
val mentionedGroups: List<UserGroup> = emptyList(),
87+
/** the roles mentioned in this message */
88+
val mentionedRoles: List<String> = emptyList(),
8089
/** a mapping between reaction type and the count, ie like:10, heart:4 */
8190
val reactionCounts: Map<String, Int> = emptyMap(),
8291
/** a mapping between reaction type and the reaction score, ie like:10, heart:4 */

0 commit comments

Comments
 (0)