Filter event types from decrypted content

This commit is contained in:
Florian Renaud 2022-12-02 17:25:54 +01:00
parent 6e5461f300
commit 1a3ca7b1a0
2 changed files with 37 additions and 7 deletions

View File

@ -22,6 +22,7 @@ import io.realm.RealmQuery
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.Sort import io.realm.Sort
import io.realm.kotlin.where import io.realm.kotlin.where
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.room.timeline.TimelineEventFilters import org.matrix.android.sdk.api.session.room.timeline.TimelineEventFilters
import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntity
@ -94,14 +95,27 @@ internal fun RealmQuery<TimelineEventEntity>.filterEvents(filters: TimelineEvent
if (filters.filterTypes && filters.allowedTypes.isNotEmpty()) { if (filters.filterTypes && filters.allowedTypes.isNotEmpty()) {
beginGroup() beginGroup()
filters.allowedTypes.forEachIndexed { index, filter -> filters.allowedTypes.forEachIndexed { index, filter ->
if (filter.stateKey == null) { if (filter.eventType == EventType.ENCRYPTED) {
equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType) val otherTypes = filters.allowedTypes.minus(filter).map { it.eventType }
if (filter.stateKey == null) {
filterEncryptedTypes(otherTypes)
} else {
beginGroup()
filterEncryptedTypes(otherTypes)
and()
equalTo(TimelineEventEntityFields.ROOT.STATE_KEY, filter.stateKey)
endGroup()
}
} else { } else {
beginGroup() if (filter.stateKey == null) {
equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType) equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType)
and() } else {
equalTo(TimelineEventEntityFields.ROOT.STATE_KEY, filter.stateKey) beginGroup()
endGroup() equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType)
and()
equalTo(TimelineEventEntityFields.ROOT.STATE_KEY, filter.stateKey)
endGroup()
}
} }
if (index != filters.allowedTypes.size - 1) { if (index != filters.allowedTypes.size - 1) {
or() or()
@ -123,6 +137,21 @@ internal fun RealmQuery<TimelineEventEntity>.filterEvents(filters: TimelineEvent
return this return this
} }
internal fun RealmQuery<TimelineEventEntity>.filterEncryptedTypes(allowedTypes: List<String>): RealmQuery<TimelineEventEntity> {
beginGroup()
equalTo(TimelineEventEntityFields.ROOT.TYPE, EventType.ENCRYPTED)
and()
beginGroup()
isNull(TimelineEventEntityFields.ROOT.DECRYPTION_RESULT_JSON)
allowedTypes.forEach { eventType ->
or()
like(TimelineEventEntityFields.ROOT.DECRYPTION_RESULT_JSON, TimelineEventFilter.DecryptedContent.type(eventType))
}
endGroup()
endGroup()
return this
}
internal fun RealmQuery<TimelineEventEntity>.filterTypes(filterTypes: List<String>): RealmQuery<TimelineEventEntity> { internal fun RealmQuery<TimelineEventEntity>.filterTypes(filterTypes: List<String>): RealmQuery<TimelineEventEntity> {
return if (filterTypes.isEmpty()) { return if (filterTypes.isEmpty()) {
this this

View File

@ -34,6 +34,7 @@ internal object TimelineEventFilter {
*/ */
internal object DecryptedContent { internal object DecryptedContent {
internal const val URL = """{*"file":*"url":*}""" internal const val URL = """{*"file":*"url":*}"""
fun type(type: String) = """{*"type":*"$type"*}"""
} }
/** /**