mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Optimize library downloaded filter
This commit is contained in:
		@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.util.Pair
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import com.jakewharton.rxrelay.BehaviorRelay
 | 
			
		||||
import com.jakewharton.rxrelay.PublishRelay
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.CoverCache
 | 
			
		||||
@@ -110,12 +111,52 @@ class LibraryPresenter : BasePresenter<LibraryFragment>() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun applyFilters(map: Map<Int, List<Manga>>): Map<Int, List<Manga>> {
 | 
			
		||||
        val isAscending = preferences.librarySortingAscending().getOrDefault()
 | 
			
		||||
        val comparator = Comparator<Manga> { m1, m2 -> sortManga(m1, m2) }
 | 
			
		||||
        // Cached list of downloaded manga directories given a source id.
 | 
			
		||||
        val mangaDirectories = mutableMapOf<Int, Array<UniFile>>()
 | 
			
		||||
 | 
			
		||||
        // Cached list of downloaded chapter directories for a manga.
 | 
			
		||||
        val chapterDirectories = mutableMapOf<Long, Boolean>()
 | 
			
		||||
 | 
			
		||||
        val filterDownloaded = preferences.filterDownloaded().getOrDefault()
 | 
			
		||||
 | 
			
		||||
        val filterUnread = preferences.filterUnread().getOrDefault()
 | 
			
		||||
 | 
			
		||||
        val filterFn: (Manga) -> Boolean = f@ { manga: Manga ->
 | 
			
		||||
            // Filter out manga without source
 | 
			
		||||
            val source = sourceManager.get(manga.source) ?: return@f false
 | 
			
		||||
 | 
			
		||||
            if (filterUnread && manga.unread == 0) {
 | 
			
		||||
                return@f false
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (filterDownloaded) {
 | 
			
		||||
                val mangaDirs = mangaDirectories.getOrPut(source.id) {
 | 
			
		||||
                    downloadManager.findSourceDir(source)?.listFiles() ?: emptyArray()
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                val mangaDirName = downloadManager.getMangaDirName(manga)
 | 
			
		||||
                val mangaDir = mangaDirs.find { it.name == mangaDirName }
 | 
			
		||||
                
 | 
			
		||||
                return@f if (mangaDir == null) {
 | 
			
		||||
                    false
 | 
			
		||||
                } else {
 | 
			
		||||
                    chapterDirectories.getOrPut(manga.id!!) {
 | 
			
		||||
                        (mangaDir.listFiles() ?: emptyArray()).isNotEmpty()
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Sorting
 | 
			
		||||
        val comparator: Comparator<Manga> = if (preferences.librarySortingAscending().getOrDefault())
 | 
			
		||||
            Comparator { m1, m2 -> sortManga(m1, m2) }
 | 
			
		||||
        else
 | 
			
		||||
            Comparator { m1, m2 -> sortManga(m2, m1) }
 | 
			
		||||
 | 
			
		||||
        return map.mapValues { entry -> entry.value
 | 
			
		||||
                .filter { filterManga(it) }
 | 
			
		||||
                .sortedWith(if (isAscending) comparator else Collections.reverseOrder(comparator))
 | 
			
		||||
                .filter(filterFn)
 | 
			
		||||
                .sortedWith(comparator)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -187,50 +228,6 @@ class LibraryPresenter : BasePresenter<LibraryFragment>() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Filters an entry of the library.
 | 
			
		||||
     *
 | 
			
		||||
     * @param manga a favorite manga from the database.
 | 
			
		||||
     * @return true if the entry is included, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    fun filterManga(manga: Manga): Boolean {
 | 
			
		||||
        // Filter out manga without source
 | 
			
		||||
        val source = sourceManager.get(manga.source) ?: return false
 | 
			
		||||
 | 
			
		||||
        val prefFilterDownloaded = preferences.filterDownloaded().getOrDefault()
 | 
			
		||||
        val prefFilterUnread = preferences.filterUnread().getOrDefault()
 | 
			
		||||
 | 
			
		||||
        // Check if filter option is selected
 | 
			
		||||
        if (prefFilterDownloaded || prefFilterUnread) {
 | 
			
		||||
 | 
			
		||||
            // Does it have downloaded chapters.
 | 
			
		||||
            var hasDownloaded = false
 | 
			
		||||
            var hasUnread = false
 | 
			
		||||
 | 
			
		||||
            if (prefFilterUnread) {
 | 
			
		||||
                // Does it have unread chapters.
 | 
			
		||||
                hasUnread = manga.unread > 0
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (prefFilterDownloaded) {
 | 
			
		||||
                val mangaDir = downloadManager.findMangaDir(source, manga)
 | 
			
		||||
 | 
			
		||||
                if (mangaDir != null) {
 | 
			
		||||
                    hasDownloaded = mangaDir.listFiles()?.any { it.isDirectory } ?: false
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Return correct filter status
 | 
			
		||||
            if (prefFilterDownloaded && prefFilterUnread) {
 | 
			
		||||
                return (hasDownloaded && hasUnread)
 | 
			
		||||
            } else {
 | 
			
		||||
                return (hasDownloaded || hasUnread)
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when a manga is opened.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user