Skip to content

Commit 6ccd98a

Browse files
committed
Use MainScope() for the UI scope
Use the `MainScope()` provided by the coroutine library as UI scope instead of creating our own scope. The `MainScope` is the better default, available in KMP by default and removes the dependency on kotlin-inject.
1 parent d4c5173 commit 6ccd98a

File tree

9 files changed

+44
-64
lines changed

9 files changed

+44
-64
lines changed

renderer-android-view/public/api/public.api

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,6 @@ public abstract class software/amazon/app/platform/renderer/ViewRenderer : softw
5555
protected fun renderModel (Lsoftware/amazon/app/platform/presenter/BaseModel;Lsoftware/amazon/app/platform/presenter/BaseModel;)V
5656
}
5757

58-
public abstract interface class software/amazon/app/platform/renderer/ViewRenderer$Component {
59-
public abstract fun getDispatcher ()Lkotlinx/coroutines/CoroutineDispatcher;
60-
}
61-
6258
public abstract class software/amazon/app/platform/renderer/template/AndroidTemplateRenderer : software/amazon/app/platform/renderer/ViewRenderer {
6359
public fun <init> (Lsoftware/amazon/app/platform/renderer/RendererFactory;)V
6460
}

renderer-android-view/public/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ plugins {
33
}
44

55
appPlatformBuildSrc {
6-
enableKotlinInject true
76
enablePublishing true
87
enableInstrumentedTests true
98
}
@@ -38,6 +37,7 @@ dependencies {
3837
androidMainApi libs.recyclerView
3938
androidMainImplementation libs.androidx.core
4039

40+
androidInstrumentedTestImplementation project(':kotlin-inject:public')
4141
androidInstrumentedTestImplementation libs.androidx.test.espresso
4242
// Use the version aligned with AGP in tests.
4343
androidInstrumentedTestImplementation libs.viewbinding.agp

renderer-android-view/public/src/androidInstrumentedTest/kotlin/software/amazon/app/platform/renderer/TestApplication.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package software.amazon.app.platform.renderer
22

33
import android.app.Application
44
import androidx.test.platform.app.InstrumentationRegistry
5-
import kotlinx.coroutines.CoroutineDispatcher
65
import kotlinx.coroutines.CoroutineName
7-
import kotlinx.coroutines.Dispatchers
86
import kotlinx.coroutines.Job
97
import software.amazon.app.platform.scope.RootScopeProvider
108
import software.amazon.app.platform.scope.Scope
@@ -22,9 +20,7 @@ class TestApplication : Application(), RootScopeProvider {
2220
addCoroutineScopeScoped(CoroutineScopeScoped(Job() + CoroutineName("test")))
2321
}
2422

25-
private inner class Component : ViewRenderer.Component, RendererComponent.Parent {
26-
override val dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate
27-
23+
private inner class Component : RendererComponent.Parent {
2824
override fun rendererComponent(factory: RendererFactory): RendererComponent =
2925
requireNotNull(rendererComponent)
3026
}

renderer-android-view/public/src/androidMain/kotlin/software/amazon/app/platform/renderer/ViewRenderer.kt

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,10 @@ import androidx.core.view.children
88
import androidx.core.view.doOnAttach
99
import androidx.core.view.doOnDetach
1010
import androidx.recyclerview.widget.RecyclerView
11-
import kotlinx.coroutines.CoroutineDispatcher
1211
import kotlinx.coroutines.CoroutineScope
13-
import kotlinx.coroutines.Job
12+
import kotlinx.coroutines.MainScope
1413
import kotlinx.coroutines.cancel
1514
import software.amazon.app.platform.presenter.BaseModel
16-
import software.amazon.app.platform.scope.RootScopeProvider
17-
import software.amazon.app.platform.scope.coroutine.MainCoroutineDispatcher
18-
import software.amazon.app.platform.scope.di.kotlinInjectComponent
19-
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
20-
import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo
2115

2216
/**
2317
* An implementation of [Renderer] that is specific to Android View based UI. This renderer provides
@@ -84,11 +78,7 @@ public abstract class ViewRenderer<in ModelT : BaseModel> : BaseAndroidViewRende
8478
}
8579

8680
private fun createView(model: ModelT): View {
87-
val rootScopeProvider = activity.application as RootScopeProvider
88-
coroutineScope =
89-
CoroutineScope(
90-
rootScopeProvider.rootScope.kotlinInjectComponent<Component>().dispatcher + Job()
91-
)
81+
coroutineScope = MainScope()
9282
return inflate(activity, parent, inflater, model).also { view = it }
9383
}
9484

@@ -202,11 +192,4 @@ public abstract class ViewRenderer<in ModelT : BaseModel> : BaseAndroidViewRende
202192

203193
return parents.none { it is RecyclerView }
204194
}
205-
206-
/** DI component that provides objects from the dependency graph. */
207-
@ContributesTo(AppScope::class)
208-
public interface Component {
209-
/** The coroutine dispatcher using the main thread. */
210-
@MainCoroutineDispatcher public val dispatcher: CoroutineDispatcher
211-
}
212195
}

renderer-compose-multiplatform/public/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ plugins {
55
appPlatformBuildSrc {
66
enableCompose true
77
enableInstrumentedTests true
8-
enableKotlinInject true
98
enablePublishing true
109
}
1110

@@ -19,12 +18,16 @@ dependencies {
1918

2019
androidMainApi project(':renderer-android-view:public')
2120

21+
commonTestImplementation project(':metro:public')
2222
commonTestImplementation project(':scope:testing')
23+
commonTestImplementation libs.metro.runtime
2324

25+
androidTestImplementation project(':metro:public')
2426
androidTestImplementation project(':presenter-molecule:impl')
2527
androidTestImplementation libs.androidx.activity.compose
2628
androidTestImplementation libs.androidx.test.espresso
2729
androidTestImplementation libs.compose.ui.test.junit4
2830
androidTestImplementation libs.compose.ui.test.junit4.android
2931
androidTestImplementation libs.compose.ui.test.manifest
32+
androidTestImplementation libs.metro.runtime
3033
}

renderer-compose-multiplatform/public/src/androidInstrumentedTest/kotlin/software/amazon/app/platform/renderer/ComposeAndroidRendererFactoryDeviceTest.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import assertk.assertions.isInstanceOf
3131
import assertk.assertions.isNull
3232
import assertk.assertions.isSameInstanceAs
3333
import assertk.assertions.messageContains
34+
import dev.zacsweers.metro.Provider
35+
import dev.zacsweers.metro.provider
3436
import kotlin.reflect.KClass
3537
import kotlinx.coroutines.flow.MutableStateFlow
3638
import org.junit.After
@@ -53,7 +55,7 @@ class ComposeAndroidRendererFactoryDeviceTest {
5355

5456
@Before
5557
fun prepare() {
56-
testApplication.rendererComponent = TestRendererComponent { factory }
58+
testApplication.rendererGraph = TestRendererGraph { factory }
5759

5860
activityRule.scenario.onActivity {
5961
activity = it
@@ -80,7 +82,7 @@ class ComposeAndroidRendererFactoryDeviceTest {
8082
childAt
8183
}
8284

83-
testApplication.rendererComponent = null
85+
testApplication.rendererGraph = null
8486
}
8587

8688
@Test
@@ -420,12 +422,12 @@ class ComposeAndroidRendererFactoryDeviceTest {
420422
}
421423
}
422424

423-
private inner class TestRendererComponent(private val rendererFactory: () -> RendererFactory) :
424-
RendererComponent {
425-
override val renderers: Map<KClass<out BaseModel>, () -> Renderer<*>> =
425+
private inner class TestRendererGraph(private val rendererFactory: () -> RendererFactory) :
426+
RendererGraph {
427+
override val renderers: Map<KClass<out BaseModel>, Provider<Renderer<*>>> =
426428
mapOf(
427-
ViewModel::class to { TestViewRenderer(rendererFactory()) },
428-
ComposeModel::class to { TestComposeRenderer(rendererFactory()) },
429+
ViewModel::class to provider { TestViewRenderer(rendererFactory()) },
430+
ComposeModel::class to provider { TestComposeRenderer(rendererFactory()) },
429431
)
430432
override val modelToRendererMapping: Map<KClass<out BaseModel>, KClass<out Renderer<*>>> =
431433
mapOf(

renderer-compose-multiplatform/public/src/androidInstrumentedTest/kotlin/software/amazon/app/platform/renderer/TestApplication.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,27 @@ package software.amazon.app.platform.renderer
22

33
import android.app.Application
44
import androidx.test.platform.app.InstrumentationRegistry
5-
import kotlinx.coroutines.CoroutineDispatcher
65
import kotlinx.coroutines.CoroutineName
7-
import kotlinx.coroutines.Dispatchers
86
import kotlinx.coroutines.Job
97
import software.amazon.app.platform.scope.RootScopeProvider
108
import software.amazon.app.platform.scope.Scope
119
import software.amazon.app.platform.scope.coroutine.CoroutineScopeScoped
1210
import software.amazon.app.platform.scope.coroutine.addCoroutineScopeScoped
13-
import software.amazon.app.platform.scope.di.addKotlinInjectComponent
11+
import software.amazon.app.platform.scope.di.metro.addMetroDependencyGraph
1412

1513
class TestApplication : Application(), RootScopeProvider {
1614

17-
var rendererComponent: RendererComponent? = null
15+
var rendererGraph: RendererGraph? = null
1816

1917
override val rootScope: Scope =
2018
Scope.buildRootScope {
21-
addKotlinInjectComponent(Component())
19+
addMetroDependencyGraph(Graph())
2220
addCoroutineScopeScoped(CoroutineScopeScoped(Job() + CoroutineName("test")))
2321
}
2422

25-
private inner class Component : ViewRenderer.Component, RendererComponent.Parent {
26-
override val dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate
27-
28-
override fun rendererComponent(factory: RendererFactory): RendererComponent =
29-
requireNotNull(rendererComponent)
23+
private inner class Graph : RendererGraph.Factory {
24+
override fun createRendererGraph(factory: RendererFactory): RendererGraph =
25+
requireNotNull(rendererGraph)
3026
}
3127
}
3228

renderer-compose-multiplatform/public/src/androidUnitTest/kotlin/software/amazon/app/platform/renderer/ComposeAndroidRendererFactoryTest.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import assertk.assertFailure
99
import assertk.assertThat
1010
import assertk.assertions.isInstanceOf
1111
import assertk.assertions.messageContains
12+
import dev.zacsweers.metro.Provider
13+
import dev.zacsweers.metro.provider
1214
import kotlin.reflect.KClass
1315
import kotlin.test.Test
1416
import kotlinx.coroutines.test.TestScope
@@ -17,7 +19,7 @@ import software.amazon.app.platform.presenter.BaseModel
1719
import software.amazon.app.platform.scope.RootScopeProvider
1820
import software.amazon.app.platform.scope.Scope
1921
import software.amazon.app.platform.scope.buildTestScope
20-
import software.amazon.app.platform.scope.di.addKotlinInjectComponent
22+
import software.amazon.app.platform.scope.di.metro.addMetroDependencyGraph
2123

2224
class ComposeAndroidRendererFactoryTest {
2325

@@ -53,15 +55,15 @@ class ComposeAndroidRendererFactoryTest {
5355
private fun TestScope.rootScopeProvider(): RootScopeProvider {
5456
val scope =
5557
Scope.buildTestScope(this) {
56-
addKotlinInjectComponent(
57-
object : RendererComponent.Parent {
58-
override fun rendererComponent(factory: RendererFactory): RendererComponent {
59-
return object : RendererComponent {
60-
override val renderers: Map<KClass<out BaseModel>, () -> Renderer<*>> =
58+
addMetroDependencyGraph(
59+
object : RendererGraph.Factory {
60+
override fun createRendererGraph(factory: RendererFactory): RendererGraph {
61+
return object : RendererGraph {
62+
override val renderers: Map<KClass<out BaseModel>, Provider<Renderer<*>>> =
6163
mapOf(
62-
ComposeModel::class to { TestComposeRenderer() },
63-
AndroidModel::class to { TestAndroidRenderer() },
64-
UnsupportedModel::class to { UnsupportedRenderer() },
64+
ComposeModel::class to provider { TestComposeRenderer() },
65+
AndroidModel::class to provider { TestAndroidRenderer() },
66+
UnsupportedModel::class to provider { UnsupportedRenderer() },
6567
)
6668
override val modelToRendererMapping:
6769
Map<KClass<out BaseModel>, KClass<out Renderer<*>>> =

renderer-compose-multiplatform/public/src/desktopTest/kotlin/software/amazon/app/platform/renderer/ComposeRendererFactoryTest.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import assertk.assertFailure
66
import assertk.assertThat
77
import assertk.assertions.isInstanceOf
88
import assertk.assertions.messageContains
9+
import dev.zacsweers.metro.Provider
10+
import dev.zacsweers.metro.provider
911
import kotlin.reflect.KClass
1012
import kotlin.test.Test
1113
import kotlinx.coroutines.test.TestScope
@@ -14,7 +16,7 @@ import software.amazon.app.platform.presenter.BaseModel
1416
import software.amazon.app.platform.scope.RootScopeProvider
1517
import software.amazon.app.platform.scope.Scope
1618
import software.amazon.app.platform.scope.buildTestScope
17-
import software.amazon.app.platform.scope.di.addKotlinInjectComponent
19+
import software.amazon.app.platform.scope.di.metro.addMetroDependencyGraph
1820

1921
class ComposeRendererFactoryTest {
2022

@@ -60,14 +62,14 @@ class ComposeRendererFactoryTest {
6062
private fun TestScope.rootScopeProvider(): RootScopeProvider {
6163
val scope =
6264
Scope.buildTestScope(this) {
63-
addKotlinInjectComponent(
64-
object : RendererComponent.Parent {
65-
override fun rendererComponent(factory: RendererFactory): RendererComponent {
66-
return object : RendererComponent {
67-
override val renderers: Map<KClass<out BaseModel>, () -> Renderer<*>> =
65+
addMetroDependencyGraph(
66+
object : RendererGraph.Factory {
67+
override fun createRendererGraph(factory: RendererFactory): RendererGraph {
68+
return object : RendererGraph {
69+
override val renderers: Map<KClass<out BaseModel>, Provider<Renderer<*>>> =
6870
mapOf(
69-
ComposeModel::class to { TestComposeRenderer() },
70-
AndroidModel::class to { AndroidRenderer() },
71+
ComposeModel::class to provider { TestComposeRenderer() },
72+
AndroidModel::class to provider { AndroidRenderer() },
7173
)
7274
override val modelToRendererMapping:
7375
Map<KClass<out BaseModel>, KClass<out Renderer<*>>> =

0 commit comments

Comments
 (0)