NetworkEmojiSpanにもinitialAspectを供給する

This commit is contained in:
tateisu 2023-02-23 00:22:28 +09:00
parent 900502fe66
commit dddbf95dac
7 changed files with 47 additions and 22 deletions

View File

@ -11,8 +11,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import jp.juggler.subwaytooter.databinding.ActGlideTestBinding
import jp.juggler.subwaytooter.databinding.LvGlideTestBinding
import jp.juggler.subwaytooter.util.EmojiSizeMode
import jp.juggler.subwaytooter.span.NetworkEmojiSpan
import jp.juggler.subwaytooter.util.EmojiSizeMode
import jp.juggler.subwaytooter.util.NetworkEmojiInvalidator
import jp.juggler.util.coroutine.AppDispatchers
import jp.juggler.util.coroutine.launchAndShowError

View File

@ -15,11 +15,11 @@ import jp.juggler.subwaytooter.emoji.EmojiBase
import jp.juggler.subwaytooter.emoji.UnicodeEmoji
import jp.juggler.subwaytooter.pref.PrefB
import jp.juggler.subwaytooter.span.NetworkEmojiSpan
import jp.juggler.subwaytooter.util.emojiSizeMode
import jp.juggler.subwaytooter.table.*
import jp.juggler.subwaytooter.util.DecodeOptions
import jp.juggler.subwaytooter.util.EmojiDecoder
import jp.juggler.subwaytooter.util.PopupAutoCompleteAcct
import jp.juggler.subwaytooter.util.emojiSizeMode
import jp.juggler.subwaytooter.view.MyEditText
import jp.juggler.util.*
import jp.juggler.util.coroutine.launchAndShowError
@ -275,7 +275,11 @@ class CompletionHelper(
val sb = SpannableStringBuilder()
sb.append(' ')
sb.setSpan(
NetworkEmojiSpan(item.url, sizeMode = accessInfo.emojiSizeMode()),
NetworkEmojiSpan(
item.url,
sizeMode = accessInfo.emojiSizeMode(),
initialAspect = item.aspect,
),
0,
sb.length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

View File

@ -33,6 +33,9 @@ class TootReaction(
// (fedibird絵文字リアクション) userストリームのemoji_reactionイベントで設定される。
val status_id: EntityId? = null,
// (fedibird絵文字リアクション)
val aspect: Float? = null,
) {
companion object {
@ -53,6 +56,14 @@ class TootReaction(
me = src.boolean("me") ?: false,
announcement_id = EntityId.mayNull(src.string("announcement_id")),
status_id = EntityId.mayNull(src.string("status_id")),
aspect = src.run {
val w = double("width")
val h = double("height")
when {
w == null || h == null || w < 1.0 || h < 1.0 -> null
else -> (w / h).toFloat()
}
}
)
// Misskeyの通知にあるreaction文字列
@ -130,12 +141,14 @@ class TootReaction(
options: DecodeOptions,
code: String,
url: String,
initialAspect: Float? = null,
) = SpannableStringBuilder(code).apply {
setSpan(
NetworkEmojiSpan(
url = url,
scale = options.enlargeCustomEmoji,
sizeMode = options.emojiSizeMode
sizeMode = options.emojiSizeMode,
initialAspect = initialAspect,
),
0,
length,
@ -206,7 +219,7 @@ class TootReaction(
status?.custom_emojis?.get(customCode)
?.chooseUrl()
?.notEmpty()
?.let { return urlToSpan(options, code, it) }
?.let { return urlToSpan(options, code, it, initialAspect = aspect) }
// ストリーミングからきた絵文字などの場合は情報がない
val accessInfo = options.linkHelper as? SavedAccount

View File

@ -381,7 +381,12 @@ private fun ColumnViewHolder.showReactions(
val invalidator = NetworkEmojiInvalidator(actMain.handler, btn)
invalidator.text = SpannableStringBuilder("${reaction.name} ${reaction.count}").also { sb ->
sb.setSpan(
NetworkEmojiSpan(url, scale = 1.5f, sizeMode = options.emojiSizeMode),
NetworkEmojiSpan(
url,
scale = 1.5f,
sizeMode = options.emojiSizeMode,
initialAspect = reaction.aspect,
),
0,
reaction.name.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

View File

@ -84,7 +84,7 @@ class CustomEmoji(
val w = src.double("width")
val h = src.double("height")
val aspect = when {
w == null || h == null || w < 1f || h < 1f -> null
w == null || h == null || w < 1.0 || h < 1.0 -> null
else -> (w / h).toFloat()
}
return CustomEmoji(

View File

@ -21,6 +21,7 @@ class NetworkEmojiSpan constructor(
private val url: String,
sizeMode: EmojiSizeMode,
scale: Float = 1f,
private val initialAspect:Float? = null,
private val errorDrawableId: Int = R.drawable.outline_broken_image_24,
) : ReplacementSpan(), AnimatableSpan {
@ -71,7 +72,7 @@ class NetworkEmojiSpan constructor(
fm: Paint.FontMetricsInt?,
): Int {
emojiImageRect.updateRect(
url = url, aspectArg = null, paint.textSize, baseline = 0f
url = url, aspectArg = initialAspect, paint.textSize, baseline = 0f
)
val height = (emojiImageRect.emojiHeight + 0.5f).toInt()
if (fm != null) {

View File

@ -136,7 +136,7 @@ object EmojiDecoder {
}
}
fun addNetworkEmojiSpan(text: String, url: String) {
fun addNetworkEmojiSpan(text: String, url: String, initialAspect: Float?) {
closeNormalText()
val start = sb.length
sb.append(text)
@ -145,7 +145,8 @@ object EmojiDecoder {
NetworkEmojiSpan(
url,
scale = options.enlargeCustomEmoji,
sizeMode = options.emojiSizeMode
sizeMode = options.emojiSizeMode,
initialAspect = initialAspect,
),
start,
end,
@ -405,15 +406,7 @@ object EmojiDecoder {
return null
}
fun findCustomEmojiUrl(name: String): String? {
emojiMapCustom?.get(name)?.customEmojiToUrl()
?.let { return it }
return if (options.linkHelper?.isMisskey == true) {
findEmojiMisskey13(name = name)
} else {
null
}
}
splitShortCode(s, callback = object : ShortCodeSplitterCallback {
override fun onString(part: String) {
builder.addUnicodeString(part)
@ -426,15 +419,24 @@ object EmojiDecoder {
if (emojiProfile != null) {
val url = emojiProfile.url
if (url.isNotEmpty()) {
builder.addNetworkEmojiSpan(part, url)
builder.addNetworkEmojiSpan(part, url, initialAspect = null)
return
}
}
}
val url = findCustomEmojiUrl(name)
emojiMapCustom?.get(name)?.let {
val url = it.customEmojiToUrl()
builder.addNetworkEmojiSpan(part, url, initialAspect = it.aspect)
return
}
val url = if (options.linkHelper?.isMisskey == true) {
findEmojiMisskey13(name = name)
} else {
null
}
if (url != null) {
builder.addNetworkEmojiSpan(part, url)
builder.addNetworkEmojiSpan(part, url, initialAspect = null)
return
}