Add option to filter library by bookmarks

Closes #1482
This commit is contained in:
Jays2Kings 2023-02-11 17:07:31 -05:00
parent 31654d1bb8
commit cfe7e366ab
7 changed files with 39 additions and 4 deletions

View file

@ -7,6 +7,8 @@ class LibraryManga : MangaImpl() {
var category: Int = 0 var category: Int = 0
var bookmarkCount: Int = 0
val totalChapters val totalChapters
get() = read + unread get() = read + unread

View file

@ -15,7 +15,7 @@ val libraryQuery =
""" """
SELECT M.*, COALESCE(MC.${MangaCategory.COL_CATEGORY_ID}, 0) AS ${Manga.COL_CATEGORY} SELECT M.*, COALESCE(MC.${MangaCategory.COL_CATEGORY_ID}, 0) AS ${Manga.COL_CATEGORY}
FROM ( FROM (
SELECT ${Manga.TABLE}.*, COALESCE(C.unread, 0) AS ${Manga.COL_UNREAD}, COALESCE(R.hasread, 0) AS ${Manga.COL_HAS_READ} SELECT ${Manga.TABLE}.*, COALESCE(C.unread, 0) AS ${Manga.COL_UNREAD}, COALESCE(R.hasread, 0) AS ${Manga.COL_HAS_READ}, COALESCE(B.bookmarkCount, 0) AS ${Manga.COL_BOOKMARK_COUNT}
FROM ${Manga.TABLE} FROM ${Manga.TABLE}
LEFT JOIN ( LEFT JOIN (
SELECT ${Chapter.COL_MANGA_ID}, COUNT(*) AS unread SELECT ${Chapter.COL_MANGA_ID}, COUNT(*) AS unread
@ -31,6 +31,13 @@ val libraryQuery =
GROUP BY ${Chapter.COL_MANGA_ID} GROUP BY ${Chapter.COL_MANGA_ID}
) AS R ) AS R
ON ${Manga.COL_ID} = R.${Chapter.COL_MANGA_ID} ON ${Manga.COL_ID} = R.${Chapter.COL_MANGA_ID}
LEFT JOIN (
SELECT ${Chapter.COL_MANGA_ID}, COUNT(*) AS bookmarkCount
FROM ${Chapter.TABLE}
WHERE ${Chapter.COL_BOOKMARK} = 1
GROUP BY ${Chapter.COL_MANGA_ID}
) AS B
ON ${Manga.COL_ID} = B.${Chapter.COL_MANGA_ID}
WHERE ${Manga.COL_FAVORITE} = 1 WHERE ${Manga.COL_FAVORITE} = 1
GROUP BY ${Manga.COL_ID} GROUP BY ${Manga.COL_ID}
ORDER BY ${Manga.COL_TITLE} ORDER BY ${Manga.COL_TITLE}

View file

@ -19,6 +19,7 @@ class LibraryMangaGetResolver : DefaultGetResolver<LibraryManga>(), BaseMangaGet
manga.unread = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_UNREAD)) manga.unread = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_UNREAD))
manga.category = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_CATEGORY)) manga.category = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_CATEGORY))
manga.read = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_HAS_READ)) manga.read = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_HAS_READ))
manga.bookmarkCount = cursor.getInt(cursor.getColumnIndex(MangaTable.COL_BOOKMARK_COUNT))
return manga return manga
} }

View file

@ -38,6 +38,8 @@ object MangaTable {
const val COL_HAS_READ = "has_read" const val COL_HAS_READ = "has_read"
const val COL_BOOKMARK_COUNT = "bookmark_count"
const val COL_CATEGORY = "category" const val COL_CATEGORY = "category"
const val COL_HIDE_TITLE = "hideTitle" const val COL_HIDE_TITLE = "hideTitle"

View file

@ -285,6 +285,8 @@ class PreferencesHelper(val context: Context) {
fun filterCompleted() = flowPrefs.getInt(Keys.filterCompleted, 0) fun filterCompleted() = flowPrefs.getInt(Keys.filterCompleted, 0)
fun filterBookmarked() = flowPrefs.getInt("pref_filter_bookmarked_key", 0)
fun filterTracked() = flowPrefs.getInt(Keys.filterTracked, 0) fun filterTracked() = flowPrefs.getInt(Keys.filterTracked, 0)
fun filterMangaType() = flowPrefs.getInt(Keys.filterMangaType, 0) fun filterMangaType() = flowPrefs.getInt(Keys.filterMangaType, 0)

View file

@ -283,6 +283,8 @@ class LibraryPresenter(
val filterMangaType = preferences.filterMangaType().get() val filterMangaType = preferences.filterMangaType().get()
val filterBookmarked = preferences.filterBookmarked().get()
val showEmptyCategoriesWhileFiltering = preferences.showEmptyCategoriesWhileFiltering().get() val showEmptyCategoriesWhileFiltering = preferences.showEmptyCategoriesWhileFiltering().get()
val filterTrackers = FilterBottomSheet.FILTER_TRACKER val filterTrackers = FilterBottomSheet.FILTER_TRACKER
@ -306,6 +308,7 @@ class LibraryPresenter(
filterCompleted, filterCompleted,
filterTracked, filterTracked,
filterMangaType, filterMangaType,
filterBookmarked,
filterTrackers, filterTrackers,
) )
} }
@ -325,6 +328,7 @@ class LibraryPresenter(
filterCompleted, filterCompleted,
filterTracked, filterTracked,
filterMangaType, filterMangaType,
filterBookmarked,
filterTrackers, filterTrackers,
) )
if (matches) { if (matches) {
@ -347,6 +351,7 @@ class LibraryPresenter(
filterCompleted: Int, filterCompleted: Int,
filterTracked: Int, filterTracked: Int,
filterMangaType: Int, filterMangaType: Int,
filterBookmarked: Int,
filterTrackers: String, filterTrackers: String,
): Boolean { ): Boolean {
(controller as? FilteredLibraryController)?.let { (controller as? FilteredLibraryController)?.let {
@ -360,6 +365,9 @@ class LibraryPresenter(
if (filterUnread == 3 && !(item.manga.unread > 0 && !item.manga.hasRead)) return false if (filterUnread == 3 && !(item.manga.unread > 0 && !item.manga.hasRead)) return false
if (filterUnread == 4 && !(item.manga.unread > 0 && item.manga.hasRead)) return false if (filterUnread == 4 && !(item.manga.unread > 0 && item.manga.hasRead)) return false
if (filterBookmarked == STATE_INCLUDE && item.manga.bookmarkCount == 0) return false
if (filterBookmarked == STATE_EXCLUDE && item.manga.bookmarkCount > 0) return false
if (filterMangaType > 0) { if (filterMangaType > 0) {
if (if (filterMangaType == Manga.TYPE_MANHWA) { if (if (filterMangaType == Manga.TYPE_MANHWA) {
item.manga.seriesType(sourceManager = sourceManager) !in arrayOf(filterMangaType, Manga.TYPE_WEBTOON) item.manga.seriesType(sourceManager = sourceManager) !in arrayOf(filterMangaType, Manga.TYPE_WEBTOON)

View file

@ -71,6 +71,8 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
private lateinit var completed: FilterTagGroup private lateinit var completed: FilterTagGroup
private lateinit var bookmarked: FilterTagGroup
private var tracked: FilterTagGroup? = null private var tracked: FilterTagGroup? = null
private var trackers: FilterTagGroup? = null private var trackers: FilterTagGroup? = null
@ -89,6 +91,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
list.add(unread) list.add(unread)
list.add(downloaded) list.add(downloaded)
list.add(completed) list.add(completed)
list.add(bookmarked)
if (hasTracking) { if (hasTracking) {
tracked?.let { list.add(it) } tracked?.let { list.add(it) }
} }
@ -273,6 +276,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
preferences.filterCompleted().get() > 0 || preferences.filterCompleted().get() > 0 ||
preferences.filterTracked().get() > 0 || preferences.filterTracked().get() > 0 ||
preferences.filterMangaType().get() > 0 || preferences.filterMangaType().get() > 0 ||
preferences.filterBookmarked().get() > 0 ||
FILTER_TRACKER.isNotEmpty() FILTER_TRACKER.isNotEmpty()
} }
@ -289,6 +293,9 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
unread = inflate(R.layout.filter_tag_group) as FilterTagGroup unread = inflate(R.layout.filter_tag_group) as FilterTagGroup
unread.setup(this, R.string.unread, R.string.read) unread.setup(this, R.string.unread, R.string.read)
bookmarked = inflate(R.layout.filter_tag_group) as FilterTagGroup
bookmarked.setup(this, R.string.bookmarked, R.string.not_bookmarked)
if (hasTracking) { if (hasTracking) {
tracked = inflate(R.layout.filter_tag_group) as FilterTagGroup tracked = inflate(R.layout.filter_tag_group) as FilterTagGroup
tracked?.setup(this, R.string.tracked, R.string.not_tracked) tracked?.setup(this, R.string.tracked, R.string.not_tracked)
@ -375,10 +382,11 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
downloaded.setState(preferences.filterDownloaded()) downloaded.setState(preferences.filterDownloaded())
completed.setState(preferences.filterCompleted()) completed.setState(preferences.filterCompleted())
bookmarked.setState(preferences.filterBookmarked())
val unreadP = preferences.filterUnread().get() val unreadP = preferences.filterUnread().get()
if (unreadP <= 2) { if (unreadP <= 2) {
unread.state = unreadP - 1 unread.state = unreadP - 1
} else if (unreadP >= 3) { } else {
unreadProgress.state = unreadP - 3 unreadProgress.state = unreadP - 3
} }
tracked?.setState(preferences.filterTracked()) tracked?.setState(preferences.filterTracked())
@ -395,7 +403,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
filterItems.add(it) filterItems.add(it)
} }
} }
listOfNotNull(unreadProgress, unread, downloaded, completed, mangaType, tracked) listOfNotNull(unreadProgress, unread, downloaded, completed, mangaType, bookmarked, tracked)
.forEach { .forEach {
if (!filterItems.contains(it)) { if (!filterItems.contains(it)) {
filterItems.add(it) filterItems.add(it)
@ -414,6 +422,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
Filters.Downloaded -> downloaded Filters.Downloaded -> downloaded
Filters.Completed -> completed Filters.Completed -> completed
Filters.SeriesType -> mangaType Filters.SeriesType -> mangaType
Filters.Bookmarked -> bookmarked
Filters.Tracked -> if (hasTracking) tracked else null Filters.Tracked -> if (hasTracking) tracked else null
else -> null else -> null
} }
@ -442,6 +451,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
} }
downloaded -> preferences.filterDownloaded() downloaded -> preferences.filterDownloaded()
completed -> preferences.filterCompleted() completed -> preferences.filterCompleted()
bookmarked -> preferences.filterBookmarked()
tracked -> preferences.filterTracked() tracked -> preferences.filterTracked()
mangaType -> { mangaType -> {
val newIndex = when (view.nameOf(index)) { val newIndex = when (view.nameOf(index)) {
@ -479,10 +489,11 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
binding.groupBy.setIconResource(LibraryGroup.groupTypeDrawableRes(groupType)) binding.groupBy.setIconResource(LibraryGroup.groupTypeDrawableRes(groupType))
} }
fun clearFilters() { private fun clearFilters() {
preferences.filterDownloaded().set(0) preferences.filterDownloaded().set(0)
preferences.filterUnread().set(0) preferences.filterUnread().set(0)
preferences.filterCompleted().set(0) preferences.filterCompleted().set(0)
preferences.filterBookmarked().set(0)
preferences.filterTracked().set(0) preferences.filterTracked().set(0)
preferences.filterMangaType().set(0) preferences.filterMangaType().set(0)
FILTER_TRACKER = "" FILTER_TRACKER = ""
@ -536,6 +547,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
Downloaded('d', R.string.downloaded), Downloaded('d', R.string.downloaded),
Completed('c', R.string.status), Completed('c', R.string.status),
SeriesType('m', R.string.series_type), SeriesType('m', R.string.series_type),
Bookmarked('b', R.string.bookmarked),
Tracked('t', R.string.tracked), Tracked('t', R.string.tracked),
; ;
@ -546,6 +558,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
Downloaded, Downloaded,
Completed, Completed,
SeriesType, SeriesType,
Bookmarked,
Tracked, Tracked,
).joinToString("") { it.value.toString() } ).joinToString("") { it.value.toString() }