commit 4cabe2b4eae7112c866734861117136fe7ca2742 parent 844d36b47db1a5c2ead2b8842545e5f5e88a9cb3 Author: John Oberhauser <j.git-global@obez.io> Date: Fri, 9 Jan 2026 19:33:49 +0000 Bug 2009058 - Part 3: Refactoring compose previews to use @PreviewParameter for private mode themed previews r=android-reviewers,007 Differential Revision: https://phabricator.services.mozilla.com/D278388 Diffstat:
10 files changed, 76 insertions(+), 178 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/home/HomeSectionHeader.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/home/HomeSectionHeader.kt @@ -27,13 +27,14 @@ import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewParameter import mozilla.components.compose.base.utils.inComposePreview import mozilla.components.lib.state.ext.observeAsComposableState import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider import org.mozilla.fenix.wallpapers.Wallpaper import mozilla.components.ui.icons.R as iconsR @@ -151,25 +152,12 @@ private fun HomeSectionHeaderContent( } } -@Composable -@PreviewLightDark -private fun HomeSectionsHeaderPreview() { - FirefoxTheme { - Surface { - HomeSectionHeader( - headerText = stringResource(R.string.home_bookmarks_title), - modifier = Modifier.padding(horizontal = FirefoxTheme.layout.size.static300), - description = stringResource(R.string.home_bookmarks_show_all_content_description), - onButtonClick = {}, - ) - } - } -} - -@Composable @Preview -private fun HomeSectionsHeaderPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@Composable +private fun HomeSectionsHeaderPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { Surface { HomeSectionHeader( headerText = stringResource(R.string.home_bookmarks_title), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/settings/SettingsSectionHeader.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/settings/SettingsSectionHeader.kt @@ -12,9 +12,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewParameter import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider /** * Settings section header. @@ -32,20 +33,12 @@ fun SettingsSectionHeader(text: String, modifier: Modifier = Modifier) { ) } -@Composable -@PreviewLightDark -private fun SettingsSectionHeaderPreview() { - FirefoxTheme { - Surface { - SettingsSectionHeader("Settings") - } - } -} - -@Composable @Preview -private fun SettingsSectionHeaderPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@Composable +private fun SettingsSectionHeaderPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { Surface { SettingsSectionHeader("Settings") } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesTools.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import mozilla.components.compose.base.button.FilledButton @@ -37,6 +37,7 @@ import org.mozilla.fenix.compose.list.RadioButtonListItem import org.mozilla.fenix.compose.list.TextListItem import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider import mozilla.components.ui.icons.R as iconsR /** @@ -230,21 +231,12 @@ private fun List<DebugRegionEnabledState>.updateRegionEnabled(regionToUpdate: De } } -@Composable -@PreviewLightDark -private fun AddressesScreenPreview() { - FirefoxTheme { - AddressesTools( - debugRegionRepository = FakeAddressesDebugRegionRepository(), - creditCardsAddressesStorage = FakeCreditCardsAddressesStorage(), - ) - } -} - -@Composable @Preview -private fun AddressesScreenPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@Composable +private fun AddressesScreenPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { AddressesTools( debugRegionRepository = FakeAddressesDebugRegionRepository(), creditCardsAddressesStorage = FakeCreditCardsAddressesStorage(), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/cfrs/CfrTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/cfrs/CfrTools.kt @@ -20,8 +20,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import mozilla.components.compose.base.annotation.FlexibleWindowLightDarkPreview +import androidx.compose.ui.tooling.preview.PreviewParameter +import mozilla.components.compose.base.annotation.FlexibleWindowPreview import mozilla.components.compose.base.button.OutlinedButton import mozilla.components.lib.state.ext.observeAsState import org.mozilla.fenix.R @@ -29,6 +29,7 @@ import org.mozilla.fenix.compose.SwitchWithLabel import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider /** * CFR Tools UI that allows for the CFR states to be reset. @@ -219,19 +220,11 @@ private fun CfrSectionTitle( } @Composable -@FlexibleWindowLightDarkPreview -private fun CfrToolsPreview() { - FirefoxTheme { - CfrTools( - cfrToolsStore = CfrToolsStore(), - ) - } -} - -@Composable -@Preview -private fun CfrToolsPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@FlexibleWindowPreview +private fun CfrToolsPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { CfrTools( cfrToolsStore = CfrToolsStore(), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/crashtools/CrashTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/crashtools/CrashTools.kt @@ -24,16 +24,17 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import kotlinx.coroutines.delay -import mozilla.components.compose.base.annotation.FlexibleWindowLightDarkPreview +import mozilla.components.compose.base.annotation.FlexibleWindowPreview import mozilla.components.compose.base.button.FilledButton import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.startupCrash.StartupCrashActivity import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider import org.mozilla.fenix.utils.Settings private const val SECOND_IN_MILLISECOND = 1000L @@ -111,18 +112,12 @@ internal fun convertMillisToDHMS(milliseconds: Long): String { return DateUtils.formatElapsedTime(milliseconds / SECOND_IN_MILLISECOND) } -@FlexibleWindowLightDarkPreview +@FlexibleWindowPreview @Composable -private fun CrashToolsPreview() { - FirefoxTheme { - CrashTools(Settings(LocalContext.current)) - } -} - -@Preview -@Composable -private fun CrashToolsPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +private fun CrashToolsPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { CrashTools(Settings(LocalContext.current)) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/creditcards/CreditCardsTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/creditcards/CreditCardsTools.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import mozilla.components.compose.base.button.FilledButton @@ -33,6 +33,7 @@ import org.mozilla.fenix.compose.list.TextListItem import org.mozilla.fenix.debugsettings.addresses.FakeCreditCardsAddressesStorage import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider import mozilla.components.ui.icons.R as iconsR /** @@ -123,20 +124,12 @@ private fun CreditCardsContent( } } -@Composable -@PreviewLightDark -private fun CreditCardsScreenPreview() { - FirefoxTheme { - CreditCardsTools( - creditCardsAddressesStorage = FakeCreditCardsAddressesStorage(), - ) - } -} - -@Composable @Preview -private fun CreditCardsScreenPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@Composable +private fun CreditCardsScreenPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { CreditCardsTools( creditCardsAddressesStorage = FakeCreditCardsAddressesStorage(), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/gleandebugtools/ui/GleanDebugToolsScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/gleandebugtools/ui/GleanDebugToolsScreen.kt @@ -23,9 +23,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import mozilla.components.compose.base.Dropdown -import mozilla.components.compose.base.annotation.FlexibleWindowLightDarkPreview +import mozilla.components.compose.base.annotation.FlexibleWindowPreview import mozilla.components.compose.base.button.FilledButton import mozilla.components.compose.base.menu.MenuItem import mozilla.components.compose.base.text.Text @@ -39,6 +39,7 @@ import org.mozilla.fenix.debugsettings.gleandebugtools.GleanDebugToolsState import org.mozilla.fenix.debugsettings.gleandebugtools.GleanDebugToolsStore import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider /** * Glean Debug Tools UI that allows for glean test pings to be sent. @@ -274,30 +275,11 @@ private fun getPingDropdownMenu( } @Composable -@FlexibleWindowLightDarkPreview -private fun GleanDebugToolsPreview() { - FirefoxTheme { - GleanDebugToolsScreen( - gleanDebugToolsStore = GleanDebugToolsStore( - initialState = GleanDebugToolsState( - logPingsToConsoleEnabled = false, - debugViewTag = "", - pingTypes = listOf( - "metrics", - "baseline", - "ping type 3", - "ping type 4", - ), - ), - ), - ) - } -} - -@Composable -@Preview -private fun GleanDebugToolsPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@FlexibleWindowPreview +private fun GleanDebugToolsPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { GleanDebugToolsScreen( gleanDebugToolsStore = GleanDebugToolsStore( initialState = GleanDebugToolsState( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/logins/LoginsTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/logins/LoginsTools.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import mozilla.components.browser.state.selector.findTab @@ -43,6 +43,7 @@ import org.mozilla.fenix.compose.list.TextListItem import org.mozilla.fenix.debugsettings.ui.DebugDrawer import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider import java.util.UUID import mozilla.components.ui.icons.R as iconsR @@ -185,27 +186,12 @@ internal class FakeLoginsStorage : LoginsStorage { ) } -@Composable -@PreviewLightDark -private fun LoginsScreenPreview() { - FirefoxTheme { - val selectedTab = createTab("https://example.com") - LoginsTools( - browserStore = BrowserStore( - BrowserState( - selectedTabId = selectedTab.id, - tabs = listOf(selectedTab), - ), - ), - loginsStorage = FakeLoginsStorage(), - ) - } -} - -@Composable @Preview -private fun LoginsScreenPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@Composable +private fun LoginsScreenPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { val selectedTab = createTab("https://example.com") LoginsTools( browserStore = BrowserStore( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/region/RegionTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/region/RegionTools.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.core.content.edit import androidx.lifecycle.ViewModel @@ -37,6 +37,7 @@ import org.mozilla.fenix.Config import org.mozilla.fenix.R import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider private const val DEFAULT_REGION = "XX" private const val MAX_REGION_LENGTH = 2 @@ -182,20 +183,12 @@ class RegionToolsViewModel : ViewModel() { var currentRegion by mutableStateOf("") } -@Composable -@PreviewLightDark -private fun RegionScreenPreview() { - FirefoxTheme { - RegionTools( - browserStore = BrowserStore(), - ) - } -} - -@Composable @Preview -private fun RegionScreenPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { +@Composable +private fun RegionScreenPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, +) { + FirefoxTheme(theme) { RegionTools( browserStore = BrowserStore(), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/tabs/TabTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/tabs/TabTools.kt @@ -32,9 +32,7 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import androidx.core.text.isDigitsOnly import mozilla.components.browser.state.action.TabListAction @@ -50,6 +48,7 @@ import org.mozilla.fenix.ext.maxActiveTime import org.mozilla.fenix.tabstray.ext.isNormalTabInactive import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.theme.ThemeProvider @VisibleForTesting internal const val MAX_TABS_GENERATED = 1000 @@ -314,44 +313,28 @@ internal fun validateTextField(text: String): Int? { } } -private data class TabToolsPreviewModel( - val inactiveTabsEnabled: Boolean = true, -) - -private class TabToolsPreviewParameterProvider : PreviewParameterProvider<TabToolsPreviewModel> { - override val values: Sequence<TabToolsPreviewModel> - get() = sequenceOf( - TabToolsPreviewModel( - inactiveTabsEnabled = true, - ), - TabToolsPreviewModel( - inactiveTabsEnabled = false, - ), - ) -} - +@Preview @Composable -@PreviewLightDark private fun TabToolsPreview( - @PreviewParameter(TabToolsPreviewParameterProvider::class) model: TabToolsPreviewModel, + @PreviewParameter(ThemeProvider::class) theme: Theme, ) { - FirefoxTheme { + FirefoxTheme(theme) { TabTools( store = BrowserStore(), - inactiveTabsEnabled = model.inactiveTabsEnabled, + inactiveTabsEnabled = true, ) } } -@Composable @Preview -private fun TabToolsPrivatePreview( - @PreviewParameter(TabToolsPreviewParameterProvider::class) model: TabToolsPreviewModel, +@Composable +private fun TabToolsInactiveTabsDisabledPreview( + @PreviewParameter(ThemeProvider::class) theme: Theme, ) { - FirefoxTheme(theme = Theme.Private) { + FirefoxTheme(theme) { TabTools( store = BrowserStore(), - inactiveTabsEnabled = model.inactiveTabsEnabled, + inactiveTabsEnabled = false, ) } }