浏览代码

Add filter for tracking (#4276)

* Add filter for tracking or not

* Use .any

* Access database only when needed
Andreas 4 年之前
父节点
当前提交
5cddc0c387

+ 9 - 0
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(

+ 2 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt

@@ -123,6 +123,8 @@ object PreferenceKeys {
 
     const val filterCompleted = "pref_filter_library_completed"
 
+    const val filterTracking = "pref_filter_library_tracking"
+
     const val librarySortingMode = "library_sorting_mode"
 
     const val automaticExtUpdates = "automatic_ext_updates"

+ 2 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt

@@ -221,6 +221,8 @@ class PreferencesHelper(val context: Context) {
 
     fun filterCompleted() = flowPrefs.getInt(Keys.filterCompleted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
 
+    fun filterTracking() = flowPrefs.getInt(Keys.filterTracking, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
+
     fun librarySortingMode() = flowPrefs.getInt(Keys.librarySortingMode, 0)
 
     fun librarySortingAscending() = flowPrefs.getBoolean("library_sorting_ascending", true)

+ 40 - 5
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt

@@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.data.database.models.MangaCategory
 import eu.kanade.tachiyomi.data.download.DownloadManager
 import eu.kanade.tachiyomi.data.preference.PreferencesHelper
+import eu.kanade.tachiyomi.data.track.TrackManager
 import eu.kanade.tachiyomi.source.SourceManager
 import eu.kanade.tachiyomi.source.model.SManga
 import eu.kanade.tachiyomi.source.online.HttpSource
@@ -47,7 +48,8 @@ class LibraryPresenter(
     private val preferences: PreferencesHelper = Injekt.get(),
     private val coverCache: CoverCache = Injekt.get(),
     private val sourceManager: SourceManager = Injekt.get(),
-    private val downloadManager: DownloadManager = Injekt.get()
+    private val downloadManager: DownloadManager = Injekt.get(),
+    private val trackManager: TrackManager = Injekt.get()
 ) : BasePresenter<LibraryController>() {
 
     private val context = preferences.context
@@ -92,8 +94,8 @@ class LibraryPresenter(
                 .combineLatest(badgeTriggerRelay.observeOn(Schedulers.io())) { lib, _ ->
                     lib.apply { setBadges(mangaMap) }
                 }
-                .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))
@@ -110,11 +112,12 @@ class LibraryPresenter(
      *
      * @param map the map to filter.
      */
-    private fun applyFilters(map: LibraryMap): LibraryMap {
+    private fun applyFilters(map: LibraryMap, trackMap: Map<Long, Boolean>): 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()
 
         val filterFnUnread: (LibraryItem) -> Boolean = unread@{ item ->
             if (filterUnread == State.IGNORE.value) return@unread true
@@ -144,11 +147,20 @@ 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
+        }
+
         val filterFn: (LibraryItem) -> Boolean = filter@{ item ->
             return@filter !(
                 !filterFnUnread(item) ||
                     !filterFnCompleted(item) ||
-                    !filterFnDownloaded(item)
+                    !filterFnDownloaded(item) ||
+                    !filterFnTracking(item)
                 )
         }
 
@@ -282,6 +294,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<Map<Long, Boolean>> {
+        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<Map<Long, Boolean>> {
+        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.
      */

+ 4 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt

@@ -68,9 +68,10 @@ 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)
 
             override val header = null
-            override val items = listOf(downloaded, unread, completed)
+            override val items = listOf(downloaded, unread, completed, tracking)
             override val footer = null
 
             override fun initModels() {
@@ -82,6 +83,7 @@ class LibrarySettingsSheet(
                 }
                 unread.state = preferences.filterUnread().get()
                 completed.state = preferences.filterCompleted().get()
+                tracking.state = preferences.filterTracking().get()
             }
 
             override fun onItemClicked(item: Item) {
@@ -97,6 +99,7 @@ class LibrarySettingsSheet(
                     downloaded -> preferences.filterDownloaded().set(newState)
                     unread -> preferences.filterUnread().set(newState)
                     completed -> preferences.filterCompleted().set(newState)
+                    tracking -> preferences.filterTracking().set(newState)
                 }
 
                 adapter.notifyItemChanged(item)

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -34,6 +34,7 @@
     <string name="action_filter">Filter</string>
     <string name="action_filter_downloaded">Downloaded</string>
     <string name="action_filter_bookmarked">Bookmarked</string>
+    <string name="action_filter_tracking">Tracking</string>
     <string name="action_filter_unread">Unread</string>
     <string name="action_filter_empty">Remove filter</string>
     <string name="action_sort_alpha">Alphabetically</string>