diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index ef9c7a2e1f..9e1b4b0ab6 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -102,8 +102,7 @@ import org.mozilla.fenix.components.metrics.GrowthDataWorker import org.mozilla.fenix.components.metrics.fonts.FontEnumerationWorker import org.mozilla.fenix.databinding.ActivityHomeBinding import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository -import org.mozilla.fenix.debugsettings.store.DebugDrawerStore -import org.mozilla.fenix.debugsettings.ui.DebugOverlay +import org.mozilla.fenix.debugsettings.ui.FenixOverlay import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections import org.mozilla.fenix.experiments.ResearchSurfaceDialogFragment import org.mozilla.fenix.ext.alreadyOnDestination @@ -162,8 +161,6 @@ import org.mozilla.fenix.tabhistory.TabHistoryDialogFragment import org.mozilla.fenix.tabstray.TabsTrayFragment import org.mozilla.fenix.tabstray.TabsTrayFragmentDirections import org.mozilla.fenix.theme.DefaultThemeManager -import org.mozilla.fenix.theme.FirefoxTheme -import org.mozilla.fenix.theme.Theme import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.trackingprotection.TrackingProtectionPanelDialogFragmentDirections import org.mozilla.fenix.translations.TranslationsDialogFragmentDirections @@ -301,11 +298,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { visibility = View.VISIBLE setContent { - FirefoxTheme(theme = Theme.getTheme(allowPrivateTheme = false)) { - DebugOverlay( - debugDrawerStore = DebugDrawerStore(), - ) - } + FenixOverlay() } } else { setContent {} diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerState.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerState.kt index 51ea807572..496ea240cb 100644 --- a/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerState.kt +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerState.kt @@ -13,20 +13,4 @@ import mozilla.components.lib.state.State */ data class DebugDrawerState( val drawerStatus: DrawerStatus = DrawerStatus.Closed, -) : State { - - /** - * Possible values of [DebugDrawerState.drawerStatus]. - */ - enum class DrawerStatus { - /** - * The state of the drawer when it is closed. - */ - Closed, - - /** - * The state of the drawer when it is open. - */ - Open, - } -} +) : State diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerStore.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerStore.kt index f8a110a4c2..b52352a558 100644 --- a/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerStore.kt +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/store/DebugDrawerStore.kt @@ -22,7 +22,7 @@ class DebugDrawerStore( private fun reduce(state: DebugDrawerState, action: DebugDrawerAction): DebugDrawerState { return when (action) { - is DebugDrawerAction.DrawerOpened -> state.copy(drawerStatus = DebugDrawerState.DrawerStatus.Open) - is DebugDrawerAction.DrawerClosed -> state.copy(drawerStatus = DebugDrawerState.DrawerStatus.Closed) + is DebugDrawerAction.DrawerOpened -> state.copy(drawerStatus = DrawerStatus.Open) + is DebugDrawerAction.DrawerClosed -> state.copy(drawerStatus = DrawerStatus.Closed) } } diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/store/DrawerStatus.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/store/DrawerStatus.kt new file mode 100644 index 0000000000..71513f877d --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/store/DrawerStatus.kt @@ -0,0 +1,20 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.debugsettings.store + +/** + * Possible values of the debug drawer's physical state. + */ +enum class DrawerStatus { + /** + * The state of the drawer when it is closed. + */ + Closed, + + /** + * The state of the drawer when it is open. + */ + Open, +} diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt index bda44d62a8..779c0db676 100644 --- a/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt @@ -17,7 +17,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -27,29 +29,25 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter -import mozilla.components.lib.state.ext.observeAsState import org.mozilla.fenix.R import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.compose.button.FloatingActionButton -import org.mozilla.fenix.debugsettings.store.DebugDrawerAction -import org.mozilla.fenix.debugsettings.store.DebugDrawerState -import org.mozilla.fenix.debugsettings.store.DebugDrawerState.DrawerStatus -import org.mozilla.fenix.debugsettings.store.DebugDrawerStore +import org.mozilla.fenix.debugsettings.store.DrawerStatus import org.mozilla.fenix.theme.FirefoxTheme /** - * Overlay for presenting Fenix-wide debugging content. + * Overlay for presenting app-wide debugging content. * - * @param debugDrawerStore [DebugDrawerStore] used to listen for changes to [DebugDrawerState] and - * dispatch any [DebugDrawerAction]s. + * @param drawerStatus The [DrawerStatus] indicating the physical state of the drawer. + * @param onDrawerOpen Invoked when the drawer is opened. + * @param onDrawerClose Invoked when the drawer is closed. */ @Composable fun DebugOverlay( - debugDrawerStore: DebugDrawerStore, + drawerStatus: DrawerStatus, + onDrawerOpen: () -> Unit, + onDrawerClose: () -> Unit, ) { - val drawerStatus by debugDrawerStore.observeAsState(initialValue = DrawerStatus.Closed) { state -> - state.drawerStatus - } val snackbarState = remember { SnackbarHostState() } val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) @@ -64,7 +62,7 @@ fun DebugOverlay( .distinctUntilChanged() .filter { it == DrawerValue.Closed } .collect { - debugDrawerStore.dispatch(DebugDrawerAction.DrawerClosed) + onDrawerClose() } } @@ -77,7 +75,7 @@ fun DebugOverlay( .align(Alignment.CenterStart) .padding(start = 16.dp), onClick = { - debugDrawerStore.dispatch(DebugDrawerAction.DrawerOpened) + onDrawerOpen() }, ) @@ -123,9 +121,17 @@ fun DebugOverlay( @Composable @LightDarkPreview private fun DebugOverlayPreview() { + var drawerStatus by remember { mutableStateOf(DrawerStatus.Closed) } + FirefoxTheme { DebugOverlay( - debugDrawerStore = DebugDrawerStore(), + drawerStatus = drawerStatus, + onDrawerOpen = { + drawerStatus = DrawerStatus.Open + }, + onDrawerClose = { + drawerStatus = DrawerStatus.Closed + }, ) } } diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/ui/FenixOverlay.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/ui/FenixOverlay.kt new file mode 100644 index 0000000000..2a41783674 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/ui/FenixOverlay.kt @@ -0,0 +1,45 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.debugsettings.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import mozilla.components.lib.state.ext.observeAsState +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.debugsettings.store.DebugDrawerAction +import org.mozilla.fenix.debugsettings.store.DebugDrawerStore +import org.mozilla.fenix.debugsettings.store.DrawerStatus +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme + +/** + * Overlay for presenting Fenix-wide debugging content. + */ +@Composable +fun FenixOverlay() { + val debugDrawerStore = remember { DebugDrawerStore() } + val drawerStatus by debugDrawerStore.observeAsState(initialValue = DrawerStatus.Closed) { state -> + state.drawerStatus + } + + FirefoxTheme(theme = Theme.getTheme(allowPrivateTheme = false)) { + DebugOverlay( + drawerStatus = drawerStatus, + onDrawerOpen = { + debugDrawerStore.dispatch(DebugDrawerAction.DrawerOpened) + }, + onDrawerClose = { + debugDrawerStore.dispatch(DebugDrawerAction.DrawerClosed) + }, + ) + } +} + +@LightDarkPreview +@Composable +private fun FenixOverlayPreview() { + FenixOverlay() +} diff --git a/app/src/test/java/org/mozilla/fenix/debugsettings/DebugDrawerStoreTest.kt b/app/src/test/java/org/mozilla/fenix/debugsettings/DebugDrawerStoreTest.kt index 8269f852c3..5779c32506 100644 --- a/app/src/test/java/org/mozilla/fenix/debugsettings/DebugDrawerStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/debugsettings/DebugDrawerStoreTest.kt @@ -6,12 +6,13 @@ import org.junit.Test import org.mozilla.fenix.debugsettings.store.DebugDrawerAction import org.mozilla.fenix.debugsettings.store.DebugDrawerState import org.mozilla.fenix.debugsettings.store.DebugDrawerStore +import org.mozilla.fenix.debugsettings.store.DrawerStatus class DebugDrawerStoreTest { @Test fun `GIVEN the drawer is closed WHEN the drawer is opened THEN the state should be set to open`() { - val expected = DebugDrawerState.DrawerStatus.Open + val expected = DrawerStatus.Open val store = createStore() store.dispatch(DebugDrawerAction.DrawerOpened).joinBlocking() @@ -21,9 +22,9 @@ class DebugDrawerStoreTest { @Test fun `GIVEN the drawer is opened WHEN the drawer is closed THEN the state should be set to closed`() { - val expected = DebugDrawerState.DrawerStatus.Closed + val expected = DrawerStatus.Closed val store = createStore( - drawerStatus = DebugDrawerState.DrawerStatus.Open, + drawerStatus = DrawerStatus.Open, ) store.dispatch(DebugDrawerAction.DrawerClosed).joinBlocking() @@ -32,7 +33,7 @@ class DebugDrawerStoreTest { } private fun createStore( - drawerStatus: DebugDrawerState.DrawerStatus = DebugDrawerState.DrawerStatus.Closed, + drawerStatus: DrawerStatus = DrawerStatus.Closed, ) = DebugDrawerStore( initialState = DebugDrawerState( drawerStatus = drawerStatus,