From 82791913390d1913fdf7873edf0ed21c13d3b402 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 21 Sep 2020 14:57:58 +0200 Subject: [PATCH 1/3] Fix filtering of redacted events --- .../session/room/timeline/DefaultTimeline.kt | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) 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 2dead1d9cc..7fa180c0b0 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 @@ -333,11 +333,19 @@ internal class DefaultTimeline( // Private methods ***************************************************************************** - private fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent): Boolean { + private fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean { return builtEventsIdMap[eventId]?.let { builtIndex -> // Update the relation of existing event builtEvents[builtIndex]?.let { te -> - builtEvents[builtIndex] = builder(te) + val rebuiltEvent = builder(te) + // If rebuilt event is filtered its returned as null and should be removed. + if (rebuiltEvent == null) { + builtEventsIdMap.remove(eventId) + builtEventsIdMap.entries.filter { it.value > builtIndex }.forEach { it.setValue(it.value - 1) } + builtEvents.removeAt(builtIndex) + } else { + builtEvents[builtIndex] = builder(te) + } true } } ?: false @@ -413,14 +421,14 @@ internal class DefaultTimeline( private fun getState(direction: Timeline.Direction): State { return when (direction) { - Timeline.Direction.FORWARDS -> forwardsState.get() + Timeline.Direction.FORWARDS -> forwardsState.get() Timeline.Direction.BACKWARDS -> backwardsState.get() } } private fun updateState(direction: Timeline.Direction, update: (State) -> State) { val stateReference = when (direction) { - Timeline.Direction.FORWARDS -> forwardsState + Timeline.Direction.FORWARDS -> forwardsState Timeline.Direction.BACKWARDS -> backwardsState } val currentValue = stateReference.get() @@ -489,7 +497,8 @@ internal class DefaultTimeline( val eventEntity = results[index] eventEntity?.eventId?.let { eventId -> postSnapshot = rebuildEvent(eventId) { - buildTimelineEvent(eventEntity) + val builtEvent = buildTimelineEvent(eventEntity) + listOf(builtEvent).filterEventsWithSettings().firstOrNull() } || postSnapshot } } @@ -730,10 +739,10 @@ internal class DefaultTimeline( return object : MatrixCallback { override fun onSuccess(data: TokenChunkEventPersistor.Result) { when (data) { - TokenChunkEventPersistor.Result.SUCCESS -> { + TokenChunkEventPersistor.Result.SUCCESS -> { Timber.v("Success fetching $limit items $direction from pagination request") } - TokenChunkEventPersistor.Result.REACHED_END -> { + TokenChunkEventPersistor.Result.REACHED_END -> { postSnapshot() } TokenChunkEventPersistor.Result.SHOULD_FETCH_MORE -> @@ -775,8 +784,7 @@ internal class DefaultTimeline( } if (!filterEdits) return@filter false - val filterRedacted = !settings.filters.filterRedacted || it.root.isRedacted() - + val filterRedacted = !settings.filters.filterRedacted || it.root.isRedacted().not() filterRedacted } } From 03b3b82e0a6a64aaaf339983d98eb0a60e034dd1 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 21 Sep 2020 15:00:53 +0200 Subject: [PATCH 2/3] Update CHANGES --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 4058dcda6b..623f2eab1b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,7 @@ Bugfix 🐛: - Long message cannot be sent/takes infinite time & blocks other messages #1397 - User Verification in DM not working - Manual import of Megolm keys does back up the imported keys + - Auto scrolling to the latest message when sending (#2094) Translations 🗣: - From a29ca2ae0980e7017d474ad3030332a4aabc0991 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 21 Sep 2020 20:25:16 +0200 Subject: [PATCH 3/3] Clean after Benoit's review --- .../session/room/timeline/DefaultTimeline.kt | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) 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 7fa180c0b0..3189b0702e 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 @@ -29,6 +29,7 @@ import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.extensions.tryThis import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.RelationType import org.matrix.android.sdk.api.session.events.model.toModel @@ -334,19 +335,21 @@ internal class DefaultTimeline( // Private methods ***************************************************************************** private fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean { - return builtEventsIdMap[eventId]?.let { builtIndex -> - // Update the relation of existing event - builtEvents[builtIndex]?.let { te -> - val rebuiltEvent = builder(te) - // If rebuilt event is filtered its returned as null and should be removed. - if (rebuiltEvent == null) { - builtEventsIdMap.remove(eventId) - builtEventsIdMap.entries.filter { it.value > builtIndex }.forEach { it.setValue(it.value - 1) } - builtEvents.removeAt(builtIndex) - } else { - builtEvents[builtIndex] = builder(te) + return tryThis { + builtEventsIdMap[eventId]?.let { builtIndex -> + // Update the relation of existing event + builtEvents[builtIndex]?.let { te -> + val rebuiltEvent = builder(te) + // If rebuilt event is filtered its returned as null and should be removed. + if (rebuiltEvent == null) { + builtEventsIdMap.remove(eventId) + builtEventsIdMap.entries.filter { it.value > builtIndex }.forEach { it.setValue(it.value - 1) } + builtEvents.removeAt(builtIndex) + } else { + builtEvents[builtIndex] = rebuiltEvent + } + true } - true } } ?: false } @@ -784,8 +787,8 @@ internal class DefaultTimeline( } if (!filterEdits) return@filter false - val filterRedacted = !settings.filters.filterRedacted || it.root.isRedacted().not() - filterRedacted + val filterRedacted = settings.filters.filterRedacted && it.root.isRedacted() + !filterRedacted } }