From baa1958b0f6d26e929d3086f2014587c6403b5e9 Mon Sep 17 00:00:00 2001 From: Lina Butler Date: Mon, 2 Oct 2023 11:40:33 -0700 Subject: [PATCH] Bug 1856434 - Only show new Firefox Suggest suggestions for the default search engine. This commit hides sponsored and non-sponsored search suggestions from Firefox Suggest when a non-default search engine is selected, matching Desktop's behavior. --- .../fenix/search/SearchFragmentStore.kt | 18 ++ .../fenix/search/awesomebar/AwesomeBarView.kt | 31 +-- .../fenix/search/SearchFragmentStoreTest.kt | 180 ++++++++++++++++++ .../search/awesomebar/AwesomeBarViewTest.kt | 130 +++++++++---- .../SearchSelectorToolbarActionTest.kt | 2 + .../fenix/search/toolbar/ToolbarViewTest.kt | 2 + 6 files changed, 306 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt index 7587beaae..e9fc01223 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt @@ -100,6 +100,10 @@ sealed class SearchEngineSource { * @property showSessionSuggestionsForCurrentEngine Whether or not to show local tabs suggestions for only * the current search engine. * @property showAllSessionSuggestions Whether or not to show the session suggestion in the AwesomeBar. + * @property showSponsoredSuggestions Whether or not to show sponsored Firefox Suggest search suggestions in the + * AwesomeBar. Always `false` when a non-default engine is selected. + * @property showNonSponsoredSuggestions Whether or not to show Firefox Suggest search suggestions for web content + * in the AwesomeBar. Always `false` when a non-default engine is selected. * @property tabId The ID of the current tab. * @property pastedText The text pasted from the long press toolbar menu. * @property searchAccessPoint The source of the performed search. @@ -126,6 +130,8 @@ data class SearchFragmentState( val showAllSyncedTabsSuggestions: Boolean, val showSessionSuggestionsForCurrentEngine: Boolean, val showAllSessionSuggestions: Boolean, + val showSponsoredSuggestions: Boolean, + val showNonSponsoredSuggestions: Boolean, val tabId: String?, val pastedText: String? = null, val searchAccessPoint: MetricsUtils.Source, @@ -178,6 +184,8 @@ fun createInitialSearchFragmentState( showAllSyncedTabsSuggestions = settings.shouldShowSyncedTabsSuggestions, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = true, + showSponsoredSuggestions = settings.showSponsoredSuggestions, + showNonSponsoredSuggestions = settings.showNonSponsoredSuggestions, tabId = tabId, pastedText = pastedText, searchAccessPoint = searchAccessPoint, @@ -275,6 +283,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen showSyncedTabsSuggestionsForCurrentEngine = false, // we'll show all synced tabs showAllSyncedTabsSuggestions = action.settings.shouldShowSyncedTabsSuggestions, showSessionSuggestionsForCurrentEngine = false, // we'll show all local tabs + showSponsoredSuggestions = action.settings.showSponsoredSuggestions, + showNonSponsoredSuggestions = action.settings.showNonSponsoredSuggestions, showAllSessionSuggestions = true, ) is SearchFragmentAction.SearchShortcutEngineSelected -> @@ -312,6 +322,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen true -> false false -> true }, + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, ) is SearchFragmentAction.SearchHistoryEngineSelected -> state.copy( @@ -328,6 +340,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = false, + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, ) is SearchFragmentAction.SearchBookmarksEngineSelected -> state.copy( @@ -344,6 +358,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = false, + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, ) is SearchFragmentAction.SearchTabsEngineSelected -> state.copy( @@ -360,6 +376,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen showAllSyncedTabsSuggestions = true, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = true, + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, ) is SearchFragmentAction.ShowSearchShortcutEnginePicker -> state.copy(showSearchShortcuts = action.show && state.areShortcutsAvailable) diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt index 4455fe02c..b8559d751 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt @@ -57,7 +57,6 @@ class AwesomeBarView( private val engineForSpeculativeConnects: Engine? private val defaultHistoryStorageProvider: HistoryStorageSuggestionProvider private val defaultCombinedHistoryProvider: CombinedHistorySuggestionProvider - private val fxSuggestProvider: FxSuggestSuggestionProvider? private val shortcutsEnginePickerProvider: ShortcutsSuggestionProvider private val defaultSearchSuggestionProvider: SearchSuggestionProvider private val defaultSearchActionProvider: SearchActionProvider @@ -140,18 +139,6 @@ class AwesomeBarView( suggestionsHeader = activity.getString(R.string.firefox_suggest_header), ) - fxSuggestProvider = if (activity.settings().enableFxSuggest) { - FxSuggestSuggestionProvider( - resources = activity.resources, - loadUrlUseCase = loadUrlUseCase, - includeSponsoredSuggestions = activity.settings().showSponsoredSuggestions, - includeNonSponsoredSuggestions = activity.settings().showNonSponsoredSuggestions, - suggestionsHeader = activity.getString(R.string.firefox_suggest_header), - ) - } else { - null - } - val searchBitmap = getDrawable(activity, R.drawable.ic_search)!!.apply { colorFilter = createBlendModeColorFilterCompat(primaryTextColor, SRC_IN) }.toBitmap() @@ -332,9 +319,19 @@ class AwesomeBarView( providersToAdd.add(getLocalTabsProvider(state.searchEngineSource, true)) } - providersToAdd.add(searchEngineSuggestionProvider) + if (state.showSponsoredSuggestions || state.showNonSponsoredSuggestions) { + providersToAdd.add( + FxSuggestSuggestionProvider( + resources = activity.resources, + loadUrlUseCase = loadUrlUseCase, + includeSponsoredSuggestions = state.showSponsoredSuggestions, + includeNonSponsoredSuggestions = state.showNonSponsoredSuggestions, + suggestionsHeader = activity.getString(R.string.firefox_suggest_header), + ), + ) + } - fxSuggestProvider?.let { providersToAdd.add(it) } + providersToAdd.add(searchEngineSuggestionProvider) return providersToAdd } @@ -567,6 +564,8 @@ class AwesomeBarView( val showAllSyncedTabsSuggestions: Boolean, val showSessionSuggestionsForCurrentEngine: Boolean, val showAllSessionSuggestions: Boolean, + val showSponsoredSuggestions: Boolean, + val showNonSponsoredSuggestions: Boolean, val searchEngineSource: SearchEngineSource, ) @@ -600,5 +599,7 @@ fun SearchFragmentState.toSearchProviderState() = AwesomeBarView.SearchProviderS showAllSyncedTabsSuggestions = showAllSyncedTabsSuggestions, showSessionSuggestionsForCurrentEngine = showSessionSuggestionsForCurrentEngine, showAllSessionSuggestions = showAllSessionSuggestions, + showSponsoredSuggestions = showSponsoredSuggestions, + showNonSponsoredSuggestions = showNonSponsoredSuggestions, searchEngineSource = searchEngineSource, ) diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt index 2847305c4..6c5c81c83 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt @@ -62,6 +62,8 @@ class SearchFragmentStoreTest { every { settings.shouldShowSearchShortcuts } returns true every { settings.showUnifiedSearchFeature } returns true every { settings.shouldShowHistorySuggestions } returns true + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true mockkStatic("org.mozilla.fenix.search.SearchFragmentStoreKt") { val expected = SearchFragmentState( @@ -85,6 +87,8 @@ class SearchFragmentStoreTest { showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = true, + showSponsoredSuggestions = true, + showNonSponsoredSuggestions = true, tabId = null, pastedText = "pastedText", searchAccessPoint = MetricsUtils.Source.ACTION, @@ -152,6 +156,8 @@ class SearchFragmentStoreTest { showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = true, + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, tabId = "tabId", pastedText = "", searchAccessPoint = MetricsUtils.Source.SHORTCUT, @@ -351,6 +357,152 @@ class SearchFragmentStoreTest { assertFalse(store.state.showSearchShortcuts) } + @Test + fun `GIVEN sponsored suggestions are enabled WHEN the default search engine is selected THEN sponsored suggestions are displayed`() = runTest { + val initialState = emptyDefaultState(showSponsoredSuggestions = false, showNonSponsoredSuggestions = false) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns false + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertTrue(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN non-sponsored suggestions are enabled WHEN the default search engine is selected THEN non-sponsored suggestions are displayed`() = runTest { + val initialState = emptyDefaultState(showSponsoredSuggestions = false, showNonSponsoredSuggestions = false) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns false + every { settings.showNonSponsoredSuggestions } returns true + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSponsoredSuggestions) + assertTrue(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are enabled WHEN the default search engine is selected THEN both are displayed`() = runTest { + val initialState = emptyDefaultState(showSponsoredSuggestions = false, showNonSponsoredSuggestions = false) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertTrue(store.state.showSponsoredSuggestions) + assertTrue(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are disabled WHEN the default search engine is selected THEN neither are displayed`() = runTest { + val initialState = emptyDefaultState(showSponsoredSuggestions = true, showNonSponsoredSuggestions = true) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns false + every { settings.showNonSponsoredSuggestions } returns false + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are enabled WHEN a shortcut is selected THEN neither are displayed`() = runTest { + val initialState = + emptyDefaultState(showSponsoredSuggestions = true, showNonSponsoredSuggestions = true) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true + + store.dispatch( + SearchFragmentAction.SearchShortcutEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are enabled WHEN the history engine is selected THEN neither are displayed`() = runTest { + val initialState = + emptyDefaultState(showSponsoredSuggestions = true, showNonSponsoredSuggestions = true) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true + + store.dispatch(SearchFragmentAction.SearchHistoryEngineSelected(searchEngine)).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are enabled WHEN the bookmarks engine is selected THEN neither are displayed`() = runTest { + val initialState = + emptyDefaultState(showSponsoredSuggestions = true, showNonSponsoredSuggestions = true) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true + + store.dispatch(SearchFragmentAction.SearchBookmarksEngineSelected(searchEngine)).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are enabled WHEN the tabs engine is selected THEN neither are displayed`() = runTest { + val initialState = + emptyDefaultState(showSponsoredSuggestions = true, showNonSponsoredSuggestions = true) + val store = SearchFragmentStore(initialState) + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true + + store.dispatch(SearchFragmentAction.SearchTabsEngineSelected(searchEngine)).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) + } + @Test fun `WHEN the search engine is the default one THEN search suggestions providers are updated`() = runTest { val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) @@ -363,6 +515,8 @@ class SearchFragmentStoreTest { every { settings.shouldShowSyncedTabsSuggestions } returns false every { settings.shouldShowSearchSuggestions } returns true every { settings.shouldShowSearchSuggestionsInPrivate } returns true + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true mockkStatic("org.mozilla.fenix.search.SearchFragmentStoreKt") { store.dispatch( @@ -385,6 +539,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllBookmarkSuggestions) assertFalse(store.state.showAllSyncedTabsSuggestions) assertTrue(store.state.showAllSessionSuggestions) + assertTrue(store.state.showSponsoredSuggestions) + assertTrue(store.state.showNonSponsoredSuggestions) verify { shouldShowSearchSuggestions(BrowsingMode.Private, settings) } } } @@ -403,6 +559,8 @@ class SearchFragmentStoreTest { every { settings.shouldShowBookmarkSuggestions } returns true every { settings.shouldShowSyncedTabsSuggestions } returns true every { settings.shouldShowSearchSuggestions } returns true + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true store.dispatch( SearchFragmentAction.SearchShortcutEngineSelected( @@ -426,6 +584,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllSyncedTabsSuggestions) assertTrue(store.state.showSessionSuggestionsForCurrentEngine) assertFalse(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) every { settings.shouldShowSearchSuggestions } returns false val generalEngine: SearchEngine = mockk { @@ -452,6 +612,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllSyncedTabsSuggestions) assertFalse(store.state.showSessionSuggestionsForCurrentEngine) assertFalse(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) } @Test @@ -466,6 +628,8 @@ class SearchFragmentStoreTest { every { settings.shouldShowHistorySuggestions } returns true every { settings.shouldShowBookmarkSuggestions } returns false every { settings.shouldShowSyncedTabsSuggestions } returns false + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true store.dispatch( SearchFragmentAction.SearchShortcutEngineSelected( @@ -489,6 +653,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllSyncedTabsSuggestions) assertTrue(store.state.showSessionSuggestionsForCurrentEngine) assertFalse(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) } @Test @@ -503,6 +669,8 @@ class SearchFragmentStoreTest { every { settings.shouldShowSyncedTabsSuggestions } returns true every { settings.shouldShowSearchSuggestions } returns true every { settings.shouldShowSearchSuggestionsInPrivate } returns true + every { settings.showSponsoredSuggestions } returns true + every { settings.showNonSponsoredSuggestions } returns true store.dispatch( SearchFragmentAction.SearchShortcutEngineSelected( @@ -523,6 +691,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllBookmarkSuggestions) assertTrue(store.state.showAllSyncedTabsSuggestions) assertTrue(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) } @Test @@ -642,6 +812,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllBookmarkSuggestions) assertFalse(store.state.showAllSyncedTabsSuggestions) assertFalse(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) } @Test @@ -662,6 +834,8 @@ class SearchFragmentStoreTest { assertTrue(store.state.showAllBookmarkSuggestions) assertFalse(store.state.showAllSyncedTabsSuggestions) assertFalse(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) } @Test @@ -682,6 +856,8 @@ class SearchFragmentStoreTest { assertFalse(store.state.showAllBookmarkSuggestions) assertTrue(store.state.showAllSyncedTabsSuggestions) assertTrue(store.state.showAllSessionSuggestions) + assertFalse(store.state.showSponsoredSuggestions) + assertFalse(store.state.showNonSponsoredSuggestions) } @Test @@ -943,6 +1119,8 @@ class SearchFragmentStoreTest { areShortcutsAvailable: Boolean = true, showSearchShortcutsSetting: Boolean = false, showHistorySuggestionsForCurrentEngine: Boolean = true, + showSponsoredSuggestions: Boolean = true, + showNonSponsoredSuggestions: Boolean = true, ): SearchFragmentState = SearchFragmentState( tabId = null, url = "", @@ -965,6 +1143,8 @@ class SearchFragmentStoreTest { showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = false, + showSponsoredSuggestions = showSponsoredSuggestions, + showNonSponsoredSuggestions = showNonSponsoredSuggestions, searchAccessPoint = MetricsUtils.Source.NONE, ) } diff --git a/app/src/test/java/org/mozilla/fenix/search/awesomebar/AwesomeBarViewTest.kt b/app/src/test/java/org/mozilla/fenix/search/awesomebar/AwesomeBarViewTest.kt index fa2bd61e8..585109817 100644 --- a/app/src/test/java/org/mozilla/fenix/search/awesomebar/AwesomeBarViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/awesomebar/AwesomeBarViewTest.kt @@ -65,8 +65,6 @@ class AwesomeBarViewTest { every { any().components.core.client } returns mockk() every { any().components.backgroundServices.syncedTabsStorage } returns mockk() every { any().components.core.store.state.search } returns mockk(relaxed = true) - every { any().components.core.store.state.search } returns mockk(relaxed = true) - every { any().settings() } returns mockk(relaxed = true) every { any().getColorFromAttr(any()) } returns 0 every { AwesomeBarView.Companion.getDrawable(any(), any()) } returns mockk(relaxed = true) { every { intrinsicWidth } returns 10 @@ -852,6 +850,90 @@ class AwesomeBarViewTest { assertEquals(1, result.filterIsInstance().size) } + @Test + fun `GIVEN sponsored suggestions are enabled WHEN configuring providers THEN add the Firefox Suggest suggestion provider`() { + val settings: Settings = mockk(relaxed = true) + every { activity.settings() } returns settings + val awesomeBarView = AwesomeBarView( + activity = activity, + interactor = mockk(), + view = mockk(), + fromHomeFragment = false, + ) + val state = getSearchProviderState( + showSponsoredSuggestions = true, + showNonSponsoredSuggestions = false, + ) + + val result = awesomeBarView.getProvidersToAdd(state) + + val fxSuggestProvider = result.firstOrNull { it is FxSuggestSuggestionProvider } + assertNotNull(fxSuggestProvider) + } + + @Test + fun `GIVEN non-sponsored suggestions are enabled WHEN configuring providers THEN add the Firefox Suggest suggestion provider`() { + val settings: Settings = mockk(relaxed = true) + every { activity.settings() } returns settings + val awesomeBarView = AwesomeBarView( + activity = activity, + interactor = mockk(), + view = mockk(), + fromHomeFragment = false, + ) + val state = getSearchProviderState( + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = true, + ) + + val result = awesomeBarView.getProvidersToAdd(state) + + val fxSuggestProvider = result.firstOrNull { it is FxSuggestSuggestionProvider } + assertNotNull(fxSuggestProvider) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are enabled WHEN configuring providers THEN add the Firefox Suggest suggestion provider`() { + val settings: Settings = mockk(relaxed = true) + every { activity.settings() } returns settings + val awesomeBarView = AwesomeBarView( + activity = activity, + interactor = mockk(), + view = mockk(), + fromHomeFragment = false, + ) + val state = getSearchProviderState( + showSponsoredSuggestions = true, + showNonSponsoredSuggestions = true, + ) + + val result = awesomeBarView.getProvidersToAdd(state) + + val fxSuggestProvider = result.firstOrNull { it is FxSuggestSuggestionProvider } + assertNotNull(fxSuggestProvider) + } + + @Test + fun `GIVEN sponsored and non-sponsored suggestions are disabled WHEN configuring providers THEN don't add the Firefox Suggest suggestion provider`() { + val settings: Settings = mockk(relaxed = true) + every { activity.settings() } returns settings + val awesomeBarView = AwesomeBarView( + activity = activity, + interactor = mockk(), + view = mockk(), + fromHomeFragment = false, + ) + val state = getSearchProviderState( + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, + ) + + val result = awesomeBarView.getProvidersToAdd(state) + + val fxSuggestProvider = result.firstOrNull { it is FxSuggestSuggestionProvider } + assertNull(fxSuggestProvider) + } + @Test fun `GIVEN the current search engine's url is not known WHEN creating a history provider for that engine THEN return null`() { val engineSource = SearchEngineSource.None @@ -1046,46 +1128,6 @@ class AwesomeBarViewTest { assertEquals(1, result.filterIsInstance().size) } - - @Test - fun `GIVEN Firefox Suggest is enabled WHEN the view is created THEN configure the Firefox Suggest suggestion provider`() { - val settings: Settings = mockk(relaxed = true) { - every { enableFxSuggest } returns true - } - every { activity.settings() } returns settings - val awesomeBarView = AwesomeBarView( - activity = activity, - interactor = mockk(), - view = mockk(), - fromHomeFragment = false, - ) - val state = getSearchProviderState() - - val result = awesomeBarView.getProvidersToAdd(state) - - val fxSuggestProvider = result.firstOrNull { it is FxSuggestSuggestionProvider } - assertNotNull(fxSuggestProvider) - } - - @Test - fun `GIVEN Firefox Suggest is disabled WHEN the view is created THEN don't configure the Firefox Suggest suggestion provider`() { - val settings: Settings = mockk(relaxed = true) { - every { enableFxSuggest } returns false - } - every { activity.settings() } returns settings - val awesomeBarView = AwesomeBarView( - activity = activity, - interactor = mockk(), - view = mockk(), - fromHomeFragment = false, - ) - val state = getSearchProviderState() - - val result = awesomeBarView.getProvidersToAdd(state) - - val fxSuggestProvider = result.firstOrNull { it is FxSuggestSuggestionProvider } - assertNull(fxSuggestProvider) - } } /** @@ -1104,6 +1146,8 @@ private fun getSearchProviderState( showSessionSuggestionsForCurrentEngine: Boolean = true, showAllSessionSuggestions: Boolean = true, searchEngineSource: SearchEngineSource = SearchEngineSource.None, + showSponsoredSuggestions: Boolean = true, + showNonSponsoredSuggestions: Boolean = true, ) = SearchProviderState( showSearchShortcuts = showSearchShortcuts, showSearchTermHistory = showSearchTermHistory, @@ -1116,5 +1160,7 @@ private fun getSearchProviderState( showAllSyncedTabsSuggestions = showAllSyncedTabsSuggestions, showSessionSuggestionsForCurrentEngine = showSessionSuggestionsForCurrentEngine, showAllSessionSuggestions = showAllSessionSuggestions, + showSponsoredSuggestions = showSponsoredSuggestions, + showNonSponsoredSuggestions = showNonSponsoredSuggestions, searchEngineSource = searchEngineSource, ) diff --git a/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorToolbarActionTest.kt b/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorToolbarActionTest.kt index 787e25980..db25163c3 100644 --- a/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorToolbarActionTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorToolbarActionTest.kt @@ -275,6 +275,8 @@ private val testSearchFragmentState = SearchFragmentState( showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = true, + showSponsoredSuggestions = true, + showNonSponsoredSuggestions = true, tabId = "tabId", pastedText = "", searchAccessPoint = MetricsUtils.Source.SHORTCUT, diff --git a/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt b/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt index 31d8e2002..52882c9f1 100644 --- a/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt @@ -88,6 +88,8 @@ class ToolbarViewTest { showAllSyncedTabsSuggestions = false, showSessionSuggestionsForCurrentEngine = false, showAllSessionSuggestions = false, + showSponsoredSuggestions = false, + showNonSponsoredSuggestions = false, searchAccessPoint = MetricsUtils.Source.NONE, )