SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/columnviewholder/ColumnViewHolderReactions.kt

110 lines
4.2 KiB
Kotlin
Raw Normal View History

2021-06-28 09:09:00 +02:00
package jp.juggler.subwaytooter.columnviewholder
import androidx.appcompat.widget.AppCompatButton
import androidx.core.content.ContextCompat
import com.google.android.flexbox.FlexboxLayout
2021-06-28 09:09:00 +02:00
import jp.juggler.subwaytooter.ActMain
import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.api.entity.TootReaction
2021-06-28 09:09:00 +02:00
import jp.juggler.subwaytooter.column.getContentColor
2022-05-29 15:38:21 +02:00
import jp.juggler.subwaytooter.dialog.launchEmojiPicker
import jp.juggler.subwaytooter.emoji.CustomEmoji
import jp.juggler.subwaytooter.emoji.UnicodeEmoji
import jp.juggler.subwaytooter.util.*
import jp.juggler.util.coroutine.launchAndShowError
import org.jetbrains.anko.allCaps
fun ColumnViewHolder.addEmojiQuery(reaction: TootReaction? = null) {
val column = this.column ?: return
if (reaction == null) {
2022-05-29 15:38:21 +02:00
launchEmojiPicker(activity, column.accessInfo, closeOnSelected = true) { emoji, _ ->
val newReaction = when (emoji) {
is UnicodeEmoji -> TootReaction(name = emoji.unifiedCode)
is CustomEmoji -> TootReaction(
name = emoji.shortcode,
url = emoji.url,
2021-06-21 05:03:09 +02:00
staticUrl = emoji.staticUrl
)
}
addEmojiQuery(newReaction)
2022-05-29 15:38:21 +02:00
}
return
}
val list = TootReaction.decodeEmojiQuery(column.searchQuery).toMutableList()
list.add(reaction)
column.searchQuery = TootReaction.encodeEmojiQuery(list)
updateReactionQueryView()
activity.appState.saveColumnList()
}
private fun ColumnViewHolder.removeEmojiQuery(target: TootReaction?) {
target ?: return
val list = TootReaction.decodeEmojiQuery(column?.searchQuery).filter { it.name != target.name }
column?.searchQuery = TootReaction.encodeEmojiQuery(list)
updateReactionQueryView()
activity.appState.saveColumnList()
}
fun ColumnViewHolder.updateReactionQueryView() {
val column = this.column ?: return
val act = this.activity // not Button(View).getActivity()
2022-05-29 15:38:21 +02:00
act.launchAndShowError {
2022-05-29 15:38:21 +02:00
flEmoji.removeAllViews()
2022-05-29 15:38:21 +02:00
for (invalidator in emojiQueryInvalidatorList) {
invalidator.register(null)
}
emojiQueryInvalidatorList.clear()
val options = DecodeOptions(
act,
column.accessInfo,
decodeEmoji = true,
enlargeEmoji = DecodeOptions.emojiScaleReaction,
enlargeCustomEmoji = DecodeOptions.emojiScaleReaction,
emojiSizeMode = column.accessInfo.emojiSizeMode(),
2022-05-29 15:38:21 +02:00
)
val buttonHeight = ActMain.boostButtonSize
val marginBetween = (buttonHeight.toFloat() * 0.05f + 0.5f).toInt()
val paddingH = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
val paddingV = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
val contentColor = column.getContentColor()
TootReaction.decodeEmojiQuery(column.searchQuery).forEachIndexed { index, reaction ->
val ssb = reaction.toSpannableStringBuilder(options, status = null)
val b = AppCompatButton(activity).apply {
layoutParams = FlexboxLayout.LayoutParams(
FlexboxLayout.LayoutParams.WRAP_CONTENT,
buttonHeight
).apply {
if (index > 0) startMargin = marginBetween
}
minWidthCompat = buttonHeight
background = ContextCompat.getDrawable(act, R.drawable.btn_bg_transparent_round6dp)
setTextColor(contentColor)
setPadding(paddingH, paddingV, paddingH, paddingV)
allCaps = false
tag = reaction
setOnLongClickListener {
removeEmojiQuery(it.tag as? TootReaction)
true
}
// カスタム絵文字の場合、アニメーション等のコールバックを処理する必要がある
val invalidator = NetworkEmojiInvalidator(act.handler, this)
invalidator.text = ssb
2022-05-29 15:38:21 +02:00
emojiQueryInvalidatorList.add(invalidator)
}
2022-05-29 15:38:21 +02:00
flEmoji.addView(b)
}
}
}