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.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject 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.AsyncData
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.MatrixClient 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.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.history.RoomHistoryVisibility
import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.room.join.JoinRule
import java.util.Optional import java.util.Optional
@ -51,7 +54,7 @@ class SecurityAndPrivacyPresenter @AssistedInject constructor(
isEncrypted = room.isEncrypted, isEncrypted = room.isEncrypted,
isVisibleInRoomDirectory = Optional.ofNullable(isVisibleInRoomDirectory.value), isVisibleInRoomDirectory = Optional.ofNullable(isVisibleInRoomDirectory.value),
historyVisibility = Optional.ofNullable(roomInfo?.historyVisibility?.map()), 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, isEncrypted = currentIsEncrypted,
isVisibleInRoomDirectory = currentVisibleInRoomDirectory, isVisibleInRoomDirectory = currentVisibleInRoomDirectory,
historyVisibility = currentHistoryVisibility, historyVisibility = currentHistoryVisibility,
formattedAddress = savedSettings.formattedAddress, addressName = savedSettings.addressName,
) )
fun handleEvents(event: SecurityAndPrivacyEvents) { fun handleEvents(event: SecurityAndPrivacyEvents) {
@ -142,3 +145,8 @@ private fun SecurityAndPrivacyHistoryVisibility.map(): RoomHistoryVisibility {
SecurityAndPrivacyHistoryVisibility.Anyone -> RoomHistoryVisibility.WorldReadable 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 roomAccess: SecurityAndPrivacyRoomAccess,
val isEncrypted: Boolean, val isEncrypted: Boolean,
val historyVisibility: Optional<SecurityAndPrivacyHistoryVisibility>, val historyVisibility: Optional<SecurityAndPrivacyHistoryVisibility>,
val formattedAddress: Optional<String>, val addressName: Optional<String>,
val isVisibleInRoomDirectory: Optional<AsyncData<Boolean>> val isVisibleInRoomDirectory: Optional<AsyncData<Boolean>>
) )

View file

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

View file

@ -83,7 +83,7 @@ fun SecurityAndPrivacyView(
if (state.showRoomVisibilitySections) { if (state.showRoomVisibilitySections) {
RoomVisibilitySection(state.homeserverName) RoomVisibilitySection(state.homeserverName)
RoomAddressSection( RoomAddressSection(
roomAddress = state.currentSettings.formattedAddress, roomAddress = state.currentSettings.addressName,
homeserverName = state.homeserverName, homeserverName = state.homeserverName,
onRoomAddressClick = { state.eventSink(SecurityAndPrivacyEvents.EditRoomAddress) }, onRoomAddressClick = { state.eventSink(SecurityAndPrivacyEvents.EditRoomAddress) },
isVisibleInPublicDirectory = state.currentSettings.isVisibleInRoomDirectory, 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 io.element.android.libraries.matrix.ui.room.address.RoomAddressValidityEffect
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import timber.log.Timber
class EditRoomAddressPresenter @AssistedInject constructor( class EditRoomAddressPresenter @AssistedInject constructor(
@Assisted private val navigator: SecurityAndPrivacyNavigator, @Assisted private val navigator: SecurityAndPrivacyNavigator,
@ -50,9 +49,7 @@ class EditRoomAddressPresenter @AssistedInject constructor(
val roomAddressValidity = remember { val roomAddressValidity = remember {
mutableStateOf<RoomAddressValidity>(RoomAddressValidity.Unknown) mutableStateOf<RoomAddressValidity>(RoomAddressValidity.Unknown)
} }
val savedRoomAddress = remember { val savedRoomAddress = remember { room.firstAliasMatching(homeserverName)?.addressName() }
room.firstAliasMatching(homeserverName)?.roomAddress()
}
val saveAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) } val saveAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
var newRoomAddress by remember { var newRoomAddress by remember {
mutableStateOf( 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? { private fun MatrixRoom.firstAliasMatching(serverName: String): RoomAlias? {
// Check if the canonical alias matches the homeserver // Check if the canonical alias matches the homeserver
if (canonicalAlias?.matchesServer(serverName) == true) { if (canonicalAlias?.matchesServer(serverName) == true) {
@ -134,11 +134,3 @@ private fun MatrixRoom.firstAliasMatching(serverName: String): RoomAlias? {
} }
return alternativeAliases.firstOrNull { it.value.contains(serverName) } 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
}