Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 60 additions & 28 deletions Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.activity.compose.BackHandler
import androidx.compose.foundation.ExperimentalFoundationApi
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.BoxWithConstraints
import androidx.compose.foundation.layout.Column
Expand Down Expand Up @@ -69,10 +70,12 @@ import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
import androidx.compose.material3.adaptive.layout.PaneAdaptedValue
import androidx.compose.material3.adaptive.layout.SupportingPaneScaffold
import androidx.compose.material3.adaptive.layout.SupportingPaneScaffoldRole
import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldValue
import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator
import androidx.compose.material3.adaptive.navigation.rememberSupportingPaneScaffoldNavigator
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
Expand Down Expand Up @@ -137,6 +140,18 @@ data class HomeState(
val onQueueEpisode: (PlayerEpisode) -> Unit,
)

private val HomeState.showHomeCategoryTabs: Boolean
get() = featuredPodcasts.isNotEmpty() && homeCategories.isNotEmpty()

@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private fun HomeState.showGrid(
scaffoldValue: ThreePaneScaffoldValue
): Boolean = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Expanded ||
(
windowSizeClass.widthSizeClass == WindowWidthSizeClass.Medium &&
scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden
)

@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private fun <T> ThreePaneScaffoldNavigator<T>.isMainPaneHidden(): Boolean {
return scaffoldValue[SupportingPaneScaffoldRole.Main] == PaneAdaptedValue.Hidden
Expand Down Expand Up @@ -178,11 +193,11 @@ fun MainScreen(

Surface {
val podcastUri = navigator.currentDestination?.content
?: viewState.featuredPodcasts.firstOrNull()?.uri

val showGrid = homeState.showGrid(navigator.scaffoldValue)
if (podcastUri.isNullOrEmpty()) {
HomeScreen(
homeState = homeState,
showGrid = showGrid,
modifier = Modifier.fillMaxSize()
)
} else {
Expand Down Expand Up @@ -210,6 +225,7 @@ fun MainScreen(
mainPane = {
HomeScreen(
homeState = homeState,
showGrid = showGrid,
modifier = Modifier.fillMaxSize()
)
},
Expand All @@ -222,29 +238,17 @@ fun MainScreen(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun HomeAppBar(
selectedHomeCategory: HomeCategory,
homeCategories: List<HomeCategory>,
onHomeCategorySelected: (HomeCategory) -> Unit,
isExpanded: Boolean,
modifier: Modifier = Modifier,
showHomeCategoryToggle: Boolean = false,
) {
TopAppBar(
title = {
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(end = 16.dp)
) {
if (showHomeCategoryToggle) {
HomeCategoryTabs(
categories = homeCategories,
selectedCategory = selectedHomeCategory,
onCategorySelected = onHomeCategorySelected,
modifier = Modifier.width(240.dp),
showHorizontalLine = false
)
Spacer(modifier = Modifier.weight(1f))
}
SearchBar(
query = "",
onQueryChange = {},
Expand All @@ -266,6 +270,7 @@ private fun HomeAppBar(
contentDescription = stringResource(R.string.cd_account)
)
},
modifier = if (isExpanded) Modifier else Modifier.fillMaxWidth()
) { }
}
},
Expand All @@ -276,6 +281,7 @@ private fun HomeAppBar(
@Composable
private fun HomeScreen(
homeState: HomeState,
showGrid: Boolean,
modifier: Modifier = Modifier
) {
// Effect that changes the home category selection when there are no subscribed podcasts
Expand All @@ -293,10 +299,7 @@ private fun HomeScreen(
),
topBar = {
HomeAppBar(
selectedHomeCategory = homeState.selectedHomeCategory,
homeCategories = homeState.homeCategories,
onHomeCategorySelected = homeState.onHomeCategorySelected,
showHomeCategoryToggle = !homeState.windowSizeClass.isCompact,
isExpanded = homeState.windowSizeClass.isCompact,
modifier = Modifier.fillMaxWidth(),
)
},
Expand All @@ -307,7 +310,8 @@ private fun HomeScreen(
// Main Content
val snackBarText = stringResource(id = R.string.episode_added_to_your_queue)
HomeContent(
showGrid = !homeState.windowSizeClass.isCompact,
showGrid = showGrid,
showHomeCategoryTabs = homeState.showHomeCategoryTabs,
featuredPodcasts = homeState.featuredPodcasts,
isRefreshing = homeState.isRefreshing,
selectedHomeCategory = homeState.selectedHomeCategory,
Expand Down Expand Up @@ -336,6 +340,7 @@ private fun HomeScreen(
@Composable
private fun HomeContent(
showGrid: Boolean,
showHomeCategoryTabs: Boolean,
featuredPodcasts: PersistentList<PodcastInfo>,
isRefreshing: Boolean,
selectedHomeCategory: HomeCategory,
Expand Down Expand Up @@ -369,14 +374,17 @@ private fun HomeContent(
if (showGrid) {
HomeContentGrid(
pagerState = pagerState,
showHomeCategoryTabs = showHomeCategoryTabs,
featuredPodcasts = featuredPodcasts,
isRefreshing = isRefreshing,
selectedHomeCategory = selectedHomeCategory,
homeCategories = homeCategories,
filterableCategoriesModel = filterableCategoriesModel,
podcastCategoryFilterResult = podcastCategoryFilterResult,
library = library,
modifier = modifier,
onPodcastUnfollowed = onPodcastUnfollowed,
onHomeCategorySelected = onHomeCategorySelected,
onCategorySelected = onCategorySelected,
navigateToPodcastDetails = navigateToPodcastDetails,
navigateToPlayer = navigateToPlayer,
Expand All @@ -386,6 +394,7 @@ private fun HomeContent(
} else {
HomeContentColumn(
pagerState = pagerState,
showHomeCategoryTabs = showHomeCategoryTabs,
featuredPodcasts = featuredPodcasts,
isRefreshing = isRefreshing,
selectedHomeCategory = selectedHomeCategory,
Expand All @@ -408,6 +417,7 @@ private fun HomeContent(
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun HomeContentColumn(
showHomeCategoryTabs: Boolean,
pagerState: PagerState,
featuredPodcasts: PersistentList<PodcastInfo>,
isRefreshing: Boolean,
Expand Down Expand Up @@ -443,11 +453,12 @@ private fun HomeContentColumn(
// TODO show a progress indicator or similar
}

if (featuredPodcasts.isNotEmpty() && homeCategories.isNotEmpty()) {
if (showHomeCategoryTabs) {
stickyHeader {
HomeCategoryTabs(
categories = homeCategories,
selectedCategory = selectedHomeCategory,
showHorizontalLine = true,
onCategorySelected = onHomeCategorySelected
)
}
Expand Down Expand Up @@ -479,14 +490,17 @@ private fun HomeContentColumn(

@Composable
private fun HomeContentGrid(
showHomeCategoryTabs: Boolean,
pagerState: PagerState,
featuredPodcasts: PersistentList<PodcastInfo>,
isRefreshing: Boolean,
selectedHomeCategory: HomeCategory,
homeCategories: List<HomeCategory>,
filterableCategoriesModel: FilterableCategoriesModel,
podcastCategoryFilterResult: PodcastCategoryFilterResult,
library: LibraryInfo,
modifier: Modifier = Modifier,
onHomeCategorySelected: (HomeCategory) -> Unit,
onPodcastUnfollowed: (PodcastInfo) -> Unit,
onCategorySelected: (CategoryInfo) -> Unit,
navigateToPodcastDetails: (PodcastInfo) -> Unit,
Expand Down Expand Up @@ -515,6 +529,20 @@ private fun HomeContentGrid(
// TODO show a progress indicator or similar
}

if (showHomeCategoryTabs) {
fullWidthItem {
Row {
HomeCategoryTabs(
categories = homeCategories,
selectedCategory = selectedHomeCategory,
showHorizontalLine = false,
onCategorySelected = onHomeCategorySelected,
modifier = Modifier.width(240.dp)
)
}
}
}

when (selectedHomeCategory) {
HomeCategory.Library -> {
libraryItems(
Expand Down Expand Up @@ -567,8 +595,8 @@ private fun HomeCategoryTabs(
categories: List<HomeCategory>,
selectedCategory: HomeCategory,
onCategorySelected: (HomeCategory) -> Unit,
showHorizontalLine: Boolean,
modifier: Modifier = Modifier,
showHorizontalLine: Boolean = true,
) {
if (categories.isEmpty()) {
return
Expand Down Expand Up @@ -732,9 +760,7 @@ private fun lastUpdated(updated: OffsetDateTime): String {
private fun HomeAppBarPreview() {
JetcasterTheme {
HomeAppBar(
homeCategories = emptyList(),
onHomeCategorySelected = {},
selectedHomeCategory = HomeCategory.Discover,
isExpanded = false
)
}
}
Expand Down Expand Up @@ -772,7 +798,10 @@ private fun PreviewHomeContent() {
onLibraryPodcastSelected = {},
onQueueEpisode = {}
)
HomeScreen(homeState = homeState)
HomeScreen(
homeState = homeState,
showGrid = false
)
}
}

Expand Down Expand Up @@ -806,7 +835,10 @@ private fun PreviewHomeContentExpanded() {
onLibraryPodcastSelected = {},
onQueueEpisode = {}
)
HomeScreen(homeState = homeState)
HomeScreen(
homeState = homeState,
showGrid = true
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
Expand Down Expand Up @@ -287,6 +288,12 @@ fun PodcastDetailsHeaderItemButtons(
Row(modifier.padding(top = 16.dp)) {
Button(
onClick = onClick,
colors = ButtonDefaults.buttonColors(
containerColor = if (isSubscribed)
MaterialTheme.colorScheme.tertiary
else
MaterialTheme.colorScheme.secondary
),
modifier = Modifier.semantics(mergeDescendants = true) { }
) {
Icon(
Expand All @@ -298,7 +305,7 @@ fun PodcastDetailsHeaderItemButtons(
)
Text(
text = if (isSubscribed)
stringResource(id = R.string.unsubscribe)
stringResource(id = R.string.subscribed)
else
stringResource(id = R.string.subscribe),
modifier = Modifier.padding(start = 8.dp)
Expand Down
2 changes: 1 addition & 1 deletion Jetcaster/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
<string name="episode_added_to_your_queue">Episode added to your queue</string>
<string name="cd_podcast_image">Podcast image</string>
<string name="subscribe">Subscribe</string>
<string name="unsubscribe">Unsubscribe</string>
<string name="subscribed">Subscribed</string>
<string name="see_more">see more</string>
<string name="search_for_a_podcast">Search for a podcast</string>

Expand Down