Skip to content
This repository has been archived by the owner on Feb 20, 2023. It is now read-only.

Commit

Permalink
For #6981 #6907 - Properly reloads search engines when locale changes
Browse files Browse the repository at this point in the history
  • Loading branch information
boek committed Feb 19, 2020
1 parent 6c2d6e6 commit 1ba64f9
Showing 1 changed file with 34 additions and 6 deletions.
Expand Up @@ -39,7 +39,7 @@ open class FenixSearchEngineProvider(
)
)

open val baseSearchEngines = async {
open var baseSearchEngines = async {
AssetsSearchEngineProvider(localizationProvider).loadSearchEngines(context)
}

Expand Down Expand Up @@ -77,8 +77,8 @@ open class FenixSearchEngineProvider(
* are readily available throughout the app.
*/
fun installedSearchEngines(context: Context): SearchEngineList = runBlocking {
val engineList = loadedSearchEngines.await()
val installedIdentifiers = installedSearchEngineIdentifiers(context)
val engineList = loadedSearchEngines.await()

engineList.copy(
list = engineList.list.filter {
Expand All @@ -99,8 +99,8 @@ open class FenixSearchEngineProvider(
}

fun uninstalledSearchEngines(context: Context): SearchEngineList = runBlocking {
val engineList = loadedSearchEngines.await()
val installedIdentifiers = installedSearchEngineIdentifiers(context)
val engineList = loadedSearchEngines.await()

engineList.copy(list = engineList.list.filterNot { installedIdentifiers.contains(it.identifier) })
}
Expand Down Expand Up @@ -136,6 +136,13 @@ open class FenixSearchEngineProvider(
}
}

// When we change the locale we need to update the baseSearchEngines list
private fun updateBaseSearchEngines() {
baseSearchEngines = async {
AssetsSearchEngineProvider(localizationProvider).loadSearchEngines(context)
}
}

private fun refreshAsync() = async {
val engineList = baseSearchEngines.await()
val bundledList = bundledSearchEngines.await().list
Expand All @@ -152,25 +159,46 @@ open class FenixSearchEngineProvider(
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
suspend fun installedSearchEngineIdentifiers(context: Context): Set<String> {
val prefs = prefs(context)
val installedEnginesKey = localeAwareInstalledEnginesKey()

if (installedEnginesKey != prefs.getString(CURRENT_LOCALE_KEY, "")) {
updateBaseSearchEngines()
reload()
prefs.edit().putString(CURRENT_LOCALE_KEY, installedEnginesKey).apply()
}

if (!prefs.contains(INSTALLED_ENGINES_KEY)) {
if (!prefs.contains(installedEnginesKey)) {
val defaultSet = baseSearchEngines.await()
.list
.map { it.identifier }
.toSet()

prefs.edit().putStringSet(INSTALLED_ENGINES_KEY, defaultSet).apply()
prefs.edit().putStringSet(installedEnginesKey, defaultSet).apply()
}

val installedIdentifiers = prefs(context).getStringSet(INSTALLED_ENGINES_KEY, setOf()) ?: setOf()
val installedIdentifiers = prefs(context).getStringSet(installedEnginesKey, setOf()) ?: setOf()

val customEngineIdentifiers = customSearchEngines.await().list.map { it.identifier }.toSet()
return installedIdentifiers + customEngineIdentifiers
}

private suspend fun localeAwareInstalledEnginesKey(): String {
val tag = localizationProvider.determineRegion().let {
val region = it.region?.let { region ->
if (region.isEmpty()) "" else "-$region"
}

"${it.languageTag}$region"
}

return "$INSTALLED_ENGINES_KEY-$tag"
}

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
companion object {
val BUNDLED_SEARCH_ENGINES = listOf("reddit", "youtube")
const val PREF_FILE = "fenix-search-engine-provider"
const val INSTALLED_ENGINES_KEY = "fenix-installed-search-engines"
const val CURRENT_LOCALE_KEY = "fenix-current-locale"
}
}

0 comments on commit 1ba64f9

Please sign in to comment.