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:
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,