feat: Rename screen and component classes for TV context

This commit is contained in:
2026-04-09 19:01:16 +02:00
parent 512f7bbb5b
commit 313a971684
10 changed files with 41 additions and 41 deletions

View File

@@ -31,7 +31,7 @@ class EpisodeScreenContentTest {
fun episodeScreenContent_showsSeriesContext_andFocusesPlayButton() { fun episodeScreenContent_showsSeriesContext_andFocusesPlayButton() {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
EpisodeScreenContent( TvEpisodeScreenContent(
episode = sampleEpisode(progress = 63.0), episode = sampleEpisode(progress = 63.0),
seriesTitle = "Severance", seriesTitle = "Severance",
onPlay = {} onPlay = {}
@@ -55,7 +55,7 @@ class EpisodeScreenContentTest {
fun episodeScreenContent_hidesSeriesShortcut_whenShortcutUiIsUnavailable() { fun episodeScreenContent_hidesSeriesShortcut_whenShortcutUiIsUnavailable() {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
EpisodeScreenContent( TvEpisodeScreenContent(
episode = sampleEpisode(progress = null), episode = sampleEpisode(progress = null),
seriesTitle = "Severance", seriesTitle = "Severance",
onPlay = {} onPlay = {}
@@ -77,7 +77,7 @@ class EpisodeScreenContentTest {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
EpisodeScreenContent( TvEpisodeScreenContent(
episode = sampleEpisode(progress = 63.0), episode = sampleEpisode(progress = 63.0),
seriesTitle = "Severance", seriesTitle = "Severance",
onPlay = { playCount++ } onPlay = { playCount++ }

View File

@@ -31,7 +31,7 @@ class MovieScreenContentTest {
fun movieScreenContent_focusesPlayButton() { fun movieScreenContent_focusesPlayButton() {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
MovieScreenContent( TvMovieScreenContent(
movie = sampleMovie(progress = 42.0), movie = sampleMovie(progress = 42.0),
onPlay = {} onPlay = {}
) )
@@ -54,7 +54,7 @@ class MovieScreenContentTest {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
MovieScreenContent( TvMovieScreenContent(
movie = sampleMovie(progress = 42.0), movie = sampleMovie(progress = 42.0),
onPlay = { playCount++ } onPlay = { playCount++ }
) )

View File

@@ -31,7 +31,7 @@ class SeriesScreenContentTest {
fun seriesScreenContent_focusesPrimaryAction_whenNextUpExists() { fun seriesScreenContent_focusesPrimaryAction_whenNextUpExists() {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
SeriesScreenContent( TvSeriesScreenContent(
series = sampleSeriesWithEpisodes(), series = sampleSeriesWithEpisodes(),
onPlayEpisode = {} onPlayEpisode = {}
) )
@@ -54,7 +54,7 @@ class SeriesScreenContentTest {
fun seriesScreenContent_focusesFirstSeason_whenNoPlayableEpisodeExists() { fun seriesScreenContent_focusesFirstSeason_whenNoPlayableEpisodeExists() {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
SeriesScreenContent( TvSeriesScreenContent(
series = sampleSeriesWithoutEpisodes(), series = sampleSeriesWithoutEpisodes(),
onPlayEpisode = {} onPlayEpisode = {}
) )
@@ -76,7 +76,7 @@ class SeriesScreenContentTest {
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {
SeriesScreenContent( TvSeriesScreenContent(
series = sampleSeriesWithEpisodes(), series = sampleSeriesWithEpisodes(),
onPlayEpisode = { playCount++ } onPlayEpisode = { playCount++ }
) )

View File

@@ -28,7 +28,7 @@ internal const val EpisodePlayButtonTag = "episode-play-button"
@OptIn(ExperimentalLayoutApi::class) @OptIn(ExperimentalLayoutApi::class)
@Composable @Composable
internal fun EpisodeHeroSection( internal fun TvEpisodeHeroSection(
episode: Episode, episode: Episode,
seriesTitle: String?, seriesTitle: String?,
onPlay: () -> Unit, onPlay: () -> Unit,

View File

@@ -20,15 +20,15 @@ import hu.bbara.purefin.common.ui.components.MediaDetailPlaybackSection
import hu.bbara.purefin.common.ui.components.MediaDetailSectionTitle import hu.bbara.purefin.common.ui.components.MediaDetailSectionTitle
import hu.bbara.purefin.common.ui.components.TvMediaDetailBodyBox import hu.bbara.purefin.common.ui.components.TvMediaDetailBodyBox
import hu.bbara.purefin.common.ui.components.TvMediaDetailScaffold import hu.bbara.purefin.common.ui.components.TvMediaDetailScaffold
import hu.bbara.purefin.core.data.navigation.LocalNavigationManager
import hu.bbara.purefin.core.data.navigation.Route
import hu.bbara.purefin.common.ui.components.tvMediaDetailBackgroundImageUrl import hu.bbara.purefin.common.ui.components.tvMediaDetailBackgroundImageUrl
import hu.bbara.purefin.core.data.navigation.EpisodeDto import hu.bbara.purefin.core.data.navigation.EpisodeDto
import hu.bbara.purefin.core.data.navigation.LocalNavigationManager
import hu.bbara.purefin.core.data.navigation.Route
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.core.model.Episode
import hu.bbara.purefin.feature.shared.content.episode.EpisodeScreenViewModel import hu.bbara.purefin.feature.shared.content.episode.EpisodeScreenViewModel
@Composable @Composable
fun EpisodeScreen( fun TvEpisodeScreen(
episode: EpisodeDto, episode: EpisodeDto,
viewModel: EpisodeScreenViewModel = hiltViewModel(), viewModel: EpisodeScreenViewModel = hiltViewModel(),
modifier: Modifier = Modifier modifier: Modifier = Modifier
@@ -52,7 +52,7 @@ fun EpisodeScreen(
return return
} }
EpisodeScreenContent( TvEpisodeScreenContent(
episode = selectedEpisode, episode = selectedEpisode,
seriesTitle = seriesTitle.value, seriesTitle = seriesTitle.value,
onPlay = remember(selectedEpisode.id, navigationManager) { onPlay = remember(selectedEpisode.id, navigationManager) {
@@ -67,7 +67,7 @@ fun EpisodeScreen(
} }
@Composable @Composable
internal fun EpisodeScreenContent( internal fun TvEpisodeScreenContent(
episode: Episode, episode: Episode,
seriesTitle: String?, seriesTitle: String?,
onPlay: () -> Unit, onPlay: () -> Unit,
@@ -89,7 +89,7 @@ internal fun EpisodeScreenContent(
backgroundImageUrl = tvMediaDetailBackgroundImageUrl(episode.imageUrlPrefix), backgroundImageUrl = tvMediaDetailBackgroundImageUrl(episode.imageUrlPrefix),
modifier = it modifier = it
) { ) {
EpisodeHeroSection( TvEpisodeHeroSection(
episode = episode, episode = episode,
seriesTitle = seriesTitle, seriesTitle = seriesTitle,
onPlay = onPlay, onPlay = onPlay,

View File

@@ -28,7 +28,7 @@ internal const val MoviePlayButtonTag = "movie-play-button"
@OptIn(ExperimentalLayoutApi::class) @OptIn(ExperimentalLayoutApi::class)
@Composable @Composable
internal fun MovieHeroSection( internal fun TvMovieHeroSection(
movie: Movie, movie: Movie,
onPlay: () -> Unit, onPlay: () -> Unit,
playFocusRequester: FocusRequester, playFocusRequester: FocusRequester,

View File

@@ -26,7 +26,7 @@ import hu.bbara.purefin.core.model.Movie
import hu.bbara.purefin.feature.shared.content.movie.MovieScreenViewModel import hu.bbara.purefin.feature.shared.content.movie.MovieScreenViewModel
@Composable @Composable
fun MovieScreen( fun TvMovieScreen(
movie: MovieDto, viewModel: MovieScreenViewModel = hiltViewModel(), modifier: Modifier = Modifier movie: MovieDto, viewModel: MovieScreenViewModel = hiltViewModel(), modifier: Modifier = Modifier
) { ) {
LaunchedEffect(movie.id) { LaunchedEffect(movie.id) {
@@ -36,7 +36,7 @@ fun MovieScreen(
val movieItem = viewModel.movie.collectAsState() val movieItem = viewModel.movie.collectAsState()
if (movieItem.value != null) { if (movieItem.value != null) {
MovieScreenContent( TvMovieScreenContent(
movie = movieItem.value!!, movie = movieItem.value!!,
onPlay = viewModel::onPlay, onPlay = viewModel::onPlay,
modifier = modifier modifier = modifier
@@ -47,7 +47,7 @@ fun MovieScreen(
} }
@Composable @Composable
internal fun MovieScreenContent( internal fun TvMovieScreenContent(
movie: Movie, movie: Movie,
onPlay: () -> Unit, onPlay: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@@ -68,7 +68,7 @@ internal fun MovieScreenContent(
backgroundImageUrl = tvMediaDetailBackgroundImageUrl(movie.imageUrlPrefix), backgroundImageUrl = tvMediaDetailBackgroundImageUrl(movie.imageUrlPrefix),
modifier = it modifier = it
) { ) {
MovieHeroSection( TvMovieHeroSection(
movie = movie, movie = movie,
onPlay = onPlay, onPlay = onPlay,
playFocusRequester = playFocusRequester, playFocusRequester = playFocusRequester,

View File

@@ -72,7 +72,7 @@ internal const val SeriesFirstSeasonTabTag = "series-first-season-tab"
@OptIn(ExperimentalLayoutApi::class) @OptIn(ExperimentalLayoutApi::class)
@Composable @Composable
internal fun SeriesMetaChips(series: Series) { internal fun TvSeriesMetaChips(series: Series) {
val scheme = MaterialTheme.colorScheme val scheme = MaterialTheme.colorScheme
FlowRow( FlowRow(
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp),
@@ -84,7 +84,7 @@ internal fun SeriesMetaChips(series: Series) {
} }
@Composable @Composable
internal fun SeasonTabs( internal fun TvSeasonTabs(
seasons: List<Season>, seasons: List<Season>,
selectedSeason: Season?, selectedSeason: Season?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@@ -99,7 +99,7 @@ internal fun SeasonTabs(
horizontalArrangement = Arrangement.spacedBy(20.dp) horizontalArrangement = Arrangement.spacedBy(20.dp)
) { ) {
seasons.forEachIndexed { index, season -> seasons.forEachIndexed { index, season ->
SeasonTab( TvSeasonTab(
name = season.name, name = season.name,
isSelected = season == selectedSeason, isSelected = season == selectedSeason,
onSelect = { onSelect(season) }, onSelect = { onSelect(season) },
@@ -124,7 +124,7 @@ internal fun SeasonTabs(
} }
@Composable @Composable
private fun SeasonTab( private fun TvSeasonTab(
name: String, name: String,
isSelected: Boolean, isSelected: Boolean,
onSelect: () -> Unit, onSelect: () -> Unit,
@@ -160,7 +160,7 @@ private fun SeasonTab(
} }
@Composable @Composable
internal fun EpisodeCarousel(episodes: List<Episode>, modifier: Modifier = Modifier) { internal fun TvEpisodeCarousel(episodes: List<Episode>, modifier: Modifier = Modifier) {
val listState = rememberLazyListState() val listState = rememberLazyListState()
LaunchedEffect(episodes) { LaunchedEffect(episodes) {
@@ -178,13 +178,13 @@ internal fun EpisodeCarousel(episodes: List<Episode>, modifier: Modifier = Modif
horizontalArrangement = Arrangement.spacedBy(16.dp) horizontalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
items(episodes) { episode -> items(episodes) { episode ->
EpisodeCard(episode = episode) TvEpisodeCard(episode = episode)
} }
} }
} }
@Composable @Composable
internal fun SeriesHeroSection( internal fun TvSeriesHeroSection(
series: Series, series: Series,
nextUpEpisode: Episode?, nextUpEpisode: Episode?,
onPlayEpisode: (Episode) -> Unit, onPlayEpisode: (Episode) -> Unit,
@@ -210,7 +210,7 @@ internal fun SeriesHeroSection(
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
) )
Spacer(modifier = Modifier.height(18.dp)) Spacer(modifier = Modifier.height(18.dp))
SeriesMetaChips(series = series) TvSeriesMetaChips(series = series)
Spacer(modifier = Modifier.height(24.dp)) Spacer(modifier = Modifier.height(24.dp))
if (nextUpEpisode != null) { if (nextUpEpisode != null) {
Text( Text(
@@ -262,7 +262,7 @@ internal fun SeriesHeroSection(
} }
@Composable @Composable
private fun EpisodeCard( private fun TvEpisodeCard(
viewModel: SeriesViewModel = hiltViewModel(), viewModel: SeriesViewModel = hiltViewModel(),
episode: Episode episode: Episode
) { ) {

View File

@@ -29,7 +29,7 @@ import hu.bbara.purefin.feature.shared.content.series.SeriesViewModel
import org.jellyfin.sdk.model.UUID import org.jellyfin.sdk.model.UUID
@Composable @Composable
fun SeriesScreen( fun TvSeriesScreen(
series: SeriesDto, series: SeriesDto,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: SeriesViewModel = hiltViewModel() viewModel: SeriesViewModel = hiltViewModel()
@@ -42,7 +42,7 @@ fun SeriesScreen(
val seriesData = series.value val seriesData = series.value
if (seriesData != null && seriesData.seasons.isNotEmpty()) { if (seriesData != null && seriesData.seasons.isNotEmpty()) {
SeriesScreenContent( TvSeriesScreenContent(
series = seriesData, series = seriesData,
onPlayEpisode = viewModel::onPlayEpisode, onPlayEpisode = viewModel::onPlayEpisode,
modifier = modifier modifier = modifier
@@ -53,7 +53,7 @@ fun SeriesScreen(
} }
@Composable @Composable
internal fun SeriesScreenContent( internal fun TvSeriesScreenContent(
series: Series, series: Series,
onPlayEpisode: (UUID) -> Unit, onPlayEpisode: (UUID) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@@ -81,7 +81,7 @@ internal fun SeriesScreenContent(
backgroundImageUrl = tvMediaDetailBackgroundImageUrl(series.imageUrlPrefix), backgroundImageUrl = tvMediaDetailBackgroundImageUrl(series.imageUrlPrefix),
modifier = it modifier = it
) { ) {
SeriesHeroSection( TvSeriesHeroSection(
series = series, series = series,
nextUpEpisode = nextUpEpisode, nextUpEpisode = nextUpEpisode,
onPlayEpisode = { onPlayEpisode(it.id) }, onPlayEpisode = { onPlayEpisode(it.id) },
@@ -103,7 +103,7 @@ internal fun SeriesScreenContent(
} }
} }
item { item {
SeasonTabs( TvSeasonTabs(
seasons = series.seasons, seasons = series.seasons,
selectedSeason = selectedSeason, selectedSeason = selectedSeason,
firstItemFocusRequester = firstContentFocusRequester, firstItemFocusRequester = firstContentFocusRequester,
@@ -114,7 +114,7 @@ internal fun SeriesScreenContent(
} }
item { item {
Spacer(modifier = Modifier.height(20.dp)) Spacer(modifier = Modifier.height(20.dp))
EpisodeCarousel( TvEpisodeCarousel(
episodes = selectedSeason.episodes, episodes = selectedSeason.episodes,
modifier = it modifier = it
) )

View File

@@ -1,9 +1,9 @@
package hu.bbara.purefin.tv.navigation package hu.bbara.purefin.tv.navigation
import androidx.navigation3.runtime.EntryProviderScope import androidx.navigation3.runtime.EntryProviderScope
import hu.bbara.purefin.app.content.episode.EpisodeScreen import hu.bbara.purefin.app.content.episode.TvEpisodeScreen
import hu.bbara.purefin.app.content.movie.MovieScreen import hu.bbara.purefin.app.content.movie.TvMovieScreen
import hu.bbara.purefin.app.content.series.SeriesScreen import hu.bbara.purefin.app.content.series.TvSeriesScreen
import hu.bbara.purefin.core.data.navigation.LocalNavigationManager import hu.bbara.purefin.core.data.navigation.LocalNavigationManager
import hu.bbara.purefin.core.data.navigation.Route import hu.bbara.purefin.core.data.navigation.Route
import hu.bbara.purefin.login.ui.LoginScreen import hu.bbara.purefin.login.ui.LoginScreen
@@ -25,19 +25,19 @@ fun EntryProviderScope<Route>.tvLoginSection() {
fun EntryProviderScope<Route>.tvMovieSection() { fun EntryProviderScope<Route>.tvMovieSection() {
entry<Route.MovieRoute> { route -> entry<Route.MovieRoute> { route ->
MovieScreen(movie = route.item) TvMovieScreen(movie = route.item)
} }
} }
fun EntryProviderScope<Route>.tvSeriesSection() { fun EntryProviderScope<Route>.tvSeriesSection() {
entry<Route.SeriesRoute> { route -> entry<Route.SeriesRoute> { route ->
SeriesScreen(series = route.item) TvSeriesScreen(series = route.item)
} }
} }
fun EntryProviderScope<Route>.tvEpisodeSection() { fun EntryProviderScope<Route>.tvEpisodeSection() {
entry<Route.EpisodeRoute> { route -> entry<Route.EpisodeRoute> { route ->
EpisodeScreen(episode = route.item) TvEpisodeScreen(episode = route.item)
} }
} }