mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +01:00 
			
		
		
		
	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:
		@@ -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()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -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.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)
 | 
			
		||||
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,4 +8,5 @@ object LibrarySort {
 | 
			
		||||
    const val UNREAD = 3
 | 
			
		||||
    const val TOTAL = 4
 | 
			
		||||
    const val SOURCE = 5
 | 
			
		||||
    const val LATEST_CHAPTER = 6
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user