feat(security&privacy) : introduce navigator
This commit is contained in:
parent
6e43c2d659
commit
5a37a2eeef
6 changed files with 46 additions and 7 deletions
|
|
@ -8,6 +8,7 @@
|
||||||
package io.element.android.features.roomdetails.impl.securityandprivacy
|
package io.element.android.features.roomdetails.impl.securityandprivacy
|
||||||
|
|
||||||
sealed interface SecurityAndPrivacyEvents {
|
sealed interface SecurityAndPrivacyEvents {
|
||||||
|
data object EditRoomAddress : SecurityAndPrivacyEvents
|
||||||
data object Save : SecurityAndPrivacyEvents
|
data object Save : SecurityAndPrivacyEvents
|
||||||
data class ChangeRoomAccess(val roomAccess: SecurityAndPrivacyRoomAccess) : SecurityAndPrivacyEvents
|
data class ChangeRoomAccess(val roomAccess: SecurityAndPrivacyRoomAccess) : SecurityAndPrivacyEvents
|
||||||
data object EnableEncryption: SecurityAndPrivacyEvents
|
data object EnableEncryption: SecurityAndPrivacyEvents
|
||||||
|
|
|
||||||
|
|
@ -45,13 +45,15 @@ class SecurityAndPrivacyFlowNode @AssistedInject constructor(
|
||||||
data object EditRoomAddress : NavTarget
|
data object EditRoomAddress : NavTarget
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val navigator = BackstackSecurityAndPrivacyNavigator(backstack)
|
||||||
|
|
||||||
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
||||||
return when (navTarget) {
|
return when (navTarget) {
|
||||||
NavTarget.SecurityAndPrivacy -> {
|
NavTarget.SecurityAndPrivacy -> {
|
||||||
createNode<SecurityAndPrivacyNode>(buildContext)
|
createNode<SecurityAndPrivacyNode>(buildContext, plugins = listOf(navigator))
|
||||||
}
|
}
|
||||||
NavTarget.EditRoomAddress -> {
|
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.modality.BuildContext
|
||||||
import com.bumble.appyx.core.node.Node
|
import com.bumble.appyx.core.node.Node
|
||||||
import com.bumble.appyx.core.plugin.Plugin
|
import com.bumble.appyx.core.plugin.Plugin
|
||||||
|
import com.bumble.appyx.core.plugin.plugins
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
|
|
@ -21,15 +22,18 @@ import io.element.android.libraries.di.RoomScope
|
||||||
class SecurityAndPrivacyNode @AssistedInject constructor(
|
class SecurityAndPrivacyNode @AssistedInject constructor(
|
||||||
@Assisted buildContext: BuildContext,
|
@Assisted buildContext: BuildContext,
|
||||||
@Assisted plugins: List<Plugin>,
|
@Assisted plugins: List<Plugin>,
|
||||||
private val presenter: SecurityAndPrivacyPresenter,
|
presenterFactory: SecurityAndPrivacyPresenter.Factory,
|
||||||
) : Node(buildContext, plugins = plugins) {
|
) : Node(buildContext, plugins = plugins) {
|
||||||
|
|
||||||
|
private val navigator = plugins<SecurityAndPrivacyNavigator>().first()
|
||||||
|
private val presenter = presenterFactory.create(navigator)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun View(modifier: Modifier) {
|
override fun View(modifier: Modifier) {
|
||||||
val state = presenter.present()
|
val state = presenter.present()
|
||||||
SecurityAndPrivacyView(
|
SecurityAndPrivacyView(
|
||||||
state = state,
|
state = state,
|
||||||
onBackClick = ::navigateUp,
|
onBackClick = this::navigateUp,
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,9 @@ import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
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.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
|
||||||
|
|
@ -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.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
|
||||||
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 matrixClient: MatrixClient,
|
||||||
private val room: MatrixRoom,
|
private val room: MatrixRoom,
|
||||||
) : Presenter<SecurityAndPrivacyState> {
|
) : Presenter<SecurityAndPrivacyState> {
|
||||||
|
@AssistedFactory
|
||||||
|
interface Factory {
|
||||||
|
fun create(navigator: SecurityAndPrivacyNavigator): SecurityAndPrivacyPresenter
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): SecurityAndPrivacyState {
|
override fun present(): SecurityAndPrivacyState {
|
||||||
|
|
@ -85,6 +92,7 @@ class SecurityAndPrivacyPresenter @Inject constructor() : Presenter<SecurityAndP
|
||||||
is SecurityAndPrivacyEvents.ChangeRoomVisibility -> {
|
is SecurityAndPrivacyEvents.ChangeRoomVisibility -> {
|
||||||
currentVisibleInRoomDirectory = Optional.of(AsyncData.Success(event.isVisibleInRoomDirectory))
|
currentVisibleInRoomDirectory = Optional.of(AsyncData.Success(event.isVisibleInRoomDirectory))
|
||||||
}
|
}
|
||||||
|
SecurityAndPrivacyEvents.EditRoomAddress -> navigator.openEditRoomAddress()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SecurityAndPrivacyState(
|
return SecurityAndPrivacyState(
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ fun SecurityAndPrivacyView(
|
||||||
RoomAddressSection(
|
RoomAddressSection(
|
||||||
roomAddress = state.currentSettings.formattedAddress,
|
roomAddress = state.currentSettings.formattedAddress,
|
||||||
homeserverName = state.homeserverName,
|
homeserverName = state.homeserverName,
|
||||||
onRoomAddressClick = { },
|
onRoomAddressClick = { state.eventSink(SecurityAndPrivacyEvents.EditRoomAddress) },
|
||||||
isVisibleInPublicDirectory = state.currentSettings.isVisibleInRoomDirectory,
|
isVisibleInPublicDirectory = state.currentSettings.isVisibleInRoomDirectory,
|
||||||
onVisibilityChange = { isVisible ->
|
onVisibilityChange = { isVisible ->
|
||||||
state.eventSink(SecurityAndPrivacyEvents.ChangeRoomVisibility(isVisible))
|
state.eventSink(SecurityAndPrivacyEvents.ChangeRoomVisibility(isVisible))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue