diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Flash.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Flash.kt index b5028969..7f5b4996 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Flash.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Flash.kt @@ -50,6 +50,7 @@ import me.weishu.kernelsu.ui.util.installBoot import me.weishu.kernelsu.ui.util.installModule import me.weishu.kernelsu.ui.util.reboot import me.weishu.kernelsu.ui.util.restoreBoot +import me.weishu.kernelsu.ui.util.uninstallPermanently import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -174,6 +175,8 @@ sealed class FlashIt : Parcelable { data class FlashModule(val uri: Uri) : FlashIt() data object FlashRestore : FlashIt() + + data object FlashUninstall : FlashIt() } fun flashIt( @@ -194,6 +197,8 @@ fun flashIt( is FlashIt.FlashModule -> installModule(flashIt.uri, onFinish, onStdout, onStderr) FlashIt.FlashRestore -> restoreBoot(onFinish, onStdout, onStderr) + + FlashIt.FlashUninstall -> uninstallPermanently(onFinish, onStdout, onStderr) } } diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt index 9986a880..b2a18998 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt @@ -213,7 +213,8 @@ fun SettingScreen(navigator: DestinationsNavigator) { } ) - val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode + val lkmMode = + Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode if (lkmMode) { UninstallItem(navigator) { loadingDialog.withLoading(it) @@ -258,10 +259,14 @@ fun UninstallItem( withLoading { when (uninstallType) { UninstallType.TEMPORARY -> showTodo() - UninstallType.PERMANENT -> showTodo() + UninstallType.PERMANENT -> navigator.navigate( + FlashScreenDestination(FlashIt.FlashUninstall) + ) + UninstallType.RESTORE_STOCK_IMAGE -> navigator.navigate( FlashScreenDestination(FlashIt.FlashRestore) ) + UninstallType.NONE -> Unit } } diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt index cd723468..7eda13f8 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt @@ -191,6 +191,33 @@ fun restoreBoot( return result.isSuccess } +fun uninstallPermanently( + onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit +): Boolean { + val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") + + val stdoutCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStdout(s ?: "") + } + } + + val stderrCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStderr(s ?: "") + } + } + + val result = withNewRootShell { + newJob().add("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot") + .to(stdoutCallback, stderrCallback) + .exec() + } + + onFinish(result.isSuccess, result.code) + return result.isSuccess +} + suspend fun shrinkModules(): Boolean = withContext(Dispatchers.IO) { execKsud("module shrink", true) } @@ -414,7 +441,9 @@ fun launchApp(packageName: String) { val shell = getRootShell() val result = - shell.newJob().add("cmd package resolve-activity --brief $packageName | tail -n 1 | xargs cmd activity start-activity -n").exec() + shell.newJob() + .add("cmd package resolve-activity --brief $packageName | tail -n 1 | xargs cmd activity start-activity -n") + .exec() Log.i(TAG, "launch $packageName result: $result") }