diff --git a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt index 16d3b585..ecf9425b 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt @@ -52,7 +52,7 @@ object MusicDownloader { else "$baseurl/$variant.apk" - downloadProgress.get()?.currentDownload = PRDownloader.download(url, downloadPath, "music.apk") + downloadProgress.get()?.currentDownload = PRDownloader.download(url, downloadPath, getFileNameFromUrl(url)) .build() .setOnStartOrResumeListener { downloadProgress.get()?.downloadingFile?.set(context.getString(R.string.downloading_file, getFileNameFromUrl(url))) diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt index 83c1d936..1020a60c 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt @@ -69,7 +69,7 @@ object DialogContainer { prefs.edit { putBoolean("statement", true) } } - fun installAlertBuilder(msg: String, context: Context) { + fun installAlertBuilder(msg: String, fullMsg: String?, context: Context) { MaterialAlertDialogBuilder(context).apply { setTitle(context.getString(R.string.error)) setMessage(msg) @@ -79,25 +79,33 @@ object DialogContainer { openUrl("https://lmgtfy.com/?q=andnixsh+apk+verification+disable", R.color.Twitter, context) } setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } + if (fullMsg != null) + setNegativeButton("Advanced") { _, _ -> basicDialog("Advanced", fullMsg, context) } } context.getString(R.string.installation_miui) -> { setPositiveButton(context.getString(R.string.guide)) { _, _ -> openUrl("https://telegra.ph/How-to-install-v15-on-MIUI-02-11", R.color.Telegram, context) } setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } + if (fullMsg != null) + setNegativeButton("Advanced") { _, _ -> basicDialog("Advanced", fullMsg, context) } + } + else -> { + setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } + if (fullMsg != null) + setNegativeButton("Advanced") { _, _ -> basicDialog("Advanced", fullMsg, context) } } - else -> setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } } create() show() } } - fun basicDialog(title: String, msg: String, activity: Activity) { - MaterialAlertDialogBuilder(activity).apply { + fun basicDialog(title: String, msg: String, context: Context) { + MaterialAlertDialogBuilder(context).apply { setTitle(title) setMessage(msg) - setPositiveButton(activity.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } + setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } create() show() } diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt index 8cd9fa20..3e7ae946 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt @@ -110,7 +110,7 @@ open class HomeFragment : Fragment() { private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { when (intent.action) { - INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg") as String, requireActivity()) + INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg").toString(), intent.getStringExtra("fullErrorMsg"), requireActivity()) REFRESH_HOME -> viewModel.fetchData() } } diff --git a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt index f4bcaa35..d1c93bc0 100644 --- a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt +++ b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt @@ -52,9 +52,12 @@ object AppUtils { } fun sendFailure(error: MutableList, context: Context) { + downloadProgress.get()?.installing?.set(false) CoroutineScope(Dispatchers.IO).launch { + delay(700) val intent = Intent(HomeFragment.INSTALL_FAILED) intent.putExtra("errorMsg", getErrorMessage(error.joinToString(), context)) + intent.putExtra("fullErrorMsg", error.joinToString(" ")) LocalBroadcastManager.getInstance(context).sendBroadcast(intent) } } diff --git a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt index e9fca218..3efa1f5b 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -149,8 +149,19 @@ object PackageHelper { session.commit(pendingIntent.intentSender) } - private fun installRootApk(apkPath: String): Boolean { - return Shell.su("pm install -r $apkPath").exec().isSuccess + private fun installRootMusic(files: ArrayList, context: Context): Boolean { + files.forEach { apk -> + if (apk.name != "root.apk") { + val command = Shell.su("cat ${apk.file?.path} | pm install -S ${apk.fileSize}").exec() + if (command.isSuccess) + return true + else { + sendFailure(command.out, context) + sendCloseDialog(context) + } + } + } + return false } fun installMusicRoot(context: Context) { @@ -167,7 +178,7 @@ object PackageHelper { val apkFilesPath = context.getExternalFilesDir("music/root")?.path val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) } if (fileInfoList != null) { - val modApk: FileInfo? = fileInfoList.lastOrNull { it.name == "music.apk" } + val modApk: FileInfo? = fileInfoList.lastOrNull { it.name == "root.apk" } if (modApk != null) { if (overwriteBase(modApk, fileInfoList, musicVersionCode!!, musicRootPkg, "music", context)) { sendRefresh(context) @@ -332,7 +343,8 @@ object PackageHelper { private fun installSplitApkFiles(apkFiles: ArrayList, context: Context) : Boolean { var sessionId: Int? - Log.d("AppLog", "installing split apk files:$apkFiles") + val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json") + Log.d("AppLog", "installing split apk files: $apkFiles") run { val sessionIdResult = Shell.su("pm install-create -r -t").exec().out val sessionIdPattern = Pattern.compile("(\\d+)") @@ -341,8 +353,8 @@ object PackageHelper { sessionId = Integer.parseInt(sessionIdMatcher.group(1)!!) } apkFiles.forEach { apkFile -> - if (apkFile.name != "black.apk" && apkFile.name != "dark.apk" && apkFile.name != "hash.json") { - Log.d("AppLog", "installing APK : ${apkFile.name} ${apkFile.fileSize} ") + if (!filenames.any { apkFile.name == it }) { + Log.d("AppLog", "installing APK: ${apkFile.name} ${apkFile.fileSize}") val command = arrayOf("su", "-c", "pm", "install-write", "-S", "${apkFile.fileSize}", "$sessionId", apkFile.name) val process: Process = Runtime.getRuntime().exec(command) val inputPipe = apkFile.getInputStream() @@ -365,6 +377,7 @@ object PackageHelper { return true } sendFailure(installResult.out, context) + sendCloseDialog(context) return false } @@ -505,7 +518,7 @@ object PackageHelper { //uninstall current update and install base that works with patch private fun fixHigherVer(apkFiles: ArrayList, pkg: String, context: Context) : Boolean { if (uninstallRootApk(pkg)) { - return if (pkg == vancedRootPkg) installSplitApkFiles(apkFiles, context) else installRootApk(apkFiles[0].file?.path!!) + return if (pkg == vancedRootPkg) installSplitApkFiles(apkFiles, context) else installRootMusic(apkFiles, context) } sendFailure(listOf("Failed_Uninstall").toMutableList(), context) sendCloseDialog(context) @@ -514,7 +527,7 @@ object PackageHelper { //install stock youtube matching vanced version private fun installStock(baseApkFiles: ArrayList, pkg: String, context: Context): Boolean { - return if (pkg == vancedRootPkg) installSplitApkFiles(baseApkFiles, context) else installRootApk(baseApkFiles[0].file?.path!!) + return if (pkg == vancedRootPkg) installSplitApkFiles(baseApkFiles, context) else installRootMusic(baseApkFiles, context) } //set chcon to apk_data_file @@ -525,6 +538,7 @@ object PackageHelper { true } else { sendFailure(response.out, context) + sendCloseDialog(context) false } }