Skip to content

Commit bcc341b

Browse files
committed
Major code changes and improvement on the project
1 parent 6ae981f commit bcc341b

File tree

29 files changed

+338
-216
lines changed

29 files changed

+338
-216
lines changed

.circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
command: ./gradlew detekt
3636
- run:
3737
name: Run Ktlint
38-
command: ./gradlew ktlintFormat
38+
command: ./gradlew ktlintCheck
3939
- run:
4040
name: Run Lint
4141
command: ./gradlew lintDebug

README.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ Users are able to search tv series by query.
5151
* [MVVM](https://www.raywenderlich.com/8984-mvvm-on-android)
5252

5353
### Patterns
54-
* [Repository](https://developer.android.com/jetpack/docs/guide)
55-
* [Observer](https://code.tutsplus.com/tutorials/android-design-patterns-the-observer-pattern--cms-28963)
56-
* [UseCase](https://caminao.blog/how-to-implement-symbolic-representations/patterns/functional-patterns/use-case-patterns/)
54+
* [Repository Pattern](https://developer.android.com/jetpack/docs/guide)
55+
* [Observer Pattern](https://code.tutsplus.com/tutorials/android-design-patterns-the-observer-pattern--cms-28963)
56+
* [UseCase Pattern](https://caminao.blog/how-to-implement-symbolic-representations/patterns/functional-patterns/use-case-patterns/)
57+
* [Delegation Pattern](https://en.wikipedia.org/wiki/Delegation_pattern)
5758

5859
### Approaches
5960
* [SOLID Principle](https://itnext.io/solid-principles-explanation-and-examples-715b975dcad4?gi=79443348411d)

app/build.gradle.kts

+6-15
Original file line numberDiff line numberDiff line change
@@ -91,39 +91,30 @@ android {
9191
dependencies {
9292
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
9393

94-
api(project(Modules.data))
95-
api(project(Modules.domain))
9694
api(project(Modules.base))
95+
api(project(Modules.data))
96+
implementation(project(Modules.domain))
9797

98-
api(Dependencies.kotlin)
99-
api(Dependencies.material)
98+
implementation(Dependencies.material)
10099
implementation(Dependencies.constraint_layout)
101100
implementation(Dependencies.core_ktx)
102101
implementation(Dependencies.appcompat)
103102

104-
api(Dependencies.coroutines_core)
105-
api(Dependencies.coroutines_android)
103+
implementation(Dependencies.coroutines_core)
106104

107-
api(Dependencies.lifecycle_extensions)
108-
implementation(Dependencies.lifecycle_viewmodel)
105+
implementation(Dependencies.lifecycle_extensions)
109106
implementation(Dependencies.lifecycle_viewmodel_ktx)
110107
kapt(Dependencies.lifecycle_compiler)
111108

112109
implementation(Dependencies.dagger)
113110
implementation(Dependencies.dagger_android)
114-
api(Dependencies.dagger_android_support)
115111
compileOnly(Dependencies.javax_annotation)
116112
kapt(Dependencies.dagger_android_processor)
117113
kapt(Dependencies.dagger_compiler)
118114

119115
implementation(Dependencies.timberkt)
120116

121-
api(Dependencies.gson)
122-
api(Dependencies.retrofit)
123-
api(Dependencies.okHttp)
124-
api(Dependencies.logging)
125-
126-
api(Dependencies.glide)
117+
implementation(Dependencies.glide)
127118

128119
testImplementation(TestDependencies.test_core)
129120
testImplementation(TestDependencies.runner)

app/src/test/java/com/mobilemovement/kotlintvmaze/MainViewModelTest.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@ import com.mobilemovement.kotlintvmaze.data.ImageViewItem
88
import com.mobilemovement.kotlintvmaze.data.SeriesViewItem
99
import com.mobilemovement.kotlintvmaze.data.ShowViewItem
1010
import com.mobilemovement.kotlintvmaze.domain.GetSeriesUseCase
11-
import com.mobilemovement.kotlintvmaze.ext.observeOnce
1211
import com.mobilemovement.kotlintvmaze.ui.MainViewModel
1312
import com.mobilemovement.kotlintvmaze.ui.MainViewModel.SeriesUiState
1413
import com.mobilemovement.kotlintvmaze.util.CoroutinesTestRule
14+
import com.mobilemovement.kotlintvmaze.util.observeOnce
1515
import io.mockk.coEvery
1616
import io.mockk.coVerify
1717
import io.mockk.mockk
1818
import io.mockk.mockkObject
1919
import kotlinx.coroutines.ExperimentalCoroutinesApi
20-
import kotlinx.coroutines.runBlocking
20+
import kotlinx.coroutines.test.runBlockingTest
2121
import org.junit.After
2222
import org.junit.Before
2323
import org.junit.Rule
2424
import org.junit.Test
2525
import org.mockito.ArgumentMatchers.any
2626

27+
@ExperimentalCoroutinesApi
2728
class MainViewModelTest {
2829

29-
@ExperimentalCoroutinesApi
3030
@get:Rule
3131
val coroutinesTestRule = CoroutinesTestRule()
3232

@@ -39,7 +39,7 @@ class MainViewModelTest {
3939
private lateinit var viewModel: MainViewModel
4040

4141
@Before
42-
fun setUp() = runBlocking {
42+
fun setUp() = coroutinesTestRule.testDispatcher.runBlockingTest {
4343
getSeriesUseCase = mockk()
4444

4545
mockkObject(SeriesUiState())
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.mobilemovement.kotlintvmaze.util
22

3-
import kotlinx.coroutines.CoroutineDispatcher
43
import kotlinx.coroutines.Dispatchers
54
import kotlinx.coroutines.ExperimentalCoroutinesApi
65
import kotlinx.coroutines.test.TestCoroutineDispatcher
@@ -11,16 +10,17 @@ import org.junit.runner.Description
1110

1211
@ExperimentalCoroutinesApi
1312
class CoroutinesTestRule(
14-
private val dispatcher: CoroutineDispatcher = TestCoroutineDispatcher()
13+
val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
1514
) : TestWatcher() {
1615

1716
override fun starting(description: Description?) {
1817
super.starting(description)
19-
Dispatchers.setMain(dispatcher)
18+
Dispatchers.setMain(testDispatcher)
2019
}
2120

2221
override fun finished(description: Description?) {
2322
super.finished(description)
2423
Dispatchers.resetMain()
24+
testDispatcher.cleanupTestCoroutines()
2525
}
2626
}

app/src/test/java/com/mobilemovement/kotlintvmaze/ext/LiveData.kt renamed to app/src/test/java/com/mobilemovement/kotlintvmaze/util/LiveData.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package com.mobilemovement.kotlintvmaze.ext
1+
package com.mobilemovement.kotlintvmaze.util
22

33
import androidx.lifecycle.LiveData
4-
import com.mobilemovement.kotlintvmaze.util.OneTimeObserver
54

65
fun <T> LiveData<T>.observeOnce(onChangeHandler: (T) -> Unit) {
76
val observer = OneTimeObserver(handler = onChangeHandler)

base/build.gradle.kts

+5-6
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,21 @@ android {
7676

7777
dependencies {
7878
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
79-
implementation(Dependencies.kotlin)
79+
80+
api(Dependencies.kotlin)
8081
implementation(Dependencies.material)
8182

8283
implementation(Dependencies.coroutines_core)
83-
implementation(Dependencies.coroutines_android)
84+
api(Dependencies.coroutines_android)
8485

8586
implementation(Dependencies.lifecycle_extensions)
8687

8788
implementation(Dependencies.timberkt)
8889

8990
implementation(Dependencies.glide)
90-
implementation(Dependencies.glide_okhttp) {
91-
exclude(mapOf("group" to "glide-parent"))
92-
}
91+
implementation(Dependencies.glide_okhttp)
9392
kapt(Dependencies.glide_compiler)
9493
kapt(Dependencies.android_annotation)
9594

96-
implementation(Dependencies.dagger_android_support)
95+
api(Dependencies.dagger_android_support)
9796
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,3 @@
11
package com.mobilemovement.kotlintvmaze.base.util.coroutines
22

3-
import kotlinx.coroutines.Dispatchers
4-
5-
object DefaultDispatcherProvider : DispatcherProvider {
6-
7-
private val main = Dispatchers.Main
8-
private val ui = Dispatchers.Main
9-
private val io = Dispatchers.IO
10-
private val default = Dispatchers.Default
11-
12-
override fun main() = main
13-
14-
override fun ui() = ui
15-
16-
override fun io() = io
17-
18-
override fun default() = default
19-
}
3+
object DefaultDispatcherProvider : DispatcherProvider
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.mobilemovement.kotlintvmaze.base.util.coroutines
22

3-
import kotlin.coroutines.CoroutineContext
3+
import kotlinx.coroutines.CoroutineDispatcher
4+
import kotlinx.coroutines.Dispatchers
45

56
interface DispatcherProvider {
6-
fun main(): CoroutineContext
77

8-
fun ui(): CoroutineContext
9-
10-
fun io(): CoroutineContext
11-
12-
fun default(): CoroutineContext
8+
fun main(): CoroutineDispatcher = Dispatchers.Main
9+
fun default(): CoroutineDispatcher = Dispatchers.Default
10+
fun io(): CoroutineDispatcher = Dispatchers.IO
11+
fun unconfined(): CoroutineDispatcher = Dispatchers.Unconfined
1312
}

0 commit comments

Comments
 (0)