For #24262 - Filter Amazon/eBay sponsored tiles when the respective search engine is set

This commit is contained in:
Alexandru2909 2022-04-28 14:46:15 +03:00 committed by mergify[bot]
parent 35be05d599
commit 89a1e6367f
2 changed files with 72 additions and 1 deletions

View File

@ -417,7 +417,14 @@ class HomeFragment : Fragment() {
frecencyConfig = FrecencyThresholdOption.SKIP_ONE_TIME_PAGES, frecencyConfig = FrecencyThresholdOption.SKIP_ONE_TIME_PAGES,
providerConfig = TopSitesProviderConfig( providerConfig = TopSitesProviderConfig(
showProviderTopSites = settings.showContileFeature, showProviderTopSites = settings.showContileFeature,
maxThreshold = TOP_SITES_PROVIDER_MAX_THRESHOLD maxThreshold = TOP_SITES_PROVIDER_MAX_THRESHOLD,
providerFilter = { topSite ->
when (store.state.search.selectedOrDefaultSearchEngine?.name) {
AMAZON_SEARCH_ENGINE_NAME -> topSite.title != AMAZON_SPONSORED_TITLE
EBAY_SPONSORED_TITLE -> topSite.title != EBAY_SPONSORED_TITLE
else -> true
}
}
) )
) )
} }
@ -487,6 +494,7 @@ class HomeFragment : Fragment() {
HomeScreen.homeScreenViewCount.add() HomeScreen.homeScreenViewCount.add()
observeSearchEngineChanges() observeSearchEngineChanges()
observeSearchEngineNameChanges()
createHomeMenu(requireContext(), WeakReference(binding.menuButton)) createHomeMenu(requireContext(), WeakReference(binding.menuButton))
createTabCounterMenu() createTabCounterMenu()
@ -570,6 +578,27 @@ class HomeFragment : Fragment() {
} }
} }
/**
* Method used to listen to search engine name changes and trigger a top sites update accordingly
*/
private fun observeSearchEngineNameChanges() {
consumeFlow(store) { flow ->
flow.map { state ->
when (state.search.selectedOrDefaultSearchEngine?.name) {
AMAZON_SEARCH_ENGINE_NAME -> AMAZON_SPONSORED_TITLE
EBAY_SPONSORED_TITLE -> EBAY_SPONSORED_TITLE
else -> null
}
}
.ifChanged()
.collect {
topSitesFeature.withFeature {
it.storage.notifyObservers { onStorageUpdated() }
}
}
}
}
private fun createTabCounterMenu() { private fun createTabCounterMenu() {
val browsingModeManager = (activity as HomeActivity).browsingModeManager val browsingModeManager = (activity as HomeActivity).browsingModeManager
val mode = browsingModeManager.mode val mode = browsingModeManager.mode
@ -1084,6 +1113,11 @@ class HomeFragment : Fragment() {
private const val CFR_WIDTH_DIVIDER = 1.7 private const val CFR_WIDTH_DIVIDER = 1.7
private const val CFR_Y_OFFSET = -20 private const val CFR_Y_OFFSET = -20
// Sponsored top sites titles and search engine names used for filtering
const val AMAZON_SPONSORED_TITLE = "Amazon"
const val AMAZON_SEARCH_ENGINE_NAME = "Amazon.com"
const val EBAY_SPONSORED_TITLE = "eBay"
// Elevation for undo toasts // Elevation for undo toasts
internal const val TOAST_ELEVATION = 80f internal const val TOAST_ELEVATION = 80f
} }

View File

@ -7,28 +7,39 @@ package org.mozilla.fenix.home
import android.content.Context import android.content.Context
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.spyk import io.mockk.spyk
import io.mockk.verify import io.mockk.verify
import mozilla.components.browser.menu.view.MenuButton import mozilla.components.browser.menu.view.MenuButton
import mozilla.components.browser.state.state.SearchState
import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine
import mozilla.components.feature.top.sites.TopSite
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.components.Core
import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.application
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.home.HomeFragment.Companion.AMAZON_SPONSORED_TITLE
import org.mozilla.fenix.home.HomeFragment.Companion.EBAY_SPONSORED_TITLE
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
class HomeFragmentTest { class HomeFragmentTest {
private lateinit var settings: Settings private lateinit var settings: Settings
private lateinit var context: Context private lateinit var context: Context
private lateinit var core: Core
private lateinit var homeFragment: HomeFragment private lateinit var homeFragment: HomeFragment
@Before @Before
fun setup() { fun setup() {
settings = mockk(relaxed = true) settings = mockk(relaxed = true)
context = mockk(relaxed = true) context = mockk(relaxed = true)
core = mockk(relaxed = true)
val fenixApplication: FenixApplication = mockk(relaxed = true) val fenixApplication: FenixApplication = mockk(relaxed = true)
@ -37,6 +48,7 @@ class HomeFragmentTest {
every { context.application } returns fenixApplication every { context.application } returns fenixApplication
every { homeFragment.context } answers { context } every { homeFragment.context } answers { context }
every { context.components.settings } answers { settings } every { context.components.settings } answers { settings }
every { context.components.core } answers { core }
} }
@Test @Test
@ -58,6 +70,31 @@ class HomeFragmentTest {
assertEquals(topSitesMaxLimit, topSitesConfig.totalSites) assertEquals(topSitesMaxLimit, topSitesConfig.totalSites)
} }
@Test
fun `GIVEN the selected search engine is set to eBay WHEN getTopSitesConfig is called THEN providerFilter filters the eBay provided top sites`() {
mockkStatic("mozilla.components.browser.state.state.SearchStateKt")
every { core.store } returns mockk() {
every { state } returns mockk() {
every { search } returns mockk()
}
}
every { any<SearchState>().selectedOrDefaultSearchEngine } returns mockk {
every { name } returns EBAY_SPONSORED_TITLE
}
val eBayTopSite = TopSite.Provided(1L, EBAY_SPONSORED_TITLE, "eBay.com", "", "", "", 0L)
val amazonTopSite = TopSite.Provided(2L, AMAZON_SPONSORED_TITLE, "Amazon.com", "", "", "", 0L)
val firefoxTopSite = TopSite.Provided(3L, "Firefox", "mozilla.org", "", "", "", 0L)
val providedTopSites = listOf(eBayTopSite, amazonTopSite, firefoxTopSite)
val topSitesConfig = homeFragment.getTopSitesConfig()
val filteredProvidedSites = providedTopSites.filter {
topSitesConfig.providerConfig?.providerFilter?.invoke(it) ?: true
}
assertTrue(filteredProvidedSites.containsAll(listOf(amazonTopSite, firefoxTopSite)))
assertFalse(filteredProvidedSites.contains(eBayTopSite))
}
@Test @Test
fun `WHEN configuration changed menu is dismissed`() { fun `WHEN configuration changed menu is dismissed`() {
val menuButton: MenuButton = mockk(relaxed = true) val menuButton: MenuButton = mockk(relaxed = true)