feat(privacy&security) : extract some code for address management

This commit is contained in:
ganfra
2025-01-22 16:34:03 +01:00
parent 873b6558cc
commit 755ddcbf47
6 changed files with 41 additions and 17 deletions

View File

@@ -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()
}

View File

@@ -40,7 +40,7 @@ data class SecurityAndPrivacySettings(
val roomAccess: SecurityAndPrivacyRoomAccess,
val isEncrypted: Boolean,
val historyVisibility: Optional<SecurityAndPrivacyHistoryVisibility>,
val formattedAddress: Optional<String>,
val addressName: Optional<String>,
val isVisibleInRoomDirectory: Optional<AsyncData<Boolean>>
)

View File

@@ -53,7 +53,7 @@ fun aSecurityAndPrivacySettings(
) = SecurityAndPrivacySettings(
roomAccess = roomAccess,
isEncrypted = isEncrypted,
formattedAddress = formattedAddress,
addressName = formattedAddress,
historyVisibility = historyVisibility,
isVisibleInRoomDirectory = isVisibleInRoomDirectory
)

View File

@@ -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,

View File

@@ -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>(RoomAddressValidity.Unknown)
}
val savedRoomAddress = remember {
room.firstAliasMatching(homeserverName)?.roomAddress()
}
val savedRoomAddress = remember { room.firstAliasMatching(homeserverName)?.addressName() }
val saveAction = remember { mutableStateOf<AsyncAction<Unit>>(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)
}

View File

@@ -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
}