commit dbd45c0668a3a0b0031f5a42919cea1cc3af970d parent 2b1b1eb72e518af44e42933cf0dabd3b73b6bdf2 Author: rmalicdem <rmalicdem@mozilla.com> Date: Wed, 29 Oct 2025 19:18:47 +0000 Bug 1969075 - Add 'Back' to simple shortcut toolbar customization r=android-reviewers,android-l10n-reviewers,delphine,Roger Differential Revision: https://phabricator.services.mozilla.com/D270006 Diffstat:
4 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt @@ -1035,6 +1035,7 @@ class BrowserToolbarMiddleware( it.selectedTab?.content?.canGoForward, ) }.collect { + updateEndBrowserActions(context) updateStartBrowserActions(context) } } @@ -1301,6 +1302,7 @@ class BrowserToolbarMiddleware( } ToolbarShortcutPreference.Keys.TRANSLATE -> ToolbarAction.Translate ToolbarShortcutPreference.Keys.HOMEPAGE -> ToolbarAction.Homepage + ToolbarShortcutPreference.Keys.BACK -> ToolbarAction.Back else -> ToolbarAction.NewTab } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/ToolbarShortcutPreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/ToolbarShortcutPreference.kt @@ -64,6 +64,11 @@ class ToolbarShortcutPreference @JvmOverloads constructor( iconsR.drawable.mozac_ic_home_24, R.string.toolbar_customize_shortcut_homepage, ), + Option( + Keys.BACK, + iconsR.drawable.mozac_ic_back_24, + R.string.toolbar_customize_shortcut_back, + ), ) } @@ -197,5 +202,6 @@ class ToolbarShortcutPreference @JvmOverloads constructor( const val BOOKMARK = "bookmark" const val TRANSLATE = "translate" const val HOMEPAGE = "homepage" + const val BACK = "back" } } diff --git a/mobile/android/fenix/app/src/main/res/values/strings.xml b/mobile/android/fenix/app/src/main/res/values/strings.xml @@ -1150,6 +1150,8 @@ <string name="toolbar_customize_shortcut_translate">Translate</string> <!-- Homepage shortcut in toolbar customization --> <string name="toolbar_customize_shortcut_homepage">Homepage</string> + <!-- Back shortcut in toolbar customization --> + <string name="toolbar_customize_shortcut_back">Back</string> <!-- App icon Preferences --> <!-- Title for the preference that lets the user pick a new app icon --> diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt @@ -1715,7 +1715,7 @@ class BrowserToolbarMiddlewareTest { val toolbarStore = buildStore(middleware) val displayGoBackButton = toolbarStore.state.displayState.browserActionsStart[0] - assertEquals(displayGoBackButton, expectedGoBackButton.copy(state = ActionButton.State.DISABLED)) + assertEquals(displayGoBackButton, expectedGoBackButton(isActive = false)) val displayGoForwardButton = toolbarStore.state.displayState.browserActionsStart[1] assertEquals(displayGoForwardButton, expectedGoForwardButton.copy(state = ActionButton.State.DISABLED)) } @@ -2923,6 +2923,41 @@ class BrowserToolbarMiddlewareTest { } @Test + fun `GIVEN simple toolbar use back shortcut AND current page has no history WHEN initializing toolbar THEN show DISABLED Back in end browser actions`() = runTest { + every { settings.shouldShowToolbarCustomization } returns true + every { settings.toolbarShortcutKey } returns ToolbarShortcutPreference.Keys.BACK + + val toolbarStore = buildStore() + + val backButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes + assertEquals(expectedGoBackButton(isActive = false), backButton) + } + + @Test + fun `GIVEN simple toolbar use back shortcut AND current page has history WHEN initializing toolbar THEN show ACTIVE Back in end browser actions`() = runTest { + every { settings.shouldShowToolbarCustomization } returns true + every { settings.toolbarShortcutKey } returns ToolbarShortcutPreference.Keys.BACK + + val tab = createTab(url = "https://example.com").let { + it.copy(content = it.content.copy(canGoBack = true)) + } + val browserStore = BrowserStore( + BrowserState( + tabs = listOf(tab), + selectedTabId = tab.id, + ), + ) + val middleware = buildMiddleware( + browserStore = browserStore, + ) + val toolbarStore = buildStore(middleware) + mainLooperRule.idle() + + val backButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes + assertEquals(expectedGoBackButton(), backButton) + } + + @Test fun `mapShortcutToAction maps keys to actions and falls back to NewTab`() { assertEquals( ToolbarAction.NewTab, @@ -2952,6 +2987,10 @@ class BrowserToolbarMiddlewareTest { BrowserToolbarMiddleware.mapShortcutToAction(ToolbarShortcutPreference.Keys.HOMEPAGE), ) assertEquals( + ToolbarAction.Back, + BrowserToolbarMiddleware.mapShortcutToAction(ToolbarShortcutPreference.Keys.BACK), + ) + assertEquals( ToolbarAction.NewTab, BrowserToolbarMiddleware.mapShortcutToAction("does_not_exist"), ) @@ -3028,10 +3067,13 @@ class BrowserToolbarMiddlewareTest { onLongClick = NavigateForwardLongClicked, ) - private val expectedGoBackButton = ActionButtonRes( + private fun expectedGoBackButton(isActive: Boolean = true) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_back_24, contentDescription = R.string.browser_menu_back, - state = ActionButton.State.ACTIVE, + state = when (isActive) { + true -> ActionButton.State.DEFAULT + false -> ActionButton.State.DISABLED + }, onClick = NavigateBackClicked, onLongClick = NavigateBackLongClicked, )