From 1b95336ad3f9031b15d3b2d8f7014b79df65ecf0 Mon Sep 17 00:00:00 2001
From: ganfra <francois.ganard@gmail.com>
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 3341d87ebd..c56b4f4de5 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 af8317aaa7..706152931c 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 c0d01ded2a..01d95eb289 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 16a815b4cf..d700fdf37c 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<TimelineEventEntity>.buildQuery(sender: String, isUnlinked: Boolean): RealmQuery<TimelineEventEntity> {
     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 2d0aa9e118..30346f789e 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 c890436ff8..92cbd4be82 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 65ee5aab37..ab10297fe6 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 9a467f724e..c811ece154 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 0ecfa21639..b6cf00a3c6 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<String>()
-    private val mergeItemCollapseStates = HashMap<String, Boolean>()
+    private val collapsedEventIds = linkedSetOf<Long>()
+    private val mergeItemCollapseStates = HashMap<Long,Boolean>()
     private val modelCache = arrayListOf<CacheItemData?>()
 
     private var currentSnapshot: List<TimelineEvent> = 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 8a6c8683ed..0ad13fcfb6 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?