diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt index 7c5a670ed..676cd2892 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.components.BaseSourceItem import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.ui.browse.source.SourcesState +import eu.kanade.tachiyomi.ui.browse.source.SourcesScreenModel import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel.Listing import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.model.Pin @@ -47,7 +47,7 @@ import tachiyomi.source.local.isLocal @Composable fun SourcesScreen( - state: SourcesState, + state: SourcesScreenModel.State, contentPadding: PaddingValues, onClickItem: (Source, Listing) -> Unit, onClickPin: (Source) -> Unit, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt index ab5bc5786..9c402fde4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt @@ -1,27 +1,21 @@ package eu.kanade.tachiyomi.data.backup -import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID - -object BackupConst { - - private const val NAME = "BackupRestoreServices" - const val EXTRA_URI = "$ID.$NAME.EXTRA_URI" - - // Filter options - internal const val BACKUP_CATEGORY = 0x1 - internal const val BACKUP_CATEGORY_MASK = 0x1 - internal const val BACKUP_CHAPTER = 0x2 - internal const val BACKUP_CHAPTER_MASK = 0x2 - internal const val BACKUP_HISTORY = 0x4 - internal const val BACKUP_HISTORY_MASK = 0x4 - internal const val BACKUP_TRACK = 0x8 - internal const val BACKUP_TRACK_MASK = 0x8 +// Filter options +internal object BackupConst { + const val BACKUP_CATEGORY = 0x1 + const val BACKUP_CATEGORY_MASK = 0x1 + const val BACKUP_CHAPTER = 0x2 + const val BACKUP_CHAPTER_MASK = 0x2 + const val BACKUP_HISTORY = 0x4 + const val BACKUP_HISTORY_MASK = 0x4 + const val BACKUP_TRACK = 0x8 + const val BACKUP_TRACK_MASK = 0x8 // SY --> - internal const val BACKUP_CUSTOM_INFO = 0x10 - internal const val BACKUP_CUSTOM_INFO_MASK = 0x10 - internal const val BACKUP_READ_MANGA = 0x20 - internal const val BACKUP_READ_MANGA_MASK = 0x20 - internal const val BACKUP_ALL = 0x3F + const val BACKUP_CUSTOM_INFO = 0x10 + const val BACKUP_CUSTOM_INFO_MASK = 0x10 + const val BACKUP_READ_MANGA = 0x20 + const val BACKUP_READ_MANGA_MASK = 0x20 + const val BACKUP_ALL = 0x3F // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt index 9d206cc8f..9658b0d8b 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt @@ -13,7 +13,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import okhttp3.Response diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt index f7a45e972..167744ab3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.data.download import android.content.Context import androidx.core.content.edit import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.domain.chapter.model.Chapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt index df594bf63..3d95909bf 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt @@ -6,7 +6,6 @@ import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.source.online.HttpSource import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.domain.chapter.interactor.GetChapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index 54b260ef1..c40c4438a 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -7,7 +7,6 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.DeletableTrackService import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt index e131c33a1..2643e5867 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt @@ -6,7 +6,6 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt index 9b032d9e8..444487df1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt @@ -9,7 +9,6 @@ import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.contentOrNull diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt index 8458a801a..a5cd014ec 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.bangumi -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import okhttp3.FormBody import okhttp3.Interceptor diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt index 10089fc2c..daabd44b1 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt @@ -7,7 +7,6 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.DeletableTrackService import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt index 395d5daa9..45abfa675 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.kitsu -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt index 80396afde..719460690 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt @@ -7,7 +7,6 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.DeletableTrackService import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt index cce9311f8..0b912a419 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt @@ -7,7 +7,6 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.DeletableTrackService import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt index 51934d049..5ecea52e6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.shikimori -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt index 7a25b02f0..0d30b5180 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt @@ -29,9 +29,6 @@ class MigrateSearchScreen(private val mangaId: Long, private val validSources: L onChangeSearchFilter = screenModel::setSourceFilter, onToggleResults = screenModel::toggleFilterResults, onClickSource = { - if (!screenModel.incognitoMode.get()) { - screenModel.lastUsedSourceId.set(it.id) - } // SY --> navigator.push(SourceSearchScreen(state.manga!!, it.id, state.searchQuery)) // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreenModel.kt index 2d475aaa0..db4cea7ed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreenModel.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.browse.migration.search import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.coroutineScope -import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult @@ -21,16 +20,11 @@ class MigrateSearchScreenModel( // SY --> val validSources: List, // SY <-- - initialExtensionFilter: String = "", - preferences: BasePreferences = Injekt.get(), private val sourcePreferences: SourcePreferences = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(), private val getManga: GetManga = Injekt.get(), ) : SearchScreenModel(State()) { - val incognitoMode = preferences.incognitoMode() - val lastUsedSourceId = sourcePreferences.lastUsedSource() - init { coroutineScope.launch { val manga = getManga.await(mangaId)!! @@ -68,11 +62,11 @@ class MigrateSearchScreenModel( return mutableState.value.items } - fun setSourceFilter(filter: SourceFilter) { + override fun setSourceFilter(filter: SourceFilter) { mutableState.update { it.copy(sourceFilter = filter) } } - fun toggleFilterResults() { + override fun toggleFilterResults() { mutableState.update { it.copy(onlyShowHasResults = !it.onlyShowHasResults) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt index 6e9498aab..eba1e6e24 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt @@ -5,7 +5,6 @@ import androidx.compose.runtime.getValue import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.coroutineScope import eu.kanade.core.preference.asState -import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.interactor.GetEnabledSources import eu.kanade.domain.source.interactor.GetShowLatest import eu.kanade.domain.source.interactor.GetSourceCategories @@ -36,8 +35,6 @@ import uy.kohesive.injekt.api.get import java.util.TreeMap class SourcesScreenModel( - private val preferences: BasePreferences = Injekt.get(), - private val sourcePreferences: SourcePreferences = Injekt.get(), private val getEnabledSources: GetEnabledSources = Injekt.get(), private val toggleSource: ToggleSource = Injekt.get(), private val toggleSourcePin: ToggleSourcePin = Injekt.get(), @@ -47,9 +44,10 @@ class SourcesScreenModel( private val getShowLatest: GetShowLatest = Injekt.get(), private val toggleExcludeFromDataSaver: ToggleExcludeFromDataSaver = Injekt.get(), private val setSourceCategories: SetSourceCategories = Injekt.get(), + private val sourcePreferences: SourcePreferences = Injekt.get(), val smartSearchConfig: SourcesScreen.SmartSearchConfig?, // SY <-- -) : StateScreenModel(SourcesState()) { +) : StateScreenModel(State()) { private val _events = Channel(Int.MAX_VALUE) val events = _events.receiveAsFlow() @@ -132,12 +130,6 @@ class SourcesScreenModel( } } - fun onOpenSource(source: Source) { - if (!preferences.incognitoMode().get()) { - sourcePreferences.lastUsedSource().set(source.id) - } - } - fun toggleSource(source: Source) { toggleSource.await(source) } @@ -177,6 +169,21 @@ class SourcesScreenModel( data class SourceCategories(val source: Source) : Dialog() } + @Immutable + data class State( + val dialog: Dialog? = null, + val isLoading: Boolean = true, + val items: List = emptyList(), + // SY --> + val categories: List = emptyList(), + val showPin: Boolean = true, + val showLatest: Boolean = false, + val dataSaverEnabled: Boolean = false, + // SY <-- + ) { + val isEmpty = items.isEmpty() + } + companion object { const val PINNED_KEY = "pinned" const val LAST_USED_KEY = "last_used" @@ -186,18 +193,3 @@ class SourcesScreenModel( // SY <-- } } - -@Immutable -data class SourcesState( - val dialog: SourcesScreenModel.Dialog? = null, - val isLoading: Boolean = true, - val items: List = emptyList(), - // SY --> - val categories: List = emptyList(), - val showPin: Boolean = true, - val showLatest: Boolean = false, - val dataSaverEnabled: Boolean = false, - // SY <-- -) { - val isEmpty = items.isEmpty() -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt index 2acfc7275..f51ef736a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt @@ -69,7 +69,6 @@ fun Screen.sourcesTab( listing == Listing.Popular && screenModel.useNewSourceNavigation -> SourceFeedScreen(source.id) else -> BrowseSourceScreen(source.id, listing.query) } - screenModel.onOpenSource(source) navigator.push(screen) // SY <-- }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index ab5253eab..1cd517b2a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -13,6 +13,7 @@ import androidx.paging.map import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.coroutineScope import eu.kanade.core.preference.asState +import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.model.toDomainManga @@ -97,6 +98,7 @@ open class BrowseSourceScreenModel( // SY <-- private val sourceManager: SourceManager = Injekt.get(), sourcePreferences: SourcePreferences = Injekt.get(), + basePreferences: BasePreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val coverCache: CoverCache = Injekt.get(), private val getRemoteManga: GetRemoteManga = Injekt.get(), @@ -156,6 +158,10 @@ open class BrowseSourceScreenModel( } } + if (!basePreferences.incognitoMode().get()) { + sourcePreferences.lastUsedSource().set(source.id) + } + // SY --> val savedSearchFilters = savedSearch val jsonFilters = filtersJson diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreen.kt index 74e33c14d..acc93878e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreen.kt @@ -64,9 +64,6 @@ class GlobalSearchScreen( onChangeSearchFilter = screenModel::setSourceFilter, onToggleResults = screenModel::toggleFilterResults, onClickSource = { - if (!screenModel.incognitoMode.get()) { - screenModel.lastUsedSourceId.set(it.id) - } navigator.push(BrowseSourceScreen(it.id, state.searchQuery)) }, onClickItem = { navigator.push(MangaScreen(it.id, true)) }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreenModel.kt index 52de78cb2..fe30da8f0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreenModel.kt @@ -1,25 +1,14 @@ package eu.kanade.tachiyomi.ui.browse.source.globalsearch import androidx.compose.runtime.Immutable -import eu.kanade.domain.base.BasePreferences -import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.source.CatalogueSource import kotlinx.coroutines.flow.update -import tachiyomi.domain.source.service.SourceManager -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get class GlobalSearchScreenModel( initialQuery: String = "", initialExtensionFilter: String? = null, - preferences: BasePreferences = Injekt.get(), - private val sourcePreferences: SourcePreferences = Injekt.get(), - private val sourceManager: SourceManager = Injekt.get(), ) : SearchScreenModel(State(searchQuery = initialQuery)) { - val incognitoMode = preferences.incognitoMode() - val lastUsedSourceId = sourcePreferences.lastUsedSource() - init { extensionFilter = initialExtensionFilter if (initialQuery.isNotBlank() || !initialExtensionFilter.isNullOrBlank()) { @@ -28,15 +17,8 @@ class GlobalSearchScreenModel( } override fun getEnabledSources(): List { - val enabledLanguages = sourcePreferences.enabledLanguages().get() - val disabledSources = sourcePreferences.disabledSources().get() - val pinnedSources = sourcePreferences.pinnedSources().get() - - return sourceManager.getVisibleCatalogueSources() + return super.getEnabledSources() .filter { mutableState.value.sourceFilter != SourceFilter.PinnedOnly || "${it.id}" in pinnedSources } - .filter { it.lang in enabledLanguages } - .filterNot { "${it.id}" in disabledSources } - .sortedWith(compareBy({ "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" })) } override fun updateSearchQuery(query: String?) { @@ -55,11 +37,11 @@ class GlobalSearchScreenModel( return mutableState.value.items } - fun setSourceFilter(filter: SourceFilter) { + override fun setSourceFilter(filter: SourceFilter) { mutableState.update { it.copy(sourceFilter = filter) } } - fun toggleFilterResults() { + override fun toggleFilterResults() { mutableState.update { it.copy(onlyShowHasResults = !it.onlyShowHasResults) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt index 2f8a2be8b..f0e4710b1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt @@ -10,16 +10,19 @@ import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.source.CatalogueSource +import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import tachiyomi.core.util.lang.awaitSingle import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.interactor.NetworkToLocalManga import tachiyomi.domain.manga.model.Manga +import tachiyomi.domain.source.service.SourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.Executors @@ -27,6 +30,7 @@ import java.util.concurrent.Executors abstract class SearchScreenModel( initialState: T, private val sourcePreferences: SourcePreferences = Injekt.get(), + private val sourceManager: SourceManager = Injekt.get(), private val extensionManager: ExtensionManager = Injekt.get(), private val networkToLocalManga: NetworkToLocalManga = Injekt.get(), private val getManga: GetManga = Injekt.get(), @@ -34,12 +38,13 @@ abstract class SearchScreenModel( ) : StateScreenModel(initialState) { private val coroutineDispatcher = Executors.newFixedThreadPool(5).asCoroutineDispatcher() + private var searchJob: Job? = null protected var query: String? = null protected var extensionFilter: String? = null private val sources by lazy { getSelectedSources() } - private val pinnedSources by lazy { sourcePreferences.pinnedSources().get() } + protected val pinnedSources = sourcePreferences.pinnedSources().get() private val sortComparator = { map: Map -> compareBy( @@ -53,14 +58,27 @@ abstract class SearchScreenModel( fun getManga(initialManga: Manga): State { return produceState(initialValue = initialManga) { getManga.subscribe(initialManga.url, initialManga.source) + .filterNotNull() .collectLatest { manga -> - if (manga == null) return@collectLatest value = manga } } } - abstract fun getEnabledSources(): List + open fun getEnabledSources(): List { + val enabledLanguages = sourcePreferences.enabledLanguages().get() + val disabledSources = sourcePreferences.disabledSources().get() + val pinnedSources = sourcePreferences.pinnedSources().get() + + return sourceManager.getVisibleCatalogueSources() + .filter { it.lang in enabledLanguages && "${it.id}" !in disabledSources } + .sortedWith( + compareBy( + { "${it.id}" !in pinnedSources }, + { "${it.name.lowercase()} (${it.lang})" }, + ), + ) + } private fun getSelectedSources(): List { val enabledSources = getEnabledSources() @@ -90,15 +108,19 @@ abstract class SearchScreenModel( updateItems(function(getItems())) } + abstract fun setSourceFilter(filter: SourceFilter) + + abstract fun toggleFilterResults() + fun search(query: String) { if (this.query == query) return this.query = query + searchJob?.cancel() val initialItems = getSelectedSources().associateWith { SearchItemResult.Loading } updateItems(initialItems) - - ioCoroutineScope.launch { + searchJob = ioCoroutineScope.launch { sources .map { source -> async {