mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 16:18:55 +01:00 
			
		
		
		
	Indicate obsolete extensions (#2494)
* Indicate obsolete extensions * Make obsolete indicators red * Move obsolete extensions up the list * Add base button theme for holder * Use red button color state instead of explicit text color
This commit is contained in:
		@@ -71,7 +71,7 @@ class ExtensionManager(
 | 
			
		||||
        private set(value) {
 | 
			
		||||
            field = value
 | 
			
		||||
            availableExtensionsRelay.call(value)
 | 
			
		||||
            setUpdateFieldOfInstalledExtensions(value)
 | 
			
		||||
            updatedInstalledExtensionsStatuses(value)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -158,18 +158,25 @@ class ExtensionManager(
 | 
			
		||||
     *
 | 
			
		||||
     * @param availableExtensions The list of extensions given by the [api].
 | 
			
		||||
     */
 | 
			
		||||
    private fun setUpdateFieldOfInstalledExtensions(availableExtensions: List<Extension.Available>) {
 | 
			
		||||
    private fun updatedInstalledExtensionsStatuses(availableExtensions: List<Extension.Available>) {
 | 
			
		||||
        val mutInstalledExtensions = installedExtensions.toMutableList()
 | 
			
		||||
        var changed = false
 | 
			
		||||
 | 
			
		||||
        for ((index, installedExt) in mutInstalledExtensions.withIndex()) {
 | 
			
		||||
            val pkgName = installedExt.pkgName
 | 
			
		||||
            val availableExt = availableExtensions.find { it.pkgName == pkgName } ?: continue
 | 
			
		||||
            val availableExt = availableExtensions.find { it.pkgName == pkgName }
 | 
			
		||||
 | 
			
		||||
            val hasUpdate = availableExt.versionCode > installedExt.versionCode
 | 
			
		||||
            if (installedExt.hasUpdate != hasUpdate) {
 | 
			
		||||
                mutInstalledExtensions[index] = installedExt.copy(hasUpdate = hasUpdate)
 | 
			
		||||
                changed = true
 | 
			
		||||
            if (availableExt == null) {
 | 
			
		||||
                if (!installedExt.isObsolete) {
 | 
			
		||||
                    mutInstalledExtensions[index] = installedExt.copy(isObsolete = true)
 | 
			
		||||
                    changed = true
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                val hasUpdate = availableExt.versionCode > installedExt.versionCode
 | 
			
		||||
                if (installedExt.hasUpdate != hasUpdate) {
 | 
			
		||||
                    mutInstalledExtensions[index] = installedExt.copy(hasUpdate = hasUpdate)
 | 
			
		||||
                    changed = true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (changed) {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,8 @@ sealed class Extension {
 | 
			
		||||
                         override val versionCode: Int,
 | 
			
		||||
                         val sources: List<Source>,
 | 
			
		||||
                         override val lang: String,
 | 
			
		||||
                         val hasUpdate: Boolean = false) : Extension()
 | 
			
		||||
                         val hasUpdate: Boolean = false,
 | 
			
		||||
                         val isObsolete: Boolean = false) : Extension()
 | 
			
		||||
 | 
			
		||||
    data class Available(override val name: String,
 | 
			
		||||
                         override val pkgName: String,
 | 
			
		||||
 
 | 
			
		||||
@@ -69,6 +69,10 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
 | 
			
		||||
            presenter.uninstallExtension()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (extension.isObsolete) {
 | 
			
		||||
            extension_obsolete.visibility = View.VISIBLE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val themedContext by lazy { getPreferenceThemeContext() }
 | 
			
		||||
        val manager = PreferenceManager(themedContext)
 | 
			
		||||
        manager.preferenceDataStore = EmptyPreferenceDataStore()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.extension
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.extension.model.Extension
 | 
			
		||||
@@ -52,11 +54,15 @@ class ExtensionHolder(view: View, override val adapter: ExtensionAdapter) :
 | 
			
		||||
        bindButton(item)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Suppress("ResourceType")
 | 
			
		||||
    fun bindButton(item: ExtensionItem) = with(ext_button) {
 | 
			
		||||
        isEnabled = true
 | 
			
		||||
        isClickable = true
 | 
			
		||||
        isActivated = false
 | 
			
		||||
 | 
			
		||||
        background = VectorDrawableCompat.create(resources!!, R.drawable.button_bg_transparent, null)
 | 
			
		||||
        setTextColor(ContextCompat.getColorStateList(context, R.drawable.button_bg_transparent))
 | 
			
		||||
 | 
			
		||||
        val extension = item.extension
 | 
			
		||||
 | 
			
		||||
        val installStep = item.installStep
 | 
			
		||||
@@ -73,11 +79,21 @@ class ExtensionHolder(view: View, override val adapter: ExtensionAdapter) :
 | 
			
		||||
                isClickable = false
 | 
			
		||||
            }
 | 
			
		||||
        } else if (extension is Extension.Installed) {
 | 
			
		||||
            if (extension.hasUpdate) {
 | 
			
		||||
                isActivated = true
 | 
			
		||||
                setText(R.string.ext_update)
 | 
			
		||||
            } else {
 | 
			
		||||
                setText(R.string.ext_details)
 | 
			
		||||
            when {
 | 
			
		||||
                extension.hasUpdate -> {
 | 
			
		||||
                    isActivated = true
 | 
			
		||||
                    setText(R.string.ext_update)
 | 
			
		||||
                }
 | 
			
		||||
                extension.isObsolete -> {
 | 
			
		||||
                    // Red outline
 | 
			
		||||
                    background = VectorDrawableCompat.create(resources, R.drawable.button_bg_error, null)
 | 
			
		||||
                    setTextColor(ContextCompat.getColorStateList(context, R.drawable.button_bg_error))
 | 
			
		||||
 | 
			
		||||
                    setText(R.string.ext_obsolete)
 | 
			
		||||
                }
 | 
			
		||||
                else -> {
 | 
			
		||||
                    setText(R.string.ext_details)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else if (extension is Extension.Untrusted) {
 | 
			
		||||
            setText(R.string.ext_trust)
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ open class ExtensionPresenter(
 | 
			
		||||
 | 
			
		||||
        val items = mutableListOf<ExtensionItem>()
 | 
			
		||||
 | 
			
		||||
        val installedSorted = installed.sortedWith(compareBy({ !it.hasUpdate }, { it.pkgName }))
 | 
			
		||||
        val installedSorted = installed.sortedWith(compareBy({ !it.hasUpdate }, { !it.isObsolete }, { it.pkgName }))
 | 
			
		||||
        val untrustedSorted = untrusted.sortedBy { it.pkgName }
 | 
			
		||||
        val availableSorted = available
 | 
			
		||||
                // Filter out already installed extensions and disabled languages
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user