diff --git a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt index 1e3d1a044..5e7a0d620 100644 --- a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.home.pocket +import android.content.res.Configuration import android.view.View import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column @@ -12,7 +13,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -25,7 +25,6 @@ import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.compose.home.HomeSectionHeader import org.mozilla.fenix.theme.FirefoxTheme -import org.mozilla.fenix.theme.Theme import org.mozilla.fenix.wallpapers.WallpaperState internal const val POCKET_CATEGORIES_SELECTED_AT_A_TIME_COUNT = 8 @@ -61,10 +60,8 @@ class PocketCategoriesViewHolder( val wallpaperState = components.appStore .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default - var selectedBackgroundColor: Color? = null - var unselectedBackgroundColor: Color? = null - var selectedTextColor: Color? = null - var unselectedTextColor: Color? = null + var (selectedBackgroundColor, unselectedBackgroundColor, selectedTextColor, unselectedTextColor) = + PocketStoriesCategoryColors.buildColors() wallpaperState.composeRunIfWallpaperCardColorsAreAvailable { cardColorLight, cardColorDark -> if (isSystemInDarkTheme()) { selectedBackgroundColor = cardColorDark @@ -79,16 +76,20 @@ class PocketCategoriesViewHolder( } } + val categoryColors = PocketStoriesCategoryColors( + selectedTextColor = selectedTextColor, + unselectedTextColor = unselectedTextColor, + selectedBackgroundColor = selectedBackgroundColor, + unselectedBackgroundColor = unselectedBackgroundColor, + ) + // See the detailed comment in PocketStoriesViewHolder for reasoning behind this change. if (!homeScreenReady) return Column { Spacer(Modifier.height(24.dp)) PocketTopics( - selectedBackgroundColor = selectedBackgroundColor, - unselectedBackgroundColor = unselectedBackgroundColor, - selectedTextColor = selectedTextColor, - unselectedTextColor = unselectedTextColor, + categoryColors = categoryColors, categories = categories ?: emptyList(), categoriesSelections = categoriesSelections ?: emptyList(), onCategoryClick = interactor::onCategoryClicked, @@ -103,12 +104,9 @@ class PocketCategoriesViewHolder( @Composable private fun PocketTopics( - selectedTextColor: Color? = null, - unselectedTextColor: Color? = null, - selectedBackgroundColor: Color? = null, - unselectedBackgroundColor: Color? = null, categories: List = emptyList(), categoriesSelections: List = emptyList(), + categoryColors: PocketStoriesCategoryColors = PocketStoriesCategoryColors.buildColors(), onCategoryClick: (PocketRecommendedStoriesCategory) -> Unit, ) { Column { @@ -121,21 +119,18 @@ private fun PocketTopics( PocketStoriesCategories( categories = categories, selections = categoriesSelections, - selectedTextColor = selectedTextColor, - unselectedTextColor = unselectedTextColor, - selectedBackgroundColor = selectedBackgroundColor, - unselectedBackgroundColor = unselectedBackgroundColor, + modifier = Modifier.fillMaxWidth(), + categoryColors = categoryColors, onCategoryClick = onCategoryClick, - modifier = Modifier - .fillMaxWidth(), ) } } @Composable -@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) private fun PocketCategoriesViewHolderPreview() { - FirefoxTheme(theme = Theme.getTheme()) { + FirefoxTheme { PocketTopics( categories = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" .split(" ") diff --git a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt index 1bf47f832..71485231a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt +++ b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt @@ -419,12 +419,9 @@ private fun Rect.getIntersectPercentage(realSize: IntSize, other: Rect): Float { * * @param categories The categories needed to be displayed. * @param selections List of categories currently selected. - * @param selectedTextColor Text [Color] when the category is selected. - * @param unselectedTextColor Text [Color] when the category is not selected. - * @param selectedBackgroundColor Background [Color] when the category is selected. - * @param unselectedBackgroundColor Background [Color] when the category is not selected. - * @param onCategoryClick Callback for when the user taps a category. * @param modifier [Modifier] to be applied to the layout. + * @param categoryColors The color set defined by [PocketStoriesCategoryColors] used to style Pocket categories. + * @param onCategoryClick Callback for when the user taps a category. */ @OptIn(ExperimentalComposeUiApi::class) @Suppress("LongParameterList") @@ -432,12 +429,9 @@ private fun Rect.getIntersectPercentage(realSize: IntSize, other: Rect): Float { fun PocketStoriesCategories( categories: List, selections: List, - selectedTextColor: Color? = null, - unselectedTextColor: Color? = null, - selectedBackgroundColor: Color? = null, - unselectedBackgroundColor: Color? = null, - onCategoryClick: (PocketRecommendedStoriesCategory) -> Unit, modifier: Modifier = Modifier, + categoryColors: PocketStoriesCategoryColors = PocketStoriesCategoryColors.buildColors(), + onCategoryClick: (PocketRecommendedStoriesCategory) -> Unit, ) { Box( modifier = modifier.semantics { @@ -453,10 +447,10 @@ fun PocketStoriesCategories( SelectableChip( text = category.name, isSelected = selections.map { it.name }.contains(category.name), - selectedTextColor = selectedTextColor, - unselectedTextColor = unselectedTextColor, - selectedBackgroundColor = selectedBackgroundColor, - unselectedBackgroundColor = unselectedBackgroundColor, + selectedTextColor = categoryColors.selectedTextColor, + unselectedTextColor = categoryColors.unselectedTextColor, + selectedBackgroundColor = categoryColors.selectedBackgroundColor, + unselectedBackgroundColor = categoryColors.unselectedBackgroundColor, ) { onCategoryClick(category) } @@ -465,6 +459,40 @@ fun PocketStoriesCategories( } } +/** + * Wrapper for the color parameters of [PocketStoriesCategories]. + * + * @param selectedTextColor Text [Color] when the category is selected. + * @param unselectedTextColor Text [Color] when the category is not selected. + * @param selectedBackgroundColor Background [Color] when the category is selected. + * @param unselectedBackgroundColor Background [Color] when the category is not selected. + */ +data class PocketStoriesCategoryColors( + val selectedBackgroundColor: Color, + val unselectedBackgroundColor: Color, + val selectedTextColor: Color, + val unselectedTextColor: Color, +) { + companion object { + + /** + * Builder function used to construct an instance of [PocketStoriesCategoryColors]. + */ + @Composable + fun buildColors( + selectedBackgroundColor: Color = FirefoxTheme.colors.textActionPrimary, + unselectedBackgroundColor: Color = FirefoxTheme.colors.textActionTertiary, + selectedTextColor: Color = FirefoxTheme.colors.actionPrimary, + unselectedTextColor: Color = FirefoxTheme.colors.actionTertiary, + ) = PocketStoriesCategoryColors( + selectedTextColor = selectedTextColor, + unselectedTextColor = unselectedTextColor, + selectedBackgroundColor = selectedBackgroundColor, + unselectedBackgroundColor = unselectedBackgroundColor, + ) + } +} + /** * Pocket feature section title. * Shows a default text about Pocket and offers a external link to learn more.