From d3fe81224ba170ca7f30444aca1b07642f21b1e2 Mon Sep 17 00:00:00 2001 From: Jannik Date: Tue, 20 Sep 2022 19:47:42 +0200 Subject: [PATCH] add missing play button functionality for highlight media in HomeFragment --- .../activity/main/fragments/HomeFragment.kt | 66 +++++++++---------- .../activity/main/viewmodel/HomeViewModel.kt | 13 ++-- .../org/mosad/teapod/util/ActivityUtils.kt | 15 +++++ 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt index 8913db0..a0f3ae4 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt @@ -39,13 +39,13 @@ import com.facebook.shimmer.ShimmerFrameLayout import kotlinx.coroutines.launch import org.mosad.teapod.R import org.mosad.teapod.databinding.FragmentHomeBinding -import org.mosad.teapod.ui.activity.main.MainActivity import org.mosad.teapod.ui.activity.main.viewmodel.HomeViewModel import org.mosad.teapod.util.adapter.MediaEpisodeListAdapter import org.mosad.teapod.util.adapter.MediaItemListAdapter import org.mosad.teapod.util.decoration.MediaItemDecoration import org.mosad.teapod.util.setDrawableTop import org.mosad.teapod.util.showFragment +import org.mosad.teapod.util.startPlayer import org.mosad.teapod.util.toItemMediaList class HomeFragment : Fragment() { @@ -70,10 +70,7 @@ class HomeFragment : Fragment() { binding.recyclerUpNext.adapter = MediaEpisodeListAdapter( MediaEpisodeListAdapter.OnClickListener { - val activity = activity - if (activity is MainActivity) { - activity.startPlayer(it.panel.episodeMetadata.seasonId, it.panel.id) - } + activity?.startPlayer(it.panel.episodeMetadata.seasonId, it.panel.id) } ) @@ -109,16 +106,6 @@ class HomeFragment : Fragment() { // TODO since this might take a few seconds show a loading animation for the watchlist button } - binding.buttonPlayHighlight.setOnClickListener { - // TODO implement - lifecycleScope.launch { - //val media = AoDParser.getMediaById(0) - - // Log.d(javaClass.name, "Starting Player with mediaId: ${media.aodId}") - //(activity as MainActivity).startPlayer(media.aodId, media.playlist.first().mediaId) - } - } - viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { model.onUiState(viewLifecycleOwner.lifecycleScope) { uiState -> @@ -165,7 +152,37 @@ class HomeFragment : Fragment() { activity?.showFragment(MediaFragment(uiState.highlightItem.id)) } - // disable the shimmer effect and hide the shimmer layouts + binding.buttonPlayHighlight.setOnClickListener { + val panel = uiState.highlightItemUpNext.panel + activity?.startPlayer(panel.episodeMetadata.seasonId, panel.id) + } + + // disable the shimmer effect + disableShimmer() + + // make highlights layout visible again + binding.linearHighlight.isVisible = true + } + + private fun bindUiStateLoading() { + // hide highlights layout + binding.linearHighlight.isVisible = false + println(binding.root.childCount) + binding.root.children.filter { it is ShimmerFrameLayout }.forEach { + it as ShimmerFrameLayout + it.startShimmer() + } + } + + private fun bindUiStateError(uiState: HomeViewModel.UiState.Error) { + // currently not used + Log.e(classTag, "A error occurred while loading a UiState: ${uiState.message}") + } + + /** + * Disable the shimmer effect for all shimmer layouts and hide them. + */ + private fun disableShimmer() { binding.shimmerLayoutHighlight.apply { stopShimmer() isVisible = false @@ -190,23 +207,6 @@ class HomeFragment : Fragment() { stopShimmer() isVisible = false } - - // make highlights layout visible again - binding.linearHighlight.isVisible = true - } - - private fun bindUiStateLoading() { - // hide highlights layout - binding.linearHighlight.isVisible = false - binding.root.children.filter { it is ShimmerFrameLayout }.forEach { - it as ShimmerFrameLayout - it.startShimmer() - } - } - - private fun bindUiStateError(uiState: HomeViewModel.UiState.Error) { - // currently not used - Log.e(classTag, "A error occurred while loading a UiState: ${uiState.message}") } } diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/HomeViewModel.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/HomeViewModel.kt index 2a8f24f..9b9f483 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/HomeViewModel.kt @@ -44,6 +44,7 @@ class HomeViewModel : ViewModel() { val recentlyAddedItems: List, val topTenItems: List, val highlightItem: Item, + val highlightItemUpNext: UpNextSeriesItem, val highlightIsWatchlist:Boolean ) : UiState() data class Error(val message: String?) : UiState() @@ -77,12 +78,17 @@ class HomeViewModel : ViewModel() { val recentlyAddedItems = recentlyAddedJob.await() // FIXME crashes on newTitles.items.size == 0 val highlightItem = recentlyAddedItems[Random.nextInt(recentlyAddedItems.size)] - val highlightItemIsWatchlist = Crunchyroll.isWatchlist(highlightItem.id) + val highlightItemUpNextJob = viewModelScope.async { + Crunchyroll.upNextSeries(highlightItem.id) + } + val highlightItemIsWatchlistJob = viewModelScope.async { + Crunchyroll.isWatchlist(highlightItem.id) + } uiState.emit(UiState.Normal( upNextJob.await(), watchlistJob.await(), recommendationsJob.await(), recentlyAddedJob.await(), topTenJob.await(), highlightItem, - highlightItemIsWatchlist + highlightItemUpNextJob.await(), highlightItemIsWatchlistJob.await() )) } catch (e: Exception) { uiState.emit(UiState.Error(e.message)) @@ -115,9 +121,6 @@ class HomeViewModel : ViewModel() { } } } - - - } } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt b/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt index 668e7eb..d26fa69 100644 --- a/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt +++ b/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.commit import org.mosad.teapod.R +import org.mosad.teapod.ui.activity.player.PlayerActivity import kotlin.system.exitProcess /** @@ -24,6 +25,20 @@ fun FragmentActivity.showFragment(fragment: Fragment) { } } +/** + * Start the player as new activity. + * + * @param seasonId The ID of the season the episode to be played is in + * @param episodeId The ID of the episode to play + */ +fun Activity.startPlayer(seasonId: String, episodeId: String) { + val intent = Intent(this, PlayerActivity::class.java).apply { + putExtra(getString(R.string.intent_season_id), seasonId) + putExtra(getString(R.string.intent_episode_id), episodeId) + } + startActivity(intent) +} + /** * hide the status and navigation bar */