tor-browser

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

commit 4ddb5c36783a0fd317a3fde8649d07d24bd21d02
parent fa568b5dac7cda3d781bdb479763b448b4067db7
Author: rmalicdem <rmalicdem@mozilla.com>
Date:   Tue, 18 Nov 2025 01:49:26 +0000

Bug 1996692 - Optimize bookmark check logic in toolbar customization r=android-reviewers,Roger

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

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt | 47+++++++++++++++++++----------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt | 62+++++++++++++++++++++-----------------------------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt | 54+++++++++++++-----------------------------------------
3 files changed, 53 insertions(+), 110 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt @@ -514,13 +514,6 @@ class TabPreview @JvmOverloads constructor( } private suspend fun buildComposableToolbarBrowserEndActions(tab: TabSessionState?): List<Action> { - val isBookmarked = tab?.content?.url?.let { url -> - context.components.core.bookmarksStorage - .getBookmarksWithUrl(url) - .getOrDefault(emptyList()) - .isNotEmpty() - } ?: false - val settings = context.settings() val isWideWindow = context.isWideWindow() val isTallWindow = context.isTallWindow() @@ -529,7 +522,7 @@ class TabPreview @JvmOverloads constructor( val useCustomPrimary = settings.shouldShowToolbarCustomization val primarySlotAction = ShortcutType.fromValue(settings.toolbarSimpleShortcutKey) - ?.toToolbarAction(isBookmarked).takeIf { useCustomPrimary } ?: ToolbarAction.NewTab + ?.toToolbarAction(tab).takeIf { useCustomPrimary } ?: ToolbarAction.NewTab return listOf( ToolbarActionConfig(primarySlotAction) { @@ -553,11 +546,6 @@ class TabPreview @JvmOverloads constructor( } private suspend fun buildNavigationActions(tab: TabSessionState): List<Action> { - val isBookmarked = context.components.core.bookmarksStorage - .getBookmarksWithUrl(tab.content.url) - .getOrDefault(listOf()) - .isNotEmpty() - val settings = context.settings() val isWideWindow = context.isWideWindow() val isTallWindow = context.isTallWindow() @@ -565,7 +553,7 @@ class TabPreview @JvmOverloads constructor( val useCustomPrimary = settings.shouldShowToolbarCustomization val primarySlotAction = ShortcutType.fromValue(settings.toolbarExpandedShortcutKey) - ?.toToolbarAction(isBookmarked).takeIf { useCustomPrimary } ?: getBookmarkAction(isBookmarked) + ?.toToolbarAction(tab).takeIf { useCustomPrimary } ?: getBookmarkAction(tab) return listOf( ToolbarActionConfig(primarySlotAction) { shouldUseExpandedToolbar && isTallWindow && !isWideWindow }, @@ -610,20 +598,23 @@ class TabPreview @JvmOverloads constructor( false -> old() } - companion object { - private fun getBookmarkAction(isBookmarked: Boolean): ToolbarAction = - when (isBookmarked) { - true -> ToolbarAction.EditBookmark - false -> ToolbarAction.Bookmark - } + private suspend fun getBookmarkAction(tab: TabSessionState?): ToolbarAction { + val isBookmarked = tab?.content?.url?.let { url -> + context.components.core.bookmarksStorage + .getBookmarksWithUrl(url) + .getOrDefault(emptyList()) + .isNotEmpty() + } ?: return ToolbarAction.Bookmark - private fun ShortcutType.toToolbarAction(isBookmarked: Boolean) = when (this) { - ShortcutType.NEW_TAB -> ToolbarAction.NewTab - ShortcutType.SHARE -> ToolbarAction.Share - ShortcutType.BOOKMARK -> getBookmarkAction(isBookmarked) - ShortcutType.TRANSLATE -> ToolbarAction.Translate - ShortcutType.HOMEPAGE -> ToolbarAction.Homepage - ShortcutType.BACK -> ToolbarAction.Back - } + return if (isBookmarked) ToolbarAction.EditBookmark else ToolbarAction.Bookmark + } + + private suspend fun ShortcutType.toToolbarAction(tab: TabSessionState?) = when (this) { + ShortcutType.NEW_TAB -> ToolbarAction.NewTab + ShortcutType.SHARE -> ToolbarAction.Share + ShortcutType.BOOKMARK -> getBookmarkAction(tab) + ShortcutType.TRANSLATE -> ToolbarAction.Translate + ShortcutType.HOMEPAGE -> ToolbarAction.Homepage + ShortcutType.BACK -> ToolbarAction.Back } } 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 @@ -687,18 +687,9 @@ class BrowserToolbarMiddleware( ) private suspend fun updateEndBrowserActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) { - val url = browserStore.state.selectedTab?.content?.url - val isBookmarked = if (url != null) { - withContext(ioDispatcher) { - bookmarksStorage.getBookmarksWithUrl(url).getOrDefault(listOf()).isNotEmpty() - } - } else { - false - } - context.dispatch( BrowserActionsEndUpdated( - buildEndBrowserActions(isBookmarked), + buildEndBrowserActions(), ), ) } @@ -770,14 +761,14 @@ class BrowserToolbarMiddleware( } } - private fun buildEndBrowserActions(isBookmarked: Boolean): List<Action> { + private suspend fun buildEndBrowserActions(): List<Action> { val isWideWindow = environment?.fragment?.isWideWindow() == true val isTallWindow = environment?.fragment?.isTallWindow() == true val tabStripEnabled = settings.isTabStripEnabled val shouldUseExpandedToolbar = settings.shouldUseExpandedToolbar val useCustomPrimary = settings.shouldShowToolbarCustomization val primarySlotAction = ShortcutType.fromValue(settings.toolbarSimpleShortcutKey) - ?.toToolbarAction(isBookmarked).takeIf { useCustomPrimary } ?: ToolbarAction.NewTab + ?.toToolbarAction().takeIf { useCustomPrimary } ?: ToolbarAction.NewTab val configs = listOf( ToolbarActionConfig(primarySlotAction) { @@ -811,14 +802,14 @@ class BrowserToolbarMiddleware( * - The navigation bar is hidden. (even If user enabled it) * - The toolbar redesign customization option is also hidden. */ - private fun buildNavigationActions(isBookmarked: Boolean): List<Action> { + private suspend fun buildNavigationActions(): List<Action> { val environment = environment ?: return emptyList() val isWideWindow = environment.fragment.isWideWindow() val isTallWindow = environment.fragment.isTallWindow() val shouldUseExpandedToolbar = settings.shouldUseExpandedToolbar val useCustomPrimary = settings.shouldShowToolbarCustomization val primarySlotAction = ShortcutType.fromValue(settings.toolbarExpandedShortcutKey) - ?.toToolbarAction(isBookmarked).takeIf { useCustomPrimary } ?: getBookmarkAction(isBookmarked) + ?.toToolbarAction().takeIf { useCustomPrimary } ?: getBookmarkAction() return listOf( ToolbarActionConfig(primarySlotAction) { shouldUseExpandedToolbar && isTallWindow && !isWideWindow }, @@ -834,18 +825,9 @@ class BrowserToolbarMiddleware( } private suspend fun updateNavigationActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) { - val url = browserStore.state.selectedTab?.content?.url - val isBookmarked = if (url != null) { - withContext(ioDispatcher) { - bookmarksStorage.getBookmarksWithUrl(url).getOrDefault(listOf()).isNotEmpty() - } - } else { - false - } - context.dispatch( NavigationActionsUpdated( - buildNavigationActions(isBookmarked), + buildNavigationActions(), ), ) } @@ -1316,23 +1298,21 @@ class BrowserToolbarMiddleware( Source.NavigationBar -> MetricsUtils.BookmarkAction.Source.BROWSER_NAVBAR } - companion object { - @VisibleForTesting - internal fun getBookmarkAction(isBookmarked: Boolean): ToolbarAction = - when (isBookmarked) { - true -> ToolbarAction.EditBookmark - false -> ToolbarAction.Bookmark - } - - @VisibleForTesting - @JvmStatic - internal fun ShortcutType.toToolbarAction(isBookmarked: Boolean = false) = when (this) { - ShortcutType.NEW_TAB -> ToolbarAction.NewTab - ShortcutType.SHARE -> ToolbarAction.Share - ShortcutType.BOOKMARK -> getBookmarkAction(isBookmarked) - ShortcutType.TRANSLATE -> ToolbarAction.Translate - ShortcutType.HOMEPAGE -> ToolbarAction.Homepage - ShortcutType.BACK -> ToolbarAction.Back + private suspend fun getBookmarkAction(): ToolbarAction { + val url = browserStore.state.selectedTab?.content?.url ?: return ToolbarAction.Bookmark + val isBookmarked = withContext(ioDispatcher) { + bookmarksStorage.getBookmarksWithUrl(url).getOrDefault(emptyList()).isNotEmpty() } + return if (isBookmarked) ToolbarAction.EditBookmark else ToolbarAction.Bookmark + } + + @VisibleForTesting + internal suspend fun ShortcutType.toToolbarAction() = when (this) { + ShortcutType.NEW_TAB -> ToolbarAction.NewTab + ShortcutType.SHARE -> ToolbarAction.Share + ShortcutType.BOOKMARK -> getBookmarkAction() + ShortcutType.TRANSLATE -> ToolbarAction.Translate + ShortcutType.HOMEPAGE -> ToolbarAction.Homepage + ShortcutType.BACK -> ToolbarAction.Back } } 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,7 +142,6 @@ import org.mozilla.fenix.components.menu.MenuAccessPoint import org.mozilla.fenix.components.search.BOOKMARKS_SEARCH_ENGINE_ID import org.mozilla.fenix.components.search.HISTORY_SEARCH_ENGINE_ID import org.mozilla.fenix.components.search.TABS_SEARCH_ENGINE_ID -import org.mozilla.fenix.components.toolbar.BrowserToolbarMiddleware.Companion.toToolbarAction import org.mozilla.fenix.components.toolbar.BrowserToolbarMiddleware.ToolbarAction import org.mozilla.fenix.components.toolbar.DisplayActions.AddBookmarkClicked import org.mozilla.fenix.components.toolbar.DisplayActions.EditBookmarkClicked @@ -3200,47 +3199,20 @@ class BrowserToolbarMiddlewareTest { } @Test - fun `toToolbarAction maps ShortcutType to ToolbarAction`() { - assertEquals( - ToolbarAction.NewTab, - ShortcutType.NEW_TAB.toToolbarAction(), - ) - assertEquals( - ToolbarAction.Share, - ShortcutType.SHARE.toToolbarAction(), - ) - assertEquals( - ToolbarAction.Bookmark, - ShortcutType.BOOKMARK.toToolbarAction(false), - ) - assertEquals( - ToolbarAction.EditBookmark, - ShortcutType.BOOKMARK.toToolbarAction(true), - ) - assertEquals( - ToolbarAction.Translate, - ShortcutType.TRANSLATE.toToolbarAction(), - ) - assertEquals( - ToolbarAction.Homepage, - ShortcutType.HOMEPAGE.toToolbarAction(), - ) - assertEquals( - ToolbarAction.Back, - ShortcutType.BACK.toToolbarAction(), - ) - } + fun `ShortcutType toToolbarAction maps shortcuts`() = runTest { + val middleware = buildMiddleware() - @Test - fun `getBookmarkAction returns correct action based on isBookmarked flag`() { - assertEquals( - ToolbarAction.Bookmark, - BrowserToolbarMiddleware.getBookmarkAction(isBookmarked = false), - ) - assertEquals( - ToolbarAction.EditBookmark, - BrowserToolbarMiddleware.getBookmarkAction(isBookmarked = true), - ) + val newTab = with(middleware) { ShortcutType.NEW_TAB.toToolbarAction() } + val share = with(middleware) { ShortcutType.SHARE.toToolbarAction() } + val translate = with(middleware) { ShortcutType.TRANSLATE.toToolbarAction() } + val homepage = with(middleware) { ShortcutType.HOMEPAGE.toToolbarAction() } + val back = with(middleware) { ShortcutType.BACK.toToolbarAction() } + + assertEquals(ToolbarAction.NewTab, newTab) + assertEquals(ToolbarAction.Share, share) + assertEquals(ToolbarAction.Translate, translate) + assertEquals(ToolbarAction.Homepage, homepage) + assertEquals(ToolbarAction.Back, back) } private fun assertEqualsTabCounterButton(expected: TabCounterAction, actual: TabCounterAction) {