diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ce49c51e0a7..0fce730208b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -169,7 +169,7 @@ jsoup = "org.jsoup:jsoup:1.20.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.5.26" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.5.29" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt index a12d4d70988..87022181502 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt @@ -32,7 +32,6 @@ data class RoomInfo( val isEncrypted: Boolean?, val joinRule: JoinRule?, val isSpace: Boolean, - val tombstone: RoomTombstone?, val isFavorite: Boolean, val canonicalAlias: RoomAlias?, val alternativeAliases: ImmutableList, @@ -74,12 +73,8 @@ data class RoomInfo( val pinnedEventIds: ImmutableList, val creator: UserId?, val historyVisibility: RoomHistoryVisibility, + val successorRoom: SuccessorRoom?, ) { val aliases: List get() = listOfNotNull(canonicalAlias) + alternativeAliases } - -data class RoomTombstone( - val body: String, - val replacementRoomId: RoomId, -) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/SuccessorRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/SuccessorRoom.kt new file mode 100644 index 00000000000..4aaf3dd2d2e --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/SuccessorRoom.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.room + +import io.element.android.libraries.matrix.api.core.RoomId + +/** + * + * When a room A is tombstoned, it is replaced by a room B. The room A is the + * predecessor of B, and B is the successor of A. This type holds information + * about the successor room. + * + * A room is tombstoned if it has received a m.room.tombstone state event. + * + */ +data class SuccessorRoom( + /** + * The ID of the replacement room. + */ + val roomId: RoomId, + /** + * The message explaining why the room has been tombstoned. + */ + val reason: String?, +) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt index e57e94087ec..2717f6275ed 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt @@ -14,7 +14,7 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomNotificationMode -import io.element.android.libraries.matrix.api.room.RoomTombstone +import io.element.android.libraries.matrix.api.room.SuccessorRoom import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.impl.room.history.map import io.element.android.libraries.matrix.impl.room.join.map @@ -28,6 +28,7 @@ import uniffi.matrix_sdk_base.EncryptionState import org.matrix.rustcomponents.sdk.Membership as RustMembership import org.matrix.rustcomponents.sdk.RoomInfo as RustRoomInfo import org.matrix.rustcomponents.sdk.RoomNotificationMode as RustRoomNotificationMode +import org.matrix.rustcomponents.sdk.SuccessorRoom as RustSuccessorRoom class RoomInfoMapper { fun map(rustRoomInfo: RustRoomInfo): RoomInfo = rustRoomInfo.let { @@ -47,9 +48,6 @@ class RoomInfoMapper { }, joinRule = it.joinRule?.map(), isSpace = it.isSpace, - tombstone = it.tombstone?.let { - RoomTombstone(it.body, RoomId(it.replacementRoomId)) - }, isFavorite = it.isFavourite, canonicalAlias = it.canonicalAlias?.let(::RoomAlias), alternativeAliases = it.alternativeAliases.map(::RoomAlias).toImmutableList(), @@ -71,6 +69,7 @@ class RoomInfoMapper { numUnreadMentions = it.numUnreadMentions.toLong(), numUnreadNotifications = it.numUnreadNotifications.toLong(), historyVisibility = it.historyVisibility.map(), + successorRoom = it.successorRoom?.map(), ) } } @@ -89,6 +88,11 @@ fun RustRoomNotificationMode.map(): RoomNotificationMode = when (this) { RustRoomNotificationMode.MUTE -> RoomNotificationMode.MUTE } +fun RustSuccessorRoom.map(): SuccessorRoom = SuccessorRoom( + roomId = RoomId(roomId), + reason = reason, +) + /** * Map a RoomHero to a MatrixUser. There is not need to create a RoomHero type on the application side. */ diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt index 7590e3412ab..45b67cc38a9 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt @@ -17,7 +17,7 @@ import org.matrix.rustcomponents.sdk.RoomHistoryVisibility import org.matrix.rustcomponents.sdk.RoomInfo import org.matrix.rustcomponents.sdk.RoomMember import org.matrix.rustcomponents.sdk.RoomNotificationMode -import org.matrix.rustcomponents.sdk.RoomTombstoneInfo +import org.matrix.rustcomponents.sdk.SuccessorRoom import uniffi.matrix_sdk_base.EncryptionState fun aRustRoomInfo( @@ -30,7 +30,6 @@ fun aRustRoomInfo( isDirect: Boolean = false, isPublic: Boolean = false, isSpace: Boolean = false, - tombstone: RoomTombstoneInfo? = null, isFavourite: Boolean = false, canonicalAlias: String? = null, alternativeAliases: List = listOf(), @@ -54,6 +53,7 @@ fun aRustRoomInfo( roomCreator: UserId? = null, joinRule: JoinRule? = null, historyVisibility: RoomHistoryVisibility = RoomHistoryVisibility.Joined, + successorRoom: SuccessorRoom? = null, ) = RoomInfo( id = id, displayName = displayName, @@ -64,7 +64,6 @@ fun aRustRoomInfo( isDirect = isDirect, isPublic = isPublic, isSpace = isSpace, - tombstone = tombstone, isFavourite = isFavourite, canonicalAlias = canonicalAlias, alternativeAliases = alternativeAliases, @@ -87,5 +86,6 @@ fun aRustRoomInfo( pinnedEventIds = pinnedEventIds, creator = roomCreator?.value, joinRule = joinRule, - historyVisibility = historyVisibility + historyVisibility = historyVisibility, + successorRoom = successorRoom, ) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt index 799d40987b2..c7e2ced2733 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt @@ -54,7 +54,7 @@ class RoomInfoMapperTest { isPublic = false, isSpace = false, joinRule = RustJoinRule.Invite, - tombstone = null, + successorRoom = null, isFavourite = false, canonicalAlias = A_ROOM_ALIAS.value, alternativeAliases = listOf(A_ROOM_ALIAS.value), @@ -90,7 +90,6 @@ class RoomInfoMapperTest { isDirect = true, isEncrypted = true, isSpace = false, - tombstone = null, isFavorite = false, joinRule = JoinRule.Invite, canonicalAlias = A_ROOM_ALIAS, @@ -120,6 +119,7 @@ class RoomInfoMapperTest { numUnreadNotifications = 13L, numUnreadMentions = 14L, historyVisibility = RoomHistoryVisibility.Joined, + successorRoom = null ) ) } @@ -139,7 +139,7 @@ class RoomInfoMapperTest { isPublic = true, joinRule = null, isSpace = false, - tombstone = null, + successorRoom = null, isFavourite = true, canonicalAlias = null, alternativeAliases = emptyList(), @@ -175,7 +175,7 @@ class RoomInfoMapperTest { isDirect = false, joinRule = null, isSpace = false, - tombstone = null, + successorRoom = null, isFavorite = true, canonicalAlias = null, alternativeAliases = emptyList().toPersistentList(), diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt index 8cc7b2b6c93..5b6040dee5a 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt @@ -15,7 +15,7 @@ import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomNotificationMode -import io.element.android.libraries.matrix.api.room.RoomTombstone +import io.element.android.libraries.matrix.api.room.SuccessorRoom import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.user.MatrixUser @@ -39,7 +39,7 @@ fun aRoomInfo( isEncrypted: Boolean = false, joinRule: JoinRule? = JoinRule.Public, isSpace: Boolean = false, - tombstone: RoomTombstone? = null, + successorRoom: SuccessorRoom? = null, isFavorite: Boolean = false, canonicalAlias: RoomAlias? = null, alternativeAliases: List = emptyList(), @@ -73,7 +73,7 @@ fun aRoomInfo( isEncrypted = isEncrypted, joinRule = joinRule, isSpace = isSpace, - tombstone = tombstone, + successorRoom = successorRoom, isFavorite = isFavorite, canonicalAlias = canonicalAlias, alternativeAliases = alternativeAliases.toImmutableList(), diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt index f5f29d6a8a3..11e462f977a 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt @@ -15,7 +15,7 @@ import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomNotificationMode -import io.element.android.libraries.matrix.api.room.RoomTombstone +import io.element.android.libraries.matrix.api.room.SuccessorRoom import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.room.message.RoomMessage @@ -52,7 +52,7 @@ fun aRoomSummary( isEncrypted: Boolean = false, joinRule: JoinRule? = JoinRule.Public, isSpace: Boolean = false, - tombstone: RoomTombstone? = null, + successorRoom: SuccessorRoom? = null, isFavorite: Boolean = false, canonicalAlias: RoomAlias? = null, alternativeAliases: List = emptyList(), @@ -88,7 +88,7 @@ fun aRoomSummary( isEncrypted = isEncrypted, joinRule = joinRule, isSpace = isSpace, - tombstone = tombstone, + successorRoom = successorRoom, isFavorite = isFavorite, canonicalAlias = canonicalAlias, alternativeAliases = alternativeAliases.toPersistentList(),