Move standard emojis to top of autocompletion

Now that we can limit emojis per category while allowing to expand them,
makes sense to show standard emojis on top, above custom emotes,
especially when users have lots of emotes.

Change-Id: I822cc091bf595795fa08fef32f0737073a43163a
This commit is contained in:
SpiritCroc 2023-04-07 11:27:37 +02:00
parent 07a0d315f5
commit cb593ebb14
2 changed files with 18 additions and 11 deletions

View File

@ -110,8 +110,12 @@ class AutocompleteEmojiController @Inject constructor(
} }
companion object { companion object {
// Count of standard emoji matches - WARN: do not set to 8 or less, or epoxy/recycler will sometimes crash with some class casts,
// e.g. when repeatedly typing `:turt`, then deleting back to `:`?!?
// What makes 8 magic? Probably that no-search proposals also returns 8 results? But wtf?
const val STANDARD_EMOJI_MAX = 9
// Count of emojis for the current room's image pack // Count of emojis for the current room's image pack
const val CUSTOM_THIS_ROOM_MAX = 10 const val CUSTOM_THIS_ROOM_MAX = 8
// Count of emojis per other image pack // Count of emojis per other image pack
const val CUSTOM_OTHER_ROOM_MAX = 5 const val CUSTOM_OTHER_ROOM_MAX = 5
// Count of emojis for global account data // Count of emojis for global account data
@ -122,7 +126,8 @@ class AutocompleteEmojiController @Inject constructor(
const val MAX = 50 const val MAX = 50
// Total max after expanding a section // Total max after expanding a section
const val MAX_EXPAND = 10000 const val MAX_EXPAND = 10000
// Internal ID // Internal IDs
const val ACCOUNT_DATA_EMOTE_ID = "de.spiritcroc.riotx.ACCOUNT_DATA_EMOTES" const val ACCOUNT_DATA_EMOTE_ID = "de.spiritcroc.riotx.ACCOUNT_DATA_EMOTES"
const val STANDARD_EMOJI_ID = "de.spiritcroc.riotx.STANDARD_EMOJI"
} }
} }

View File

@ -105,12 +105,19 @@ class AutocompleteEmojiPresenter @AssistedInject constructor(
lastQuery = query lastQuery = query
coroutineScope.launch { coroutineScope.launch {
// Plain emojis // Plain emojis
val fullStandardEmojis: List<EmojiItem>
val data = if (query.isNullOrBlank()) { val data = if (query.isNullOrBlank()) {
// Return common emojis // Return common emojis
emojiDataSource.getQuickReactions() fullStandardEmojis = emojiDataSource.getQuickReactions()
fullStandardEmojis
} else { } else {
emojiDataSource.filterWith(query.toString()) fullStandardEmojis = emojiDataSource.filterWith(query.toString())
}.toAutocompleteItems() fullStandardEmojis.maybeLimit(AutocompleteEmojiController.STANDARD_EMOJI_MAX, AutocompleteEmojiController.STANDARD_EMOJI_ID, null)
}.toAutocompleteItems().toMutableList()
if (fullStandardEmojis.size > data.size) {
data += listOf(AutocompleteEmojiDataItem.Expand(AutocompleteEmojiController.STANDARD_EMOJI_ID, null, fullStandardEmojis.size - data.size))
}
// Custom emotes: This room's emotes // Custom emotes: This room's emotes
val currentRoomEmotes = room.getAllEmojiItems(query) val currentRoomEmotes = room.getAllEmojiItems(query)
@ -203,12 +210,7 @@ class AutocompleteEmojiPresenter @AssistedInject constructor(
} }
} }
val dataHeader = if (data.isNotEmpty() && emoteData.isNotEmpty()) { controller.setData(data + emoteData)
listOf(AutocompleteEmojiDataItem.Header("de.spiritcroc.riotx.STANDARD_EMOJI_HEADER", context.getString(R.string.standard_emojis)))
} else {
emptyList()
}
controller.setData(emoteData + dataHeader + data)
} }
} }