|
|
|
|
@ -10,6 +10,7 @@ import org.koitharu.kotatsu.core.cache.ContentCache
|
|
|
|
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
|
|
|
|
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaChapters
|
|
|
|
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
|
|
|
|
import org.koitharu.kotatsu.history.domain.HistoryRepository
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.Manga
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
|
|
|
|
@ -26,6 +27,9 @@ class MangaPrefetchService : CoroutineIntentService() {
|
|
|
|
|
@Inject
|
|
|
|
|
lateinit var cache: ContentCache
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
|
lateinit var historyRepository: HistoryRepository
|
|
|
|
|
|
|
|
|
|
override suspend fun processIntent(startId: Int, intent: Intent) {
|
|
|
|
|
when (intent.action) {
|
|
|
|
|
ACTION_PREFETCH_DETAILS -> prefetchDetails(
|
|
|
|
|
@ -36,6 +40,8 @@ class MangaPrefetchService : CoroutineIntentService() {
|
|
|
|
|
chapter = intent.getParcelableExtraCompat<ParcelableMangaChapters>(EXTRA_CHAPTER)
|
|
|
|
|
?.chapters?.singleOrNull() ?: return,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
ACTION_PREFETCH_LAST -> prefetchLast()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -51,12 +57,31 @@ class MangaPrefetchService : CoroutineIntentService() {
|
|
|
|
|
runCatchingCancellable { source.getPages(chapter) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun prefetchLast() {
|
|
|
|
|
val last = historyRepository.getLastOrNull() ?: return
|
|
|
|
|
if (last.source == MangaSource.LOCAL) return
|
|
|
|
|
val repo = mangaRepositoryFactory.create(last.source)
|
|
|
|
|
val details = runCatchingCancellable { repo.getDetails(last) }.getOrNull() ?: return
|
|
|
|
|
val chapters = details.chapters
|
|
|
|
|
if (chapters.isNullOrEmpty()) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
val history = historyRepository.getOne(last)
|
|
|
|
|
val chapter = if (history == null) {
|
|
|
|
|
chapters.firstOrNull()
|
|
|
|
|
} else {
|
|
|
|
|
chapters.find { x -> x.id == history.chapterId } ?: chapters.firstOrNull()
|
|
|
|
|
} ?: return
|
|
|
|
|
runCatchingCancellable { repo.getPages(chapter) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
|
|
|
|
|
private const val EXTRA_MANGA = "manga"
|
|
|
|
|
private const val EXTRA_CHAPTER = "manga"
|
|
|
|
|
private const val ACTION_PREFETCH_DETAILS = "details"
|
|
|
|
|
private const val ACTION_PREFETCH_PAGES = "pages"
|
|
|
|
|
private const val ACTION_PREFETCH_LAST = "last"
|
|
|
|
|
|
|
|
|
|
fun prefetchDetails(context: Context, manga: Manga) {
|
|
|
|
|
if (!isPrefetchAvailable(context, manga.source)) return
|
|
|
|
|
@ -74,7 +99,14 @@ class MangaPrefetchService : CoroutineIntentService() {
|
|
|
|
|
context.startService(intent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun isPrefetchAvailable(context: Context, source: MangaSource): Boolean {
|
|
|
|
|
fun prefetchLast(context: Context) {
|
|
|
|
|
if (!isPrefetchAvailable(context, null)) return
|
|
|
|
|
val intent = Intent(context, MangaPrefetchService::class.java)
|
|
|
|
|
intent.action = ACTION_PREFETCH_LAST
|
|
|
|
|
context.startService(intent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun isPrefetchAvailable(context: Context, source: MangaSource?): Boolean {
|
|
|
|
|
if (source == MangaSource.LOCAL) {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|