feat(privacy&security) : extract some code for address management
This commit is contained in:
parent
873b6558cc
commit
755ddcbf47
6 changed files with 41 additions and 17 deletions
|
|
@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue