From b4d84e77beaefefecdf727a8d591793dd76afe13 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Mon, 21 Jun 2021 14:20:55 +0200 Subject: [PATCH] Add error handling to Home fragment --- .../jdtech/jellyfin/fragments/HomeFragment.kt | 19 ++++++++- .../jellyfin/viewmodels/HomeViewModel.kt | 40 +++++++++++++------ app/src/main/res/layout/error.xml | 22 ++++++++++ app/src/main/res/layout/fragment_home.xml | 12 +++++- 4 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/layout/error.xml diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt index cbaff76a..4fed9744 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.ViewListAdapter import dev.jdtech.jellyfin.databinding.FragmentHomeBinding import dev.jdtech.jellyfin.viewmodels.HomeViewModel @@ -31,9 +32,25 @@ class HomeFragment : Fragment() { ) }) + binding.errorLayout.findViewById(R.id.retry_button).setOnClickListener { + viewModel.loadData() + } + viewModel.finishedLoading.observe(viewLifecycleOwner, { if (it) { - binding.loadingIncicator.visibility = View.GONE + binding.loadingIndicator.visibility = View.GONE + } else { + binding.loadingIndicator.visibility = View.VISIBLE + } + }) + + viewModel.error.observe(viewLifecycleOwner, { + if (it) { + binding.errorLayout.visibility = View.VISIBLE + binding.viewsRecyclerView.visibility = View.GONE + } else { + binding.errorLayout.visibility = View.GONE + binding.viewsRecyclerView.visibility = View.VISIBLE } }) diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt index 21ebee4b..11bfdf7a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt @@ -25,20 +25,34 @@ class HomeViewModel( private val _finishedLoading = MutableLiveData() val finishedLoading: LiveData = _finishedLoading - init { - viewModelScope.launch { - val views: MutableList = mutableListOf() - val viewsResult = getViews(jellyfinApi.userId!!) - for (view in viewsResult.items!!) { - val latestItems = getLatestMedia(jellyfinApi.userId!!, view.id) - if (latestItems.isEmpty()) continue - val v = view.toView() - v.items = latestItems - views.add(v) - } + private val _error = MutableLiveData() + val error: LiveData = _error - _views.value = views - _finishedLoading.value = true + init { + loadData() + } + + fun loadData() { + _error.value = false + _finishedLoading.value = false + viewModelScope.launch { + try { + val views: MutableList = mutableListOf() + val viewsResult = getViews(jellyfinApi.userId!!) + for (view in viewsResult.items!!) { + val latestItems = getLatestMedia(jellyfinApi.userId!!, view.id) + if (latestItems.isEmpty()) continue + val v = view.toView() + v.items = latestItems + views.add(v) + } + + _views.value = views + _finishedLoading.value = true + } catch (e: Exception) { + _finishedLoading.value = true + _error.value = true + } } } diff --git a/app/src/main/res/layout/error.xml b/app/src/main/res/layout/error.xml new file mode 100644 index 00000000..6bc57d75 --- /dev/null +++ b/app/src/main/res/layout/error.xml @@ -0,0 +1,22 @@ + + + + + +