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.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import eu.gaudian.translator.R
import eu.gaudian.translator.model.Language import eu.gaudian.translator.model.Language
import eu.gaudian.translator.model.parseLanguagesFromResources import eu.gaudian.translator.model.parseLanguagesFromResources
import eu.gaudian.translator.model.repository.DataStoreKeys.LANGUAGE_INIT_METADATA_KEY 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 // Check if we already have default languages saved
val savedDefaultLanguages = loadLanguages(LanguageListType.DEFAULT).firstOrNull() ?: emptyList() 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) val shouldReparse = shouldReparseLanguages(savedDefaultLanguages)
if (shouldReparse) { if (shouldReparse) {
Log.d("LanguageRepository", "Parsing languages from resources") Log.d("LanguageRepository", "Parsing languages from resources")
val parsedLanguages = parseLanguagesFromResources(context) val parsedLanguages = parseLanguagesFromResources(context)
wipeHistoryAndFavorites()
saveLanguages(LanguageListType.DEFAULT, parsedLanguages) saveLanguages(LanguageListType.DEFAULT, parsedLanguages)
// Save the current app version and locale to detect changes next time // Save the current app version and locale to detect changes next time
saveLanguageInitializationMetadata() saveLanguageInitializationMetadata()
@@ -112,8 +112,11 @@ class LanguageRepository(private val context: Context) {
return true return true
} }
// Check if the number of languages matches expected count (51) // Get expected language count from resources dynamically
if (savedLanguages.size != 51) { 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 return true
} }
@@ -167,15 +170,22 @@ class LanguageRepository(private val context: Context) {
val customLanguages = loadLanguages(LanguageListType.CUSTOM).first() val customLanguages = loadLanguages(LanguageListType.CUSTOM).first()
val master = (defaultLanguages + customLanguages).distinctBy { it.nameResId } val master = (defaultLanguages + customLanguages).distinctBy { it.nameResId }
// Sanitize existing enabled IDs and initialize if empty // Get existing enabled IDs
val existingEnabled: List<Int> = try { val existingEnabled: List<Int> = try {
context.dataStore.loadObjectList<Int>(DataStoreKeys.ALL_LANGUAGES_KEY).firstOrNull() ?: emptyList() context.dataStore.loadObjectList<Int>(DataStoreKeys.ALL_LANGUAGES_KEY).firstOrNull() ?: emptyList()
} catch (_: Exception) { } catch (_: Exception) {
emptyList() emptyList()
} }
val masterIds = master.map { it.nameResId }.toSet() 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) context.dataStore.saveObjectList(DataStoreKeys.ALL_LANGUAGES_KEY, finalIds)