From d7c486c55e4312295208bbd4b5371b3b0a0299ac Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Mon, 14 Mar 2022 16:04:08 +0100 Subject: [PATCH] Add fallback support rendering proposed in MSC3676 --- .../session/room/model/relation/RelationContent.kt | 4 ++-- .../session/room/send/LocalEchoEventFactory.kt | 4 ++++ .../sync/handler/room/ThreadsAwarenessHandler.kt | 12 +++++++++++- .../features/home/room/detail/TimelineViewModel.kt | 5 ++++- vector/src/main/res/layout/item_search_result.xml | 3 ++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationContent.kt index 3ba453b7c4..53b1fea873 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationContent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationContent.kt @@ -26,8 +26,8 @@ interface RelationContent { val option: Int? /** - * This flag indicates that the message should be displayed in the main - * timeline as a reply if needed + * This flag indicates that the message should be rendered as a reply + * fallback, when isFallingBack = false */ val isFallingBack: Boolean? } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index d53c375cbf..3c23cd1869 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -355,6 +355,7 @@ internal class LocalEchoEventFactory @Inject constructor( RelationDefaultContent( type = RelationType.THREAD, eventId = it, + isFallingBack = true, inReplyTo = ReplyToContent(eventId = localEchoRepository.getLatestThreadEvent(it)) ) } @@ -398,6 +399,7 @@ internal class LocalEchoEventFactory @Inject constructor( RelationDefaultContent( type = RelationType.THREAD, eventId = it, + isFallingBack = true, inReplyTo = ReplyToContent(eventId = localEchoRepository.getLatestThreadEvent(it)) ) } @@ -428,6 +430,7 @@ internal class LocalEchoEventFactory @Inject constructor( RelationDefaultContent( type = RelationType.THREAD, eventId = it, + isFallingBack = true, inReplyTo = ReplyToContent(eventId = localEchoRepository.getLatestThreadEvent(it)) ) } @@ -448,6 +451,7 @@ internal class LocalEchoEventFactory @Inject constructor( RelationDefaultContent( type = RelationType.THREAD, eventId = it, + isFallingBack = true, inReplyTo = ReplyToContent(eventId = localEchoRepository.getLatestThreadEvent(it)) ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt index dc0cc52a72..db9799d51e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ThreadsAwarenessHandler.kt @@ -162,7 +162,7 @@ internal class ThreadsAwarenessHandler @Inject constructor( eventEntity: EventEntity? = null): String? { event ?: return null roomId ?: return null - if (lightweightSettingsStorage.areThreadMessagesEnabled()) return null + if (lightweightSettingsStorage.areThreadMessagesEnabled() && !isReplyEvent(event)) return null handleRootThreadEventsIfNeeded(realm, roomId, eventEntity, event) if (!isThreadEvent(event)) return null val eventPayload = if (!event.isEncrypted()) { @@ -387,6 +387,16 @@ internal class ThreadsAwarenessHandler @Inject constructor( private fun getPreviousEventOrRoot(event: Event): String? = event.content.toModel()?.relatesTo?.inReplyTo?.eventId + /** + * Returns if we should html inject the current event. + */ + private fun isReplyEvent(event: Event): Boolean { + return isThreadEvent(event) && !isFallingBack(event) && getPreviousEventOrRoot(event) != null + } + + private fun isFallingBack(event: Event): Boolean = + event.content.toModel()?.relatesTo?.isFallingBack == true + @Suppress("UNCHECKED_CAST") private fun getValueFromPayload(payload: JsonDict?, key: String): String? { val content = payload?.get("content") as? JsonDict diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt index b93f62eed6..a9235b5699 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt @@ -506,7 +506,10 @@ class TimelineViewModel @AssistedInject constructor( private fun handleSendSticker(action: RoomDetailAction.SendSticker) { val content = initialState.rootThreadEventId?.let { - action.stickerContent.copy(relatesTo = RelationDefaultContent(RelationType.THREAD, it)) + action.stickerContent.copy(relatesTo = RelationDefaultContent( + type = RelationType.THREAD, + isFallingBack = true, + eventId = it)) } ?: action.stickerContent room.sendEvent(EventType.STICKER, content.toContent()) diff --git a/vector/src/main/res/layout/item_search_result.xml b/vector/src/main/res/layout/item_search_result.xml index 3f5ef0c973..0376ad1110 100644 --- a/vector/src/main/res/layout/item_search_result.xml +++ b/vector/src/main/res/layout/item_search_result.xml @@ -40,7 +40,8 @@ android:id="@+id/additionalTopSpace" android:layout_height="12dp" android:layout_width="0dp" - android:layout_toEndOf="@id/messageStartGuideline" /> + android:layout_toEndOf="@id/messageStartGuideline" + tools:ignore="MissingConstraints" />