update LanguageRepository to dynamically handle language count and improve synchronization of enabled language IDs

This commit is contained in:
jonasgaudian
2026-02-14 23:55:16 +01:00
parent 05a1b2b71a
commit 03e9aeedae

View File

@@ -4,6 +4,7 @@ package eu.gaudian.translator.model.repository
import android.content.Context
import android.content.pm.PackageManager
import eu.gaudian.translator.R
import eu.gaudian.translator.model.Language
import eu.gaudian.translator.model.parseLanguagesFromResources
import eu.gaudian.translator.model.repository.DataStoreKeys.LANGUAGE_INIT_METADATA_KEY
@@ -88,13 +89,12 @@ class LanguageRepository(private val context: Context) {
// Check if we already have default languages saved
val savedDefaultLanguages = loadLanguages(LanguageListType.DEFAULT).firstOrNull() ?: emptyList()
// Check if we need to re-parse languages (first run, version change, or language change)
// Check if we need to reparse languages (first run, version change, or language change)
val shouldReparse = shouldReparseLanguages(savedDefaultLanguages)
if (shouldReparse) {
Log.d("LanguageRepository", "Parsing languages from resources")
val parsedLanguages = parseLanguagesFromResources(context)
wipeHistoryAndFavorites()
saveLanguages(LanguageListType.DEFAULT, parsedLanguages)
// Save the current app version and locale to detect changes next time
saveLanguageInitializationMetadata()
@@ -112,8 +112,11 @@ class LanguageRepository(private val context: Context) {
return true
}
// Check if the number of languages matches expected count (51)
if (savedLanguages.size != 51) {
// Get expected language count from resources dynamically
val expectedCount = context.resources.getStringArray(R.array.language_codes).size
// Check if the number of languages matches expected count from resources
if (savedLanguages.size != expectedCount) {
return true
}
@@ -167,15 +170,22 @@ class LanguageRepository(private val context: Context) {
val customLanguages = loadLanguages(LanguageListType.CUSTOM).first()
val master = (defaultLanguages + customLanguages).distinctBy { it.nameResId }
// Sanitize existing enabled IDs and initialize if empty
// Get existing enabled IDs
val existingEnabled: List<Int> = try {
context.dataStore.loadObjectList<Int>(DataStoreKeys.ALL_LANGUAGES_KEY).firstOrNull() ?: emptyList()
} catch (_: Exception) {
emptyList()
}
val masterIds = master.map { it.nameResId }.toSet()
val sanitized = existingEnabled.filter { it in masterIds }
val finalIds = sanitized.ifEmpty { master.filter { it.isSelected == true }.map { it.nameResId } }
// Sanitize existing enabled IDs (remove any that are no longer valid)
val existingValidIds = existingEnabled.filter { it in masterIds }.toSet()
// Add any new languages from master that aren't already enabled
val newLanguageIds = masterIds - existingValidIds
// Combine: keep existing enabled + add new languages
val finalIds = (existingValidIds + newLanguageIds).toList()
context.dataStore.saveObjectList(DataStoreKeys.ALL_LANGUAGES_KEY, finalIds)