@ -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 = { } ,
)