浏览代码

Added loader upon selecting language until data fetched

Khubaib 7 月之前
父节点
当前提交
06f750d057

+ 134 - 103
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt

@@ -48,6 +48,7 @@ import androidx.compose.material3.AlertDialog
 import androidx.compose.material3.BottomSheetDefaults
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
@@ -68,6 +69,7 @@ import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.mutableFloatStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
@@ -313,6 +315,7 @@ fun Settings(navHostController: NavHostController, activity: ComponentActivity)
                                 Log.d("smartLocationList", "L:: server = ${it.server_name}")
                             }
                         }
+                        splashViewModelSplash.mutableLiveDataLanguageStatus.value = false
                     }
 
                     splashViewModelSplash.mutableLiveDataServerData.value = null
@@ -1240,40 +1243,103 @@ fun SelectLanguage(
                 .padding(top = 15.dp)
                 .fillMaxSize()
         ) {
-            Column(
+            Box(
                 modifier = Modifier
                     .background(Color.Transparent)
                     .fillMaxSize()
                     .padding(start = 0.dp, top = 10.dp, bottom = 25.dp),
             ) {
-                AddTextSettingsLanguage(
-                    text = context.getString(R.string.select_language),
-                    size = 18.sp,
-                    color = MaterialTheme.colorScheme.primary,
-                    bottomPadding = 20.dp,
-                    startPadding = 16.dp,
-                    style = MaterialTheme.typography.customTypography.displayLarge.copy(
-                        color = MaterialTheme.colorScheme.primary
-                    ),
-                )
-                Column(
-                    verticalArrangement = Arrangement.Top,
-                    horizontalAlignment = Alignment.Start,
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .verticalScroll(rememberScrollState())
-                        .padding(top = 0.dp)
-                ) {
-                    languages.forEach { language ->
-                        Row(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(80.dp)
-                                .background(
-                                    Color.Transparent
-                                )
-                                .padding(start = 2.dp, top = 15.dp)
-                                .selectable(
+                if (splashViewModelSplash.liveDataLanguageStatus.observeAsState().value == true) {
+                    var progress by remember { mutableFloatStateOf(0.1F) }
+
+                    LaunchedEffect(key1 = Unit) {
+                        while (true) {
+                            for (i in 1..100) {
+                                progress = i.toFloat()/100F
+                                delay(20)
+                            }
+                            progress = 0.1F
+                        }
+                    }
+
+                    CircularProgressIndicator(
+                        progress = { progress },
+                        modifier = Modifier
+                            .size(50.dp)
+                            .align(Alignment.Center)
+                        ,
+                        color = colorResource(id = R.color.yellow_text),
+                        strokeWidth = 5.dp,
+                    )
+                }
+
+                Column() {
+                    AddTextSettingsLanguage(
+                        text = context.getString(R.string.select_language),
+                        size = 18.sp,
+                        color = MaterialTheme.colorScheme.primary,
+                        bottomPadding = 20.dp,
+                        startPadding = 16.dp,
+                        style = MaterialTheme.typography.customTypography.displayLarge.copy(
+                            color = MaterialTheme.colorScheme.primary
+                        ),
+                    )
+                    Column(
+                        verticalArrangement = Arrangement.Top,
+                        horizontalAlignment = Alignment.Start,
+                        modifier = Modifier
+                            .fillMaxSize()
+                            .verticalScroll(rememberScrollState())
+                            .padding(top = 0.dp)
+                    ) {
+                        languages.forEach { language ->
+                            Row(
+                                modifier = Modifier
+                                    .fillMaxWidth()
+                                    .height(80.dp)
+                                    .background(
+                                        Color.Transparent
+                                    )
+                                    .padding(start = 2.dp, top = 15.dp)
+                                    .selectable(
+                                        selected = selectedLanguage == language.identifier,
+                                        onClick = {
+                                            selectedLanguage = language.identifier
+                                            basePreferenceHelper.saveLanguage(selectedLanguage)
+
+                                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                                                context.getSystemService(LocaleManager::class.java).applicationLocales =
+                                                    LocaleList.forLanguageTags(language.identifier)
+                                            } else {
+                                                AppCompatDelegate.setApplicationLocales(
+                                                    LocaleListCompat.forLanguageTags(
+                                                        language.identifier
+                                                    )
+                                                )
+                                                context.resources.updateConfiguration(
+                                                    context.resources.configuration.apply {
+                                                        setLocale(Locale.forLanguageTag(language.identifier))
+                                                    },
+                                                    context.resources.displayMetrics
+                                                )
+                                                changeLanguage(context.getString(R.string.settings))
+                                            }
+
+                                            splashViewModelSplash.mutableLiveDataLanguageStatus.value = true
+                                            splashViewModelSplash.serverDataApi()
+//                                        isLanguageSheetOpen = false
+                                        },
+                                    )
+//                                    .indication(
+//                                        indication = null,
+//                                        interactionSource = remember {
+//                                            MutableInteractionSource()
+//                                        }
+//                                    )
+                                ,
+                                verticalAlignment = Alignment.CenterVertically
+                            ) {
+                                RadioButton(
                                     selected = selectedLanguage == language.identifier,
                                     onClick = {
                                         selectedLanguage = language.identifier
@@ -1282,7 +1348,8 @@ fun SelectLanguage(
                                         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                                             context.getSystemService(LocaleManager::class.java).applicationLocales =
                                                 LocaleList.forLanguageTags(language.identifier)
-                                        } else {
+                                        }
+                                        else {
                                             AppCompatDelegate.setApplicationLocales(
                                                 LocaleListCompat.forLanguageTags(
                                                     language.identifier
@@ -1297,87 +1364,51 @@ fun SelectLanguage(
                                             changeLanguage(context.getString(R.string.settings))
                                         }
 
+                                        splashViewModelSplash.mutableLiveDataLanguageStatus.value = true
                                         splashViewModelSplash.serverDataApi()
-//                                        isLanguageSheetOpen = false
-                                    },
-                                )
-//                                    .indication(
-//                                        indication = null,
-//                                        interactionSource = remember {
-//                                            MutableInteractionSource()
-//                                        }
-//                                    )
-                            ,
-                            verticalAlignment = Alignment.CenterVertically
-                        ) {
-                            RadioButton(
-                                selected = selectedLanguage == language.identifier,
-                                onClick = {
-                                    selectedLanguage = language.identifier
-                                    basePreferenceHelper.saveLanguage(selectedLanguage)
-
-                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-                                        context.getSystemService(LocaleManager::class.java).applicationLocales =
-                                            LocaleList.forLanguageTags(language.identifier)
-                                    }
-                                    else {
-                                        AppCompatDelegate.setApplicationLocales(
-                                            LocaleListCompat.forLanguageTags(
-                                                language.identifier
-                                            )
-                                        )
-                                        context.resources.updateConfiguration(
-                                            context.resources.configuration.apply {
-                                                setLocale(Locale.forLanguageTag(language.identifier))
-                                            },
-                                            context.resources.displayMetrics
-                                        )
-                                        changeLanguage(context.getString(R.string.settings))
-                                    }
-
-                                    splashViewModelSplash.serverDataApi()
 //                                    isLanguageSheetOpen = false
-                                },
-                                colors = RadioButtonDefaults.colors(
-                                    selectedColor = colorResource(id = R.color.radio_button_blue),
-                                    unselectedColor = colorResource(id = R.color.gray_icon),
-                                ),
-                                modifier = Modifier.align(Alignment.CenterVertically)
-                            )
-                            Column(
-                                modifier = Modifier
-                                    .fillMaxWidth()
-                                    .fillMaxHeight()
-                                    .padding(start = 5.dp)
-                                    .background(
-                                        Color.Transparent
-                                    ),
-                                verticalArrangement = Arrangement.Center
-                            ) {
-                                Text(text = language.title,
-                                    modifier = Modifier.padding(start = 0.dp),
-                                    style = MaterialTheme.typography.customTypography.displayLarge.copy(
-                                        fontSize = 16.sp
+                                    },
+                                    colors = RadioButtonDefaults.colors(
+                                        selectedColor = colorResource(id = R.color.radio_button_blue),
+                                        unselectedColor = colorResource(id = R.color.gray_icon),
                                     ),
-                                    color = MaterialTheme.colorScheme.primary
+                                    modifier = Modifier.align(Alignment.CenterVertically)
                                 )
-                                Text(text = language.subTitle,
-                                    style = MaterialTheme.typography.bodySmall,
-                                    color = MaterialTheme.colorScheme.primary,
+                                Column(
                                     modifier = Modifier
-                                        .padding(top = 2.dp)
-                                        .alpha(0.4f),
+                                        .fillMaxWidth()
+                                        .fillMaxHeight()
+                                        .padding(start = 5.dp)
+                                        .background(
+                                            Color.Transparent
+                                        ),
+                                    verticalArrangement = Arrangement.Center
+                                ) {
+                                    Text(text = language.title,
+                                        modifier = Modifier.padding(start = 0.dp),
+                                        style = MaterialTheme.typography.customTypography.displayLarge.copy(
+                                            fontSize = 16.sp
+                                        ),
+                                        color = MaterialTheme.colorScheme.primary
+                                    )
+                                    Text(text = language.subTitle,
+                                        style = MaterialTheme.typography.bodySmall,
+                                        color = MaterialTheme.colorScheme.primary,
+                                        modifier = Modifier
+                                            .padding(top = 2.dp)
+                                            .alpha(0.4f),
                                     )
+                                }
                             }
+                            Surface(
+                                modifier = Modifier
+                                    .padding(start = 55.dp)
+                                    .height(1.dp)
+                                    .fillMaxWidth()
+                                    .alpha(0.2F),
+                                color = colorResource(id = R.color.gray_icon)
+                            ) {}
                         }
-                        Surface(
-                            modifier = Modifier
-                                .padding(start = 55.dp)
-                                .height(1.dp)
-                                .fillMaxWidth()
-                                .alpha(0.2F),
-                            color = colorResource(id = R.color.gray_icon)
-                        ) {}
                     }
                 }
             }

+ 7 - 0
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SplashViewModel.kt

@@ -23,6 +23,9 @@ class SplashViewModel constructor(context: Context): ViewModel() {
     var mutableLiveDataServerData = MutableLiveData<DataResponseServers<ArrayList<ServerData>>>()
     var liveDataServerData: LiveData<DataResponseServers<ArrayList<ServerData>>> = mutableLiveDataServerData
 
+    var mutableLiveDataLanguageStatus = MutableLiveData<Boolean>(false)
+    var liveDataLanguageStatus: LiveData<Boolean> = mutableLiveDataLanguageStatus
+
     var preferenceHelper: BasePreferenceHelper
     var context: Context
 
@@ -85,9 +88,13 @@ class SplashViewModel constructor(context: Context): ViewModel() {
                 }
 
                 override fun onFail(call: Call<Any>?, response: Any?) {
+                    Log.d("test_api_response_s", "serverDataApi onFail")
+                    mutableLiveDataLanguageStatus.value = false
                 }
 
                 override fun onError(call: Call<Any>?, response: Any?) {
+                    Log.d("test_api_response_s", "serverDataApi onError")
+                    mutableLiveDataLanguageStatus.value = false
                 }
 
             }