From 6d255f25ad1e95ca333af2b8ca4d5515055b685f Mon Sep 17 00:00:00 2001 From: "Cuong M. Tran" Date: Mon, 18 Mar 2024 14:11:59 +0700 Subject: [PATCH] Revert "Remove custom extension readme/changelog URLs" This reverts commit cf5bb4dc9be69e2712674573e9a38c73168b38e9. # Conflicts: # app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt This reverts commit cf5bb4dc9be69e2712674573e9a38c73168b38e9. # Conflicts: # app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt --- .../browse/ExtensionDetailsScreen.kt | 24 ++++++++-- .../tachiyomi/extension/api/ExtensionApi.kt | 4 ++ .../tachiyomi/extension/model/Extension.kt | 8 ++++ .../extension/util/ExtensionLoader.kt | 7 +++ .../details/ExtensionDetailsScreen.kt | 4 ++ .../details/ExtensionDetailsScreenModel.kt | 46 +++++++++++++++++++ .../commonMain/resources/MR/base/strings.xml | 1 + 7 files changed, 91 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt index 16871306e..bbd9715e5 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt @@ -16,7 +16,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.outlined.Launch +import androidx.compose.material.icons.automirrored.outlined.HelpOutline +import androidx.compose.material.icons.outlined.History import androidx.compose.material.icons.outlined.Settings import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button @@ -69,6 +70,8 @@ fun ExtensionDetailsScreen( navigateUp: () -> Unit, state: ExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, + onClickWhatsNew: () -> Unit, + onClickReadme: () -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, @@ -95,11 +98,26 @@ fun ExtensionDetailsScreen( AppBarActions( actions = persistentListOf().builder() .apply { - if (url != null) { + if (state.extension?.isUnofficial == false) { add( AppBar.Action( + title = stringResource(MR.strings.whats_new), + icon = Icons.Outlined.History, + onClick = onClickWhatsNew, + ), + ) + add( + AppBar.Action( + title = stringResource(MR.strings.action_faq_and_guides), + icon = Icons.AutoMirrored.Outlined.HelpOutline, + onClick = onClickReadme, + ), + ) + } + if (url != null) { + add( + AppBar.OverflowAction( title = stringResource(MR.strings.action_open_repo), - icon = Icons.AutoMirrored.Outlined.Launch, onClick = { uriHandler.openUri(url) }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt index e43ec5cd9..d32f6f0c0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt @@ -126,6 +126,8 @@ internal class ExtensionApi { libVersion = it.extractLibVersion(), lang = it.lang, isNsfw = it.nsfw == 1, + hasReadme = it.hasReadme == 1, + hasChangelog = it.hasChangelog == 1, sources = it.sources?.map(extensionSourceMapper).orEmpty(), apkName = it.apk, iconUrl = "$repoUrl/icon/${it.pkg}.png", @@ -160,6 +162,8 @@ private data class ExtensionJsonObject( val code: Long, val version: String, val nsfw: Int, + val hasReadme: Int = 0, + val hasChangelog: Int = 0, val sources: List?, ) 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 1789f8887..6c2478141 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 @@ -13,6 +13,8 @@ sealed class Extension { abstract val libVersion: Double abstract val lang: String? abstract val isNsfw: Boolean + abstract val hasReadme: Boolean + abstract val hasChangelog: Boolean data class Installed( override val name: String, @@ -22,6 +24,8 @@ sealed class Extension { override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, + override val hasReadme: Boolean, + override val hasChangelog: Boolean, val pkgFactory: String?, val sources: List, val icon: Drawable?, @@ -43,6 +47,8 @@ sealed class Extension { override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, + override val hasReadme: Boolean, + override val hasChangelog: Boolean, val sources: List, val apkName: String, val iconUrl: String, @@ -74,5 +80,7 @@ sealed class Extension { val signatureHash: String, override val lang: String? = null, override val isNsfw: Boolean = false, + override val hasReadme: Boolean = false, + override val hasChangelog: Boolean = false, ) : Extension() } 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 2b607427c..4a54317f8 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 @@ -50,6 +50,8 @@ internal object ExtensionLoader { private const val METADATA_SOURCE_CLASS = "tachiyomi.extension.class" private const val METADATA_SOURCE_FACTORY = "tachiyomi.extension.factory" private const val METADATA_NSFW = "tachiyomi.extension.nsfw" + private const val METADATA_HAS_README = "tachiyomi.extension.hasReadme" + private const val METADATA_HAS_CHANGELOG = "tachiyomi.extension.hasChangelog" const val LIB_VERSION_MIN = 1.4 const val LIB_VERSION_MAX = 1.5 @@ -275,6 +277,9 @@ internal object ExtensionLoader { return LoadResult.Error } + val hasReadme = appInfo.metaData.getInt(METADATA_HAS_README, 0) == 1 + val hasChangelog = appInfo.metaData.getInt(METADATA_HAS_CHANGELOG, 0) == 1 + val classLoader = try { ChildFirstPathClassLoader(appInfo.sourceDir, null, context.classLoader) } catch (e: Exception) { @@ -322,6 +327,8 @@ internal object ExtensionLoader { libVersion = libVersion, lang = lang, isNsfw = isNsfw, + hasReadme = hasReadme, + hasChangelog = hasChangelog, sources = sources, pkgFactory = appInfo.metaData.getString(METADATA_SOURCE_FACTORY), isUnofficial = !isOfficiallySigned(signatures), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreen.kt index 4a4a78cde..1797dc89d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -29,11 +30,14 @@ data class ExtensionDetailsScreen( } val navigator = LocalNavigator.currentOrThrow + val uriHandler = LocalUriHandler.current ExtensionDetailsScreen( navigateUp = navigator::pop, state = state, onClickSourcePreferences = { navigator.push(SourcePreferencesScreen(it)) }, + onClickWhatsNew = { uriHandler.openUri(screenModel.getChangelogUrl()) }, + onClickReadme = { uriHandler.openUri(screenModel.getReadmeUrl()) }, onClickEnableAll = { screenModel.toggleSources(true) }, onClickDisableAll = { screenModel.toggleSources(false) }, onClickClearCookies = screenModel::clearCookies, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt index 4266c4730..7f9145b28 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt @@ -29,6 +29,11 @@ import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +private const val URL_EXTENSION_COMMITS = + "https://github.com/komikku-app/komikku-extensions/commits/master" +private const val URL_EXTENSION_BLOB = + "https://github.com/komikku-app/komikku-extensions/blob/master" + class ExtensionDetailsScreenModel( pkgName: String, context: Context, @@ -83,6 +88,31 @@ class ExtensionDetailsScreenModel( } } + fun getChangelogUrl(): String { + val extension = state.value.extension ?: return "" + + val pkgName = extension.pkgName.substringAfter("eu.kanade.tachiyomi.extension.") + val pkgFactory = extension.pkgFactory + if (extension.hasChangelog) { + return createUrl(URL_EXTENSION_BLOB, pkgName, pkgFactory, "/CHANGELOG.md") + } + + // Falling back on GitHub commit history because there is no explicit changelog in extension + return createUrl(URL_EXTENSION_COMMITS, pkgName, pkgFactory) + } + + fun getReadmeUrl(): String { + val extension = state.value.extension ?: return "" + + if (!extension.hasReadme) { + return "https://tachiyomi.org/docs/faq/browse/extensions" + } + + val pkgName = extension.pkgName.substringAfter("eu.kanade.tachiyomi.extension.") + val pkgFactory = extension.pkgFactory + return createUrl(URL_EXTENSION_BLOB, pkgName, pkgFactory, "/README.md") + } + fun clearCookies() { val extension = state.value.extension ?: return @@ -118,6 +148,22 @@ class ExtensionDetailsScreenModel( ?.let { toggleSource.await(it, enable) } } + private fun createUrl( + url: String, + pkgName: String, + pkgFactory: String?, + path: String = "", + ): String { + return if (!pkgFactory.isNullOrEmpty()) { + when (path.isEmpty()) { + true -> "$url/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/$pkgFactory" + else -> "$url/multisrc/overrides/$pkgFactory/" + (pkgName.split(".").lastOrNull() ?: "") + path + } + } else { + url + "/src/" + pkgName.replace(".", "/") + path + } + } + @Immutable data class State( val extension: Extension.Installed? = null, diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index af56253ca..42bdc9bca 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -162,6 +162,7 @@ Forward Refresh Start downloading now + FAQ and Guides Not now