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 {