don't load custom emojis in their full size (#4429)
This should save quite some memory, but most importantly it gets rid of
this crash:
```
java.lang.RuntimeException: Canvas: trying to draw too large(121969936bytes) bitmap.
at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:266)
at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:94)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:549)
at com.keylesspalace.tusky.util.EmojiSpan.draw(CustomEmojiHelper.kt:131)
...
```
This commit is contained in:
parent
3736034952
commit
4dec228926
6 changed files with 28 additions and 14 deletions
|
|
@ -24,10 +24,12 @@ import android.graphics.drawable.Drawable
|
|||
import android.text.SpannableStringBuilder
|
||||
import android.text.style.ReplacementSpan
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.request.target.CustomTarget
|
||||
import com.bumptech.glide.request.target.Target
|
||||
import com.bumptech.glide.request.transition.Transition
|
||||
import com.keylesspalace.tusky.R
|
||||
import com.keylesspalace.tusky.entity.Emoji
|
||||
import java.lang.ref.WeakReference
|
||||
import java.util.regex.Pattern
|
||||
|
|
@ -51,7 +53,7 @@ fun CharSequence.emojify(emojis: List<Emoji>, view: View, animate: Boolean): Cha
|
|||
.matcher(this)
|
||||
|
||||
while (matcher.find()) {
|
||||
val span = EmojiSpan(WeakReference(view))
|
||||
val span = EmojiSpan(view)
|
||||
|
||||
builder.setSpan(span, matcher.start(), matcher.end(), 0)
|
||||
Glide.with(view)
|
||||
|
|
@ -69,7 +71,19 @@ fun CharSequence.emojify(emojis: List<Emoji>, view: View, animate: Boolean): Cha
|
|||
return builder
|
||||
}
|
||||
|
||||
class EmojiSpan(val viewWeakReference: WeakReference<View>) : ReplacementSpan() {
|
||||
class EmojiSpan(view: View) : ReplacementSpan() {
|
||||
|
||||
private val viewWeakReference = WeakReference(view)
|
||||
|
||||
private val emojiSize: Int = if (view is TextView) {
|
||||
view.paint.textSize
|
||||
} else {
|
||||
// sometimes it is not possible to determine the TextView the emoji will be shown in,
|
||||
// e.g. because it is passed to a library, so we fallback to a size that should be large
|
||||
// enough in most cases
|
||||
view.context.resources.getDimension(R.dimen.fallback_emoji_size)
|
||||
}.times(1.2).toInt()
|
||||
|
||||
var imageDrawable: Drawable? = null
|
||||
|
||||
override fun getSize(
|
||||
|
|
@ -89,7 +103,7 @@ class EmojiSpan(val viewWeakReference: WeakReference<View>) : ReplacementSpan()
|
|||
fm.bottom = metrics.bottom
|
||||
}
|
||||
|
||||
return (paint.textSize * 1.2).toInt()
|
||||
return emojiSize
|
||||
}
|
||||
|
||||
override fun draw(
|
||||
|
|
@ -134,7 +148,7 @@ class EmojiSpan(val viewWeakReference: WeakReference<View>) : ReplacementSpan()
|
|||
}
|
||||
|
||||
fun getTarget(animate: Boolean): Target<Drawable> {
|
||||
return object : CustomTarget<Drawable>() {
|
||||
return object : CustomTarget<Drawable>(emojiSize, emojiSize) {
|
||||
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
|
||||
viewWeakReference.get()?.let { view ->
|
||||
if (animate && resource is Animatable) {
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@ import com.keylesspalace.tusky.R
|
|||
import com.keylesspalace.tusky.entity.HashTag
|
||||
import com.keylesspalace.tusky.entity.Status.Mention
|
||||
import com.keylesspalace.tusky.interfaces.LinkListener
|
||||
import java.lang.ref.WeakReference
|
||||
import java.net.URI
|
||||
import java.net.URISyntaxException
|
||||
|
||||
|
|
@ -128,7 +127,7 @@ fun markupHiddenUrls(view: TextView, content: CharSequence): SpannableStringBuil
|
|||
|
||||
val linkDrawable = AppCompatResources.getDrawable(view.context, R.drawable.ic_link)!!
|
||||
// ImageSpan does not always align the icon correctly in the line, let's use our custom emoji span for this
|
||||
val linkDrawableSpan = EmojiSpan(WeakReference(view))
|
||||
val linkDrawableSpan = EmojiSpan(view)
|
||||
linkDrawableSpan.imageDrawable = linkDrawable
|
||||
|
||||
val placeholderIndex = replacementText.indexOf("🔗")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue