diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt index 4758f4d77a..c8aa0c43c7 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt @@ -150,7 +150,7 @@ class RoomDetailsPresenter @Inject constructor( return RoomDetailsState( roomId = room.roomId, roomName = roomName, - roomAlias = room.alias, + roomAlias = room.canonicalAlias, roomAvatarUrl = roomAvatar, roomTopic = topicState, memberCount = room.joinedMemberCount, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressPresenter.kt index a2417e308a..608c772cb3 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressPresenter.kt @@ -72,10 +72,10 @@ class EditRoomAddressPresenter @Inject constructor( private fun MatrixRoom.firstAliasMatching(serverName: String): RoomAlias? { // Check if the canonical alias matches the homeserver - if (this.alias?.matchesServer(serverName) == true) { - return this.alias + if (canonicalAlias?.matchesServer(serverName) == true) { + return canonicalAlias } - return this.alternativeAliases.firstOrNull { it.value.contains(serverName) } + return alternativeAliases.firstOrNull { it.value.contains(serverName) } } private fun RoomAlias.roomAddress(): String { diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 9275907f66..d67ee5c676 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -45,7 +45,7 @@ interface MatrixRoom : Closeable { val sessionId: SessionId val roomId: RoomId val displayName: String - val alias: RoomAlias? + val canonicalAlias: RoomAlias? val alternativeAliases: List val topic: String? val avatarUrl: String? @@ -432,4 +432,22 @@ interface MatrixRoom : Closeable { * directory and can be found using it. */ suspend fun getRoomVisibility(): Result + /** + * Publish a new room alias for this room in the room directory. + * + * Returns: + * - `true` if the room alias didn't exist and it's now published. + * - `false` if the room alias was already present so it couldn't be + * published. + */ + suspend fun publishRoomAliasInRoomDirectory(roomAlias: RoomAlias): Result + /** + * Remove an existing room alias for this room in the room directory. + * + * Returns: + * - `true` if the room alias was present and it's now removed from the + * room directory. + * - `false` if the room alias didn't exist so it couldn't be removed. + */ + suspend fun removeRoomAliasFromRoomDirectory(roomAlias: RoomAlias): Result } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/MatrixRoomAlias.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/MatrixRoomAlias.kt index 06d9428765..f9158ae360 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/MatrixRoomAlias.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/MatrixRoomAlias.kt @@ -19,7 +19,7 @@ fun MatrixRoom.matches(roomIdOrAlias: RoomIdOrAlias): Boolean { roomIdOrAlias.roomId == roomId } is RoomIdOrAlias.Alias -> { - roomIdOrAlias.roomAlias == alias || roomIdOrAlias.roomAlias in alternativeAliases + roomIdOrAlias.roomAlias == canonicalAlias || roomIdOrAlias.roomAlias in alternativeAliases } } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 0823e8396c..dd75b3f617 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -280,7 +280,7 @@ class RustMatrixRoom( override val isEncrypted: Boolean get() = runCatching { innerRoom.isEncrypted() }.getOrDefault(false) - override val alias: RoomAlias? + override val canonicalAlias: RoomAlias? get() = runCatching { innerRoom.canonicalAlias()?.let(::RoomAlias) }.getOrDefault(null) override val alternativeAliases: List @@ -785,6 +785,20 @@ class RustMatrixRoom( } } + override suspend fun publishRoomAliasInRoomDirectory(roomAlias: RoomAlias): Result = withContext(roomDispatcher) { + runCatching { + innerRoom.publishRoomAliasInRoomDirectory(roomAlias.value) + } + } + + override suspend fun removeRoomAliasFromRoomDirectory(roomAlias: RoomAlias): Result = withContext(roomDispatcher) { + runCatching { + innerRoom.removeRoomAliasFromRoomDirectory(roomAlias.value) + } + } + + + override suspend fun updateRoomVisibility(roomVisibility: RoomVisibility): Result = withContext(roomDispatcher) { runCatching { innerRoom.updateRoomVisibility(roomVisibility.map()) diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index 551bb93795..daaea64e59 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -68,7 +68,7 @@ class FakeMatrixRoom( override val topic: String? = null, override val avatarUrl: String? = null, override var isEncrypted: Boolean = false, - override val alias: RoomAlias? = null, + override val canonicalAlias: RoomAlias? = null, override val alternativeAliases: List = emptyList(), override val isPublic: Boolean = true, override val isSpace: Boolean = false, @@ -151,6 +151,8 @@ class FakeMatrixRoom( private val updateRoomVisibilityResult: (RoomVisibility) -> Result = { lambdaError() }, private val updateRoomHistoryVisibilityResult: (RoomHistoryVisibility) -> Result = { lambdaError() }, private val roomVisibilityResult: () -> Result = { lambdaError() }, + private val publishRoomAliasInRoomDirectoryResult: (RoomAlias) -> Result = { lambdaError() }, + private val removeRoomAliasFromRoomDirectoryResult: (RoomAlias) -> Result = { lambdaError() }, ) : MatrixRoom { private val _roomInfoFlow: MutableSharedFlow = MutableSharedFlow(replay = 1) override val roomInfoFlow: Flow = _roomInfoFlow @@ -604,6 +606,14 @@ class FakeMatrixRoom( roomVisibilityResult() } + override suspend fun publishRoomAliasInRoomDirectory(roomAlias: RoomAlias): Result = simulateLongTask { + publishRoomAliasInRoomDirectoryResult(roomAlias) + } + + override suspend fun removeRoomAliasFromRoomDirectory(roomAlias: RoomAlias): Result = simulateLongTask { + removeRoomAliasFromRoomDirectoryResult(roomAlias) + } + fun givenRoomMembersState(state: MatrixRoomMembersState) { membersStateFlow.value = state }