feat(security&privacy) : introduce navigator
This commit is contained in:
parent
c391b5b892
commit
129eb45c68
6 changed files with 46 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue