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

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
}
}