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 0dc0d33d38..86b0497bd0 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 @@ -784,19 +784,20 @@ internal class DefaultTimeline( } private fun List.filterEventsWithSettings(): List { - return filter { - val filterType = !settings.filters.filterTypes || settings.filters.allowedTypes.map { it.eventType }.contains(it.root.type) + return filter { event -> + val filterType = !settings.filters.filterTypes + || settings.filters.allowedTypes.any { it.eventType == event.root.type && (it.stateKey == null || it.stateKey == event.root.senderId) } if (!filterType) return@filter false - val filterEdits = if (settings.filters.filterEdits && it.root.getClearType() == EventType.MESSAGE) { - val messageContent = it.root.getClearContent().toModel() + val filterEdits = if (settings.filters.filterEdits && event.root.getClearType() == EventType.MESSAGE) { + val messageContent = event.root.getClearContent().toModel() messageContent?.relatesTo?.type != RelationType.REPLACE && messageContent?.relatesTo?.type != RelationType.RESPONSE } else { true } if (!filterEdits) return@filter false - val filterRedacted = settings.filters.filterRedacted && it.root.isRedacted() + val filterRedacted = settings.filters.filterRedacted && event.root.isRedacted() !filterRedacted } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt index 6fe6013108..fa517bebf2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt @@ -151,8 +151,25 @@ internal class TimelineHiddenReadReceipts constructor(private val readReceiptsSu beginGroup() var needOr = false if (settings.filters.filterTypes) { - val allowedTypes = settings.filters.allowedTypes.map { it.eventType }.toTypedArray() - not().`in`("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.TYPE}", allowedTypes) + beginGroup() + // Events: A, B, C, D, (E and S1), F, G, (H and S1), I + // Allowed: A, B, C, (E and S1), G, (H and S2) + // Result: D, F, H, I + settings.filters.allowedTypes.forEachIndexed { index, filter -> + if (filter.stateKey == null) { + notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.TYPE}", filter.eventType) + } else { + beginGroup() + notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.TYPE}", filter.eventType) + or() + notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.STATE_KEY}", filter.stateKey) + endGroup() + } + if (index != settings.filters.allowedTypes.size - 1) { + and() + } + } + endGroup() needOr = true } if (settings.filters.filterUseless) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineSettingsFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineSettingsFactory.kt index ff396646c0..1983b05ed3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineSettingsFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineSettingsFactory.kt @@ -40,7 +40,7 @@ class TimelineSettingsFactory @Inject constructor( filterTypes = false), buildReadReceipts = userPreferencesProvider.shouldShowReadReceipts()) } else { - val allowedTypes = TimelineDisplayableEvents.DISPLAYABLE_TYPES.filterDisplayableTypes() + val allowedTypes = TimelineDisplayableEvents.DISPLAYABLE_TYPES.createAllowedEventTypeFilters() TimelineSettings( initialSize = 30, filters = TimelineEventFilters( @@ -53,7 +53,7 @@ class TimelineSettingsFactory @Inject constructor( } } - private fun List.filterDisplayableTypes(): List { + private fun List.createAllowedEventTypeFilters(): List { return map { EventTypeFilter( eventType = it,