From 4daef6018edd1571e869c0a6df2b562a914a85b1 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 21 Dec 2021 17:03:22 +0000 Subject: [PATCH 1/5] extracting the emoji text setting to an extension --- .../detail/timeline/item/MessageTextItem.kt | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt index e9563aa69c..1fb865949d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt @@ -92,29 +92,25 @@ abstract class MessageTextItem : AbsMessageItem() { it.bind(holder.messageView) } } - val textFuture = if (bindingOptions?.canUseTextFuture.orFalse()) { - PrecomputedTextCompat.getTextFuture( - message?.charSequence ?: "", - TextViewCompat.getTextMetricsParams(holder.messageView), - null) - } else { - null - } - markwonPlugins?.forEach { plugin -> plugin.beforeSetText(holder.messageView, message?.charSequence as Spanned) } super.bind(holder) holder.messageView.movementMethod = movementMethod renderSendState(holder.messageView, holder.messageView) holder.messageView.onClick(attributes.itemClickListener) holder.messageView.onLongClickIgnoringLinks(attributes.itemLongClickListener) - if (bindingOptions?.canUseTextFuture.orFalse()) { - holder.messageView.setTextFuture(textFuture) - } else { - holder.messageView.text = message?.charSequence - } + message?.let { holder.messageView.setTextWithEmojiSupport(it.charSequence, bindingOptions) } markwonPlugins?.forEach { plugin -> plugin.afterSetText(holder.messageView) } } + private fun AppCompatTextView.setTextWithEmojiSupport(message: CharSequence, bindingOptions: BindingOptions?) { + if (bindingOptions?.canUseTextFuture.orFalse()) { + val textFuture = PrecomputedTextCompat.getTextFuture(message, TextViewCompat.getTextMetricsParams(this), null) + setTextFuture(textFuture) + } else { + text = message + } + } + override fun unbind(holder: Holder) { super.unbind(holder) previewUrlViewUpdater.previewUrlView = null From 57e0ce2303e641df010893d7b87d4d7b8c471fee Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 21 Dec 2021 17:05:39 +0000 Subject: [PATCH 2/5] removing any existing text futures before setting new text - tentatively fixes IllegalArgumentException when recycling the text views due to AppCompatTextView.consumeTextFutureAndSetBlocking attempting to consuming any futures, even if they may be invalid --- .../features/home/room/detail/timeline/item/MessageTextItem.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt index 1fb865949d..28cfb68daf 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.detail.timeline.item -import android.text.Spanned import android.text.method.MovementMethod import androidx.appcompat.widget.AppCompatTextView import androidx.core.text.PrecomputedTextCompat From 0df07d0a1efceeb5c57c00f84ef8c43fc7e86730 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 21 Dec 2021 17:25:21 +0000 Subject: [PATCH 3/5] adding changelog entry --- changelog.d/4789.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/4789.bugfix diff --git a/changelog.d/4789.bugfix b/changelog.d/4789.bugfix new file mode 100644 index 0000000000..4612dd1ecd --- /dev/null +++ b/changelog.d/4789.bugfix @@ -0,0 +1 @@ +Fixing crashes when quickly scrolling or restoring the room timeline \ No newline at end of file From 6380ee9176a7778937626f369753a1b48b366748 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 5 Jan 2022 09:15:11 +0000 Subject: [PATCH 4/5] allowing nullable message content in order to reset the content when recycling and an item doesn't contain a message --- .../home/room/detail/timeline/item/MessageTextItem.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt index 28cfb68daf..4b8fd21df0 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt @@ -96,13 +96,12 @@ abstract class MessageTextItem : AbsMessageItem() { renderSendState(holder.messageView, holder.messageView) holder.messageView.onClick(attributes.itemClickListener) holder.messageView.onLongClickIgnoringLinks(attributes.itemLongClickListener) - - message?.let { holder.messageView.setTextWithEmojiSupport(it.charSequence, bindingOptions) } + holder.messageView.setTextWithEmojiSupport(message?.charSequence, bindingOptions) markwonPlugins?.forEach { plugin -> plugin.afterSetText(holder.messageView) } } - private fun AppCompatTextView.setTextWithEmojiSupport(message: CharSequence, bindingOptions: BindingOptions?) { - if (bindingOptions?.canUseTextFuture.orFalse()) { + private fun AppCompatTextView.setTextWithEmojiSupport(message: CharSequence?, bindingOptions: BindingOptions?) { + if (bindingOptions?.canUseTextFuture.orFalse() && message != null) { val textFuture = PrecomputedTextCompat.getTextFuture(message, TextViewCompat.getTextMetricsParams(this), null) setTextFuture(textFuture) } else { From 22bab47dad9072787326ae11a8587138df134c5f Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 6 Jan 2022 09:28:08 +0000 Subject: [PATCH 5/5] adding back the beforeSetText logic for markwon integraton and adding a nullable check to avoid attempt to cast a null to non null --- .../home/room/detail/timeline/item/MessageTextItem.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt index 4b8fd21df0..e499f090fb 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home.room.detail.timeline.item +import android.text.Spanned import android.text.method.MovementMethod import androidx.appcompat.widget.AppCompatTextView import androidx.core.text.PrecomputedTextCompat @@ -91,6 +92,9 @@ abstract class MessageTextItem : AbsMessageItem() { it.bind(holder.messageView) } } + message?.charSequence.let { charSequence -> + markwonPlugins?.forEach { plugin -> plugin.beforeSetText(holder.messageView, charSequence as Spanned) } + } super.bind(holder) holder.messageView.movementMethod = movementMethod renderSendState(holder.messageView, holder.messageView)