From 2907cef47e28ab56152c97f16fb7517acd54508a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 1 Sep 2025 16:11:10 +0200 Subject: [PATCH] Some cleanup: - Remove unnecessary `GlobalScope`. - Rename `Component` to `Graph`, `DaggerComponentOwner` to `DependencyInjectionGraphOwner`. - Rename component builders to factories, where necessary. --- .../element/android/x/ElementXApplication.kt | 11 +++-- .../kotlin/io/element/android/x/MainNode.kt | 6 +-- .../x/di/{AppComponent.kt => AppGraph.kt} | 14 +++---- .../x/di/DefaultRoomComponentFactory.kt | 4 +- ...ctory.kt => DefaultSessionGraphFactory.kt} | 10 ++--- .../io/element/android/x/di/GlobalGraph.kt | 16 -------- .../io/element/android/x/di/GlobalScope.kt | 10 ----- .../x/di/{RoomComponent.kt => RoomGraph.kt} | 4 +- .../{SessionComponent.kt => SessionGraph.kt} | 6 +-- .../appnav/LoggedInAppScopeFlowNode.kt | 10 ++--- ...onentFactory.kt => SessionGraphFactory.kt} | 2 +- .../room/joined/JoinedRoomLoadedFlowNode.kt | 6 +-- .../impl/ChangeRoomMemberRolesRootNode.kt | 6 +-- ...eLoginComponent.kt => QrCodeLoginGraph.kt} | 4 +- .../login/impl/qrcode/QrCodeLoginFlowNode.kt | 10 ++--- .../impl/di/FakeMergedQrCodeLoginComponent.kt | 40 ------------------ .../login/impl/di/FakeQrCodeLoginGraph.kt | 41 +++++++++++++++++++ .../impl/qrcode/QrCodeLoginFlowNodeTest.kt | 4 +- .../libraries/architecture/Bindings.kt | 14 +++---- ...er.kt => DependencyInjectionGraphOwner.kt} | 8 ++-- 20 files changed, 99 insertions(+), 127 deletions(-) rename app/src/main/kotlin/io/element/android/x/di/{AppComponent.kt => AppGraph.kt} (65%) rename app/src/main/kotlin/io/element/android/x/di/{DefaultSessionComponentFactory.kt => DefaultSessionGraphFactory.kt} (66%) delete mode 100644 app/src/main/kotlin/io/element/android/x/di/GlobalGraph.kt delete mode 100644 app/src/main/kotlin/io/element/android/x/di/GlobalScope.kt rename app/src/main/kotlin/io/element/android/x/di/{RoomComponent.kt => RoomGraph.kt} (92%) rename app/src/main/kotlin/io/element/android/x/di/{SessionComponent.kt => SessionGraph.kt} (78%) rename appnav/src/main/kotlin/io/element/android/appnav/di/{SessionComponentFactory.kt => SessionGraphFactory.kt} (90%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/{QrCodeLoginComponent.kt => QrCodeLoginGraph.kt} (85%) create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeQrCodeLoginGraph.kt rename libraries/di/src/main/kotlin/io/element/android/libraries/di/{DaggerComponentOwner.kt => DependencyInjectionGraphOwner.kt} (55%) diff --git a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt index 7ce488056c..a075929552 100644 --- a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt +++ b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt @@ -9,17 +9,16 @@ package io.element.android.x import android.app.Application import androidx.startup.AppInitializer -import dev.zacsweers.metro.asContribution +import dev.zacsweers.metro.createGraphFactory import io.element.android.features.cachecleaner.api.CacheCleanerInitializer -import io.element.android.libraries.di.DaggerComponentOwner -import io.element.android.x.di.AppComponent -import io.element.android.x.di.globalGraph +import io.element.android.libraries.di.DependencyInjectionGraphOwner +import io.element.android.x.di.AppGraph import io.element.android.x.info.logApplicationInfo import io.element.android.x.initializer.CrashInitializer import io.element.android.x.initializer.PlatformInitializer -class ElementXApplication : Application(), DaggerComponentOwner { - override val daggerComponent: AppComponent = globalGraph.asContribution().create(this) +class ElementXApplication : Application(), DependencyInjectionGraphOwner { + override val graph: AppGraph = createGraphFactory().create(this) override fun onCreate() { super.onCreate() diff --git a/app/src/main/kotlin/io/element/android/x/MainNode.kt b/app/src/main/kotlin/io/element/android/x/MainNode.kt index e8511252d2..52668ff3a4 100644 --- a/app/src/main/kotlin/io/element/android/x/MainNode.kt +++ b/app/src/main/kotlin/io/element/android/x/MainNode.kt @@ -21,7 +21,7 @@ import com.bumble.appyx.core.node.ParentNode import com.bumble.appyx.core.plugin.Plugin import io.element.android.appnav.RootFlowNode import io.element.android.libraries.architecture.createNode -import io.element.android.libraries.di.DaggerComponentOwner +import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.di.annotations.ApplicationContext import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize @@ -38,8 +38,8 @@ class MainNode( buildContext = buildContext, plugins = plugins, ), - DaggerComponentOwner { - override val daggerComponent = (context as DaggerComponentOwner).daggerComponent + DependencyInjectionGraphOwner { + override val graph = (context as DependencyInjectionGraphOwner).graph override fun resolve(navTarget: RootNavTarget, buildContext: BuildContext): Node { return createNode(buildContext = buildContext) diff --git a/app/src/main/kotlin/io/element/android/x/di/AppComponent.kt b/app/src/main/kotlin/io/element/android/x/di/AppGraph.kt similarity index 65% rename from app/src/main/kotlin/io/element/android/x/di/AppComponent.kt rename to app/src/main/kotlin/io/element/android/x/di/AppGraph.kt index e56e10f87f..195265a99c 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppComponent.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppGraph.kt @@ -9,22 +9,20 @@ package io.element.android.x.di import android.content.Context import dev.zacsweers.metro.AppScope -import dev.zacsweers.metro.ContributesTo -import dev.zacsweers.metro.GraphExtension +import dev.zacsweers.metro.DependencyGraph import dev.zacsweers.metro.Provides import io.element.android.libraries.architecture.NodeFactoriesBindings import io.element.android.libraries.di.annotations.ApplicationContext -@GraphExtension(AppScope::class) -interface AppComponent : NodeFactoriesBindings { - val sessionComponentFactory: SessionComponent.Factory +@DependencyGraph(AppScope::class) +interface AppGraph : NodeFactoriesBindings { + val sessionGraphFactory: SessionGraph.Factory - @ContributesTo(GlobalScope::class) - @GraphExtension.Factory + @DependencyGraph.Factory interface Factory { fun create( @ApplicationContext @Provides context: Context - ): AppComponent + ): AppGraph } } diff --git a/app/src/main/kotlin/io/element/android/x/di/DefaultRoomComponentFactory.kt b/app/src/main/kotlin/io/element/android/x/di/DefaultRoomComponentFactory.kt index 8198d9a0ac..8bba1dd50b 100644 --- a/app/src/main/kotlin/io/element/android/x/di/DefaultRoomComponentFactory.kt +++ b/app/src/main/kotlin/io/element/android/x/di/DefaultRoomComponentFactory.kt @@ -16,10 +16,10 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom @ContributesBinding(SessionScope::class) @Inject class DefaultRoomComponentFactory( - private val sessionComponent: SessionComponent, + private val sessionGraph: SessionGraph, ) : RoomComponentFactory { override fun create(room: JoinedRoom): Any { - return sessionComponent.roomComponentFactory + return sessionGraph.roomGraphFactory .create(room, room) } } diff --git a/app/src/main/kotlin/io/element/android/x/di/DefaultSessionComponentFactory.kt b/app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt similarity index 66% rename from app/src/main/kotlin/io/element/android/x/di/DefaultSessionComponentFactory.kt rename to app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt index 9eb2df16b4..632e4dd32d 100644 --- a/app/src/main/kotlin/io/element/android/x/di/DefaultSessionComponentFactory.kt +++ b/app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt @@ -10,15 +10,15 @@ package io.element.android.x.di import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject -import io.element.android.appnav.di.SessionComponentFactory +import io.element.android.appnav.di.SessionGraphFactory import io.element.android.libraries.matrix.api.MatrixClient @ContributesBinding(AppScope::class) @Inject -class DefaultSessionComponentFactory( - private val appComponent: AppComponent -) : SessionComponentFactory { +class DefaultSessionGraphFactory( + private val appGraph: AppGraph +) : SessionGraphFactory { override fun create(client: MatrixClient): Any { - return appComponent.sessionComponentFactory.createSessionComponent(client) + return appGraph.sessionGraphFactory.create(client) } } diff --git a/app/src/main/kotlin/io/element/android/x/di/GlobalGraph.kt b/app/src/main/kotlin/io/element/android/x/di/GlobalGraph.kt deleted file mode 100644 index 81d38f72f4..0000000000 --- a/app/src/main/kotlin/io/element/android/x/di/GlobalGraph.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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.x.di - -import dev.zacsweers.metro.DependencyGraph -import dev.zacsweers.metro.createGraph - -@DependencyGraph(GlobalScope::class) -interface GlobalGraph - -internal val globalGraph = createGraph() diff --git a/app/src/main/kotlin/io/element/android/x/di/GlobalScope.kt b/app/src/main/kotlin/io/element/android/x/di/GlobalScope.kt deleted file mode 100644 index 4340f501fd..0000000000 --- a/app/src/main/kotlin/io/element/android/x/di/GlobalScope.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * 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.x.di - -class GlobalScope private constructor() diff --git a/app/src/main/kotlin/io/element/android/x/di/RoomComponent.kt b/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt similarity index 92% rename from app/src/main/kotlin/io/element/android/x/di/RoomComponent.kt rename to app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt index eb23e5c714..e452bc2a9f 100644 --- a/app/src/main/kotlin/io/element/android/x/di/RoomComponent.kt +++ b/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt @@ -17,13 +17,13 @@ import io.element.android.libraries.matrix.api.room.BaseRoom import io.element.android.libraries.matrix.api.room.JoinedRoom @GraphExtension(RoomScope::class) -interface RoomComponent : NodeFactoriesBindings { +interface RoomGraph : NodeFactoriesBindings { @ContributesTo(SessionScope::class) @GraphExtension.Factory interface Factory { fun create( @Provides joinedRoom: JoinedRoom, @Provides baseRoom: BaseRoom - ): RoomComponent + ): RoomGraph } } diff --git a/app/src/main/kotlin/io/element/android/x/di/SessionComponent.kt b/app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt similarity index 78% rename from app/src/main/kotlin/io/element/android/x/di/SessionComponent.kt rename to app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt index 1c3b89f42f..255c6c7ab9 100644 --- a/app/src/main/kotlin/io/element/android/x/di/SessionComponent.kt +++ b/app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt @@ -16,12 +16,12 @@ import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient @GraphExtension(SessionScope::class) -interface SessionComponent : NodeFactoriesBindings { - val roomComponentFactory: RoomComponent.Factory +interface SessionGraph : NodeFactoriesBindings { + val roomGraphFactory: RoomGraph.Factory @ContributesTo(AppScope::class) @GraphExtension.Factory interface Factory { - fun createSessionComponent(@Provides matrixClient: MatrixClient): SessionComponent + fun create(@Provides matrixClient: MatrixClient): SessionGraph } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt index 7b5f85f521..5ce1a4558d 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt @@ -26,11 +26,11 @@ import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Inject import io.element.android.anvilannotations.ContributesNode -import io.element.android.appnav.di.SessionComponentFactory +import io.element.android.appnav.di.SessionGraphFactory import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs -import io.element.android.libraries.di.DaggerComponentOwner +import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder import kotlinx.parcelize.Parcelize @@ -45,7 +45,7 @@ import kotlinx.parcelize.Parcelize class LoggedInAppScopeFlowNode( @Assisted buildContext: BuildContext, @Assisted plugins: List, - sessionComponentFactory: SessionComponentFactory, + sessionGraphFactory: SessionGraphFactory, private val imageLoaderHolder: ImageLoaderHolder, ) : ParentNode( navModel = PermanentNavModel( @@ -54,7 +54,7 @@ class LoggedInAppScopeFlowNode( ), buildContext = buildContext, plugins = plugins -), DaggerComponentOwner { +), DependencyInjectionGraphOwner { interface Callback : Plugin { fun onOpenBugReport() } @@ -67,7 +67,7 @@ class LoggedInAppScopeFlowNode( ) : NodeInputs private val inputs: Inputs = inputs() - override val daggerComponent = sessionComponentFactory.create(inputs.matrixClient) + override val graph = sessionGraphFactory.create(inputs.matrixClient) override fun onBuilt() { super.onBuilt() diff --git a/appnav/src/main/kotlin/io/element/android/appnav/di/SessionComponentFactory.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt similarity index 90% rename from appnav/src/main/kotlin/io/element/android/appnav/di/SessionComponentFactory.kt rename to appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt index 8800043b28..788a1633df 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/di/SessionComponentFactory.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt @@ -9,6 +9,6 @@ package io.element.android.appnav.di import io.element.android.libraries.matrix.api.MatrixClient -interface SessionComponentFactory { +interface SessionGraphFactory { fun create(client: MatrixClient): Any } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt index 49d9d79a0e..e2726570d8 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt @@ -28,7 +28,7 @@ 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.inputs -import io.element.android.libraries.di.DaggerComponentOwner +import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.di.SessionScope import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.MatrixClient @@ -68,7 +68,7 @@ class JoinedRoomLoadedFlowNode( ), buildContext = buildContext, plugins = plugins, -), DaggerComponentOwner { +), DependencyInjectionGraphOwner { interface Callback : Plugin { fun onOpenRoom(roomId: RoomId, serverNames: List) fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) @@ -83,7 +83,7 @@ class JoinedRoomLoadedFlowNode( private val inputs: Inputs = inputs() private val callbacks = plugins.filterIsInstance() - override val daggerComponent = roomComponentFactory.create(inputs.room) + override val graph = roomComponentFactory.create(inputs.room) init { lifecycle.subscribe( diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt index 257558359a..21ea83a782 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt @@ -25,7 +25,7 @@ import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRole import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs -import io.element.android.libraries.di.DaggerComponentOwner +import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.JoinedRoom @@ -44,7 +44,7 @@ class ChangeRoomMemberRolesRootNode( ), buildContext = buildContext, plugins = plugins, -), DaggerComponentOwner, ChangeRoomMemberRolesEntryPoint.NodeProxy { +), DependencyInjectionGraphOwner, ChangeRoomMemberRolesEntryPoint.NodeProxy { sealed interface NavTarget : Parcelable { @Parcelize object Root : NavTarget @@ -57,7 +57,7 @@ class ChangeRoomMemberRolesRootNode( private val inputs = inputs() - override val daggerComponent = roomComponentFactory.create(inputs.joinedRoom) + override val graph = roomComponentFactory.create(inputs.joinedRoom) override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginComponent.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginGraph.kt similarity index 85% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginComponent.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginGraph.kt index e3d8ad0317..12400f97ec 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginComponent.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginGraph.kt @@ -13,10 +13,10 @@ import dev.zacsweers.metro.GraphExtension import io.element.android.libraries.architecture.NodeFactoriesBindings @GraphExtension(QrCodeLoginScope::class) -interface QrCodeLoginComponent : NodeFactoriesBindings { +interface QrCodeLoginGraph : NodeFactoriesBindings { @ContributesTo(AppScope::class) @GraphExtension.Factory interface Factory { - fun create(): QrCodeLoginComponent + fun create(): QrCodeLoginGraph } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt index 01a11ac638..b5e6dcdebf 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt @@ -26,7 +26,7 @@ import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Inject import io.element.android.anvilannotations.ContributesNode import io.element.android.features.login.impl.di.QrCodeLoginBindings -import io.element.android.features.login.impl.di.QrCodeLoginComponent +import io.element.android.features.login.impl.di.QrCodeLoginGraph import io.element.android.features.login.impl.screens.qrcode.confirmation.QrCodeConfirmationNode import io.element.android.features.login.impl.screens.qrcode.confirmation.QrCodeConfirmationStep import io.element.android.features.login.impl.screens.qrcode.error.QrCodeErrorNode @@ -38,7 +38,7 @@ import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.bindings import io.element.android.libraries.architecture.createNode import io.element.android.libraries.core.coroutine.CoroutineDispatchers -import io.element.android.libraries.di.DaggerComponentOwner +import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep import io.element.android.libraries.matrix.api.auth.qrlogin.QrLoginException @@ -53,7 +53,7 @@ import timber.log.Timber class QrCodeLoginFlowNode( @Assisted buildContext: BuildContext, @Assisted plugins: List, - qrCodeLoginComponentBuilder: QrCodeLoginComponent.Factory, + qrCodeLoginGraphFactory: QrCodeLoginGraph.Factory, private val coroutineDispatchers: CoroutineDispatchers, ) : BaseFlowNode( backstack = BackStack( @@ -62,10 +62,10 @@ class QrCodeLoginFlowNode( ), buildContext = buildContext, plugins = plugins, -), DaggerComponentOwner { +), DependencyInjectionGraphOwner { private var authenticationJob: Job? = null - override val daggerComponent = qrCodeLoginComponentBuilder.create() + override val graph = qrCodeLoginGraphFactory.create() private val qrCodeLoginManager by lazy { bindings().qrCodeLoginManager() } sealed interface NavTarget : Parcelable { diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeMergedQrCodeLoginComponent.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeMergedQrCodeLoginComponent.kt index e9ebee2f5b..e69de29bb2 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeMergedQrCodeLoginComponent.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeMergedQrCodeLoginComponent.kt @@ -1,40 +0,0 @@ -/* - * Copyright 2024 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.login.impl.di - -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.features.login.impl.qrcode.FakeQrCodeLoginManager -import io.element.android.features.login.impl.qrcode.QrCodeLoginFlowNode -import io.element.android.features.login.impl.qrcode.QrCodeLoginManager -import io.element.android.libraries.architecture.AssistedNodeFactory -import io.element.android.libraries.architecture.createNode - -internal class FakeMergedQrCodeLoginComponent(private val qrCodeLoginManager: QrCodeLoginManager) : - MergedQrCodeLoginComponent { - // Ignore this error, it does override a method once code generation is done - override fun qrCodeLoginManager(): QrCodeLoginManager = qrCodeLoginManager - - class Builder(private val qrCodeLoginManager: QrCodeLoginManager = FakeQrCodeLoginManager()) : - QrCodeLoginComponent.Factory { - override fun create(): QrCodeLoginComponent { - return FakeMergedQrCodeLoginComponent(qrCodeLoginManager) - } - } - - override fun nodeFactories(): Map, AssistedNodeFactory<*>> { - return mapOf( - QrCodeLoginFlowNode::class.java to object : AssistedNodeFactory { - override fun create(buildContext: BuildContext, plugins: List): QrCodeLoginFlowNode { - return createNode(buildContext, plugins) - } - } - ) - } -} diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeQrCodeLoginGraph.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeQrCodeLoginGraph.kt new file mode 100644 index 0000000000..640a103f93 --- /dev/null +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeQrCodeLoginGraph.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2024 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.login.impl.di + +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.features.login.impl.qrcode.FakeQrCodeLoginManager +import io.element.android.features.login.impl.qrcode.QrCodeLoginFlowNode +import io.element.android.features.login.impl.qrcode.QrCodeLoginManager +import io.element.android.libraries.architecture.AssistedNodeFactory +import io.element.android.libraries.architecture.createNode + +internal class FakeQrCodeLoginGraph( + private val qrCodeLoginManager: QrCodeLoginManager, +) : QrCodeLoginGraph, QrCodeLoginBindings { + override fun nodeFactories(): Map, AssistedNodeFactory<*>> { + return mapOf( + QrCodeLoginFlowNode::class to object : AssistedNodeFactory { + override fun create(buildContext: BuildContext, plugins: List): QrCodeLoginFlowNode { + return createNode(buildContext, plugins) + } + } + ) + } + + override fun qrCodeLoginManager(): QrCodeLoginManager = qrCodeLoginManager + + internal class Builder( + private val qrCodeLoginManager: QrCodeLoginManager, + ) : QrCodeLoginComponent.Factory { + override fun create(): QrCodeLoginComponent { + return FakeQrCodeLoginComponent(qrCodeLoginManager) + } + } +} diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNodeTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNodeTest.kt index c90a2d16b3..da2cc8a139 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNodeTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNodeTest.kt @@ -12,7 +12,7 @@ import com.bumble.appyx.core.modality.AncestryInfo import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.utils.customisations.NodeCustomisationDirectoryImpl import com.google.common.truth.Truth.assertThat -import io.element.android.features.login.impl.di.FakeMergedQrCodeLoginComponent +import io.element.android.features.login.impl.di.FakeQrCodeLoginGraph import io.element.android.features.login.impl.screens.qrcode.confirmation.QrCodeConfirmationStep import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep @@ -183,7 +183,7 @@ class QrCodeLoginFlowNodeTest { return QrCodeLoginFlowNode( buildContext = buildContext, plugins = emptyList(), - qrCodeLoginComponentBuilder = FakeMergedQrCodeLoginComponent.Builder(qrCodeLoginManager), + qrCodeLoginGraphFactory = FakeQrCodeLoginGraph.Builder(qrCodeLoginManager), coroutineDispatchers = coroutineDispatchers, ) } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Bindings.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Bindings.kt index 0c922729fc..12fa4c8bd9 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Bindings.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Bindings.kt @@ -10,7 +10,7 @@ package io.element.android.libraries.architecture import android.content.Context import android.content.ContextWrapper import com.bumble.appyx.core.node.Node -import io.element.android.libraries.di.DaggerComponentOwner +import io.element.android.libraries.di.DependencyInjectionGraphOwner inline fun Node.optionalBindings() = optionalBindings(T::class.java) inline fun Node.bindings() = bindings(T::class.java) @@ -20,9 +20,9 @@ fun Context.bindings(klass: Class): T { // search dagger components in the context hierarchy return generateSequence(this) { (it as? ContextWrapper)?.baseContext } .plus(applicationContext) - .filterIsInstance() - .map { it.daggerComponent } - .flatMap { if (it is Collection<*>) it else listOf(it) } + .filterIsInstance() + .map { it.graph } + .flatMap { it as? Collection<*> ?: listOf(it) } .filterIsInstance(klass) .firstOrNull() ?: error("Unable to find bindings for ${klass.name}") @@ -31,9 +31,9 @@ fun Context.bindings(klass: Class): T { fun Node.optionalBindings(klass: Class): T? { // search dagger components in node hierarchy return generateSequence(this, Node::parent) - .filterIsInstance() - .map { it.daggerComponent } - .flatMap { if (it is Collection<*>) it else listOf(it) } + .filterIsInstance() + .map { it.graph } + .flatMap { it as? Collection<*> ?: listOf(it) } .filterIsInstance(klass) .firstOrNull() } diff --git a/libraries/di/src/main/kotlin/io/element/android/libraries/di/DaggerComponentOwner.kt b/libraries/di/src/main/kotlin/io/element/android/libraries/di/DependencyInjectionGraphOwner.kt similarity index 55% rename from libraries/di/src/main/kotlin/io/element/android/libraries/di/DaggerComponentOwner.kt rename to libraries/di/src/main/kotlin/io/element/android/libraries/di/DependencyInjectionGraphOwner.kt index 0d7a398a6e..f1466d924f 100644 --- a/libraries/di/src/main/kotlin/io/element/android/libraries/di/DaggerComponentOwner.kt +++ b/libraries/di/src/main/kotlin/io/element/android/libraries/di/DependencyInjectionGraphOwner.kt @@ -8,10 +8,10 @@ package io.element.android.libraries.di /** - * A [DaggerComponentOwner] is anything that "owns" a Dagger Component. + * A [DependencyInjectionGraphOwner] is anything that "owns" a DI Graph. * */ -interface DaggerComponentOwner { - /** This is either a component, or a list of components. */ - val daggerComponent: Any +interface DependencyInjectionGraphOwner { + /** This is either a graph, or a list of graphs. */ + val graph: Any }