Merge pull request #121 from lihenggui/feature/foryou

Use @Dispatcher to distinguish different dispatchers
pull/2064/head
Mercury Li 2 years ago committed by GitHub
commit bade9da449
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -16,6 +16,9 @@
package com.google.samples.apps.nowinandroid.core.di
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.DEFAULT
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.MAIN
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import me.tatarka.inject.annotations.Component
@ -24,9 +27,18 @@ import me.tatarka.inject.annotations.Provides
@Component
abstract class AndroidDispatchersComponent : DispatchersComponent() {
@Provides
override fun providesIODispatcher(): @IoDispatcher CoroutineDispatcher = Dispatchers.IO
override fun providesIODispatcher():
@Dispatcher(IO)
CoroutineDispatcher = Dispatchers.IO
@Provides
override fun providesDefaultDispatcher(): @DefaultDispatcher CoroutineDispatcher =
override fun providesDefaultDispatcher():
@Dispatcher(DEFAULT)
CoroutineDispatcher =
Dispatchers.Default
@Provides
override fun providesMainDispatcher():
@Dispatcher(MAIN)
CoroutineDispatcher = Dispatchers.Main
}

@ -16,6 +16,7 @@
package com.google.samples.apps.nowinandroid.core.di
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.DEFAULT
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
@ -33,9 +34,10 @@ annotation class ApplicationScope
abstract class CoroutineScopeComponent(
@Component val dispatchersComponent: DispatchersComponent,
) {
@DefaultDispatcher abstract val defaultDispatcher: CoroutineDispatcher
@Dispatcher(DEFAULT)
abstract val dispatcher: CoroutineDispatcher
@Provides
fun providesCoroutineScope(): CoroutineScope =
CoroutineScope(SupervisorJob() + defaultDispatcher)
CoroutineScope(SupervisorJob() + dispatcher)
}

@ -16,13 +16,26 @@
package com.google.samples.apps.nowinandroid.core.di
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.DEFAULT
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.MAIN
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.IO
import me.tatarka.inject.annotations.Provides
abstract class DispatchersComponent {
@Provides
abstract fun providesIODispatcher(): @IoDispatcher CoroutineDispatcher
abstract fun providesIODispatcher():
@Dispatcher(IO)
CoroutineDispatcher
@Provides
abstract fun providesDefaultDispatcher(): @DefaultDispatcher CoroutineDispatcher
abstract fun providesDefaultDispatcher():
@Dispatcher(DEFAULT)
CoroutineDispatcher
@Provides
abstract fun providesMainDispatcher():
@Dispatcher(MAIN)
CoroutineDispatcher
}

@ -17,8 +17,10 @@
package com.google.samples.apps.nowinandroid.core.di
import me.tatarka.inject.annotations.Qualifier
import kotlin.annotation.AnnotationRetention.RUNTIME
@Qualifier
@Retention(RUNTIME)
@Target(
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.FUNCTION,
@ -26,24 +28,10 @@ import me.tatarka.inject.annotations.Qualifier
AnnotationTarget.TYPE,
AnnotationTarget.PROPERTY,
)
annotation class IoDispatcher
annotation class Dispatcher(val dispatcher: NiaDispatchers)
@Qualifier
@Target(
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.TYPE,
AnnotationTarget.PROPERTY,
)
annotation class MainDispatcher
@Qualifier
@Target(
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.TYPE,
AnnotationTarget.PROPERTY,
)
annotation class DefaultDispatcher
enum class NiaDispatchers {
IO,
DEFAULT,
MAIN,
}

@ -16,6 +16,9 @@
package com.google.samples.apps.nowinandroid.core.di
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.DEFAULT
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.MAIN
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import me.tatarka.inject.annotations.Component
@ -24,8 +27,17 @@ import me.tatarka.inject.annotations.Provides
@Component
abstract class JvmDispatchersComponent : DispatchersComponent() {
@Provides
override fun providesIODispatcher(): @IoDispatcher CoroutineDispatcher = Dispatchers.IO
override fun providesIODispatcher():
@Dispatcher(IO)
CoroutineDispatcher = Dispatchers.IO
@Provides
override fun providesDefaultDispatcher(): @DefaultDispatcher CoroutineDispatcher = Dispatchers.Default
override fun providesDefaultDispatcher():
@Dispatcher(DEFAULT)
CoroutineDispatcher = Dispatchers.Default
@Provides
override fun providesMainDispatcher():
@Dispatcher(MAIN)
CoroutineDispatcher = Dispatchers.Main
}

@ -16,6 +16,9 @@
package com.google.samples.apps.nowinandroid.core.di
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.DEFAULT
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.MAIN
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
@ -25,9 +28,18 @@ import me.tatarka.inject.annotations.Provides
@Component
abstract class NativeDispatchersComponent : DispatchersComponent() {
@Provides
override fun providesIODispatcher(): @IoDispatcher CoroutineDispatcher = Dispatchers.IO
override fun providesIODispatcher():
@Dispatcher(IO)
CoroutineDispatcher = Dispatchers.IO
@Provides
override fun providesDefaultDispatcher(): @DefaultDispatcher CoroutineDispatcher =
override fun providesDefaultDispatcher():
@Dispatcher(DEFAULT)
CoroutineDispatcher =
Dispatchers.Default
@Provides
override fun providesMainDispatcher():
@Dispatcher(MAIN)
CoroutineDispatcher = Dispatchers.Main
}

@ -23,8 +23,9 @@ import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneBroadcastMoni
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.CoroutineScopeComponent
import com.google.samples.apps.nowinandroid.core.di.Dispatcher
import com.google.samples.apps.nowinandroid.core.di.DispatchersComponent
import com.google.samples.apps.nowinandroid.core.di.IoDispatcher
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import me.tatarka.inject.annotations.Component
@ -38,7 +39,8 @@ abstract class AndroidPlatformDependentDataModule(
) : PlatformDependentDataModule() {
abstract val application: Application
@IoDispatcher abstract val ioDispatcher: CoroutineDispatcher
@Dispatcher(IO)
abstract val ioDispatcher: CoroutineDispatcher
abstract val coroutineScope: CoroutineScope
@Provides

@ -23,7 +23,8 @@ 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.Dispatcher
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import com.google.samples.apps.nowinandroid.core.model.data.SearchResult
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -43,7 +44,7 @@ class DefaultSearchContentsRepository(
private val newsResourceFtsDao: NewsResourceFtsDao,
private val topicDao: TopicDao,
private val topicFtsDao: TopicFtsDao,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
@Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher,
) : SearchContentsRepository {
override suspend fun populateFtsData() {

@ -23,15 +23,17 @@ 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.Dispatcher
import com.google.samples.apps.nowinandroid.core.di.DispatchersComponent
import com.google.samples.apps.nowinandroid.core.di.IoDispatcher
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import kotlinx.coroutines.CoroutineDispatcher
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
@Component
abstract class DatabaseModule(@Component val dispatchersComponent: DispatchersComponent) {
@IoDispatcher abstract val dispatcher: CoroutineDispatcher
@Dispatcher(IO)
abstract val dispatcher: CoroutineDispatcher
@Provides
fun providesNiaDatabase(driver: SqlDriver): NiaDatabase = NiaDatabase(driver)

@ -15,7 +15,8 @@
*/
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.Dispatcher
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
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
@ -38,7 +39,7 @@ private const val USER_DATA_KEY = "userData"
@Inject
class NiaPreferencesDataSource(
private val settings: Settings,
@IoDispatcher private val dispatcher: CoroutineDispatcher,
@Dispatcher(IO) private val dispatcher: CoroutineDispatcher,
) {
// FlowSettings did not support JS, use a workaround instead
// https://github.com/russhwolf/multiplatform-settings/issues/139

@ -16,7 +16,8 @@
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.Dispatcher
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
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
@ -32,7 +33,7 @@ import me.tatarka.inject.annotations.Inject
* [NiaNetworkDataSource] implementation that provides static news resources to aid development
*/
class DemoNiaNetworkDataSource @Inject constructor(
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
@Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher,
private val networkJson: Json,
) : NiaNetworkDataSource {

@ -36,6 +36,7 @@ import kotlin.test.assertIs
* To learn more about how this test handles Flows created with stateIn, see
* https://developer.android.com/kotlin/flow/test#statein
*/
@OptIn(ExperimentalCoroutinesApi::class)
class BookmarksViewModelTest {
private val userDataRepository = TestUserDataRepository()
private val newsRepository = TestNewsRepository()
@ -71,7 +72,6 @@ class BookmarksViewModelTest {
collectJob.cancel()
}
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun oneBookmark_whenRemoving_removesFromFeed() = runTest {
val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.feedUiState.collect() }

Loading…
Cancel
Save