From 92d082c26abfe1b70ef91b3de45176a5d7e4041d Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Wed, 26 Jan 2022 14:07:07 +0200 Subject: [PATCH] Improve thread message deletion Fix thread summary after isLimited events --- .../android/sdk/api/session/events/model/Event.kt | 15 ++++++++------- .../database/helper/ThreadEventsHelper.kt | 8 ++++---- .../session/room/prune/RedactionEventProcessor.kt | 4 +++- .../room/timeline/TokenChunkEventPersistor.kt | 5 ++++- .../session/sync/handler/room/RoomSyncHandler.kt | 3 +-- .../helper/TimelineEventVisibilityHelper.kt | 11 +++++++++-- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt index 7c8739d821..57c083e757 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt @@ -200,16 +200,17 @@ data class Event( * It will return a decrypted text message or an empty string otherwise. */ fun getDecryptedTextSummary(): String? { + if (isRedacted()) return "Message Deleted" val text = getDecryptedValue() ?: return null return when { isReplyRenderedInThread() || isQuote() -> ContentUtils.extractUsefulTextFromReply(text) - isFileMessage() -> "sent a file." - isAudioMessage() -> "sent an audio file." - isImageMessage() -> "sent an image." - isVideoMessage() -> "sent a video." - isSticker() -> "sent a sticker" - isPoll() -> getPollQuestion() ?: "created a poll." - else -> text + isFileMessage() -> "sent a file." + isAudioMessage() -> "sent an audio file." + isImageMessage() -> "sent an image." + isVideoMessage() -> "sent a video." + isSticker() -> "sent a sticker" + isPoll() -> getPollQuestion() ?: "created a poll." + else -> text } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt index b54f6b3ecf..cb83094c73 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt @@ -41,10 +41,11 @@ private typealias ThreadSummary = Pair? internal fun Map.updateThreadSummaryIfNeeded( roomId: String, realm: Realm, currentUserId: String, + chunkEntity: ChunkEntity? = null, shouldUpdateNotifications: Boolean = true) { for ((rootThreadEventId, eventEntity) in this) { - eventEntity.threadSummaryInThread(eventEntity.realm, rootThreadEventId)?.let { threadSummary -> + eventEntity.threadSummaryInThread(eventEntity.realm, rootThreadEventId, chunkEntity)?.let { threadSummary -> val numberOfMessages = threadSummary.first val latestEventInThread = threadSummary.second @@ -103,7 +104,7 @@ internal fun EventEntity.markEventAsRoot( * @param rootThreadEventId The root eventId that will find the number of threads * @return A ThreadSummary containing the counted threads and the latest event message */ -internal fun EventEntity.threadSummaryInThread(realm: Realm, rootThreadEventId: String): ThreadSummary { +internal fun EventEntity.threadSummaryInThread(realm: Realm, rootThreadEventId: String, chunkEntity: ChunkEntity?): ThreadSummary { // Number of messages val messages = TimelineEventEntity @@ -115,7 +116,7 @@ internal fun EventEntity.threadSummaryInThread(realm: Realm, rootThreadEventId: if (messages <= 0) return null // Find latest thread event, we know it exists - var chunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomId) ?: return null + var chunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomId) ?: chunkEntity ?: return null var result: TimelineEventEntity? = null // Iterate the chunk until we find our latest event @@ -125,7 +126,6 @@ internal fun EventEntity.threadSummaryInThread(realm: Realm, rootThreadEventId: } chunk = ChunkEntity.find(realm, roomId, nextToken = chunk.prevToken) ?: break } - result ?: return null return ThreadSummary(messages, result) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/prune/RedactionEventProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/prune/RedactionEventProcessor.kt index ac06d674d0..108f159e1f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/prune/RedactionEventProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/prune/RedactionEventProcessor.kt @@ -84,7 +84,9 @@ internal class RedactionEventProcessor @Inject constructor() : EventInsertLivePr // } val modified = unsignedData.copy(redactedEvent = redactionEvent) - eventToPrune.content = ContentMapper.map(emptyMap()) + // I Commented the line below, it should not be empty while we lose all the previous info about + // the redacted event +// eventToPrune.content = ContentMapper.map(emptyMap()) eventToPrune.unsignedData = MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(modified) eventToPrune.decryptionResultJson = null eventToPrune.decryptionErrorCode = null diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt index 387085724c..e43f3fd240 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt @@ -200,7 +200,10 @@ internal class TokenChunkEventPersistor @Inject constructor( } if (lightweightSettingsStorage.areThreadMessagesEnabled()) { - optimizedThreadSummaryMap.updateThreadSummaryIfNeeded(roomId = roomId, realm = realm, currentUserId = userId) + optimizedThreadSummaryMap.updateThreadSummaryIfNeeded( + roomId = roomId, + realm = realm, + currentUserId = userId) } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index f4f8cc01c6..640fe53727 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -416,7 +416,6 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle optimizedThreadSummaryMap[eventEntity.eventId] = eventEntity } } - // Give info to crypto module cryptoService.onLiveEvent(roomEntity.roomId, event) @@ -443,11 +442,11 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } // Handle deletion of [stuck] local echos if needed deleteLocalEchosIfNeeded(insertType, roomEntity, eventList) - if (lightweightSettingsStorage.areThreadMessagesEnabled()) { optimizedThreadSummaryMap.updateThreadSummaryIfNeeded( roomId = roomId, realm = realm, + chunkEntity = chunkEntity, currentUserId = userId) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventVisibilityHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventVisibilityHelper.kt index 2cde1e0ef8..561f36ce41 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventVisibilityHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventVisibilityHelper.kt @@ -146,10 +146,17 @@ class TimelineEventVisibilityHelper @Inject constructor(private val userPreferen // We should not display deleted thread messages within the normal timeline if (root.isRedacted() && userPreferencesProvider.areThreadMessagesEnabled() && - root.threadDetails?.isThread == true){ + !isFromThreadTimeline && + (root.isThread() || root.threadDetails?.isThread == true)){ + return true + } + if (root.isRedacted() && + !userPreferencesProvider.shouldShowRedactedMessages() && + userPreferencesProvider.areThreadMessagesEnabled() && + isFromThreadTimeline && + root.isThread()){ return true } - if (root.getRelationContent()?.type == RelationType.REPLACE) { return true