@@ -23,6 +23,8 @@ import com.intive.tmdbandroid.details.viewmodel.DetailsViewModel
2323import com.intive.tmdbandroid.model.TVShow
2424import dagger.hilt.android.AndroidEntryPoint
2525import kotlinx.coroutines.flow.collect
26+ import kotlinx.coroutines.flow.collectLatest
27+ import kotlinx.coroutines.launch
2628import java.text.SimpleDateFormat
2729import java.util.*
2830
@@ -47,8 +49,8 @@ class DetailFragment : Fragment() {
4749 ): View {
4850 val binding = FragmentDetailBinding .inflate(inflater, container, false )
4951
50- collectDataFromViewModel (binding)
51- setupToolbar (binding)
52+ collectTVShowDetailFromViewModel (binding)
53+ collectWatchlistDataFromViewModel (binding)
5254
5355 return binding.root
5456 }
@@ -65,7 +67,7 @@ class DetailFragment : Fragment() {
6567 Glide .get(requireContext()).clearMemory()
6668 }
6769
68- private fun collectDataFromViewModel (binding : FragmentDetailBinding ) {
70+ private fun collectTVShowDetailFromViewModel (binding : FragmentDetailBinding ) {
6971 binding.coordinatorContainerDetail.visibility = View .INVISIBLE
7072 lifecycleScope.launchWhenCreated {
7173 viewModel.uiState.collect { state ->
@@ -89,6 +91,30 @@ class DetailFragment : Fragment() {
8991 }
9092 }
9193
94+ private fun collectWatchlistDataFromViewModel (binding : FragmentDetailBinding ) {
95+ lifecycleScope.launch {
96+ viewModel.watchlistUIState.collectLatest {
97+ when (it) {
98+ is State .Success -> {
99+ binding.layoutErrorDetail.errorContainer.visibility = View .GONE
100+ binding.layoutLoadingDetail.progressBar.visibility = View .GONE
101+ selectOrUnselectWatchlistFav(binding, it.data)
102+ isSaveOnWatchlist = it.data
103+ }
104+ State .Error -> {
105+ binding.layoutLoadingDetail.progressBar.visibility = View .GONE
106+ binding.layoutErrorDetail.errorContainer.visibility = View .VISIBLE
107+ binding.coordinatorContainerDetail.visibility = View .VISIBLE
108+ }
109+ State .Loading -> {
110+ binding.layoutErrorDetail.errorContainer.visibility = View .GONE
111+ binding.layoutLoadingDetail.progressBar.visibility = View .VISIBLE
112+ }
113+ }
114+ }
115+ }
116+ }
117+
92118 private fun setupUI (binding : FragmentDetailBinding , tvShow : TVShow ) {
93119
94120 setImages(binding, tvShow)
@@ -97,6 +123,8 @@ class DetailFragment : Fragment() {
97123
98124 setPercentageToCircularPercentage(binding, tvShow.vote_average)
99125
126+ setupToolbar(binding, tvShow)
127+
100128 binding.toolbar.title = tvShow.name
101129
102130 binding.statusDetailTextView.text = tvShow.status
@@ -126,6 +154,8 @@ class DetailFragment : Fragment() {
126154
127155 binding.overviewDetailTextView.text = tvShow.overview
128156 binding.coordinatorContainerDetail.visibility = View .VISIBLE
157+
158+ tvShowId?.let { viewModel.existAsFavorite(it) }
129159 }
130160
131161 private fun setPercentageToCircularPercentage (
@@ -139,18 +169,23 @@ class DetailFragment : Fragment() {
139169 val context = binding.root.context
140170
141171 when {
142- percentage < 25 -> binding.circularPercentage.progressTintList = ContextCompat .getColorStateList(context, R .color.red)
143- percentage < 45 -> binding.circularPercentage.progressTintList = ContextCompat .getColorStateList(context, R .color.orange)
144- percentage < 75 -> binding.circularPercentage.progressTintList = ContextCompat .getColorStateList(context, R .color.yellow)
145- else -> binding.circularPercentage.progressTintList = ContextCompat .getColorStateList(context, R .color.green)
172+ percentage < 25 -> binding.circularPercentage.progressTintList =
173+ ContextCompat .getColorStateList(context, R .color.red)
174+ percentage < 45 -> binding.circularPercentage.progressTintList =
175+ ContextCompat .getColorStateList(context, R .color.orange)
176+ percentage < 75 -> binding.circularPercentage.progressTintList =
177+ ContextCompat .getColorStateList(context, R .color.yellow)
178+ else -> binding.circularPercentage.progressTintList =
179+ ContextCompat .getColorStateList(context, R .color.green)
146180 }
147181 binding.screeningPopularity.text = resources.getString(R .string.popularity, percentage)
148182 }
149183
150184 private fun setDate (binding : FragmentDetailBinding , firstAirDate : String ) {
151185 try {
152186 val date = SimpleDateFormat (" yyyy-MM-dd" , Locale .getDefault()).parse(firstAirDate)
153- val stringDate = date?.let { SimpleDateFormat (" MMM dd, yyyy" , Locale .getDefault()).format(it) }
187+ val stringDate =
188+ date?.let { SimpleDateFormat (" MMM dd, yyyy" , Locale .getDefault()).format(it) }
154189 binding.firstAirDateDetailTextView.text = stringDate
155190 } catch (e: Exception ) {
156191 binding.firstAirDateDetailTextView.text = " "
@@ -176,15 +211,19 @@ class DetailFragment : Fragment() {
176211 .into(binding.backgroundImageToolbarLayout)
177212 }
178213
179- private fun setupToolbar (binding : FragmentDetailBinding ) {
214+ private fun setupToolbar (binding : FragmentDetailBinding , tvShow : TVShow ) {
180215 val navController = findNavController()
181216 val appBarConfiguration = AppBarConfiguration (navController.graph)
182217 val toolbar = binding.toolbar
183218 toolbar.inflateMenu(R .menu.watchlist_favorite_detail_fragment)
184219 toolbar.setOnMenuItemClickListener {
185- when (it.itemId) {
220+ when (it.itemId) {
186221 R .id.ic_heart_watchlist -> {
187- selectOrUnselectWatchlistFav(binding)
222+ if (! isSaveOnWatchlist) {
223+ viewModel.addToWatchlist(tvShow.toTVShowORMEntity())
224+ } else {
225+ viewModel.deleteFromWatchlist(tvShow.toTVShowORMEntity())
226+ }
188227 true
189228 }
190229 else -> false
@@ -202,13 +241,14 @@ class DetailFragment : Fragment() {
202241 })
203242 }
204243
205- private fun selectOrUnselectWatchlistFav (binding : FragmentDetailBinding ) {
206- isSaveOnWatchlist = ! isSaveOnWatchlist
244+ private fun selectOrUnselectWatchlistFav (binding : FragmentDetailBinding , isFav : Boolean ) {
207245 val watchlistItem = binding.toolbar.menu.findItem(R .id.ic_heart_watchlist)
208- if (isSaveOnWatchlist){
209- watchlistItem.icon = AppCompatResources .getDrawable(requireContext(), R .drawable.ic_heart_selected)
210- }else {
211- watchlistItem.icon = AppCompatResources .getDrawable(requireContext(), R .drawable.ic_heart_unselected)
212- }
246+ if (isFav) {
247+ watchlistItem.icon =
248+ AppCompatResources .getDrawable(requireContext(), R .drawable.ic_heart_selected)
249+ } else watchlistItem.icon =
250+ AppCompatResources .getDrawable(requireContext(), R .drawable.ic_heart_unselected)
251+
213252 }
253+
214254}
0 commit comments