feat(security&privacy) : introduce navigator

This commit is contained in:
ganfra 2025-01-21 20:38:43 +01:00
parent c391b5b892
commit 129eb45c68
6 changed files with 46 additions and 7 deletions

View file

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

View file

@ -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<SecurityAndPrivacyNode>(buildContext)
createNode<SecurityAndPrivacyNode>(buildContext, plugins = listOf(navigator))
}
NavTarget.EditRoomAddress -> {
createNode<EditRoomAddressNode>(buildContext)
createNode<EditRoomAddressNode>(buildContext, plugins = listOf(navigator))
}
}
}

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
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<SecurityAndPrivacyFlowNode.NavTarget>
) : SecurityAndPrivacyNavigator {
override fun openEditRoomAddress() {
backStack.push(SecurityAndPrivacyFlowNode.NavTarget.EditRoomAddress)
}
}

View file

@ -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<Plugin>,
private val presenter: SecurityAndPrivacyPresenter,
presenterFactory: SecurityAndPrivacyPresenter.Factory,
) : Node(buildContext, plugins = plugins) {
private val navigator = plugins<SecurityAndPrivacyNavigator>().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
)
}

View file

@ -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<SecurityAndPrivacyState> {
class SecurityAndPrivacyPresenter @AssistedInject constructor(
@Assisted private val navigator: SecurityAndPrivacyNavigator,
private val matrixClient: MatrixClient,
private val room: MatrixRoom,
) : Presenter<SecurityAndPrivacyState> {
@AssistedFactory
interface Factory {
fun create(navigator: SecurityAndPrivacyNavigator): SecurityAndPrivacyPresenter
}
@Composable
override fun present(): SecurityAndPrivacyState {
@ -85,6 +92,7 @@ class SecurityAndPrivacyPresenter @Inject constructor() : Presenter<SecurityAndP
is SecurityAndPrivacyEvents.ChangeRoomVisibility -> {
currentVisibleInRoomDirectory = Optional.of(AsyncData.Success(event.isVisibleInRoomDirectory))
}
SecurityAndPrivacyEvents.EditRoomAddress -> navigator.openEditRoomAddress()
}
}
return SecurityAndPrivacyState(

View file

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