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.
61 lines
1.9 KiB
61 lines
1.9 KiB
4 years ago
|
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
|
||
|
}
|
||
|
}
|
||
|
|