mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +01:00 
			
		
		
		
	Add filter for tracking (#4276)
* Add filter for tracking or not * Use .any * Access database only when needed
This commit is contained in:
		@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user