|
|
|
@ -6,17 +6,24 @@ import android.content.pm.ShortcutInfo
|
|
|
|
|
import android.content.pm.ShortcutManager
|
|
|
|
|
import android.graphics.Bitmap
|
|
|
|
|
import android.graphics.BitmapFactory
|
|
|
|
|
import android.graphics.drawable.BitmapDrawable
|
|
|
|
|
import android.graphics.drawable.Icon
|
|
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
|
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
|
|
|
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
|
|
|
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
|
|
|
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
|
|
|
|
import eu.kanade.tachiyomi.source.Source
|
|
|
|
|
import eu.kanade.tachiyomi.source.SourceManager
|
|
|
|
|
import eu.kanade.tachiyomi.source.icon
|
|
|
|
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
|
|
|
|
import eu.kanade.tachiyomi.ui.main.SearchActivity
|
|
|
|
|
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
|
|
|
|
|
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
|
|
|
|
|
import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController
|
|
|
|
|
import eu.kanade.tachiyomi.util.system.launchIO
|
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
|
import timber.log.Timber
|
|
|
|
|
import uy.kohesive.injekt.Injekt
|
|
|
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
|
import java.util.Date
|
|
|
|
@ -25,7 +32,8 @@ import kotlin.math.min
|
|
|
|
|
class MangaShortcutManager(
|
|
|
|
|
val preferences: PreferencesHelper = Injekt.get(),
|
|
|
|
|
val db: DatabaseHelper = Injekt.get(),
|
|
|
|
|
val coverCache: CoverCache = Injekt.get()
|
|
|
|
|
val coverCache: CoverCache = Injekt.get(),
|
|
|
|
|
val sourceManager: SourceManager = Injekt.get()
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
|
|
val context: Context = preferences.context
|
|
|
|
@ -35,20 +43,41 @@ class MangaShortcutManager(
|
|
|
|
|
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
|
|
|
|
|
|
|
|
|
|
val recentManga = RecentsPresenter.getRecentManga()
|
|
|
|
|
val shortcuts = recentManga.subList(
|
|
|
|
|
val recentSources = preferences.lastUsedSources().get().mapNotNull {
|
|
|
|
|
val splitS = it.split(":")
|
|
|
|
|
splitS.first().toLongOrNull()?.let { id ->
|
|
|
|
|
sourceManager.getOrStub(id) to splitS[1].toLong()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var recents = (
|
|
|
|
|
recentManga.subList(
|
|
|
|
|
0,
|
|
|
|
|
min(
|
|
|
|
|
recentManga.size,
|
|
|
|
|
shortcutManager.maxShortcutCountPerActivity
|
|
|
|
|
)
|
|
|
|
|
) + recentSources
|
|
|
|
|
)
|
|
|
|
|
.sortedByDescending { it.second }.map { it.first }
|
|
|
|
|
|
|
|
|
|
recents = recents.subList(
|
|
|
|
|
0,
|
|
|
|
|
min(
|
|
|
|
|
recentManga.size,
|
|
|
|
|
shortcutManager.maxShortcutCountPerActivity
|
|
|
|
|
)
|
|
|
|
|
).map { manga ->
|
|
|
|
|
val customCoverFile = coverCache.getCustomCoverFile(manga)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val shortcuts = recents.mapNotNull { item ->
|
|
|
|
|
when (item) {
|
|
|
|
|
is Manga -> {
|
|
|
|
|
val customCoverFile = coverCache.getCustomCoverFile(item)
|
|
|
|
|
val coverFile = if (customCoverFile.exists()) {
|
|
|
|
|
customCoverFile
|
|
|
|
|
} else {
|
|
|
|
|
val coverFile = coverCache.getCoverFile(manga)
|
|
|
|
|
val coverFile = coverCache.getCoverFile(item)
|
|
|
|
|
if (coverFile.exists()) {
|
|
|
|
|
if (!manga.favorite) {
|
|
|
|
|
if (!item.favorite) {
|
|
|
|
|
coverFile.setLastModified(Date().time)
|
|
|
|
|
}
|
|
|
|
|
coverFile
|
|
|
|
@ -62,9 +91,9 @@ class MangaShortcutManager(
|
|
|
|
|
null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ShortcutInfo.Builder(context, "Manga-${manga.id?.toString() ?: manga.title}")
|
|
|
|
|
.setShortLabel(manga.title)
|
|
|
|
|
.setLongLabel(manga.title)
|
|
|
|
|
ShortcutInfo.Builder(context, "Manga-${item.id?.toString() ?: item.title}")
|
|
|
|
|
.setShortLabel(item.title)
|
|
|
|
|
.setLongLabel(item.title)
|
|
|
|
|
.setIcon(
|
|
|
|
|
if (bitmap != null) if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
|
|
|
Icon.createWithAdaptiveBitmap(bitmap.toSquare())
|
|
|
|
@ -79,10 +108,40 @@ class MangaShortcutManager(
|
|
|
|
|
SearchActivity::class.java
|
|
|
|
|
).setAction(MainActivity.SHORTCUT_MANGA)
|
|
|
|
|
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
|
|
|
|
.putExtra(MangaDetailsController.MANGA_EXTRA, manga.id)
|
|
|
|
|
.putExtra(MangaDetailsController.MANGA_EXTRA, item.id)
|
|
|
|
|
)
|
|
|
|
|
.build()
|
|
|
|
|
}
|
|
|
|
|
is Source -> {
|
|
|
|
|
val bitmap = (item.icon() as? BitmapDrawable)?.bitmap
|
|
|
|
|
|
|
|
|
|
ShortcutInfo.Builder(context, "Source-${item.id}")
|
|
|
|
|
.setShortLabel(item.name)
|
|
|
|
|
.setLongLabel(item.name)
|
|
|
|
|
.setIcon(
|
|
|
|
|
if (bitmap != null) if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
|
|
|
Icon.createWithAdaptiveBitmap(bitmap.toSquare())
|
|
|
|
|
} else {
|
|
|
|
|
Icon.createWithBitmap(bitmap)
|
|
|
|
|
}
|
|
|
|
|
else Icon.createWithResource(context, R.drawable.ic_extension_update_24dp)
|
|
|
|
|
)
|
|
|
|
|
.setIntent(
|
|
|
|
|
Intent(
|
|
|
|
|
context,
|
|
|
|
|
SearchActivity::class.java
|
|
|
|
|
).setAction(MainActivity.SHORTCUT_SOURCE)
|
|
|
|
|
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
|
|
|
|
.putExtra(BrowseSourceController.SOURCE_ID_KEY, item.id)
|
|
|
|
|
)
|
|
|
|
|
.build()
|
|
|
|
|
}
|
|
|
|
|
else -> {
|
|
|
|
|
null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Timber.d("Shortcuts: ${shortcuts.joinToString(", ") { it.longLabel ?: "n/a" }}")
|
|
|
|
|
shortcutManager.dynamicShortcuts = shortcuts
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|