[fenix] For https://github.com/mozilla-mobile/fenix/issues/28111: Filter out topic specific search engines from default list

Since topic specific search engines, like amazon, ebay, etc...
will only show results from those specific websites, they will be filtered
out of the default search engines list.
pull/600/head
DreVla 2 years ago committed by mergify[bot]
parent 26563fa3fa
commit 95703b9555

@ -376,6 +376,7 @@ class SettingsSearchTest {
}
}
@Ignore("Test failure caused by: https://bugzilla.mozilla.org/show_bug.cgi?id=1807298")
// Expected for en-us defaults
@Test
fun deleteAllSearchEnginesTest() {

@ -28,6 +28,8 @@ import kotlinx.coroutines.launch
import mozilla.appservices.Megazord
import mozilla.components.browser.state.action.SystemAction
import mozilla.components.browser.state.selector.selectedTab
import mozilla.components.browser.state.state.searchEngines
import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.storage.sync.GlobalPlacesDependencyProvider
import mozilla.components.concept.base.crash.Breadcrumb
@ -245,6 +247,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
setupLeakCanary()
startMetricsIfEnabled()
setupPush()
migrateTopicSpecificSearchEngines()
visibilityLifecycleCallback = VisibilityLifecycleCallback(getSystemService())
registerActivityLifecycleCallbacks(visibilityLifecycleCallback)
@ -553,6 +556,25 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
}
}
/**
* If unified search is enabled try to migrate the topic specific engine to the
* first general or custom search engine available.
*/
@Suppress("NestedBlockDepth")
private fun migrateTopicSpecificSearchEngines() {
if (settings().showUnifiedSearchFeature) {
components.core.store.state.search.selectedOrDefaultSearchEngine.let { currentSearchEngine ->
if (currentSearchEngine?.isGeneral == false) {
components.core.store.state.search.searchEngines.firstOrNull() { nextSearchEngine ->
nextSearchEngine.isGeneral
}?.let {
components.useCases.searchUseCases.selectSearchEngine(it)
}
}
}
}
}
@OptIn(DelicateCoroutinesApi::class) // GlobalScope usage
private fun warmBrowsersCache() {
// We avoid blocking the main thread for BrowsersCache on startup by loading it on

@ -182,6 +182,7 @@ class AddSearchEngineFragment :
name,
searchString.toSearchUrl(),
requireComponents.core.icons.loadIcon(IconRequest(searchString)).await().bitmap,
isGeneral = true,
)
requireComponents.useCases.searchUseCases.addSearchEngine(searchEngine)

@ -20,7 +20,6 @@ import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import mozilla.components.browser.state.search.SearchEngine
@ -35,6 +34,7 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.SearchEngineRadioButtonBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getRootView
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.utils.allowUndo
class RadioSearchEngineListPreference @JvmOverloads constructor(
@ -76,14 +76,23 @@ class RadioSearchEngineListPreference @JvmOverloads constructor(
ViewGroup.LayoutParams.WRAP_CONTENT,
)
val isLastGeneralOrCustomSearchEngine = state.searchEngines.filter {
it.isGeneral
}.size == 1
state.searchEngines.filter { engine ->
engine.type != SearchEngine.Type.APPLICATION
}.forEach { engine ->
val isLastSearchEngineAvailable =
state.searchEngines.count { it.type != SearchEngine.Type.APPLICATION } > 1
val searchEngineView = makeButtonFromSearchEngine(
engine = engine,
layoutInflater = layoutInflater,
res = context.resources,
allowDeletion = state.searchEngines.count { it.type != SearchEngine.Type.APPLICATION } > 1,
allowDeletion = if (context.settings().showUnifiedSearchFeature) {
isLastSearchEngineAvailable && !(engine.isGeneral && isLastGeneralOrCustomSearchEngine)
} else {
isLastSearchEngineAvailable
},
isSelected = engine == state.selectedOrDefaultSearchEngine,
)
@ -104,7 +113,12 @@ class RadioSearchEngineListPreference @JvmOverloads constructor(
val binding = SearchEngineRadioButtonBinding.bind(wrapper)
wrapper.setOnClickListener { binding.radioButton.isChecked = true }
if (context.settings().showUnifiedSearchFeature && !engine.isGeneral) {
binding.radioButton.isEnabled = false
wrapper.isEnabled = false
} else {
wrapper.setOnClickListener { binding.radioButton.isChecked = true }
}
binding.radioButton.tag = engine.id
binding.radioButton.isChecked = isSelected
binding.radioButton.setOnCheckedChangeListener(this)
@ -155,6 +169,19 @@ class RadioSearchEngineListPreference @JvmOverloads constructor(
context: Context,
engine: SearchEngine,
) {
val selectedOrDefaultSearchEngine = context.components.core.store.state.search.selectedOrDefaultSearchEngine
if (selectedOrDefaultSearchEngine == engine) {
val nextSearchEngine = if (context.settings().showUnifiedSearchFeature) {
context.components.core.store.state.search.searchEngines.first {
it.id != engine.id && (it.isGeneral || it.type == SearchEngine.Type.CUSTOM)
}
} else {
context.components.core.store.state.search.searchEngines.first {
it.id != engine.id
}
}
context.components.useCases.searchUseCases.selectSearchEngine(nextSearchEngine)
}
context.components.useCases.searchUseCases.removeSearchEngine(engine)
MainScope().allowUndo(
@ -164,6 +191,9 @@ class RadioSearchEngineListPreference @JvmOverloads constructor(
undoActionTitle = context.getString(R.string.snackbar_deleted_undo),
onCancel = {
context.components.useCases.searchUseCases.addSearchEngine(engine)
if (selectedOrDefaultSearchEngine == engine) {
context.components.useCases.searchUseCases.selectSearchEngine(engine)
}
},
operation = {},
)

Loading…
Cancel
Save