Library View: Add latest chapter sorting and revert last updated sorting changes

Latest chapter is as it sounds
Last update is now any changes to the chapter list (addition, removal, rename, etc.)
This commit is contained in:
FlaminSarge 2020-01-27 02:54:48 -08:00
parent 3c41a5e910
commit a096e6b337
6 changed files with 41 additions and 6 deletions

View file

@ -113,6 +113,19 @@ interface MangaQueries : DbProvider {
.build())
.prepare()
fun getTotalChapterManga() = db.get().listOfObjects(Manga::class.java)
.withQuery(RawQuery.builder().query(getTotalChapterMangaQuery()).observesTables(MangaTable.TABLE).build()).prepare();
fun getTotalChapterManga() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(RawQuery.builder()
.query(getTotalChapterMangaQuery())
.observesTables(MangaTable.TABLE)
.build())
.prepare()
fun getLatestChapterManga() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(RawQuery.builder()
.query(getLatestChapterMangaQuery())
.observesTables(MangaTable.TABLE)
.build())
.prepare()
}

View file

@ -102,6 +102,15 @@ fun getTotalChapterMangaQuery()= """
ORDER by COUNT(*)
"""
fun getLatestChapterMangaQuery()= """
SELECT ${Manga.TABLE}.*, MAX(${Chapter.TABLE}.${Chapter.COL_DATE_UPLOAD}) AS max
FROM ${Manga.TABLE}
JOIN ${Chapter.TABLE}
ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}
GROUP BY ${Manga.TABLE}.${Manga.COL_ID}
ORDER by max DESC
"""
/**
* Query to get the categories for a manga.
*/

View file

@ -117,7 +117,9 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
private val source = Item.MultiSort(R.string.manga_info_source_label, this)
override val items = listOf(alphabetically, lastRead, lastUpdated, unread, total, source)
private val latestChapter = Item.MultiSort(R.string.manga_info_last_chapter_label, this)
override val items = listOf(alphabetically, lastRead, lastUpdated, unread, total, source, latestChapter)
override val header = Item.Header(R.string.action_sort)
@ -134,6 +136,7 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
unread.state = if (sorting == LibrarySort.UNREAD) order else SORT_NONE
total.state = if (sorting == LibrarySort.TOTAL) order else SORT_NONE
source.state = if (sorting == LibrarySort.SOURCE) order else SORT_NONE
latestChapter.state = if (sorting == LibrarySort.LATEST_CHAPTER) order else SORT_NONE
}
override fun onItemClicked(item: Item) {
@ -155,6 +158,7 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
unread -> LibrarySort.UNREAD
total -> LibrarySort.TOTAL
source -> LibrarySort.SOURCE
latestChapter -> LibrarySort.LATEST_CHAPTER
else -> throw Exception("Unknown sorting")
})
preferences.librarySortingAscending().set(if (item.state == SORT_ASC) true else false)

View file

@ -185,6 +185,10 @@ class LibraryPresenter(
var counter = 0
db.getTotalChapterManga().executeAsBlocking().associate { it.id!! to counter++ }
}
val latestChapterManga by lazy {
var counter = 0
db.getLatestChapterManga().executeAsBlocking().associate { it.id!! to counter++ }
}
val sortFn: (LibraryItem, LibraryItem) -> Int = { i1, i2 ->
when (sortingMode) {
@ -207,6 +211,11 @@ class LibraryPresenter(
val source2Name = sourceManager.getOrStub(i2.manga.source).name
source1Name.compareTo(source2Name)
}
LibrarySort.LATEST_CHAPTER -> {
val manga1latestChapter = latestChapterManga[i1.manga.id!!] ?: 0
val manga2latestChapter = latestChapterManga[i2.manga.id!!] ?: 0
manga1latestChapter.compareTo(manga2latestChapter)
}
else -> throw Exception("Unknown sorting mode")
}
}

View file

@ -8,4 +8,5 @@ object LibrarySort {
const val UNREAD = 3
const val TOTAL = 4
const val SOURCE = 5
const val LATEST_CHAPTER = 6
}

View file

@ -129,9 +129,8 @@ fun syncChaptersWithSource(db: DatabaseHelper,
// Fix order in source.
db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking()
// Set manga's last update time to latest chapter's upload time if possible
val newestChapter = db.getChapters(manga).executeAsBlocking().maxBy { it.date_upload }
manga.last_update = newestChapter?.date_upload ?: manga.last_update
// Set this manga as updated since chapters were changed
manga.last_update = Date().time
db.updateLastUpdated(manga).executeAsBlocking()
}