From d67e3fb39c05f6f3407a5204531dada66918d59a Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Sun, 8 Aug 2021 12:42:15 +0200 Subject: [PATCH] Add error handling to preparePlayerItems --- .../fragments/EpisodeBottomSheetFragment.kt | 11 +++++++++++ .../jellyfin/fragments/MediaInfoFragment.kt | 11 +++++++++++ .../viewmodels/EpisodeBottomSheetViewModel.kt | 18 +++++++++++++++--- .../jellyfin/viewmodels/MediaInfoViewModel.kt | 12 ++++++++++-- .../main/res/layout/episode_bottom_sheet.xml | 18 +++++++++++++++++- .../main/res/layout/fragment_media_info.xml | 17 +++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 7 files changed, 80 insertions(+), 8 deletions(-) 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 a2d16682..eb4a83a7 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -98,6 +98,17 @@ 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.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 f9c8a415..6e6ac673 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -114,6 +114,17 @@ 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 + } + }) + binding.trailerButton.setOnClickListener { val intent = Intent( Intent.ACTION_VIEW, 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 4f3f4de4..51422e83 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -43,6 +43,9 @@ constructor( var playerItems: MutableList = mutableListOf() + private val _playerItemsError = MutableLiveData() + val playerItemsError: LiveData = _playerItemsError + fun loadEpisode(episodeId: UUID) { viewModelScope.launch { try { @@ -59,14 +62,23 @@ constructor( } fun preparePlayer() { + _playerItemsError.value = false viewModelScope.launch { - createPlayerItems(_item.value!!) - _navigateToPlayer.value = true + try { + createPlayerItems(_item.value!!) + _navigateToPlayer.value = true + } catch (e: Exception) { + _playerItemsError.value = true + } } } private suspend fun createPlayerItems(startEpisode: BaseItemDto) { - val episodes = jellyfinRepository.getEpisodes(startEpisode.seriesId!!, startEpisode.seasonId!!, startIndex = startEpisode.indexNumber?.minus(1)) + val episodes = jellyfinRepository.getEpisodes( + startEpisode.seriesId!!, + startEpisode.seasonId!!, + startIndex = startEpisode.indexNumber?.minus(1) + ) for (episode in episodes) { val mediaSources = jellyfinRepository.getMediaSources(episode.id) playerItems.add(PlayerItem(episode.id, mediaSources[0].id!!)) 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 f2b58646..6df01cbb 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -69,6 +69,9 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { var playerItems: MutableList = mutableListOf() + private val _playerItemsError = MutableLiveData() + val playerItemsError: LiveData = _playerItemsError + fun loadData(itemId: UUID, itemType: String) { _error.value = false viewModelScope.launch { @@ -181,9 +184,14 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { } fun preparePlayer() { + _playerItemsError.value = false viewModelScope.launch { - createPlayerItems(_item.value!!) - _navigateToPlayer.value = playerItems.toTypedArray() + try { + createPlayerItems(_item.value!!) + _navigateToPlayer.value = playerItems.toTypedArray() + } catch (e: Exception) { + _playerItemsError.value = true + } } } diff --git a/app/src/main/res/layout/episode_bottom_sheet.xml b/app/src/main/res/layout/episode_bottom_sheet.xml index a41747ef..99044167 100644 --- a/app/src/main/res/layout/episode_bottom_sheet.xml +++ b/app/src/main/res/layout/episode_bottom_sheet.xml @@ -163,6 +163,22 @@ android:src="@drawable/ic_heart" /> + + diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index 15538f81..e6b1f736 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -148,10 +148,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" /> @@ -185,6 +185,19 @@ android:src="@drawable/ic_heart" /> + + Switch server Appearance Theme + Error preparing player items \ No newline at end of file