Improve error handling in HomeFragment

This commit is contained in:
Jarne Demeulemeester 2021-07-23 15:18:34 +02:00
parent b3af3e5aeb
commit 11793a423b
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
4 changed files with 47 additions and 74 deletions

View file

@ -5,6 +5,7 @@ import android.view.*
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.R
import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter
@ -46,6 +47,12 @@ class HomeFragment : Fragment() {
): View { ): View {
binding = FragmentHomeBinding.inflate(inflater, container, false) binding = FragmentHomeBinding.inflate(inflater, container, false)
val snackbar =
Snackbar.make(binding.mainLayout, getString(R.string.error_loading_data), Snackbar.LENGTH_INDEFINITE)
snackbar.setAction(getString(R.string.retry)) {
viewModel.loadData()
}
binding.lifecycleOwner = this binding.lifecycleOwner = this
binding.viewModel = viewModel binding.viewModel = viewModel
binding.viewsRecyclerView.adapter = ViewListAdapter(ViewListAdapter.OnClickListener { binding.viewsRecyclerView.adapter = ViewListAdapter(ViewListAdapter.OnClickListener {
@ -64,21 +71,13 @@ class HomeFragment : Fragment() {
}) })
binding.errorLayout.findViewById<View>(R.id.retry_button).setOnClickListener {
viewModel.loadData()
}
viewModel.finishedLoading.observe(viewLifecycleOwner, { viewModel.finishedLoading.observe(viewLifecycleOwner, {
binding.loadingIndicator.visibility = if (it) View.GONE else View.VISIBLE binding.loadingIndicator.visibility = if (it) View.GONE else View.VISIBLE
}) })
viewModel.error.observe(viewLifecycleOwner, { viewModel.error.observe(viewLifecycleOwner, { error ->
if (it) { if (error) {
binding.errorLayout.visibility = View.VISIBLE snackbar.show()
binding.viewsRecyclerView.visibility = View.GONE
} else {
binding.errorLayout.visibility = View.GONE
binding.viewsRecyclerView.visibility = View.VISIBLE
} }
}) })

View file

@ -43,9 +43,6 @@ constructor(
init { init {
loadData() loadData()
viewModelScope.launch {
jellyfinRepository.postCapabilities()
}
} }
fun loadData() { fun loadData() {
@ -53,6 +50,7 @@ constructor(
_finishedLoading.value = false _finishedLoading.value = false
viewModelScope.launch { viewModelScope.launch {
try { try {
jellyfinRepository.postCapabilities()
val views: MutableList<View> = mutableListOf() val views: MutableList<View> = mutableListOf()
val userViews = jellyfinRepository.getUserViews() val userViews = jellyfinRepository.getUserViews()
for (view in userViews) { for (view in userViews) {
@ -89,7 +87,7 @@ constructor(
_finishedLoading.value = true _finishedLoading.value = true
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e.message.toString()) Timber.e(e)
_finishedLoading.value = true _finishedLoading.value = true
_error.value = true _error.value = true
} }

View file

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/error_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/error_loading_data"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1" />
<Button
android:id="@+id/retry_button"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/retry" />
</LinearLayout>

View file

@ -10,6 +10,12 @@
type="dev.jdtech.jellyfin.viewmodels.HomeViewModel" /> type="dev.jdtech.jellyfin.viewmodels.HomeViewModel" />
</data> </data>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -26,16 +32,6 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:trackCornerRadius="10dp" /> app:trackCornerRadius="10dp" />
<include
android:id="@+id/error_layout"
layout="@layout/error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/views_recycler_view" android:id="@+id/views_recycler_view"
android:layout_width="0dp" android:layout_width="0dp"
@ -51,4 +47,6 @@
tools:itemCount="4" tools:itemCount="4"
tools:listitem="@layout/view_item" /> tools:listitem="@layout/view_item" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout> </layout>