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