feat(privacy&security) : extract some code for address management
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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>>
|
||||
)
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ fun aSecurityAndPrivacySettings(
|
||||
) = SecurityAndPrivacySettings(
|
||||
roomAccess = roomAccess,
|
||||
isEncrypted = isEncrypted,
|
||||
formattedAddress = formattedAddress,
|
||||
addressName = formattedAddress,
|
||||
historyVisibility = historyVisibility,
|
||||
isVisibleInRoomDirectory = isVisibleInRoomDirectory
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user