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 3d18901e..3a1a8074 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 @@ -137,7 +137,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) { @Parcelize sealed class FlashIt : Parcelable { - data class FlashBoot(val bootUri: Uri? = null, val koUri: Uri, val ota: Boolean) : FlashIt() + data class FlashBoot(val bootUri: Uri? = null, val ota: Boolean) : FlashIt() data class FlashModule(val uri: Uri) : FlashIt() } @@ -150,7 +150,6 @@ fun flashIt( when (flashIt) { is FlashIt.FlashBoot -> installBoot( flashIt.bootUri, - flashIt.koUri, flashIt.ota, onFinish, onStdout, diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt index bb7a6766..e50362d5 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt @@ -57,55 +57,17 @@ import me.weishu.kernelsu.ui.util.rootAvailable @Destination @Composable fun InstallScreen(navigator: DestinationsNavigator) { - val scope = rememberCoroutineScope() - val loadingDialog = rememberLoadingDialog() - val context = LocalContext.current var installMethod by remember { mutableStateOf(null) } - val onFileDownloaded = { uri: Uri -> - - installMethod?.let { - scope.launch(Dispatchers.Main) { - when (it) { - InstallMethod.DirectInstall -> { - navigator.navigate( - FlashScreenDestination( - FlashIt.FlashBoot( - null, - uri, - false - ) - ) - ) - } - - InstallMethod.DirectInstallToInactiveSlot -> { - navigator.navigate( - FlashScreenDestination( - FlashIt.FlashBoot( - null, - uri, - true - ) - ) - ) - } - - is InstallMethod.SelectFile -> { - navigator.navigate( - FlashScreenDestination( - FlashIt.FlashBoot( - it.uri, - uri, - false - ) - ) - ) - } - } - } + val onClickInstall = { + installMethod?.let { method -> + val flashIt = FlashIt.FlashBoot( + if (method is InstallMethod.SelectFile) method.uri else null, + method is InstallMethod.DirectInstallToInactiveSlot + ) + navigator.navigate(FlashScreenDestination(flashIt)) } } @@ -124,45 +86,11 @@ fun InstallScreen(navigator: DestinationsNavigator) { .fillMaxWidth() .padding(16.dp) ) { - - DownloadListener(context = context) { uri -> - onFileDownloaded(uri) - loadingDialog.hide() - } - - val failedMessage = stringResource(id = R.string.failed_to_fetch_lkm_url) - val downloadingMessage = stringResource(id = R.string.downloading) Button( modifier = Modifier.fillMaxWidth(), enabled = installMethod != null, onClick = { - loadingDialog.showLoading() - scope.launch(Dispatchers.IO) { - getLKMUrl().onFailure { throwable -> - loadingDialog.hide() - scope.launch(Dispatchers.Main) { - Toast.makeText( - context, - failedMessage.format(throwable.message), - Toast.LENGTH_SHORT - ).show() - } - }.onSuccess { result -> - download( - context = context, - url = result.second, - fileName = result.first, - description = downloadingMessage.format( - result.first - ), - onDownloaded = { uri -> - onFileDownloaded(uri) - loadingDialog.hide() - }, - onDownloading = {} - ) - } - } + onClickInstall() }) { Text( stringResource(id = R.string.install_next), 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 821d96d4..712c3ea6 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 @@ -143,7 +143,6 @@ fun installModule( fun installBoot( bootUri: Uri?, - lkmUri: Uri, ota: Boolean, onFinish: (Boolean) -> Unit, onStdout: (String) -> Unit, @@ -151,73 +150,60 @@ fun installBoot( ): Boolean { val resolver = ksuApp.contentResolver - with(resolver.openInputStream(lkmUri)) { - val lkmFile = File(ksuApp.cacheDir, "kernelsu.ko") - lkmFile.outputStream().use { output -> - this?.copyTo(output) - } - - if (!lkmFile.exists()) { - onStdout("- kernelsu.ko not found") - onFinish(false) - return false - } - - val bootFile = bootUri?.let { uri -> - with(resolver.openInputStream(uri)) { - val bootFile = File(ksuApp.cacheDir, "boot.img") - bootFile.outputStream().use { output -> - this?.copyTo(output) - } - - bootFile + val bootFile = bootUri?.let { uri -> + with(resolver.openInputStream(uri)) { + val bootFile = File(ksuApp.cacheDir, "boot.img") + bootFile.outputStream().use { output -> + this?.copyTo(output) } + + bootFile } - - val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") - var cmd = "boot-patch -m ${lkmFile.absolutePath} --magiskboot ${magiskboot.absolutePath}" - - cmd += if (bootFile == null) { - // no boot.img, use -f to force install - " -f" - } else { - " -b ${bootFile.absolutePath}" - } - - if (ota) { - cmd += " -u" - } - - // output dir - val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) - cmd += " -o $downloadsDir" - - val shell = createRootShell() - - 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 = - shell.newJob().add("${getKsuDaemonPath()} $cmd").to(stdoutCallback, stderrCallback) - .exec() - Log.i("KernelSU", "install boot $lkmUri result: ${result.isSuccess}") - - lkmFile.delete() - bootFile?.delete() - - // if boot uri is empty, it is direct install, when success, we should show reboot button - onFinish(bootUri == null && result.isSuccess) - return result.isSuccess } + + val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") + var cmd = "boot-patch --magiskboot ${magiskboot.absolutePath}" + + cmd += if (bootFile == null) { + // no boot.img, use -f to force install + " -f" + } else { + " -b ${bootFile.absolutePath}" + } + + if (ota) { + cmd += " -u" + } + + // output dir + val downloadsDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + cmd += " -o $downloadsDir" + + val shell = createRootShell() + + 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 = + shell.newJob().add("${getKsuDaemonPath()} $cmd").to(stdoutCallback, stderrCallback) + .exec() + Log.i("KernelSU", "install boot result: ${result.isSuccess}") + + bootFile?.delete() + + // if boot uri is empty, it is direct install, when success, we should show reboot button + onFinish(bootUri == null && result.isSuccess) + return result.isSuccess } fun reboot(reason: String = "") { @@ -250,7 +236,8 @@ fun isInitBoot(): Boolean { return file.exists() } // https://source.android.com/docs/core/architecture/partitions/generic-boot - return ShellUtils.fastCmd(shell, "getprop ro.product.first_api_level").trim().toInt() >= Build.VERSION_CODES.TIRAMISU + return ShellUtils.fastCmd(shell, "getprop ro.product.first_api_level").trim() + .toInt() >= Build.VERSION_CODES.TIRAMISU } fun overlayFsAvailable(): Boolean { diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml index f1de4621..4bcdd119 100644 --- a/manager/app/src/main/res/values-ar/strings.xml +++ b/manager/app/src/main/res/values-ar/strings.xml @@ -109,8 +109,6 @@ تمكين تصحيح أخطاء WebView يمكن استخدامه لتصحيح أخطاء WebUI، يرجى تمكينه فقط عند الحاجة. التالي - فشل جلب رابط LKM: %1$s - تحميل %1$s اختيار ملف تثبيت مباشر (موصى به) التثبيت على فتحة غير نشطة (بعد OTA) diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml index 204250bf..8532ee1d 100644 --- a/manager/app/src/main/res/values-fr/strings.xml +++ b/manager/app/src/main/res/values-fr/strings.xml @@ -116,6 +116,4 @@ \nN\'utilisez cette option qu\'une fois la mise à jour OTA terminée. \nContinuer ? Suivant - Téléchargement de %1$s - Échec de la récupération de l\'URL du LKM : %1$s \ No newline at end of file diff --git a/manager/app/src/main/res/values-pt-rBR/strings.xml b/manager/app/src/main/res/values-pt-rBR/strings.xml index d9719a5e..79c91c39 100644 --- a/manager/app/src/main/res/values-pt-rBR/strings.xml +++ b/manager/app/src/main/res/values-pt-rBR/strings.xml @@ -115,7 +115,5 @@ Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização! \nSó use esta opção após a conclusão do OTA. \nDeseja continuar? - Baixando %1$s Próximo - Falha ao buscar a URL do LKM: %1$s \ 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 a79df296..5e02165b 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -112,8 +112,6 @@ Открыть Включить отладку WebView Используется для отладки веб-интерфейса. Пожалуйста, включайте только при необходимости. - Загрузка %1$s - Не удалось получить LKM по адресу: %1$s Прямая установка (Рекомендуется) Установка в неактивный слот (После OTA) Далее diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml index 0cb8421a..6e2e19a9 100644 --- a/manager/app/src/main/res/values-tr/strings.xml +++ b/manager/app/src/main/res/values-tr/strings.xml @@ -117,6 +117,4 @@ \nBu seçeneği yalnızca OTA tamamlandıktan sonra kullanın. \nDevam edilsin mi? Sonraki - LKM URL\'si getirilemedi: %1$s - %1$s indiriliyor \ No newline at end of file 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 41d1a0bb..388ed0c2 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -113,7 +113,5 @@ 安装到未使用的槽位(OTA 后) 将在重启后强制切换到另一个槽位!\n注意只能在 OTA 更新完成后的重启之前使用。\n确认? 下一步 - 获取 LKM 链接失败:%1$s - 正在下载:%1$s 建议选择 %1$s 分区镜像 \ No newline at end of file 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 8d427d3d..609e2ba3 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -115,6 +115,4 @@ \n請問是否繼續? 直接安裝(建議) 下一步 - 取得 LKM 下載鏈接失敗:%1$s - 正在下載:%1$s \ No newline at end of file diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 04d95a2b..e7533f44 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -115,7 +115,5 @@ Install to Inactive Slot (After OTA) Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? Next - Failed to fetch LKM url: %1$s - Downloading %1$s %1$s partition image is recommended