Skip to content

Commit 0de2a42

Browse files
committed
feat: migrate to Room-RxJava3 and dump RxBridge
1 parent 1700fe6 commit 0de2a42

File tree

7 files changed

+115
-129
lines changed

7 files changed

+115
-129
lines changed

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ The goal of this project is to have a demo application using popular MVI Arch pa
1212
- Lottie for Splash Animation
1313
- Dagger HILT for DI (Migrated from Koin in this commit: [21a9db64bee1359bd57cf99ba757467da63f10b2](https://github.com/RivuChk/Jetpack-Compose-MVI-Demo/commit/21a9db64bee1359bd57cf99ba757467da63f10b2))
1414
- RxJava 3 for Streams
15-
- Room for DB (With RxJava 2)
16-
- RxBridge, to convert Rx2 Streams (from Room) to Rx3
15+
- Room for DB (With RxJava 3)
1716
- Mockito for mocking
18-
- LiveData for emiting states from ViewModel
19-
- `LazyColumnItems` from Compose for showing List
17+
- LiveData for emitting states from ViewModel
18+
- `LazyColumnFor` from Compose for showing List
2019
- *Glide* for image loading with Composable `Image`
2120
- Composable `ConstraintLayout`
2221
- Composable `TopAppBar`

app/build.gradle

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ dependencies {
103103

104104
implementation "androidx.compose.runtime:runtime:$compose_version"
105105
implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
106-
implementation "androidx.compose.runtime:runtime-rxjava2:$compose_version"
106+
implementation "androidx.compose.runtime:runtime-rxjava3:$compose_version"
107107
implementation "androidx.compose.compiler:compiler:$compose_version"
108108
implementation "androidx.compose.foundation:foundation:$compose_version"
109109
implementation "androidx.compose.ui:ui:$compose_version"
@@ -161,12 +161,10 @@ dependencies {
161161
androidTestImplementation("androidx.ui:ui-test:$compose_version")
162162

163163
//Room DB
164-
def room_version = "2.3.0-alpha01"
164+
def room_version = "2.3.0-alpha03"
165165

166166
implementation "androidx.room:room-runtime:$room_version"
167167
implementation "androidx.room:room-ktx:$room_version"
168-
implementation "androidx.room:room-rxjava2:$room_version"
168+
implementation "androidx.room:room-rxjava3:$room_version"
169169
kapt "androidx.room:room-compiler:$room_version"
170-
//RxJava3 Bridge Required as Room doesn't support RxJava3 yet
171-
implementation "com.github.akarnokd:rxjava3-bridge:3.0.0"
172170
}

app/src/main/java/dev/rivu/mvijetpackcomposedemo/moviesearch/data/MovieRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.rivu.mvijetpackcomposedemo.moviesearch.data
22

3-
import androidx.room.EmptyResultSetException
3+
import androidx.room.rxjava3.EmptyResultSetException
44
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.model.Movie
55
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.model.MovieDetail
66
import io.reactivex.rxjava3.core.Completable

app/src/main/java/dev/rivu/mvijetpackcomposedemo/moviesearch/data/local/LocalMovieDataStore.kt

Lines changed: 100 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,149 +1,138 @@
11
package dev.rivu.mvijetpackcomposedemo.moviesearch.data.local
22

3-
import androidx.room.EmptyResultSetException
3+
import androidx.room.rxjava3.EmptyResultSetException
44
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.MovieDataStore
55
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.local.database.MovieDao
66
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.local.database.MovieEnitity
77
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.model.Movie
88
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.model.MovieDetail
9-
import hu.akarnokd.rxjava3.bridge.RxJavaBridge
109
import io.reactivex.rxjava3.core.Completable
1110
import io.reactivex.rxjava3.core.Flowable
1211
import io.reactivex.rxjava3.core.Single
1312

1413
class LocalMovieDataStore(private val movieDao: MovieDao) : MovieDataStore {
1514

1615
override fun getMoviesStream(searchQuery: String): Flowable<List<Movie>> {
17-
return RxJavaBridge.toV3Flowable(
18-
movieDao.getMoviesStream(searchQuery)
19-
.map { list ->
20-
list.map {
21-
Movie(
22-
imdbID = it.imdbID,
23-
poster = it.poster,
24-
title = it.title,
25-
type = it.type,
26-
year = it.year
27-
)
28-
}
16+
return movieDao.getMoviesStream(searchQuery)
17+
.map { list ->
18+
list.map {
19+
Movie(
20+
imdbID = it.imdbID,
21+
poster = it.poster,
22+
title = it.title,
23+
type = it.type,
24+
year = it.year
25+
)
2926
}
30-
)
27+
}
3128
}
3229

3330
override fun getMovies(searchQuery: String): Single<List<Movie>> {
34-
return RxJavaBridge.toV3Single(
35-
movieDao.getMovies(searchQuery)
36-
.map { list ->
37-
list.map {
38-
Movie(
39-
imdbID = it.imdbID,
40-
poster = it.poster,
41-
title = it.title,
42-
type = it.type,
43-
year = it.year
44-
)
45-
}
46-
}
47-
)
48-
}
49-
50-
override fun addMovies(movieList: List<Movie>): Completable {
51-
return return RxJavaBridge.toV3Completable(
52-
movieDao.addMovies(
53-
movieList.map {
54-
MovieEnitity(
31+
return movieDao.getMovies(searchQuery)
32+
.map { list ->
33+
list.map {
34+
Movie(
5535
imdbID = it.imdbID,
5636
poster = it.poster,
5737
title = it.title,
5838
type = it.type,
5939
year = it.year
6040
)
6141
}
62-
)
63-
)
42+
}
6443
}
6544

66-
override fun getMovieDetail(imdbId: String): Single<MovieDetail> {
67-
return RxJavaBridge.toV3Single(
68-
movieDao.getMovie(imdbId)
69-
.map {
70-
if (it.detail == null) {
71-
throw EmptyResultSetException("detail not present for this movie")
72-
} else {
73-
MovieDetail(
74-
imdbID = it.imdbID,
75-
poster = it.poster,
76-
title = it.title,
77-
type = it.type,
78-
year = it.year,
79-
80-
response = it.detail.response,
81-
actors = it.detail.actors,
82-
awards = it.detail.awards,
83-
boxOffice = it.detail.boxOffice,
84-
country = it.detail.country,
85-
dVD = it.detail.dVD,
86-
director = it.detail.director,
87-
genre = it.detail.genre,
88-
imdbRating = it.detail.imdbRating,
89-
imdbVotes = it.detail.imdbVotes,
90-
language = it.detail.language,
91-
metascore = it.detail.metascore,
92-
plot = it.detail.plot,
93-
production = it.detail.production,
94-
rated = it.detail.rated,
95-
ratings = it.detail.ratings.map {
96-
MovieDetail.Rating(
97-
source = it.source,
98-
value = it.value
99-
)
100-
},
101-
released = it.detail.released,
102-
runtime = it.detail.runtime,
103-
website = it.detail.website,
104-
writer = it.detail.writer
105-
)
106-
}
107-
}
45+
override fun addMovies(movieList: List<Movie>): Completable {
46+
return movieDao.addMovies(
47+
movieList.map {
48+
MovieEnitity(
49+
imdbID = it.imdbID,
50+
poster = it.poster,
51+
title = it.title,
52+
type = it.type,
53+
year = it.year
54+
)
55+
}
10856
)
10957
}
11058

111-
override fun addMovieDetail(movie: MovieDetail): Completable {
112-
return RxJavaBridge.toV3Completable(
113-
movieDao.updateMovieInDB(
114-
MovieEnitity(
115-
imdbID = movie.imdbID,
116-
poster = movie.poster,
117-
title = movie.title,
118-
type = movie.type,
119-
year = movie.year,
120-
detail = MovieEnitity.Detail(
121-
response = movie.response,
122-
actors = movie.actors,
123-
awards = movie.awards,
124-
boxOffice = movie.boxOffice,
125-
country = movie.country,
126-
dVD = movie.dVD,
127-
director = movie.director,
128-
genre = movie.genre,
129-
imdbRating = movie.imdbRating,
130-
imdbVotes = movie.imdbVotes,
131-
language = movie.language,
132-
metascore = movie.metascore,
133-
plot = movie.plot,
134-
production = movie.production,
135-
rated = movie.rated,
136-
ratings = movie.ratings.map {
137-
MovieEnitity.Detail.Rating(
59+
override fun getMovieDetail(imdbId: String): Single<MovieDetail> {
60+
return movieDao.getMovie(imdbId)
61+
.map {
62+
if (it.detail == null) {
63+
throw EmptyResultSetException("detail not present for this movie")
64+
} else {
65+
MovieDetail(
66+
imdbID = it.imdbID,
67+
poster = it.poster,
68+
title = it.title,
69+
type = it.type,
70+
year = it.year,
71+
72+
response = it.detail.response,
73+
actors = it.detail.actors,
74+
awards = it.detail.awards,
75+
boxOffice = it.detail.boxOffice,
76+
country = it.detail.country,
77+
dVD = it.detail.dVD,
78+
director = it.detail.director,
79+
genre = it.detail.genre,
80+
imdbRating = it.detail.imdbRating,
81+
imdbVotes = it.detail.imdbVotes,
82+
language = it.detail.language,
83+
metascore = it.detail.metascore,
84+
plot = it.detail.plot,
85+
production = it.detail.production,
86+
rated = it.detail.rated,
87+
ratings = it.detail.ratings.map {
88+
MovieDetail.Rating(
13889
source = it.source,
13990
value = it.value
14091
)
14192
},
142-
released = movie.released,
143-
runtime = movie.runtime,
144-
website = movie.website,
145-
writer = movie.writer
93+
released = it.detail.released,
94+
runtime = it.detail.runtime,
95+
website = it.detail.website,
96+
writer = it.detail.writer
14697
)
98+
}
99+
}
100+
}
101+
102+
override fun addMovieDetail(movie: MovieDetail): Completable {
103+
return movieDao.updateMovieInDB(
104+
MovieEnitity(
105+
imdbID = movie.imdbID,
106+
poster = movie.poster,
107+
title = movie.title,
108+
type = movie.type,
109+
year = movie.year,
110+
detail = MovieEnitity.Detail(
111+
response = movie.response,
112+
actors = movie.actors,
113+
awards = movie.awards,
114+
boxOffice = movie.boxOffice,
115+
country = movie.country,
116+
dVD = movie.dVD,
117+
director = movie.director,
118+
genre = movie.genre,
119+
imdbRating = movie.imdbRating,
120+
imdbVotes = movie.imdbVotes,
121+
language = movie.language,
122+
metascore = movie.metascore,
123+
plot = movie.plot,
124+
production = movie.production,
125+
rated = movie.rated,
126+
ratings = movie.ratings.map {
127+
MovieEnitity.Detail.Rating(
128+
source = it.source,
129+
value = it.value
130+
)
131+
},
132+
released = movie.released,
133+
runtime = movie.runtime,
134+
website = movie.website,
135+
writer = movie.writer
147136
)
148137
)
149138
)

app/src/main/java/dev/rivu/mvijetpackcomposedemo/moviesearch/data/local/database/MovieDao.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package dev.rivu.mvijetpackcomposedemo.moviesearch.data.local.database
22

33
import androidx.room.*
4-
import io.reactivex.Completable
5-
import io.reactivex.Flowable
6-
import io.reactivex.Single
4+
import io.reactivex.rxjava3.core.Completable
5+
import io.reactivex.rxjava3.core.Flowable
6+
import io.reactivex.rxjava3.core.Single
77

88
@Dao
99
interface MovieDao {

app/src/test/java/dev/rivu/mvijetpackcomposedemo/moviesearch/data/MovieRepositorySpecTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import androidx.room.EmptyResultSetException
1+
import androidx.room.rxjava3.EmptyResultSetException
22
import com.nhaarman.mockitokotlin2.*
33
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.MovieDataStore
44
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.MovieRepository

app/src/test/java/dev/rivu/mvijetpackcomposedemo/moviesearch/data/local/LocalMovieDataStoreSpec.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import androidx.room.EmptyResultSetException
1+
import androidx.room.rxjava3.EmptyResultSetException
22
import com.nhaarman.mockitokotlin2.atLeastOnce
33
import com.nhaarman.mockitokotlin2.mock
44
import com.nhaarman.mockitokotlin2.verify
@@ -12,9 +12,9 @@ import dev.rivu.mvijetpackcomposedemo.moviesearch.data.local.database.MovieDao
1212
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.local.database.MovieEnitity
1313
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.model.Movie
1414
import dev.rivu.mvijetpackcomposedemo.moviesearch.data.model.MovieDetail
15-
import io.reactivex.Completable
16-
import io.reactivex.Flowable
17-
import io.reactivex.Single
15+
import io.reactivex.rxjava3.core.Completable
16+
import io.reactivex.rxjava3.core.Flowable
17+
import io.reactivex.rxjava3.core.Single
1818
import org.mockito.ArgumentMatchers.anyList
1919
import org.mockito.ArgumentMatchers.anyString
2020
import org.spekframework.spek2.Spek

0 commit comments

Comments
 (0)