NetworkEmojiSpanにもinitialAspectを供給する
This commit is contained in:
parent
900502fe66
commit
dddbf95dac
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue