diff --git a/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt index ec38d670..5222b447 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt @@ -28,12 +28,14 @@ import com.google.android.material.chip.Chip import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemAnnouncementBinding import com.keylesspalace.tusky.entity.Announcement +import com.keylesspalace.tusky.entity.EmojiReaction import com.keylesspalace.tusky.interfaces.LinkListener import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.EmojiSpan import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.parseAsMastodonHtml import com.keylesspalace.tusky.util.setClickableText +import com.keylesspalace.tusky.util.setupReactions import com.keylesspalace.tusky.util.visible import java.lang.ref.WeakReference @@ -77,45 +79,13 @@ class AnnouncementAdapter( // hide button if announcement badge limit is already reached addReactionChip.visible(item.reactions.size < 8) - item.reactions.forEachIndexed { i, reaction -> - ( - chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip? - ?: Chip(ContextThemeWrapper(chips.context, com.google.android.material.R.style.Widget_MaterialComponents_Chip_Choice)).apply { - isCheckable = true - checkedIcon = null - chips.addView(this, i) - } - ) - .apply { - if (reaction.url == null) { - this.text = "${reaction.name} ${reaction.count}" - } else { - // we set the EmojiSpan on a space, because otherwise the Chip won't have the right size - // https://github.com/tuskyapp/Tusky/issues/2308 - val spanBuilder = SpannableStringBuilder(" ${reaction.count}") - val span = EmojiSpan(WeakReference(this)) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - span.contentDescription = reaction.name - } - spanBuilder.setSpan(span, 0, 1, 0) - Glide.with(this) - .asDrawable() - .load(if (animateEmojis) { reaction.url } else { reaction.staticUrl }) - .into(span.getTarget(animateEmojis)) - this.text = spanBuilder - } - - isChecked = reaction.me - - setOnClickListener { - if (reaction.me) { - listener.removeReaction(item.id, reaction.name) - } else { - listener.addReaction(item.id, reaction.name) - } - } - } - } + chips.setupReactions(item.reactions, fun(_: View, reaction: EmojiReaction) { + if (reaction.me) { + listener.removeReaction(item.id, reaction.name) + } else { + listener.addReaction(item.id, reaction.name) + } + }, animateEmojis) while (chips.size - 1 > item.reactions.size) { chips.removeViewAt(item.reactions.size) diff --git a/app/src/main/java/com/keylesspalace/tusky/util/EmojiReactions.kt b/app/src/main/java/com/keylesspalace/tusky/util/EmojiReactions.kt new file mode 100644 index 00000000..3ad02dc0 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/util/EmojiReactions.kt @@ -0,0 +1,51 @@ +package com.keylesspalace.tusky.util + +import android.os.Build +import android.text.SpannableStringBuilder +import android.view.ContextThemeWrapper +import android.view.View +import com.bumptech.glide.Glide +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup +import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.entity.EmojiReaction +import java.lang.ref.WeakReference + +fun ChipGroup.setupReactions(reactions: List, clickListener: (view: View, reaction: EmojiReaction) -> Unit, animateEmojis: Boolean) { + val chips = this + reactions.forEachIndexed { i, reaction -> + ( + chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip? + ?: Chip(ContextThemeWrapper(chips.context, com.google.android.material.R.style.Widget_MaterialComponents_Chip_Choice)).apply { + isCheckable = true + checkedIcon = null + chips.addView(this, i) + } + ) + .apply { + if (reaction.url == null) { + this.text = "${reaction.name} ${reaction.count}" + } else { + // we set the EmojiSpan on a space, because otherwise the Chip won't have the right size + // https://github.com/tuskyapp/Tusky/issues/2308 + val spanBuilder = SpannableStringBuilder(" ${reaction.count}") + val span = EmojiSpan(WeakReference(this)) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + span.contentDescription = reaction.name + } + spanBuilder.setSpan(span, 0, 1, 0) + Glide.with(this) + .asDrawable() + .load(if (animateEmojis) { reaction.url } else { reaction.staticUrl }) + .into(span.getTarget(animateEmojis)) + this.text = spanBuilder + } + + isChecked = reaction.me + + setOnClickListener { + clickListener(it, reaction) + } + } + } +}