diff --git a/manager/app/src/main/cpp/jni.cc b/manager/app/src/main/cpp/jni.cc
index 165ba7b2..86258709 100644
--- a/manager/app/src/main/cpp/jni.cc
+++ b/manager/app/src/main/cpp/jni.cc
@@ -61,3 +61,9 @@ Java_me_weishu_kernelsu_Natives_allowRoot(JNIEnv *env, jclass clazz, jint uid, j
}
+
+extern "C"
+JNIEXPORT jboolean JNICALL
+Java_me_weishu_kernelsu_Natives_isSafeMode(JNIEnv *env, jclass clazz) {
+ return is_safe_mode();
+}
\ No newline at end of file
diff --git a/manager/app/src/main/cpp/ksu.cc b/manager/app/src/main/cpp/ksu.cc
index 6cb083f1..f743ff29 100644
--- a/manager/app/src/main/cpp/ksu.cc
+++ b/manager/app/src/main/cpp/ksu.cc
@@ -19,6 +19,7 @@
#define CMD_DENY_SU 4
#define CMD_GET_ALLOW_LIST 5
#define CMD_GET_DENY_LIST 6
+#define CMD_CHECK_SAFEMODE 9
static bool ksuctl(int cmd, void* arg1, void* arg2) {
int32_t result = 0;
@@ -51,4 +52,8 @@ bool get_allow_list(int *uids, int *size) {
bool get_deny_list(int *uids, int *size) {
return ksuctl(CMD_GET_DENY_LIST, uids, size);
+}
+
+bool is_safe_mode() {
+ return ksuctl(CMD_CHECK_SAFEMODE, nullptr, nullptr);
}
\ No newline at end of file
diff --git a/manager/app/src/main/cpp/ksu.h b/manager/app/src/main/cpp/ksu.h
index 6a6758cc..96841de8 100644
--- a/manager/app/src/main/cpp/ksu.h
+++ b/manager/app/src/main/cpp/ksu.h
@@ -15,4 +15,6 @@ bool get_allow_list(int *uids, int *size);
bool get_deny_list(int *uids, int *size);
+bool is_safe_mode();
+
#endif //KERNELSU_KSU_H
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/Natives.java b/manager/app/src/main/java/me/weishu/kernelsu/Natives.java
index a8e8cfa4..bed5713a 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/Natives.java
+++ b/manager/app/src/main/java/me/weishu/kernelsu/Natives.java
@@ -21,4 +21,6 @@ public final class Natives {
public static native int[] getDenyList();
public static native boolean allowRoot(int uid, boolean allow);
+
+ public static native boolean isSafeMode();
}
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 10e3b19b..c4b29375 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
@@ -52,36 +52,42 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
}
}
+ val isSafeMode = Natives.isSafeMode()
+
Scaffold(
topBar = {
TopBar()
},
- floatingActionButton = {
- val moduleInstall = stringResource(id = R.string.module_install)
- val selectZipLauncher = rememberLauncherForActivityResult(
- contract = ActivityResultContracts.StartActivityForResult()
- ) {
- if (it.resultCode != RESULT_OK) {
- return@rememberLauncherForActivityResult
+ 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}")
}
- val data = it.data ?: return@rememberLauncherForActivityResult
- val uri = data.data ?: return@rememberLauncherForActivityResult
- 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) },
+ )
}
-
- 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 ->
val failedEnable = stringResource(R.string.module_failed_to_enable)
@@ -96,6 +102,12 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
}
return@Scaffold
}
+ if (isSafeMode) {
+ Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(stringResource(R.string.safe_mode_disable_module))
+ }
+ return@Scaffold
+ }
SwipeRefresh(
state = swipeState,
onRefresh = {
@@ -123,7 +135,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
} else {
LazyColumn(
verticalArrangement = Arrangement.spacedBy(15.dp),
- contentPadding = remember { PaddingValues(bottom = 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */ ) }
+ 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) }
diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml
index 95ac4e0c..5f43f565 100644
--- a/manager/app/src/main/res/values-ja/strings.xml
+++ b/manager/app/src/main/res/values-ja/strings.xml
@@ -1,6 +1,7 @@
- KernelSU
+ セーフモード、すべてのモッドが無効になっています!
+ KernelSU
ホーム
未インストール
タップでインストール
diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml
index 0091a018..24a5a376 100644
--- a/manager/app/src/main/res/values-ru/strings.xml
+++ b/manager/app/src/main/res/values-ru/strings.xml
@@ -52,5 +52,6 @@
Показать системные приложения
Скрыть системные приложения
Отправить лог
+ Безопасный режим, все моды отключены!
diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml
index b149d66f..340504be 100644
--- a/manager/app/src/main/res/values-vi/strings.xml
+++ b/manager/app/src/main/res/values-vi/strings.xml
@@ -48,4 +48,5 @@
Làm mới
Hiển thị ứng dụng hệ thống
Ẩn ứng dụng hệ thống
+ Chế độ an toàn, tất cả các mod đều bị tắt!
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 3dd542f5..731eae5a 100644
--- a/manager/app/src/main/res/values-zh-rCN/strings.xml
+++ b/manager/app/src/main/res/values-zh-rCN/strings.xml
@@ -50,4 +50,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 449660a8..0424c32c 100644
--- a/manager/app/src/main/res/values-zh-rHK/strings.xml
+++ b/manager/app/src/main/res/values-zh-rHK/strings.xml
@@ -46,4 +46,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 ad3cfc24..a3f25429 100644
--- a/manager/app/src/main/res/values-zh-rTW/strings.xml
+++ b/manager/app/src/main/res/values-zh-rTW/strings.xml
@@ -49,4 +49,5 @@
重新整理
顯示系統應用程式
隱藏系統應用程式
+ 安全模式,所有模塊已被禁用!
diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml
index d19ce355..190699d6 100644
--- a/manager/app/src/main/res/values/strings.xml
+++ b/manager/app/src/main/res/values/strings.xml
@@ -54,5 +54,6 @@
Show system apps
Hide system apps
Send Log
+ Safe mode, all module are disabled