From b2c68d555a828050e778ca5ffaadc2cfce9f208e Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 7 Mar 2023 20:31:16 +0100 Subject: [PATCH] [Architecture] introduce nodeBuilder concept --- .../io/element/android/x/di/AppBindings.kt | 2 +- .../android/appnav/LoggedInFlowNode.kt | 18 +++++++++++------- .../android/appnav/NotLoggedInFlowNode.kt | 7 +++++-- .../io/element/android/appnav/RoomFlowNode.kt | 6 +++--- .../io/element/android/appnav/RootFlowNode.kt | 11 +++++++---- .../appnav/{ => di}/MatrixClientsHolder.kt | 2 +- .../features/login/api/LoginEntryPoint.kt | 4 ++-- .../login/impl/DefaultLoginEntryPoint.kt | 5 ++--- .../features/login/impl/LoginFlowNode.kt | 1 - .../messages/api/MessagesEntryPoint.kt | 4 ++-- .../impl/DefaultMessagesEntryPoint.kt | 5 ++--- .../onboarding/api/OnBoardingEntryPoint.kt | 10 ++++++++++ .../impl/DefaultOnBoardingEntryPoint.kt | 16 ++++++++++++++-- .../preferences/api/PreferencesEntryPoint.kt | 12 +++++++++++- .../impl/DefaultPreferencesEntryPoint.kt | 14 ++++++++++++-- .../bugreport/BugReportEntryPoint.kt | 10 ++++++++++ .../bugreport/DefaultBugReportEntryPoint.kt | 16 ++++++++++++++-- .../roomlist/api/RoomListEntryPoint.kt | 10 ++++++++++ .../impl/DefaultRoomListEntryPoint.kt | 19 +++++++++++++++++-- .../roomlist/impl/RoomListPresenter.kt | 2 ++ .../features/roomlist/impl/RoomListState.kt | 1 + .../roomlist/impl/RoomListStateProvider.kt | 2 ++ .../features/roomlist/impl/RoomListView.kt | 1 + .../impl/components/RoomSummaryRow.kt | 4 ++-- .../impl/{ => model}/RoomListRoomSummary.kt | 2 +- .../RoomListRoomSummaryPlaceholders.kt | 2 +- .../RoomListRoomSummaryProvider.kt | 2 +- .../roomlist/RoomListPresenterTests.kt | 2 +- .../architecture/FeatureEntryPoint.kt | 7 ++++--- .../libraries/architecture/NodeInputs.kt | 15 +++------------ 30 files changed, 153 insertions(+), 59 deletions(-) rename appnav/src/main/kotlin/io/element/android/appnav/{ => di}/MatrixClientsHolder.kt (98%) rename features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/{ => model}/RoomListRoomSummary.kt (95%) rename features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/{ => model}/RoomListRoomSummaryPlaceholders.kt (95%) rename features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/{ => model}/RoomListRoomSummaryProvider.kt (96%) diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt index 1bdab0a6ac..9d5fa9446f 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -17,7 +17,7 @@ package io.element.android.x.di import com.squareup.anvil.annotations.ContributesTo -import io.element.android.appnav.MatrixClientsHolder +import io.element.android.appnav.di.MatrixClientsHolder import io.element.android.libraries.di.AppScope @ContributesTo(AppScope::class) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index d072870de3..a45eb5bb80 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -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() - val inputsProvider = nodeInputsProvider(RoomFlowNode.Inputs(room)) - createNode(buildContext, plugins = listOf(inputsProvider) + nodeLifecycleCallbacks) + val inputs = RoomFlowNode.Inputs(room) + createNode(buildContext, plugins = listOf(inputs) + nodeLifecycleCallbacks) } } NavTarget.Settings -> { @@ -145,7 +147,9 @@ class LoggedInFlowNode @AssistedInject constructor( plugins().forEach { it.onOpenBugReport() } } } - preferencesEntryPoint.node(this, buildContext, plugins = listOf(callback)) + preferencesEntryPoint.nodeBuilder(this, buildContext) + .callback(callback) + .build() } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index e3f135372c..3d99f03fa0 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -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) } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt index 7025617719..aa5a972de9 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt @@ -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) } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index 3baa775620..77f53e2498 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -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() - createNode(buildContext, plugins = listOf(inputsProvider, callback) + nodeLifecycleCallbacks) + createNode(buildContext, plugins = listOf(inputs, callback) + nodeLifecycleCallbacks) } NavTarget.NotLoggedInFlow -> createNode(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() } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/MatrixClientsHolder.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/MatrixClientsHolder.kt similarity index 98% rename from appnav/src/main/kotlin/io/element/android/appnav/MatrixClientsHolder.kt rename to appnav/src/main/kotlin/io/element/android/appnav/di/MatrixClientsHolder.kt index 0a96ad2c74..2e929b07e5 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/MatrixClientsHolder.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/MatrixClientsHolder.kt @@ -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 diff --git a/features/login/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt b/features/login/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt index 59fe87007d..0eac558ba5 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt @@ -16,6 +16,6 @@ package io.element.android.features.login.api -import io.element.android.libraries.architecture.FeatureEntryPoint +import io.element.android.libraries.architecture.SimpleFeatureEntryPoint -interface LoginEntryPoint : FeatureEntryPoint +interface LoginEntryPoint : SimpleFeatureEntryPoint diff --git a/features/login/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt b/features/login/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt index 721e95c466..64c30b7727 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt @@ -18,7 +18,6 @@ package io.element.android.features.login.impl import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.login.api.LoginEntryPoint import io.element.android.libraries.architecture.createNode @@ -27,7 +26,7 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultLoginEntryPoint @Inject constructor() : LoginEntryPoint { - override fun node(parentNode: Node, buildContext: BuildContext, plugins: List): Node { - return parentNode.createNode(buildContext, plugins) + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + return parentNode.createNode(buildContext) } } diff --git a/features/login/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index 75735f698f..dcdaf1a347 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.composable.Children import com.bumble.appyx.core.modality.BuildContext 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.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 3509df342b..718c5826e6 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -16,6 +16,6 @@ package io.element.android.features.messages.api -import io.element.android.libraries.architecture.FeatureEntryPoint +import io.element.android.libraries.architecture.SimpleFeatureEntryPoint -interface MessagesEntryPoint : FeatureEntryPoint +interface MessagesEntryPoint : SimpleFeatureEntryPoint diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt index 6545e3ac66..505cba1a7b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt @@ -18,7 +18,6 @@ package io.element.android.features.messages.impl import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.libraries.architecture.createNode @@ -27,7 +26,7 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultMessagesEntryPoint @Inject constructor() : MessagesEntryPoint { - override fun node(parentNode: Node, buildContext: BuildContext, plugins: List): Node { - return parentNode.createNode(buildContext, plugins) + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + return parentNode.createNode(buildContext) } } diff --git a/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt b/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt index 8c256547c3..7be45ce236 100644 --- a/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt +++ b/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt @@ -16,10 +16,20 @@ package io.element.android.features.onboarding.api +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface OnBoardingEntryPoint : FeatureEntryPoint { + + fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + + interface NodeBuilder { + fun callback(callback: Callback): NodeBuilder + fun build(): Node + } + interface Callback : Plugin { fun onSignUp() fun onSignIn() diff --git a/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/impl/DefaultOnBoardingEntryPoint.kt b/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/impl/DefaultOnBoardingEntryPoint.kt index 1475d18778..b5ce63116d 100644 --- a/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/impl/DefaultOnBoardingEntryPoint.kt +++ b/features/onboarding/src/main/kotlin/io/element/android/features/onboarding/impl/DefaultOnBoardingEntryPoint.kt @@ -27,7 +27,19 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultOnBoardingEntryPoint @Inject constructor() : OnBoardingEntryPoint { - override fun node(parentNode: Node, buildContext: BuildContext, plugins: List): Node { - return parentNode.createNode(buildContext, plugins) + override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): OnBoardingEntryPoint.NodeBuilder { + return object : OnBoardingEntryPoint.NodeBuilder { + + val plugins = ArrayList() + + override fun callback(callback: OnBoardingEntryPoint.Callback): OnBoardingEntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode(buildContext, plugins) + } + } } } diff --git a/features/preferences/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt b/features/preferences/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt index 1ed5fe3823..464ab2159f 100644 --- a/features/preferences/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt +++ b/features/preferences/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt @@ -16,10 +16,20 @@ package io.element.android.features.preferences.api +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint -interface PreferencesEntryPoint: FeatureEntryPoint { +interface PreferencesEntryPoint : FeatureEntryPoint { + + fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + + interface NodeBuilder { + fun callback(callback: Callback): NodeBuilder + fun build(): Node + } + interface Callback : Plugin { fun onOpenBugReport() } diff --git a/features/preferences/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt b/features/preferences/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt index 91ba3bf0a3..ac26d05255 100644 --- a/features/preferences/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt +++ b/features/preferences/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt @@ -27,7 +27,17 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultPreferencesEntryPoint @Inject constructor() : PreferencesEntryPoint { - override fun node(parentNode: Node, buildContext: BuildContext, plugins: List): Node { - return parentNode.createNode(buildContext, plugins) + override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): PreferencesEntryPoint.NodeBuilder { + return object : PreferencesEntryPoint.NodeBuilder { + val plugins = ArrayList() + override fun callback(callback: PreferencesEntryPoint.Callback): PreferencesEntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode(buildContext) + } + } } } diff --git a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/BugReportEntryPoint.kt b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/BugReportEntryPoint.kt index 46a3e3bbf4..955763b3cc 100644 --- a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/BugReportEntryPoint.kt +++ b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/BugReportEntryPoint.kt @@ -16,10 +16,20 @@ package io.element.android.features.rageshake.bugreport +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface BugReportEntryPoint : FeatureEntryPoint { + + fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + + interface NodeBuilder { + fun callback(callback: Callback): NodeBuilder + fun build(): Node + } + interface Callback : Plugin { fun onBugReportSent() } diff --git a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/DefaultBugReportEntryPoint.kt b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/DefaultBugReportEntryPoint.kt index 819a33ca72..e71f8a9511 100644 --- a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/DefaultBugReportEntryPoint.kt +++ b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/bugreport/DefaultBugReportEntryPoint.kt @@ -26,7 +26,19 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultBugReportEntryPoint @Inject constructor() : BugReportEntryPoint { - override fun node(parentNode: Node, buildContext: BuildContext, plugins: List): Node { - return parentNode.createNode(buildContext, plugins) + override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): BugReportEntryPoint.NodeBuilder { + + val plugins = ArrayList() + + return object : BugReportEntryPoint.NodeBuilder { + override fun callback(callback: BugReportEntryPoint.Callback): BugReportEntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode(buildContext) + } + } } } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt index 995da4498a..8cbb5186d5 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt @@ -16,13 +16,23 @@ package io.element.android.features.roomlist.api +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface RoomListEntryPoint : FeatureEntryPoint { + + fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + interface NodeBuilder { + fun callback(callback: Callback): NodeBuilder + fun build(): Node + } + interface Callback : Plugin { fun onRoomClicked(roomId: RoomId) fun onSettingsClicked() } } + diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt index 4a1e5d6a09..25016e7a2f 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt @@ -27,7 +27,22 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultRoomListEntryPoint @Inject constructor() : RoomListEntryPoint { - override fun node(parentNode: Node, buildContext: BuildContext, plugins: List): Node { - return parentNode.createNode(buildContext, plugins) + + override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomListEntryPoint.NodeBuilder { + + val plugins = ArrayList() + + return object : RoomListEntryPoint.NodeBuilder { + + override fun callback(callback: RoomListEntryPoint.Callback): RoomListEntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode(buildContext, plugins) + } + } } } + diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 964a0157a3..1ec5dc6bd2 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -25,6 +25,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue +import io.element.android.features.roomlist.impl.model.RoomListRoomSummary +import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.parallelMap import io.element.android.libraries.dateformatter.api.LastMessageFormatter diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt index 69e47a4250..6831c729d4 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt @@ -17,6 +17,7 @@ package io.element.android.features.roomlist.impl import androidx.compose.runtime.Immutable +import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.libraries.matrix.ui.model.MatrixUser import kotlinx.collections.immutable.ImmutableList diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index e057376363..4fdbf585b9 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -17,6 +17,8 @@ package io.element.android.features.roomlist.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.features.roomlist.impl.model.RoomListRoomSummary +import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.ui.model.MatrixUser diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 5e440e2274..92b450e8e1 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.Velocity import io.element.android.features.roomlist.impl.components.RoomListTopBar import io.element.android.features.roomlist.impl.components.RoomSummaryRow +import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Scaffold diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt index ebacfeb917..14d9ef9474 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt @@ -53,8 +53,8 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.google.accompanist.placeholder.material.placeholder -import io.element.android.features.roomlist.impl.RoomListRoomSummary -import io.element.android.features.roomlist.impl.RoomListRoomSummaryProvider +import io.element.android.features.roomlist.impl.model.RoomListRoomSummary +import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryProvider import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummary.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt similarity index 95% rename from features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummary.kt rename to features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt index bec3253bff..ca80dc513e 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummary.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.roomlist.impl +package io.element.android.features.roomlist.impl.model import androidx.compose.runtime.Immutable import io.element.android.libraries.designsystem.components.avatar.AvatarData diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummaryPlaceholders.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryPlaceholders.kt similarity index 95% rename from features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummaryPlaceholders.kt rename to features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryPlaceholders.kt index b81803f5a9..551f9ca8ba 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummaryPlaceholders.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryPlaceholders.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.roomlist.impl +package io.element.android.features.roomlist.impl.model import io.element.android.libraries.designsystem.components.avatar.AvatarData diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummaryProvider.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt similarity index 96% rename from features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummaryProvider.kt rename to features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt index c0f17f040d..082b8af048 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListRoomSummaryProvider.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.roomlist.impl +package io.element.android.features.roomlist.impl.model import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.designsystem.components.avatar.AvatarData diff --git a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt index efb5dd4d5e..30b4c8c893 100644 --- a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt +++ b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt @@ -24,7 +24,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.roomlist.impl.RoomListEvents import io.element.android.features.roomlist.impl.RoomListPresenter -import io.element.android.features.roomlist.impl.RoomListRoomSummary +import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.libraries.dateformatter.api.LastMessageFormatter import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.test.AN_AVATAR_URL diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt index 974d3d553c..711f780b22 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt @@ -18,8 +18,9 @@ package io.element.android.libraries.architecture import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin -interface FeatureEntryPoint { - fun node(parentNode: Node, buildContext: BuildContext, plugins: List = emptyList()): Node +interface FeatureEntryPoint + +interface SimpleFeatureEntryPoint : FeatureEntryPoint { + fun createNode(parentNode: Node, buildContext: BuildContext): Node } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeInputs.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeInputs.kt index d51c49c118..b96d9e166b 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeInputs.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeInputs.kt @@ -19,18 +19,9 @@ package io.element.android.libraries.architecture import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins -import kotlin.properties.ReadOnlyProperty -interface NodeInputs +interface NodeInputs : Plugin -interface NodeInputsProvider : Plugin { - fun inputs(): I -} - -inline fun nodeInputsProvider(inputs: I) = object : NodeInputsProvider { - override fun inputs() = inputs -} - -fun nodeInputs() = ReadOnlyProperty { thisRef, _ -> - thisRef.plugins>().first().inputs() +inline fun Node.inputs(): I { + return plugins().firstOrNull() ?: throw RuntimeException("Make sure to actually pass NodeInputs plugin to your node") }