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:
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
+ }
}