diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt index db4a99d37b..0c2f993e15 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt @@ -17,10 +17,13 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import io.element.android.features.roomdetails.impl.securityandprivacy.editroomaddress.matchesServer import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.MatrixRoomInfo import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule import java.util.Optional @@ -51,7 +54,7 @@ class SecurityAndPrivacyPresenter @AssistedInject constructor( isEncrypted = room.isEncrypted, isVisibleInRoomDirectory = Optional.ofNullable(isVisibleInRoomDirectory.value), historyVisibility = Optional.ofNullable(roomInfo?.historyVisibility?.map()), - formattedAddress = Optional.ofNullable(roomInfo?.canonicalAlias?.value), + addressName = Optional.ofNullable(roomInfo?.firstDisplayableAlias(homeserverName)?.value), ) } } @@ -73,7 +76,7 @@ class SecurityAndPrivacyPresenter @AssistedInject constructor( isEncrypted = currentIsEncrypted, isVisibleInRoomDirectory = currentVisibleInRoomDirectory, historyVisibility = currentHistoryVisibility, - formattedAddress = savedSettings.formattedAddress, + addressName = savedSettings.addressName, ) fun handleEvents(event: SecurityAndPrivacyEvents) { @@ -142,3 +145,8 @@ private fun SecurityAndPrivacyHistoryVisibility.map(): RoomHistoryVisibility { SecurityAndPrivacyHistoryVisibility.Anyone -> RoomHistoryVisibility.WorldReadable } } + +private fun MatrixRoomInfo.firstDisplayableAlias(serverName: String): RoomAlias? { + return aliases.firstOrNull { it.matchesServer(serverName)} ?: aliases.firstOrNull() +} + diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt index 9208135985..ba504fda9f 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt @@ -40,7 +40,7 @@ data class SecurityAndPrivacySettings( val roomAccess: SecurityAndPrivacyRoomAccess, val isEncrypted: Boolean, val historyVisibility: Optional, - val formattedAddress: Optional, + val addressName: Optional, val isVisibleInRoomDirectory: Optional> ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt index 6955008914..bc865a761a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt @@ -53,7 +53,7 @@ fun aSecurityAndPrivacySettings( ) = SecurityAndPrivacySettings( roomAccess = roomAccess, isEncrypted = isEncrypted, - formattedAddress = formattedAddress, + addressName = formattedAddress, historyVisibility = historyVisibility, isVisibleInRoomDirectory = isVisibleInRoomDirectory ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt index 8f91f19942..399fdc62f3 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt @@ -83,7 +83,7 @@ fun SecurityAndPrivacyView( if (state.showRoomVisibilitySections) { RoomVisibilitySection(state.homeserverName) RoomAddressSection( - roomAddress = state.currentSettings.formattedAddress, + roomAddress = state.currentSettings.addressName, homeserverName = state.homeserverName, onRoomAddressClick = { state.eventSink(SecurityAndPrivacyEvents.EditRoomAddress) }, isVisibleInPublicDirectory = state.currentSettings.isVisibleInRoomDirectory, 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 31fbaf57ea..caaf4c373d 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 @@ -30,7 +30,6 @@ import io.element.android.libraries.matrix.ui.room.address.RoomAddressValidity import io.element.android.libraries.matrix.ui.room.address.RoomAddressValidityEffect import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import timber.log.Timber class EditRoomAddressPresenter @AssistedInject constructor( @Assisted private val navigator: SecurityAndPrivacyNavigator, @@ -50,9 +49,7 @@ class EditRoomAddressPresenter @AssistedInject constructor( val roomAddressValidity = remember { mutableStateOf(RoomAddressValidity.Unknown) } - val savedRoomAddress = remember { - room.firstAliasMatching(homeserverName)?.roomAddress() - } + val savedRoomAddress = remember { room.firstAliasMatching(homeserverName)?.addressName() } val saveAction = remember { mutableStateOf>(AsyncAction.Uninitialized) } var newRoomAddress by remember { mutableStateOf( @@ -127,6 +124,9 @@ class EditRoomAddressPresenter @AssistedInject constructor( } } +/** + * Returns the first alias that matches the given server name, or null if none match. + */ private fun MatrixRoom.firstAliasMatching(serverName: String): RoomAlias? { // Check if the canonical alias matches the homeserver if (canonicalAlias?.matchesServer(serverName) == true) { @@ -134,11 +134,3 @@ private fun MatrixRoom.firstAliasMatching(serverName: String): RoomAlias? { } return alternativeAliases.firstOrNull { it.value.contains(serverName) } } - -private fun RoomAlias.roomAddress(): String { - return value.drop(1).split(":").first() -} - -private fun RoomAlias.matchesServer(serverName: String): Boolean { - return value.contains(serverName) -} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/RoomAlias.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/RoomAlias.kt new file mode 100644 index 0000000000..39e955da66 --- /dev/null +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/RoomAlias.kt @@ -0,0 +1,24 @@ +/* + * 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.features.roomdetails.impl.securityandprivacy.editroomaddress + +import io.element.android.libraries.matrix.api.core.RoomAlias + +/** + * Returns the local part of the alias. + */ +fun RoomAlias.addressName(): String { + return value.drop(1).split(":").first() +} + +/** + * Checks if the room alias matches the given server name. + */ +fun RoomAlias.matchesServer(serverName: String): Boolean { + return value.split(":").last() == serverName +}