diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt index 23862ae963..3852dd50b8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt @@ -168,25 +168,31 @@ internal class DefaultRelationService @AssistedInject constructor( msgType: String, autoMarkdown: Boolean, formattedText: String?, - eventReplied: TimelineEvent?): Cancelable { - val event = eventReplied?.let { + eventReplied: TimelineEvent?): Cancelable? { + + val event = if (eventReplied != null) { eventFactory.createReplyTextEvent( roomId = roomId, eventReplied = eventReplied, replyText = replyInThreadText, autoMarkdown = autoMarkdown, rootThreadEventId = rootThreadEventId) - } ?: eventFactory.createThreadTextEvent( - rootThreadEventId = rootThreadEventId, - roomId = roomId, - text = replyInThreadText.toString(), - msgType = msgType, - autoMarkdown = autoMarkdown, - formattedText = formattedText) -// .also { -// saveLocalEcho(it) -// } - return eventSenderProcessor.postEvent(event, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + ?.also { + saveLocalEcho(it) + } ?: return null + } else { + eventFactory.createThreadTextEvent( + rootThreadEventId = rootThreadEventId, + roomId = roomId, + text = replyInThreadText.toString(), + msgType = msgType, + autoMarkdown = autoMarkdown, + formattedText = formattedText) + .also { + saveLocalEcho(it) + } + } + return eventSenderProcessor.postEvent(event, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index 4d417fddbb..fe121090a0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -448,7 +448,11 @@ internal class DefaultTimeline( */ private fun handleUpdates(results: RealmResults, changeSet: OrderedCollectionChangeSet) { // If changeSet has deletion we are having a gap, so we clear everything - if (changeSet.deletionRanges.isNotEmpty()) { + // I observed there is a problem with this implementation in the threads timeline upon receiving + // a local echo, after adding && !isFromThreadTimeline below fixed the issue. + // Maybe there is a deeper problem here even on the main timeline + + if (changeSet.deletionRanges.isNotEmpty() && !isFromThreadTimeline) { clearAllValues() } var postSnapshot = false