From f2ce0308564e2f528dc4fd3c896595b68dfd4c56 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Sun, 22 Aug 2021 11:47:25 +0200 Subject: [PATCH] View detailed error message for playerItemsError --- .../jellyfin/dialogs/ErrorDialogFragment.kt | 33 +++++++++++++ .../fragments/EpisodeBottomSheetFragment.kt | 20 ++++---- .../jellyfin/fragments/MediaInfoFragment.kt | 46 ++++++++++++++----- .../viewmodels/EpisodeBottomSheetViewModel.kt | 8 ++-- .../jellyfin/viewmodels/MediaInfoViewModel.kt | 8 ++-- .../main/res/layout/episode_bottom_sheet.xml | 36 +++++++++++---- .../main/res/layout/fragment_media_info.xml | 27 +++++++++-- app/src/main/res/values/strings.xml | 3 +- app/src/main/res/values/styles.xml | 10 ++++ 9 files changed, 148 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt new file mode 100644 index 00000000..6f3ead62 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt @@ -0,0 +1,33 @@ +package dev.jdtech.jellyfin.dialogs + +import android.app.Dialog +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dev.jdtech.jellyfin.R +import java.lang.IllegalStateException + +class ErrorDialogFragment(private val errorMessage: String) : DialogFragment() { + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return activity?.let { + val builder = MaterialAlertDialogBuilder(it, R.style.ErrorDialogStyle) + builder + .setMessage(errorMessage) + .setPositiveButton("close") { _, _ -> + } + .setNeutralButton("share") { _, _ -> + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, errorMessage) + type = "text/plain" + } + + val shareIntent = Intent.createChooser(sendIntent, null) + startActivity(shareIntent) + + } + builder.create() + } ?: throw IllegalStateException("Activity cannot be null") + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt index eb4a83a7..a81beae0 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -13,6 +13,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.databinding.EpisodeBottomSheetBinding +import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.viewmodels.EpisodeBottomSheetViewModel @@ -98,17 +99,20 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { } }) - viewModel.playerItemsError.observe(viewLifecycleOwner, { - when (it) { - true -> { - binding.playerItemsError.visibility = View.VISIBLE - binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) - binding.progressCircular.visibility = View.INVISIBLE - } - false -> binding.playerItemsError.visibility = View.GONE + viewModel.playerItemsError.observe(viewLifecycleOwner, { errorMessage -> + if (errorMessage != null) { + binding.playerItemsError.visibility = View.VISIBLE + binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) + binding.progressCircular.visibility = View.INVISIBLE + } else { + binding.playerItemsError.visibility = View.GONE } }) + binding.playerItemsErrorDetails.setOnClickListener { + ErrorDialogFragment(viewModel.playerItemsError.value ?: "Unknown error").show(parentFragmentManager, "errordialog") + } + viewModel.loadEpisode(args.episodeId) return binding.root diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index 6e6ac673..b9d7bb13 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -17,6 +17,7 @@ import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.PersonListAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding +import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.dialogs.VideoVersionDialogFragment import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel @@ -91,7 +92,12 @@ class MediaInfoFragment : Fragment() { viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000) ) viewModel.doneNavigatingToPlayer() - binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) + binding.playButton.setImageDrawable( + ContextCompat.getDrawable( + requireActivity(), + R.drawable.ic_play + ) + ) binding.progressCircular.visibility = View.INVISIBLE } }) @@ -114,17 +120,25 @@ class MediaInfoFragment : Fragment() { binding.favoriteButton.setImageResource(drawable) }) - viewModel.playerItemsError.observe(viewLifecycleOwner, { - when (it) { - true -> { - binding.playerItemsError.visibility = View.VISIBLE - binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) - binding.progressCircular.visibility = View.INVISIBLE - } - false -> binding.playerItemsError.visibility = View.GONE + viewModel.playerItemsError.observe(viewLifecycleOwner, { errorMessage -> + if (errorMessage != null) { + binding.playerItemsError.visibility = View.VISIBLE + binding.playButton.setImageDrawable( + ContextCompat.getDrawable( + requireActivity(), + R.drawable.ic_play + ) + ) + binding.progressCircular.visibility = View.INVISIBLE + } else { + binding.playerItemsError.visibility = View.GONE } }) + binding.playerItemsErrorDetails.setOnClickListener { + ErrorDialogFragment(viewModel.playerItemsError.value ?: "Unknown error").show(parentFragmentManager, "errordialog") + } + binding.trailerButton.setOnClickListener { val intent = Intent( Intent.ACTION_VIEW, @@ -155,10 +169,20 @@ class MediaInfoFragment : Fragment() { ) } else { navigateToPlayerActivity( - arrayOf(PlayerItem(args.itemId, viewModel.mediaSources.value!![0].id!!)), + arrayOf( + PlayerItem( + args.itemId, + viewModel.mediaSources.value!![0].id!! + ) + ), viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000), ) - binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) + binding.playButton.setImageDrawable( + ContextCompat.getDrawable( + requireActivity(), + R.drawable.ic_play + ) + ) binding.progressCircular.visibility = View.INVISIBLE } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt index 51422e83..baa784df 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -43,8 +43,8 @@ constructor( var playerItems: MutableList = mutableListOf() - private val _playerItemsError = MutableLiveData() - val playerItemsError: LiveData = _playerItemsError + private val _playerItemsError = MutableLiveData() + val playerItemsError: LiveData = _playerItemsError fun loadEpisode(episodeId: UUID) { viewModelScope.launch { @@ -62,13 +62,13 @@ constructor( } fun preparePlayer() { - _playerItemsError.value = false + _playerItemsError.value = null viewModelScope.launch { try { createPlayerItems(_item.value!!) _navigateToPlayer.value = true } catch (e: Exception) { - _playerItemsError.value = true + _playerItemsError.value = e.message } } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt index 6df01cbb..0e77c612 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -69,8 +69,8 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { var playerItems: MutableList = mutableListOf() - private val _playerItemsError = MutableLiveData() - val playerItemsError: LiveData = _playerItemsError + private val _playerItemsError = MutableLiveData() + val playerItemsError: LiveData = _playerItemsError fun loadData(itemId: UUID, itemType: String) { _error.value = false @@ -184,13 +184,13 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { } fun preparePlayer() { - _playerItemsError.value = false + _playerItemsError.value = null viewModelScope.launch { try { createPlayerItems(_item.value!!) _navigateToPlayer.value = playerItems.toTypedArray() } catch (e: Exception) { - _playerItemsError.value = true + _playerItemsError.value = e.message } } } diff --git a/app/src/main/res/layout/episode_bottom_sheet.xml b/app/src/main/res/layout/episode_bottom_sheet.xml index 99044167..501acc53 100644 --- a/app/src/main/res/layout/episode_bottom_sheet.xml +++ b/app/src/main/res/layout/episode_bottom_sheet.xml @@ -136,10 +136,10 @@ android:id="@+id/progress_circular" android:layout_width="48dp" android:layout_height="48dp" - android:elevation="8dp" - android:padding="8dp" android:layout_centerHorizontal="true" + android:elevation="8dp" android:indeterminateTint="@color/white" + android:padding="8dp" android:visibility="invisible" /> @@ -163,21 +163,37 @@ android:src="@drawable/ic_heart" /> - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/buttons" + tools:visibility="visible"> + + + + + - + tools:visibility="visible"> + + + + + + Manage servers Appearance Theme - Error preparing player items + Error preparing player items. + View details About Privacy policy App info diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4c7729be..e88792ac 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -10,4 +10,14 @@ rounded 10dp + + + + + + \ No newline at end of file