komikku/app/src/main/java/exh/ui/smartsearch/SmartSearchPresenter.kt

59 lines
2 KiB
Kotlin
Raw Normal View History

package exh.ui.smartsearch
2019-07-29 08:12:30 +02:00
2019-07-29 19:27:33 +02:00
import android.os.Bundle
import eu.kanade.domain.manga.interactor.NetworkToLocalManga
2022-07-05 04:20:28 +02:00
import eu.kanade.domain.manga.model.Manga
2019-07-29 19:27:33 +02:00
import eu.kanade.tachiyomi.source.CatalogueSource
2022-09-08 03:19:37 +02:00
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.ui.browse.source.SourcesController
2021-12-12 23:59:29 +01:00
import eu.kanade.tachiyomi.util.lang.launchIO
import exh.smartsearch.SmartSearchEngine
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.flow.MutableSharedFlow
2021-12-12 23:59:29 +01:00
import kotlinx.coroutines.flow.asSharedFlow
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class SmartSearchPresenter(
private val source: CatalogueSource,
private val config: SourcesController.SmartSearchConfig,
private val networkToLocalManga: NetworkToLocalManga = Injekt.get(),
) :
2022-09-08 03:19:37 +02:00
BasePresenter<SmartSearchController>() {
2019-07-29 19:27:33 +02:00
2021-12-12 23:59:29 +01:00
private val _smartSearchFlow = MutableSharedFlow<SearchResults>()
val smartSearchFlow = _smartSearchFlow.asSharedFlow()
2019-07-29 19:27:33 +02:00
2020-08-24 23:25:10 +02:00
private val smartSearchEngine = SmartSearchEngine()
2019-07-31 09:39:51 +02:00
2019-07-29 19:27:33 +02:00
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
presenterScope.launchIO {
val result = try {
val resultManga = smartSearchEngine.smartSearch(source, config.origTitle)
if (resultManga != null) {
val localManga = networkToLocalManga.await(resultManga)
SearchResults.Found(localManga)
} else {
SearchResults.NotFound
}
} catch (e: Exception) {
if (e is CancellationException) {
throw e
} else {
SearchResults.Error
2019-07-29 19:27:33 +02:00
}
}
2021-12-12 23:59:29 +01:00
_smartSearchFlow.emit(result)
}
2019-07-29 19:27:33 +02:00
}
sealed class SearchResults {
data class Found(val manga: Manga) : SearchResults()
object NotFound : SearchResults()
object Error : SearchResults()
2019-07-29 19:27:33 +02:00
}
}