Library View: Add latest chapter sorting and revert last updated sorting changes (#2563)
* 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.) * Change latest chapter sort string to "Latest chapter" instead of "Last chapter"
This commit is contained in:
commit
a20ad68fe3
7 changed files with 42 additions and 6 deletions
|
@ -113,6 +113,19 @@ interface MangaQueries : DbProvider {
|
||||||
.build())
|
.build())
|
||||||
.prepare()
|
.prepare()
|
||||||
|
|
||||||
fun getTotalChapterManga() = db.get().listOfObjects(Manga::class.java)
|
fun getTotalChapterManga() = db.get()
|
||||||
.withQuery(RawQuery.builder().query(getTotalChapterMangaQuery()).observesTables(MangaTable.TABLE).build()).prepare();
|
.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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,15 @@ fun getTotalChapterMangaQuery()= """
|
||||||
ORDER by COUNT(*)
|
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.
|
* Query to get the categories for a manga.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -117,7 +117,9 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
|
||||||
|
|
||||||
private val source = Item.MultiSort(R.string.manga_info_source_label, this)
|
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.action_sort_latest_chapter, this)
|
||||||
|
|
||||||
|
override val items = listOf(alphabetically, lastRead, lastUpdated, unread, total, source, latestChapter)
|
||||||
|
|
||||||
override val header = Item.Header(R.string.action_sort)
|
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
|
unread.state = if (sorting == LibrarySort.UNREAD) order else SORT_NONE
|
||||||
total.state = if (sorting == LibrarySort.TOTAL) order else SORT_NONE
|
total.state = if (sorting == LibrarySort.TOTAL) order else SORT_NONE
|
||||||
source.state = if (sorting == LibrarySort.SOURCE) 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) {
|
override fun onItemClicked(item: Item) {
|
||||||
|
@ -155,6 +158,7 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
|
||||||
unread -> LibrarySort.UNREAD
|
unread -> LibrarySort.UNREAD
|
||||||
total -> LibrarySort.TOTAL
|
total -> LibrarySort.TOTAL
|
||||||
source -> LibrarySort.SOURCE
|
source -> LibrarySort.SOURCE
|
||||||
|
latestChapter -> LibrarySort.LATEST_CHAPTER
|
||||||
else -> throw Exception("Unknown sorting")
|
else -> throw Exception("Unknown sorting")
|
||||||
})
|
})
|
||||||
preferences.librarySortingAscending().set(if (item.state == SORT_ASC) true else false)
|
preferences.librarySortingAscending().set(if (item.state == SORT_ASC) true else false)
|
||||||
|
|
|
@ -185,6 +185,10 @@ class LibraryPresenter(
|
||||||
var counter = 0
|
var counter = 0
|
||||||
db.getTotalChapterManga().executeAsBlocking().associate { it.id!! to counter++ }
|
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 ->
|
val sortFn: (LibraryItem, LibraryItem) -> Int = { i1, i2 ->
|
||||||
when (sortingMode) {
|
when (sortingMode) {
|
||||||
|
@ -207,6 +211,11 @@ class LibraryPresenter(
|
||||||
val source2Name = sourceManager.getOrStub(i2.manga.source).name
|
val source2Name = sourceManager.getOrStub(i2.manga.source).name
|
||||||
source1Name.compareTo(source2Name)
|
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")
|
else -> throw Exception("Unknown sorting mode")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,4 +8,5 @@ object LibrarySort {
|
||||||
const val UNREAD = 3
|
const val UNREAD = 3
|
||||||
const val TOTAL = 4
|
const val TOTAL = 4
|
||||||
const val SOURCE = 5
|
const val SOURCE = 5
|
||||||
|
const val LATEST_CHAPTER = 6
|
||||||
}
|
}
|
|
@ -129,9 +129,8 @@ fun syncChaptersWithSource(db: DatabaseHelper,
|
||||||
// Fix order in source.
|
// Fix order in source.
|
||||||
db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking()
|
db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking()
|
||||||
|
|
||||||
// Set manga's last update time to latest chapter's upload time if possible
|
// Set this manga as updated since chapters were changed
|
||||||
val newestChapter = db.getChapters(manga).executeAsBlocking().maxBy { it.date_upload }
|
manga.last_update = Date().time
|
||||||
manga.last_update = newestChapter?.date_upload ?: manga.last_update
|
|
||||||
db.updateLastUpdated(manga).executeAsBlocking()
|
db.updateLastUpdated(manga).executeAsBlocking()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
<string name="action_sort_total">Total chapters</string>
|
<string name="action_sort_total">Total chapters</string>
|
||||||
<string name="action_sort_last_read">Last read</string>
|
<string name="action_sort_last_read">Last read</string>
|
||||||
<string name="action_sort_last_updated">Last updated</string>
|
<string name="action_sort_last_updated">Last updated</string>
|
||||||
|
<string name="action_sort_latest_chapter">Latest chapter</string>
|
||||||
<string name="action_search">Search</string>
|
<string name="action_search">Search</string>
|
||||||
<string name="action_global_search">Global search</string>
|
<string name="action_global_search">Global search</string>
|
||||||
<string name="action_select_all">Select all</string>
|
<string name="action_select_all">Select all</string>
|
||||||
|
|
Reference in a new issue