From 129eb45c686237a6e677617087a25cadeaeea60b Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 21 Jan 2025 20:38:43 +0100 Subject: [PATCH] feat(security&privacy) : introduce navigator --- .../SecurityAndPrivacyEvents.kt | 1 + .../SecurityAndPrivacyFlowNode.kt | 6 +++-- .../SecurityAndPrivacyNavigator.kt | 24 +++++++++++++++++++ .../SecurityAndPrivacyNode.kt | 8 +++++-- .../SecurityAndPrivacyPresenter.kt | 12 ++++++++-- .../SecurityAndPrivacyView.kt | 2 +- 6 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNavigator.kt diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyEvents.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyEvents.kt index f87aff2f31..d817e30a36 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyEvents.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyEvents.kt @@ -8,6 +8,7 @@ package io.element.android.features.roomdetails.impl.securityandprivacy sealed interface SecurityAndPrivacyEvents { + data object EditRoomAddress : SecurityAndPrivacyEvents data object Save : SecurityAndPrivacyEvents data class ChangeRoomAccess(val roomAccess: SecurityAndPrivacyRoomAccess) : SecurityAndPrivacyEvents data object EnableEncryption: SecurityAndPrivacyEvents diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyFlowNode.kt index d257e096a4..76d5a5b005 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyFlowNode.kt @@ -45,13 +45,15 @@ class SecurityAndPrivacyFlowNode @AssistedInject constructor( data object EditRoomAddress : NavTarget } + private val navigator = BackstackSecurityAndPrivacyNavigator(backstack) + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { NavTarget.SecurityAndPrivacy -> { - createNode(buildContext) + createNode(buildContext, plugins = listOf(navigator)) } NavTarget.EditRoomAddress -> { - createNode(buildContext) + createNode(buildContext, plugins = listOf(navigator)) } } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNavigator.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNavigator.kt new file mode 100644 index 0000000000..050283e739 --- /dev/null +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNavigator.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 + +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.push + +interface SecurityAndPrivacyNavigator : Plugin { + fun openEditRoomAddress() +} + +class BackstackSecurityAndPrivacyNavigator( + private val backStack: BackStack +) : SecurityAndPrivacyNavigator { + override fun openEditRoomAddress() { + backStack.push(SecurityAndPrivacyFlowNode.NavTarget.EditRoomAddress) + } +} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNode.kt index 3a200cb24c..ed483e807e 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyNode.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode @@ -21,15 +22,18 @@ import io.element.android.libraries.di.RoomScope class SecurityAndPrivacyNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - private val presenter: SecurityAndPrivacyPresenter, + presenterFactory: SecurityAndPrivacyPresenter.Factory, ) : Node(buildContext, plugins = plugins) { + private val navigator = plugins().first() + private val presenter = presenterFactory.create(navigator) + @Composable override fun View(modifier: Modifier) { val state = presenter.present() SecurityAndPrivacyView( state = state, - onBackClick = ::navigateUp, + onBackClick = this::navigateUp, modifier = modifier ) } 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 901a3b4a4b..db4a99d37b 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 @@ -14,6 +14,9 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.MatrixClient @@ -21,12 +24,16 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule import java.util.Optional -import javax.inject.Inject -class SecurityAndPrivacyPresenter @Inject constructor() : Presenter { +class SecurityAndPrivacyPresenter @AssistedInject constructor( + @Assisted private val navigator: SecurityAndPrivacyNavigator, private val matrixClient: MatrixClient, private val room: MatrixRoom, ) : Presenter { + @AssistedFactory + interface Factory { + fun create(navigator: SecurityAndPrivacyNavigator): SecurityAndPrivacyPresenter + } @Composable override fun present(): SecurityAndPrivacyState { @@ -85,6 +92,7 @@ class SecurityAndPrivacyPresenter @Inject constructor() : Presenter { currentVisibleInRoomDirectory = Optional.of(AsyncData.Success(event.isVisibleInRoomDirectory)) } + SecurityAndPrivacyEvents.EditRoomAddress -> navigator.openEditRoomAddress() } } return SecurityAndPrivacyState( 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 540f81a80e..8f91f19942 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 @@ -85,7 +85,7 @@ fun SecurityAndPrivacyView( RoomAddressSection( roomAddress = state.currentSettings.formattedAddress, homeserverName = state.homeserverName, - onRoomAddressClick = { }, + onRoomAddressClick = { state.eventSink(SecurityAndPrivacyEvents.EditRoomAddress) }, isVisibleInPublicDirectory = state.currentSettings.isVisibleInRoomDirectory, onVisibilityChange = { isVisible -> state.eventSink(SecurityAndPrivacyEvents.ChangeRoomVisibility(isVisible))