Skip to content

Commit 6087d2a

Browse files
authored
Merge pull request #140 from hoc081098/koin_3_2_0
Koin 3.2.0
2 parents 0186f58 + 0419dd0 commit 6087d2a

File tree

27 files changed

+111
-86
lines changed

27 files changed

+111
-86
lines changed

.idea/gradle.xml

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.hoc.flowmvi.core
22

3-
import com.hoc.flowmvi.core.dispatchers.CoroutineDispatchers
3+
import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers
44
import com.hoc.flowmvi.core_ui.navigator.Navigator
5+
import org.koin.core.module.dsl.bind
6+
import org.koin.core.module.dsl.singleOf
57
import org.koin.dsl.module
68

79
@JvmField
810
val coreModule = module {
9-
single<CoroutineDispatchers> { DefaultCoroutineDispatchers() }
11+
singleOf(::DefaultAppCoroutineDispatchers) { bind<AppCoroutineDispatchers>() }
1012

11-
single<Navigator> { NavigatorImpl(add = get(), search = get()) }
13+
singleOf(::NavigatorImpl) { bind<Navigator>() }
1214
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.hoc.flowmvi.core
2+
3+
import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers
4+
import kotlinx.coroutines.Dispatchers
5+
6+
internal class DefaultAppCoroutineDispatchers : AppCoroutineDispatchers {
7+
override val main get() = Dispatchers.Main
8+
override val mainImmediate get() = Dispatchers.Main.immediate
9+
override val io get() = Dispatchers.IO
10+
}

app/src/main/java/com/hoc/flowmvi/core/DefaultCoroutineDispatchers.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

app/src/test/java/com/hoc/flowmvi/CheckModulesTest.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.hoc.flowmvi
33
import androidx.lifecycle.SavedStateHandle
44
import com.hoc.flowmvi.test_utils.TestCoroutineDispatcherRule
55
import io.mockk.every
6-
import io.mockk.mockkClass
6+
import io.mockk.mockk
77
import kotlinx.coroutines.ExperimentalCoroutinesApi
88
import kotlinx.coroutines.FlowPreview
99
import org.junit.Rule
@@ -22,12 +22,16 @@ import kotlin.time.ExperimentalTime
2222
class CheckModulesTest : AutoCloseKoinTest() {
2323
@get:Rule
2424
val mockProvider = MockProviderRule.create { clazz ->
25-
mockkClass(clazz).also { o ->
26-
if (clazz == SavedStateHandle::class) {
27-
every { (o as SavedStateHandle).get<Any?>(any()) } returns null
25+
when (clazz) {
26+
SavedStateHandle::class -> {
27+
mockk<SavedStateHandle>() {
28+
every { get<Any?>(any()) } returns null
29+
}
2830
}
31+
else -> error("Unknown class: $clazz")
2932
}
3033
}
34+
3135
@get:Rule
3236
val coroutineRule = TestCoroutineDispatcherRule()
3337

buildSrc/src/main/kotlin/deps.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ object deps {
6060
}
6161

6262
object koin {
63-
private const val version = "3.2.0-beta-1"
63+
private const val version = "3.2.0"
6464

6565
const val core = "io.insert-koin:koin-core:$version"
6666
const val android = "io.insert-koin:koin-android:$version"
@@ -90,7 +90,7 @@ object deps {
9090
}
9191
}
9292

93-
const val mockk = "io.mockk:mockk:1.12.3"
93+
const val mockk = "io.mockk:mockk:1.12.4"
9494
const val kotlinJUnit = "org.jetbrains.kotlin:kotlin-test-junit:$kotlinVersion"
9595
}
9696
}

core/src/main/java/com/hoc/flowmvi/core/dispatchers/CoroutineDispatchers.kt renamed to core/src/main/java/com/hoc/flowmvi/core/dispatchers/AppCoroutineDispatchers.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package com.hoc.flowmvi.core.dispatchers
22

33
import kotlinx.coroutines.CoroutineDispatcher
44

5-
interface CoroutineDispatchers {
5+
interface AppCoroutineDispatchers {
66
val main: CoroutineDispatcher
7+
val mainImmediate: CoroutineDispatcher
78
val io: CoroutineDispatcher
89
}

data/src/main/java/com/hoc/flowmvi/data/DataModule.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,24 @@ import kotlinx.coroutines.FlowPreview
1414
import okhttp3.OkHttpClient
1515
import okhttp3.logging.HttpLoggingInterceptor
1616
import okhttp3.logging.HttpLoggingInterceptor.Level
17+
import org.koin.core.module.dsl.singleOf
1718
import org.koin.core.qualifier.named
1819
import org.koin.dsl.module
1920
import retrofit2.Retrofit
2021
import retrofit2.converter.moshi.MoshiConverterFactory
2122
import java.util.concurrent.TimeUnit
2223
import kotlin.time.ExperimentalTime
2324

24-
val BASE_URL_QUALIFIER = named("BASE_URL")
25+
internal val BASE_URL_QUALIFIER = named("BASE_URL")
26+
internal val ERROR_RESPONSE_JSON_ADAPTER = named("ERROR_RESPONSE_JSON_ADAPTER")
2527

2628
@JvmField
2729
@FlowPreview
2830
@ExperimentalStdlibApi
2931
@ExperimentalTime
3032
@ExperimentalCoroutinesApi
3133
val dataModule = module {
32-
single { UserApiService(retrofit = get()) }
34+
singleOf(UserApiService::invoke)
3335

3436
single {
3537
provideRetrofit(
@@ -49,9 +51,9 @@ val dataModule = module {
4951

5052
factory { UserDomainToUserBodyMapper() }
5153

52-
factory { get<Moshi>().adapter<ErrorResponse>() }
54+
factory(ERROR_RESPONSE_JSON_ADAPTER) { get<Moshi>().adapter<ErrorResponse>() }
5355

54-
factory { UserErrorMapper(errorResponseJsonAdapter = get()) }
56+
factory { UserErrorMapper(get(ERROR_RESPONSE_JSON_ADAPTER)) }
5557

5658
single<UserRepository> {
5759
UserRepositoryImpl(

data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import arrow.core.leftWiden
77
import arrow.core.right
88
import arrow.core.valueOr
99
import com.hoc.flowmvi.core.Mapper
10-
import com.hoc.flowmvi.core.dispatchers.CoroutineDispatchers
10+
import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers
1111
import com.hoc.flowmvi.data.remote.UserApiService
1212
import com.hoc.flowmvi.data.remote.UserBody
1313
import com.hoc.flowmvi.data.remote.UserResponse
@@ -39,7 +39,7 @@ import arrow.core.Either.Companion.catch as catchEither
3939
@ExperimentalCoroutinesApi
4040
internal class UserRepositoryImpl(
4141
private val userApiService: UserApiService,
42-
private val dispatchers: CoroutineDispatchers,
42+
private val dispatchers: AppCoroutineDispatchers,
4343
private val responseToDomain: Mapper<UserResponse, ValidatedNel<UserValidationError, User>>,
4444
private val domainToBody: Mapper<User, UserBody>,
4545
private val errorMapper: Mapper<Throwable, UserError>,

data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplRealAPITest.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.hoc.flowmvi.data
22

33
import android.util.Log
4-
import com.hoc.flowmvi.core.dispatchers.CoroutineDispatchers
4+
import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers
55
import com.hoc.flowmvi.domain.repository.UserRepository
66
import com.hoc.flowmvi.test_utils.getOrThrow
77
import kotlinx.coroutines.CoroutineDispatcher
@@ -38,10 +38,11 @@ class UserRepositoryImplRealAPITest : KoinTest {
3838
modules(
3939
dataModule,
4040
module {
41-
factory<CoroutineDispatchers> {
42-
object : CoroutineDispatchers {
41+
factory<AppCoroutineDispatchers> {
42+
object : AppCoroutineDispatchers {
4343
override val main: CoroutineDispatcher get() = Main
4444
override val io: CoroutineDispatcher get() = IO
45+
override val mainImmediate: CoroutineDispatcher get() = Main.immediate
4546
}
4647
}
4748
}

data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import com.hoc.flowmvi.data.remote.UserResponse
1010
import com.hoc.flowmvi.domain.model.User
1111
import com.hoc.flowmvi.domain.model.UserError
1212
import com.hoc.flowmvi.domain.model.UserValidationError
13+
import com.hoc.flowmvi.test_utils.TestAppCoroutineDispatchers
1314
import com.hoc.flowmvi.test_utils.TestCoroutineDispatcherRule
14-
import com.hoc.flowmvi.test_utils.TestDispatchers
1515
import com.hoc.flowmvi.test_utils.getOrThrow
1616
import com.hoc.flowmvi.test_utils.leftOrThrow
1717
import com.hoc.flowmvi.test_utils.valueOrThrow
@@ -121,7 +121,7 @@ class UserRepositoryImplTest {
121121

122122
repo = UserRepositoryImpl(
123123
userApiService = userApiService,
124-
dispatchers = TestDispatchers(coroutineRule.testDispatcher),
124+
dispatchers = TestAppCoroutineDispatchers(coroutineRule.testDispatcher),
125125
responseToDomain = responseToDomain,
126126
domainToBody = domainToBody,
127127
errorMapper = errorMapper

domain/src/main/java/com/hoc/flowmvi/domain/DomainModule.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@ import com.hoc.flowmvi.domain.usecase.GetUsersUseCase
55
import com.hoc.flowmvi.domain.usecase.RefreshGetUsersUseCase
66
import com.hoc.flowmvi.domain.usecase.RemoveUserUseCase
77
import com.hoc.flowmvi.domain.usecase.SearchUsersUseCase
8+
import org.koin.core.module.dsl.factoryOf
89
import org.koin.dsl.module
910

1011
@JvmField
1112
val domainModule = module {
12-
factory { GetUsersUseCase(userRepository = get()) }
13+
factoryOf(::GetUsersUseCase)
1314

14-
factory { RefreshGetUsersUseCase(userRepository = get()) }
15+
factoryOf(::RefreshGetUsersUseCase)
1516

16-
factory { RemoveUserUseCase(userRepository = get()) }
17+
factoryOf(::RemoveUserUseCase)
1718

18-
factory { AddUserUseCase(userRepository = get()) }
19+
factoryOf(::AddUserUseCase)
1920

20-
factory { SearchUsersUseCase(userRepository = get()) }
21+
factoryOf(::SearchUsersUseCase)
2122
}

feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
2121
import kotlinx.coroutines.flow.Flow
2222
import kotlinx.coroutines.flow.map
2323
import kotlinx.coroutines.flow.merge
24-
import org.koin.androidx.viewmodel.ext.android.viewModel
24+
import org.koin.androidx.viewmodel.ext.android.stateViewModel
2525
import timber.log.Timber
2626

2727
@ExperimentalCoroutinesApi
2828
class AddActivity :
2929
AbstractMviActivity<ViewIntent, ViewState, SingleEvent, AddVM>(R.layout.activity_add) {
30-
override val vm by viewModel<AddVM>()
30+
override val vm by stateViewModel<AddVM>()
3131
private val addBinding by viewBinding<ActivityAddBinding>()
3232

3333
override fun onOptionsItemSelected(item: MenuItem): Boolean {

feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddModule.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@ package com.hoc.flowmvi.ui.add
22

33
import com.hoc.flowmvi.core_ui.navigator.IntentProviders
44
import kotlinx.coroutines.ExperimentalCoroutinesApi
5-
import org.koin.androidx.viewmodel.dsl.viewModel
5+
import org.koin.androidx.viewmodel.dsl.viewModelOf
6+
import org.koin.core.module.dsl.bind
7+
import org.koin.core.module.dsl.singleOf
68
import org.koin.dsl.module
79

810
@JvmField
911
@ExperimentalCoroutinesApi
1012
val addModule = module {
11-
viewModel { params ->
12-
AddVM(
13-
addUser = get(),
14-
savedStateHandle = params.get(),
15-
)
16-
}
13+
viewModelOf(::AddVM)
1714

18-
single<IntentProviders.Add> { AddActivity.IntentProvider() }
15+
singleOf(AddActivity::IntentProvider) { bind<IntentProviders.Add>() }
1916
}

feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddVM.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.hoc.flowmvi.ui.add
33
import androidx.lifecycle.SavedStateHandle
44
import androidx.lifecycle.viewModelScope
55
import arrow.core.orNull
6+
import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers
67
import com.hoc.flowmvi.domain.model.User
78
import com.hoc.flowmvi.domain.usecase.AddUserUseCase
89
import com.hoc.flowmvi.mvi_base.AbstractMviViewModel
@@ -33,7 +34,8 @@ import timber.log.Timber
3334
class AddVM(
3435
private val addUser: AddUserUseCase,
3536
savedStateHandle: SavedStateHandle,
36-
) : AbstractMviViewModel<ViewIntent, ViewState, SingleEvent>() {
37+
appCoroutineDispatchers: AppCoroutineDispatchers,
38+
) : AbstractMviViewModel<ViewIntent, ViewState, SingleEvent>(appCoroutineDispatchers) {
3739

3840
override val viewState: StateFlow<ViewState>
3941

feature-add/src/test/java/com/hoc/flowmvi/ui/add/AddVMTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.hoc.flowmvi.domain.usecase.AddUserUseCase
1212
import com.hoc.flowmvi.mvi_testing.BaseMviViewModelTest
1313
import com.hoc.flowmvi.mvi_testing.mapRight
1414
import com.hoc.flowmvi.mvi_testing.returnsWithDelay
15+
import com.hoc.flowmvi.test_utils.TestAppCoroutineDispatchers
1516
import com.hoc.flowmvi.test_utils.valueOrThrow
1617
import io.mockk.coEvery
1718
import io.mockk.coVerify
@@ -41,7 +42,8 @@ class AddVMTest : BaseMviViewModelTest<ViewIntent, ViewState, SingleEvent, AddVM
4142

4243
vm = AddVM(
4344
addUser = addUser,
44-
savedStateHandle = savedStateHandle
45+
savedStateHandle = savedStateHandle,
46+
appCoroutineDispatchers = TestAppCoroutineDispatchers(coroutineRule.testDispatcher)
4547
)
4648
}
4749

feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainModule.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,12 @@ package com.hoc.flowmvi.ui.main
22

33
import kotlinx.coroutines.ExperimentalCoroutinesApi
44
import kotlinx.coroutines.FlowPreview
5-
import org.koin.androidx.viewmodel.dsl.viewModel
5+
import org.koin.androidx.viewmodel.dsl.viewModelOf
66
import org.koin.dsl.module
77

88
@JvmField
99
@ExperimentalCoroutinesApi
1010
@FlowPreview
1111
val mainModule = module {
12-
viewModel {
13-
MainVM(
14-
getUsersUseCase = get(),
15-
refreshGetUsers = get(),
16-
removeUser = get()
17-
)
18-
}
12+
viewModelOf(::MainVM)
1913
}

feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainVM.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.hoc.flowmvi.ui.main
22

33
import androidx.lifecycle.viewModelScope
44
import arrow.core.flatMap
5+
import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers
56
import com.hoc.flowmvi.domain.usecase.GetUsersUseCase
67
import com.hoc.flowmvi.domain.usecase.RefreshGetUsersUseCase
78
import com.hoc.flowmvi.domain.usecase.RemoveUserUseCase
@@ -36,7 +37,8 @@ class MainVM(
3637
private val getUsersUseCase: GetUsersUseCase,
3738
private val refreshGetUsers: RefreshGetUsersUseCase,
3839
private val removeUser: RemoveUserUseCase,
39-
) : AbstractMviViewModel<ViewIntent, ViewState, SingleEvent>() {
40+
appCoroutineDispatchers: AppCoroutineDispatchers,
41+
) : AbstractMviViewModel<ViewIntent, ViewState, SingleEvent>(appCoroutineDispatchers) {
4042

4143
override val viewState: StateFlow<ViewState>
4244

feature-main/src/test/java/com/hoc/flowmvi/ui/main/MainVMTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.hoc.flowmvi.mvi_testing.BaseMviViewModelTest
1111
import com.hoc.flowmvi.mvi_testing.delayEach
1212
import com.hoc.flowmvi.mvi_testing.mapRight
1313
import com.hoc.flowmvi.mvi_testing.returnsWithDelay
14+
import com.hoc.flowmvi.test_utils.TestAppCoroutineDispatchers
1415
import io.mockk.coEvery
1516
import io.mockk.coVerify
1617
import io.mockk.coVerifySequence
@@ -54,6 +55,7 @@ class MainVMTest : BaseMviViewModelTest<
5455
getUsersUseCase = getUserUseCase,
5556
refreshGetUsers = refreshGetUsersUseCase,
5657
removeUser = removeUser,
58+
appCoroutineDispatchers = TestAppCoroutineDispatchers(coroutineRule.testDispatcher)
5759
)
5860
}
5961

feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.launchIn
3030
import kotlinx.coroutines.flow.map
3131
import kotlinx.coroutines.flow.merge
3232
import kotlinx.coroutines.flow.onEach
33-
import org.koin.androidx.viewmodel.ext.android.viewModel
33+
import org.koin.androidx.viewmodel.ext.android.stateViewModel
3434
import timber.log.Timber
3535
import kotlin.time.ExperimentalTime
3636

@@ -40,7 +40,7 @@ import kotlin.time.ExperimentalTime
4040
class SearchActivity :
4141
AbstractMviActivity<ViewIntent, ViewState, SingleEvent, SearchVM>(R.layout.activity_search) {
4242
private val binding by viewBinding<ActivitySearchBinding>()
43-
override val vm by viewModel<SearchVM>()
43+
override val vm by stateViewModel<SearchVM>()
4444

4545
private val searchViewQueryTextEventChannel = Channel<SearchViewQueryTextEvent>()
4646
private val searchAdapter = SearchAdapter()

0 commit comments

Comments
 (0)