|
@@ -2,10 +2,10 @@ package eu.kanade.tachiyomi.ui.browse.source.globalsearch
|
|
|
|
|
|
import android.os.Bundle
|
|
|
import eu.kanade.domain.base.BasePreferences
|
|
|
-import eu.kanade.domain.manga.interactor.GetManga
|
|
|
-import eu.kanade.domain.manga.interactor.InsertManga
|
|
|
+import eu.kanade.domain.manga.interactor.NetworkToLocalManga
|
|
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
|
|
import eu.kanade.domain.manga.model.toDbManga
|
|
|
+import eu.kanade.domain.manga.model.toDomainManga
|
|
|
import eu.kanade.domain.manga.model.toMangaUpdate
|
|
|
import eu.kanade.domain.source.service.SourcePreferences
|
|
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
|
@@ -30,6 +30,7 @@ import rx.subjects.PublishSubject
|
|
|
import uy.kohesive.injekt.Injekt
|
|
|
import uy.kohesive.injekt.api.get
|
|
|
import uy.kohesive.injekt.injectLazy
|
|
|
+import eu.kanade.domain.manga.model.Manga as DomainManga
|
|
|
|
|
|
open class GlobalSearchPresenter(
|
|
|
private val initialQuery: String? = "",
|
|
@@ -37,8 +38,7 @@ open class GlobalSearchPresenter(
|
|
|
val sourceManager: SourceManager = Injekt.get(),
|
|
|
val preferences: BasePreferences = Injekt.get(),
|
|
|
val sourcePreferences: SourcePreferences = Injekt.get(),
|
|
|
- private val getManga: GetManga = Injekt.get(),
|
|
|
- private val insertManga: InsertManga = Injekt.get(),
|
|
|
+ private val networkToLocalManga: NetworkToLocalManga = Injekt.get(),
|
|
|
private val updateManga: UpdateManga = Injekt.get(),
|
|
|
) : BasePresenter<GlobalSearchController>() {
|
|
|
|
|
@@ -55,7 +55,7 @@ open class GlobalSearchPresenter(
|
|
|
/**
|
|
|
* Subject which fetches image of given manga.
|
|
|
*/
|
|
|
- private val fetchImageSubject = PublishSubject.create<Pair<List<Manga>, Source>>()
|
|
|
+ private val fetchImageSubject = PublishSubject.create<Pair<List<DomainManga>, Source>>()
|
|
|
|
|
|
/**
|
|
|
* Subscription for fetching images of manga.
|
|
@@ -168,9 +168,9 @@ open class GlobalSearchPresenter(
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
.onErrorReturn { MangasPage(emptyList(), false) } // Ignore timeouts or other exceptions
|
|
|
.map { it.mangas }
|
|
|
- .map { list -> list.map { networkToLocalManga(it, source.id) } } // Convert to local manga
|
|
|
+ .map { list -> list.map { runBlocking { networkToLocalManga(it, source.id) } } } // Convert to local manga
|
|
|
.doOnNext { fetchImage(it, source) } // Load manga covers
|
|
|
- .map { list -> createCatalogueSearchItem(source, list.map { GlobalSearchCardItem(it.toDomainManga()!!) }) }
|
|
|
+ .map { list -> createCatalogueSearchItem(source, list.map { GlobalSearchCardItem(it) }) }
|
|
|
},
|
|
|
5,
|
|
|
)
|
|
@@ -208,7 +208,7 @@ open class GlobalSearchPresenter(
|
|
|
*
|
|
|
* @param manga the list of manga to initialize.
|
|
|
*/
|
|
|
- private fun fetchImage(manga: List<Manga>, source: Source) {
|
|
|
+ private fun fetchImage(manga: List<DomainManga>, source: Source) {
|
|
|
fetchImageSubject.onNext(Pair(manga, source))
|
|
|
}
|
|
|
|
|
@@ -220,9 +220,9 @@ open class GlobalSearchPresenter(
|
|
|
fetchImageSubscription = fetchImageSubject.observeOn(Schedulers.io())
|
|
|
.flatMap { (first, source) ->
|
|
|
Observable.from(first)
|
|
|
- .filter { it.thumbnail_url == null && !it.initialized }
|
|
|
+ .filter { it.thumbnailUrl == null && !it.initialized }
|
|
|
.map { Pair(it, source) }
|
|
|
- .concatMap { runAsObservable { getMangaDetails(it.first, it.second) } }
|
|
|
+ .concatMap { runAsObservable { getMangaDetails(it.first.toDbManga(), it.second) } }
|
|
|
.map { Pair(source as CatalogueSource, it) }
|
|
|
}
|
|
|
.onBackpressureBuffer()
|
|
@@ -259,22 +259,7 @@ open class GlobalSearchPresenter(
|
|
|
* @param sManga the manga from the source.
|
|
|
* @return a manga from the database.
|
|
|
*/
|
|
|
- protected open fun networkToLocalManga(sManga: SManga, sourceId: Long): Manga {
|
|
|
- var localManga = runBlocking { getManga.await(sManga.url, sourceId) }
|
|
|
- if (localManga == null) {
|
|
|
- val newManga = Manga.create(sManga.url, sManga.title, sourceId)
|
|
|
- newManga.copyFrom(sManga)
|
|
|
- newManga.id = -1
|
|
|
- val result = runBlocking {
|
|
|
- val id = insertManga.await(newManga.toDomainManga()!!)
|
|
|
- getManga.await(id!!)
|
|
|
- }
|
|
|
- localManga = result
|
|
|
- } else if (!localManga.favorite) {
|
|
|
- // if the manga isn't a favorite, set its display title from source
|
|
|
- // if it later becomes a favorite, updated title will go to db
|
|
|
- localManga = localManga.copy(title = sManga.title)
|
|
|
- }
|
|
|
- return localManga!!.toDbManga()
|
|
|
+ protected open suspend fun networkToLocalManga(sManga: SManga, sourceId: Long): DomainManga {
|
|
|
+ return networkToLocalManga.await(sManga.toDomainManga(), sourceId)
|
|
|
}
|
|
|
}
|