From 48e7497e790c88a2fad4234f6bc7c4b179bd887e Mon Sep 17 00:00:00 2001 From: white Date: Thu, 16 Oct 2025 15:45:19 +0300 Subject: [PATCH] add no hosts dialog, optimize imports --- .../ui/screen/StrategySelectionScreen.kt | 21 ++++++++++++++++++- .../viewmodel/StrategySelectionViewModel.kt | 11 +++++++++- app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cherret/zaprett/ui/screen/StrategySelectionScreen.kt b/app/src/main/java/com/cherret/zaprett/ui/screen/StrategySelectionScreen.kt index c598caa..eaab966 100644 --- a/app/src/main/java/com/cherret/zaprett/ui/screen/StrategySelectionScreen.kt +++ b/app/src/main/java/com/cherret/zaprett/ui/screen/StrategySelectionScreen.kt @@ -37,6 +37,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.TextButton import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -45,7 +46,6 @@ import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.cherret.zaprett.R -import com.cherret.zaprett.byedpi.ByeDpiVpnService import com.cherret.zaprett.ui.component.StrategySelectionItem import com.cherret.zaprett.ui.viewmodel.StrategySelectionViewModel import kotlinx.coroutines.launch @@ -122,6 +122,7 @@ fun StrategySelectionScreen(navController: NavController, vpnLauncher: ActivityR horizontalArrangement = Arrangement.Center ) { + NoHostsCard(viewModel.noHostsCard) FilledTonalButton( onClick = { viewModel.viewModelScope.launch { @@ -175,3 +176,21 @@ fun InfoAlert(onDismiss: () -> Unit) { ) } +@Composable +private fun NoHostsCard(noHostsCard: MutableState) { + if (noHostsCard.value) { + AlertDialog( + title = { Text(text = stringResource(R.string.selection_no_hosts_title)) }, + text = { Text(text = stringResource(R.string.selection_no_hosts_message)) }, + onDismissRequest = { + noHostsCard.value = false + }, + confirmButton = { + TextButton(onClick = { noHostsCard.value = false }) { + Text(stringResource(R.string.btn_continue)) + } + } + ) + } +} + diff --git a/app/src/main/java/com/cherret/zaprett/ui/viewmodel/StrategySelectionViewModel.kt b/app/src/main/java/com/cherret/zaprett/ui/viewmodel/StrategySelectionViewModel.kt index a9197a3..30237e3 100644 --- a/app/src/main/java/com/cherret/zaprett/ui/viewmodel/StrategySelectionViewModel.kt +++ b/app/src/main/java/com/cherret/zaprett/ui/viewmodel/StrategySelectionViewModel.kt @@ -5,6 +5,7 @@ import android.content.Context.MODE_PRIVATE import android.content.Intent import android.util.Log import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf import androidx.core.content.ContextCompat import androidx.lifecycle.AndroidViewModel import com.cherret.zaprett.R @@ -14,6 +15,7 @@ import com.cherret.zaprett.data.StrategyCheckResult import com.cherret.zaprett.utils.disableStrategy import com.cherret.zaprett.utils.enableStrategy import com.cherret.zaprett.utils.getActiveLists +import com.cherret.zaprett.utils.getActiveStrategy import com.cherret.zaprett.utils.getAllStrategies import com.cherret.zaprett.utils.getStatus import com.cherret.zaprett.utils.startService @@ -41,11 +43,13 @@ class StrategySelectionViewModel(application: Application) : AndroidViewModel(ap private val _requestVpnPermission = MutableStateFlow(false) val requestVpnPermission = _requestVpnPermission.asStateFlow() - val strategyStates = mutableStateListOf() + var noHostsCard = mutableStateOf(false) + private set init { loadStrategies() + checkHosts() } fun loadStrategies() { @@ -165,6 +169,11 @@ class StrategySelectionViewModel(application: Application) : AndroidViewModel(ap strategyStates.clear() strategyStates.addAll(sorted) } + + fun checkHosts() { + if (getActiveLists(prefs).isEmpty()) noHostsCard.value = true + Log.d("getActiveLists.isEmpty", getActiveLists(prefs).isEmpty().toString()) + } fun startVpn() { ContextCompat.startForegroundService(context, Intent(context, ByeDpiVpnService::class.java).apply { action = "START_VPN" }) } diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ef47fe0..4026852 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -114,4 +114,6 @@ Введите таймаут пробы Информация "В этом разделе настроек приложения представлен перебор стратегий\n Подбор проходит среди скачанных стратегий, поэтому заранее скачайте из репозитория или добавьте из файловой системы интересующие вас стратегии для сравнения. \n Перед началом так же выберете один или несколько листов доменов на вкладке \"Листы\", затем нажмите на \"Начать подбор\". Не используйте для перебора списки с большим количеством доменов." + Нет активных листов + Не обнаружено активных списков хостов, включите один или несколько, иначе подбор не сработает \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9fa5412..afb2522 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -119,4 +119,6 @@ Enter probe timeout Tip This section of the application settings allows you to iterate through strategies.\n The selection is based on downloaded strategies, so download the strategies you\'re interested in from the repository or add them from the file system for comparison.\n Before starting, select one or more domain lists in the \"Lists\" tab, then click \"Start selection\". Avoid using lists with a large number of domains. + No active hosts + No active host lists found, please enable one or more, otherwise the selection will not work \ No newline at end of file