From 3aa8b2cce4a2b39a67939463d6865a22299242c6 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Thu, 26 Mar 2026 20:12:19 +0100 Subject: [PATCH] Refactor navigation logic into separate container AppScreen --- .../hu/bbara/purefin/app/home/AppBottomBar.kt | 38 ++++++ .../hu/bbara/purefin/app/home/AppScreen.kt | 70 +++++++++++ .../bbara/purefin/app/home/DownloadsScreen.kt | 32 +++++ .../bbara/purefin/app/home/HomeNavigation.kt | 2 +- .../hu/bbara/purefin/app/home/HomePage.kt | 110 ------------------ .../hu/bbara/purefin/app/home/HomeScreen.kt | 59 ++++++++++ .../bbara/purefin/app/home/LibrariesScreen.kt | 41 +++++++ .../purefin/navigation/RouteEntryBuilder.kt | 4 +- 8 files changed, 243 insertions(+), 113 deletions(-) create mode 100644 app/src/main/java/hu/bbara/purefin/app/home/AppBottomBar.kt create mode 100644 app/src/main/java/hu/bbara/purefin/app/home/AppScreen.kt create mode 100644 app/src/main/java/hu/bbara/purefin/app/home/DownloadsScreen.kt delete mode 100644 app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt create mode 100644 app/src/main/java/hu/bbara/purefin/app/home/HomeScreen.kt create mode 100644 app/src/main/java/hu/bbara/purefin/app/home/LibrariesScreen.kt diff --git a/app/src/main/java/hu/bbara/purefin/app/home/AppBottomBar.kt b/app/src/main/java/hu/bbara/purefin/app/home/AppBottomBar.kt new file mode 100644 index 0000000..095bfcb --- /dev/null +++ b/app/src/main/java/hu/bbara/purefin/app/home/AppBottomBar.kt @@ -0,0 +1,38 @@ +package hu.bbara.purefin.app.home + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Collections +import androidx.compose.material.icons.outlined.Download +import androidx.compose.material.icons.outlined.Home +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable + +@Composable +fun AppBottomBar( + selectedTab: Int, + onTabSelected: (Int) -> Unit +) { + NavigationBar { + NavigationBarItem( + selected = selectedTab == 0, + onClick = { onTabSelected(0) }, + icon = { Icon(Icons.Outlined.Home, contentDescription = "Home") }, + label = { Text("Home") } + ) + NavigationBarItem( + selected = selectedTab == 1, + onClick = { onTabSelected(1) }, + icon = { Icon(Icons.Outlined.Collections, contentDescription = "Libraries") }, + label = { Text("Libraries") } + ) + NavigationBarItem( + selected = selectedTab == 2, + onClick = { onTabSelected(2) }, + icon = { Icon(Icons.Outlined.Download, contentDescription = "Downloads") }, + label = { Text("Downloads") } + ) + } +} diff --git a/app/src/main/java/hu/bbara/purefin/app/home/AppScreen.kt b/app/src/main/java/hu/bbara/purefin/app/home/AppScreen.kt new file mode 100644 index 0000000..43cfecf --- /dev/null +++ b/app/src/main/java/hu/bbara/purefin/app/home/AppScreen.kt @@ -0,0 +1,70 @@ +package hu.bbara.purefin.app.home + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.LifecycleResumeEffect +import hu.bbara.purefin.app.home.ui.HomeNavItem +import hu.bbara.purefin.feature.shared.home.HomePageViewModel + +@Composable +fun AppScreen( + viewModel: HomePageViewModel = hiltViewModel(), + modifier: Modifier = Modifier +) { + var selectedTab by remember { mutableIntStateOf(0) } + + val libraries by viewModel.libraries.collectAsState() + val libraryContent by viewModel.latestLibraryContent.collectAsState() + val continueWatching by viewModel.continueWatching.collectAsState() + val nextUp by viewModel.nextUp.collectAsState() + val isRefreshing by viewModel.isRefreshing.collectAsState() + + val libraryNavItems = libraries.map { + HomeNavItem( + id = it.id, + label = it.name, + posterUrl = it.posterUrl + ) + } + + LifecycleResumeEffect(Unit) { + viewModel.onResumed() + onPauseOrDispose { } + } + + when (selectedTab) { + 0 -> HomeScreen( + libraries = libraries, + libraryContent = libraryContent, + continueWatching = continueWatching, + nextUp = nextUp, + isRefreshing = isRefreshing, + onRefresh = viewModel::onRefresh, + onMovieSelected = viewModel::onMovieSelected, + onSeriesSelected = viewModel::onSeriesSelected, + onEpisodeSelected = viewModel::onEpisodeSelected, + selectedTab = selectedTab, + onTabSelected = { selectedTab = it }, + modifier = modifier.fillMaxSize() + ) + 1 -> LibrariesScreen( + items = libraryNavItems, + onLibrarySelected = { item -> viewModel.onLibrarySelected(item.id, item.label) }, + selectedTab = selectedTab, + onTabSelected = { selectedTab = it }, + modifier = modifier.fillMaxSize() + ) + 2 -> DownloadsScreen( + selectedTab = selectedTab, + onTabSelected = { selectedTab = it }, + modifier = modifier.fillMaxSize() + ) + } +} diff --git a/app/src/main/java/hu/bbara/purefin/app/home/DownloadsScreen.kt b/app/src/main/java/hu/bbara/purefin/app/home/DownloadsScreen.kt new file mode 100644 index 0000000..da3d6f6 --- /dev/null +++ b/app/src/main/java/hu/bbara/purefin/app/home/DownloadsScreen.kt @@ -0,0 +1,32 @@ +package hu.bbara.purefin.app.home + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import hu.bbara.purefin.app.home.ui.DownloadsContent + +@Composable +fun DownloadsScreen( + selectedTab: Int, + onTabSelected: (Int) -> Unit, + modifier: Modifier = Modifier +) { + Scaffold( + modifier = modifier.fillMaxSize(), + containerColor = MaterialTheme.colorScheme.background, + contentColor = MaterialTheme.colorScheme.onBackground, + bottomBar = { + AppBottomBar( + selectedTab = selectedTab, + onTabSelected = onTabSelected + ) + } + ) { innerPadding -> + DownloadsContent( + modifier = Modifier.padding(innerPadding) + ) + } +} diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt index 6f83d74..396067e 100644 --- a/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt +++ b/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt @@ -8,6 +8,6 @@ import hu.bbara.purefin.core.data.navigation.Route */ fun EntryProviderScope.homeSection() { entry { - HomePage() + AppScreen() } } diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt deleted file mode 100644 index 4fed9b3..0000000 --- a/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt +++ /dev/null @@ -1,110 +0,0 @@ -package hu.bbara.purefin.app.home - -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Collections -import androidx.compose.material.icons.outlined.Download -import androidx.compose.material.icons.outlined.Home -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.LifecycleResumeEffect -import hu.bbara.purefin.app.home.ui.DownloadsContent -import hu.bbara.purefin.app.home.ui.HomeContent -import hu.bbara.purefin.app.home.ui.HomeNavItem -import hu.bbara.purefin.app.home.ui.HomeTopBar -import hu.bbara.purefin.app.home.ui.LibrariesContent -import hu.bbara.purefin.feature.shared.home.HomePageViewModel - -@Composable -fun HomePage( - viewModel: HomePageViewModel = hiltViewModel(), - modifier: Modifier = Modifier -) { - var selectedTab by remember { mutableIntStateOf(0) } - - val libraries = viewModel.libraries.collectAsState().value - val isOfflineMode = viewModel.isOfflineMode.collectAsState().value - val libraryNavItems = libraries.map { - HomeNavItem( - id = it.id, - label = it.name, - posterUrl = it.posterUrl - ) - } - val continueWatching = viewModel.continueWatching.collectAsState() - val nextUp = viewModel.nextUp.collectAsState() - val latestLibraryContent = viewModel.latestLibraryContent.collectAsState() - val isRefreshing = viewModel.isRefreshing.collectAsState() - - LifecycleResumeEffect(Unit) { - viewModel.onResumed() - onPauseOrDispose { } - } - - Scaffold( - modifier = modifier.fillMaxSize(), - containerColor = MaterialTheme.colorScheme.background, - contentColor = MaterialTheme.colorScheme.onBackground, - topBar = { - HomeTopBar() - }, - bottomBar = { - NavigationBar { - NavigationBarItem( - selected = selectedTab == 0, - onClick = { selectedTab = 0 }, - icon = { Icon(Icons.Outlined.Home, contentDescription = "Home") }, - label = { Text("Home") } - ) - NavigationBarItem( - selected = selectedTab == 1, - onClick = { selectedTab = 1 }, - icon = { Icon(Icons.Outlined.Collections, contentDescription = "Libraries") }, - label = { Text("Libraries") } - ) - NavigationBarItem( - selected = selectedTab == 2, - onClick = { selectedTab = 2 }, - icon = { Icon(Icons.Outlined.Download, contentDescription = "Downloads") }, - label = { Text("Downloads") } - ) - } - } - ) { innerPadding -> - when (selectedTab) { - 0 -> HomeContent( - libraries = libraries, - libraryContent = latestLibraryContent.value, - continueWatching = continueWatching.value, - nextUp = nextUp.value, - isRefreshing = isRefreshing.value, - onRefresh = viewModel::onRefresh, - onMovieSelected = viewModel::onMovieSelected, - onSeriesSelected = viewModel::onSeriesSelected, - onEpisodeSelected = viewModel::onEpisodeSelected, - modifier = Modifier.padding(innerPadding) - ) - 1 -> LibrariesContent( - items = libraryNavItems, - onLibrarySelected = { item -> viewModel.onLibrarySelected(item.id, item.label) }, - modifier = Modifier.padding(innerPadding) - ) - 2 -> DownloadsContent( - modifier = Modifier.padding(innerPadding) - ) - } - } -} diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomeScreen.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomeScreen.kt new file mode 100644 index 0000000..150b368 --- /dev/null +++ b/app/src/main/java/hu/bbara/purefin/app/home/HomeScreen.kt @@ -0,0 +1,59 @@ +package hu.bbara.purefin.app.home + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import hu.bbara.purefin.app.home.ui.HomeContent +import hu.bbara.purefin.app.home.ui.HomeTopBar +import hu.bbara.purefin.feature.shared.home.ContinueWatchingItem +import hu.bbara.purefin.feature.shared.home.LibraryItem +import hu.bbara.purefin.feature.shared.home.NextUpItem +import hu.bbara.purefin.feature.shared.home.PosterItem +import org.jellyfin.sdk.model.UUID + +@Composable +fun HomeScreen( + libraries: List, + libraryContent: Map>, + continueWatching: List, + nextUp: List, + isRefreshing: Boolean, + onRefresh: () -> Unit, + onMovieSelected: (UUID) -> Unit, + onSeriesSelected: (UUID) -> Unit, + onEpisodeSelected: (UUID, UUID, UUID) -> Unit, + selectedTab: Int, + onTabSelected: (Int) -> Unit, + modifier: Modifier = Modifier +) { + Scaffold( + modifier = modifier.fillMaxSize(), + containerColor = MaterialTheme.colorScheme.background, + contentColor = MaterialTheme.colorScheme.onBackground, + topBar = { + HomeTopBar() + }, + bottomBar = { + AppBottomBar( + selectedTab = selectedTab, + onTabSelected = onTabSelected + ) + } + ) { innerPadding -> + HomeContent( + libraries = libraries, + libraryContent = libraryContent, + continueWatching = continueWatching, + nextUp = nextUp, + isRefreshing = isRefreshing, + onRefresh = onRefresh, + onMovieSelected = onMovieSelected, + onSeriesSelected = onSeriesSelected, + onEpisodeSelected = onEpisodeSelected, + modifier = Modifier.padding(innerPadding) + ) + } +} diff --git a/app/src/main/java/hu/bbara/purefin/app/home/LibrariesScreen.kt b/app/src/main/java/hu/bbara/purefin/app/home/LibrariesScreen.kt new file mode 100644 index 0000000..c3334cd --- /dev/null +++ b/app/src/main/java/hu/bbara/purefin/app/home/LibrariesScreen.kt @@ -0,0 +1,41 @@ +package hu.bbara.purefin.app.home + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import hu.bbara.purefin.app.home.ui.HomeNavItem +import hu.bbara.purefin.app.home.ui.HomeTopBar +import hu.bbara.purefin.app.home.ui.LibrariesContent + +@Composable +fun LibrariesScreen( + items: List, + onLibrarySelected: (HomeNavItem) -> Unit, + selectedTab: Int, + onTabSelected: (Int) -> Unit, + modifier: Modifier = Modifier +) { + Scaffold( + modifier = modifier.fillMaxSize(), + containerColor = MaterialTheme.colorScheme.background, + contentColor = MaterialTheme.colorScheme.onBackground, + topBar = { + HomeTopBar() + }, + bottomBar = { + AppBottomBar( + selectedTab = selectedTab, + onTabSelected = onTabSelected + ) + } + ) { innerPadding -> + LibrariesContent( + items = items, + onLibrarySelected = onLibrarySelected, + modifier = Modifier.padding(innerPadding) + ) + } +} diff --git a/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt b/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt index c77ef0d..6458c54 100644 --- a/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt +++ b/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt @@ -4,14 +4,14 @@ import androidx.navigation3.runtime.EntryProviderScope import hu.bbara.purefin.app.content.episode.EpisodeScreen import hu.bbara.purefin.app.content.movie.MovieScreen import hu.bbara.purefin.app.content.series.SeriesScreen -import hu.bbara.purefin.app.home.HomePage +import hu.bbara.purefin.app.home.AppScreen import hu.bbara.purefin.app.library.ui.LibraryScreen import hu.bbara.purefin.core.data.navigation.Route import hu.bbara.purefin.login.ui.LoginScreen fun EntryProviderScope.appRouteEntryBuilder() { entry { - HomePage() + AppScreen() } entry { MovieScreen(movie = it.item)