From 2f6d7e77c3f30902ea1c22541bec52b7d5771606 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Wed, 13 May 2026 17:52:30 +0200 Subject: [PATCH] refactor: use common DefaultTopBar component in all components --- .../ui/screen/episode/EpisodeScreen.kt | 4 -- .../episode/components/EpisodeComponents.kt | 65 ++++++++----------- .../screen/home/components/DefaultTopBar.kt | 30 +++++---- .../ui/screen/home/components/HomeTopBar.kt | 5 -- .../movie/components/MovieComponents.kt | 34 ++++------ .../series/components/SeriesComponents.kt | 34 +++++----- 6 files changed, 74 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/episode/EpisodeScreen.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/episode/EpisodeScreen.kt index 68287810..eecebd74 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/episode/EpisodeScreen.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/episode/EpisodeScreen.kt @@ -88,7 +88,6 @@ fun EpisodeScreen( }, downloadState = downloadState.value, onBack = viewModel::onBack, - onSeriesClick = viewModel::onSeriesClick, onDownloadClick = onDownloadClick, modifier = modifier ) @@ -100,7 +99,6 @@ private fun EpisodeScreenInternal( topBarShortcut: EpisodeTopBarShortcut?, downloadState: DownloadState, onBack: () -> Unit, - onSeriesClick: () -> Unit, onDownloadClick: () -> Unit, modifier: Modifier = Modifier, ) { @@ -111,7 +109,6 @@ private fun EpisodeScreenInternal( EpisodeTopBar( shortcut = topBarShortcut, onBack = onBack, - onSeriesClick = onSeriesClick ) }, heroContent = { @@ -169,7 +166,6 @@ private fun EpisodeScreenPreview() { topBarShortcut = EpisodeTopBarShortcut.Series(onClick = {}), downloadState = DownloadState.Downloading(progressPercent = 0.42f), onBack = {}, - onSeriesClick = {}, onDownloadClick = {} ) } diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/episode/components/EpisodeComponents.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/episode/components/EpisodeComponents.kt index 8cfa624c..c24e2bc3 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/episode/components/EpisodeComponents.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/episode/components/EpisodeComponents.kt @@ -1,18 +1,12 @@ package hu.bbara.purefin.ui.screen.episode.components import android.content.Intent -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn -import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowBack @@ -21,12 +15,13 @@ import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.DownloadDone import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext @@ -44,6 +39,7 @@ import hu.bbara.purefin.ui.common.media.MediaPlaybackSettings import hu.bbara.purefin.ui.common.media.MediaSynopsis import hu.bbara.purefin.ui.common.media.mediaPlayButtonText import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress +import hu.bbara.purefin.ui.screen.home.components.DefaultTopBar internal sealed interface EpisodeTopBarShortcut { val label: String @@ -58,55 +54,48 @@ internal sealed interface EpisodeTopBarShortcut { internal fun EpisodeTopBar( shortcut: EpisodeTopBarShortcut?, onBack: () -> Unit, - onSeriesClick: () -> Unit, - modifier: Modifier = Modifier ) { - val scheme = MaterialTheme.colorScheme - Row( - modifier = modifier - .fillMaxWidth() - .statusBarsPadding() - .padding(16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Row( - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { + DefaultTopBar( + leftActions = { GhostIconButton( icon = Icons.Outlined.ArrowBack, contentDescription = "Back", onClick = onBack ) - when { - shortcut != null -> { - Box( + when (shortcut) { + is EpisodeTopBarShortcut.Series -> { + TextButton( + onClick = shortcut.onClick, + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.surface.copy(alpha = 0.65f), + contentColor = MaterialTheme.colorScheme.onSurface + ), modifier = Modifier .height(52.dp) - .clickable(onClick = shortcut.onClick), - contentAlignment = Alignment.Center + .clip(CircleShape) ) { Text( text = shortcut.label, - color = scheme.onBackground, - fontSize = 16.sp, - fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onBackground, + fontSize = 18.sp, + fontWeight = FontWeight.Bold, maxLines = 1, overflow = TextOverflow.Ellipsis, - modifier = Modifier - .clip(CircleShape) - .background(scheme.background.copy(alpha = 0.65f)) - .padding(horizontal = 16.dp, vertical = 10.dp) ) } } + null -> {} } - } - Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { + }, + rightActions = { GhostIconButton(icon = Icons.Outlined.Cast, contentDescription = "Cast", onClick = { }) - GhostIconButton(icon = Icons.Outlined.MoreVert, contentDescription = "More", onClick = { }) - } - } + GhostIconButton( + icon = Icons.Outlined.MoreVert, + contentDescription = "More", + onClick = { }) + }, + withIcon = false + ) } @Composable diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/DefaultTopBar.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/DefaultTopBar.kt index 56608cbe..ae7a770d 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/DefaultTopBar.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/DefaultTopBar.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import hu.bbara.purefin.navigation.HOME_SEARCH_SHARED_BOUNDS_KEY @@ -35,11 +36,12 @@ import hu.bbara.purefin.ui.common.image.PurefinLogo fun DefaultTopBar( leftActions: (@Composable RowScope.() -> Unit)? = null, rightActions: (@Composable RowScope.() -> Unit)? = null, + withIcon: Boolean = true ) { val scheme = MaterialTheme.colorScheme Surface( - color = scheme.background, + color = Color.Transparent, contentColor = scheme.onSurface, modifier = Modifier.fillMaxWidth() ) { @@ -54,25 +56,29 @@ fun DefaultTopBar( if (leftActions != null) { Row( verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp), content = leftActions ) } - Row( - modifier = Modifier, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = when { - leftActions == null && rightActions != null -> Arrangement.Start - leftActions != null && rightActions == null -> Arrangement.Center - else -> Arrangement.Center + if (withIcon) { + Row( + modifier = Modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = when { + leftActions == null && rightActions != null -> Arrangement.Start + leftActions != null && rightActions == null -> Arrangement.Center + else -> Arrangement.Center + } + ) { + PurefinLogo( + modifier = Modifier.size(56.dp), + ) } - ) { - PurefinLogo( - modifier = Modifier.size(56.dp), - ) } if (rightActions != null) { Row( verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp), content = rightActions ) } diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/HomeTopBar.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/HomeTopBar.kt index fc87bccb..0bb71527 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/HomeTopBar.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/home/components/HomeTopBar.kt @@ -1,7 +1,5 @@ package hu.bbara.purefin.ui.screen.home.components -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Person import androidx.compose.material3.DropdownMenu @@ -12,8 +10,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp @Composable fun HomeTopBar( @@ -29,7 +25,6 @@ fun HomeTopBar( DefaultTopBar( rightActions = { DefaultTopBarSearchButton(onClick = onSearchClick) - Spacer(modifier = Modifier.size(12.dp)) DefaultTopBarIconButton( imageVector = Icons.Outlined.Person, contentDescription = "Profile", diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/movie/components/MovieComponents.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/movie/components/MovieComponents.kt index d3aa7c8b..a1451d6c 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/movie/components/MovieComponents.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/movie/components/MovieComponents.kt @@ -1,15 +1,12 @@ package hu.bbara.purefin.ui.screen.movie.components import android.content.Intent -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn -import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowBack import androidx.compose.material.icons.outlined.Cast @@ -22,7 +19,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight @@ -38,33 +34,29 @@ import hu.bbara.purefin.ui.common.media.MediaPlaybackSettings import hu.bbara.purefin.ui.common.media.MediaSynopsis import hu.bbara.purefin.ui.common.media.mediaPlayButtonText import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress +import hu.bbara.purefin.ui.screen.home.components.DefaultTopBar @Composable internal fun MovieTopBar( onBack: () -> Unit, - modifier: Modifier = Modifier ) { - Row( - modifier = modifier - .fillMaxWidth() - .statusBarsPadding() - .padding(16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - GhostIconButton( - icon = Icons.Outlined.ArrowBack, - contentDescription = "Back", - onClick = onBack - ) - Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { + DefaultTopBar( + leftActions = { + GhostIconButton( + icon = Icons.Outlined.ArrowBack, + contentDescription = "Back", + onClick = onBack + ) + }, + rightActions = { GhostIconButton(icon = Icons.Outlined.Cast, contentDescription = "Cast", onClick = { }) GhostIconButton( icon = Icons.Outlined.MoreVert, contentDescription = "More", onClick = { }) - } - } + }, + withIcon = false + ) } @OptIn(ExperimentalLayoutApi::class) diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/series/components/SeriesComponents.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/series/components/SeriesComponents.kt index e2e1d4a5..ef036043 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/series/components/SeriesComponents.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/series/components/SeriesComponents.kt @@ -17,7 +17,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.sizeIn -import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items @@ -76,29 +75,28 @@ import hu.bbara.purefin.ui.common.image.PurefinAsyncImage import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow import hu.bbara.purefin.ui.common.media.mediaPlayButtonText import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress +import hu.bbara.purefin.ui.screen.home.components.DefaultTopBar @Composable internal fun SeriesTopBar( onBack: () -> Unit, modifier: Modifier = Modifier ) { - Row( - modifier = modifier - .fillMaxWidth() - .statusBarsPadding() - .padding(16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - GhostIconButton( - onClick = onBack, - icon = Icons.Outlined.ArrowBack, - contentDescription = "Back") - Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { - GhostIconButton(icon = Icons.Outlined.Cast, contentDescription = "Cast", onClick = { }) - GhostIconButton(icon = Icons.Outlined.MoreVert, contentDescription = "More", onClick = { }) - } - } + DefaultTopBar( + leftActions = { + GhostIconButton( + onClick = onBack, + icon = Icons.Outlined.ArrowBack, + contentDescription = "Back") + }, + rightActions = { + Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { + GhostIconButton(icon = Icons.Outlined.Cast, contentDescription = "Cast", onClick = { }) + GhostIconButton(icon = Icons.Outlined.MoreVert, contentDescription = "More", onClick = { }) + } + }, + withIcon = false + ) } @Composable