parent
05ddc762c7
commit
5e9e626012
@ -0,0 +1,60 @@ |
|||||||
|
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 |
||||||
|
} |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue