@@ -3,74 +3,83 @@ package com.android.tvmaze.shows
33import android.content.Context
44import android.content.Intent
55import android.os.Bundle
6+ import android.view.LayoutInflater
67import android.view.MenuItem
7- import android.view.View
88import android.widget.Toast
99import androidx.activity.viewModels
1010import androidx.appcompat.app.AppCompatActivity
1111import androidx.core.content.ContextCompat
12- import androidx.lifecycle.Observer
13- import androidx.paging.PagedList
14- import androidx.recyclerview.widget.LinearLayoutManager
15- import androidx.recyclerview.widget.RecyclerView
12+ import androidx.core.view.isVisible
13+ import androidx.lifecycle.lifecycleScope
14+ import androidx.paging.LoadState
1615import com.android.tvmaze.R
17- import com.android.tvmaze.network.home.Show
16+ import com.android.tvmaze.databinding.ActivityAllShowsBinding
1817import dagger.hilt.android.AndroidEntryPoint
19- import kotlinx.android.synthetic.main.activity_all_shows.*
20- import kotlinx.android.synthetic.main.toolbar.view.*
18+ import kotlinx.coroutines.flow.collectLatest
19+ import kotlinx.coroutines.launch
2120
2221@AndroidEntryPoint
23- class AllShowsActivity : AppCompatActivity (), ShowsPagedAdaptor.Callback {
22+ class AllShowsActivity : AppCompatActivity () {
2423 private val showsViewModel: ShowsViewModel by viewModels()
25- private lateinit var showsPagedAdaptor : ShowsPagedAdaptor
26-
24+ private lateinit var adapter : ShowsPagedAdapter
25+ private lateinit var showsBinding : ActivityAllShowsBinding
2726 override fun onCreate (savedInstanceState : Bundle ? ) {
2827 super .onCreate(savedInstanceState)
29- setContentView(R .layout.activity_all_shows)
28+ showsBinding = ActivityAllShowsBinding .inflate(LayoutInflater .from(this ))
29+ setContentView(showsBinding.root)
3030 setToolbar()
31- showsViewModel.onScreenCreated()
3231 initAdapter()
33- showsViewModel.initialLoadState().observe(this , Observer { setProgress(it) })
32+ getShows()
33+ showsBinding.retry.setOnClickListener { adapter.retry() }
3434 }
3535
36- private fun initAdapter () {
37- val layoutManager = LinearLayoutManager (this , RecyclerView .VERTICAL , false )
38- showsPagedAdaptor = ShowsPagedAdaptor (ShowDiffUtilItemCallback (), this )
39- shows.layoutManager = layoutManager
40- shows.adapter = showsPagedAdaptor
41- showsViewModel.getShows().observe(this , Observer { showAllShows(it) })
42- showsViewModel.paginatedLoadState().observe(this , Observer { setAdapterState(it) })
36+ private fun getShows () {
37+ lifecycleScope.launch { showsViewModel.shows().collectLatest { adapter.submitData(it) } }
4338 }
4439
45- private fun setAdapterState (networkState : NetworkState ) {
46- showsPagedAdaptor.setNetworkState(networkState)
40+ private fun initAdapter () {
41+ adapter = ShowsPagedAdapter (ShowDiffUtilItemCallback ())
42+ showsBinding.shows.adapter = adapter.withLoadStateFooter(
43+ footer = ShowsLoadStateAdapter { adapter.retry() }
44+ )
45+
46+ adapter.addLoadStateListener { combinedLoadStates ->
47+ // Handle the initial load state
48+ when (val loadState = combinedLoadStates.source.refresh) {
49+ is LoadState .NotLoading -> {
50+ showsBinding.progress.isVisible = false
51+ showsBinding.shows.isVisible = true
52+ showsBinding.errorGroup.isVisible = false
53+ }
54+ is LoadState .Loading -> {
55+ showsBinding.progress.isVisible = true
56+ showsBinding.errorGroup.isVisible = false
57+ }
58+ is LoadState .Error -> {
59+ showsBinding.progress.isVisible = false
60+ showsBinding.errorGroup.isVisible = true
61+ showsBinding.errorMsg.text = loadState.error.localizedMessage
62+ }
63+ }
64+
65+ // Show message to the user when an error comes while loading the next page
66+ val errorState = combinedLoadStates.source.append as ? LoadState .Error
67+ ? : combinedLoadStates.append as ? LoadState .Error
68+ errorState?.let {
69+ Toast .makeText(this , errorState.error.localizedMessage, Toast .LENGTH_SHORT ).show()
70+ }
71+ }
4772 }
4873
4974 private fun setToolbar () {
50- val toolbar = toolbar.toolbar
75+ val toolbar = showsBinding. toolbar.toolbar
5176 setSupportActionBar(toolbar)
5277 toolbar.setTitleTextColor(ContextCompat .getColor(this , android.R .color.white))
5378 toolbar.setSubtitleTextColor(ContextCompat .getColor(this , android.R .color.white))
5479 supportActionBar!! .setDisplayHomeAsUpEnabled(true )
5580 setTitle(R .string.shows)
5681 }
5782
58- private fun setProgress (loadState : NetworkState ) {
59- when (loadState) {
60- is Success -> progress.visibility = View .GONE
61- is NetworkError -> {
62- progress.visibility = View .GONE
63- Toast .makeText(this , loadState.message, Toast .LENGTH_SHORT ).show()
64- }
65- is Loading -> progress.visibility = View .VISIBLE
66- }
67- }
68-
69- private fun showAllShows (showsList : PagedList <Show >) {
70- showsPagedAdaptor.submitList(showsList)
71- shows.visibility = View .VISIBLE
72- }
73-
7483 override fun onOptionsItemSelected (item : MenuItem ): Boolean {
7584 return if (item.itemId == android.R .id.home) {
7685 finish()
@@ -80,10 +89,6 @@ class AllShowsActivity : AppCompatActivity(), ShowsPagedAdaptor.Callback {
8089 }
8190 }
8291
83- override fun onRetryClicked () {
84- showsViewModel.retry()
85- }
86-
8792 companion object {
8893 fun start (context : Context ) {
8994 val starter = Intent (context, AllShowsActivity ::class .java)
0 commit comments