2020-01-05 20:43:07 +01:00
|
|
|
package eu.kanade.tachiyomi.source
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
|
import eu.kanade.tachiyomi.source.model.Page
|
|
|
|
import eu.kanade.tachiyomi.source.model.SChapter
|
|
|
|
import eu.kanade.tachiyomi.source.model.SManga
|
|
|
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
|
|
|
import rx.Observable
|
|
|
|
|
|
|
|
open class SourceManager(private val context: Context) {
|
|
|
|
|
|
|
|
private val sourcesMap = mutableMapOf<Long, Source>()
|
|
|
|
|
|
|
|
private val stubSourcesMap = mutableMapOf<Long, StubSource>()
|
|
|
|
|
|
|
|
init {
|
|
|
|
createInternalSources().forEach { registerSource(it) }
|
|
|
|
}
|
|
|
|
|
|
|
|
open fun get(sourceKey: Long): Source? {
|
|
|
|
return sourcesMap[sourceKey]
|
|
|
|
}
|
|
|
|
|
|
|
|
fun getOrStub(sourceKey: Long): Source {
|
|
|
|
return sourcesMap[sourceKey] ?: stubSourcesMap.getOrPut(sourceKey) {
|
|
|
|
StubSource(sourceKey)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun getOnlineSources() = sourcesMap.values.filterIsInstance<HttpSource>()
|
|
|
|
|
|
|
|
fun getCatalogueSources() = sourcesMap.values.filterIsInstance<CatalogueSource>()
|
|
|
|
|
|
|
|
internal fun registerSource(source: Source, overwrite: Boolean = false) {
|
|
|
|
if (overwrite || !sourcesMap.containsKey(source.id)) {
|
|
|
|
sourcesMap[source.id] = source
|
|
|
|
}
|
2020-02-12 01:02:04 +01:00
|
|
|
if (overwrite || !stubSourcesMap.containsKey(source.id)) {
|
|
|
|
stubSourcesMap[source.id] = StubSource(source.id)
|
|
|
|
}
|
2020-01-05 20:43:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
internal fun unregisterSource(source: Source) {
|
|
|
|
sourcesMap.remove(source.id)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun createInternalSources(): List<Source> = listOf(
|
|
|
|
LocalSource(context)
|
|
|
|
)
|
|
|
|
|
|
|
|
private inner class StubSource(override val id: Long) : Source {
|
|
|
|
|
|
|
|
override val name: String
|
|
|
|
get() = id.toString()
|
|
|
|
|
|
|
|
override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
|
|
|
|
return Observable.error(getSourceNotInstalledException())
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
|
|
|
|
return Observable.error(getSourceNotInstalledException())
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
|
|
|
|
return Observable.error(getSourceNotInstalledException())
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun toString(): String {
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun getSourceNotInstalledException(): Exception {
|
|
|
|
return Exception(context.getString(R.string.source_not_installed, id.toString()))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|