You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.9 KiB
60 lines
1.9 KiB
package com.keylesspalace.tusky.view
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.content.Context
|
|
import android.os.Build
|
|
import android.text.Layout
|
|
import android.text.Spannable
|
|
import android.util.AttributeSet
|
|
import android.util.Log
|
|
import androidx.emoji.widget.EmojiAppCompatTextView
|
|
import com.keylesspalace.tusky.R
|
|
import com.keylesspalace.tusky.entity.Emoji
|
|
import com.keylesspalace.tusky.util.EmojiSpan
|
|
import com.keylesspalace.tusky.util.LinkHelper
|
|
import com.keylesspalace.tusky.util.emojify
|
|
|
|
/*
|
|
* This is a TextView that changes break strategy to simple
|
|
* if there is too much custom emojis
|
|
*
|
|
* Fixes Android performance bug
|
|
*/
|
|
|
|
class CustomEmojiTextView
|
|
@JvmOverloads constructor(context:Context,
|
|
attrs: AttributeSet? = null,
|
|
defStyleAttr: Int = 0
|
|
): EmojiAppCompatTextView(context, attrs, defStyleAttr) {
|
|
private var oldBreakStrategy = 1 // Layout.BREAK_STRATEGY_HIGH_QUALITY
|
|
|
|
@SuppressLint("WrongConstant")
|
|
override fun setText(text: CharSequence?, type: BufferType?) {
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
var overridden = false
|
|
|
|
// don't change if break strategy already simple
|
|
if(text is Spannable && breakStrategy != Layout.BREAK_STRATEGY_SIMPLE) {
|
|
val spans = text.getSpans(0, text.length, EmojiSpan::class.java)
|
|
|
|
if (spans.size >= SPAN_LIMIT) {
|
|
oldBreakStrategy = breakStrategy
|
|
breakStrategy = Layout.BREAK_STRATEGY_SIMPLE
|
|
overridden = true
|
|
|
|
Log.d("CustomEmojiTextView", "break strategy overriden!");
|
|
}
|
|
}
|
|
|
|
if(!overridden)
|
|
breakStrategy = oldBreakStrategy
|
|
}
|
|
|
|
super.setText(text, type)
|
|
}
|
|
|
|
companion object {
|
|
const val SPAN_LIMIT = 100 // heuristics
|
|
}
|
|
}
|
|
|
|
|