Move setuping emoji reactions to separate function

This commit is contained in:
fruye 2022-12-03 21:02:44 +01:00
parent 1975d93e0e
commit 8126e70440
2 changed files with 60 additions and 39 deletions

View File

@ -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)

View File

@ -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<EmojiReaction>, 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)
}
}
}
}