tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 2b1b1eb72e518af44e42933cf0dabd3b73b6bdf2
parent c70298a84d848402dc075ea900ad0287ea58c990
Author: rmalicdem <rmalicdem@mozilla.com>
Date:   Wed, 29 Oct 2025 19:18:47 +0000

Bug 1969072 - Add 'Homepage' to simple shortcut toolbar customization r=android-reviewers,android-l10n-reviewers,delphine,Roger

Differential Revision: https://phabricator.services.mozilla.com/D270005

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt | 22++++++++++++++++++++++
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddleware.kt | 6++++++
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/ToolbarShortcutPreference.kt | 6++++++
Mmobile/android/fenix/app/src/main/res/values/strings.xml | 4++++
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 100 insertions(+), 0 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 @@ -104,6 +104,7 @@ import org.mozilla.fenix.components.menu.MenuAccessPoint import org.mozilla.fenix.components.metrics.MetricsUtils import org.mozilla.fenix.components.toolbar.DisplayActions.AddBookmarkClicked import org.mozilla.fenix.components.toolbar.DisplayActions.EditBookmarkClicked +import org.mozilla.fenix.components.toolbar.DisplayActions.HomepageClicked import org.mozilla.fenix.components.toolbar.DisplayActions.MenuClicked import org.mozilla.fenix.components.toolbar.DisplayActions.NavigateBackClicked import org.mozilla.fenix.components.toolbar.DisplayActions.NavigateBackLongClicked @@ -149,6 +150,7 @@ internal sealed class DisplayActions : BrowserToolbarEvent { data class EditBookmarkClicked(override val source: Source) : DisplayActions() data class ShareClicked(override val source: Source) : DisplayActions() data object TranslateClicked : DisplayActions() + data class HomepageClicked(override val source: Source) : DisplayActions() } @VisibleForTesting @@ -586,6 +588,18 @@ class BrowserToolbarMiddleware( next(action) } + is HomepageClicked -> runWithinEnvironment { + if (settings.enableHomepageAsNewTab) { + useCases.fenixBrowserUseCases.navigateToHomepage() + } else { + val directions = BrowserFragmentDirections.actionGlobalHome() + browserAnimator?.captureEngineViewAndDrawStatically { + navController.navigate(directions) + } ?: navController.navigate(directions) + } + next(action) + } + else -> next(action) } } @@ -1084,6 +1098,7 @@ class BrowserToolbarMiddleware( Bookmark, EditBookmark, Share, + Homepage, } private data class ToolbarActionConfig( @@ -1258,6 +1273,12 @@ class BrowserToolbarMiddleware( contentDescription = R.string.browser_menu_share, onClick = ShareClicked(source), ) + + ToolbarAction.Homepage -> ActionButtonRes( + drawableResId = iconsR.drawable.mozac_ic_home_24, + contentDescription = R.string.browser_menu_homepage, + onClick = HomepageClicked(source), + ) } private fun Source.toMetricSource() = when (this) { @@ -1279,6 +1300,7 @@ class BrowserToolbarMiddleware( false -> ToolbarAction.Bookmark } ToolbarShortcutPreference.Keys.TRANSLATE -> ToolbarAction.Translate + ToolbarShortcutPreference.Keys.HOMEPAGE -> ToolbarAction.Homepage else -> ToolbarAction.NewTab } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddleware.kt @@ -13,6 +13,7 @@ import mozilla.components.lib.state.MiddlewareContext import org.mozilla.fenix.GleanMetrics.Toolbar import org.mozilla.fenix.components.toolbar.DisplayActions.AddBookmarkClicked import org.mozilla.fenix.components.toolbar.DisplayActions.EditBookmarkClicked +import org.mozilla.fenix.components.toolbar.DisplayActions.HomepageClicked import org.mozilla.fenix.components.toolbar.DisplayActions.MenuClicked import org.mozilla.fenix.components.toolbar.DisplayActions.NavigateBackClicked import org.mozilla.fenix.components.toolbar.DisplayActions.NavigateBackLongClicked @@ -30,6 +31,7 @@ import org.mozilla.fenix.telemetry.ACTION_ADD_BOOKMARK_CLICKED import org.mozilla.fenix.telemetry.ACTION_ADD_NEW_PRIVATE_TAB import org.mozilla.fenix.telemetry.ACTION_ADD_NEW_TAB import org.mozilla.fenix.telemetry.ACTION_EDIT_BOOKMARK_CLICKED +import org.mozilla.fenix.telemetry.ACTION_HOME_CLICKED import org.mozilla.fenix.telemetry.ACTION_MENU_CLICKED import org.mozilla.fenix.telemetry.ACTION_NAVIGATE_BACK_CLICKED import org.mozilla.fenix.telemetry.ACTION_NAVIGATE_BACK_LONG_CLICKED @@ -100,6 +102,9 @@ class BrowserToolbarTelemetryMiddleware : Middleware<BrowserToolbarState, Browse is ReaderModeClicked -> { trackToolbarEvent(ToolbarActionRecord.ReaderModeClicked, action.source) } + is HomepageClicked -> { + trackToolbarEvent(ToolbarActionRecord.HomepageClicked, action.source) + } else -> {} } @@ -123,6 +128,7 @@ class BrowserToolbarTelemetryMiddleware : Middleware<BrowserToolbarState, Browse data object EditBookmarkClicked : ToolbarActionRecord(ACTION_EDIT_BOOKMARK_CLICKED) data object ShareClicked : ToolbarActionRecord(ACTION_SHARE_CLICKED) data object ReaderModeClicked : ToolbarActionRecord(ACTION_READER_MODE_CLICKED) + data object HomepageClicked : ToolbarActionRecord(ACTION_HOME_CLICKED) } private fun trackToolbarEvent( 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 @@ -59,6 +59,11 @@ class ToolbarShortcutPreference @JvmOverloads constructor( iconsR.drawable.mozac_ic_translate_24, R.string.toolbar_customize_shortcut_translate, ), + Option( + Keys.HOMEPAGE, + iconsR.drawable.mozac_ic_home_24, + R.string.toolbar_customize_shortcut_homepage, + ), ) } @@ -191,5 +196,6 @@ class ToolbarShortcutPreference @JvmOverloads constructor( const val SHARE = "share" const val BOOKMARK = "bookmark" const val TRANSLATE = "translate" + const val HOMEPAGE = "homepage" } } diff --git a/mobile/android/fenix/app/src/main/res/values/strings.xml b/mobile/android/fenix/app/src/main/res/values/strings.xml @@ -227,6 +227,8 @@ <string name="browser_menu_save_to_collection_2">Save to collection</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Share</string> + <!-- Browser menu button that goes to the homepage screen --> + <string name="browser_menu_homepage">Homepage</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix %1$s is the name of the app (for example "Firefox"). --> <string name="browser_menu_open_in_fenix">Open in %1$s</string> @@ -1146,6 +1148,8 @@ <string name="toolbar_customize_shortcut_add_bookmark">Add bookmark</string> <!-- Translate shortcut in toolbar customization. "Translate" is a verb --> <string name="toolbar_customize_shortcut_translate">Translate</string> + <!-- Homepage shortcut in toolbar customization --> + <string name="toolbar_customize_shortcut_homepage">Homepage</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 @@ -142,6 +142,7 @@ import org.mozilla.fenix.components.search.TABS_SEARCH_ENGINE_ID import org.mozilla.fenix.components.toolbar.BrowserToolbarMiddleware.ToolbarAction import org.mozilla.fenix.components.toolbar.DisplayActions.AddBookmarkClicked import org.mozilla.fenix.components.toolbar.DisplayActions.EditBookmarkClicked +import org.mozilla.fenix.components.toolbar.DisplayActions.HomepageClicked import org.mozilla.fenix.components.toolbar.DisplayActions.MenuClicked import org.mozilla.fenix.components.toolbar.DisplayActions.NavigateBackClicked import org.mozilla.fenix.components.toolbar.DisplayActions.NavigateBackLongClicked @@ -2794,6 +2795,46 @@ class BrowserToolbarMiddlewareTest { } @Test + fun `WHEN clicking the homepage button THEN navigate to application's home screen`() = runTest { + val browserAnimatorActionCaptor = slot<(Boolean) -> Unit>() + every { + browserAnimator.captureEngineViewAndDrawStatically( + any<Long>(), + capture(browserAnimatorActionCaptor), + ) + } answers { browserAnimatorActionCaptor.captured.invoke(true) } + every { settings.shouldShowToolbarCustomization } returns true + every { settings.toolbarShortcutKey } returns ToolbarShortcutPreference.Keys.HOMEPAGE + + val middleware = buildMiddleware() + val toolbarStore = buildStore( + middleware = middleware, + navController = navController, + ) + val homepageButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes + toolbarStore.dispatch(homepageButton.onClick as BrowserToolbarEvent) + + verify { navController.navigate(BrowserFragmentDirections.actionGlobalHome()) } + } + + @Test + fun `GIVEN homepage as new tab is enabled WHEN clicking the homepage button THEN navigate to homepage`() = runTest { + every { settings.enableHomepageAsNewTab } returns true + every { settings.shouldShowToolbarCustomization } returns true + every { settings.toolbarShortcutKey } returns ToolbarShortcutPreference.Keys.HOMEPAGE + + val middleware = buildMiddleware() + val toolbarStore = buildStore( + middleware = middleware, + navController = navController, + ) + val newTabButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes + toolbarStore.dispatch(newTabButton.onClick as BrowserToolbarEvent) + + verify { useCases.fenixBrowserUseCases.navigateToHomepage() } + } + + @Test fun `GIVEN simple toolbar use add bookmark shortcut AND the current page is not bookmarked WHEN initializing toolbar THEN show Bookmark in end browser actions`() = runTest { every { settings.shouldShowToolbarCustomization } returns true every { settings.toolbarShortcutKey } returns ToolbarShortcutPreference.Keys.BOOKMARK @@ -2871,6 +2912,17 @@ class BrowserToolbarMiddlewareTest { } @Test + fun `GIVEN simple toolbar use homepage shortcut WHEN initializing toolbar THEN show Homepage in end browser actions`() = runTest { + every { settings.shouldShowToolbarCustomization } returns true + every { settings.toolbarShortcutKey } returns ToolbarShortcutPreference.Keys.HOMEPAGE + + val toolbarStore = buildStore() + + val homepageButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes + assertEquals(expectedHomepageButton(), homepageButton) + } + + @Test fun `mapShortcutToAction maps keys to actions and falls back to NewTab`() { assertEquals( ToolbarAction.NewTab, @@ -2896,6 +2948,10 @@ class BrowserToolbarMiddlewareTest { BrowserToolbarMiddleware.mapShortcutToAction(ToolbarShortcutPreference.Keys.TRANSLATE), ) assertEquals( + ToolbarAction.Homepage, + BrowserToolbarMiddleware.mapShortcutToAction(ToolbarShortcutPreference.Keys.HOMEPAGE), + ) + assertEquals( ToolbarAction.NewTab, BrowserToolbarMiddleware.mapShortcutToAction("does_not_exist"), ) @@ -3077,6 +3133,12 @@ class BrowserToolbarMiddlewareTest { onClick = ShareClicked(source), ) + private fun expectedHomepageButton(source: Source = Source.AddressBar) = ActionButtonRes( + drawableResId = iconsR.drawable.mozac_ic_home_24, + contentDescription = R.string.browser_menu_homepage, + onClick = HomepageClicked(source), + ) + private fun buildMiddleware( appStore: AppStore = this.appStore, browserScreenStore: BrowserScreenStore = this.browserScreenStore,