From e5f5b8f831d4a4ddff2b7231b155beccd87c8ced Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Tue, 1 Apr 2025 17:04:00 +0800 Subject: [PATCH] Add input dialogs to the KPM module to optimize control logic and display Snackbar prompts for operation results. --- .../shirkneko/zako/sukisu/ui/screen/Home.kt | 27 +++++----- .../shirkneko/zako/sukisu/ui/screen/kpm.kt | 50 ++++++++++++++----- .../zako/sukisu/ui/viewmodel/KpmViewModel.kt | 32 ++++++++++++ .../src/main/res/values-zh-rCN/strings.xml | 3 +- manager/app/src/main/res/values/strings.xml | 2 +- 5 files changed, 88 insertions(+), 26 deletions(-) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt index a6fc7fc0..51fc6f33 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt @@ -51,6 +51,7 @@ import androidx.compose.animation.shrinkVertically import androidx.compose.runtime.saveable.rememberSaveable import shirkneko.zako.sukisu.ui.theme.CardConfig import androidx.core.content.edit +import kotlin.random.Random @OptIn(ExperimentalMaterial3Api::class) @Destination(start = true) @@ -406,6 +407,8 @@ fun WarningCard( } @Composable fun ContributionCard() { + val uriHandler = LocalUriHandler.current + val links = listOf("https://github.com/ShirkNeko", "https://github.com/udochina") ElevatedCard( colors = getCardColors(MaterialTheme.colorScheme.secondaryContainer), elevation = CardDefaults.cardElevation(defaultElevation = getCardElevation()) @@ -413,6 +416,10 @@ fun ContributionCard() { Row( modifier = Modifier .fillMaxWidth() + .clickable { + val randomIndex = Random.nextInt(links.size) + uriHandler.openUri(links[randomIndex]) + } .padding(24.dp), verticalAlignment = Alignment.CenterVertically ) { @@ -548,19 +555,15 @@ private fun InfoCard() { InfoCardItem(stringResource(R.string.home_selinux_status), getSELinuxStatus()) - if (!isSimpleMode) { - var showKpmVersion by remember { mutableStateOf(true) } - LaunchedEffect(Unit) { - try { - getKpmVersion() - } catch (e: Exception) { - showKpmVersion = false - } - } - AnimatedVisibility(visible = showKpmVersion) { - Spacer(Modifier.height(16.dp)) - InfoCardItem(stringResource(R.string.home_kpm_version), getKpmVersion()) + if (!isSimpleMode){ + Spacer(Modifier.height(16.dp)) + val kpmVersion = getKpmVersion() + val displayVersion = if (kpmVersion.isEmpty() || kpmVersion.startsWith("Error")) { + stringResource(R.string.not_supported) + } else { + kpmVersion } + InfoCardItem(stringResource(R.string.home_kpm_version), displayVersion) } diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt index 3d8574da..3ab01997 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt @@ -276,10 +276,46 @@ private fun KpmModuleItem( val viewModel: KpmViewModel = viewModel() val scope = rememberCoroutineScope() val snackBarHost = remember { SnackbarHostState() } - val successMessage = stringResource(R.string.kpm_control_success) val failureMessage = stringResource(R.string.kpm_control_failed) + if (viewModel.showInputDialog && viewModel.selectedModuleId == module.id) { + AlertDialog( + onDismissRequest = { viewModel.hideInputDialog() }, + title = { Text(stringResource(R.string.kpm_control)) }, + text = { + OutlinedTextField( + value = viewModel.inputArgs, + onValueChange = { viewModel.updateInputArgs(it) }, + label = { Text(stringResource(R.string.kpm_args)) }, + placeholder = { Text(module.args) } + ) + }, + confirmButton = { + TextButton( + onClick = { + scope.launch { + val result = viewModel.executeControl() + val message = when (result) { + 0 -> successMessage + else -> failureMessage + } + snackBarHost.showSnackbar(message) + onControl() + } + } + ) { + Text(stringResource(R.string.confirm)) + } + }, + dismissButton = { + TextButton(onClick = { viewModel.hideInputDialog() }) { + Text(stringResource(R.string.cancel)) + } + } + ) + } + ElevatedCard( colors = getCardColors(MaterialTheme.colorScheme.secondaryContainer), elevation = CardDefaults.cardElevation(defaultElevation = getCardElevation()) @@ -326,17 +362,7 @@ private fun KpmModuleItem( horizontalArrangement = Arrangement.spacedBy(8.dp) ) { FilledTonalButton( - onClick = { - scope.launch { - val result = viewModel.controlModule(module.id, module.args) - val message = when (result) { - 0 -> successMessage - else -> failureMessage - } - snackBarHost.showSnackbar(message) - onControl() - } - }, + onClick = { viewModel.showInputDialog(module.id) }, enabled = module.hasAction ) { Icon( diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/viewmodel/KpmViewModel.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/viewmodel/KpmViewModel.kt index da49c1b2..8de6660e 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/viewmodel/KpmViewModel.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/viewmodel/KpmViewModel.kt @@ -111,6 +111,38 @@ class KpmViewModel : ViewModel() { } } } + + var showInputDialog by mutableStateOf(false) + private set + + var selectedModuleId by mutableStateOf(null) + private set + + var inputArgs by mutableStateOf("") + private set + + fun showInputDialog(moduleId: String) { + selectedModuleId = moduleId + showInputDialog = true + } + + fun hideInputDialog() { + showInputDialog = false + selectedModuleId = null + inputArgs = "" + } + + fun updateInputArgs(args: String) { + inputArgs = args + } + + fun executeControl(): Int { + val moduleId = selectedModuleId ?: return -1 + val result = controlKpmModule(moduleId, inputArgs) + hideInputDialog() + return result + } + fun controlModule(moduleId: String, args: String? = null): Int { return try { val result = controlKpmModule(moduleId, args) diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml index 217aae2c..cf8d3779 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -225,7 +225,6 @@ 暂无已安装的内核模块 版本 作者 - 执行 卸载 确定要卸载内核模块 %1$s 吗? 卸载成功 @@ -235,9 +234,11 @@ 加载kpm模块成功 加载kpm模块失败 KPM 版本 + 执行 关闭 成功 错误 + 不支持 以下内核模块功能由KernelPatch开发,经过修改后加入SukiSU Ultra的内核模块功能 SukiSU Ultra展望 SukiSU Ultra未来将会成为一个相对独立的KSU分支,但是依然感谢官方KernelSU和MKSU等做出的贡献 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index dbeb0674..a38c2904 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -227,7 +227,6 @@ No installed kernel modules at this time releases author - fulfillment uninstallation Determine the kernel module to uninstall: %1$s ? Uninstalled successfully @@ -245,4 +244,5 @@ success failed SukiSU Ultra will be a relatively independent branch of KSU in the future, but thanks to the official KernelSU and MKSU etc. for their contributions! + unsupported