diff --git a/manager/app/src/main/cpp/jni.cc b/manager/app/src/main/cpp/jni.cc index acaea577..05021ce0 100644 --- a/manager/app/src/main/cpp/jni.cc +++ b/manager/app/src/main/cpp/jni.cc @@ -320,3 +320,9 @@ JNIEXPORT jboolean JNICALL Java_com_rifsxd_ksunext_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { return set_su_enabled(enabled); } + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isZygiskEnabled(JNIEnv *env, jobject) { + return is_zygisk_enabled(); +} \ 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 05ea3f08..bd497a98 100644 --- a/manager/app/src/main/cpp/ksu.cc +++ b/manager/app/src/main/cpp/ksu.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "ksu.h" @@ -113,3 +114,7 @@ bool is_su_enabled() { ksuctl(CMD_IS_SU_ENABLED, &enabled, nullptr); return enabled; } + +bool is_zygisk_enabled() { + return !!getenv("ZYGISK_ENABLED"); +} \ 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 17b4aebd..1035937c 100644 --- a/manager/app/src/main/cpp/ksu.h +++ b/manager/app/src/main/cpp/ksu.h @@ -87,4 +87,6 @@ bool set_su_enabled(bool enabled); bool is_su_enabled(); +bool is_zygisk_enabled(); + #endif //KERNELSU_KSU_H diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt b/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt index 8576771f..5b6fbd18 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt @@ -73,6 +73,11 @@ object Natives { */ external fun getHookMode(): String? + /** + * Check if Zygisk injection is enabled in the environment. + */ + external fun isZygiskEnabled(): Boolean + /** * Get the profile of the given package. * @param key usually the package name diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt index c973d000..03daf1d3 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.toUpperCase @@ -141,6 +142,7 @@ fun HomeScreen(navigator: DestinationsNavigator) { @Composable private fun SuperuserCard() { + val count = getSuperuserCount() ElevatedCard( colors = CardDefaults.elevatedCardColors( containerColor = MaterialTheme.colorScheme.secondaryContainer @@ -157,11 +159,11 @@ private fun SuperuserCard() { verticalArrangement = Arrangement.spacedBy(4.dp) ) { Text( - text = stringResource(R.string.home_superuser_count), + text = pluralStringResource(R.plurals.home_superuser_count, count), style = MaterialTheme.typography.bodySmall ) Text( - text = getSuperuserCount().toString(), + text = count.toString(), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold ) @@ -172,6 +174,7 @@ private fun SuperuserCard() { @Composable private fun ModuleCard() { + val count = getModuleCount() ElevatedCard( colors = CardDefaults.elevatedCardColors( containerColor = MaterialTheme.colorScheme.secondaryContainer @@ -188,11 +191,11 @@ private fun ModuleCard() { verticalArrangement = Arrangement.spacedBy(4.dp) ) { Text( - text = stringResource(R.string.home_module_count), + text = pluralStringResource(R.plurals.home_module_count, count), style = MaterialTheme.typography.bodySmall ) Text( - text = getModuleCount().toString(), + text = count.toString(), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold ) @@ -645,6 +648,15 @@ private fun InfoCard(autoExpand: Boolean = false) { icon = painterResource(R.drawable.ic_sus), ) } + + Spacer(Modifier.height(16.dp)) + if (Natives.isZygiskEnabled()) { + InfoCardItem( + label = stringResource(R.string.zygisk_status), + content = stringResource(R.string.enabled), + icon = Icons.Filled.Vaccines + ) + } } if (!expanded) { diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt index 49ed940b..f9c6c365 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt @@ -823,7 +823,7 @@ fun ModuleItem( ) } - val filterZygiskModules = zygiskAvailable() || !module.zygiskRequired + val filterZygiskModules = Natives.isZygiskEnabled() || !module.zygiskRequired LaunchedEffect(Unit) { developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) @@ -867,7 +867,7 @@ fun ModuleItem( ) ) } - if (!zygiskAvailable() && module.zygiskRequired && !module.remove) { + if (!Natives.isZygiskEnabled() && module.zygiskRequired && !module.remove) { LabelItem( text = stringResource(R.string.zygisk_required), style = LabelItemDefaults.style.copy( diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt index 7f7f87cb..eb439ef3 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt @@ -641,31 +641,6 @@ fun zygiskRequired(dir: File): Boolean { return result } -fun zygiskAvailable(): Boolean { - val shell = getRootShell() - val zygiskLib = "libzygisk.so" - val rezygisk64 = "/data/adb/modules/rezygisk/lib64/$zygiskLib" - val rezygisk = "/data/adb/modules/rezygisk/lib/$zygiskLib" - val zygiskNext64 = "/data/adb/modules/zygisksu/lib64/$zygiskLib" - val zygiskNext = "/data/adb/modules/zygisksu/lib/$zygiskLib" - - val cmdRezygisk64 = "[ -f \"$rezygisk64\" ]" - if (ShellUtils.fastCmdResult(shell, cmdRezygisk64)) { - return true - } - val cmdZygiskNext64 = "[ -f \"$zygiskNext64\" ]" - if (ShellUtils.fastCmdResult(shell, cmdZygiskNext64)) { - return true - } - - val cmdRezygisk = "[ -f \"$rezygisk\" ]" - if (ShellUtils.fastCmdResult(shell, cmdRezygisk)) { - return true - } - val cmdZygiskNext = "[ -f \"$zygiskNext\" ]" - return ShellUtils.fastCmdResult(shell, cmdZygiskNext) -} - fun setAppProfileTemplate(id: String, template: String): Boolean { val shell = getRootShell() val escapedTemplate = template.replace("\"", "\\\"") diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt index 768d8ce2..7e64356e 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt @@ -22,7 +22,6 @@ import com.rifsxd.ksunext.ui.util.HanziToPinyin import com.rifsxd.ksunext.ui.util.listModules import com.rifsxd.ksunext.ui.util.getModuleSize import com.rifsxd.ksunext.ui.util.zygiskRequired -import com.rifsxd.ksunext.ui.util.zygiskAvailable import org.json.JSONArray import org.json.JSONObject diff --git a/manager/app/src/main/res/drawable/ic_ksu_next.xml b/manager/app/src/main/res/drawable/ic_ksu_next.xml index 58412707..5a3dd0a9 100644 --- a/manager/app/src/main/res/drawable/ic_ksu_next.xml +++ b/manager/app/src/main/res/drawable/ic_ksu_next.xml @@ -1,6 +1,6 @@ Install GKI kernel or integrate KernelSU Next to your device. Working Version: %d - Superuser(s) - Module(s) Updates: %d KernelSU Next v2 signature not found in kernel! [ !KSU_NEXT || != size/hash ] Ask your kernel developer to integrate KernelSU Next! @@ -225,4 +223,13 @@ Developer SUCOMPAT DISABLED Zygisk required + Zygisk injection + + Superuser + Superusers + + + Module + Modules +