Skip to content

Commit 832d120

Browse files
author
Dicky Herlambang
committed
DNM: Treewide: Dunno
1 parent 4c5bff2 commit 832d120

File tree

7 files changed

+169
-10
lines changed

7 files changed

+169
-10
lines changed

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

+4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ package com.dicoding.moviecatalog.data.movie.source
33
import androidx.lifecycle.LiveData
44
import com.dicoding.moviecatalog.data.movie.MovieCastEntity
55
import com.dicoding.moviecatalog.data.movie.MovieEntity
6+
import com.dicoding.moviecatalog.data.movie.response.MovieListResponse
7+
import com.dicoding.moviecatalog.data.movie.response.MovieResponse
68
import com.dicoding.moviecatalog.data.tvshow.TvShowCastEntity
79
import com.dicoding.moviecatalog.data.tvshow.TvShowEntity
810

911
interface DataSource {
1012

1113
fun getAllMovies(): LiveData<List<MovieEntity>>
1214

15+
fun getAllMoviesApi(listId: String): LiveData<ArrayList<MovieListResponse>>
16+
1317
fun getCastMovies(movieId: String): LiveData<List<MovieCastEntity>>
1418

1519
fun getMovieWithCast(movieId: String): LiveData<MovieEntity>

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

+51
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
package com.dicoding.moviecatalog.data.movie.source
22

3+
import android.util.Log
34
import androidx.lifecycle.LiveData
45
import androidx.lifecycle.MutableLiveData
6+
import com.dicoding.moviecatalog.api.ApiConfig
57
import com.dicoding.moviecatalog.data.movie.MovieCastEntity
68
import com.dicoding.moviecatalog.data.movie.MovieEntity
9+
import com.dicoding.moviecatalog.data.movie.response.MovieListResponse
710
import com.dicoding.moviecatalog.data.movie.source.remote.RemoteDataSource
811
import com.dicoding.moviecatalog.data.movie.source.remote.response.CastMovieResponse
912
import com.dicoding.moviecatalog.data.movie.source.remote.response.CastTvShowResponse
1013
import com.dicoding.moviecatalog.data.movie.source.remote.response.MovieResponse
1114
import com.dicoding.moviecatalog.data.movie.source.remote.response.TvShowResponse
1215
import com.dicoding.moviecatalog.data.tvshow.TvShowCastEntity
1316
import com.dicoding.moviecatalog.data.tvshow.TvShowEntity
17+
import com.dicoding.moviecatalog.utils.JsonHelper
18+
import retrofit2.Call
19+
import retrofit2.Callback
20+
import retrofit2.Response
1421

1522
class Repository private constructor(private val remoteDataSource: RemoteDataSource) :
1623
DataSource {
@@ -22,6 +29,8 @@ class Repository private constructor(private val remoteDataSource: RemoteDataSou
2229
instance ?: synchronized(this) {
2330
instance ?: Repository(remoteData).apply { instance = this }
2431
}
32+
33+
private const val TAG = "Repository"
2534
}
2635

2736
override fun getAllMovies(): LiveData<List<MovieEntity>> {
@@ -50,6 +59,48 @@ class Repository private constructor(private val remoteDataSource: RemoteDataSou
5059
return movieResults
5160
}
5261

62+
override fun getAllMoviesApi(listId: String): LiveData<ArrayList<MovieListResponse>> {
63+
val resultAllMoviesApi = MutableLiveData<ArrayList<MovieListResponse>>()
64+
val client = ApiConfig.getApiService().getMovieList(listId)
65+
remoteDataSource.getAllMoviesApi(object : RemoteDataSource.LoadMoviesApiCallback {
66+
override fun onAllMoviesApiReceived(movieApiResponses: ArrayList<MovieListResponse>) {
67+
68+
client.enqueue(object :
69+
Callback<com.dicoding.moviecatalog.data.movie.response.MovieResponse> {
70+
override fun onResponse(
71+
call: Call<com.dicoding.moviecatalog.data.movie.response.MovieResponse>,
72+
response: Response<com.dicoding.moviecatalog.data.movie.response.MovieResponse>
73+
) {
74+
if (response.isSuccessful) {
75+
if (response.body()?.items?.isEmpty() == true) {
76+
Log.e(
77+
"Repository",
78+
"response size: ${response.body()!!.items.size}"
79+
)
80+
} else {
81+
Log.e(
82+
"Repository",
83+
"response size: ${response.body()!!.items.size}"
84+
)
85+
}
86+
resultAllMoviesApi.postValue(response.body()?.items)
87+
} else {
88+
Log.e("Repository", "onFailure: ${response.message()}")
89+
}
90+
}
91+
92+
override fun onFailure(
93+
call: Call<com.dicoding.moviecatalog.data.movie.response.MovieResponse>,
94+
t: Throwable
95+
) {
96+
Log.e("Repository", "onFailure: ${t.message}")
97+
}
98+
})
99+
}
100+
})
101+
return resultAllMoviesApi
102+
}
103+
53104
override fun getCastMovies(movieId: String): LiveData<List<MovieCastEntity>> {
54105
val castMovieResults = MutableLiveData<List<MovieCastEntity>>()
55106
remoteDataSource.getCastMovies(movieId, object : RemoteDataSource.LoadCastMoviesCallback {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.dicoding.moviecatalog.data.movie.source.remote
2+
3+
import android.util.Log
4+
import androidx.lifecycle.LiveData
5+
import androidx.lifecycle.MutableLiveData
6+
import com.dicoding.moviecatalog.api.ApiConfig
7+
import com.dicoding.moviecatalog.data.movie.response.MovieListResponse
8+
import com.dicoding.moviecatalog.data.movie.response.MovieResponse
9+
import com.dicoding.moviecatalog.utils.EspressoIdlingResource
10+
import retrofit2.Call
11+
import retrofit2.Callback
12+
import retrofit2.Response
13+
14+
class ApiFetchDataSource {
15+
16+
fun setMoviesData(): List<MovieListResponse> {
17+
val resultAllMoviesApi = ArrayList<MovieListResponse>()
18+
val client = ApiConfig.getApiService().getMovieList(listId)
19+
client.enqueue(object : Callback<MovieResponse> {
20+
override fun onResponse(
21+
call: Call<MovieResponse>,
22+
response: Response<MovieResponse>
23+
) {
24+
if (response.isSuccessful) {
25+
val responseBody = response.body()
26+
if (responseBody != null) {
27+
resultAllMoviesApi.clear()
28+
}
29+
} else {
30+
Log.e(TAG, "onFailure: ${response.message()}")
31+
}
32+
}
33+
override fun onFailure(call: Call<MovieResponse>, t: Throwable) {
34+
Log.e(TAG, "onFailure: ${t.message}")
35+
}
36+
})
37+
return resultAllMoviesApi
38+
}
39+
40+
companion object {
41+
private const val listId = "8174952"
42+
private const val TAG = "ApiFetch"
43+
}
44+
}

Diff for: app/src/main/java/com/dicoding/moviecatalog/data/movie/source/remote/RemoteDataSource.kt

+16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.dicoding.moviecatalog.data.movie.source.remote
22

33
import android.os.Handler
44
import android.os.Looper
5+
import com.dicoding.moviecatalog.data.movie.response.MovieListResponse
56
import com.dicoding.moviecatalog.data.movie.source.remote.response.CastMovieResponse
67
import com.dicoding.moviecatalog.data.movie.source.remote.response.CastTvShowResponse
78
import com.dicoding.moviecatalog.data.movie.source.remote.response.MovieResponse
@@ -38,6 +39,17 @@ class RemoteDataSource private constructor(private val jsonHelper: JsonHelper) {
3839
)
3940
}
4041

42+
fun getAllMoviesApi(callback: LoadMoviesApiCallback) {
43+
EspressoIdlingResource.increment()
44+
handler.postDelayed(
45+
{
46+
callback.onAllMoviesApiReceived(jsonHelper.loadMoviesApi())
47+
EspressoIdlingResource.decrement()
48+
},
49+
SERVICE_LATENCY_IN_MILLIS
50+
)
51+
}
52+
4153
fun getCastMovies(movieId: String, callback: LoadCastMoviesCallback) {
4254
EspressoIdlingResource.increment()
4355
handler.postDelayed(
@@ -79,6 +91,10 @@ class RemoteDataSource private constructor(private val jsonHelper: JsonHelper) {
7991
fun onAllMoviesReceived(movieResponses: List<MovieResponse>)
8092
}
8193

94+
interface LoadMoviesApiCallback {
95+
fun onAllMoviesApiReceived(movieApiResponses: ArrayList<MovieListResponse>)
96+
}
97+
8298
interface LoadTvShowCallback {
8399
fun onAllTvShowReceived(tvShowResponse: List<TvShowResponse>)
84100
}

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

+16-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.dicoding.moviecatalog.fragment
22

33
import android.os.Bundle
4+
import android.util.Log
45
import android.view.LayoutInflater
56
import android.view.View
67
import android.view.ViewGroup
@@ -11,6 +12,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
1112
import com.dicoding.moviecatalog.adapter.MovieAdapter
1213
import com.dicoding.moviecatalog.adapter.MovieApiAdapter
1314
import com.dicoding.moviecatalog.data.movie.response.MovieListResponse
15+
import com.dicoding.moviecatalog.data.movie.source.Repository
16+
import com.dicoding.moviecatalog.data.movie.source.remote.RemoteDataSource
1417
import com.dicoding.moviecatalog.databinding.FragmentMovieBinding
1518
import com.dicoding.moviecatalog.viewmodel.MovieViewModel
1619
import com.dicoding.moviecatalog.viewmodel.ViewModelFactory
@@ -38,18 +41,18 @@ class MovieFragment : Fragment() {
3841
)[MovieViewModel::class.java]
3942
val movieAdapter = MovieAdapter()
4043
_binding?.progressBar?.visibility = View.VISIBLE
41-
viewModel.getMovie().observe(viewLifecycleOwner, { movieId ->
42-
_binding?.progressBar?.visibility = View.GONE
43-
movieAdapter.setMovies(movieId)
44-
movieAdapter.notifyDataSetChanged()
45-
})
46-
47-
viewModel.movieList.observe(viewLifecycleOwner, { movieId ->
44+
viewModel.getMovieApi().observe(viewLifecycleOwner, { movieId ->
4845
_binding?.progressBar?.visibility = View.GONE
4946
setMovieListApi(movieId)
5047
MovieApiAdapter(movieId).notifyDataSetChanged()
5148
})
5249

50+
//viewModel.movieList.observe(viewLifecycleOwner, { movieId ->
51+
// _binding?.progressBar?.visibility = View.GONE
52+
// setMovieListApi(movieId)
53+
// MovieApiAdapter(movieId).notifyDataSetChanged()
54+
//})
55+
5356
viewModel.isLoading.observe(viewLifecycleOwner, {
5457
showLoading(it)
5558
})
@@ -58,7 +61,7 @@ class MovieFragment : Fragment() {
5861
showToast(isToast, viewModel.toastReason.value.toString())
5962
})
6063

61-
viewModel.getMovieList()
64+
//viewModel.getMovieList()
6265

6366
_binding?.let {
6467
with(it.rvMovie) {
@@ -85,6 +88,7 @@ class MovieFragment : Fragment() {
8588
movieList.originalLanguage
8689
)
8790
listReview.add(movieApi)
91+
Log.e(TAG, "response size: ${listReview.size}")
8892
}
8993
val adapter = MovieApiAdapter(listReview)
9094
binding.rvMovie.adapter = adapter
@@ -104,4 +108,8 @@ class MovieFragment : Fragment() {
104108
super.onDestroyView()
105109
_binding = null
106110
}
111+
112+
companion object {
113+
private const val TAG = "MovieFragment"
114+
}
107115
}

Diff for: app/src/main/java/com/dicoding/moviecatalog/utils/JsonHelper.kt

+34-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package com.dicoding.moviecatalog.utils
22

33
import android.content.Context
4+
import android.util.Log
5+
import com.dicoding.moviecatalog.api.ApiConfig
6+
import com.dicoding.moviecatalog.data.movie.response.MovieListResponse
47
import com.dicoding.moviecatalog.data.movie.source.remote.response.CastMovieResponse
5-
import com.dicoding.moviecatalog.data.movie.source.remote.response.MovieResponse
68
import com.dicoding.moviecatalog.data.movie.source.remote.response.CastTvShowResponse
9+
import com.dicoding.moviecatalog.data.movie.source.remote.response.MovieResponse
710
import com.dicoding.moviecatalog.data.movie.source.remote.response.TvShowResponse
811
import org.json.JSONException
912
import org.json.JSONObject
13+
import retrofit2.Call
14+
import retrofit2.Callback
15+
import retrofit2.Response
1016
import java.io.IOException
1117

1218
class JsonHelper(private val context: Context) {
@@ -63,10 +69,31 @@ class JsonHelper(private val context: Context) {
6369
return list
6470
}
6571

72+
fun loadMoviesApi(): ArrayList<MovieListResponse> {
73+
val resultAllMoviesApi = ArrayList<MovieListResponse>()
74+
75+
for (movieApi in resultAllMoviesApi) {
76+
val movieListResponse = MovieListResponse(
77+
movieApi.movieId,
78+
movieApi.overview,
79+
movieApi.originalTitle,
80+
movieApi.releaseDate,
81+
movieApi.voteAverage,
82+
movieApi.title,
83+
movieApi.posterPath,
84+
movieApi.revenue,
85+
movieApi.originalLanguage
86+
)
87+
resultAllMoviesApi.add(movieListResponse)
88+
}
89+
return resultAllMoviesApi
90+
}
91+
6692
fun loadTvShow(): List<TvShowResponse> {
6793
val list = ArrayList<TvShowResponse>()
6894
try {
69-
val responseObject = JSONObject(parsingFileToString("TvShowResponses.json").toString())
95+
val responseObject =
96+
JSONObject(parsingFileToString("TvShowResponses.json").toString())
7097
val listArray = responseObject.getJSONArray("tvShow")
7198
for (i in 0 until listArray.length()) {
7299
val tvShow = listArray.getJSONObject(i)
@@ -158,4 +185,9 @@ class JsonHelper(private val context: Context) {
158185
}
159186
return list
160187
}
188+
189+
companion object {
190+
private const val listId = "8174952"
191+
private const val TAG = "JsonHelper"
192+
}
161193
}

Diff for: app/src/main/java/com/dicoding/moviecatalog/viewmodel/MovieViewModel.kt

+4
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ class MovieViewModel(private val movieRepository: Repository) : ViewModel() {
2929

3030
fun getMovie(): LiveData<List<MovieEntity>> = movieRepository.getAllMovies()
3131

32+
fun getMovieApi(): LiveData<ArrayList<MovieListResponse>> = movieRepository.getAllMoviesApi(
33+
listId
34+
)
35+
3236
fun getMovieList() {
3337
_isLoading.value = true
3438
val client = ApiConfig.getApiService().getMovieList(listId)

0 commit comments

Comments
 (0)