tor-browser

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

commit 77e124873b10cd76550bafca9d4f5839295143d9
parent e8fb3ed027fd4c626f00e6ab152cad468b6ad39a
Author: Andrey Zinovyev <azinovyev@mozilla.com>
Date:   Fri, 21 Nov 2025 16:41:01 +0000

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

# Conflicts:
#	mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt

# Conflicts:
#	mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarkFragment.kt
#	mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt
#	mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComposable.kt

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

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarkFragment.kt | 2+-
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt | 2+-
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt | 72+++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt | 44+++++++++++++++++++++++---------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt | 16++++++++--------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComposable.kt | 2+-
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt | 50+++++++++++++++++++++++++++++---------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt | 4++--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt | 20++++++++++++++++----
9 files changed, 124 insertions(+), 88 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarkFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarkFragment.kt @@ -244,7 +244,7 @@ class BookmarkFragment : Fragment() { } else -> fragmentStore( createInitialSearchFragmentState( - activity = requireActivity() as HomeActivity, + context = requireContext(), components = requireComponents, tabId = null, pastedText = null, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -818,7 +818,7 @@ class HistoryFragment : LibraryPageFragment<History>(), UserInteractionHandler, toolbarStore: BrowserToolbarStore, ) = fragmentStore( createInitialSearchFragmentState( - activity = requireActivity() as HomeActivity, + context = requireContext(), components = requireComponents, tabId = null, pastedText = null, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.search +import android.content.Context import android.content.DialogInterface import android.content.Intent import android.net.Uri @@ -19,11 +20,10 @@ import mozilla.components.concept.engine.EngineSession.LoadUrlFlags import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.ktx.kotlin.isUrl import mozilla.components.ui.widgets.withCenterAlignedButtons -import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Toolbar -import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.metrics.MetricsUtils import org.mozilla.fenix.components.search.BOOKMARKS_SEARCH_ENGINE_ID import org.mozilla.fenix.components.search.HISTORY_SEARCH_ENGINE_ID @@ -63,7 +63,8 @@ interface SearchController { @Suppress("TooManyFunctions", "LongParameterList") class SearchDialogController( - private val activity: HomeActivity, + private val appStore: AppStore, + private val context: Context, private val store: BrowserStore, private val tabsUseCases: TabsUseCases, private val fenixBrowserUseCases: FenixBrowserUseCases, @@ -134,7 +135,7 @@ class SearchDialogController( searchTermOrURL = url, newTab = newTab, forceSearch = !isDefaultEngine, - private = activity.browsingModeManager.mode.isPrivate, + private = appStore.state.mode.isPrivate, searchEngine = searchEngine, ) @@ -150,7 +151,7 @@ class SearchDialogController( searchEngine, isDefaultEngine, searchAccessPoint, - activity.components.nimbus.events, + context.components.nimbus.events, ) } @@ -169,7 +170,7 @@ class SearchDialogController( fragmentStore.dispatch( SearchFragmentAction.AllowSearchSuggestionsInPrivateModePrompt( text.isNotEmpty() && - activity.browsingModeManager.mode.isPrivate && + appStore.state.mode.isPrivate && settings.shouldShowSearchSuggestions && !settings.shouldShowSearchSuggestionsInPrivate && !settings.showSearchSuggestionsInPrivateOnboardingFinished, @@ -180,14 +181,21 @@ class SearchDialogController( override fun handleUrlTapped(url: String, flags: LoadUrlFlags) { clearToolbarFocus?.invoke() - activity.openToBrowserAndLoad( + val newTab = if (settings.enableHomepageAsNewTab) { + false + } else { + fragmentStore.state.tabId == null + } + + navController.navigateSafe( + R.id.searchDialogFragment, + SearchDialogFragmentDirections.actionGlobalBrowser(), + ) + + fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = url, - newTab = if (settings.enableHomepageAsNewTab) { - false - } else { - fragmentStore.state.tabId == null - }, - from = BrowserDirection.FromSearchDialog, + newTab = newTab, + private = appStore.state.mode.isPrivate, flags = flags, ) @@ -201,17 +209,22 @@ class SearchDialogController( val searchEngine = fragmentStore.state.searchEngineSource.searchEngine - activity.openToBrowserAndLoad( - searchTermOrURL = searchTerms, - newTab = if (settings.enableHomepageAsNewTab) { + val newTab = if (settings.enableHomepageAsNewTab) { false } else { fragmentStore.state.tabId == null - }, - from = BrowserDirection.FromSearchDialog, - engine = searchEngine, + } + navController.navigateSafe( + R.id.searchDialogFragment, + SearchDialogFragmentDirections.actionGlobalBrowser(), + ) + fenixBrowserUseCases.loadUrlOrSearch( + searchTermOrURL = searchTerms, + newTab = newTab, + private = appStore.state.mode.isPrivate, + searchEngine = searchEngine, forceSearch = true, - ) + ) val searchAccessPoint = when (fragmentStore.state.searchAccessPoint) { MetricsUtils.Source.NONE -> MetricsUtils.Source.SUGGESTION @@ -223,7 +236,7 @@ class SearchDialogController( searchEngine, searchEngine == store.state.search.selectedOrDefaultSearchEngine, searchAccessPoint, - activity.components.nimbus.events, + context.components.nimbus.events, ) } @@ -248,7 +261,7 @@ class SearchDialogController( fragmentStore.dispatch( SearchFragmentAction.SearchDefaultEngineSelected( engine = searchEngine, - browsingMode = activity.browsingModeManager.mode, + browsingMode = appStore.state.mode, settings = settings, ), ) @@ -257,7 +270,7 @@ class SearchDialogController( fragmentStore.dispatch( SearchFragmentAction.SearchShortcutEngineSelected( engine = searchEngine, - browsingMode = activity.browsingModeManager.mode, + browsingMode = appStore.state.mode, settings = settings, ), ) @@ -285,8 +298,9 @@ class SearchDialogController( tabsUseCases.selectTab(tabId) - activity.openToBrowser( - from = BrowserDirection.FromSearchDialog, + navController.navigateSafe( + R.id.searchDialogFragment, + SearchDialogFragmentDirections.actionGlobalBrowser(), ) store.dispatch(AwesomeBarAction.EngagementFinished(abandoned = false)) @@ -325,9 +339,9 @@ class SearchDialogController( */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun buildDialog(): MaterialAlertDialogBuilder { - return MaterialAlertDialogBuilder(activity).apply { + return MaterialAlertDialogBuilder(context).apply { val spannableText = SpannableString( - activity.resources.getString(R.string.camera_permissions_needed_message), + context.resources.getString(R.string.camera_permissions_needed_message), ) setMessage(spannableText) setNegativeButton(R.string.camera_permissions_needed_negative_button_text) { _, _ -> @@ -335,10 +349,10 @@ class SearchDialogController( } setPositiveButton(R.string.camera_permissions_needed_positive_button_text) { dialog: DialogInterface, _ -> val intent = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - val uri = Uri.fromParts("package", activity.packageName, null) + val uri = Uri.fromParts("package", context.packageName, null) intent.data = uri dialog.cancel() - activity.startActivity(intent) + context.startActivity(intent) } setOnDismissListener { store.dispatch(AwesomeBarAction.EngagementFinished(abandoned = true)) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -78,7 +78,6 @@ import mozilla.components.support.ktx.kotlin.toNormalizedUrl import mozilla.components.ui.autocomplete.InlineAutocompleteEditText import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras -import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Awesomebar import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.VoiceSearch @@ -93,6 +92,7 @@ import org.mozilla.fenix.databinding.FragmentSearchDialogBinding import org.mozilla.fenix.databinding.SearchSuggestionsHintBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.increaseTapArea +import org.mozilla.fenix.ext.openToBrowser import org.mozilla.fenix.ext.registerForActivityResult import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.runIfFragmentIsAttached @@ -210,7 +210,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return ComponentDialog(requireContext(), this.theme).apply { - if ((requireActivity() as HomeActivity).browsingModeManager.mode.isPrivate) { + if (requireComponents.appStore.state.mode.isPrivate) { this.secure(requireActivity()) } @@ -247,11 +247,11 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { val args by navArgs<SearchDialogFragmentArgs>() _binding = FragmentSearchDialogBinding.inflate(inflater, container, false) val activity = requireActivity() as HomeActivity - val isPrivate = activity.browsingModeManager.mode.isPrivate + val isPrivate = requireComponents.appStore.state.mode.isPrivate store = SearchDialogFragmentStore( createInitialSearchFragmentState( - activity, + requireActivity(), requireComponents, tabId = args.sessionId, pastedText = args.pastedText, @@ -263,7 +263,8 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { ) controller = SearchDialogController( - activity = activity, + appStore = requireComponents.appStore, + context = requireContext(), store = requireComponents.core.store, tabsUseCases = requireComponents.useCases.tabsUseCases, fenixBrowserUseCases = requireComponents.useCases.fenixBrowserUseCases, @@ -439,12 +440,12 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { } else { view.hideKeyboard() toolbarView.view.clearFocus() - (activity as HomeActivity) - .openToBrowserAndLoad( - searchTermOrURL = clipboardUrl, - newTab = store.state.tabId == null, - from = BrowserDirection.FromSearchDialog, - ) + findNavController().openToBrowser() + requireComponents.useCases.fenixBrowserUseCases.loadUrlOrSearch( + searchTermOrURL = clipboardUrl, + newTab = store.state.tabId == null, + flags = EngineSession.LoadUrlFlags.none(), + ) } requireContext().components.clipboardHandler.text = null } @@ -453,14 +454,15 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { val searchSuggestionHintBinding = SearchSuggestionsHintBinding.bind(inflated) searchSuggestionHintBinding.learnMore.setOnClickListener { - (activity as HomeActivity) - .openToBrowserAndLoad( - searchTermOrURL = SupportUtils.getGenericSumoURLForTopic( - SupportUtils.SumoTopic.SEARCH_SUGGESTION, - ), - newTab = store.state.tabId == null, - from = BrowserDirection.FromSearchDialog, + val url = SupportUtils.getGenericSumoURLForTopic( + SupportUtils.SumoTopic.SEARCH_SUGGESTION, ) + findNavController().openToBrowser() + requireComponents.useCases.fenixBrowserUseCases.loadUrlOrSearch( + searchTermOrURL = url, + newTab = store.state.tabId == null, + flags = EngineSession.LoadUrlFlags.none(), + ) } searchSuggestionHintBinding.allow.setOnClickListener { @@ -727,10 +729,10 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { dialog.cancel() } setPositiveButton(R.string.qr_scanner_dialog_positive) { dialog: DialogInterface, _ -> - (activity as? HomeActivity)?.openToBrowserAndLoad( + findNavController().openToBrowser() + requireComponents.useCases.fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = normalizedUrl, newTab = store.state.tabId == null, - from = BrowserDirection.FromSearchDialog, flags = EngineSession.LoadUrlFlags.external(), ) dialog.dismiss() @@ -973,7 +975,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { } else { val clipboardUrl = context?.components?.clipboardHandler?.extractURL() - if (clipboardUrl != null && !((activity as HomeActivity).browsingModeManager.mode.isPrivate)) { + if (clipboardUrl != null && !requireComponents.appStore.state.mode.isPrivate) { requireComponents.core.engine.speculativeConnect(clipboardUrl) } binding.clipboardUrl.text = clipboardUrl diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt @@ -19,7 +19,6 @@ import mozilla.components.lib.state.Action import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.State import mozilla.components.lib.state.Store -import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.automotive.isAndroidAutomotiveAvailable import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager @@ -52,7 +51,7 @@ class SearchFragmentStore( * * This is Activity/Fragment lifecycle dependent and should be handled carefully to avoid memory leaks. * - * @property context Activity [Context] used for various system interactions. + * @property context [Context] used for various system interactions. * @property viewLifecycleOwner [LifecycleOwner] depending on which lifecycle related operations will be scheduled. * @property browsingModeManager [BrowsingModeManager] for querying the current browsing mode. * @property navController [NavController] used to navigate to other destinations. @@ -238,15 +237,16 @@ data class SearchFragmentState( * Creates the initial state for the search fragment. */ fun createInitialSearchFragmentState( - activity: HomeActivity, + context: Context, components: Components, tabId: String?, pastedText: String?, searchAccessPoint: MetricsUtils.Source, searchEngine: SearchEngine? = null, - isAndroidAutomotiveAvailable: Boolean = activity.isAndroidAutomotiveAvailable(), + isAndroidAutomotiveAvailable: Boolean = context.isAndroidAutomotiveAvailable(), ): SearchFragmentState { val settings = components.settings + val browsingMode = components.appStore.state.mode val tab = tabId?.let { components.core.store.state.findTab(it) } val url = tab?.content?.url.orEmpty() @@ -267,7 +267,7 @@ fun createInitialSearchFragmentState( shouldShowSearchSuggestions = false, defaultEngine = null, showSearchSuggestionsFromCurrentEngine = shouldShowSearchSuggestions( - browsingMode = activity.browsingModeManager.mode, + browsingMode = browsingMode, settings = settings, ), showSearchSuggestionsHint = false, @@ -284,12 +284,12 @@ fun createInitialSearchFragmentState( showAllSyncedTabsSuggestions = settings.shouldShowSyncedTabsSuggestions, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = true, - showSponsoredSuggestions = activity.browsingModeManager.mode == BrowsingMode.Normal && + showSponsoredSuggestions = browsingMode == BrowsingMode.Normal && settings.enableFxSuggest && settings.showSponsoredSuggestions, - showNonSponsoredSuggestions = activity.browsingModeManager.mode == BrowsingMode.Normal && + showNonSponsoredSuggestions = browsingMode == BrowsingMode.Normal && settings.enableFxSuggest && settings.showNonSponsoredSuggestions, showTrendingSearches = shouldShowTrendingSearchSuggestions( - browsingMode = activity.browsingModeManager.mode, + browsingMode = browsingMode, settings = settings, isTrendingSuggestionSupported = components.core.store.state.search.selectedOrDefaultSearchEngine?.trendingUrl != null, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComposable.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComposable.kt @@ -246,7 +246,7 @@ class AwesomeBarComposable( private fun initializeSearchStore() = fragment.fragmentStore( createInitialSearchFragmentState( - activity = activity, + context = activity, components = components, tabId = tabId, pastedText = null, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt @@ -34,12 +34,13 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Toolbar import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode +import org.mozilla.fenix.components.AppStore +import org.mozilla.fenix.components.appstate.AppState 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 @@ -81,6 +82,8 @@ class SearchDialogControllerTest { private lateinit var middleware: CaptureActionsMiddleware<BrowserState, BrowserAction> private lateinit var browserStore: BrowserStore + private var currentMode: BrowsingMode = BrowsingMode.Normal + @get:Rule val gleanTestRule = FenixGleanTestRule(testContext) @@ -101,6 +104,8 @@ class SearchDialogControllerTest { every { id } returns R.id.searchDialogFragment } every { activity.components.nimbus.events } returns mockk(relaxUnitFun = true) + + currentMode = BrowsingMode.Normal } @Test @@ -119,7 +124,7 @@ class SearchDialogControllerTest { searchTermOrURL = url, newTab = false, forceSearch = false, - private = activity.browsingModeManager.mode.isPrivate, + private = currentMode.isPrivate, searchEngine = searchEngine, ) } @@ -152,7 +157,7 @@ class SearchDialogControllerTest { searchTermOrURL = url, newTab = false, forceSearch = false, - private = activity.browsingModeManager.mode.isPrivate, + private = currentMode.isPrivate, searchEngine = searchEngine, ) } @@ -183,7 +188,7 @@ class SearchDialogControllerTest { searchTermOrURL = url, newTab = false, forceSearch = true, - private = activity.browsingModeManager.mode.isPrivate, + private = currentMode.isPrivate, searchEngine = searchEngine, ) } @@ -229,7 +234,7 @@ class SearchDialogControllerTest { searchTermOrURL = searchTerm, newTab = false, forceSearch = true, - private = activity.browsingModeManager.mode.isPrivate, + private = currentMode.isPrivate, searchEngine = searchEngine, ) } @@ -255,7 +260,7 @@ class SearchDialogControllerTest { searchTermOrURL = searchTerm, newTab = false, forceSearch = true, - private = activity.browsingModeManager.mode.isPrivate, + private = currentMode.isPrivate, searchEngine = searchEngine, ) } @@ -342,7 +347,7 @@ class SearchDialogControllerTest { searchTermOrURL = SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.MANIFESTO), newTab = false, forceSearch = false, - private = activity.browsingModeManager.mode.isPrivate, + private = currentMode.isPrivate, searchEngine = searchEngine, ) } @@ -414,11 +419,11 @@ class SearchDialogControllerTest { createController().handleUrlTapped(url) verify { - activity.openToBrowserAndLoad( + fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = url, newTab = false, - from = BrowserDirection.FromSearchDialog, flags = flags, + private = currentMode.isPrivate, ) } @@ -447,11 +452,11 @@ class SearchDialogControllerTest { createController().handleUrlTapped(url) verify { - activity.openToBrowserAndLoad( + fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = url, newTab = false, - from = BrowserDirection.FromSearchDialog, flags = flags, + private = currentMode.isPrivate, ) } @@ -476,12 +481,12 @@ class SearchDialogControllerTest { createController().handleSearchTermsTapped(searchTerms) verify { - activity.openToBrowserAndLoad( + fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = searchTerms, newTab = false, - from = BrowserDirection.FromSearchDialog, - engine = searchEngine, forceSearch = true, + private = currentMode.isPrivate, + searchEngine = searchEngine, ) } @@ -497,12 +502,12 @@ class SearchDialogControllerTest { createController().handleSearchTermsTapped(searchTerms) verify { - activity.openToBrowserAndLoad( + fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = searchTerms, newTab = false, - from = BrowserDirection.FromSearchDialog, - engine = searchEngine, forceSearch = true, + private = currentMode.isPrivate, + searchEngine = searchEngine, ) } @@ -515,7 +520,7 @@ class SearchDialogControllerTest { fun handleSearchShortcutEngineSelected() { val searchEngine: SearchEngine = mockk(relaxed = true) val browsingMode = BrowsingMode.Private - every { activity.browsingModeManager.mode } returns browsingMode + currentMode = browsingMode var focusToolbarInvoked = false createController( @@ -621,7 +626,7 @@ class SearchDialogControllerTest { assertEquals("selected", action.tabId) } - verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) } + verify { navController.navigate(actionGlobalBrowser()) } middleware.assertLastAction(AwesomeBarAction.EngagementFinished::class) { action -> assertFalse(action.abandoned) @@ -635,7 +640,7 @@ class SearchDialogControllerTest { middleware.assertFirstAction(TabListAction.SelectTabAction::class) { action -> assertEquals("tab-id", action.tabId) } - verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) } + verify { navController.navigate(actionGlobalBrowser()) } middleware.assertLastAction(AwesomeBarAction.EngagementFinished::class) { action -> assertFalse(action.abandoned) @@ -670,8 +675,11 @@ class SearchDialogControllerTest { dismissDialog: () -> Unit = { }, dismissDialogAndGoBack: () -> Unit = { }, ): SearchDialogController { + val appStore = AppStore(initialState = AppState(mode = currentMode)) + return SearchDialogController( - activity = activity, + appStore = appStore, + context = activity, store = browserStore, tabsUseCases = TabsUseCases(browserStore), fenixBrowserUseCases = fenixBrowserUseCases, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt @@ -152,12 +152,12 @@ internal class SearchDialogFragmentTest { val layoutParams = LayoutParams() layoutParams.flags = LayoutParams.FLAG_SECURE - every { activity.browsingModeManager.mode.isPrivate } returns true every { activity.window } returns mockk(relaxed = true) { every { attributes } returns LayoutParams().apply { flags = LayoutParams.FLAG_SECURE } } every { fragment.requireActivity() } returns activity every { fragment.requireContext() } returns testContext + every { testContext.components.appStore.state.mode.isPrivate } returns true val dialog = fragment.onCreateDialog(null) @@ -171,12 +171,12 @@ internal class SearchDialogFragmentTest { val layoutParams = LayoutParams() layoutParams.flags = LayoutParams.FLAG_SECURE - every { activity.browsingModeManager.mode.isPrivate } returns false every { activity.window } returns mockk(relaxed = true) { every { attributes } returns LayoutParams().apply { flags = LayoutParams.FLAG_SECURE } } every { fragment.requireActivity() } returns activity every { fragment.requireContext() } returns testContext + every { testContext.components.appStore.state.mode.isPrivate } returns false val dialog = fragment.onCreateDialog(null) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt @@ -32,7 +32,9 @@ import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.Components +import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.components.metrics.MetricsUtils import org.mozilla.fenix.search.SearchFragmentAction.SearchProvidersUpdated import org.mozilla.fenix.search.SearchFragmentAction.SearchStarted @@ -56,6 +58,9 @@ class SearchFragmentStoreTest { @MockK(relaxed = true) private lateinit var settings: Settings + @MockK(relaxed = true) + private lateinit var appStore: AppStore + @Before fun setup() { MockKAnnotations.init(this) @@ -65,11 +70,15 @@ class SearchFragmentStoreTest { } every { components.settings } returns settings every { searchEngine.trendingUrl } returns null + + appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + every { components.appStore } returns appStore } @Test fun `createInitialSearchFragmentState with no tab in normal browsing mode`() { - activity.browsingModeManager.mode = BrowsingMode.Normal + appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + every { components.appStore } returns appStore every { components.core.store.state } returns BrowserState() every { settings.shouldShowSearchShortcuts } returns true every { settings.showUnifiedSearchFeature } returns true @@ -134,7 +143,8 @@ class SearchFragmentStoreTest { @Test fun `createInitialSearchFragmentState with no tab in private browsing mode`() { - activity.browsingModeManager.mode = BrowsingMode.Private + appStore = AppStore(initialState = AppState(mode = BrowsingMode.Private)) + every { components.appStore } returns appStore every { components.core.store.state } returns BrowserState() every { settings.shouldShowSearchShortcuts } returns true every { settings.showUnifiedSearchFeature } returns true @@ -172,7 +182,8 @@ class SearchFragmentStoreTest { @Test fun `createInitialSearchFragmentState with tab`() { every { settings.shouldUseBottomToolbar } returns true - activity.browsingModeManager.mode = BrowsingMode.Private + appStore = AppStore(initialState = AppState(mode = BrowsingMode.Private)) + every { components.appStore } returns appStore every { components.core.store.state } returns BrowserState( tabs = listOf( TabSessionState( @@ -210,7 +221,8 @@ class SearchFragmentStoreTest { @Test fun `GIVEN sponsored and non-sponsored suggestions are enabled and Firefox Suggest is disabled WHEN the initial state is created THEN neither are displayed`() { - activity.browsingModeManager.mode = BrowsingMode.Normal + appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + every { components.appStore } returns appStore every { components.core.store.state } returns BrowserState() every { settings.enableFxSuggest } returns false every { settings.showSponsoredSuggestions } returns true