mirror of
https://github.com/bbara04/Purefin.git
synced 2026-07-23 19:26:50 +00:00
feat: Rename screen and component classes for TV context
This commit is contained in:
@@ -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++ }
|
||||||
|
|||||||
@@ -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++ }
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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++ }
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -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,
|
||||||
@@ -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,
|
||||||
@@ -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,
|
||||||
@@ -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
|
||||||
) {
|
) {
|
||||||
@@ -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
|
||||||
)
|
)
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user