diff --git a/app/src/main/java/com/keylesspalace/tusky/view/CustomEmojiTextView.kt b/app/src/main/java/com/keylesspalace/tusky/view/CustomEmojiTextView.kt new file mode 100644 index 00000000..d3a85153 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/view/CustomEmojiTextView.kt @@ -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 + } +} + diff --git a/app/src/main/res/layout/item_chat.xml b/app/src/main/res/layout/item_chat.xml index 694ad1f9..629b5171 100644 --- a/app/src/main/res/layout/item_chat.xml +++ b/app/src/main/res/layout/item_chat.xml @@ -87,13 +87,14 @@ app:layout_constraintBaseline_toBaselineOf="@id/status_display_name" tools:text="13:37" /> - - - - - - - - - - - - -