fix subtypes not showing up if all available subtypes have a mismatching country

This commit is contained in:
Helium314 2023-08-27 19:18:05 +02:00
parent 5b0acd82fa
commit f137a32a28
2 changed files with 18 additions and 14 deletions

View file

@ -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<Locale>.sortedAddToSubtypesAndRemoveFromAllSubtypes() {
val subtypesToAdd = mutableListOf<SubtypeInfo>()
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)

View file

@ -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<InputMethodSubtype> {
require(initialized)
if (fallback && enabledSubtypes.isEmpty())
return getDefaultEnabledSubtypes()
return enabledSubtypes
@ -157,7 +152,14 @@ private fun getDefaultEnabledSubtypes(): List<InputMethodSubtype> {
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()) {