Using extension icon instead of letter for catalogues (closes #2261)

This commit is contained in:
Jay 2020-03-20 01:52:03 -04:00 committed by arkon
parent 224f08279b
commit f115fe47fe
8 changed files with 40 additions and 19 deletions

View file

@ -4,6 +4,7 @@ import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import eu.kanade.tachiyomi.extension.util.ExtensionInstaller
import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.storage.getUriCompat
import java.io.File import java.io.File
@ -48,7 +49,7 @@ object NotificationHandler {
*/ */
fun installApkPendingActivity(context: Context, uri: Uri): PendingIntent { fun installApkPendingActivity(context: Context, uri: Uri): PendingIntent {
val intent = Intent(Intent.ACTION_VIEW).apply { val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/vnd.android.package-archive") setDataAndType(uri, ExtensionInstaller.APK_MIME)
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION
} }
return PendingIntent.getActivity(context, 0, intent, 0) return PendingIntent.getActivity(context, 0, intent, 0)

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.extension package eu.kanade.tachiyomi.extension
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable
import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.BehaviorRelay
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.preference.getOrDefault
@ -11,6 +12,7 @@ import eu.kanade.tachiyomi.extension.model.LoadResult
import eu.kanade.tachiyomi.extension.util.ExtensionInstallReceiver import eu.kanade.tachiyomi.extension.util.ExtensionInstallReceiver
import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import eu.kanade.tachiyomi.extension.util.ExtensionInstaller
import eu.kanade.tachiyomi.extension.util.ExtensionLoader import eu.kanade.tachiyomi.extension.util.ExtensionLoader
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.lang.launchNow import eu.kanade.tachiyomi.util.lang.launchNow
import kotlinx.coroutines.async import kotlinx.coroutines.async
@ -57,6 +59,12 @@ class ExtensionManager(
installedExtensionsRelay.call(value) installedExtensionsRelay.call(value)
} }
fun getAppIconForSource(source: Source): Drawable? {
val pkgName = installedExtensions.find { ext -> ext.sources.any { it.id == source.id } }?.pkgName
return if (pkgName != null) context.packageManager.getApplicationIcon(pkgName)
else null
}
/** /**
* Relay used to notify the available extensions. * Relay used to notify the available extensions.
*/ */

View file

@ -159,7 +159,7 @@ internal class ExtensionInstaller(private val context: Context) {
* *
* @param pkgName The package name of the download to delete. * @param pkgName The package name of the download to delete.
*/ */
fun deleteDownload(pkgName: String) { private fun deleteDownload(pkgName: String) {
val downloadId = activeDownloads.remove(pkgName) val downloadId = activeDownloads.remove(pkgName)
if (downloadId != null) { if (downloadId != null) {
downloadManager.remove(downloadId) downloadManager.remove(downloadId)

View file

@ -1,9 +1,13 @@
package eu.kanade.tachiyomi.source package eu.kanade.tachiyomi.source
import android.graphics.drawable.Drawable
import eu.kanade.tachiyomi.extension.ExtensionManager
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import rx.Observable import rx.Observable
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
/** /**
* A basic interface for creating a source. It could be an online source, a local source, etc... * A basic interface for creating a source. It could be an online source, a local source, etc...
@ -41,3 +45,5 @@ interface Source {
*/ */
fun fetchPageList(chapter: SChapter): Observable<List<Page>> fun fetchPageList(chapter: SChapter): Observable<List<Page>>
} }
fun Source.icon(): Drawable? = Injekt.get<ExtensionManager>().getAppIconForSource(this)

View file

@ -2,10 +2,11 @@ package eu.kanade.tachiyomi.ui.catalogue
import android.view.View import android.view.View
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
import eu.kanade.tachiyomi.util.view.getRound
import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.util.view.roundTextIcon
import eu.kanade.tachiyomi.util.view.visible import eu.kanade.tachiyomi.util.view.visible
import io.github.mthli.slice.Slice import io.github.mthli.slice.Slice
import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.card import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.card
@ -44,7 +45,9 @@ class SourceHolder(view: View, override val adapter: CatalogueAdapter) :
// Set circle letter image. // Set circle letter image.
itemView.post { itemView.post {
image.setImageDrawable(image.getRound(source.name.take(1).toUpperCase(), false)) val icon = source.icon()
if (icon != null) image.setImageDrawable(icon)
else image.roundTextIcon(source.name)
} }
source_browse.setText(R.string.browse) source_browse.setText(R.string.browse)

View file

@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.ui.category
import android.view.View import android.view.View
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.util.view.getRound import eu.kanade.tachiyomi.util.view.roundTextIcon
import kotlinx.android.synthetic.main.categories_item.image import kotlinx.android.synthetic.main.categories_item.image
import kotlinx.android.synthetic.main.categories_item.reorder import kotlinx.android.synthetic.main.categories_item.reorder
import kotlinx.android.synthetic.main.categories_item.title import kotlinx.android.synthetic.main.categories_item.title
@ -37,7 +37,7 @@ class CategoryHolder(view: View, val adapter: CategoryAdapter) : BaseFlexibleVie
// Update circle letter image. // Update circle letter image.
itemView.post { itemView.post {
image.setImageDrawable(image.getRound(category.name.take(1).toUpperCase(), false)) image.roundTextIcon(category.name)
} }
} }

View file

@ -2,10 +2,11 @@ package eu.kanade.tachiyomi.ui.migration
import android.view.View import android.view.View
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
import eu.kanade.tachiyomi.util.view.getRound
import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.util.view.roundTextIcon
import io.github.mthli.slice.Slice import io.github.mthli.slice.Slice
import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.card import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.card
import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.image import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.image
@ -41,7 +42,9 @@ class SourceHolder(view: View, override val adapter: SourceAdapter) :
// Set circle letter image. // Set circle letter image.
itemView.post { itemView.post {
image.setImageDrawable(image.getRound(source.name.take(1).toUpperCase(), false)) val icon = source.icon()
if (icon != null) image.setImageDrawable(icon)
else image.roundTextIcon(source.name)
} }
} }
} }

View file

@ -9,6 +9,7 @@ import android.view.Gravity
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.annotation.MenuRes import androidx.annotation.MenuRes
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
@ -78,19 +79,18 @@ inline fun View.visibleIf(block: () -> Boolean) {
} }
/** /**
* Returns a TextDrawable determined by input * Sets a round TextDrawable into an ImageView determined by input.
* *
* @param text text of [TextDrawable] * @param text text of [TextDrawable]
* @param random random color
*/ */
fun View.getRound(text: String, random: Boolean = true): TextDrawable { fun ImageView.roundTextIcon(text: String) {
val letter = text.take(1).toUpperCase()
val size = min(this.width, this.height) val size = min(this.width, this.height)
return TextDrawable.builder()
.beginConfig() setImageDrawable(
.width(size) TextDrawable.builder().beginConfig().width(size).height(size).textColor(Color.WHITE)
.height(size) .useFont(Typeface.DEFAULT).endConfig().buildRound(
.textColor(Color.WHITE) letter, ColorGenerator.MATERIAL.getColor(letter)
.useFont(Typeface.DEFAULT) )
.endConfig() )
.buildRound(text, if (random) ColorGenerator.MATERIAL.randomColor else ColorGenerator.MATERIAL.getColor(text))
} }