Skip to content

Commit 5d53349

Browse files
authored
feat: ⬆️ update libs and gradle (#32)
1 parent ad8145d commit 5d53349

32 files changed

+269
-318
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77
/captures
88
*.iml
99
*/.kotlintest
10+
.idea

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ My way to MVVM using RxJava with new Android databinding
2222
* picasso
2323

2424
### Testing
25-
* [KotlinTest][10]
25+
* [Kotest][10]
2626
* [Android Junit 5][11]
2727

2828
TODO LIST
@@ -68,5 +68,5 @@ License
6868
[7]: https://developer.android.com/topic/libraries/architecture/room.html
6969
[8]: https://developer.android.com/topic/libraries/architecture/livedata.html
7070
[9]: https://developer.android.com/topic/libraries/architecture/viewmodel.html
71-
[10]: https://github.com/kotlintest/kotlintest
71+
[10]: https://kotest.io
7272
[11]: https://github.com/mannodermaus/android-junit5

app/build.gradle

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ android {
2222
minSdkVersion min_sdk
2323
versionCode 1
2424
versionName "1.0"
25+
javaCompileOptions {
26+
annotationProcessorOptions {
27+
arguments += [
28+
"room.schemaLocation" : "$projectDir/schemas".toString(),
29+
"room.incremental" : "true",
30+
"room.expandProjection": "true"
31+
]
32+
}
33+
}
34+
2535
}
2636

2737
buildTypes {
@@ -31,8 +41,8 @@ android {
3141
}
3242
}
3343

34-
dataBinding {
35-
enabled = true
44+
buildFeatures {
45+
dataBinding true
3646
}
3747

3848
compileOptions {
@@ -45,61 +55,55 @@ android {
4555
}
4656
}
4757

48-
kapt {
49-
arguments {
50-
arg("room.schemaLocation", "$projectDir/schemas".toString())
51-
}
52-
}
53-
5458
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
5559
kotlinOptions {
5660
jvmTarget = JavaVersion.VERSION_1_8
5761
}
5862
}
5963

6064
dependencies {
61-
kapt libs.databinding_compiler
62-
kapt libs.arch_comp_room_compiler
63-
kaptTest libs.arch_comp_room_compiler
65+
kapt libs.androidx_room_compiler
66+
kaptTest libs.androidx_room_compiler
6467

65-
implementation libs.arch_comp_livedata
66-
implementation libs.arch_comp_viewmodel
67-
implementation libs.arch_comp_room
68-
implementation libs.arch_comp_room_rxjava
68+
implementation libs.androidx_constraint
69+
implementation libs.androidx_livedata
70+
implementation libs.androidx_room
71+
implementation libs.androidx_room_rxjava
72+
implementation libs.androidx_viewmodel
6973
implementation libs.arrow
70-
implementation libs.constraint
71-
implementation libs.design
7274
implementation(libs.floating_search) {
7375
exclude module: 'support-v4'
7476
}
77+
implementation libs.material
7578
implementation libs.okhttp
7679
implementation libs.okhttp_logging
80+
implementation libs.picasso
7781
implementation libs.koin
7882
implementation libs.koin_android
7983
implementation libs.koin_architecture
8084
implementation libs.kotlin_stdlib
81-
implementation libs.picasso
8285
implementation libs.retrofit
8386
implementation libs.retrofit_gson
8487
implementation libs.retrofit_rx_java
8588
implementation libs.rx_java
8689
implementation libs.rx_android
8790
implementation libs.steho
8891

89-
testImplementation (libs.arch_comp_room_test) {
92+
testImplementation(libs.androidx_room_test) {
9093
exclude module: 'junit'
9194
}
92-
testImplementation (libs.arch_comp_test) {
95+
testImplementation(libs.androidx_test) {
9396
exclude module: 'junit'
9497
}
9598
testImplementation libs.junit_api
9699
testImplementation libs.junit_params
97-
testImplementation libs.kotlintest
98-
testImplementation (libs.koin_test) {
100+
testImplementation libs.mockito_kotlin
101+
testImplementation libs.kotest_runner
102+
testImplementation libs.kotest_assertions
103+
testImplementation libs.kotest_property
104+
testImplementation(libs.koin_test) {
99105
exclude module: 'junit'
100106
}
101-
testImplementation libs.mockito_kotlin
102-
103107
testRuntimeOnly libs.junit_engine
104108
}
105109
repositories {

app/src/main/java/es/ffgiraldez/comicsearch/comics/data/ComicDataSources.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package es.ffgiraldez.comicsearch.comics.data
22

3-
import arrow.core.Option
43
import es.ffgiraldez.comicsearch.comics.domain.Query
4+
import es.ffgiraldez.comicsearch.platform.Option
55
import io.reactivex.Completable
66
import io.reactivex.Flowable
77
import io.reactivex.Single

app/src/main/java/es/ffgiraldez/comicsearch/comics/data/ComicRepository.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package es.ffgiraldez.comicsearch.comics.data
22

33
import arrow.core.Either
4-
import arrow.core.None
5-
import arrow.core.Option
6-
import arrow.core.Some
4+
import arrow.core.Either.Left
5+
import arrow.core.Either.Right
76
import es.ffgiraldez.comicsearch.comics.domain.ComicError
87
import es.ffgiraldez.comicsearch.comics.domain.ComicError.EmptyResultsError
98
import es.ffgiraldez.comicsearch.comics.domain.ComicError.NetworkError
109
import es.ffgiraldez.comicsearch.comics.domain.Query
10+
import es.ffgiraldez.comicsearch.platform.Option
1111
import es.ffgiraldez.comicsearch.platform.left
1212
import es.ffgiraldez.comicsearch.platform.right
1313
import io.reactivex.Flowable
@@ -24,8 +24,8 @@ abstract class ComicRepository<T> (
2424
query: Option<Query>,
2525
term: String
2626
): Flowable<out Either<ComicError, List<T>>> = when (query) {
27-
is None -> search(term)
28-
is Some -> fetch(query)
27+
is Left -> search(term)
28+
is Right -> fetch(query)
2929
}
3030

3131
private fun search(term: String): Flowable<Either<ComicError, List<T>>> =
@@ -44,8 +44,8 @@ abstract class ComicRepository<T> (
4444
local.insert(term, it).toFlowable()
4545
})
4646

47-
private fun fetch(it: Some<Query>): Flowable<Either<EmptyResultsError, List<T>>> =
48-
local.findByQuery(it.t)
47+
private fun fetch(it: Right<Query>): Flowable<Either<EmptyResultsError, List<T>>> =
48+
local.findByQuery(it.b)
4949
.map {
5050
when (it.isEmpty()) {
5151
true -> Either.left(EmptyResultsError)

app/src/main/java/es/ffgiraldez/comicsearch/comics/data/network/ComicVineApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import retrofit2.http.Query
77
interface ComicVineApi {
88

99
companion object {
10-
const val KEY = "75d580a0593b7320727309feb6309f62def786cd"
11-
const val BASE_URL = "http://www.comicvine.com"
10+
const val KEY = "d800216c205879548fdc491e0a260ff402633c00"
11+
const val BASE_URL = "https://www.comicvine.com"
1212
}
1313

1414
@GET("/api/search?format=json&field_list=name&limit=20&page=1&resources=volume&api_key=$KEY")
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package es.ffgiraldez.comicsearch.platform
22

3-
import androidx.databinding.BindingAdapter
43
import android.widget.ImageView
4+
import androidx.databinding.BindingAdapter
55
import com.squareup.picasso.Picasso
66

77
@BindingAdapter("image")
8-
fun bindImage(image: ImageView, url: String) = Picasso.with(image.context).load(url).into(image)
8+
fun bindImage(image: ImageView, url: String) = Picasso.get().load(url).into(image)

app/src/main/java/es/ffgiraldez/comicsearch/platform/Utilities.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package es.ffgiraldez.comicsearch.platform
22

33
import arrow.core.Either
4+
import arrow.core.Left
5+
import arrow.core.Right
46
import arrow.core.left
57
import arrow.core.right
68
import io.reactivex.disposables.CompositeDisposable
79
import io.reactivex.disposables.Disposable
810

11+
typealias Option<A> = Either<Unit, A>
12+
913
fun <A, B> left(a: A): Either<A, B> = a.left()
1014
fun <A, B> right(b: B): Either<A, B> = b.right()
15+
fun <T> T?.toOption(): Option<T> = this?.let { Right(it) } ?: Left(Unit)
1116

1217
operator fun CompositeDisposable.plus(disposable: Disposable): CompositeDisposable = apply {
1318
add(disposable)

app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import es.ffgiraldez.comicsearch.navigation.Navigator
99
import es.ffgiraldez.comicsearch.query.search.presentation.SearchViewModel
1010
import es.ffgiraldez.comicsearch.query.sugestion.presentation.SuggestionViewModel
1111
import org.koin.android.ext.android.inject
12-
import org.koin.android.viewmodel.ext.android.viewModel
12+
import org.koin.androidx.viewmodel.ext.android.viewModel
1313
import org.koin.core.parameter.parametersOf
1414

1515
class QueryActivity : AppCompatActivity() {

app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryViewStateExt.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
package es.ffgiraldez.comicsearch.query.base.ui
22

3-
import arrow.core.Option
4-
import arrow.core.toOption
53
import es.ffgiraldez.comicsearch.comics.domain.ComicError
64
import es.ffgiraldez.comicsearch.query.base.presentation.QueryViewState
75

8-
val <T>QueryViewState<T>.error: Option<ComicError>
6+
val <T>QueryViewState<T>.error: ComicError?
97
get() = when (this) {
10-
is QueryViewState.Error -> _error.toOption()
11-
else -> Option.empty()
8+
is QueryViewState.Error -> _error
9+
else -> null
1210
}
1311

14-
val <T>QueryViewState<T>.hasError: Boolean
15-
get() = !error.isEmpty()
16-
1712
val <T>QueryViewState<T>.results: List<T>
1813
get() = when (this) {
1914
is QueryViewState.Result -> _results

app/src/main/java/es/ffgiraldez/comicsearch/query/search/data/SearchDataSources.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package es.ffgiraldez.comicsearch.query.search.data
22

3-
import arrow.core.Option
4-
import arrow.core.toOption
53
import es.ffgiraldez.comicsearch.comics.data.ComicLocalDataSource
64
import es.ffgiraldez.comicsearch.comics.data.ComicRemoteDataSource
75
import es.ffgiraldez.comicsearch.comics.data.network.ComicVineApi
86
import es.ffgiraldez.comicsearch.comics.data.storage.ComicDatabase
97
import es.ffgiraldez.comicsearch.comics.domain.Query
108
import es.ffgiraldez.comicsearch.comics.domain.Volume
119
import es.ffgiraldez.comicsearch.platform.ComicSchedulers
10+
import es.ffgiraldez.comicsearch.platform.Option
11+
import es.ffgiraldez.comicsearch.platform.toOption
1212
import io.reactivex.Completable
1313
import io.reactivex.Flowable
1414
import io.reactivex.Single

app/src/main/java/es/ffgiraldez/comicsearch/query/search/di/SearchModule.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import es.ffgiraldez.comicsearch.query.search.data.SearchLocalDataSource
44
import es.ffgiraldez.comicsearch.query.search.data.SearchRemoteDataSource
55
import es.ffgiraldez.comicsearch.query.search.data.SearchRepository
66
import es.ffgiraldez.comicsearch.query.search.presentation.SearchViewModel
7+
import org.koin.androidx.viewmodel.dsl.viewModel
78
import org.koin.dsl.module
89

910
val searchModule = module {
1011
factory { SearchLocalDataSource(get(parameters = { it })) }
1112
factory { SearchRemoteDataSource(get()) }
1213
factory { SearchRepository(get(parameters = { it }), get()) }
13-
factory { SearchViewModel(get(parameters = { it })) }
14+
viewModel { SearchViewModel(get(parameters = { it })) }
1415
}

app/src/main/java/es/ffgiraldez/comicsearch/query/search/ui/SearchBindingAdapters.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import es.ffgiraldez.comicsearch.query.base.ui.OnVolumeSelectedListener
1515
import es.ffgiraldez.comicsearch.query.base.ui.QuerySearchSuggestion.ResultSuggestion
1616
import es.ffgiraldez.comicsearch.query.base.ui.QueryVolumeAdapter
1717
import es.ffgiraldez.comicsearch.query.base.ui.error
18-
import es.ffgiraldez.comicsearch.query.base.ui.hasError
1918
import es.ffgiraldez.comicsearch.query.base.ui.loading
2019
import es.ffgiraldez.comicsearch.query.base.ui.results
2120
import es.ffgiraldez.comicsearch.query.base.ui.toHumanResponse
@@ -55,30 +54,25 @@ fun RecyclerView.bindStateData(inputAdapter: QueryVolumeAdapter, data: QueryView
5554
}
5655

5756
data?.let {
58-
bindError(data.hasError)
57+
gone(data.error != null)
5958
bindResults(data.results)
6059
}
6160
}
6261

6362

6463
@BindingAdapter("state_change")
65-
fun FrameLayout.bindStateVisibility(data: QueryViewState<Volume>?) = data?.let { state ->
66-
state.error.fold({ View.GONE }, { View.VISIBLE }).let { visibility = it }
64+
fun FrameLayout.bindStateVisibility(data: QueryViewState<Volume>?) = data?.run {
65+
visibility = error?.let { View.VISIBLE } ?: View.GONE
6766
}
6867

6968
@BindingAdapter("state_change")
70-
fun TextView.bindErrorText(data: QueryViewState<Volume>?) = data?.let { state ->
71-
state.error.fold({ Unit }, { text = it.toHumanResponse() })
72-
}
69+
fun TextView.bindErrorText(data: QueryViewState<Volume>?) = data?.error?.run { text = toHumanResponse() }
7370

7471
@BindingAdapter("state_change")
75-
fun ProgressBar.bindProgress(data: QueryViewState<Volume>?) = data?.let { state ->
76-
gone(!state.loading)
72+
fun ProgressBar.bindProgress(data: QueryViewState<Volume>?) = data?.run {
73+
gone(!loading)
7774
}
7875

79-
private fun RecyclerView.bindError(error: Boolean): Unit =
80-
gone(error)
81-
8276
private fun RecyclerView.bindResults(error: List<Volume>): Unit = with(adapter as QueryVolumeAdapter) {
8377
this.submitList(error)
8478
}

app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/data/SuggestionDataSources.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package es.ffgiraldez.comicsearch.query.sugestion.data
22

3-
import arrow.core.Option
4-
import arrow.core.toOption
53
import es.ffgiraldez.comicsearch.comics.data.ComicLocalDataSource
64
import es.ffgiraldez.comicsearch.comics.data.ComicRemoteDataSource
75
import es.ffgiraldez.comicsearch.comics.data.network.ComicVineApi
86
import es.ffgiraldez.comicsearch.comics.data.storage.ComicDatabase
97
import es.ffgiraldez.comicsearch.comics.domain.Query
108
import es.ffgiraldez.comicsearch.platform.ComicSchedulers
9+
import es.ffgiraldez.comicsearch.platform.Option
10+
import es.ffgiraldez.comicsearch.platform.toOption
1111
import io.reactivex.Completable
1212
import io.reactivex.Flowable
1313
import io.reactivex.Single

app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/di/SuggestionModule.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import es.ffgiraldez.comicsearch.query.sugestion.data.SuggestionLocalDataSource
44
import es.ffgiraldez.comicsearch.query.sugestion.data.SuggestionRemoteDataSource
55
import es.ffgiraldez.comicsearch.query.sugestion.data.SuggestionRepository
66
import es.ffgiraldez.comicsearch.query.sugestion.presentation.SuggestionViewModel
7+
import org.koin.androidx.viewmodel.dsl.viewModel
78
import org.koin.dsl.module
89

910
val suggestionModule = module {
1011
factory { SuggestionLocalDataSource(get(parameters = { it })) }
1112
factory { SuggestionRemoteDataSource(get()) }
1213
factory { SuggestionRepository(get(parameters = { it }), get()) }
13-
factory { SuggestionViewModel(get(parameters = { it })) }
14+
viewModel { SuggestionViewModel(get(parameters = { it })) }
1415
}

app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/ui/SuggestionBindingAdapters.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ package es.ffgiraldez.comicsearch.query.sugestion.ui
33
import androidx.databinding.BindingAdapter
44
import com.arlib.floatingsearchview.FloatingSearchView
55
import es.ffgiraldez.comicsearch.query.base.presentation.QueryViewState
6-
import es.ffgiraldez.comicsearch.query.base.ui.QuerySearchSuggestion.ErrorSuggestion
6+
import es.ffgiraldez.comicsearch.query.base.presentation.QueryViewState.Error
77
import es.ffgiraldez.comicsearch.query.base.ui.QuerySearchSuggestion.ResultSuggestion
8-
import es.ffgiraldez.comicsearch.query.base.ui.error
98
import es.ffgiraldez.comicsearch.query.base.ui.loading
109
import es.ffgiraldez.comicsearch.query.base.ui.results
1110
import es.ffgiraldez.comicsearch.query.base.ui.toHumanResponse
@@ -16,17 +15,18 @@ fun FloatingSearchView.bindQueryChangeListener(
1615
): Unit = setOnQueryChangeListener(listener)
1716

1817
@BindingAdapter("state_change")
19-
fun FloatingSearchView.bindSuggestions(data: QueryViewState<String>?): Unit? = data?.let { state ->
20-
toggleProgress(state.loading)
21-
state.error.fold({
22-
state.results.map { ResultSuggestion(it) }
23-
}, {
24-
listOf(ErrorSuggestion(it.toHumanResponse()))
25-
}).let(::swapSuggestions)
18+
fun FloatingSearchView.bindSuggestions(data: QueryViewState<String>?) = data?.run {
19+
toggleProgress(loading)
20+
swapSuggestions(suggestions)
2621
}
2722

23+
private val QueryViewState<String>.suggestions: List<ResultSuggestion>
24+
get() = when (this) {
25+
is Error -> listOf(ResultSuggestion(_error.toHumanResponse()))
26+
else -> results.map { ResultSuggestion(it) }
27+
}
28+
2829
private fun FloatingSearchView.toggleProgress(show: Boolean): Unit = when (show) {
2930
true -> showProgress()
3031
false -> hideProgress()
3132
}
32-

0 commit comments

Comments
 (0)