[Architecture] introduce nodeBuilder concept

This commit is contained in:
ganfra
2023-03-07 20:31:16 +01:00
parent 4cff199446
commit b2c68d555a
30 changed files with 153 additions and 59 deletions

View File

@@ -42,8 +42,7 @@ import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler
import io.element.android.libraries.architecture.bindings
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.nodeInputs
import io.element.android.libraries.architecture.nodeInputsProvider
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.matrix.api.MatrixClient
@@ -80,7 +79,7 @@ class LoggedInFlowNode @AssistedInject constructor(
val matrixClient: MatrixClient
) : NodeInputs
private val inputs: Inputs by nodeInputs()
private val inputs: Inputs = inputs()
override fun onBuilt() {
super.onBuilt()
@@ -122,7 +121,10 @@ class LoggedInFlowNode @AssistedInject constructor(
backstack.push(NavTarget.Settings)
}
}
roomListEntryPoint.node(this, buildContext, plugins = listOf(callback))
roomListEntryPoint
.nodeBuilder(this, buildContext)
.callback(callback)
.build()
}
is NavTarget.Room -> {
val room = inputs.matrixClient.getRoom(roomId = navTarget.roomId)
@@ -135,8 +137,8 @@ class LoggedInFlowNode @AssistedInject constructor(
}
} else {
val nodeLifecycleCallbacks = plugins<NodeLifecycleCallback>()
val inputsProvider = nodeInputsProvider(RoomFlowNode.Inputs(room))
createNode<RoomFlowNode>(buildContext, plugins = listOf(inputsProvider) + nodeLifecycleCallbacks)
val inputs = RoomFlowNode.Inputs(room)
createNode<RoomFlowNode>(buildContext, plugins = listOf(inputs) + nodeLifecycleCallbacks)
}
}
NavTarget.Settings -> {
@@ -145,7 +147,9 @@ class LoggedInFlowNode @AssistedInject constructor(
plugins<Callback>().forEach { it.onOpenBugReport() }
}
}
preferencesEntryPoint.node(this, buildContext, plugins = listOf(callback))
preferencesEntryPoint.nodeBuilder(this, buildContext)
.callback(callback)
.build()
}
}
}

View File

@@ -78,10 +78,13 @@ class NotLoggedInFlowNode @AssistedInject constructor(
backstack.push(NavTarget.LoginFlow)
}
}
onBoardingEntryPoint.node(this, buildContext, plugins = listOf(callback))
onBoardingEntryPoint
.nodeBuilder(this, buildContext)
.callback(callback)
.build()
}
NavTarget.LoginFlow -> {
loginEntryPoint.node(this, buildContext)
loginEntryPoint.createNode(this, buildContext)
}
}
}

View File

@@ -32,7 +32,7 @@ import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.messages.api.MessagesEntryPoint
import io.element.android.libraries.architecture.BackstackNode
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.nodeInputs
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.room.MatrixRoom
import kotlinx.parcelize.Parcelize
@@ -61,7 +61,7 @@ class RoomFlowNode @AssistedInject constructor(
val room: MatrixRoom,
) : NodeInputs
private val inputs: Inputs by nodeInputs()
private val inputs: Inputs = inputs()
init {
lifecycle.subscribe(
@@ -79,7 +79,7 @@ class RoomFlowNode @AssistedInject constructor(
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
return when (navTarget) {
NavTarget.Messages -> {
messagesEntryPoint.node(this, buildContext)
messagesEntryPoint.createNode(this, buildContext)
}
}
}

View File

@@ -39,13 +39,13 @@ import com.bumble.appyx.navmodel.backstack.operation.push
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.appnav.di.MatrixClientsHolder
import io.element.android.appnav.root.RootPresenter
import io.element.android.appnav.root.RootView
import io.element.android.features.rageshake.bugreport.BugReportEntryPoint
import io.element.android.libraries.architecture.BackstackNode
import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.nodeInputsProvider
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
@@ -179,14 +179,14 @@ class RootFlowNode @AssistedInject constructor(
Timber.w("Couldn't find any session, go through SplashScreen")
backstack.newRoot(NavTarget.SplashScreen)
}
val inputsProvider = nodeInputsProvider(LoggedInFlowNode.Inputs(matrixClient))
val inputs = LoggedInFlowNode.Inputs(matrixClient)
val callback = object : LoggedInFlowNode.Callback {
override fun onOpenBugReport() {
backstack.push(NavTarget.BugReport)
}
}
val nodeLifecycleCallbacks = plugins<NodeLifecycleCallback>()
createNode<LoggedInFlowNode>(buildContext, plugins = listOf(inputsProvider, callback) + nodeLifecycleCallbacks)
createNode<LoggedInFlowNode>(buildContext, plugins = listOf(inputs, callback) + nodeLifecycleCallbacks)
}
NavTarget.NotLoggedInFlow -> createNode<NotLoggedInFlowNode>(buildContext)
NavTarget.SplashScreen -> splashNode(buildContext)
@@ -196,7 +196,10 @@ class RootFlowNode @AssistedInject constructor(
backstack.pop()
}
}
bugReportEntryPoint.node(this, buildContext, plugins = listOf(callback))
bugReportEntryPoint
.nodeBuilder(this, buildContext)
.callback(callback)
.build()
}
}
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.appnav
package io.element.android.appnav.di
import android.os.Bundle
import io.element.android.libraries.di.AppScope