From e7d1017a1f2a3fe11e30d0b295cc7526f32e23f4 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Wed, 17 Jul 2024 14:51:31 +0530 Subject: [PATCH] Show emoji category names --- .../keyboard/adapters/EmojisAdapter.kt | 70 +++++++++++-------- .../fossify/keyboard/helpers/EmojiHelper.kt | 42 +++++++---- .../fossify/keyboard/views/MyKeyboardView.kt | 5 +- .../res/layout/item_emoji_category_title.xml | 11 +++ app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 9 +++ 6 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 app/src/main/res/layout/item_emoji_category_title.xml diff --git a/app/src/main/kotlin/org/fossify/keyboard/adapters/EmojisAdapter.kt b/app/src/main/kotlin/org/fossify/keyboard/adapters/EmojisAdapter.kt index e5d440f2..04c9c3f8 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/adapters/EmojisAdapter.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/adapters/EmojisAdapter.kt @@ -6,35 +6,41 @@ import android.view.View import android.view.ViewGroup import androidx.emoji2.text.EmojiCompat import androidx.recyclerview.widget.RecyclerView -import org.fossify.commons.databinding.DividerBinding -import org.fossify.commons.extensions.beInvisible +import org.fossify.commons.extensions.adjustAlpha +import org.fossify.commons.extensions.getProperTextColor import org.fossify.keyboard.databinding.ItemEmojiBinding +import org.fossify.keyboard.databinding.ItemEmojiCategoryTitleBinding import org.fossify.keyboard.helpers.EmojiData +import org.fossify.keyboard.helpers.getCategoryTitleRes + +class EmojisAdapter( + val context: Context, + val items: List, + val itemClick: (emoji: EmojiData) -> Unit +) : RecyclerView.Adapter() { -class EmojisAdapter(val context: Context, private val items: List, val itemClick: (emoji: EmojiData) -> Unit) : - RecyclerView.Adapter() { private val layoutInflater = LayoutInflater.from(context) + private val textColor = context.getProperTextColor() - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EmojisAdapter.ViewHolder { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { - ITEM_TYPE_EMOJI -> { - val view = ItemEmojiBinding.inflate(layoutInflater, parent, false).root - ViewHolder(view) - } + ITEM_TYPE_EMOJI -> EmojiViewHolder( + ItemEmojiBinding.inflate(layoutInflater, parent, false).root + ) - else -> { - val view = DividerBinding.inflate(layoutInflater, parent, false).root.apply { beInvisible() } - ViewHolder(view) - } + ITEM_TYPE_CATEGORY -> EmojiCategoryViewHolder( + ItemEmojiCategoryTitleBinding.inflate(layoutInflater, parent, false).root + ) + + else -> throw IllegalArgumentException("Unsupported view type: $viewType") } } - override fun onBindViewHolder(holder: EmojisAdapter.ViewHolder, position: Int) { + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val item = items[position] - if (item is Item.Emoji) { - holder.bindView(item) { itemView -> - setupEmoji(itemView, item) - } + when (holder) { + is EmojiViewHolder -> holder.bindView(item as Item.Emoji) + is EmojiCategoryViewHolder -> holder.bindView(item as Item.Category) } } @@ -48,25 +54,29 @@ class EmojisAdapter(val context: Context, private val items: List, val ite override fun getItemCount() = items.size - private fun setupEmoji(view: View, emoji: Item.Emoji) { - val processed = EmojiCompat.get().process(emoji.value.emoji) - ItemEmojiBinding.bind(view).emojiValue.text = processed - } - - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - fun bindView(emoji: Item.Emoji, callback: (itemView: View) -> Unit): View { - return itemView.apply { - callback(this) - + inner class EmojiViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + fun bindView(emoji: Item.Emoji) { + val processed = EmojiCompat.get().process(emoji.emojiData.emoji) + itemView.apply { + ItemEmojiBinding.bind(this).emojiValue.text = processed setOnClickListener { - itemClick.invoke(emoji.value) + itemClick.invoke(emoji.emojiData) } } } } + inner class EmojiCategoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + fun bindView(category: Item.Category) { + ItemEmojiCategoryTitleBinding.bind(itemView).emojiCategoryTitle.apply { + text = context.getString(getCategoryTitleRes(category.value)) + setTextColor(textColor.adjustAlpha(0.6f)) + } + } + } + sealed interface Item { - data class Emoji(val value: EmojiData) : Item + data class Emoji(val emojiData: EmojiData) : Item data class Category(val value: String) : Item } diff --git a/app/src/main/kotlin/org/fossify/keyboard/helpers/EmojiHelper.kt b/app/src/main/kotlin/org/fossify/keyboard/helpers/EmojiHelper.kt index 5a0fbd59..8216d16e 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/helpers/EmojiHelper.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/helpers/EmojiHelper.kt @@ -94,17 +94,31 @@ data class EmojiData( val category: String, val emoji: String, val variants: List -) { - fun getCategoryIcon(): Int = - when (category) { - "people_body" -> R.drawable.ic_emoji_category_people - "animals_nature" -> R.drawable.ic_emoji_category_animals - "food_drink" -> R.drawable.ic_emoji_category_food - "travel_places" -> R.drawable.ic_emoji_category_travel - "activities" -> R.drawable.ic_emoji_category_activities - "objects" -> R.drawable.ic_emoji_category_objects - "symbols" -> R.drawable.ic_emoji_category_symbols - "flags" -> R.drawable.ic_emoji_category_flags - else -> R.drawable.ic_emoji_category_smileys - } -} +) + +fun getCategoryIconRes(category: String): Int = + when (category) { + "people_body" -> R.drawable.ic_emoji_category_people + "animals_nature" -> R.drawable.ic_emoji_category_animals + "food_drink" -> R.drawable.ic_emoji_category_food + "travel_places" -> R.drawable.ic_emoji_category_travel + "activities" -> R.drawable.ic_emoji_category_activities + "objects" -> R.drawable.ic_emoji_category_objects + "symbols" -> R.drawable.ic_emoji_category_symbols + "flags" -> R.drawable.ic_emoji_category_flags + else -> R.drawable.ic_emoji_category_smileys + } + + +fun getCategoryTitleRes(category: String) = + when (category) { + "people_body" -> R.string.people_and_body + "animals_nature" -> R.string.animals_and_nature + "food_drink" -> R.string.food_and_drink + "travel_places" -> R.string.travel_and_places + "activities" -> R.string.activities + "objects" -> R.string.objects + "symbols" -> R.string.symbols + "flags" -> R.string.flags + else -> R.string.smileys_and_emotions + } diff --git a/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt b/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt index b90d531a..20fa2082 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt @@ -1576,16 +1576,17 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut allItems.add(EmojisAdapter.Item.Category(category)) allItems.addAll(emojis.map(EmojisAdapter.Item::Emoji)) } + val checkIds = mutableMapOf() keyboardViewBinding?.emojiCategoriesStrip?.apply { weightSum = categories.count().toFloat() val strip = this removeAllViews() - categories.entries.forEach { (category, emojis) -> + categories.entries.forEach { (category, _) -> ItemEmojiCategoryBinding.inflate(LayoutInflater.from(context), this, true).apply { root.id = generateViewId() checkIds[root.id] = category - root.setImageResource(emojis.first().getCategoryIcon()) + root.setImageResource(getCategoryIconRes(category)) root.layoutParams = LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, diff --git a/app/src/main/res/layout/item_emoji_category_title.xml b/app/src/main/res/layout/item_emoji_category_title.xml new file mode 100644 index 00000000..2f360a07 --- /dev/null +++ b/app/src/main/res/layout/item_emoji_category_title.xml @@ -0,0 +1,11 @@ + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 98999f3b..34790158 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -19,4 +19,5 @@ 16sp 30sp 14sp + 13sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7caf9958..21657958 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,15 @@ Start sentences with a capital letter Emojis + Smileys and emotions + People and body + Animals and nature + Food and drink + Travel and places + Activities + Objects + Symbols + Flags Voice typing method Switch to voice typing