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 e2a4e7e031..c7cce7afbd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -248,7 +248,7 @@ class ExtensionManager( changed = true } if (availableExt != null) { - val hasUpdate = availableExt.versionCode > installedExt.versionCode + val hasUpdate = installedExt.updateExists(availableExt) if (installedExt.hasUpdate != hasUpdate) { mutInstalledExtensions[index] = installedExt.copy(hasUpdate = hasUpdate) hasUpdateCount++ @@ -460,11 +460,14 @@ class ExtensionManager( * Extension method to set the update field of an installed extension. */ private fun Extension.Installed.withUpdateCheck(): Extension.Installed { - val availableExt = availableExtensions.find { it.pkgName == pkgName } - if (availableExt != null && availableExt.versionCode > versionCode) { - return copy(hasUpdate = true) - } - return this + return if (updateExists()) copy(hasUpdate = true) else this + } + + private fun Extension.Installed.updateExists(availableExtension: Extension.Available? = null): Boolean { + val availableExt = availableExtension ?: availableExtensionsRelay.value.find { it.pkgName == pkgName } + if (isUnofficial || availableExt == null) return false + + return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } @Parcelize diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt index 0a3b30e5c2..e7a35f757f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt @@ -69,7 +69,11 @@ internal class ExtensionGithubApi { val pkgName = installedExt.pkgName val availableExt = extensions.find { it.pkgName == pkgName } ?: continue - val hasUpdate = availableExt.versionCode > installedExt.versionCode + val hasUpdate = installedExt.isUnofficial.not() && + ( + availableExt.versionCode > installedExt.versionCode || + availableExt.libVersion > installedExt.libVersion + ) if (hasUpdate) { extensionsWithUpdate.add(availableExt) } @@ -82,7 +86,7 @@ internal class ExtensionGithubApi { private fun List.toExtensions(): List { return this .filter { - val libVersion = it.version.substringBeforeLast('.').toDouble() + val libVersion = it.extractLibVersion() libVersion >= ExtensionLoader.LIB_VERSION_MIN && libVersion <= ExtensionLoader.LIB_VERSION_MAX } .map { @@ -91,6 +95,7 @@ internal class ExtensionGithubApi { pkgName = it.pkg, versionName = it.version, versionCode = it.code, + libVersion = it.extractLibVersion(), lang = it.lang, isNsfw = it.nsfw == 1, hasReadme = it.hasReadme == 1, @@ -113,6 +118,10 @@ internal class ExtensionGithubApi { REPO_URL_PREFIX } } + + private fun ExtensionJsonObject.extractLibVersion(): Double { + return version.substringBeforeLast('.').toDouble() + } } private const val REPO_URL_PREFIX = "https://raw.githubusercontent.com/tachiyomiorg/tachiyomi-extensions/repo/" diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/model/Extension.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/model/Extension.kt index 73d3dd48b6..246d6c6566 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/model/Extension.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/model/Extension.kt @@ -10,6 +10,7 @@ sealed class Extension { abstract val pkgName: String abstract val versionName: String abstract val versionCode: Long + abstract val libVersion: Double abstract val lang: String? abstract val isNsfw: Boolean abstract val hasReadme: Boolean @@ -20,6 +21,7 @@ sealed class Extension { override val pkgName: String, override val versionName: String, override val versionCode: Long, + override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, override val hasReadme: Boolean, @@ -37,6 +39,7 @@ sealed class Extension { override val pkgName: String, override val versionName: String, override val versionCode: Long, + override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, override val hasReadme: Boolean, @@ -59,6 +62,7 @@ sealed class Extension { override val pkgName: String, override val versionName: String, override val versionCode: Long, + override val libVersion: Double, val signatureHash: String, override val lang: String? = null, override val isNsfw: Boolean = false, diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index 5b805bdfda..7075e90fed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -144,7 +144,7 @@ internal object ExtensionLoader { if (signatureHash == null) { return LoadResult.Error("Package $pkgName isn't signed") } else if (signatureHash !in trustedSignatures) { - val extension = Extension.Untrusted(extName, pkgName, versionName, versionCode, signatureHash) + val extension = Extension.Untrusted(extName, pkgName, versionName, versionCode, libVersion, signatureHash) Timber.w("Extension $pkgName isn't trusted") return LoadResult.Untrusted(extension) } @@ -192,14 +192,15 @@ internal object ExtensionLoader { } val extension = Extension.Installed( - extName, - pkgName, - versionName, - versionCode, - lang, - isNsfw, - hasReadme, - hasChangelog, + name = extName, + pkgName = pkgName, + versionName = versionName, + versionCode = versionCode, + libVersion = libVersion, + lang = lang, + isNsfw = isNsfw, + hasReadme = hasReadme, + hasChangelog = hasChangelog, sources = sources, pkgFactory = appInfo.metaData.getString(METADATA_SOURCE_FACTORY), isUnofficial = signatureHash != officialSignature,