From 0059fdf174efa0f9ceced3fb7ec30ef1c7d4277c Mon Sep 17 00:00:00 2001
From: aqulu <dev@aqu.lu>
Date: Sun, 20 Dec 2020 13:55:32 +0900
Subject: [PATCH 1/4] Release VectorBaseBottomSheetDialogFragment bindings when
 view destroyed

Signed-off-by: aqulu <dev@aqu.lu>
---
 .../app/core/platform/VectorBaseBottomSheetDialogFragment.kt     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseBottomSheetDialogFragment.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseBottomSheetDialogFragment.kt
index 95d42ecc30..d6d4d07500 100644
--- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseBottomSheetDialogFragment.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseBottomSheetDialogFragment.kt
@@ -114,6 +114,7 @@ abstract class VectorBaseBottomSheetDialogFragment<VB: ViewBinding> : BottomShee
     @CallSuper
     override fun onDestroyView() {
         uiDisposables.clear()
+        _binding = null
         super.onDestroyView()
     }
 

From 9fcf7263b567ae9b7489d33bbb5e021c2087789e Mon Sep 17 00:00:00 2001
From: SpiritCroc <dev@spiritcroc.de>
Date: Sat, 19 Dec 2020 19:51:56 +0100
Subject: [PATCH 2/4] Properly hide preview URLs for messages that don't
 support previews

Notices and formatted messages don't have imageContentRenderer and
previewUrlRetriever set.
Accordingly, when recycling messages that previously had an URL preview,
we do not want to keep that preview, but actually hide it, instead of
returning early (without rendering any update).
---
 CHANGES.md                                         |  2 +-
 .../room/detail/timeline/item/MessageTextItem.kt   | 14 ++++++++++++--
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 0fb7d72c13..f5ee541793 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -8,7 +8,7 @@ Improvements 🙌:
  -
 
 Bugfix 🐛:
- -
+ - Url previews sometimes attached to wrong message (#2561)
 
 Translations 🗣:
  -
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 66d9808d2b..659a3d5460 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
@@ -19,6 +19,7 @@ package im.vector.app.features.home.room.detail.timeline.item
 import android.text.method.MovementMethod
 import androidx.appcompat.widget.AppCompatTextView
 import androidx.core.text.PrecomputedTextCompat
+import androidx.core.view.isVisible
 import androidx.core.widget.TextViewCompat
 import com.airbnb.epoxy.EpoxyAttribute
 import com.airbnb.epoxy.EpoxyModelClass
@@ -60,7 +61,12 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
         // Preview URL
         previewUrlViewUpdater.previewUrlView = holder.previewUrlView
         previewUrlViewUpdater.imageContentRenderer = imageContentRenderer
-        previewUrlRetriever?.addListener(attributes.informationData.eventId, previewUrlViewUpdater)
+        val safePreviewUrlRetriever = previewUrlRetriever
+        if (safePreviewUrlRetriever == null) {
+            holder.previewUrlView.isVisible = false
+        } else {
+            safePreviewUrlRetriever.addListener(attributes.informationData.eventId, previewUrlViewUpdater)
+        }
         holder.previewUrlView.delegate = previewUrlCallback
 
         if (useBigFont) {
@@ -106,7 +112,11 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
         var imageContentRenderer: ImageContentRenderer? = null
 
         override fun onStateUpdated(state: PreviewUrlUiState) {
-            val safeImageContentRenderer = imageContentRenderer ?: return
+            val safeImageContentRenderer = imageContentRenderer
+            if (safeImageContentRenderer == null) {
+                previewUrlView?.isVisible = false
+                return
+            }
             previewUrlView?.render(state, safeImageContentRenderer)
         }
     }

From d5e76c515e727b1d4a80e1330935f96aabc378cd Mon Sep 17 00:00:00 2001
From: SpiritCroc <dev@spiritcroc.de>
Date: Sat, 19 Dec 2020 19:57:49 +0100
Subject: [PATCH 3/4] Enable URL-previews for notices

Desktop has those too.
---
 CHANGES.md                                                    | 2 +-
 .../android/sdk/internal/session/media/UrlsExtractor.kt       | 4 +++-
 .../home/room/detail/timeline/factory/MessageItemFactory.kt   | 3 +++
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 0fb7d72c13..d1d2712a12 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -2,7 +2,7 @@ Changes in Element 1.0.14 (2020-XX-XX)
 ===================================================
 
 Features ✨:
- -
+ - Enable url previews for notices (#2562)
 
 Improvements 🙌:
  -
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt
index 9d374c3428..87b9ab349f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt
@@ -32,7 +32,9 @@ internal class UrlsExtractor @Inject constructor() {
         return event.takeIf { it.getClearType() == EventType.MESSAGE }
                 ?.getClearContent()
                 ?.toModel<MessageContent>()
-                ?.takeIf { it.msgType == MessageType.MSGTYPE_TEXT || it.msgType == MessageType.MSGTYPE_EMOTE }
+                ?.takeIf { it.msgType == MessageType.MSGTYPE_TEXT ||
+                        it.msgType == MessageType.MSGTYPE_NOTICE ||
+                        it.msgType == MessageType.MSGTYPE_EMOTE }
                 ?.body
                 ?.let { urlRegex.findAll(it) }
                 ?.map { it.value }
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
index 27696f5b28..a1e041b98f 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
@@ -512,6 +512,9 @@ class MessageItemFactory @Inject constructor(
 
         return MessageTextItem_()
                 .leftGuideline(avatarSizeProvider.leftGuideline)
+                .previewUrlRetriever(callback?.getPreviewUrlRetriever())
+                .imageContentRenderer(imageContentRenderer)
+                .previewUrlCallback(callback)
                 .attributes(attributes)
                 .message(message)
                 .highlighted(highlight)

From 9da3eec64f4b59a10d8f8501e70ee0a40afeac6f Mon Sep 17 00:00:00 2001
From: Benoit Marty <benoit@matrix.org>
Date: Sun, 20 Dec 2020 20:28:40 +0100
Subject: [PATCH 4/4] Fix small formatting issue

---
 .../android/sdk/internal/session/media/UrlsExtractor.kt   | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt
index 87b9ab349f..e531d6af9f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/UrlsExtractor.kt
@@ -32,9 +32,11 @@ internal class UrlsExtractor @Inject constructor() {
         return event.takeIf { it.getClearType() == EventType.MESSAGE }
                 ?.getClearContent()
                 ?.toModel<MessageContent>()
-                ?.takeIf { it.msgType == MessageType.MSGTYPE_TEXT ||
-                        it.msgType == MessageType.MSGTYPE_NOTICE ||
-                        it.msgType == MessageType.MSGTYPE_EMOTE }
+                ?.takeIf {
+                    it.msgType == MessageType.MSGTYPE_TEXT
+                            || it.msgType == MessageType.MSGTYPE_NOTICE
+                            || it.msgType == MessageType.MSGTYPE_EMOTE
+                }
                 ?.body
                 ?.let { urlRegex.findAll(it) }
                 ?.map { it.value }