diff --git a/library/ui-strings/src/main/res/values/strings_sc.xml b/library/ui-strings/src/main/res/values/strings_sc.xml index 01699e99ee..a5da1759a0 100644 --- a/library/ui-strings/src/main/res/values/strings_sc.xml +++ b/library/ui-strings/src/main/res/values/strings_sc.xml @@ -188,6 +188,7 @@ Free-form reaction Room emojis Emojis from %1$s + \"%1$s\" from %2$s Own emojis Standard emojis diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEmoteContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEmoteContent.kt index 7279e8c7de..63a71c4d23 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEmoteContent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEmoteContent.kt @@ -10,10 +10,18 @@ import org.matrix.android.sdk.api.session.room.powerlevels.Role @JsonClass(generateAdapter = true) data class RoomEmoteContent( @Json(name = "images") val images: Map? = null, - // TODO: "pack" support + @Json(name = "pack") val pack: RoomEmotePackContent? = null, ) { companion object { const val USAGE_EMOTICON = "emoticon" const val USAGE_STICKER = "sticker" } } + +@JsonClass(generateAdapter = true) +data class RoomEmotePackContent( + @Json(name = "display_name") val displayName: String? = null, + @Json(name = "avatar_url") val avatarUrl: String? = null, + @Json(name = "usage") val usage: Array? = null, + @Json(name = "attribution") val attribution: String? = null, +) diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiPresenter.kt b/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiPresenter.kt index c69a0b09e1..14a2c3126b 100644 --- a/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiPresenter.kt +++ b/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiPresenter.kt @@ -135,21 +135,33 @@ class AutocompleteEmojiPresenter @AssistedInject constructor( val packRoom = session.getRoom(packRoomId) ?: return@forEach packsEnabled.forEach roomPack@{ roomPack -> val packId = roomPack.key as? String ?: return@roomPack + val emojiItems = packRoom.getEmojiItems(query, QueryStringValue.Equals(packId)) + val packName = emojiItems.first // Filter out duplicate emotes with the exact same mxc url - val packImages = packRoom.getEmojiItems(query, QueryStringValue.Equals(packId)).filter { + val packImages = emojiItems.second.filter { it.mxcUrl !in emoteUrls }.limit(AutocompleteEmojiController.CUSTOM_OTHER_ROOM_MAX) // Add header + emotes if (packImages.isNotEmpty()) { packsAdded++ emoteUrls.addAll(packImages.map { it.mxcUrl }) + val packRoomName = packRoom.roomSummary()?.displayName ?: packRoomId + roomPack.value emoteData += listOf( AutocompleteEmojiDataItem.Header( packRoomId, - context.getString( - R.string.custom_emotes_other_room, - packRoom.roomSummary()?.displayName ?: packRoomId - ) + if (packName != null) { + context.getString( + R.string.custom_emotes_named_other_room, + packName, + packRoomName + ) + } else { + context.getString( + R.string.custom_emotes_other_room, + packRoomName + ) + } ) ) emoteData += packImages.toAutocompleteItems() @@ -172,8 +184,10 @@ class AutocompleteEmojiPresenter @AssistedInject constructor( return map { AutocompleteEmojiDataItem.Emoji(it) } } - private fun Room.getEmojiItems(query: CharSequence?, queryStringValue: QueryStateEventValue): List { - return getStateEvent(EventType.ROOM_EMOTES, queryStringValue)?.content?.toModel().getEmojiItems(query) + private fun Room.getEmojiItems(query: CharSequence?, queryStringValue: QueryStateEventValue): Pair> { + val content = getStateEvent(EventType.ROOM_EMOTES, queryStringValue)?.content?.toModel() + val packName = content?.pack?.displayName + return Pair(packName, content.getEmojiItems(query)) } private fun Room.getAllEmojiItems(query: CharSequence?): List {