tor-browser

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

commit 1cc4545320281a3dda95b6cbe1f08419e7105585
parent 4437a28d5de4b46d1625a59948c6b0d01143500c
Author: Andrey Zinovyev <azinovyev@mozilla.com>
Date:   Mon, 15 Dec 2025 14:22:09 +0000

Bug 2002632 - Remove (activity as HomeActivity) casts in TabManagementFragment r=android-reviewers,pollymce

# Conflicts:
#	mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ui/TabManagementFragment.kt

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

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/controller/TabManagerController.kt | 15++++++++-------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ui/TabManagementFragment.kt | 4++--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/controller/DefaultTabManagerControllerTest.kt | 55+++++++++++++++++++++++++++++++++++++++++++++----------
3 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/controller/TabManagerController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/controller/TabManagerController.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.tabstray.controller +import android.content.Context import androidx.annotation.VisibleForTesting import androidx.navigation.NavController import kotlinx.coroutines.CoroutineScope @@ -30,11 +31,9 @@ import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.lib.state.DelicateAction import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.telemetry.glean.private.NoExtras -import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Collections import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.TabsTray -import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager @@ -46,6 +45,7 @@ import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.components.usecases.FenixBrowserUseCases import org.mozilla.fenix.ext.DEFAULT_ACTIVE_DAYS +import org.mozilla.fenix.ext.openToBrowser import org.mozilla.fenix.ext.potentialInactiveTabs import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_NORMAL_TABS import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_PRIVATE_TABS @@ -211,7 +211,7 @@ interface TabManagerController : SyncedTabsController, InactiveTabsController, T * Default implementation of [TabManagerController]. * * @param accountManager [FxaAccountManager] used to determine signed in status. - * @param activity [HomeActivity] used to perform top-level app actions. + * @param context [Context] used for showing dialogs. * @param appStore [AppStore] used to dispatch any [AppAction]. * @param tabsTrayStore [TabsTrayStore] used to read/update the [TabsTrayState]. * @param browserStore [BrowserStore] used to read/update the current [BrowserState]. @@ -237,7 +237,7 @@ interface TabManagerController : SyncedTabsController, InactiveTabsController, T @Suppress("TooManyFunctions", "LongParameterList") class DefaultTabManagerController( private val accountManager: FxaAccountManager, - private val activity: HomeActivity, + private val context: Context, private val appStore: AppStore, private val tabsTrayStore: TabsTrayStore, private val browserStore: BrowserStore, @@ -508,7 +508,7 @@ class DefaultTabManagerController( } }, onNegativeButtonClick = {}, - ).show(activity) + ).show(context) } override fun handleShareSelectedTabsClicked() { @@ -542,10 +542,11 @@ class DefaultTabManagerController( override fun handleSyncedTabClicked(tab: Tab) { Events.syncedTabOpened.record(NoExtras()) - activity.openToBrowserAndLoad( + navController.openToBrowser() + + fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = tab.active().url, newTab = true, - from = BrowserDirection.FromTabManager, ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ui/TabManagementFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ui/TabManagementFragment.kt @@ -184,7 +184,7 @@ class TabManagementFragment : DialogFragment() { tabManagerController = DefaultTabManagerController( accountManager = requireComponents.backgroundServices.accountManager, - activity = activity, + context = requireContext(), appStore = requireComponents.appStore, tabsTrayStore = tabsTrayStore, browserStore = requireComponents.core.store, @@ -289,7 +289,7 @@ class TabManagementFragment : DialogFragment() { requireContext().settings().shouldShowAutoCloseTabsBanner && requireContext().settings().canShowCfr, shouldShowLockPbmBanner = shouldShowLockPbmBanner( - isPrivateMode = (activity as HomeActivity).browsingModeManager.mode.isPrivate, + isPrivateMode = requireComponents.appStore.state.mode.isPrivate, hasPrivateTabs = requireComponents.core.store.state.privateTabs.isNotEmpty(), biometricAvailable = BiometricManager.from(requireContext()) .isHardwareAvailable(), diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/controller/DefaultTabManagerControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/controller/DefaultTabManagerControllerTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.tabstray.controller +import android.content.Context import androidx.navigation.NavController import androidx.navigation.NavDirections import androidx.navigation.NavOptions @@ -30,10 +31,13 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.storage.sync.Tab import mozilla.components.browser.storage.sync.TabEntry import mozilla.components.concept.base.profiler.Profiler +import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.concept.storage.BookmarksStorage import mozilla.components.feature.accounts.push.CloseTabsUseCases +import mozilla.components.feature.search.SearchUseCases +import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.support.test.middleware.CaptureActionsMiddleware @@ -52,11 +56,9 @@ import org.junit.Rule import org.junit.Test import org.junit.rules.RuleChain import org.junit.runner.RunWith -import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Collections import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.TabsTray -import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager @@ -64,7 +66,9 @@ import org.mozilla.fenix.browser.browsingmode.DefaultBrowsingModeManager import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint +import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.components.usecases.FenixBrowserUseCases +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.maxActiveTime import org.mozilla.fenix.helpers.FenixGleanTestRule import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_NORMAL_TABS @@ -102,11 +106,14 @@ class DefaultTabManagerControllerTest { private lateinit var fenixBrowserUseCases: FenixBrowserUseCases @MockK(relaxed = true) - private lateinit var activity: HomeActivity - - @MockK(relaxed = true) private lateinit var accountManager: FxaAccountManager + private lateinit var addNewTabUseCase: TabsUseCases.AddNewTabUseCase + private lateinit var loadUrlUseCase: SessionUseCases.DefaultLoadUrlUseCase + private lateinit var searchUseCases: SearchUseCases + private lateinit var homepageTitle: String + private lateinit var context: Context + private val appStore: AppStore = mockk(relaxed = true) private val settings: Settings = mockk(relaxed = true) @@ -133,6 +140,15 @@ class DefaultTabManagerControllerTest { @Before fun setup() { MockKAnnotations.init(this) + context = spyk(testContext) + addNewTabUseCase = mockk(relaxed = true) + loadUrlUseCase = mockk(relaxed = true) + searchUseCases = mockk(relaxed = true) + homepageTitle = testContext.getString(R.string.tab_tray_homepage_tab) + profiler = mockk(relaxed = true) { + every { getProfilerTime() } returns PROFILER_START_TIME + every { isProfilerActive() } returns true + } } @Test @@ -621,15 +637,30 @@ class DefaultTabManagerControllerTest { every { tab.active() }.answers { entry } every { entry.url }.answers { "https://mozilla.org" } + val appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + fenixBrowserUseCases = FenixBrowserUseCases( + appStore = appStore, + addNewTabUseCase = addNewTabUseCase, + loadUrlUseCase = loadUrlUseCase, + searchUseCases = searchUseCases, + homepageTitle = homepageTitle, + profiler = profiler, + ) + every { testContext.components.useCases.fenixBrowserUseCases } returns fenixBrowserUseCases + createController().handleSyncedTabClicked(tab) assertNotNull(Events.syncedTabOpened.testGetValue()) + val url = "https://mozilla.org" + verify { - activity.openToBrowserAndLoad( - searchTermOrURL = "https://mozilla.org", - newTab = true, - from = BrowserDirection.FromTabManager, + addNewTabUseCase.invoke( + url = url, + flags = EngineSession.LoadUrlFlags.none(), + private = false, + historyMetadata = null, + originalInput = url, ) } } @@ -1523,7 +1554,7 @@ class DefaultTabManagerControllerTest { ): DefaultTabManagerController { return DefaultTabManagerController( accountManager = accountManager, - activity = activity, + context = context, appStore = appStore, tabsTrayStore = trayStore, browserStore = browserStore, @@ -1558,4 +1589,8 @@ class DefaultTabManagerControllerTest { lastModified = 0L, children = null, ) + + companion object { + private const val PROFILER_START_TIME = Double.MAX_VALUE + } }