From a9a07ddcfa954be1bcde214864b2bdd4921764a1 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 3 Jul 2021 23:22:41 +0900 Subject: [PATCH] Simplify Source definition --- .../quaver/pupil/adapters/SourceAdapter.kt | 5 ++-- .../java/xyz/quaver/pupil/sources/Common.kt | 26 +++++++++++-------- .../xyz/quaver/pupil/sources/Downloads.kt | 6 ++--- .../java/xyz/quaver/pupil/sources/History.kt | 9 +++---- .../java/xyz/quaver/pupil/sources/Hitomi.kt | 12 +++++---- .../ui/viewmodel/GalleryDialogViewModel.kt | 4 +-- .../pupil/ui/viewmodel/MainViewModel.kt | 19 ++++++-------- .../pupil/ui/viewmodel/ReaderViewModel.kt | 4 +-- .../xyz/quaver/pupil/util/DownloadManager.kt | 4 +-- 9 files changed, 45 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/SourceAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/SourceAdapter.kt index 35e8d44d..25bb1a1c 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/SourceAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/SourceAdapter.kt @@ -23,7 +23,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion import xyz.quaver.pupil.databinding.SourceSelectDialogItemBinding -import xyz.quaver.pupil.sources.AnySource import xyz.quaver.pupil.sources.Source import xyz.quaver.pupil.sources.SourceEntries @@ -35,7 +34,7 @@ class SourceAdapter(sources: SourceEntries) : RecyclerView.Adapter -abstract class Source, Suggestion: SearchSuggestion> { +interface SortModeInterface { + val ordinal: Int + val name: String +} + +abstract class Source { abstract val name: String abstract val iconResID: Int abstract val preferenceID: Int - abstract val availableSortMode: Array + abstract val availableSortMode: List - abstract suspend fun search(query: String, range: IntRange, sortMode: Enum<*>) : Pair, Int> - abstract suspend fun suggestion(query: String) : List + abstract suspend fun search(query: String, range: IntRange, sortMode: SortModeInterface) : Pair, Int> + abstract suspend fun suggestion(query: String) : List abstract suspend fun images(itemID: String) : List abstract suspend fun info(itemID: String) : ItemInfo @@ -129,12 +133,12 @@ abstract class Source, Suggestion: SearchSu return emptyMap() } - open fun onSuggestionBind(binding: SearchSuggestionItemBinding, item: Suggestion) { + open fun onSuggestionBind(binding: SearchSuggestionItemBinding, item: SearchSuggestion) { binding.leftIcon.setImageResource(R.drawable.tag) } } -typealias SourceEntry = Pair +typealias SourceEntry = Pair typealias SourceEntries = Set typealias SourcePreferenceID = Pair typealias SourcePreferenceIDs = Set @@ -143,13 +147,13 @@ val sourceModule = DI.Module(name = "source") { bindSet() bindSet() - listOf( + listOf( Hitomi() ).forEach { source -> - inSet { multiton { _: Unit -> source.name to (source as AnySource) } } + inSet { multiton { _: Unit -> source.name to source } } inSet { singleton { source.name to source.preferenceID } } } bind { factory { source: String -> History(di, source) } } - inSet { singleton { Downloads(di).let { it.name to (it as AnySource) } } } + inSet { singleton { Downloads(di).let { it.name to it as Source } } } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/sources/Downloads.kt b/app/src/main/java/xyz/quaver/pupil/sources/Downloads.kt index 5264c7ed..aff9e9d1 100644 --- a/app/src/main/java/xyz/quaver/pupil/sources/Downloads.kt +++ b/app/src/main/java/xyz/quaver/pupil/sources/Downloads.kt @@ -33,7 +33,7 @@ import xyz.quaver.pupil.util.DownloadManager import kotlin.math.max import kotlin.math.min -class Downloads(override val di: DI) : Source(), DIAware { +class Downloads(override val di: DI) : Source(), DIAware { override val name: String get() = "downloads" @@ -41,11 +41,11 @@ class Downloads(override val di: DI) : Source get() = R.drawable.ic_download override val preferenceID: Int get() = R.xml.download_preferences - override val availableSortMode: Array = DefaultSortMode.values() + override val availableSortMode: List = DefaultSortMode.values().toList() private val downloadManager: DownloadManager by instance() - override suspend fun search(query: String, range: IntRange, sortMode: Enum<*>): Pair, Int> { + override suspend fun search(query: String, range: IntRange, sortMode: SortModeInterface): Pair, Int> { val downloads = downloadManager.downloads.toList() val channel = Channel() diff --git a/app/src/main/java/xyz/quaver/pupil/sources/History.kt b/app/src/main/java/xyz/quaver/pupil/sources/History.kt index d0cbfd93..2500ab1f 100644 --- a/app/src/main/java/xyz/quaver/pupil/sources/History.kt +++ b/app/src/main/java/xyz/quaver/pupil/sources/History.kt @@ -26,13 +26,12 @@ import org.kodein.di.DI import org.kodein.di.DIAware import org.kodein.di.instance import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion -import xyz.quaver.pupil.R import xyz.quaver.pupil.util.SavedSourceSet import xyz.quaver.pupil.util.source -class History(override val di: DI, source: String) : Source(), DIAware { +class History(override val di: DI, source: String) : Source(), DIAware { - private val source: AnySource by source(source) + private val source: Source by source(source) private val histories: SavedSourceSet by instance(tag = "histories") override val name: String @@ -41,9 +40,9 @@ class History(override val di: DI, source: String) : Source = DefaultSortMode.values() + override val availableSortMode: List = DefaultSortMode.values().toList() - override suspend fun search(query: String, range: IntRange, sortMode: Enum<*>): Pair, Int> { + override suspend fun search(query: String, range: IntRange, sortMode: SortModeInterface): Pair, Int> { val channel = Channel() CoroutineScope(Dispatchers.IO).launch { diff --git a/app/src/main/java/xyz/quaver/pupil/sources/Hitomi.kt b/app/src/main/java/xyz/quaver/pupil/sources/Hitomi.kt index 81db6ad6..9dd0b1f2 100644 --- a/app/src/main/java/xyz/quaver/pupil/sources/Hitomi.kt +++ b/app/src/main/java/xyz/quaver/pupil/sources/Hitomi.kt @@ -35,9 +35,9 @@ import xyz.quaver.pupil.util.wordCapitalize import kotlin.math.max import kotlin.math.min -class Hitomi : Source() { +class Hitomi : Source() { - enum class SortMode { + enum class SortMode : SortModeInterface { NEWEST, POPULAR } @@ -58,13 +58,13 @@ class Hitomi : Source() { override val name: String = "hitomi.la" override val iconResID: Int = R.drawable.hitomi override val preferenceID: Int = R.xml.hitomi_preferences - override val availableSortMode: Array = SortMode.values() + override val availableSortMode: List = SortMode.values().toList() var cachedQuery: String? = null var cachedSortMode: SortMode? = null val cache = mutableListOf() - override suspend fun search(query: String, range: IntRange, sortMode: Enum<*>): Pair, Int> { + override suspend fun search(query: String, range: IntRange, sortMode: SortModeInterface): Pair, Int> { if (cachedQuery != query || cachedSortMode != sortMode || cache.isEmpty()) { cachedQuery = null cache.clear() @@ -143,7 +143,9 @@ class Hitomi : Source() { ) } - override fun onSuggestionBind(binding: SearchSuggestionItemBinding, item: TagSuggestion) { + override fun onSuggestionBind(binding: SearchSuggestionItemBinding, item: SearchSuggestion) { + item as TagSuggestion + binding.leftIcon.setImageResource( when(item.n) { "female" -> R.drawable.gender_female diff --git a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/GalleryDialogViewModel.kt b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/GalleryDialogViewModel.kt index 7c6e39e3..e20eb7d3 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/GalleryDialogViewModel.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/GalleryDialogViewModel.kt @@ -26,8 +26,8 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.* import org.kodein.di.DIAware import org.kodein.di.android.x.closestDI -import xyz.quaver.pupil.sources.AnySource import xyz.quaver.pupil.sources.ItemInfo +import xyz.quaver.pupil.sources.Source import xyz.quaver.pupil.util.source class GalleryDialogViewModel(app: Application) : AndroidViewModel(app), DIAware { @@ -41,7 +41,7 @@ class GalleryDialogViewModel(app: Application) : AndroidViewModel(app), DIAware val related: LiveData> = _related fun load(source: String, itemID: String) { - val source: AnySource by source(source) + val source: Source by source(source) viewModelScope.launch { _info.value = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/MainViewModel.kt b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/MainViewModel.kt index ebf4f7aa..a68a7eb2 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/MainViewModel.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/MainViewModel.kt @@ -23,14 +23,11 @@ import android.app.Application import androidx.lifecycle.* import kotlinx.coroutines.* import org.kodein.di.DIAware -import org.kodein.di.android.x.di +import org.kodein.di.android.x.closestDI import org.kodein.di.direct import org.kodein.di.instance import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion -import xyz.quaver.pupil.sources.AnySource -import xyz.quaver.pupil.sources.Downloads -import xyz.quaver.pupil.sources.History -import xyz.quaver.pupil.sources.ItemInfo +import xyz.quaver.pupil.sources.* import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.notify import xyz.quaver.pupil.util.source @@ -40,7 +37,7 @@ import kotlin.random.Random @Suppress("UNCHECKED_CAST") class MainViewModel(app: Application) : AndroidViewModel(app), DIAware { - override val di by di() + override val di by closestDI() private val _searchResults = MutableLiveData>() val searchResults = _searchResults as LiveData> @@ -53,17 +50,17 @@ class MainViewModel(app: Application) : AndroidViewModel(app), DIAware { val query = MutableLiveData() private val queryStack = mutableListOf() - private val defaultSourceFactory: (String) -> AnySource = { + private val defaultSourceFactory: (String) -> Source = { direct.source(it) } - private var sourceFactory: (String) -> AnySource = defaultSourceFactory - private val _source = MutableLiveData() - val source: LiveData = _source + private var sourceFactory: (String) -> Source = defaultSourceFactory + private val _source = MutableLiveData() + val source: LiveData = _source val availableSortMode = Transformations.map(_source) { it.availableSortMode } - val sortMode = MutableLiveData>() + val sortMode = MutableLiveData() val sourceIcon = Transformations.map(_source) { it.iconResID diff --git a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt index 731c2703..a04412d7 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt @@ -33,7 +33,7 @@ import org.kodein.di.DIAware import org.kodein.di.android.x.closestDI import org.kodein.di.instance import xyz.quaver.pupil.adapters.ReaderItem -import xyz.quaver.pupil.sources.AnySource +import xyz.quaver.pupil.sources.Source import xyz.quaver.pupil.util.ImageCache import xyz.quaver.pupil.util.notify import xyz.quaver.pupil.util.source @@ -56,7 +56,7 @@ class ReaderViewModel(app: Application) : AndroidViewModel(app), DIAware { @OptIn(ExperimentalCoroutinesApi::class) fun load(sourceName: String, itemID: String) { - val source: AnySource by source(sourceName) + val source: Source by source(sourceName) viewModelScope.launch { _title.value = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/xyz/quaver/pupil/util/DownloadManager.kt b/app/src/main/java/xyz/quaver/pupil/util/DownloadManager.kt index 80278d03..8ba78510 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/DownloadManager.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/DownloadManager.kt @@ -32,7 +32,7 @@ import org.kodein.di.DIAware import org.kodein.di.android.closestDI import xyz.quaver.io.FileX import xyz.quaver.io.util.* -import xyz.quaver.pupil.sources.AnySource +import xyz.quaver.pupil.sources.Source class DownloadManager constructor(context: Context) : ContextWrapper(context), DIAware { @@ -82,7 +82,7 @@ class DownloadManager constructor(context: Context) : ContextWrapper(context), D @Synchronized fun download(source: String, itemID: String) = CoroutineScope(Dispatchers.IO).launch { - val source: AnySource by source(source) + val source: Source by source(source) val info = async { source.info(itemID) } val images = async { source.images(itemID) }