diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Kpm.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Kpm.kt index 2235010e..5390e221 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Kpm.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Kpm.kt @@ -32,15 +32,16 @@ import com.sukisu.ultra.ui.util.* import java.io.File import androidx.core.content.edit import com.sukisu.ultra.R +import java.io.BufferedReader import java.io.FileInputStream +import java.io.InputStreamReader import java.net.* /** * KPM 管理界面 * 以下内核模块功能由KernelPatch开发,经过修改后加入SukiSU Ultra的内核模块功能 - * 开发者:zako, Liaokong + * 开发者:ShirkNeko, Liaokong */ -var globalModuleFileName: String = "" @OptIn(ExperimentalMaterial3Api::class) @Destination @Composable @@ -58,6 +59,11 @@ fun KpmScreen( MaterialTheme.colorScheme.secondaryContainer } + val moduleConfirmContentMap = viewModel.moduleList.associate { module -> + val moduleFileName = module.id + module.id to stringResource(R.string.confirm_uninstall_content, moduleFileName) + } + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) val kpmInstallSuccess = stringResource(R.string.kpm_install_success) @@ -70,13 +76,33 @@ fun KpmScreen( val kpmInstallMode = stringResource(R.string.kpm_install_mode) val kpmInstallModeLoad = stringResource(R.string.kpm_install_mode_load) val kpmInstallModeEmbed = stringResource(R.string.kpm_install_mode_embed) - val kpmInstallModeDescription = stringResource(R.string.kpm_install_mode_description) val invalidFileTypeMessage = stringResource(R.string.invalid_file_type) val confirmTitle = stringResource(R.string.confirm_uninstall_title_with_filename) - val confirmContent = stringResource(R.string.confirm_uninstall_content, globalModuleFileName) var tempFileForInstall by remember { mutableStateOf(null) } val installModeDialog = rememberCustomDialog { dismiss -> + var moduleName by remember { mutableStateOf(null) } + + LaunchedEffect(tempFileForInstall) { + tempFileForInstall?.let { tempFile -> + try { + val command = arrayOf("su", "-c", "strings ${tempFile.absolutePath} | grep 'name='") + val process = Runtime.getRuntime().exec(command) + val inputStream = process.inputStream + val reader = BufferedReader(InputStreamReader(inputStream)) + var line: String? + while (reader.readLine().also { line = it } != null) { + if (line!!.startsWith("name=")) { + moduleName = line.substringAfter("name=").trim() + break + } + } + process.waitFor() + } catch (e: Exception) { + Log.e("KsuCli", "Failed to get module name: ${e.message}", e) + } + } + } AlertDialog( onDismissRequest = { dismiss() @@ -84,7 +110,7 @@ fun KpmScreen( tempFileForInstall = null }, title = { Text(kpmInstallMode) }, - text = { Text(kpmInstallModeDescription) }, + text = { moduleName?.let { Text(stringResource(R.string.kpm_install_mode_description, it)) } }, confirmButton = { Column { Button( @@ -288,6 +314,7 @@ fun KpmScreen( module = module, onUninstall = { scope.launch { + val confirmContent = moduleConfirmContentMap[module.id] ?: "" handleModuleUninstall( module = module, viewModel = viewModel, @@ -327,7 +354,7 @@ private suspend fun handleModuleInstall( val command = arrayOf("su", "-c", "strings ${tempFile.absolutePath} | grep 'name='") val process = Runtime.getRuntime().exec(command) val inputStream = process.inputStream - val reader = java.io.BufferedReader(java.io.InputStreamReader(inputStream)) + val reader = BufferedReader(InputStreamReader(inputStream)) var line: String? while (reader.readLine().also { line = it } != null) { if (line!!.startsWith("name=")) { @@ -396,7 +423,6 @@ private suspend fun handleModuleUninstall( confirmDialog: ConfirmDialogHandle ) { val moduleFileName = "${module.id}.kpm" - globalModuleFileName = moduleFileName val moduleFilePath = "/data/adb/kpm/$moduleFileName" val fileExists = try { @@ -571,7 +597,7 @@ private fun checkStringsCommand(tempFile: File): Int { val command = arrayOf("su", "-c", "strings ${tempFile.absolutePath} | grep -E 'name=|version=|license=|author='") val process = Runtime.getRuntime().exec(command) val inputStream = process.inputStream - val reader = java.io.BufferedReader(java.io.InputStreamReader(inputStream)) + val reader = BufferedReader(InputStreamReader(inputStream)) var line: String? var matchCount = 0 val keywords = listOf("name=", "version=", "license=", "author=") diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/util/Downloader.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/util/Downloader.kt index cb36564d..f17cfe31 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/util/Downloader.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/util/Downloader.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.core.content.ContextCompat import com.sukisu.ultra.ui.util.module.LatestVersionInfo +import androidx.core.net.toUri /** * @author weishu @@ -42,14 +43,14 @@ fun download( onDownloading() return } else if (status == DownloadManager.STATUS_SUCCESSFUL) { - onDownloaded(Uri.parse(localUri)) + onDownloaded(localUri.toUri()) return } } } } - val request = DownloadManager.Request(Uri.parse(url)) + val request = DownloadManager.Request(url.toUri()) .setDestinationInExternalPublicDir( Environment.DIRECTORY_DOWNLOADS, fileName @@ -140,7 +141,7 @@ fun DownloadListener(context: Context, onDownloaded: (Uri) -> Unit) { val uri = cursor.getString( cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI) ) - onDownloaded(Uri.parse(uri)) + onDownloaded(uri.toUri()) } } } diff --git a/manager/app/src/main/java/io/sukisu/ultra/UltraShellHelper.java b/manager/app/src/main/java/io/sukisu/ultra/UltraShellHelper.java index a7bd5fcd..6d0a7bd7 100644 --- a/manager/app/src/main/java/io/sukisu/ultra/UltraShellHelper.java +++ b/manager/app/src/main/java/io/sukisu/ultra/UltraShellHelper.java @@ -19,7 +19,7 @@ public class UltraShellHelper { } public static boolean isPathExists(String path) { - return !runCmd("file " + path).contains("No such file or directory"); + return runCmd("file " + path).contains("No such file or directory"); } public static void CopyFileTo(String path, String target) { diff --git a/manager/app/src/main/java/io/sukisu/ultra/UltraToolInstall.java b/manager/app/src/main/java/io/sukisu/ultra/UltraToolInstall.java index 5527b0c5..3532915e 100644 --- a/manager/app/src/main/java/io/sukisu/ultra/UltraToolInstall.java +++ b/manager/app/src/main/java/io/sukisu/ultra/UltraToolInstall.java @@ -8,12 +8,12 @@ public class UltraToolInstall { private static final String OUTSIDE_SUSFSD_PATH = "/data/adb/ksu/bin/susfsd"; public static void tryToInstall() { String kpmmgrPath = getKpmmgrPath(); - if (!UltraShellHelper.isPathExists(OUTSIDE_KPMMGR_PATH)) { + if (UltraShellHelper.isPathExists(OUTSIDE_KPMMGR_PATH)) { UltraShellHelper.CopyFileTo(kpmmgrPath, OUTSIDE_KPMMGR_PATH); UltraShellHelper.runCmd("chmod a+rx " + OUTSIDE_KPMMGR_PATH); } String SuSFSDaemonPath = getSuSFSDaemonPath(); - if (!UltraShellHelper.isPathExists(OUTSIDE_SUSFSD_PATH)) { + if (UltraShellHelper.isPathExists(OUTSIDE_SUSFSD_PATH)) { UltraShellHelper.CopyFileTo(SuSFSDaemonPath, OUTSIDE_SUSFSD_PATH); UltraShellHelper.runCmd("chmod a+rx " + OUTSIDE_SUSFSD_PATH); } diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index bac179b5..c3650507 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -257,7 +257,7 @@ インストール 読み込む 埋め込む - モジュールのインストールモードを選択してください:\n\n読み込む: モジュールを一時的に読み込みます\n埋め込む: システムに恒久的にインストールします + モジュール:%1\$s のインストールモードを選択してください \n\n読み込む: モジュールを一時的に読み込みます\n埋め込む: システムに恒久的にインストールします モジュールファイルの存在を確認できませんでした モジュールファイルが存在するか確認できません アンインストールを確認 diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index 60720505..282103f3 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -253,7 +253,7 @@ Cài đặt Tải Nhúng - Vui lòng chọn chế độ cài đặt mô-đun: \n\nTải: Tải tạm thời mô-đun \nNhúng: Cài đặt vĩnh viễn vào hệ thống + Vui lòng:%1\$s chọn chế độ cài đặt mô-đun \n\nTải: Tải tạm thời mô-đun \nNhúng: Cài đặt vĩnh viễn vào hệ thống Không kiểm tra được sự tồn tại của tệp mô-đun Không thể kiểm tra xem tệp mô-đun có tồn tại không Xác nhận gỡ cài đặ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 1632f54d..683d5d78 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -253,7 +253,7 @@ 安装 加载 嵌入 - 请选择模块安装模式:\n\n加载:临时加载模块\n嵌入:永久安装到系统 + 请选择: %1\$s 模块的安装模式 \n\n加载:临时加载模块\n嵌入:永久安装到系统 无法检查模块文件是否存在 确认卸载 删除 @@ -262,5 +262,4 @@ 文件类型不正确,请选择 .kpm 文件 卸载 将卸载以下 kpm 模块:\n%s - diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index df2c6e10..dd27f366 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -255,7 +255,7 @@ KPM Install Load Embed - Please select the module installation mode: \n\nLoad: Temporarily load the module \nEmbedded: Permanently install into the system + Please select: %1\$s Module Installation Mode \n\nLoad: Temporarily load the module \nEmbedded: Permanently install into the system Failed to check module file existence Unable to check if module file exists Confirm uninstallation