From b23520ea40e785d46ec75d9ffc57661f0f01bc0b Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Tue, 4 Oct 2022 17:51:03 +0200 Subject: [PATCH] Adding new field for last seen user agent in DB with migration --- .../crypto/store/db/RealmCryptoStore.kt | 9 +----- .../store/db/RealmCryptoStoreMigration.kt | 4 ++- .../MyDeviceLastSeenInfoEntityMapper.kt | 14 +++++++- .../store/db/migration/MigrateCryptoTo019.kt | 2 +- .../store/db/migration/MigrateCryptoTo020.kt | 32 +++++++++++++++++++ .../db/model/MyDeviceLastSeenInfoEntity.kt | 4 ++- 6 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo020.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt index 6a2ef3bde1..952afc10f5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt @@ -624,14 +624,7 @@ internal class RealmCryptoStore @Inject constructor( } override fun saveMyDevicesInfo(info: List) { - val entities = info.map { - MyDeviceLastSeenInfoEntity( - lastSeenTs = it.lastSeenTs, - lastSeenIp = it.lastSeenIp, - displayName = it.displayName, - deviceId = it.deviceId - ) - } + val entities = info.map { myDeviceLastSeenInfoEntityMapper.map(it) } doRealmTransactionAsync(realmConfiguration) { realm -> realm.where().findAll().deleteAllFromRealm() entities.forEach { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt index de2b74308d..9129453c8a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt @@ -36,6 +36,7 @@ import org.matrix.android.sdk.internal.crypto.store.db.migration.MigrateCryptoTo import org.matrix.android.sdk.internal.crypto.store.db.migration.MigrateCryptoTo017 import org.matrix.android.sdk.internal.crypto.store.db.migration.MigrateCryptoTo018 import org.matrix.android.sdk.internal.crypto.store.db.migration.MigrateCryptoTo019 +import org.matrix.android.sdk.internal.crypto.store.db.migration.MigrateCryptoTo020 import org.matrix.android.sdk.internal.util.database.MatrixRealmMigration import org.matrix.android.sdk.internal.util.time.Clock import javax.inject.Inject @@ -50,7 +51,7 @@ internal class RealmCryptoStoreMigration @Inject constructor( private val clock: Clock, ) : MatrixRealmMigration( dbName = "Crypto", - schemaVersion = 19L, + schemaVersion = 20L, ) { /** * Forces all RealmCryptoStoreMigration instances to be equal. @@ -79,5 +80,6 @@ internal class RealmCryptoStoreMigration @Inject constructor( if (oldVersion < 17) MigrateCryptoTo017(realm).perform() if (oldVersion < 18) MigrateCryptoTo018(realm).perform() if (oldVersion < 19) MigrateCryptoTo019(realm).perform() + if (oldVersion < 20) MigrateCryptoTo020(realm).perform() } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/mapper/MyDeviceLastSeenInfoEntityMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/mapper/MyDeviceLastSeenInfoEntityMapper.kt index 38a7569aab..e1cb5d78bd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/mapper/MyDeviceLastSeenInfoEntityMapper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/mapper/MyDeviceLastSeenInfoEntityMapper.kt @@ -22,12 +22,24 @@ import javax.inject.Inject internal class MyDeviceLastSeenInfoEntityMapper @Inject constructor() { + // TODO add unit tests fun map(entity: MyDeviceLastSeenInfoEntity): DeviceInfo { return DeviceInfo( deviceId = entity.deviceId, lastSeenIp = entity.lastSeenIp, lastSeenTs = entity.lastSeenTs, - displayName = entity.displayName + displayName = entity.displayName, + unstableLastSeenUserAgent = entity.lastSeenUserAgent, + ) + } + + fun map(deviceInfo: DeviceInfo): MyDeviceLastSeenInfoEntity { + return MyDeviceLastSeenInfoEntity( + deviceId = deviceInfo.deviceId, + lastSeenIp = deviceInfo.lastSeenIp, + lastSeenTs = deviceInfo.lastSeenTs, + displayName = deviceInfo.displayName, + lastSeenUserAgent = deviceInfo.getBestLastSeenUserAgent(), ) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo019.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo019.kt index 9d2eb60a60..65280300ab 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo019.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo019.kt @@ -30,7 +30,7 @@ import org.matrix.android.sdk.internal.util.database.RealmMigrator * mark existing keys as safe. * This migration can take long depending on the account */ -internal class MigrateCryptoTo019(realm: DynamicRealm) : RealmMigrator(realm, 18) { +internal class MigrateCryptoTo019(realm: DynamicRealm) : RealmMigrator(realm, 19) { override fun doMigrate(realm: DynamicRealm) { realm.schema.get("CrossSigningInfoEntity") diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo020.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo020.kt new file mode 100644 index 0000000000..44d07ab538 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/migration/MigrateCryptoTo020.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.internal.crypto.store.db.migration + +import io.realm.DynamicRealm +import org.matrix.android.sdk.internal.crypto.store.db.model.MyDeviceLastSeenInfoEntityFields +import org.matrix.android.sdk.internal.util.database.RealmMigrator + +/** + * This migration adds a new field into MyDeviceLastSeenInfoEntity corresponding to the last seen user agent. + */ +internal class MigrateCryptoTo020(realm: DynamicRealm) : RealmMigrator(realm, 20) { + + override fun doMigrate(realm: DynamicRealm) { + realm.schema.get("MyDeviceLastSeenInfoEntity") + ?.addField(MyDeviceLastSeenInfoEntityFields.LAST_SEEN_USER_AGENT, String::class.java) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/MyDeviceLastSeenInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/MyDeviceLastSeenInfoEntity.kt index 74a81d5b01..3e6dc2de16 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/MyDeviceLastSeenInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/MyDeviceLastSeenInfoEntity.kt @@ -27,7 +27,9 @@ internal open class MyDeviceLastSeenInfoEntity( /** The last time this device has been seen. */ var lastSeenTs: Long? = null, /** The last ip address. */ - var lastSeenIp: String? = null + var lastSeenIp: String? = null, + /** The last user agent. */ + var lastSeenUserAgent: String? = null, ) : RealmObject() { companion object