Skip to content

Commit aad269c

Browse files
committed
Treewide: Implement RawQuery
* Make order by ASC and DESC for data that show in movie, tvshow and their favorite * Fixed FAB Layout
1 parent d176b65 commit aad269c

22 files changed

+568
-172
lines changed

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/source/DataSource.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@ import com.dicoding.moviecatalog.vo.Resource
1010

1111
interface DataSource {
1212

13-
fun getAllMovies(listId: String): LiveData<Resource<PagedList<MovieListEntity>>>
13+
fun getAllMovies(listId: String, sort: String): LiveData<Resource<PagedList<MovieListEntity>>>
1414

1515
fun getSelectedMovies(movieId: Int): LiveData<Resource<MovieDetailEntity>>
1616

17-
fun getFavoriteMovies(): LiveData<PagedList<MovieDetailEntity>>
17+
fun getFavoriteMovies(sort: String): LiveData<PagedList<MovieDetailEntity>>
1818

1919
fun updateFavMovies(movie: MovieDetailEntity, isSus: Boolean)
2020

21-
fun getAllTvShow(listId: String): LiveData<Resource<PagedList<TvShowListEntity>>>
21+
fun getAllTvShow(listId: String, sort: String): LiveData<Resource<PagedList<TvShowListEntity>>>
2222

2323
fun getSelectedTvShow(tvShowId: Int): LiveData<Resource<TvShowDetailEntity>>
2424

25-
fun getFavoriteTvShow(): LiveData<PagedList<TvShowDetailEntity>>
25+
fun getFavoriteTvShow(sort: String): LiveData<PagedList<TvShowDetailEntity>>
2626

2727
fun updateFavTvShow(tvShow: TvShowDetailEntity, isSus: Boolean)
2828
}

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/source/Repository.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Repository private constructor(
2222
) :
2323
DataSource {
2424

25-
override fun getAllMovies(listId: String): LiveData<Resource<PagedList<MovieListEntity>>> {
25+
override fun getAllMovies(listId: String, sort: String): LiveData<Resource<PagedList<MovieListEntity>>> {
2626
return object :
2727
NetworkBoundResource<PagedList<MovieListEntity>, ArrayList<MovieListResponse>>(
2828
appExecutors
@@ -33,7 +33,7 @@ class Repository private constructor(
3333
.setInitialLoadSizeHint(4)
3434
.setPageSize(4)
3535
.build()
36-
return LivePagedListBuilder(localDataSource.getAllMovies(), config).build()
36+
return LivePagedListBuilder(localDataSource.getAllMovies(sort), config).build()
3737
}
3838

3939
override fun shouldFetch(data: PagedList<MovieListEntity>?): Boolean =
@@ -130,14 +130,14 @@ class Repository private constructor(
130130
}.asLiveData()
131131
}
132132

133-
override fun getFavoriteMovies(): LiveData<PagedList<MovieDetailEntity>> {
133+
override fun getFavoriteMovies(sort: String): LiveData<PagedList<MovieDetailEntity>> {
134134
val config = PagedList.Config.Builder()
135135
.setEnablePlaceholders(false)
136136
.setInitialLoadSizeHint(4)
137137
.setPageSize(4)
138138
.build()
139139

140-
return LivePagedListBuilder(localDataSource.getFavMovies(), config).build()
140+
return LivePagedListBuilder(localDataSource.getFavMovies(sort), config).build()
141141
}
142142

143143
override fun updateFavMovies(movie: MovieDetailEntity, isSus: Boolean) {
@@ -146,7 +146,7 @@ class Repository private constructor(
146146
}
147147
}
148148

149-
override fun getAllTvShow(listId: String): LiveData<Resource<PagedList<TvShowListEntity>>> {
149+
override fun getAllTvShow(listId: String, sort: String): LiveData<Resource<PagedList<TvShowListEntity>>> {
150150
return object :
151151
NetworkBoundResource<PagedList<TvShowListEntity>, ArrayList<TvShowListResponse>>(
152152
appExecutors
@@ -157,7 +157,7 @@ class Repository private constructor(
157157
.setInitialLoadSizeHint(4)
158158
.setPageSize(4)
159159
.build()
160-
return LivePagedListBuilder(localDataSource.getAllTvShow(), config).build()
160+
return LivePagedListBuilder(localDataSource.getAllTvShow(sort), config).build()
161161
}
162162

163163
override fun shouldFetch(data: PagedList<TvShowListEntity>?): Boolean =
@@ -255,14 +255,14 @@ class Repository private constructor(
255255
}.asLiveData()
256256
}
257257

258-
override fun getFavoriteTvShow(): LiveData<PagedList<TvShowDetailEntity>> {
258+
override fun getFavoriteTvShow(sort: String): LiveData<PagedList<TvShowDetailEntity>> {
259259
val config = PagedList.Config.Builder()
260260
.setEnablePlaceholders(false)
261261
.setInitialLoadSizeHint(4)
262262
.setPageSize(4)
263263
.build()
264264

265-
return LivePagedListBuilder(localDataSource.getFavTvShow(), config).build()
265+
return LivePagedListBuilder(localDataSource.getFavTvShow(sort), config).build()
266266
}
267267

268268
override fun updateFavTvShow(tvShow: TvShowDetailEntity, isSus: Boolean) {

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/source/local/LocalDataSource.kt

+9-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ import com.dicoding.moviecatalog.data.source.local.entity.movie.MovieListEntity
77
import com.dicoding.moviecatalog.data.source.local.entity.tvshow.TvShowDetailEntity
88
import com.dicoding.moviecatalog.data.source.local.entity.tvshow.TvShowListEntity
99
import com.dicoding.moviecatalog.data.source.local.room.CatalogDao
10+
import com.dicoding.moviecatalog.utils.SortUtils
11+
import com.dicoding.moviecatalog.utils.SortUtils.MOVIE_ENTITIES
12+
import com.dicoding.moviecatalog.utils.SortUtils.MOVIE_FAV_ENTITIES
13+
import com.dicoding.moviecatalog.utils.SortUtils.TVSHOW_ENTITIES
14+
import com.dicoding.moviecatalog.utils.SortUtils.TVSHOW_FAV_ENTITIES
1015

1116
class LocalDataSource private constructor(private val mCatalogDao: CatalogDao) {
1217

@@ -17,7 +22,7 @@ class LocalDataSource private constructor(private val mCatalogDao: CatalogDao) {
1722
INSTANCE ?: LocalDataSource(catalogDao)
1823
}
1924

20-
fun getAllMovies(): DataSource.Factory<Int, MovieListEntity> = mCatalogDao.getMovies()
25+
fun getAllMovies(sort: String): DataSource.Factory<Int, MovieListEntity> = mCatalogDao.getMovies(SortUtils.getSortedQuery(sort, MOVIE_ENTITIES))
2126

2227
fun getSelectedMovies(movieId: Int): LiveData<MovieDetailEntity> =
2328
mCatalogDao.getSelectedMovies(movieId)
@@ -26,14 +31,14 @@ class LocalDataSource private constructor(private val mCatalogDao: CatalogDao) {
2631

2732
fun insertMoviesDetails(movie: MovieDetailEntity) = mCatalogDao.insertMoviesDetails(movie)
2833

29-
fun getFavMovies(): DataSource.Factory<Int, MovieDetailEntity> = mCatalogDao.getFavMovies()
34+
fun getFavMovies(sort: String): DataSource.Factory<Int, MovieDetailEntity> = mCatalogDao.getFavMovies(SortUtils.getSortedQueryFav(sort, MOVIE_FAV_ENTITIES))
3035

3136
fun updateFavMovies(movie: MovieDetailEntity, isSus: Boolean) {
3237
movie.isSus = isSus
3338
mCatalogDao.updateFavMovies(movie)
3439
}
3540

36-
fun getAllTvShow(): DataSource.Factory<Int, TvShowListEntity> = mCatalogDao.getTvShow()
41+
fun getAllTvShow(sort: String): DataSource.Factory<Int, TvShowListEntity> = mCatalogDao.getTvShow(SortUtils.getSortedQuery(sort, TVSHOW_ENTITIES))
3742

3843
fun getSelectedTvShow(tvShowId: Int): LiveData<TvShowDetailEntity> =
3944
mCatalogDao.getSelectedTvShow(tvShowId)
@@ -42,7 +47,7 @@ class LocalDataSource private constructor(private val mCatalogDao: CatalogDao) {
4247

4348
fun insertTvShowDetails(tvShow: TvShowDetailEntity) = mCatalogDao.insertTvShowDetails(tvShow)
4449

45-
fun getFavTvShow(): DataSource.Factory<Int, TvShowDetailEntity> = mCatalogDao.getFavTvShow()
50+
fun getFavTvShow(sort: String): DataSource.Factory<Int, TvShowDetailEntity> = mCatalogDao.getFavTvShow(SortUtils.getSortedQueryFav(sort, TVSHOW_FAV_ENTITIES))
4651

4752
fun updateFavTvShow(tvShow: TvShowDetailEntity, isSus: Boolean) {
4853
tvShow.isSus = isSus

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/source/local/entity/tvshow/TvShowDetailEntity.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ data class TvShowDetailEntity(
1515
@ColumnInfo(name = "tvShowId")
1616
val tvShowId: Int,
1717

18-
@ColumnInfo(name = "name")
18+
@ColumnInfo(name = "title")
1919
val tvShowName: String,
2020

2121
@ColumnInfo(name = "number_of_episodes")

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/source/local/entity/tvshow/TvShowListEntity.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ data class TvShowListEntity(
1515
@ColumnInfo(name = "tvShowId")
1616
val tvShowId: Int,
1717

18-
@ColumnInfo(name = "name")
18+
@ColumnInfo(name = "title")
1919
val tvShowName: String,
2020

2121
@ColumnInfo(name = "poster_path")

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/source/local/room/CatalogDao.kt

+9-8
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package com.dicoding.moviecatalog.data.source.local.room
33
import androidx.lifecycle.LiveData
44
import androidx.paging.DataSource
55
import androidx.room.*
6+
import androidx.sqlite.db.SimpleSQLiteQuery
67
import com.dicoding.moviecatalog.data.source.local.entity.movie.MovieDetailEntity
78
import com.dicoding.moviecatalog.data.source.local.entity.movie.MovieListEntity
89
import com.dicoding.moviecatalog.data.source.local.entity.tvshow.TvShowDetailEntity
910
import com.dicoding.moviecatalog.data.source.local.entity.tvshow.TvShowListEntity
1011

1112
@Dao
1213
interface CatalogDao {
13-
@Query("SELECT * FROM MOVIE_LIST_ENTITY")
14-
fun getMovies(): DataSource.Factory<Int, MovieListEntity>
14+
@RawQuery(observedEntities = [MovieListEntity::class])
15+
fun getMovies(query: SimpleSQLiteQuery): DataSource.Factory<Int, MovieListEntity>
1516

1617
@Query("SELECT * FROM MOVIE_DETAIL_ENTITY WHERE movieId = :movieId")
1718
fun getSelectedMovies(movieId: Int): LiveData<MovieDetailEntity>
@@ -22,14 +23,14 @@ interface CatalogDao {
2223
@Insert(onConflict = OnConflictStrategy.REPLACE)
2324
fun insertMoviesDetails(movies: MovieDetailEntity)
2425

25-
@Query("SELECT * FROM movie_detail_entity WHERE is_sus = 1")
26-
fun getFavMovies(): DataSource.Factory<Int, MovieDetailEntity>
26+
@RawQuery(observedEntities = [MovieDetailEntity::class])
27+
fun getFavMovies(query: SimpleSQLiteQuery): DataSource.Factory<Int, MovieDetailEntity>
2728

2829
@Update
2930
fun updateFavMovies(movies: MovieDetailEntity)
3031

31-
@Query("SELECT * FROM tvShow_list_entity")
32-
fun getTvShow(): DataSource.Factory<Int, TvShowListEntity>
32+
@RawQuery(observedEntities = [MovieListEntity::class])
33+
fun getTvShow(query: SimpleSQLiteQuery): DataSource.Factory<Int, TvShowListEntity>
3334

3435
@Query("SELECT * FROM tvShow_detail_entity where tvShowId = :tvShowId")
3536
fun getSelectedTvShow(tvShowId: Int): LiveData<TvShowDetailEntity>
@@ -40,8 +41,8 @@ interface CatalogDao {
4041
@Insert(onConflict = OnConflictStrategy.REPLACE)
4142
fun insertTvShowDetails(tvShow: TvShowDetailEntity)
4243

43-
@Query("SELECT * FROM tvShow_detail_entity WHERE is_sus = 1")
44-
fun getFavTvShow(): DataSource.Factory<Int, TvShowDetailEntity>
44+
@RawQuery(observedEntities = [TvShowDetailEntity::class])
45+
fun getFavTvShow(query: SimpleSQLiteQuery): DataSource.Factory<Int, TvShowDetailEntity>
4546

4647
@Update
4748
fun updateFavTvShow(tvShow: TvShowDetailEntity)

Diff for: app/src/main/java/com/dicoding/moviecatalog/fragment/MovieFavFragment.kt

+41-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@ import android.view.View
66
import android.view.ViewGroup
77
import android.widget.Toast
88
import androidx.fragment.app.Fragment
9+
import androidx.lifecycle.Observer
910
import androidx.lifecycle.ViewModelProvider
11+
import androidx.paging.PagedList
1012
import androidx.recyclerview.widget.ItemTouchHelper
1113
import androidx.recyclerview.widget.LinearLayoutManager
1214
import androidx.recyclerview.widget.RecyclerView
1315
import com.dicoding.moviecatalog.R
1416
import com.dicoding.moviecatalog.adapter.MovieFavAdapter
17+
import com.dicoding.moviecatalog.data.source.local.entity.movie.MovieDetailEntity
1518
import com.dicoding.moviecatalog.databinding.FragmentMovieFavBinding
19+
import com.dicoding.moviecatalog.utils.SortUtils
20+
import com.dicoding.moviecatalog.utils.SortUtils.NEWEST
1621
import com.dicoding.moviecatalog.viewmodel.MovieFavViewModel
1722
import com.dicoding.moviecatalog.viewmodel.ViewModelFactory
1823
import com.google.android.material.snackbar.Snackbar
@@ -38,19 +43,14 @@ class MovieFavFragment : Fragment() {
3843
itemTouchHelper.attachToRecyclerView(binding.rvMovie)
3944

4045
if (activity != null) {
46+
hideStaticUI()
4147
val factory = ViewModelFactory.getInstance(requireActivity())
4248
viewModel = ViewModelProvider(
4349
this, factory
4450
)[MovieFavViewModel::class.java]
4551
susAdapter = MovieFavAdapter()
4652

47-
viewModel.getFavMovies().observe(viewLifecycleOwner) { susMovies ->
48-
if (susMovies != null) {
49-
binding.progressBar.visibility = View.GONE
50-
susAdapter.setMovies(susMovies)
51-
susAdapter.submitList(susMovies)
52-
}
53-
}
53+
viewModel.getFavMovies(NEWEST).observe(viewLifecycleOwner, movieFavObserver)
5454
viewModel.isLoading.observe(viewLifecycleOwner) {
5555
showLoading(it)
5656
}
@@ -64,6 +64,30 @@ class MovieFavFragment : Fragment() {
6464
adapter = susAdapter
6565
}
6666
}
67+
binding.susListFab.setOnClickListener {
68+
if (binding.susOrderAsc.visibility == View.GONE) {
69+
showStaticUI()
70+
} else {
71+
hideStaticUI()
72+
}
73+
}
74+
binding.susOrderAsc.setOnClickListener {
75+
viewModel.getFavMovies(NEWEST).observe(viewLifecycleOwner, movieFavObserver)
76+
hideStaticUI()
77+
}
78+
binding.susOrderDesc.setOnClickListener {
79+
viewModel.getFavMovies(SortUtils.OLDEST)
80+
.observe(viewLifecycleOwner, movieFavObserver)
81+
hideStaticUI()
82+
}
83+
}
84+
}
85+
86+
private val movieFavObserver = Observer<PagedList<MovieDetailEntity>> { susMovies ->
87+
if (susMovies != null) {
88+
binding.progressBar.visibility = View.GONE
89+
susAdapter.setMovies(susMovies)
90+
susAdapter.submitList(susMovies)
6791
}
6892
}
6993

@@ -104,6 +128,16 @@ class MovieFavFragment : Fragment() {
104128
}
105129
}
106130

131+
private fun hideStaticUI() {
132+
binding.susOrderAsc.visibility = View.GONE
133+
binding.susOrderDesc.visibility = View.GONE
134+
}
135+
136+
private fun showStaticUI() {
137+
binding.susOrderAsc.visibility = View.VISIBLE
138+
binding.susOrderDesc.visibility = View.VISIBLE
139+
}
140+
107141
override fun onDestroyView() {
108142
super.onDestroyView()
109143
_binding = null

0 commit comments

Comments
 (0)