From c92c9fada5d4b7bb278803d89db5491481556d5c Mon Sep 17 00:00:00 2001 From: Andreas Date: Sun, 17 Jan 2021 21:40:17 +0100 Subject: [PATCH] Add filter for tracking (#4276) * Add filter for tracking or not * Use .any * Access database only when needed (cherry picked from commit 5cddc0c3875fffa205bd7fbc7f881cc60871b5be) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt # app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt --- .../data/database/queries/TrackQueries.kt | 9 ++++ .../data/preference/PreferenceKeys.kt | 4 +- .../data/preference/PreferencesHelper.kt | 4 +- .../ui/library/LibraryCategoryAdapter.kt | 6 +-- .../tachiyomi/ui/library/LibraryPresenter.kt | 53 +++++++++++++------ .../ui/library/LibrarySettingsSheet.kt | 11 ++-- app/src/main/res/values/strings.xml | 1 + 7 files changed, 62 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/TrackQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/TrackQueries.kt index 7311fe40d..1947a0218 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/TrackQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/TrackQueries.kt @@ -10,6 +10,15 @@ import eu.kanade.tachiyomi.data.track.TrackService interface TrackQueries : DbProvider { + fun getTracks() = db.get() + .listOfObjects(Track::class.java) + .withQuery( + Query.builder() + .table(TrackTable.TABLE) + .build() + ) + .prepare() + fun getTracks(manga: Manga) = db.get() .listOfObjects(Track::class.java) .withQuery( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index baeab7dc7..937690eaa 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -123,9 +123,9 @@ object PreferenceKeys { const val filterCompleted = "pref_filter_library_completed" - const val filterStarted = "pref_filter_library_started" + const val filterTracking = "pref_filter_library_tracking" - const val filterTracked = "pref_filter_library_tracked" + const val filterStarted = "pref_filter_library_started" const val filterLewd = "pref_filter_library_lewd" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 2406e6e4e..a09c44b1e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -221,9 +221,9 @@ class PreferencesHelper(val context: Context) { fun filterCompleted() = flowPrefs.getInt(Keys.filterCompleted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterStarted() = flowPrefs.getInt(Keys.filterStarted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterTracking() = flowPrefs.getInt(Keys.filterTracking, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterTracked() = flowPrefs.getInt(Keys.filterTracked, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterStarted() = flowPrefs.getInt(Keys.filterStarted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) fun filterLewd() = flowPrefs.getInt(Keys.filterLewd, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt index 23f70dee9..11b5483a8 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.ui.category.CategoryAdapter +import eu.kanade.tachiyomi.util.lang.withUIContext import exh.isMetadataSource import exh.metadata.sql.models.SearchTag import exh.metadata.sql.models.SearchTitle @@ -28,7 +29,6 @@ import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.toList import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import timber.log.Timber import uy.kohesive.injekt.injectLazy @@ -96,7 +96,7 @@ class LibraryCategoryAdapter(view: LibraryCategoryView, val controller: LibraryC preferences.filterCompleted().get() == Filter.TriState.STATE_IGNORE && preferences.filterStarted().get() == Filter.TriState.STATE_IGNORE && preferences.filterUnread().get() == Filter.TriState.STATE_IGNORE && - preferences.filterTracked().get() == Filter.TriState.STATE_IGNORE && + preferences.filterTracking().get() == Filter.TriState.STATE_IGNORE && preferences.filterLewd().get() == Filter.TriState.STATE_IGNORE // EXH --> @@ -153,7 +153,7 @@ class LibraryCategoryAdapter(view: LibraryCategoryView, val controller: LibraryC mangas } - withContext(Dispatchers.Main) { + withUIContext { updateDataSet(newManga) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 1b4ff23a8..7a4b37d7f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -63,9 +63,9 @@ class LibraryPresenter( private val coverCache: CoverCache = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(), private val downloadManager: DownloadManager = Injekt.get(), + private val trackManager: TrackManager = Injekt.get(), // SY --> - private val customMangaManager: CustomMangaManager = Injekt.get(), - private val trackManager: TrackManager = Injekt.get() + private val customMangaManager: CustomMangaManager = Injekt.get() // SY <-- ) : BasePresenter() { @@ -141,8 +141,8 @@ class LibraryPresenter( lib.copy(mangaMap = map, categories = categories) } // SY <-- - .combineLatest(filterTriggerRelay.observeOn(Schedulers.io())) { lib, _ -> - lib.copy(mangaMap = applyFilters(lib.mangaMap)) + .combineLatest(getFilterObservable()) { lib, tracks -> + lib.copy(mangaMap = applyFilters(lib.mangaMap, tracks)) } .combineLatest(sortTriggerRelay.observeOn(Schedulers.io())) { lib, _ -> lib.copy(mangaMap = applySort(lib.mangaMap)) @@ -159,14 +159,14 @@ class LibraryPresenter( * * @param map the map to filter. */ - private fun applyFilters(map: LibraryMap): LibraryMap { + private fun applyFilters(map: LibraryMap, trackMap: Map): LibraryMap { val downloadedOnly = preferences.downloadedOnly().get() val filterDownloaded = preferences.filterDownloaded().get() val filterUnread = preferences.filterUnread().get() val filterCompleted = preferences.filterCompleted().get() + val tracking = preferences.filterTracking().get() // SY --> val filterStarted = preferences.filterStarted().get() - val filterTracked = preferences.filterTracked().get() val filterLewd = preferences.filterLewd().get() // SY <-- @@ -198,6 +198,14 @@ class LibraryPresenter( else !isDownloaded } + val filterFnTracking: (LibraryItem) -> Boolean = tracking@{ item -> + if (tracking == State.IGNORE.value) return@tracking true + + val isTracking = trackMap[item.manga.id ?: -1] ?: false + + return@tracking if (tracking == State.INCLUDE.value) isTracking else !isTracking + } + // SY --> val filterFnStarted: (LibraryItem) -> Boolean = started@{ item -> if (filterStarted == State.IGNORE.value) return@started true @@ -207,14 +215,6 @@ class LibraryPresenter( else !hasRead } - val filterFnTracked: (LibraryItem) -> Boolean = tracked@{ item -> - if (filterTracked == State.IGNORE.value) return@tracked true - val hasTracks = db.getTracks(item.manga).executeAsBlocking().filterNot { it.sync_id == TrackManager.MDLIST && it.status == FollowStatus.UNFOLLOWED.int }.isNotEmpty() - - return@tracked if (filterTracked == State.INCLUDE.value) hasTracks - else !hasTracks - } - val filterFnLewd: (LibraryItem) -> Boolean = lewd@{ item -> if (filterLewd == State.IGNORE.value) return@lewd true val isLewd = item.manga.isLewd() @@ -229,9 +229,9 @@ class LibraryPresenter( !filterFnUnread(item) || !filterFnCompleted(item) || !filterFnDownloaded(item) || + !filterFnTracking(item) || // SY --> !filterFnStarted(item) || - !filterFnTracked(item) || !filterFnLewd(item) // SY <-- ) @@ -432,6 +432,29 @@ class LibraryPresenter( } } + /** + * Get the tracked manga from the database and checks if the filter gets changed + * + * @return an observable of tracked manga. + */ + private fun getFilterObservable(): Observable> { + return getTracksObservable().combineLatest(filterTriggerRelay.observeOn(Schedulers.io())) { tracks, _ -> tracks } + } + + /** + * Get the tracked manga from the database + * + * @return an observable of tracked manga. + */ + private fun getTracksObservable(): Observable> { + return db.getTracks().asRxObservable().map { tracks -> + tracks.associate { track -> + val isLogged = tracks.any { trackManager.getService(it.sync_id)?.isLogged ?: false } + Pair(track.manga_id, isLogged) + } + }.observeOn(Schedulers.io()) + } + /** * Requests the library to be filtered. */ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt index dbae9957c..6acf176a3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt @@ -82,16 +82,19 @@ class LibrarySettingsSheet( private val downloaded = Item.TriStateGroup(R.string.action_filter_downloaded, this) private val unread = Item.TriStateGroup(R.string.action_filter_unread, this) private val completed = Item.TriStateGroup(R.string.completed, this) + private val tracking = Item.TriStateGroup(R.string.action_filter_tracking, this) + + // SY --> private val started = Item.TriStateGroup(R.string.started, this) - private val tracked = Item.TriStateGroup(R.string.tracked, this) private val lewd = Item.TriStateGroup(R.string.lewd, this) + // SY <-- override val header = null // SY --> override val items = ( if (Injekt.get().hasLoggedServices()) { - listOf(downloaded, unread, completed, started, tracked, lewd) + listOf(downloaded, unread, completed, tracking, started, lewd) } else { listOf(downloaded, unread, completed, started, lewd) } @@ -109,9 +112,9 @@ class LibrarySettingsSheet( } unread.state = preferences.filterUnread().get() completed.state = preferences.filterCompleted().get() + tracking.state = preferences.filterTracking().get() // SY --> started.state = preferences.filterStarted().get() - tracked.state = preferences.filterTracked().get() lewd.state = preferences.filterLewd().get() // SY <-- } @@ -129,9 +132,9 @@ class LibrarySettingsSheet( downloaded -> preferences.filterDownloaded().set(newState) unread -> preferences.filterUnread().set(newState) completed -> preferences.filterCompleted().set(newState) + tracking -> preferences.filterTracking().set(newState) // SY --> started -> preferences.filterStarted().set(newState) - tracked -> preferences.filterTracked().set(newState) lewd -> preferences.filterLewd().set(newState) // SY <-- } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index baa2737bc..4d0dfb882 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,6 +34,7 @@ Filter Downloaded Bookmarked + Tracking Unread Remove filter Alphabetically