From eeb86ad23a58cfcb821265803cb536c741dd82bc Mon Sep 17 00:00:00 2001 From: lihenggui Date: Fri, 28 Jun 2024 13:33:38 -0700 Subject: [PATCH] Use correct provider for CoroutineScope --- .../di/AndroidPlatformDependentDataModule.kt | 22 ++++++++++++++++--- .../data/util/TimeZoneBroadcastMonitor.kt | 4 ++-- .../data/di/PlatformDependentDataModule.kt | 5 +---- .../DefaultSearchContentsRepository.kt | 5 +++-- .../core/database/di/DatabaseModule.kt | 15 ++++++------- .../datastore/NiaPreferencesDataSource.kt | 6 ++--- .../network/demo/DemoNiaNetworkDataSource.kt | 5 +++-- 7 files changed, 38 insertions(+), 24 deletions(-) diff --git a/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/AndroidPlatformDependentDataModule.kt b/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/AndroidPlatformDependentDataModule.kt index d0262c24f..c7830b28c 100644 --- a/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/AndroidPlatformDependentDataModule.kt +++ b/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/AndroidPlatformDependentDataModule.kt @@ -16,25 +16,41 @@ package com.google.samples.apps.nowinandroid.core.data.di +import android.app.Application import com.google.samples.apps.nowinandroid.core.data.util.ConnectivityManagerNetworkMonitor import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneBroadcastMonitor import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import com.google.samples.apps.nowinandroid.core.di.AndroidApplicationComponent +import com.google.samples.apps.nowinandroid.core.di.ApplicationScope +import com.google.samples.apps.nowinandroid.core.di.CoroutineScopeComponent +import com.google.samples.apps.nowinandroid.core.di.DispatchersComponent +import com.google.samples.apps.nowinandroid.core.di.IoDispatcher +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides @Component abstract class AndroidPlatformDependentDataModule( @Component val applicationComponent: AndroidApplicationComponent, -): PlatformDependentDataModule() { + @Component val dispatchersComponent: DispatchersComponent, + @Component val coroutineScopeComponent: CoroutineScopeComponent, +) : PlatformDependentDataModule() { + abstract val application: Application + @IoDispatcher abstract val ioDispatcher: CoroutineDispatcher + abstract val coroutineScope: CoroutineScope + @Provides override fun bindsNetworkMonitor(): NetworkMonitor { - return ConnectivityManagerNetworkMonitor(applicationComponent.application) + return ConnectivityManagerNetworkMonitor( + application, + ioDispatcher, + ) } @Provides override fun bindsTimeZoneMonitor(): TimeZoneMonitor { - return TimeZoneBroadcastMonitor() + return TimeZoneBroadcastMonitor(application, coroutineScope, ioDispatcher) } } diff --git a/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneBroadcastMonitor.kt b/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneBroadcastMonitor.kt index 27fb21eda..615e803cb 100644 --- a/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneBroadcastMonitor.kt +++ b/core/data/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneBroadcastMonitor.kt @@ -23,7 +23,7 @@ import android.content.IntentFilter import android.os.Build.VERSION import android.os.Build.VERSION_CODES import androidx.tracing.trace -import com.google.samples.apps.nowinandroid.core.di.IODispatcher +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.SharedFlow @@ -42,7 +42,7 @@ import java.time.ZoneId internal class TimeZoneBroadcastMonitor( private val context: Context, appScope: CoroutineScope, - private val ioDispatcher: IODispatcher, + private val ioDispatcher: CoroutineDispatcher, ) : TimeZoneMonitor { override val currentTimeZone: SharedFlow = diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/PlatformDependentDataModule.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/PlatformDependentDataModule.kt index 9bdf3da6e..3228f38eb 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/PlatformDependentDataModule.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/di/PlatformDependentDataModule.kt @@ -21,14 +21,11 @@ import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import com.google.samples.apps.nowinandroid.core.di.ApplicationScope import me.tatarka.inject.annotations.Provides -@ApplicationScope -abstract class PlatformDependentDataModule { - @ApplicationScope +abstract class PlatformDependentDataModule { @Provides abstract fun bindsNetworkMonitor(): NetworkMonitor - @ApplicationScope @Provides abstract fun bindsTimeZoneMonitor(): TimeZoneMonitor } diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt index cfa582586..921b63dba 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt @@ -23,8 +23,9 @@ import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsResource import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.database.model.asFtsEntity -import com.google.samples.apps.nowinandroid.core.di.IODispatcher +import com.google.samples.apps.nowinandroid.core.di.IoDispatcher import com.google.samples.apps.nowinandroid.core.model.data.SearchResult +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine @@ -42,7 +43,7 @@ class DefaultSearchContentsRepository( private val newsResourceFtsDao: NewsResourceFtsDao, private val topicDao: TopicDao, private val topicFtsDao: TopicFtsDao, - private val ioDispatcher: IODispatcher, + @IoDispatcher private val ioDispatcher: CoroutineDispatcher, ) : SearchContentsRepository { override suspend fun populateFtsData() { diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt index 10845d248..ba733a146 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt @@ -23,42 +23,41 @@ import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDao import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryDao import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao -import com.google.samples.apps.nowinandroid.core.di.IODispatcher +import com.google.samples.apps.nowinandroid.core.di.DispatchersComponent +import com.google.samples.apps.nowinandroid.core.di.IoDispatcher +import kotlinx.coroutines.CoroutineDispatcher import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides @Component -internal abstract class DatabaseModule { +abstract class DatabaseModule(@Component val dispatchersComponent: DispatchersComponent) { + @IoDispatcher abstract val dispatcher: CoroutineDispatcher + @Provides fun providesNiaDatabase(driver: SqlDriver): NiaDatabase = NiaDatabase(driver) @Provides fun providesTopicsDao( - database: NiaDatabase, - dispatcher: IODispatcher, + database: NiaDatabase ): TopicDao = TopicDao(database, dispatcher) @Provides fun providesNewsResourceDao( database: NiaDatabase, - dispatcher: IODispatcher, ): NewsResourceDao = NewsResourceDao(database, dispatcher) @Provides fun providesTopicFtsDao( database: NiaDatabase, - dispatcher: IODispatcher, ): TopicFtsDao = TopicFtsDao(database, dispatcher) @Provides fun providesNewsResourceFtsDao( database: NiaDatabase, - dispatcher: IODispatcher, ): NewsResourceFtsDao = NewsResourceFtsDao(database, dispatcher) @Provides fun providesRecentSearchQueryDao( database: NiaDatabase, - dispatcher: IODispatcher, ): RecentSearchQueryDao = RecentSearchQueryDao(database, dispatcher) } diff --git a/core/datastore/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt b/core/datastore/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt index 9cc91745a..d7248081c 100644 --- a/core/datastore/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt +++ b/core/datastore/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt @@ -15,8 +15,7 @@ */ package com.google.samples.apps.nowinandroid.core.datastore - -import com.google.samples.apps.nowinandroid.core.di.IODispatcher +import com.google.samples.apps.nowinandroid.core.di.IoDispatcher import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData @@ -25,6 +24,7 @@ import com.russhwolf.settings.Settings import com.russhwolf.settings.serialization.decodeValue import com.russhwolf.settings.serialization.decodeValueOrNull import com.russhwolf.settings.serialization.encodeValue +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map @@ -38,7 +38,7 @@ private const val USER_DATA_KEY = "userData" @Inject class NiaPreferencesDataSource( private val settings: Settings, - private val dispatcher: IODispatcher, + @IoDispatcher private val dispatcher: CoroutineDispatcher, ) { // FlowSettings did not support JS, use a workaround instead // https://github.com/russhwolf/multiplatform-settings/issues/139 diff --git a/core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt b/core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt index 78a71a68a..379ebaf16 100644 --- a/core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt +++ b/core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt @@ -16,13 +16,14 @@ package com.google.samples.apps.nowinandroid.core.network.demo -import com.google.samples.apps.nowinandroid.core.di.IODispatcher +import com.google.samples.apps.nowinandroid.core.di.IoDispatcher import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.assets.NEWS_DATA import com.google.samples.apps.nowinandroid.core.network.assets.TOPICS_DATA import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json import me.tatarka.inject.annotations.Inject @@ -31,7 +32,7 @@ import me.tatarka.inject.annotations.Inject * [NiaNetworkDataSource] implementation that provides static news resources to aid development */ class DemoNiaNetworkDataSource @Inject constructor( - private val ioDispatcher: IODispatcher, + @IoDispatcher private val ioDispatcher: CoroutineDispatcher, private val networkJson: Json, ) : NiaNetworkDataSource {