chore: Disable "unofficial" state

This commit is contained in:
ziro 2024-01-11 15:01:43 +07:00
parent 33cb4532e4
commit 23db98d356
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
10 changed files with 32 additions and 78 deletions

View file

@ -198,7 +198,7 @@ class ExtensionManager(
val pkgName = installedExt.pkgName val pkgName = installedExt.pkgName
val availableExt = availableExtensions.find { it.pkgName == pkgName } val availableExt = availableExtensions.find { it.pkgName == pkgName }
if (!installedExt.isUnofficial && availableExt == null != installedExt.isObsolete) { if (availableExt == null != installedExt.isObsolete) {
mutInstalledExtensions[index] = installedExt.copy(isObsolete = true) mutInstalledExtensions[index] = installedExt.copy(isObsolete = true)
changed = true changed = true
} }
@ -422,7 +422,7 @@ class ExtensionManager(
private fun Extension.Installed.updateExists(availableExtension: Extension.Available? = null): Boolean { private fun Extension.Installed.updateExists(availableExtension: Extension.Available? = null): Boolean {
val availableExt = availableExtension ?: availableExtensionsFlow.value.find { it.pkgName == pkgName } val availableExt = availableExtension ?: availableExtensionsFlow.value.find { it.pkgName == pkgName }
if (isUnofficial || availableExt == null) return false if (availableExt == null) return false
return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion)
} }

View file

@ -79,7 +79,7 @@ internal class ExtensionGithubApi {
val availableExt = extensions.find { it.pkgName == pkgName } ?: continue val availableExt = extensions.find { it.pkgName == pkgName } ?: continue
val hasUpdatedVer = availableExt.versionCode > installedExt.versionCode val hasUpdatedVer = availableExt.versionCode > installedExt.versionCode
val hasUpdatedLib = availableExt.libVersion > installedExt.libVersion val hasUpdatedLib = availableExt.libVersion > installedExt.libVersion
val hasUpdate = installedExt.isUnofficial.not() && (hasUpdatedVer || hasUpdatedLib) val hasUpdate = hasUpdatedVer || hasUpdatedLib
if (hasUpdate) { if (hasUpdate) {
extensionsWithUpdate.add(availableExt) extensionsWithUpdate.add(availableExt)
} }
@ -130,8 +130,8 @@ internal class ExtensionGithubApi {
} }
} }
private const val REPO_URL_PREFIX = "https://raw.githubusercontent.com/keiyoushi/extensions/repo/" const val REPO_URL_PREFIX = "https://raw.githubusercontent.com/keiyoushi/extensions/repo/"
private const val FALLBACK_REPO_URL_PREFIX = "https://gcore.jsdelivr.net/gh/keiyoushi/extensions@repo/" const val FALLBACK_REPO_URL_PREFIX = "https://gcore.jsdelivr.net/gh/keiyoushi/extensions@repo/"
@Serializable @Serializable
private data class ExtensionJsonObject( private data class ExtensionJsonObject(

View file

@ -94,7 +94,6 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
binding.lang.text = LocaleHelper.getDisplayName(extension.lang) binding.lang.text = LocaleHelper.getDisplayName(extension.lang)
binding.warning.text = when { binding.warning.text = when {
extension is Extension.Untrusted -> itemView.context.getString(R.string.untrusted) extension is Extension.Untrusted -> itemView.context.getString(R.string.untrusted)
extension is Extension.Installed && extension.isUnofficial -> itemView.context.getString(R.string.unofficial)
extension is Extension.Installed && extension.isObsolete -> itemView.context.getString(R.string.obsolete) extension is Extension.Installed && extension.isObsolete -> itemView.context.getString(R.string.obsolete)
extension.isNsfw -> itemView.context.getString(R.string.nsfw_short) extension.isNsfw -> itemView.context.getString(R.string.nsfw_short)
else -> "" else -> ""

View file

@ -27,6 +27,7 @@ import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore
import eu.kanade.tachiyomi.core.preference.minusAssign import eu.kanade.tachiyomi.core.preference.minusAssign
import eu.kanade.tachiyomi.core.preference.plusAssign import eu.kanade.tachiyomi.core.preference.plusAssign
import eu.kanade.tachiyomi.databinding.ExtensionDetailControllerBinding import eu.kanade.tachiyomi.databinding.ExtensionDetailControllerBinding
import eu.kanade.tachiyomi.extension.api.REPO_URL_PREFIX
import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
@ -153,64 +154,29 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.extension_details, menu) inflater.inflate(R.menu.extension_details, menu)
presenter.extension?.let { extension ->
menu.findItem(R.id.action_history).isVisible = !extension.isUnofficial
menu.findItem(R.id.action_readme).isVisible = !extension.isUnofficial
if (extension.hasReadme) {
menu.findItem(R.id.action_readme).icon = view?.context?.contextCompatDrawable(R.drawable.ic_help_24dp)
}
}
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_history -> openChangelog() R.id.action_open_repo -> openRepo()
R.id.action_readme -> openReadme()
R.id.action_clear_cookies -> clearCookies() R.id.action_clear_cookies -> clearCookies()
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
private fun openChangelog() { private fun openRepo() {
val extension = presenter.extension!! // TODO
val pkgName = extension.pkgName.substringAfter("eu.kanade.tachiyomi.extension.") // val url = getUrl(extension.repoUrl)
val pkgFactory = extension.pkgFactory val url = getUrl()
if (extension.hasChangelog) {
val url = createUrl(URL_EXTENSION_BLOB, pkgName, pkgFactory, "/CHANGELOG.md")
openInBrowser(url)
return
}
// Falling back on GitHub commit history because there is no explicit changelog in extension
val url = createUrl(URL_EXTENSION_COMMITS, pkgName, pkgFactory)
openInBrowser(url) openInBrowser(url)
} }
private fun createUrl(url: String, pkgName: String, pkgFactory: String?, path: String = ""): String { private fun getUrl(repoUrl: String? = REPO_URL_PREFIX): String? {
return if (!pkgFactory.isNullOrEmpty()) { val regex = """https://raw.githubusercontent.com/(.+?)/(.+?)/.+""".toRegex()
when (path.isEmpty()) { return regex.find(repoUrl.orEmpty())?.let {
true -> "$url/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/$pkgFactory" val (user, repo) = it.destructured
else -> "$url/multisrc/overrides/$pkgFactory/" + (pkgName.split(".").lastOrNull() ?: "") + path "https://github.com/$user/$repo"
} } ?: repoUrl
} else {
url + "/src/" + pkgName.replace(".", "/") + path
}
}
private fun openReadme() {
val extension = presenter.extension!!
if (!extension.hasReadme) {
openInBrowser("https://tachiyomi.org/docs/faq/browse/extensions")
return
}
val pkgName = extension.pkgName.substringAfter("eu.kanade.tachiyomi.extension.")
val pkgFactory = extension.pkgFactory
val url = createUrl(URL_EXTENSION_BLOB, pkgName, pkgFactory, "/README.md")
openInBrowser(url)
return
} }
private fun clearCookies() { private fun clearCookies() {
@ -396,9 +362,5 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
private companion object { private companion object {
const val PKGNAME_KEY = "pkg_name" const val PKGNAME_KEY = "pkg_name"
const val LASTOPENPREFERENCE_KEY = "last_open_preference" const val LASTOPENPREFERENCE_KEY = "last_open_preference"
private const val URL_EXTENSION_BLOB =
"https://github.com/tachiyomiorg/tachiyomi-extensions/blob/master"
private const val URL_EXTENSION_COMMITS =
"https://github.com/tachiyomiorg/tachiyomi-extensions/commits/master"
} }
} }

View file

@ -75,10 +75,7 @@ class ExtensionDetailsHeaderAdapter(private val presenter: ExtensionDetailsPrese
binding.extensionUninstallButton.text = context.getString(R.string.remove) binding.extensionUninstallButton.text = context.getString(R.string.remove)
} }
if (extension.isUnofficial) { if (extension.isObsolete) {
binding.extensionWarningBanner.isVisible = true
binding.extensionWarningBanner.setText(R.string.unofficial_extension_message)
} else if (extension.isObsolete) {
binding.extensionWarningBanner.isVisible = true binding.extensionWarningBanner.isVisible = true
binding.extensionWarningBanner.setText(R.string.obsolete_extension_message) binding.extensionWarningBanner.setText(R.string.obsolete_extension_message)
} }

View file

@ -2,14 +2,10 @@ package eu.kanade.tachiyomi.ui.more
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder import androidx.preference.PreferenceViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.openInBrowser
import eu.kanade.tachiyomi.util.view.checkHeightThen
import eu.kanade.tachiyomi.util.view.compatToolTipText import eu.kanade.tachiyomi.util.view.compatToolTipText
class AboutLinksPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : class AboutLinksPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :

View file

@ -59,13 +59,12 @@ class CrashLogUtil(private val context: Context) {
val availableExtension = availableExtensions.find { it.pkgName == installedExtension.pkgName } val availableExtension = availableExtensions.find { it.pkgName == installedExtension.pkgName }
val hasUpdate = (availableExtension?.versionCode ?: 0) > installedExtension.versionCode val hasUpdate = (availableExtension?.versionCode ?: 0) > installedExtension.versionCode
if (hasUpdate || installedExtension.isObsolete || installedExtension.isUnofficial) { if (hasUpdate || installedExtension.isObsolete) {
val extensionInfo = val extensionInfo =
"Extension Name: ${installedExtension.name}\n" + "Extension Name: ${installedExtension.name}\n" +
"Installed Version: ${installedExtension.versionName}\n" + "Installed Version: ${installedExtension.versionName}\n" +
"Available Version: ${availableExtension?.versionName ?: "N/A"}\n" + "Available Version: ${availableExtension?.versionName ?: "N/A"}\n" +
"Obsolete: ${installedExtension.isObsolete}\n" + "Obsolete: ${installedExtension.isObsolete}\n"
"Unofficial: ${installedExtension.isUnofficial}\n"
extensionInfoList.add(extensionInfo) extensionInfoList.add(extensionInfo)
} }
} }

View file

@ -847,7 +847,12 @@ fun Controller.withFadeInTransaction(): RouterTransaction {
.popChangeHandler(OneWayFadeChangeHandler()) .popChangeHandler(OneWayFadeChangeHandler())
} }
fun Controller.openInBrowser(url: String) { fun Controller.openInBrowser(url: String?) {
if (url == null) {
activity?.toast(R.string.open_in_browser_fail)
return
}
try { try {
val intent = Intent(Intent.ACTION_VIEW, url.toUri()) val intent = Intent(Intent.ACTION_VIEW, url.toUri())
startActivity(intent) startActivity(intent)

View file

@ -2,15 +2,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/action_history" android:id="@+id/action_open_repo"
android:icon="@drawable/ic_history_24dp" android:icon="@drawable/ic_open_in_webview_24dp"
android:title="@string/whats_new" android:title="@string/action_open_repo"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_readme"
android:icon="@drawable/ic_help_outline_24dp"
android:title="@string/faq_and_guides"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item

View file

@ -918,6 +918,8 @@
<string name="helpful_translation_links">Helpful translation links</string> <string name="helpful_translation_links">Helpful translation links</string>
<string name="website">Website</string> <string name="website">Website</string>
<string name="open_source_licenses">Open source licenses</string> <string name="open_source_licenses">Open source licenses</string>
<string name="action_open_repo">Open source repo</string>
<string name="open_in_browser_fail">Unable to open url</string>
<!-- Login/Logout dialog --> <!-- Login/Logout dialog -->
<string name="log_in_to_">Log in to %1$s</string> <string name="log_in_to_">Log in to %1$s</string>