PickLanguageScreen.kt (4888B) - raw
1 package me.rhunk.snapenhance.ui.setup.screens.impl 2 3 import androidx.compose.foundation.clickable 4 import androidx.compose.foundation.gestures.Orientation 5 import androidx.compose.foundation.gestures.scrollable 6 import androidx.compose.foundation.layout.Box 7 import androidx.compose.foundation.layout.fillMaxWidth 8 import androidx.compose.foundation.layout.height 9 import androidx.compose.foundation.layout.padding 10 import androidx.compose.foundation.lazy.LazyColumn 11 import androidx.compose.foundation.lazy.items 12 import androidx.compose.foundation.rememberScrollState 13 import androidx.compose.material3.Button 14 import androidx.compose.material3.MaterialTheme 15 import androidx.compose.material3.Surface 16 import androidx.compose.material3.Text 17 import androidx.compose.runtime.Composable 18 import androidx.compose.runtime.getValue 19 import androidx.compose.runtime.mutableStateOf 20 import androidx.compose.runtime.remember 21 import androidx.compose.runtime.setValue 22 import androidx.compose.ui.Alignment 23 import androidx.compose.ui.Modifier 24 import androidx.compose.ui.text.font.FontWeight 25 import androidx.compose.ui.unit.dp 26 import androidx.compose.ui.unit.sp 27 import androidx.compose.ui.window.Dialog 28 import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper 29 import me.rhunk.snapenhance.ui.setup.screens.SetupScreen 30 import me.rhunk.snapenhance.ui.util.ObservableMutableState 31 import java.util.Locale 32 33 34 class PickLanguageScreen : SetupScreen(){ 35 private val availableLocales by lazy { 36 LocaleWrapper.fetchAvailableLocales(context.androidContext) 37 } 38 39 private lateinit var selectedLocale: ObservableMutableState<String> 40 41 private fun getLocaleDisplayName(locale: String): String { 42 locale.split("_").let { 43 if (it.size != 2) return Locale(locale).getDisplayName(Locale.getDefault()) 44 return Locale(it[0], it[1]).getDisplayName(Locale.getDefault()) 45 } 46 } 47 48 private fun reloadTranslation(selectedLocale: String) { 49 context.translation.reload(selectedLocale) 50 } 51 52 private fun setLocale(locale: String) { 53 with(context) { 54 config.locale = locale 55 config.writeConfig() 56 reloadTranslation(locale) 57 } 58 } 59 60 override fun onLeave() { 61 context.config.locale = selectedLocale.value 62 context.config.writeConfig() 63 } 64 65 override fun init() { 66 val deviceLocale = Locale.getDefault().toString() 67 selectedLocale = 68 ObservableMutableState( 69 defaultValue = availableLocales.firstOrNull { 70 locale -> locale == deviceLocale 71 } ?: LocaleWrapper.DEFAULT_LOCALE 72 ) { _, newValue -> 73 setLocale(newValue) 74 }.also { reloadTranslation(it.value) } 75 } 76 77 @Composable 78 override fun Content() { 79 allowNext(true) 80 81 DialogText(text = context.translation["setup.dialogs.select_language"]) 82 83 var isDialog by remember { mutableStateOf(false) } 84 85 if (isDialog) { 86 Dialog(onDismissRequest = { isDialog = false }) { 87 Surface( 88 modifier = Modifier 89 .padding(10.dp) 90 .fillMaxWidth(), 91 shape = MaterialTheme.shapes.medium 92 ) { 93 LazyColumn( 94 modifier = Modifier.scrollable(rememberScrollState(), orientation = Orientation.Vertical) 95 ) { 96 items(availableLocales) { locale -> 97 Box( 98 modifier = Modifier 99 .height(70.dp) 100 .fillMaxWidth() 101 .clickable { 102 selectedLocale.value = locale 103 isDialog = false 104 }, 105 contentAlignment = Alignment.Center 106 ) { 107 Text( 108 text = remember(locale) { getLocaleDisplayName(locale) }, 109 fontSize = 16.sp, 110 fontWeight = FontWeight.Light, 111 ) 112 } 113 } 114 } 115 } 116 } 117 } 118 119 Box( 120 modifier = Modifier 121 .padding(top = 40.dp) 122 .fillMaxWidth(), 123 contentAlignment = Alignment.Center 124 ) { 125 Button(onClick = { 126 isDialog = true 127 }) { 128 Text(text = remember(selectedLocale.value) { getLocaleDisplayName(selectedLocale.value) }, fontSize = 16.sp, 129 fontWeight = FontWeight.Normal) 130 } 131 } 132 } 133 }