Fix announcement reactions (#2311)

* fix size of announcement reactions

* fix announcement reactions not updating correctly

* remove unused code

* improve code

* remove unused imports
This commit is contained in:
Konrad Pozniak 2022-02-05 19:13:05 +01:00 committed by GitHub
parent 329bc51f90
commit db1cc02fb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 37 additions and 32 deletions

View File

@ -15,21 +15,25 @@
package com.keylesspalace.tusky.components.announcements package com.keylesspalace.tusky.components.announcements
import android.os.Build
import android.text.SpannableStringBuilder
import android.view.ContextThemeWrapper import android.view.ContextThemeWrapper
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.size import androidx.core.view.size
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.keylesspalace.tusky.R import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemAnnouncementBinding import com.keylesspalace.tusky.databinding.ItemAnnouncementBinding
import com.keylesspalace.tusky.entity.Announcement import com.keylesspalace.tusky.entity.Announcement
import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.interfaces.LinkListener import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.EmojiSpan
import com.keylesspalace.tusky.util.LinkHelper import com.keylesspalace.tusky.util.LinkHelper
import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.emojify
import java.lang.ref.WeakReference
interface AnnouncementActionListener : LinkListener { interface AnnouncementActionListener : LinkListener {
fun openReactionPicker(announcementId: String, target: View) fun openReactionPicker(announcementId: String, target: View)
@ -69,42 +73,43 @@ class AnnouncementAdapter(
} }
item.reactions.forEachIndexed { i, reaction -> item.reactions.forEachIndexed { i, reaction ->
chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip? (
?: Chip(ContextThemeWrapper(chips.context, R.style.Widget_MaterialComponents_Chip_Choice)).apply { chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip?
isCheckable = true ?: Chip(ContextThemeWrapper(chips.context, R.style.Widget_MaterialComponents_Chip_Choice)).apply {
checkedIcon = null isCheckable = true
chips.addView(this, i) checkedIcon = null
} chips.addView(this, i)
.apply { }
val emojiText = if (reaction.url == null) { )
reaction.name .apply {
} else { if (reaction.url == null) {
context.getString(R.string.emoji_shortcode_format, reaction.name) 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
} }
this.text = ("$emojiText ${reaction.count}") spanBuilder.setSpan(span, 0, 1, 0)
.emojify( Glide.with(this)
listOf( .asDrawable()
Emoji( .load(if (animateEmojis) { reaction.url } else { reaction.staticUrl })
reaction.name, .into(span.getTarget(animateEmojis))
reaction.url ?: "", this.text = spanBuilder
reaction.staticUrl ?: "", }
null
)
),
this,
animateEmojis
)
isChecked = reaction.me isChecked = reaction.me
setOnClickListener { setOnClickListener {
if (reaction.me) { if (reaction.me) {
listener.removeReaction(item.id, reaction.name) listener.removeReaction(item.id, reaction.name)
} else { } else {
listener.addReaction(item.id, reaction.name) listener.addReaction(item.id, reaction.name)
}
} }
} }
}
} }
while (chips.size - 1 > item.reactions.size) { while (chips.size - 1 > item.reactions.size) {