From c691a1adb2827a9cca6d1652e9b619bb39d60029 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 14 Feb 2023 12:01:05 +0800 Subject: [PATCH] manager: Add reboot shortcut for module screen --- .../me/weishu/kernelsu/ui/screen/Module.kt | 150 +++++++++--------- .../app/src/main/res/values-ja/strings.xml | 4 +- .../app/src/main/res/values-ru/strings.xml | 1 + .../app/src/main/res/values-vi/strings.xml | 1 + .../src/main/res/values-zh-rCN/strings.xml | 1 + .../src/main/res/values-zh-rHK/strings.xml | 1 + .../src/main/res/values-zh-rTW/strings.xml | 1 + manager/app/src/main/res/values/strings.xml | 1 + 8 files changed, 84 insertions(+), 76 deletions(-) diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt index 02926af5..ee0b7902 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt @@ -31,10 +31,7 @@ import kotlinx.coroutines.launch import me.weishu.kernelsu.Natives import me.weishu.kernelsu.R import me.weishu.kernelsu.ui.screen.destinations.InstallScreenDestination -import me.weishu.kernelsu.ui.util.LocalSnackbarHost -import me.weishu.kernelsu.ui.util.overlayFsAvailable -import me.weishu.kernelsu.ui.util.toggleModule -import me.weishu.kernelsu.ui.util.uninstallModule +import me.weishu.kernelsu.ui.util.* import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -54,42 +51,39 @@ fun ModuleScreen(navigator: DestinationsNavigator) { val isSafeMode = Natives.isSafeMode() - Scaffold( - topBar = { - TopBar() - }, - floatingActionButton = if (isSafeMode) { - { /* Empty */ } - } else { - { - val moduleInstall = stringResource(id = R.string.module_install) - val selectZipLauncher = rememberLauncherForActivityResult( - contract = ActivityResultContracts.StartActivityForResult() - ) { - if (it.resultCode != RESULT_OK) { - return@rememberLauncherForActivityResult - } - val data = it.data ?: return@rememberLauncherForActivityResult - val uri = data.data ?: return@rememberLauncherForActivityResult - - navigator.navigate(InstallScreenDestination(uri)) - - Log.i("ModuleScreen", "select zip result: ${it.data}") + Scaffold(topBar = { + TopBar() + }, floatingActionButton = if (isSafeMode) { + { /* Empty */ } + } else { + { + val moduleInstall = stringResource(id = R.string.module_install) + val selectZipLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { + if (it.resultCode != RESULT_OK) { + return@rememberLauncherForActivityResult } + val data = it.data ?: return@rememberLauncherForActivityResult + val uri = data.data ?: return@rememberLauncherForActivityResult - ExtendedFloatingActionButton( - onClick = { - // select the zip file to install - val intent = Intent(Intent.ACTION_GET_CONTENT) - intent.type = "application/zip" - selectZipLauncher.launch(intent) - }, - icon = { Icon(Icons.Filled.Add, moduleInstall) }, - text = { Text(text = moduleInstall) }, - ) + navigator.navigate(InstallScreenDestination(uri)) + + Log.i("ModuleScreen", "select zip result: ${it.data}") } + + ExtendedFloatingActionButton( + onClick = { + // select the zip file to install + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.type = "application/zip" + selectZipLauncher.launch(intent) + }, + icon = { Icon(Icons.Filled.Add, moduleInstall) }, + text = { Text(text = moduleInstall) }, + ) } - ) { innerPadding -> + }) { innerPadding -> val failedEnable = stringResource(R.string.module_failed_to_enable) val failedDisable = stringResource(R.string.module_failed_to_disable) val failedUninstall = stringResource(R.string.module_uninstall_failed) @@ -103,11 +97,9 @@ fun ModuleScreen(navigator: DestinationsNavigator) { return@Scaffold } SwipeRefresh( - state = swipeState, - onRefresh = { + state = swipeState, onRefresh = { scope.launch { viewModel.fetchModuleList() } - }, - modifier = Modifier + }, modifier = Modifier .padding(innerPadding) .padding(16.dp) .fillMaxSize() @@ -127,42 +119,54 @@ fun ModuleScreen(navigator: DestinationsNavigator) { Text(stringResource(R.string.module_empty)) } } else { - LazyColumn( - verticalArrangement = Arrangement.spacedBy(15.dp), - contentPadding = remember { PaddingValues(bottom = 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */) } - ) { + LazyColumn(verticalArrangement = Arrangement.spacedBy(15.dp), + contentPadding = remember { PaddingValues(bottom = 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */) }) { items(viewModel.moduleList) { module -> var isChecked by rememberSaveable(module) { mutableStateOf(module.enabled) } - ModuleItem(module, - isChecked, - onUninstall = { - scope.launch { - val result = uninstallModule(module.id) - if (result) { - viewModel.fetchModuleList() - } - snackBarHost.showSnackbar( - if (result) { - successUninstall.format(module.name) - } else { - failedUninstall.format(module.name) - } - ) - } - }, - onCheckChanged = { - val success = toggleModule(module.id, !isChecked) + val reboot = stringResource(id = R.string.reboot) + val rebootToApply = stringResource(id = R.string.reboot_to_apply) + ModuleItem(module, isChecked, onUninstall = { + scope.launch { + val success = uninstallModule(module.id) if (success) { - isChecked = it - scope.launch { - viewModel.fetchModuleList() - } - } else scope.launch { - val message = if (isChecked) failedDisable else failedEnable - snackBarHost.showSnackbar(message.format(module.name)) + viewModel.fetchModuleList() + } + val message = if (success) { + successUninstall.format(module.name) + } else { + failedUninstall.format(module.name) + } + val actionLabel = if (success) { + reboot + } else { + null + } + val result = snackBarHost.showSnackbar( + message, actionLabel = actionLabel + ) + if (result == SnackbarResult.ActionPerformed) { + reboot() } } - ) + }, onCheckChanged = { + val success = toggleModule(module.id, !isChecked) + if (success) { + isChecked = it + scope.launch { + viewModel.fetchModuleList() + + val result = snackBarHost.showSnackbar( + rebootToApply, actionLabel = reboot + ) + if (result == SnackbarResult.ActionPerformed) { + reboot() + } + } + } else scope.launch { + val message = if (isChecked) failedDisable else failedEnable + snackBarHost.showSnackbar(message.format(module.name)) + } + }) // fix last item shadow incomplete in LazyColumn Spacer(Modifier.height(1.dp)) } @@ -175,9 +179,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) { @OptIn(ExperimentalMaterial3Api::class) @Composable private fun TopBar() { - TopAppBar( - title = { Text(stringResource(R.string.module)) } - ) + TopAppBar(title = { Text(stringResource(R.string.module)) }) } @Composable diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index 39ca720f..7270d224 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -1,8 +1,7 @@  セーフモード - KernelSU - ホーム + ホーム 未インストール タップでインストール 動作中 @@ -52,4 +51,5 @@ システムアプリを表示 システムアプリを非表示 ログを送信 + 再起動して有効にする \ No newline at end of file diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml index 79ba0a06..ae6ac7ca 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -53,5 +53,6 @@ Скрыть системные приложения Отправить лог Безопасный режим + Перезагрузите, чтобы вступить в силу diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index 5e8e5440..c3b4fedb 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -49,4 +49,5 @@ Hiển thị ứng dụng hệ thống Ẩn ứng dụng hệ thống Chế độ an toàn + Khởi động lại để có hiệu lực 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 7fb11ea5..e756fae9 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -51,4 +51,5 @@ 隐藏系统应用 发送日志 安全模式 + 重启生效 diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml index 19659711..b2602a3a 100644 --- a/manager/app/src/main/res/values-zh-rHK/strings.xml +++ b/manager/app/src/main/res/values-zh-rHK/strings.xml @@ -47,4 +47,5 @@ 作者 內核不支持 overlayfs,模塊功能無法運作! 安全模式 + 重啟生效 diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml index 3922c73f..ac791e48 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -50,4 +50,5 @@ 顯示系統應用程式 隱藏系統應用程式 安全模式 + 重啟生效 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 8099a608..927e46d4 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -55,5 +55,6 @@ Hide system apps Send Log Safe mode + Reboot to take effect