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 }