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.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
|
||||||
|
@ -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"*}"""
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user