diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt index 48d250e5..16821258 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt @@ -28,7 +28,7 @@ class LanguageSettingsFragment : SubScreenFragment() { addPreferencesFromResource(R.xml.prefs_screen_languages); SubtypeLocaleUtils.init(activity) - enabledSubtypes.addAll(getExplicitlyEnabledSubtypes()) + enabledSubtypes.addAll(getEnabledSubtypes(sharedPreferences)) systemLocales.addAll(getSystemLocales()) loadSubtypes() } @@ -52,11 +52,14 @@ class LanguageSettingsFragment : SubScreenFragment() { private fun loadSubtypes() { val systemOnly = (findPreference(Settings.PREF_USE_SYSTEM_LOCALES) as TwoStatePreference).isChecked sortedSubtypes.clear() + // list of all subtypes, any subtype added to sortedSubtypes will be removed to avoid duplicates val allSubtypes = getAllAvailableSubtypes().toMutableList() // maybe make use of the map used by SubtypeSettings for performance reasons? fun List.sortedAddToSubtypesAndRemoveFromAllSubtypes() { val subtypesToAdd = mutableListOf() forEach { locale -> + // this could be rather slow with looping multiple times over all ~100 subtypes, + // but usually there aren't many locales to be checked, and usually the first loop already finds a match val localeString = locale.toString() val iter = allSubtypes.iterator() var added = false @@ -68,8 +71,8 @@ class LanguageSettingsFragment : SubScreenFragment() { added = true } } + // try again, but with language only if (!added && locale.country.isNotEmpty()) { - // try again, but with language only val languageString = locale.language val iter = allSubtypes.iterator() while (iter.hasNext()) { @@ -99,17 +102,16 @@ class LanguageSettingsFragment : SubScreenFragment() { subtypesToAdd.sortedBy { it.displayName }.addToSortedSubtypes() } - if (systemOnly) { - systemLocales.sortedAddToSubtypesAndRemoveFromAllSubtypes() - languageFilterListPreference.setLanguages(sortedSubtypes.values, systemOnly) - return - } - // add enabled subtypes enabledSubtypes.map { it.toSubtypeInfo(LocaleUtils.constructLocaleFromString(it.locale), true) } .sortedBy { it.displayName }.addToSortedSubtypes() allSubtypes.removeAll(enabledSubtypes) + if (systemOnly) { // don't add anything else + languageFilterListPreference.setLanguages(sortedSubtypes.values, systemOnly) + return + } + // add subtypes that have a dictionary val localesWithDictionary = DictionaryInfoUtils.getCachedDirectoryList(activity)?.mapNotNull { dir -> if (!dir.isDirectory) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt index 7e155da5..f84da972 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt @@ -25,11 +25,6 @@ fun getEnabledSubtypes(prefs: SharedPreferences, fallback: Boolean = false): Lis require(initialized) if (prefs.getBoolean(Settings.PREF_USE_SYSTEM_LOCALES, true)) return getDefaultEnabledSubtypes() - return getExplicitlyEnabledSubtypes(fallback) -} - -fun getExplicitlyEnabledSubtypes(fallback: Boolean = false): List { - require(initialized) if (fallback && enabledSubtypes.isEmpty()) return getDefaultEnabledSubtypes() return enabledSubtypes @@ -157,7 +152,14 @@ private fun getDefaultEnabledSubtypes(): List { val subtypes = systemLocales.mapNotNull { locale -> val localeString = locale.toString() val subtypesOfLocale = resourceSubtypesByLocale[localeString] - ?: resourceSubtypesByLocale[localeString.substringBefore("_")] // fall back to language match + ?: resourceSubtypesByLocale[localeString.substringBefore("_")] // fall back to language matching the subtype + ?: localeString.substringBefore("_").let { language -> // fall back to languages matching subtype language + resourceSubtypesByLocale.firstNotNullOfOrNull { + if (it.key.substringBefore("_") == language) + it.value + else null + } + } subtypesOfLocale?.firstOrNull() } if (subtypes.isEmpty()) {