Ensure a Callback and only one is provided in the Plugin. Also reduce boilerplate code in Nodes.

This commit is contained in:
Benoit Marty 2025-10-30 09:14:41 +01:00 committed by Benoit Marty
parent 2e8785b36b
commit be03c50aaf
76 changed files with 374 additions and 741 deletions

View file

@ -21,13 +21,13 @@ import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.node.ParentNode
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.appnav.di.SessionGraphFactory
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.DependencyInjectionGraphOwner
@ -60,6 +60,8 @@ class LoggedInAppScopeFlowNode(
fun navigateToAddAccount()
}
private val callback: Callback = callback()
@Parcelize
object NavTarget : Parcelable
@ -82,11 +84,11 @@ class LoggedInAppScopeFlowNode(
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
val callback = object : LoggedInFlowNode.Callback {
override fun navigateToBugReport() {
plugins<Callback>().forEach { it.navigateToBugReport() }
callback.navigateToBugReport()
}
override fun navigateToAddAccount() {
plugins<Callback>().forEach { it.navigateToAddAccount() }
callback.navigateToAddAccount()
}
}
return createNode<LoggedInFlowNode>(buildContext, listOf(callback))

View file

@ -24,7 +24,6 @@ import com.bumble.appyx.core.navigation.NavKey
import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.BackStack.State.ACTIVE
import com.bumble.appyx.navmodel.backstack.BackStack.State.CREATED
@ -67,6 +66,7 @@ import io.element.android.features.userprofile.api.UserProfileEntryPoint
import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.waitForChildAttached
import io.element.android.libraries.architecture.waitForNavTargetAttached
@ -152,6 +152,7 @@ class LoggedInFlowNode(
fun navigateToAddAccount()
}
private val callback: Callback = callback()
private val loggedInFlowProcessor = LoggedInEventProcessor(
snackbarDispatcher = snackbarDispatcher,
roomMembershipObserver = matrixClient.roomMembershipObserver,
@ -329,7 +330,7 @@ class LoggedInFlowNode(
}
override fun navigateToBugReport() {
plugins<Callback>().forEach { it.navigateToBugReport() }
callback.navigateToBugReport()
}
}
homeEntryPoint
@ -396,11 +397,11 @@ class LoggedInFlowNode(
is NavTarget.Settings -> {
val callback = object : PreferencesEntryPoint.Callback {
override fun navigateToAddAccount() {
plugins<Callback>().forEach { it.navigateToAddAccount() }
callback.navigateToAddAccount()
}
override fun navigateToBugReport() {
plugins<Callback>().forEach { it.navigateToBugReport() }
callback.navigateToAddAccount()
}
override fun navigateToSecureBackup() {

View file

@ -18,7 +18,6 @@ import com.bumble.appyx.core.lifecycle.subscribe
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 com.bumble.appyx.navmodel.backstack.BackStack
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Assisted
@ -29,6 +28,7 @@ import io.element.android.features.login.api.LoginParams
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.designsystem.utils.ForceOrientationInMobileDevices
import io.element.android.libraries.designsystem.utils.ScreenOrientation
@ -58,6 +58,7 @@ class NotLoggedInFlowNode(
fun navigateToBugReport()
}
private val callback: Callback = callback()
private val inputs = inputs<Params>()
override fun onBuilt() {
@ -79,7 +80,7 @@ class NotLoggedInFlowNode(
NavTarget.Root -> {
val callback = object : LoginEntryPoint.Callback {
override fun navigateToBugReport() {
plugins<Callback>().forEach { it.navigateToBugReport() }
callback.navigateToBugReport()
}
}
loginEntryPoint

View file

@ -12,10 +12,10 @@ 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 dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.di.SessionScope
@ContributesNode(SessionScope::class)
@ -32,18 +32,14 @@ class LoggedInNode(
fun navigateToNotificationTroubleshoot()
}
private fun navigateToNotificationTroubleshoot() {
plugins<Callback>().forEach {
it.navigateToNotificationTroubleshoot()
}
}
private val callback: Callback = callback()
@Composable
override fun View(modifier: Modifier) {
val loggedInState = loggedInPresenter.present()
LoggedInView(
state = loggedInState,
navigateToNotificationTroubleshoot = ::navigateToNotificationTroubleshoot,
navigateToNotificationTroubleshoot = callback::navigateToNotificationTroubleshoot,
modifier = modifier
)
}

View file

@ -31,6 +31,7 @@ import io.element.android.features.space.api.SpaceEntryPoint
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.architecture.waitForChildAttached
import io.element.android.libraries.di.DependencyInjectionGraphOwner
@ -87,7 +88,7 @@ class JoinedRoomLoadedFlowNode(
) : NodeInputs
private val inputs: Inputs = inputs()
private val callbacks = plugins.filterIsInstance<Callback>()
private val callback: Callback = callback()
override val graph = roomGraphFactory.create(inputs.room)
init {
@ -124,15 +125,15 @@ class JoinedRoomLoadedFlowNode(
private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node {
val callback = object : RoomDetailsEntryPoint.Callback {
override fun navigateToGlobalNotificationSettings() {
callbacks.forEach { it.navigateToGlobalNotificationSettings() }
callback.navigateToGlobalNotificationSettings()
}
override fun navigateToRoom(roomId: RoomId, serverNames: List<String>) {
callbacks.forEach { it.navigateToRoom(roomId, serverNames) }
callback.navigateToRoom(roomId, serverNames)
}
override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) {
callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack) }
callback.handlePermalinkClick(data, pushToBackstack)
}
override fun startForwardEventFlow(eventId: EventId) {
@ -172,7 +173,7 @@ class JoinedRoomLoadedFlowNode(
override fun onDone(roomIds: List<RoomId>) {
backstack.pop()
roomIds.singleOrNull()?.let { roomId ->
callbacks.forEach { it.navigateToRoom(roomId, emptyList()) }
callback.navigateToRoom(roomId, emptyList())
}
}
}
@ -187,7 +188,7 @@ class JoinedRoomLoadedFlowNode(
private fun createSpaceNode(buildContext: BuildContext): Node {
val callback = object : SpaceEntryPoint.Callback {
override fun navigateToRoom(roomId: RoomId, viaParameters: List<String>) {
callbacks.forEach { it.navigateToRoom(roomId, viaParameters) }
callback.navigateToRoom(roomId, viaParameters)
}
override fun navigateToRoomDetails() {
@ -218,7 +219,7 @@ class JoinedRoomLoadedFlowNode(
}
override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) {
callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack) }
callback.handlePermalinkClick(data, pushToBackstack)
}
override fun forwardEvent(eventId: EventId) {
@ -226,7 +227,7 @@ class JoinedRoomLoadedFlowNode(
}
override fun navigateToRoom(roomId: RoomId) {
callbacks.forEach { it.navigateToRoom(roomId, emptyList()) }
callback.navigateToRoom(roomId, emptyList())
}
}
val params = MessagesEntryPoint.Params(