Filter event types from decrypted content
This commit is contained in:
parent
6e5461f300
commit
1a3ca7b1a0
@ -22,6 +22,7 @@ import io.realm.RealmQuery
|
||||
import io.realm.RealmResults
|
||||
import io.realm.Sort
|
||||
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.timeline.TimelineEventFilters
|
||||
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()) {
|
||||
beginGroup()
|
||||
filters.allowedTypes.forEachIndexed { index, filter ->
|
||||
if (filter.stateKey == null) {
|
||||
equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType)
|
||||
if (filter.eventType == EventType.ENCRYPTED) {
|
||||
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 {
|
||||
beginGroup()
|
||||
equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType)
|
||||
and()
|
||||
equalTo(TimelineEventEntityFields.ROOT.STATE_KEY, filter.stateKey)
|
||||
endGroup()
|
||||
if (filter.stateKey == null) {
|
||||
equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType)
|
||||
} else {
|
||||
beginGroup()
|
||||
equalTo(TimelineEventEntityFields.ROOT.TYPE, filter.eventType)
|
||||
and()
|
||||
equalTo(TimelineEventEntityFields.ROOT.STATE_KEY, filter.stateKey)
|
||||
endGroup()
|
||||
}
|
||||
}
|
||||
if (index != filters.allowedTypes.size - 1) {
|
||||
or()
|
||||
@ -123,6 +137,21 @@ internal fun RealmQuery<TimelineEventEntity>.filterEvents(filters: TimelineEvent
|
||||
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> {
|
||||
return if (filterTypes.isEmpty()) {
|
||||
this
|
||||
|
@ -34,6 +34,7 @@ internal object TimelineEventFilter {
|
||||
*/
|
||||
internal object DecryptedContent {
|
||||
internal const val URL = """{*"file":*"url":*}"""
|
||||
fun type(type: String) = """{*"type":*"$type"*}"""
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user