SystemLanguage+RegionCode Settings

This commit is contained in:
BeZide93 2025-09-05 12:28:25 -05:00 committed by KeatonTheBot
parent 1f283b366b
commit cf12e5ab82
3 changed files with 133 additions and 8 deletions

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.preference.PreferenceManager
import com.anggrayudi.storage.extension.launchOnUiThread import com.anggrayudi.storage.extension.launchOnUiThread
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.Semaphore
@ -75,6 +76,20 @@ class MainViewModel(val activity: MainActivity) {
motionSensorManager?.setControllerId(-1) motionSensorManager?.setControllerId(-1)
} }
// ---- Load language/region from Preferences (Defaults: AmericanEnglish/USA) ----
private fun loadSystemLanguage(): SystemLanguage {
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
val stored = prefs.getString("system_language", "AmericanEnglish") ?: "AmericanEnglish"
return runCatching { SystemLanguage.valueOf(stored) }.getOrElse { SystemLanguage.AmericanEnglish }
}
private fun loadRegionCode(): RegionCode {
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
val stored = prefs.getString("region_code", "USA") ?: "USA"
return runCatching { RegionCode.valueOf(stored) }.getOrElse { RegionCode.USA }
}
// -------------------------------------------------------------------------------
fun loadGame(game: GameModel, overrideSettings: Boolean? = false, forceNceAndPptc: Boolean? = false): Int { fun loadGame(game: GameModel, overrideSettings: Boolean? = false, forceNceAndPptc: Boolean? = false): Int {
KenjinxNative.deviceReinitEmulation() KenjinxNative.deviceReinitEmulation()
MainActivity.mainViewModel?.activity?.uiHandler = UiHandler() MainActivity.mainViewModel?.activity?.uiHandler = UiHandler()
@ -174,8 +189,10 @@ class MainViewModel(val activity: MainActivity) {
settings.memoryManagerMode.ordinal, settings.memoryManagerMode.ordinal,
settings.useNce, settings.useNce,
settings.memoryConfiguration.ordinal, settings.memoryConfiguration.ordinal,
SystemLanguage.AmericanEnglish.ordinal, /* OLD: was fixed -> SystemLanguage.AmericanEnglish.ordinal */
RegionCode.USA.ordinal, loadSystemLanguage().ordinal,
/* OLD: was fixed -> RegionCode.USA.ordinal */
loadRegionCode().ordinal,
settings.vSyncMode.ordinal, settings.vSyncMode.ordinal,
settings.enableDocked, settings.enableDocked,
settings.enablePptc, settings.enablePptc,
@ -282,8 +299,10 @@ class MainViewModel(val activity: MainActivity) {
settings.memoryManagerMode.ordinal, settings.memoryManagerMode.ordinal,
settings.useNce, settings.useNce,
settings.memoryConfiguration.ordinal, settings.memoryConfiguration.ordinal,
SystemLanguage.AmericanEnglish.ordinal, /* OLD: was fixed -> SystemLanguage.AmericanEnglish.ordinal */
RegionCode.USA.ordinal, loadSystemLanguage().ordinal,
/* OLD: was fixed -> RegionCode.USA.ordinal */
loadRegionCode().ordinal,
settings.vSyncMode.ordinal, settings.vSyncMode.ordinal,
settings.enableDocked, settings.enableDocked,
settings.enablePptc, settings.enablePptc,

View file

@ -20,6 +20,10 @@ import java.io.FileOutputStream
import kotlin.concurrent.thread import kotlin.concurrent.thread
import androidx.core.content.edit import androidx.core.content.edit
// Import enums
import org.kenjinx.android.SystemLanguage
import org.kenjinx.android.RegionCode
class SettingsViewModel(val activity: MainActivity) { class SettingsViewModel(val activity: MainActivity) {
var selectedFirmwareVersion: String = "" var selectedFirmwareVersion: String = ""
private var previousFileCallback: ((requestCode: Int, files: List<DocumentFile>) -> Unit)? private var previousFileCallback: ((requestCode: Int, files: List<DocumentFile>) -> Unit)?
@ -69,7 +73,9 @@ class SettingsViewModel(val activity: MainActivity) {
enableFsAccessLogs: MutableState<Boolean>, enableFsAccessLogs: MutableState<Boolean>,
enableTraceLogs: MutableState<Boolean>, enableTraceLogs: MutableState<Boolean>,
enableDebugLogs: MutableState<Boolean>, enableDebugLogs: MutableState<Boolean>,
enableGraphicsLogs: MutableState<Boolean> enableGraphicsLogs: MutableState<Boolean>,
systemLanguage: MutableState<SystemLanguage>,
regionCode: MutableState<RegionCode>
) { ) {
memoryManagerMode.value = MemoryManagerMode.entries.toTypedArray()[sharedPref.getInt("memoryManagerMode", MemoryManagerMode.HostMappedUnsafe.ordinal)] memoryManagerMode.value = MemoryManagerMode.entries.toTypedArray()[sharedPref.getInt("memoryManagerMode", MemoryManagerMode.HostMappedUnsafe.ordinal)]
useNce.value = sharedPref.getBoolean("useNce", false) useNce.value = sharedPref.getBoolean("useNce", false)
@ -102,6 +108,12 @@ class SettingsViewModel(val activity: MainActivity) {
enableTraceLogs.value = sharedPref.getBoolean("enableTraceLogs", false) enableTraceLogs.value = sharedPref.getBoolean("enableTraceLogs", false)
enableDebugLogs.value = sharedPref.getBoolean("enableDebugLogs", false) enableDebugLogs.value = sharedPref.getBoolean("enableDebugLogs", false)
enableGraphicsLogs.value = sharedPref.getBoolean("enableGraphicsLogs", false) enableGraphicsLogs.value = sharedPref.getBoolean("enableGraphicsLogs", false)
// Load language/region (strings, fallback to defaults, then .valueOf)
val langName = sharedPref.getString("system_language", "AmericanEnglish") ?: "AmericanEnglish"
val regionName = sharedPref.getString("region_code", "USA") ?: "USA"
systemLanguage.value = runCatching { SystemLanguage.valueOf(langName) }.getOrElse { SystemLanguage.AmericanEnglish }
regionCode.value = runCatching { RegionCode.valueOf(regionName) }.getOrElse { RegionCode.USA }
} }
fun save( fun save(
@ -135,7 +147,9 @@ class SettingsViewModel(val activity: MainActivity) {
enableFsAccessLogs: MutableState<Boolean>, enableFsAccessLogs: MutableState<Boolean>,
enableTraceLogs: MutableState<Boolean>, enableTraceLogs: MutableState<Boolean>,
enableDebugLogs: MutableState<Boolean>, enableDebugLogs: MutableState<Boolean>,
enableGraphicsLogs: MutableState<Boolean> enableGraphicsLogs: MutableState<Boolean>,
systemLanguage: MutableState<SystemLanguage>,
regionCode: MutableState<RegionCode>
) { ) {
sharedPref.edit { sharedPref.edit {
@ -171,6 +185,9 @@ class SettingsViewModel(val activity: MainActivity) {
putBoolean("enableDebugLogs", enableDebugLogs.value) putBoolean("enableDebugLogs", enableDebugLogs.value)
putBoolean("enableGraphicsLogs", enableGraphicsLogs.value) putBoolean("enableGraphicsLogs", enableGraphicsLogs.value)
// Save language/region as string (enum name)
putString("system_language", systemLanguage.value.name)
putString("region_code", regionCode.value.name)
} }
activity.storageHelper!!.onFolderSelected = previousFolderCallback activity.storageHelper!!.onFolderSelected = previousFolderCallback

View file

@ -43,6 +43,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.PlainTooltip import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Slider import androidx.compose.material3.Slider
import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -83,6 +84,10 @@ import org.kenjinx.android.widgets.SwitchSelector
import org.kenjinx.android.viewmodels.QuickSettings import org.kenjinx.android.viewmodels.QuickSettings
import org.kenjinx.android.viewmodels.QuickSettings.OrientationPreference import org.kenjinx.android.viewmodels.QuickSettings.OrientationPreference
// Import enums
import org.kenjinx.android.SystemLanguage
import org.kenjinx.android.RegionCode
class SettingViews { class SettingViews {
companion object { companion object {
const val EXPANSTION_TRANSITION_DURATION = 450 const val EXPANSTION_TRANSITION_DURATION = 450
@ -140,6 +145,10 @@ class SettingViews {
mutableStateOf(QuickSettings(mainViewModel.activity).orientationPreference) mutableStateOf(QuickSettings(mainViewModel.activity).orientationPreference)
} }
// Language & Region States
val systemLanguage = remember { mutableStateOf(SystemLanguage.AmericanEnglish) }
val regionCode = remember { mutableStateOf(RegionCode.USA) }
if (!loaded.value) { if (!loaded.value) {
settingsViewModel.initializeState( settingsViewModel.initializeState(
memoryManagerMode, memoryManagerMode,
@ -172,7 +181,9 @@ class SettingViews {
enableFsAccessLogs, enableFsAccessLogs,
enableTraceLogs, enableTraceLogs,
enableDebugLogs, enableDebugLogs,
enableGraphicsLogs enableGraphicsLogs,
systemLanguage,
regionCode
) )
loaded.value = true loaded.value = true
} }
@ -215,7 +226,9 @@ class SettingViews {
enableFsAccessLogs, enableFsAccessLogs,
enableTraceLogs, enableTraceLogs,
enableDebugLogs, enableDebugLogs,
enableGraphicsLogs enableGraphicsLogs,
systemLanguage,
regionCode
) )
if (!isNavigating.value) { if (!isNavigating.value) {
@ -1174,6 +1187,17 @@ class SettingViews {
} }
ExpandableView(onCardArrowClick = { }, title = "System", icon = Icons.Outlined.Settings) { ExpandableView(onCardArrowClick = { }, title = "System", icon = Icons.Outlined.Settings) {
Column(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.fillMaxWidth()) {
// Language & Region
LanguageDropdown(
selectedLanguage = systemLanguage.value,
onLanguageSelected = { lang -> systemLanguage.value = lang }
)
RegionDropdown(
selectedRegion = regionCode.value,
onRegionSelected = { reg -> regionCode.value = reg }
)
VSyncDropdown( VSyncDropdown(
selectedVSyncMode = vSyncMode.value, selectedVSyncMode = vSyncMode.value,
onModeSelected = { mode -> onModeSelected = { mode ->
@ -1296,6 +1320,71 @@ class SettingViews {
} }
} }
// ---- Dropdowns for language & region ----
@Composable
fun LanguageDropdown(
selectedLanguage: SystemLanguage,
onLanguageSelected: (SystemLanguage) -> Unit
) {
val options = SystemLanguage.entries.toTypedArray()
DropdownSelector(
label = "System Language",
selectedValue = selectedLanguage,
options = options.toList(),
getDisplayText = { lang ->
when (lang) {
SystemLanguage.Japanese -> "Japanese"
SystemLanguage.AmericanEnglish -> "English (US)"
SystemLanguage.French -> "French"
SystemLanguage.German -> "German"
SystemLanguage.Italian -> "Italian"
SystemLanguage.Spanish -> "Spanish (EU)"
SystemLanguage.Chinese -> "Chinese"
SystemLanguage.Korean -> "Korean"
SystemLanguage.Dutch -> "Dutch"
SystemLanguage.Portuguese -> "Portuguese (EU)"
SystemLanguage.Russian -> "Russian"
SystemLanguage.Taiwanese -> "Chinese (Taiwan)"
SystemLanguage.BritishEnglish -> "English (UK)"
SystemLanguage.CanadianFrench -> "French (Canada)"
SystemLanguage.LatinAmericanSpanish -> "Spanish (LatAm)"
SystemLanguage.SimplifiedChinese -> "Chinese (Simplified)"
SystemLanguage.TraditionalChinese -> "Chinese (Traditional)"
SystemLanguage.BrazilianPortuguese -> "Portuguese (Brazil)"
}
},
onOptionSelected = onLanguageSelected
)
}
@Composable
fun RegionDropdown(
selectedRegion: RegionCode,
onRegionSelected: (RegionCode) -> Unit
) {
val options = RegionCode.entries.toTypedArray()
DropdownSelector(
label = "Region",
selectedValue = selectedRegion,
options = options.toList(),
getDisplayText = { region ->
when (region) {
RegionCode.Japan -> "Japan"
RegionCode.USA -> "USA"
RegionCode.Europe -> "Europe"
RegionCode.Australia -> "Australia"
RegionCode.China -> "China"
RegionCode.Korea -> "Korea"
RegionCode.Taiwan -> "Taiwan"
}
},
onOptionSelected = onRegionSelected
)
}
// ---- Existing dropdowns ----
// ---- Dropdown for orientation ---- // ---- Dropdown for orientation ----
@Composable @Composable
fun OrientationDropdown( fun OrientationDropdown(