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 f9e56623..2c320e31 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 @@ -123,6 +123,7 @@ import com.rifsxd.ksunext.ui.util.reboot import com.rifsxd.ksunext.ui.util.toggleModule import com.rifsxd.ksunext.ui.util.uninstallModule import com.rifsxd.ksunext.ui.util.restoreModule +import com.rifsxd.ksunext.ui.util.zygiskRequired import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel import com.rifsxd.ksunext.ui.webui.WebUIActivity import com.rifsxd.ksunext.ui.webui.WebUIXActivity @@ -783,6 +784,8 @@ fun ModuleItem( ) } + val filterZygiskModules = zygiskAvailable() || !module.zygiskRequired + LaunchedEffect(Unit) { developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) } @@ -825,6 +828,15 @@ fun ModuleItem( ) ) } + if (!zygiskAvailable() && module.zygiskRequired && !module.remove) { + LabelItem( + text = stringResource(R.string.zygisk_required), + style = com.dergoogler.mmrl.ui.component.LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer + ) + ) + } if (updateUrl.isNotEmpty() && !module.remove && !module.update) { LabelItem( text = stringResource(R.string.module_update), @@ -846,7 +858,7 @@ fun ModuleItem( } } if (module.enabled && !module.remove) { - if (module.hasWebUi) { + if (module.hasWebUi && filterZygiskModules) { LabelItem( text = stringResource(R.string.webui), style = com.dergoogler.mmrl.ui.component.LabelItemDefaults.style.copy( @@ -855,7 +867,7 @@ fun ModuleItem( ) ) } - if (module.hasActionScript) { + if (module.hasActionScript && filterZygiskModules) { LabelItem( text = stringResource(R.string.action), style = com.dergoogler.mmrl.ui.component.LabelItemDefaults.style.copy( @@ -961,7 +973,7 @@ fun ModuleItem( if (module.hasActionScript) { FilledTonalButton( modifier = Modifier.defaultMinSize(52.dp, 32.dp), - enabled = !module.remove && module.enabled, + enabled = !module.remove && module.enabled && filterZygiskModules, onClick = { navigator.navigate(ExecuteModuleActionScreenDestination(module.dirId)) viewModel.markNeedRefresh() @@ -989,7 +1001,7 @@ fun ModuleItem( if (module.hasWebUi) { FilledTonalButton( modifier = Modifier.defaultMinSize(52.dp, 32.dp), - enabled = !module.remove && module.enabled, + enabled = !module.remove && module.enabled && filterZygiskModules, onClick = { onClick(module) }, interactionSource = interactionSource, contentPadding = ButtonDefaults.TextButtonContentPadding @@ -1119,7 +1131,8 @@ fun ModuleItemPreview() { hasActionScript = false, dirId = "dirId", size = 12345678L, - banner = "" + banner = "", + zygiskRequired = false ) ModuleItem(EmptyDestinationsNavigator, module, "", {}, {}, {}, {}, {}, false, {}) } 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 10a9dc26..c84e67b1 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 @@ -633,6 +633,29 @@ fun isSuCompatDisabled(): Boolean { return Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT && !Natives.isSuEnabled() } +fun zygiskRequired(dir: File): Boolean { + val shell = getRootShell() + val zygiskLib = "${dir.absolutePath}/zygisk" + val cmd = "ls \"$zygiskLib\"" + val result = ShellUtils.fastCmdResult(shell, cmd) + return result +} + +fun zygiskAvailable(): Boolean { + val shell = getRootShell() + val zygiskLib = "libzygisk.so" + val rezygisk = "/data/adb/modules/rezygisk/lib/$zygiskLib" + val zygiskNext = "/data/adb/modules/zygisksu/lib/$zygiskLib" + + val cmdRezygisk = "[ -f \"$rezygisk\" ]" + if (ShellUtils.fastCmdResult(shell, cmdRezygisk)) { + return true + } else { + 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 e7e169bc..979b3903 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 @@ -23,6 +23,8 @@ import com.rifsxd.ksunext.ksuApp 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 @@ -48,7 +50,8 @@ class ModuleViewModel : ViewModel() { val hasActionScript: Boolean, val dirId: String, val size: Long, - val banner: String + val banner: String, + val zygiskRequired: Boolean ) data class ModuleUpdateInfo( @@ -139,6 +142,7 @@ class ModuleViewModel : ViewModel() { val dirId = obj.getString("dir_id") val moduleDir = File("/data/adb/modules/$dirId") val size = getModuleSize(moduleDir) + val zygiskRequired = zygiskRequired(moduleDir) ModuleInfo( id, @@ -155,7 +159,8 @@ class ModuleViewModel : ViewModel() { obj.optBoolean("action"), dirId, size, - obj.optString("banner") + obj.optString("banner"), + zygiskRequired ) }.toList() isNeedRefresh = false diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 6aa986ab..2a9abdf4 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -224,4 +224,5 @@ Customization Developer SUCOMPAT DISABLED + Zygisk Required