mirror of
https://github.com/element-hq/element-android
synced 2024-11-27 20:06:51 +03:00
Avoid duplicated events in DB (one with localId and one with eventId from homeserver, once synced)
This commit is contained in:
parent
cf3dbb378e
commit
6f804cab4d
4 changed files with 15 additions and 3 deletions
|
@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.database.helper
|
||||||
|
|
||||||
import im.vector.matrix.android.internal.database.model.TimelineEventEntity
|
import im.vector.matrix.android.internal.database.model.TimelineEventEntity
|
||||||
import im.vector.matrix.android.internal.database.model.TimelineEventEntityFields
|
import im.vector.matrix.android.internal.database.model.TimelineEventEntityFields
|
||||||
|
import im.vector.matrix.android.internal.extensions.assertIsManaged
|
||||||
import io.realm.Realm
|
import io.realm.Realm
|
||||||
|
|
||||||
internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long {
|
internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long {
|
||||||
|
@ -28,3 +29,11 @@ internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long {
|
||||||
currentIdNum.toLong() + 1
|
currentIdNum.toLong() + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun TimelineEventEntity.deleteOnCascade() {
|
||||||
|
assertIsManaged()
|
||||||
|
root?.deleteFromRealm()
|
||||||
|
annotations?.deleteFromRealm()
|
||||||
|
readReceipts?.deleteFromRealm()
|
||||||
|
deleteFromRealm()
|
||||||
|
}
|
||||||
|
|
|
@ -21,5 +21,8 @@ import com.squareup.moshi.JsonClass
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class SendResponse(
|
internal data class SendResponse(
|
||||||
|
/**
|
||||||
|
* A unique identifier for the event.
|
||||||
|
*/
|
||||||
@Json(name = "event_id") val eventId: String
|
@Json(name = "event_id") val eventId: String
|
||||||
)
|
)
|
||||||
|
|
|
@ -22,7 +22,6 @@ import im.vector.matrix.android.api.session.events.model.EventType
|
||||||
import im.vector.matrix.android.api.session.events.model.toModel
|
import im.vector.matrix.android.api.session.events.model.toModel
|
||||||
import im.vector.matrix.android.api.session.room.model.message.MessageContent
|
import im.vector.matrix.android.api.session.room.model.message.MessageContent
|
||||||
import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent
|
import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent
|
||||||
import im.vector.matrix.android.api.session.room.send.SendState
|
|
||||||
import im.vector.matrix.android.api.session.room.sender.SenderInfo
|
import im.vector.matrix.android.api.session.room.sender.SenderInfo
|
||||||
import im.vector.matrix.android.api.session.room.uploads.GetUploadsResult
|
import im.vector.matrix.android.api.session.room.uploads.GetUploadsResult
|
||||||
import im.vector.matrix.android.api.session.room.uploads.UploadEvent
|
import im.vector.matrix.android.api.session.room.uploads.UploadEvent
|
||||||
|
@ -76,8 +75,6 @@ internal class DefaultGetUploadsTask @Inject constructor(
|
||||||
monarchy.doWithRealm { realm ->
|
monarchy.doWithRealm { realm ->
|
||||||
eventsFromRealm = EventEntity.whereType(realm, EventType.ENCRYPTED, params.roomId)
|
eventsFromRealm = EventEntity.whereType(realm, EventType.ENCRYPTED, params.roomId)
|
||||||
.like(EventEntityFields.DECRYPTION_RESULT_JSON, TimelineEventFilter.DecryptedContent.URL)
|
.like(EventEntityFields.DECRYPTION_RESULT_JSON, TimelineEventFilter.DecryptedContent.URL)
|
||||||
// FIXME Send event are stored twice in the DB. This is not normal. Keep only synced events
|
|
||||||
.like(EventEntityFields.SEND_STATE_STR, SendState.SYNCED.name)
|
|
||||||
.findAll()
|
.findAll()
|
||||||
.map { it.asDomain() }
|
.map { it.asDomain() }
|
||||||
// Exclude stickers
|
// Exclude stickers
|
||||||
|
|
|
@ -29,6 +29,7 @@ import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
||||||
import im.vector.matrix.android.internal.crypto.algorithms.olm.OlmDecryptionResult
|
import im.vector.matrix.android.internal.crypto.algorithms.olm.OlmDecryptionResult
|
||||||
import im.vector.matrix.android.internal.database.helper.addOrUpdate
|
import im.vector.matrix.android.internal.database.helper.addOrUpdate
|
||||||
import im.vector.matrix.android.internal.database.helper.addTimelineEvent
|
import im.vector.matrix.android.internal.database.helper.addTimelineEvent
|
||||||
|
import im.vector.matrix.android.internal.database.helper.deleteOnCascade
|
||||||
import im.vector.matrix.android.internal.database.mapper.ContentMapper
|
import im.vector.matrix.android.internal.database.mapper.ContentMapper
|
||||||
import im.vector.matrix.android.internal.database.mapper.toEntity
|
import im.vector.matrix.android.internal.database.mapper.toEntity
|
||||||
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
||||||
|
@ -272,6 +273,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
|
||||||
event.mxDecryptionResult = adapter.fromJson(json)
|
event.mxDecryptionResult = adapter.fromJson(json)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Finally delete the local echo
|
||||||
|
sendingEventEntity.deleteOnCascade()
|
||||||
} else {
|
} else {
|
||||||
Timber.v("Can't find corresponding local echo for tx:$it")
|
Timber.v("Can't find corresponding local echo for tx:$it")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue