From 1b95336ad3f9031b15d3b2d8f7014b79df65ecf0 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 10 Jul 2019 19:14:06 +0200 Subject: [PATCH] EventEntity|TimelineEventEntity : remove UUID as primary key and use auto-incremented Long --- .../api/session/room/timeline/TimelineEvent.kt | 2 +- .../internal/database/helper/ChunkEntityHelper.kt | 3 ++- .../internal/database/helper/RoomEntityHelper.kt | 4 ++-- .../database/helper/TimelineEventEntityHelper.kt | 11 +++++++++++ .../android/internal/database/mapper/EventMapper.kt | 2 +- .../internal/database/mapper/TimelineEventMapper.kt | 13 ------------- .../android/internal/database/model/EventEntity.kt | 3 +-- .../internal/database/model/TimelineEventEntity.kt | 6 +----- .../room/detail/timeline/TimelineEventController.kt | 9 +++++---- .../room/detail/timeline/item/MergedHeaderItem.kt | 2 +- 10 files changed, 25 insertions(+), 30 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt index 3341d87e..c56b4f4d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt @@ -28,7 +28,7 @@ import im.vector.matrix.android.api.session.room.send.SendState */ data class TimelineEvent( val root: Event, - val localId: String, + val localId: Long, val displayIndex: Int, val senderName: String?, val isUniqueDisplayName: Boolean, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt index af8317aa..70615293 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt @@ -134,7 +134,8 @@ internal fun ChunkEntity.add(roomId: String, } } - val eventEntity = TimelineEventEntity().also { + val localId = TimelineEventEntity.nextId(realm) + val eventEntity = TimelineEventEntity(localId).also { it.root = event.toEntity(roomId).apply { this.stateIndex = currentStateIndex this.isUnlinked = isUnlinked diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt index c0d01ded..01d95eb2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt @@ -26,7 +26,6 @@ import im.vector.matrix.android.internal.database.query.fastContains import im.vector.matrix.android.internal.extensions.assertIsManaged import im.vector.matrix.android.internal.session.room.membership.RoomMembers - internal fun RoomEntity.deleteOnCascade(chunkEntity: ChunkEntity) { chunks.remove(chunkEntity) chunkEntity.deleteOnCascade() @@ -65,7 +64,8 @@ internal fun RoomEntity.addSendingEvent(event: Event) { } val roomMembers = RoomMembers(realm, roomId) val myUser = roomMembers.get(senderId) - val timelineEventEntity = TimelineEventEntity().also { + val localId = TimelineEventEntity.nextId(realm) + val timelineEventEntity = TimelineEventEntity(localId).also { it.root = eventEntity it.eventId = event.eventId ?: "" it.roomId = roomId diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/TimelineEventEntityHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/TimelineEventEntityHelper.kt index 16a815b4..d700fdf3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/TimelineEventEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/TimelineEventEntityHelper.kt @@ -30,9 +30,11 @@ import im.vector.matrix.android.internal.database.query.prev import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.extensions.assertIsManaged import im.vector.matrix.android.internal.session.room.membership.RoomMembers +import io.realm.Realm import io.realm.RealmList import io.realm.RealmQuery + internal fun TimelineEventEntity.updateSenderData() { assertIsManaged() val roomEntity = RoomEntity.where(realm, roomId = roomId).findFirst() ?: return @@ -69,6 +71,15 @@ internal fun TimelineEventEntity.updateSenderData() { this.senderMembershipEvent = senderMembershipEvent } +internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long{ + val currentIdNum = realm.where(TimelineEventEntity::class.java).max(TimelineEventEntityFields.LOCAL_ID) + return if (currentIdNum == null) { + 1 + } else { + currentIdNum.toLong() + 1 + } +} + private fun RealmList.buildQuery(sender: String, isUnlinked: Boolean): RealmQuery { return where() .equalTo(TimelineEventEntityFields.ROOT.STATE_KEY, sender) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt index 2d0aa9e1..30346f78 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt @@ -35,7 +35,7 @@ internal object EventMapper { val uds = if (event.unsignedData == null) null else MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(event.unsignedData) val eventEntity = EventEntity() - eventEntity.eventId = event.eventId ?: UUID.randomUUID().toString() + eventEntity.eventId = event.eventId ?: "" eventEntity.roomId = event.roomId ?: roomId eventEntity.content = ContentMapper.map(event.content) val resolvedPrevContent = event.prevContent ?: event.unsignedData?.prevContent diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/TimelineEventMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/TimelineEventMapper.kt index c890436f..92cbd4be 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/TimelineEventMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/TimelineEventMapper.kt @@ -23,15 +23,6 @@ import im.vector.matrix.android.internal.database.model.TimelineEventEntity internal object TimelineEventMapper { - fun map(timelineEvent: TimelineEvent, roomId: String): TimelineEventEntity { - val timelineEventEntity = TimelineEventEntity() - timelineEventEntity.root = timelineEvent.root.toEntity(roomId) - timelineEventEntity.eventId = timelineEvent.root.eventId ?: "" - timelineEventEntity.roomId = roomId - timelineEventEntity.annotations = timelineEvent.annotations?.let { EventAnnotationsSummaryMapper.map(it, roomId) } - return timelineEventEntity - } - fun map(timelineEventEntity: TimelineEventEntity): TimelineEvent { return TimelineEvent( @@ -53,8 +44,4 @@ internal fun TimelineEventEntity.asDomain(): TimelineEvent { return TimelineEventMapper.map(this) } -internal fun TimelineEvent.toEntity(roomId: String): TimelineEventEntity { - return TimelineEventMapper.map(this, roomId) -} - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt index 65ee5aab..ab10297f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt @@ -27,8 +27,7 @@ import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey import java.util.* -internal open class EventEntity(@PrimaryKey var localId: String = UUID.randomUUID().toString(), - @Index var eventId: String = "", +internal open class EventEntity(@Index var eventId: String = "", @Index var roomId: String = "", @Index var type: String = "", var content: String? = null, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/TimelineEventEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/TimelineEventEntity.kt index 9a467f72..c811ece1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/TimelineEventEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/TimelineEventEntity.kt @@ -16,10 +16,6 @@ package im.vector.matrix.android.internal.database.model -import com.squareup.moshi.Types -import im.vector.matrix.android.internal.crypto.MXEventDecryptionResult -import im.vector.matrix.android.internal.database.mapper.ContentMapper -import im.vector.matrix.android.internal.di.MoshiProvider import io.realm.RealmObject import io.realm.RealmResults import io.realm.annotations.Index @@ -28,7 +24,7 @@ import io.realm.annotations.PrimaryKey import java.util.* -internal open class TimelineEventEntity(@PrimaryKey var localId: String = UUID.randomUUID().toString(), +internal open class TimelineEventEntity(var localId: Long = 0, @Index var eventId: String = "", @Index var roomId: String = "", var root: EventEntity? = null, diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/TimelineEventController.kt index 0ecfa216..b6cf00a3 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/TimelineEventController.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.room.detail.timeline import android.os.Handler import android.os.Looper +import android.util.LongSparseArray import android.view.View import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListUpdateCallback @@ -82,8 +83,8 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Tim fun onUrlLongClicked(url: String): Boolean } - private val collapsedEventIds = linkedSetOf() - private val mergeItemCollapseStates = HashMap() + private val collapsedEventIds = linkedSetOf() + private val mergeItemCollapseStates = HashMap() private val modelCache = arrayListOf() private var currentSnapshot: List = emptyList() @@ -298,7 +299,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Tim } else { collapsedEventIds.removeAll(mergedEventIds) } - val mergeId = mergedEventIds.joinToString(separator = "_") { it } + val mergeId = mergedEventIds.joinToString(separator = "_") { it.toString() } MergedHeaderItem(isCollapsed, mergeId, mergedData, avatarRenderer) { mergeItemCollapseStates[event.localId] = it requestModelBuild() @@ -329,7 +330,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Tim } private data class CacheItemData( - val localId: String, + val localId: Long, val eventId: String?, val eventModel: EpoxyModel<*>? = null, val mergedHeaderModel: MergedHeaderItem? = null, diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt index 8a6c8683..0ad13fcf 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt @@ -78,7 +78,7 @@ data class MergedHeaderItem(private val isCollapsed: Boolean, } data class Data( - val eventId: String, + val eventId: Long, val userId: String, val memberName: String, val avatarUrl: String?