From e454cf8e9d6edc6027bc54741112fd5ce09ec79a Mon Sep 17 00:00:00 2001 From: MajorTanya <39014446+MajorTanya@users.noreply.github.com> Date: Tue, 21 Jul 2026 14:02:33 +0200 Subject: [PATCH] Always use Private installer to update Private extensions (#3614) * Use Private installer to update Private extensions This forces the Private installer for any extension which was installed privately, bypassing whichever setting the user selected in Settings > Advanced > Installer. * [skip ci] Changelog entry * [skip ci] Update CHANGELOG.md Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --------- Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- CHANGELOG.md | 3 ++ .../tachiyomi/extension/ExtensionManager.kt | 3 +- .../extension/util/ExtensionInstaller.kt | 47 +++++++++++++------ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9da53a3bb..b60399353 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,9 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co ### Changed - Detect Shizuku with permission check ([@Small-Ku](https://github.com/Small-Ku)) ([#3565](https://github.com/mihonapp/mihon/pull/3565)) +### Improved +- Always use Private installer to update privately installed extensions ([@MajorTanya](https://github.com/MajorTanya)) ([#3614](https://github.com/mihonapp/mihon/pull/3614)) + ### Fixed - Fixed app bars remaining visible after changing pages by tapping in the paged reader after using the chapter navigator slider ([@AntsyLich](https://github.com/AntsyLich)) ([#3567](https://github.com/mihonapp/mihon/pull/3567)) - Fixed MangaBaka User Agent string ([@MajorTanya](https://github.com/MajorTanya)) ([#3578](https://github.com/mihonapp/mihon/pull/3578)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index 4f9856ccd..699e07463 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -240,7 +240,8 @@ class ExtensionManager( */ fun updateExtension(extension: Extension.Installed): Flow { val availableExt = availableExtensionMapFlow.value[extension.pkgName] ?: return emptyFlow() - return installExtension(availableExt) + val isUpdateForPrivatelyInstalled = !extension.isShared + return installer.downloadAndInstall(availableExt.apkUrl, availableExt, isUpdateForPrivatelyInstalled) } fun cancelInstallUpdateExtension(extension: Extension) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt index 5eae3fe47..4d9493ff7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt @@ -49,8 +49,13 @@ internal class ExtensionInstaller( * * @param url The url of the apk. * @param extension The extension to install. + * @param isUpdateForPrivatelyInstalled If this is an update for a privately installed extension */ - fun downloadAndInstall(url: String, extension: Extension): Flow { + fun downloadAndInstall( + url: String, + extension: Extension, + isUpdateForPrivatelyInstalled: Boolean = false, + ): Flow { val downloadId = extension.pkgName.hashCode().toLong() cancelInstall(extension.pkgName) @@ -74,7 +79,7 @@ internal class ExtensionInstaller( } step.value = InstallStep.Installing - installApk(downloadId, tmpFile) + installApk(downloadId, tmpFile, isUpdateForPrivatelyInstalled) } catch (e: Exception) { if (e is InterruptedException) { // Canceled @@ -99,8 +104,14 @@ internal class ExtensionInstaller( * Starts an intent to install the extension at the given uri. * * @param tempFile The file of the extension to install. Delete after use. + * @param isUpdateForPrivatelyInstalled If this install is an update for a privately installed extension */ - private fun installApk(downloadId: Long, tempFile: File) { + private fun installApk(downloadId: Long, tempFile: File, isUpdateForPrivatelyInstalled: Boolean = false) { + if (isUpdateForPrivatelyInstalled) { + installApkPrivately(downloadId, tempFile) + return + } + when (val installer = extensionInstaller.get()) { BasePreferences.ExtensionInstaller.LEGACY -> { val intent = Intent(context, ExtensionInstallActivity::class.java) @@ -110,20 +121,11 @@ internal class ExtensionInstaller( context.startActivity(intent) } - BasePreferences.ExtensionInstaller.PRIVATE -> { - try { - if (ExtensionLoader.installPrivateExtensionFile(context, tempFile)) { - updateInstallStep(downloadId, InstallStep.Installed) - } else { - updateInstallStep(downloadId, InstallStep.Error) - } - } catch (e: Exception) { - logcat(LogPriority.ERROR, e) { "Failed to read downloaded extension file." } - updateInstallStep(downloadId, InstallStep.Error) - } - tempFile.delete() + BasePreferences.ExtensionInstaller.PRIVATE -> { + installApkPrivately(downloadId, tempFile) } + else -> { val intent = ExtensionInstallService.getIntent( context, @@ -136,6 +138,21 @@ internal class ExtensionInstaller( } } + private fun installApkPrivately(downloadId: Long, tempFile: File) { + try { + if (ExtensionLoader.installPrivateExtensionFile(context, tempFile)) { + updateInstallStep(downloadId, InstallStep.Installed) + } else { + updateInstallStep(downloadId, InstallStep.Error) + } + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) { "Failed to read downloaded extension file." } + updateInstallStep(downloadId, InstallStep.Error) + } + + tempFile.delete() + } + /** * Cancels extension install and remove from download manager and installer. */