diff --git a/app-tv/src/main/java/hu/bbara/purefin/navigation/TvRouteEntryBuilder.kt b/app-tv/src/main/java/hu/bbara/purefin/navigation/TvRouteEntryBuilder.kt index 4c306b71..1e171c9f 100644 --- a/app-tv/src/main/java/hu/bbara/purefin/navigation/TvRouteEntryBuilder.kt +++ b/app-tv/src/main/java/hu/bbara/purefin/navigation/TvRouteEntryBuilder.kt @@ -3,7 +3,6 @@ package hu.bbara.purefin.navigation import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation3.runtime.EntryProviderScope import hu.bbara.purefin.feature.browse.home.AppViewModel -import hu.bbara.purefin.ui.screen.episode.TvEpisodeScreen import hu.bbara.purefin.ui.screen.movie.TvMovieScreen import hu.bbara.purefin.ui.screen.series.TvSeriesScreen import hu.bbara.purefin.ui.screen.login.LoginScreen @@ -37,7 +36,10 @@ fun EntryProviderScope.tvSeriesSection() { fun EntryProviderScope.tvEpisodeSection() { entry { route -> - TvEpisodeScreen(episode = route.item) + TvSeriesScreen( + series = SeriesDto(id = route.item.seriesId), + focusedEpisodeId = route.item.id + ) } } diff --git a/app-tv/src/main/java/hu/bbara/purefin/ui/screen/series/TvSeriesScreen.kt b/app-tv/src/main/java/hu/bbara/purefin/ui/screen/series/TvSeriesScreen.kt index dcd55d5f..889a4f00 100644 --- a/app-tv/src/main/java/hu/bbara/purefin/ui/screen/series/TvSeriesScreen.kt +++ b/app-tv/src/main/java/hu/bbara/purefin/ui/screen/series/TvSeriesScreen.kt @@ -37,6 +37,7 @@ import java.util.UUID @Composable fun TvSeriesScreen( series: SeriesDto, + focusedEpisodeId: UUID? = null, modifier: Modifier = Modifier, viewModel: SeriesViewModel = hiltViewModel() ) { @@ -51,6 +52,7 @@ fun TvSeriesScreen( TvSeriesScreenContent( series = seriesData, onPlayEpisode = viewModel::onPlayEpisode, + focusedEpisodeId = focusedEpisodeId, modifier = modifier ) } else { @@ -62,16 +64,25 @@ fun TvSeriesScreen( internal fun TvSeriesScreenContent( series: Series, onPlayEpisode: (UUID) -> Unit, + focusedEpisodeId: UUID? = null, modifier: Modifier = Modifier, ) { val nextUpEpisode = remember(series.id) { series.nextUpEpisode() } - var selectedSeason by remember(series.id, nextUpEpisode?.seasonId) { - mutableStateOf(series.defaultSeason(nextUpEpisode)) + val focusedEpisode = remember(series.id, focusedEpisodeId) { + focusedEpisodeId?.let { id -> + series.seasons + .flatMap { it.episodes } + .firstOrNull { it.id == id } + } + } + val initialEpisode = focusedEpisode ?: nextUpEpisode + var selectedSeason by remember(series.id, initialEpisode?.seasonId) { + mutableStateOf(series.defaultSeason(initialEpisode)) } val firstContentFocusRequester = remember { FocusRequester() } - LaunchedEffect(series.id, nextUpEpisode?.id) { - if (nextUpEpisode != null) return@LaunchedEffect + LaunchedEffect(series.id, initialEpisode?.id) { + if (initialEpisode != null) return@LaunchedEffect withFrameNanos { } firstContentFocusRequester.requestFocus() } @@ -107,7 +118,7 @@ internal fun TvSeriesScreenContent( TvEpisodeCarousel( episodes = selectedSeason.episodes, onPlayEpisode = { onPlayEpisode(it.id) }, - focusedEpisodeId = nextUpEpisode?.id, + focusedEpisodeId = initialEpisode?.id, modifier = Modifier.fillMaxWidth() ) } diff --git a/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt index 016a4e78..a1244b8e 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt @@ -171,7 +171,11 @@ class AppViewModel @Inject constructor( when (mediaUiModel) { is MovieUiModel -> onMovieSelected(mediaUiModel.id) is SeriesUiModel -> onSeriesSelected(mediaUiModel.id) - is EpisodeUiModel -> onSeriesSelected(mediaUiModel.seriesId) + is EpisodeUiModel -> onEpisodeSelected( + seriesId = mediaUiModel.seriesId, + seasonId = mediaUiModel.seasonId, + episodeId = mediaUiModel.id + ) } }