mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-11-16 18:39:16 +01:00
feat: add read last read chapter shortcut (#7230)
Supersedes #6861 Co-authored-by: Pierre-Monier <65488471+Pierre-Monier@users.noreply.github.com> Co-authored-by: Pierre-Monier <65488471+Pierre-Monier@users.noreply.github.com>
This commit is contained in:
parent
11c61d42dc
commit
4560033e66
@ -26,7 +26,13 @@ class HistoryRepositoryImpl(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getNextChapterForManga(mangaId: Long, chapterId: Long): Chapter? {
|
override suspend fun getLastHistory(): HistoryWithRelations? {
|
||||||
|
return handler.awaitOneOrNull {
|
||||||
|
historyViewQueries.getLatestHistory(historyWithRelationsMapper)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getNextChapter(mangaId: Long, chapterId: Long): Chapter? {
|
||||||
val chapter = handler.awaitOne { chaptersQueries.getChapterById(chapterId, chapterMapper) }
|
val chapter = handler.awaitOne { chaptersQueries.getChapterById(chapterId, chapterMapper) }
|
||||||
val manga = handler.awaitOne { mangasQueries.getMangaById(mangaId, mangaMapper) }
|
val manga = handler.awaitOne { mangasQueries.getMangaById(mangaId, mangaMapper) }
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ import eu.kanade.domain.extension.interactor.GetExtensionUpdates
|
|||||||
import eu.kanade.domain.extension.interactor.GetExtensions
|
import eu.kanade.domain.extension.interactor.GetExtensions
|
||||||
import eu.kanade.domain.history.interactor.DeleteHistoryTable
|
import eu.kanade.domain.history.interactor.DeleteHistoryTable
|
||||||
import eu.kanade.domain.history.interactor.GetHistory
|
import eu.kanade.domain.history.interactor.GetHistory
|
||||||
import eu.kanade.domain.history.interactor.GetNextChapterForManga
|
import eu.kanade.domain.history.interactor.GetNextChapter
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryById
|
import eu.kanade.domain.history.interactor.RemoveHistoryById
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId
|
import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId
|
||||||
import eu.kanade.domain.history.interactor.UpsertHistory
|
import eu.kanade.domain.history.interactor.UpsertHistory
|
||||||
@ -39,7 +39,7 @@ class DomainModule : InjektModule {
|
|||||||
override fun InjektRegistrar.registerInjectables() {
|
override fun InjektRegistrar.registerInjectables() {
|
||||||
addSingletonFactory<MangaRepository> { MangaRepositoryImpl(get()) }
|
addSingletonFactory<MangaRepository> { MangaRepositoryImpl(get()) }
|
||||||
addFactory { GetFavoritesBySourceId(get()) }
|
addFactory { GetFavoritesBySourceId(get()) }
|
||||||
addFactory { GetNextChapterForManga(get()) }
|
addFactory { GetNextChapter(get()) }
|
||||||
addFactory { ResetViewerFlags(get()) }
|
addFactory { ResetViewerFlags(get()) }
|
||||||
|
|
||||||
addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) }
|
addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) }
|
||||||
|
@ -3,11 +3,16 @@ package eu.kanade.domain.history.interactor
|
|||||||
import eu.kanade.domain.chapter.model.Chapter
|
import eu.kanade.domain.chapter.model.Chapter
|
||||||
import eu.kanade.domain.history.repository.HistoryRepository
|
import eu.kanade.domain.history.repository.HistoryRepository
|
||||||
|
|
||||||
class GetNextChapterForManga(
|
class GetNextChapter(
|
||||||
private val repository: HistoryRepository,
|
private val repository: HistoryRepository,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
suspend fun await(mangaId: Long, chapterId: Long): Chapter? {
|
suspend fun await(mangaId: Long, chapterId: Long): Chapter? {
|
||||||
return repository.getNextChapterForManga(mangaId, chapterId)
|
return repository.getNextChapter(mangaId, chapterId)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun await(): Chapter? {
|
||||||
|
val history = repository.getLastHistory() ?: return null
|
||||||
|
return repository.getNextChapter(history.mangaId, history.chapterId)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,7 +9,9 @@ interface HistoryRepository {
|
|||||||
|
|
||||||
fun getHistory(query: String): PagingSource<Long, HistoryWithRelations>
|
fun getHistory(query: String): PagingSource<Long, HistoryWithRelations>
|
||||||
|
|
||||||
suspend fun getNextChapterForManga(mangaId: Long, chapterId: Long): Chapter?
|
suspend fun getLastHistory(): HistoryWithRelations?
|
||||||
|
|
||||||
|
suspend fun getNextChapter(mangaId: Long, chapterId: Long): Chapter?
|
||||||
|
|
||||||
suspend fun resetHistory(historyId: Long)
|
suspend fun resetHistory(historyId: Long)
|
||||||
|
|
||||||
|
@ -177,6 +177,16 @@ class MainActivity : BaseActivity() {
|
|||||||
router.pushController(DownloadController())
|
router.pushController(DownloadController())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
R.id.nav_history -> {
|
||||||
|
if (router.backstackSize == 1) {
|
||||||
|
try {
|
||||||
|
val historyController = router.backstack[0].controller as HistoryController
|
||||||
|
historyController.resumeLastChapterRead()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
toast(R.string.cant_open_last_read_chapter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
R.id.nav_more -> {
|
R.id.nav_more -> {
|
||||||
if (router.backstackSize == 1) {
|
if (router.backstackSize == 1) {
|
||||||
router.pushController(SettingsMainController())
|
router.pushController(SettingsMainController())
|
||||||
|
@ -91,4 +91,8 @@ class HistoryController : ComposeController<HistoryPresenter>(), RootController
|
|||||||
activity.toast(R.string.no_next_chapter)
|
activity.toast(R.string.no_next_chapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun resumeLastChapterRead() {
|
||||||
|
presenter.resumeLastChapterRead()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import androidx.paging.insertSeparators
|
|||||||
import androidx.paging.map
|
import androidx.paging.map
|
||||||
import eu.kanade.domain.history.interactor.DeleteHistoryTable
|
import eu.kanade.domain.history.interactor.DeleteHistoryTable
|
||||||
import eu.kanade.domain.history.interactor.GetHistory
|
import eu.kanade.domain.history.interactor.GetHistory
|
||||||
import eu.kanade.domain.history.interactor.GetNextChapterForManga
|
import eu.kanade.domain.history.interactor.GetNextChapter
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryById
|
import eu.kanade.domain.history.interactor.RemoveHistoryById
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId
|
import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId
|
||||||
import eu.kanade.domain.history.model.HistoryWithRelations
|
import eu.kanade.domain.history.model.HistoryWithRelations
|
||||||
@ -36,7 +36,7 @@ import java.util.Date
|
|||||||
*/
|
*/
|
||||||
class HistoryPresenter(
|
class HistoryPresenter(
|
||||||
private val getHistory: GetHistory = Injekt.get(),
|
private val getHistory: GetHistory = Injekt.get(),
|
||||||
private val getNextChapterForManga: GetNextChapterForManga = Injekt.get(),
|
private val getNextChapter: GetNextChapter = Injekt.get(),
|
||||||
private val deleteHistoryTable: DeleteHistoryTable = Injekt.get(),
|
private val deleteHistoryTable: DeleteHistoryTable = Injekt.get(),
|
||||||
private val removeHistoryById: RemoveHistoryById = Injekt.get(),
|
private val removeHistoryById: RemoveHistoryById = Injekt.get(),
|
||||||
private val removeHistoryByMangaId: RemoveHistoryByMangaId = Injekt.get(),
|
private val removeHistoryByMangaId: RemoveHistoryByMangaId = Injekt.get(),
|
||||||
@ -101,7 +101,7 @@ class HistoryPresenter(
|
|||||||
|
|
||||||
fun getNextChapterForManga(mangaId: Long, chapterId: Long) {
|
fun getNextChapterForManga(mangaId: Long, chapterId: Long) {
|
||||||
presenterScope.launchIO {
|
presenterScope.launchIO {
|
||||||
val chapter = getNextChapterForManga.await(mangaId, chapterId)
|
val chapter = getNextChapter.await(mangaId, chapterId)
|
||||||
launchUI {
|
launchUI {
|
||||||
view?.openChapter(chapter)
|
view?.openChapter(chapter)
|
||||||
}
|
}
|
||||||
@ -117,6 +117,15 @@ class HistoryPresenter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun resumeLastChapterRead() {
|
||||||
|
presenterScope.launchIO {
|
||||||
|
val chapter = getNextChapter.await()
|
||||||
|
launchUI {
|
||||||
|
view?.openChapter(chapter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class HistoryState {
|
sealed class HistoryState {
|
||||||
|
@ -843,4 +843,5 @@
|
|||||||
<string name="spen_next_page">Next page</string>
|
<string name="spen_next_page">Next page</string>
|
||||||
<string name="pref_navigate_pan">Navigate to pan</string>
|
<string name="pref_navigate_pan">Navigate to pan</string>
|
||||||
<string name="pref_landscape_zoom">Zoom landscape image</string>
|
<string name="pref_landscape_zoom">Zoom landscape image</string>
|
||||||
|
<string name="cant_open_last_read_chapter">Unable to open last read chapter</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -46,3 +46,18 @@ AND maxReadAtChapterId = historyView.chapterId
|
|||||||
AND lower(historyView.title) LIKE ('%' || :query || '%')
|
AND lower(historyView.title) LIKE ('%' || :query || '%')
|
||||||
ORDER BY readAt DESC
|
ORDER BY readAt DESC
|
||||||
LIMIT :limit OFFSET :offset;
|
LIMIT :limit OFFSET :offset;
|
||||||
|
|
||||||
|
getLatestHistory:
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
mangaId,
|
||||||
|
chapterId,
|
||||||
|
title,
|
||||||
|
thumbnailUrl,
|
||||||
|
chapterNumber,
|
||||||
|
readAt,
|
||||||
|
readDuration
|
||||||
|
FROM historyView
|
||||||
|
WHERE historyView.readAt > 0
|
||||||
|
ORDER BY readAt DESC
|
||||||
|
LIMIT 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user