diff --git a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt index bed2efd..c7f8a88 100644 --- a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt +++ b/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt @@ -4,6 +4,7 @@ import android.Manifest import android.os.Build import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -26,8 +27,11 @@ import hu.bbara.purefin.core.data.navigation.LocalNavigationBackStack 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.CastMember import hu.bbara.purefin.feature.download.DownloadState import hu.bbara.purefin.feature.shared.content.episode.EpisodeScreenViewModel +import hu.bbara.purefin.ui.theme.AppTheme +import java.util.UUID @Composable fun EpisodeScreen( @@ -142,4 +146,43 @@ private fun EpisodeScreenInternal( } } +@Preview(showBackground = true) +@Composable +private fun EpisodeScreenPreview() { + AppTheme { + EpisodeScreenInternal( + episode = previewEpisode(), + seriesTitle = "Severance", + topBarShortcut = EpisodeTopBarShortcut.Series(onClick = {}), + downloadState = DownloadState.Downloading(progressPercent = 0.42f), + onBack = {}, + onSeriesClick = {}, + onDownloadClick = {} + ) + } +} +private fun previewEpisode(): Episode { + val seriesId = UUID.fromString("11111111-1111-1111-1111-111111111111") + val seasonId = UUID.fromString("22222222-2222-2222-2222-222222222222") + return Episode( + id = UUID.fromString("33333333-3333-3333-3333-333333333333"), + seriesId = seriesId, + seasonId = seasonId, + index = 4, + title = "The You You Are", + synopsis = "Mark is pulled deeper into Lumon's fractured world as the team chases a clue that reframes everything they thought they understood.", + releaseDate = "2025", + rating = "16+", + runtime = "49m", + progress = 63.0, + watched = false, + format = "4K", + heroImageUrl = "https://images.unsplash.com/photo-1500530855697-b586d89ba3ee", + cast = listOf( + CastMember("Adam Scott", "Mark Scout", null), + CastMember("Britt Lower", "Helly R.", null), + CastMember("John Turturro", "Irving B.", null) + ) + ) +} diff --git a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt index 008f5a8..4e9daeb 100644 --- a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt +++ b/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt @@ -4,6 +4,7 @@ import android.Manifest import android.os.Build import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -21,9 +22,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import hu.bbara.purefin.common.ui.PurefinWaitingScreen import hu.bbara.purefin.common.ui.components.MediaHero import hu.bbara.purefin.core.data.navigation.MovieDto +import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.feature.download.DownloadState import hu.bbara.purefin.feature.shared.content.movie.MovieScreenViewModel +import hu.bbara.purefin.ui.theme.AppTheme +import java.util.UUID @Composable fun MovieScreen( @@ -107,3 +111,38 @@ private fun MovieScreenInternal( } } } + +@Preview(showBackground = true) +@Composable +private fun MovieScreenPreview() { + AppTheme { + MovieScreenInternal( + movie = previewMovie(), + downloadState = DownloadState.NotDownloaded, + onDownloadClick = {}, + onBack = {} + ) + } +} + +private fun previewMovie(): Movie = + Movie( + id = UUID.fromString("44444444-4444-4444-4444-444444444444"), + libraryId = UUID.fromString("55555555-5555-5555-5555-555555555555"), + title = "Blade Runner 2049", + progress = 18.0, + watched = false, + year = "2017", + rating = "16+", + runtime = "2h 44m", + format = "Dolby Vision", + synopsis = "A new blade runner uncovers a buried secret that forces him to trace the vanished footsteps of Rick Deckard.", + heroImageUrl = "https://images.unsplash.com/photo-1519608487953-e999c86e7455", + audioTrack = "English 5.1", + subtitles = "English CC", + cast = listOf( + CastMember("Ryan Gosling", "K", null), + CastMember("Ana de Armas", "Joi", null), + CastMember("Harrison Ford", "Rick Deckard", null) + ) + ) diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt index 9d4cb90..8a1f61d 100644 --- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt +++ b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -27,10 +28,14 @@ import hu.bbara.purefin.common.ui.MediaSynopsis import hu.bbara.purefin.common.ui.PurefinWaitingScreen import hu.bbara.purefin.common.ui.components.MediaHero import hu.bbara.purefin.core.data.navigation.SeriesDto +import hu.bbara.purefin.core.model.CastMember +import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.feature.download.DownloadState import hu.bbara.purefin.feature.shared.content.series.SeriesViewModel +import hu.bbara.purefin.ui.theme.AppTheme +import java.util.UUID @Composable fun SeriesScreen( @@ -51,7 +56,19 @@ fun SeriesScreen( } SeriesScreenInternal( series = seriesData, - viewModel = viewModel, + seriesDownloadState = viewModel.seriesDownloadState.collectAsState().value, + seasonDownloadState = viewModel.seasonDownloadState.collectAsState().value, + onDownloadOptionSelected = { option, selectedSeason -> + when (option) { + SeriesDownloadOption.SEASON -> + viewModel.downloadSeason(selectedSeason.episodes) + SeriesDownloadOption.SERIES -> + viewModel.downloadSeries(seriesData) + SeriesDownloadOption.SMART -> + viewModel.enableSmartDownload(seriesData.id) + } + }, + onObserveSeasonDownloadState = viewModel::observeSeasonDownloadState, onBack = viewModel::onBack, modifier = modifier ) @@ -63,7 +80,10 @@ fun SeriesScreen( @Composable private fun SeriesScreenInternal( series: Series, - viewModel: SeriesViewModel, + seriesDownloadState: DownloadState, + seasonDownloadState: DownloadState, + onDownloadOptionSelected: (SeriesDownloadOption, Season) -> Unit, + onObserveSeasonDownloadState: (List) -> Unit, onBack: () -> Unit, modifier: Modifier = Modifier, ) { @@ -89,10 +109,8 @@ private fun SeriesScreenInternal( } ?: series.seasons.firstOrNull()?.episodes?.firstOrNull() } - val seriesDownloadState by viewModel.seriesDownloadState.collectAsState() - val seasonDownloadState by viewModel.seasonDownloadState.collectAsState() LaunchedEffect(selectedSeason.id, selectedSeason.episodes) { - viewModel.observeSeasonDownloadState(selectedSeason.episodes) + onObserveSeasonDownloadState(selectedSeason.episodes) } Scaffold( @@ -138,14 +156,7 @@ private fun SeriesScreenInternal( selectedSeason = selectedSeason, seasonDownloadState = seasonDownloadState, onDownloadOptionSelected = { option -> - when (option) { - SeriesDownloadOption.SEASON -> - viewModel.downloadSeason(selectedSeason.episodes) - SeriesDownloadOption.SERIES -> - viewModel.downloadSeries(series) - SeriesDownloadOption.SMART -> - viewModel.enableSmartDownload(series.id) - } + onDownloadOptionSelected(option, selectedSeason) } ) Spacer(modifier = Modifier.height(24.dp)) @@ -180,3 +191,114 @@ private fun SeriesScreenInternal( } } } + +@Preview(showBackground = true) +@Composable +private fun SeriesScreenPreview() { + AppTheme { + SeriesScreenInternal( + series = previewSeries(), + seriesDownloadState = DownloadState.Downloading(progressPercent = 0.58f), + seasonDownloadState = DownloadState.NotDownloaded, + onDownloadOptionSelected = { _, _ -> }, + onObserveSeasonDownloadState = {}, + onBack = {} + ) + } +} + +private fun previewSeries(): Series { + val libraryId = UUID.fromString("66666666-6666-6666-6666-666666666666") + val seriesId = UUID.fromString("77777777-7777-7777-7777-777777777777") + val seasonOneId = UUID.fromString("88888888-8888-8888-8888-888888888888") + val seasonTwoId = UUID.fromString("99999999-9999-9999-9999-999999999999") + + val seasonOneEpisodes = listOf( + Episode( + id = UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"), + seriesId = seriesId, + seasonId = seasonOneId, + index = 1, + title = "A Fresh Start", + synopsis = "A fractured crew tries to reassemble after a year apart.", + releaseDate = "2024", + rating = "16+", + runtime = "51m", + progress = 100.0, + watched = true, + format = "4K", + heroImageUrl = "https://images.unsplash.com/photo-1497032205916-ac775f0649ae", + cast = emptyList() + ), + Episode( + id = UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa2"), + seriesId = seriesId, + seasonId = seasonOneId, + index = 2, + title = "Signals", + synopsis = "Anomalies around the station point to a cover-up.", + releaseDate = "2024", + rating = "16+", + runtime = "48m", + progress = 34.0, + watched = false, + format = "4K", + heroImageUrl = "https://images.unsplash.com/photo-1520034475321-cbe63696469a", + cast = emptyList() + ) + ) + val seasonTwoEpisodes = listOf( + Episode( + id = UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa3"), + seriesId = seriesId, + seasonId = seasonTwoId, + index = 1, + title = "Return Window", + synopsis = "A high-risk jump changes the rules of the mission.", + releaseDate = "2025", + rating = "16+", + runtime = "54m", + progress = null, + watched = false, + format = "4K", + heroImageUrl = "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429", + cast = emptyList() + ) + ) + + return Series( + id = seriesId, + libraryId = libraryId, + name = "Constellation", + synopsis = "When an experiment in orbit goes wrong, the survivors return home to a world that no longer fits their memories.", + year = "2024", + heroImageUrl = "https://images.unsplash.com/photo-1446776811953-b23d57bd21aa", + unwatchedEpisodeCount = 2, + seasonCount = 2, + seasons = listOf( + Season( + id = seasonOneId, + seriesId = seriesId, + name = "Season 1", + index = 1, + unwatchedEpisodeCount = 1, + episodeCount = seasonOneEpisodes.size, + episodes = seasonOneEpisodes + ), + Season( + id = seasonTwoId, + seriesId = seriesId, + name = "Season 2", + index = 2, + unwatchedEpisodeCount = 1, + episodeCount = seasonTwoEpisodes.size, + episodes = seasonTwoEpisodes + ) + ), + cast = listOf( + CastMember("Noomi Rapace", "Jo", null), + CastMember("Jonathan Banks", "Henry", null), + CastMember("James D'Arcy", "Magnus", null) + ) + ) +}