diff --git a/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt b/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt index 9b69e3bae..bc903189c 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt @@ -1,13 +1,10 @@ package eu.kanade.domain.chapter.model -import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.source.model.SChapter import mihon.core.common.extensions.toEpochMillisOrZero import mihon.core.common.extensions.toInstantOrNull import tachiyomi.domain.chapter.model.Chapter -import eu.kanade.tachiyomi.data.database.models.Chapter as DbChapter -// TODO: Remove when all deps are migrated fun Chapter.toSChapter(): SChapter { return SChapter.create().also { it.url = url @@ -29,19 +26,3 @@ fun Chapter.copyFromSChapter(sChapter: SChapter): Chapter { memo = sChapter.memo, ) } - -fun Chapter.toDbChapter(): DbChapter = ChapterImpl().also { - it.id = id - it.manga_id = mangaId - it.url = url - it.name = name - it.scanlator = scanlator - it.read = read - it.bookmark = bookmark - it.last_page_read = lastPageRead.toInt() - it.date_fetch = dateFetch.toEpochMilliseconds() - it.date_upload = dateUpload.toEpochMillisOrZero() - it.chapter_number = chapterNumber.toFloat() - it.source_order = sourceOrder.toInt() - it.memo = memo -} diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt index 5c496bbd9..69a94c0df 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt @@ -722,7 +722,7 @@ private fun SharedMangaBottomActionMenu( }.takeIf { selected.fastAny { !it.chapter.read } }, onMarkAsUnreadClicked = { onMultiMarkAsReadClicked(selected.fastMap { it.chapter }, false) - }.takeIf { selected.fastAny { it.chapter.read || it.chapter.lastPageRead > 0L } }, + }.takeIf { selected.fastAny { it.chapter.read || it.chapter.lastPageRead > 0 } }, onMarkPreviousAsReadClicked = { onMarkPreviousAsReadClicked(selected[0].chapter) }.takeIf { selected.size == 1 }, diff --git a/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt b/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt index 02911ae35..abf158d94 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt @@ -30,7 +30,6 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.theme.TachiyomiPreviewTheme -import eu.kanade.tachiyomi.data.database.models.toDomainChapter import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import mihon.icons.materialsymbols.MaterialSymbols @@ -50,8 +49,8 @@ fun ChapterTransition( currChapterDownloaded: Boolean, goingToChapterDownloaded: Boolean, ) { - val currChapter = transition.from.chapter.toDomainChapter() - val goingToChapter = transition.to?.chapter?.toDomainChapter() + val currChapter = transition.from.chapter + val goingToChapter = transition.to?.chapter ProvideTextStyle(MaterialTheme.typography.bodyMedium) { when (transition) { diff --git a/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt b/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt index 3eff345f1..d4138d9f4 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt @@ -235,7 +235,7 @@ private fun UpdatesBottomBar( }.takeIf { selected.fastAny { !it.update.read } }, onMarkAsUnreadClicked = { onMultiMarkAsReadClicked(selected, false) - }.takeIf { selected.fastAny { it.update.read || it.update.lastPageRead > 0L } }, + }.takeIf { selected.fastAny { it.update.read || it.update.lastPageRead > 0 } }, onDownloadClicked = { onDownloadChapter(selected, ChapterDownloadAction.START) }.takeIf { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt index abb524297..9b026ca30 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt @@ -38,7 +38,8 @@ class BackupChapter( scanlator = this@BackupChapter.scanlator, read = this@BackupChapter.read, bookmark = this@BackupChapter.bookmark, - lastPageRead = this@BackupChapter.lastPageRead, + // Only untrusted source of this value, and a truncating narrow can land negative + lastPageRead = this@BackupChapter.lastPageRead.coerceIn(0L, Int.MAX_VALUE.toLong()).toInt(), dateFetch = Instant.fromEpochMilliseconds(this@BackupChapter.dateFetch), dateUpload = this@BackupChapter.dateUpload.toInstantOrNull(), sourceOrder = this@BackupChapter.sourceOrder, @@ -54,7 +55,7 @@ fun Chapter.toBackupChapter() = BackupChapter( scanlator = scanlator, read = read, bookmark = bookmark, - lastPageRead = lastPageRead, + lastPageRead = lastPageRead.toLong(), dateFetch = dateFetch.toEpochMilliseconds(), dateUpload = dateUpload.toEpochMillisOrZero(), sourceOrder = sourceOrder, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt deleted file mode 100644 index f385198bf..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt +++ /dev/null @@ -1,48 +0,0 @@ -@file:Suppress("PropertyName") - -package eu.kanade.tachiyomi.data.database.models - -import eu.kanade.tachiyomi.source.model.SChapter -import mihon.core.common.extensions.toInstantOrNull -import java.io.Serializable -import kotlin.time.Instant -import tachiyomi.domain.chapter.model.Chapter as DomainChapter - -interface Chapter : SChapter, Serializable { - - var id: Long? - - var manga_id: Long? - - var read: Boolean - - var bookmark: Boolean - - var last_page_read: Int - - var date_fetch: Long - - var source_order: Int -} - -val Chapter.isRecognizedNumber: Boolean - get() = chapter_number >= 0f - -fun Chapter.toDomainChapter(): DomainChapter? { - if (id == null || manga_id == null) return null - return DomainChapter( - id = id!!, - mangaId = manga_id!!, - read = read, - bookmark = bookmark, - lastPageRead = last_page_read.toLong(), - dateFetch = Instant.fromEpochMilliseconds(date_fetch), - sourceOrder = source_order.toLong(), - url = url, - name = name, - dateUpload = date_upload.toInstantOrNull(), - chapterNumber = chapter_number.toDouble(), - scanlator = scanlator, - memo = memo, - ) -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt deleted file mode 100644 index f7e0d6b5f..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt +++ /dev/null @@ -1,48 +0,0 @@ -@file:Suppress("PropertyName") - -package eu.kanade.tachiyomi.data.database.models - -import kotlinx.serialization.json.JsonObject -import mihon.core.common.extensions.EMPTY - -class ChapterImpl : Chapter { - - override var id: Long? = null - - override var manga_id: Long? = null - - override lateinit var url: String - - override lateinit var name: String - - override var scanlator: String? = null - - override var read: Boolean = false - - override var bookmark: Boolean = false - - override var last_page_read: Int = 0 - - override var date_fetch: Long = 0 - - override var date_upload: Long = 0 - - override var chapter_number: Float = 0f - - override var source_order: Int = 0 - - override var memo: JsonObject = JsonObject.EMPTY - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other == null || javaClass != other.javaClass) return false - - val chapter = other as Chapter - if (url != chapter.url) return false - return id == chapter.id - } - - override fun hashCode(): Int { - return url.hashCode() + id.hashCode() - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 2e34bb10f..95f5e39e0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -17,7 +17,7 @@ import dev.zacsweers.metro.ContributesIntoMap import dev.zacsweers.metrox.viewmodel.ViewModelAssistedFactory import dev.zacsweers.metrox.viewmodel.ViewModelAssistedFactoryKey import eu.kanade.domain.base.BasePreferences -import eu.kanade.domain.chapter.model.toDbChapter +import eu.kanade.domain.chapter.model.toSChapter import eu.kanade.domain.manga.interactor.SetMangaViewerFlags import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.model.readerOrientation @@ -27,7 +27,6 @@ import eu.kanade.domain.track.interactor.TrackChapter import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.cache.CoverCache -import eu.kanade.tachiyomi.data.database.models.toDomainChapter import eu.kanade.tachiyomi.data.download.DownloadCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadProvider @@ -274,7 +273,6 @@ class ReaderViewModel( this } } - .map { it.toDbChapter() } .map(::ReaderChapter) } @@ -291,9 +289,9 @@ class ReaderViewModel( // Restore from SavedState currentChapter.requestedPage = chapterPageIndex } else if (!currentChapter.chapter.read) { - currentChapter.requestedPage = currentChapter.chapter.last_page_read + currentChapter.requestedPage = currentChapter.chapter.lastPageRead } - chapterId = currentChapter.chapter.id!! + chapterId = currentChapter.chapter.id } .launchIn(viewModelScope) @@ -524,9 +522,9 @@ class ReaderViewModel( ) if (!isNextChapterDownloaded) return@launchIO - val chaptersToDownload = getNextChapters.await(manga.id, nextChapter.id!!).run { + val chaptersToDownload = getNextChapters.await(manga.id, nextChapter.id).run { if (readerPreferences.skipDupe.get()) { - removeDuplicates(nextChapter.toDomainChapter()!!) + removeDuplicates(nextChapter) } else { this } @@ -544,7 +542,7 @@ class ReaderViewModel( * if setting is enabled and [currentChapter] is queued for download */ private fun cancelQueuedDownloads(currentChapter: ReaderChapter): Download? { - return downloadManager.getQueuedDownloadOrNull(currentChapter.chapter.id!!)?.also { + return downloadManager.getQueuedDownloadOrNull(currentChapter.chapter.id)?.also { downloadManager.cancelQueuedDownloads(listOf(it)) } } @@ -574,14 +572,14 @@ class ReaderViewModel( .filter { it.id != chapterToDelete.chapter.id && it.isRecognizedNumber && - it.chapterNumber.toFloat() == chapterToDelete.chapter.chapter_number + it.chapterNumber == chapterToDelete.chapter.chapterNumber } // The list is loaded once, before these were marked read along with chapterToDelete .map { it.copy(read = true) } } else { emptyList() } - enqueueDeleteChapters(listOf(chapterToDelete.chapter.toDomainChapter()!!) + duplicateChapters) + enqueueDeleteChapters(listOf(chapterToDelete.chapter) + duplicateChapters) } /** @@ -598,23 +596,23 @@ class ReaderViewModel( chapterPageIndex = pageIndex if (!incognitoMode && page.status !is Page.State.Error) { - readerChapter.chapter.last_page_read = pageIndex + val read = readerChapter.chapter.read || readerChapter.pages?.lastIndex == pageIndex + readerChapter.update { it.copy(lastPageRead = pageIndex, read = read) } if (readerChapter.pages?.lastIndex == pageIndex) { updateChapterProgressOnComplete(readerChapter) } updateChapter.await( - ChapterUpdate(readerChapter.chapter.id!!) { - read = readerChapter.chapter.read - lastPageRead = readerChapter.chapter.last_page_read.toLong() + ChapterUpdate(readerChapter.chapter.id) { + this.read = read + lastPageRead = pageIndex }, ) } } private suspend fun updateChapterProgressOnComplete(readerChapter: ReaderChapter) { - readerChapter.chapter.read = true updateTrackChapterRead(readerChapter) deleteChapterIfNeeded(readerChapter) @@ -627,7 +625,7 @@ class ReaderViewModel( if ( !chapter.read && chapter.isRecognizedNumber && - chapter.chapterNumber.toFloat() == readerChapter.chapter.chapter_number + chapter.chapterNumber == readerChapter.chapter.chapterNumber ) { ChapterUpdate(chapter.id) { read = true } } else { @@ -648,7 +646,7 @@ class ReaderViewModel( getCurrentChapter()?.let { readerChapter -> if (incognitoMode) return@let - val chapterId = readerChapter.chapter.id!! + val chapterId = readerChapter.chapter.id val endTime = Clock.System.now() val sessionReadDuration = chapterReadStartTime?.let { (endTime - it).inWholeMilliseconds } ?: 0 chapterReadStartTime = null @@ -683,7 +681,7 @@ class ReaderViewModel( fun getSource() = state.value.source as? HttpSource fun getChapterUrl(): String? { - val sChapter = getCurrentChapter()?.chapter ?: return null + val sChapter = getCurrentChapter()?.chapter?.toSChapter() ?: return null val source = getSource() ?: return null return try { @@ -698,13 +696,13 @@ class ReaderViewModel( * Bookmarks the currently active chapter. */ fun toggleChapterBookmark() { - val chapter = getCurrentChapter()?.chapter ?: return - val bookmarked = !chapter.bookmark - chapter.bookmark = bookmarked + val readerChapter = getCurrentChapter() ?: return + val bookmarked = !readerChapter.chapter.bookmark + readerChapter.update { it.copy(bookmark = bookmarked) } viewModelScope.launchNonCancellable { updateChapter.await( - ChapterUpdate(chapter.id!!) { + ChapterUpdate(readerChapter.chapter.id) { bookmark = bookmarked }, ) @@ -740,7 +738,7 @@ class ReaderViewModel( if (currChapters != null) { // Save current page val currChapter = currChapters.currChapter - currChapter.requestedPage = currChapter.chapter.last_page_read + currChapter.requestedPage = currChapter.chapter.lastPageRead mutableState.update { it.copy( @@ -776,7 +774,7 @@ class ReaderViewModel( if (currChapters != null) { // Save current page val currChapter = currChapters.currChapter - currChapter.requestedPage = currChapter.chapter.last_page_read + currChapter.requestedPage = currChapter.chapter.lastPageRead mutableState.update { it.copy( @@ -969,7 +967,7 @@ class ReaderViewModel( val manga = manga ?: return viewModelScope.launchNonCancellable { - trackChapter.await(context, manga.id, readerChapter.chapter.chapter_number.toDouble()) + trackChapter.await(context, manga.id, readerChapter.chapter.chapterNumber) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt index 0aa597ec7..5fd1cc519 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.ui.reader.loader import android.content.Context +import eu.kanade.domain.chapter.model.toSChapter import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadProvider @@ -56,7 +57,7 @@ class ChapterLoader( // If the chapter is partially read, set the starting page to the last the user read // otherwise use the requested page. if (!chapter.chapter.read) { - chapter.requestedPage = chapter.chapter.last_page_read + chapter.requestedPage = chapter.chapter.lastPageRead } chapter.state = ReaderChapter.State.Loaded(pages) @@ -94,7 +95,7 @@ class ChapterLoader( downloadManager, downloadProvider, ) - source is LocalSource -> source.getFormat(chapter.chapter).let { format -> + source is LocalSource -> source.getFormat(chapter.chapter.toSChapter()).let { format -> when (format) { is Format.Directory -> DirectoryPageLoader(format.file) is Format.Archive -> ArchivePageLoader(format.file.archiveReader(context)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt index e948c86af..a38d7a493 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.reader.loader import android.content.Context import android.net.Uri import com.hippo.unifile.UniFile -import eu.kanade.tachiyomi.data.database.models.toDomainChapter import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.source.Source @@ -58,7 +57,7 @@ internal class DownloadPageLoader( } private fun getPagesFromDirectory(): List { - val pages = downloadManager.buildPageList(source, manga, chapter.chapter.toDomainChapter()!!) + val pages = downloadManager.buildPageList(source, manga, chapter.chapter) return pages.map { page -> ReaderPage(page.index, page.url, page.imageUrl) { context.contentResolver.openInputStream(page.uri ?: Uri.EMPTY)!! diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt index 034d85a48..1dfdaa0d1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.ui.reader.loader +import eu.kanade.domain.chapter.model.toSChapter import eu.kanade.tachiyomi.data.cache.ChapterCache -import eu.kanade.tachiyomi.data.database.models.toDomainChapter import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter @@ -66,12 +66,12 @@ internal class HttpPageLoader( */ override suspend fun getPages(): List { val pages = try { - chapterCache.getPageListFromCache(chapter.chapter.toDomainChapter()!!) + chapterCache.getPageListFromCache(chapter.chapter) } catch (e: Throwable) { if (e is CancellationException) { throw e } - source.getPageList(chapter.chapter) + source.getPageList(chapter.chapter.toSChapter()) } return pages.mapIndexed { index, page -> // Don't trust sources and use our own indexing @@ -136,7 +136,7 @@ internal class HttpPageLoader( try { // Convert to pages without reader information val pagesToSave = pages.map { Page(it.index, it.url, it.imageUrl) } - chapterCache.putPageListToCache(chapter.chapter.toDomainChapter()!!, pagesToSave) + chapterCache.putPageListToCache(chapter.chapter, pagesToSave) } catch (e: Throwable) { if (e is CancellationException) { throw e diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt index cb3bca256..56fd02c4e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt @@ -1,12 +1,19 @@ package eu.kanade.tachiyomi.ui.reader.model -import eu.kanade.domain.chapter.model.toDbChapter -import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.ui.reader.loader.PageLoader import kotlinx.coroutines.flow.MutableStateFlow import tachiyomi.core.common.util.system.logcat +import tachiyomi.domain.chapter.model.Chapter -data class ReaderChapter(val chapter: Chapter) { +data class ReaderChapter(private val loadedChapter: Chapter) { + + /** + * The chapter as it currently stands, which drifts from [loadedChapter] as the reader records + * progress against it. Equality stays on the chapter it was loaded with, so a chapter held by + * the viewers keeps comparing equal to itself while being read. + */ + var chapter: Chapter = loadedChapter + private set val stateFlow = MutableStateFlow(State.Wait) var state: State @@ -24,7 +31,9 @@ data class ReaderChapter(val chapter: Chapter) { private var references = 0 - constructor(chapter: tachiyomi.domain.chapter.model.Chapter) : this(chapter.toDbChapter()) + fun update(transform: (Chapter) -> Chapter) { + chapter = transform(chapter) + } fun ref() { references++ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/MissingChapters.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/MissingChapters.kt index 3c7c03aea..f5af09d75 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/MissingChapters.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/MissingChapters.kt @@ -1,12 +1,11 @@ package eu.kanade.tachiyomi.ui.reader.viewer -import eu.kanade.tachiyomi.data.database.models.toDomainChapter import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import tachiyomi.domain.chapter.service.calculateChapterGap as domainCalculateChapterGap fun calculateChapterGap(higherReaderChapter: ReaderChapter?, lowerReaderChapter: ReaderChapter?): Int { return domainCalculateChapterGap( - higherReaderChapter?.chapter?.toDomainChapter(), - lowerReaderChapter?.chapter?.toDomainChapter(), + higherReaderChapter?.chapter, + lowerReaderChapter?.chapter, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 228145a66..c686df34c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -211,7 +211,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr val nextItem = adapter.items.getOrNull(adapter.items.size - 1) val transitionChapter = (nextItem as? ChapterTransition.Next)?.to ?: (nextItem as?ReaderPage)?.chapter if (transitionChapter != null) { - logcat { "Requesting to preload chapter ${transitionChapter.chapter.chapter_number}" } + logcat { "Requesting to preload chapter ${transitionChapter.chapter.chapterNumber}" } activity.requestPreloadChapter(transitionChapter) } } diff --git a/data/src/main/java/tachiyomi/data/DatabaseAdapter.kt b/data/src/main/java/tachiyomi/data/DatabaseAdapter.kt index bdd372634..807099e6b 100644 --- a/data/src/main/java/tachiyomi/data/DatabaseAdapter.kt +++ b/data/src/main/java/tachiyomi/data/DatabaseAdapter.kt @@ -35,3 +35,10 @@ object MemoColumnAdapter : ColumnAdapter { override fun decode(databaseValue: ByteArray): JsonObject = databaseValue.toJsonObject() override fun encode(value: JsonObject): ByteArray = value.toByteArray() } + +// SQLite has one integer type, so a column holding a value that cannot exceed Int range narrows +// here rather than at every call site that reads or writes it. +object IntColumnAdapter : ColumnAdapter { + override fun decode(databaseValue: Long): Int = databaseValue.toInt() + override fun encode(value: Int): Long = value.toLong() +} diff --git a/data/src/main/java/tachiyomi/data/DatabaseBindings.kt b/data/src/main/java/tachiyomi/data/DatabaseBindings.kt index f00fc39cb..0ec442e87 100644 --- a/data/src/main/java/tachiyomi/data/DatabaseBindings.kt +++ b/data/src/main/java/tachiyomi/data/DatabaseBindings.kt @@ -81,6 +81,7 @@ object DatabaseBindings { chapterAdapter = Chapter.Adapter( remote_date_uploadAdapter = InstantColumnAdapter, remote_memoAdapter = MemoColumnAdapter, + user_last_page_readAdapter = IntColumnAdapter, state_date_fetchAdapter = InstantColumnAdapter, ), manga_trackAdapter = Manga_track.Adapter( diff --git a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt index d6074a70b..cfd3a35bf 100644 --- a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt @@ -164,7 +164,7 @@ class ChapterRepositoryImpl( remoteMemo: JsonObject, userRead: Boolean, userBookmark: Boolean, - userLastPageRead: Long, + userLastPageRead: Int, stateDateFetch: Instant, ): Chapter = Chapter( id = id, diff --git a/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt index 8e90666a7..b6d732563 100644 --- a/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt @@ -91,7 +91,7 @@ class UpdatesRepositoryImpl( chapterUrl: String, read: Boolean, bookmark: Boolean, - lastPageRead: Long, + lastPageRead: Int, sourceId: Long, favorite: Boolean, thumbnailUrl: String?, diff --git a/data/src/main/sqldelight/tachiyomi/data/chapter.sq b/data/src/main/sqldelight/tachiyomi/data/chapter.sq index 3e47cb12d..73f5996a4 100644 --- a/data/src/main/sqldelight/tachiyomi/data/chapter.sq +++ b/data/src/main/sqldelight/tachiyomi/data/chapter.sq @@ -1,4 +1,5 @@ import kotlin.Boolean; +import kotlin.Int; import kotlin.time.Instant; import kotlinx.serialization.json.JsonObject; @@ -14,7 +15,7 @@ CREATE TABLE chapter( remote_memo BLOB AS JsonObject NOT NULL, user_read INTEGER AS Boolean NOT NULL, user_bookmark INTEGER AS Boolean NOT NULL, - user_last_page_read INTEGER NOT NULL, + user_last_page_read INTEGER AS Int NOT NULL, state_date_fetch INTEGER AS Instant NOT NULL, UNIQUE(manga_id, remote_url), FOREIGN KEY(manga_id) REFERENCES manga (id) diff --git a/data/src/main/sqldelight/tachiyomi/view/updatesView.sq b/data/src/main/sqldelight/tachiyomi/view/updatesView.sq index bfaa967ab..a099ec1f0 100644 --- a/data/src/main/sqldelight/tachiyomi/view/updatesView.sq +++ b/data/src/main/sqldelight/tachiyomi/view/updatesView.sq @@ -1,3 +1,5 @@ +import kotlin.Int; + CREATE VIEW updatesView AS SELECT manga.id AS mangaId, diff --git a/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt b/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt index f8b807c1d..fc25bc1ac 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt @@ -9,7 +9,7 @@ data class Chapter( val mangaId: Long, val read: Boolean, val bookmark: Boolean, - val lastPageRead: Long, + val lastPageRead: Int, val dateFetch: Instant, val sourceOrder: Long, val url: String, diff --git a/domain/src/main/java/tachiyomi/domain/chapter/model/ChapterUpdate.kt b/domain/src/main/java/tachiyomi/domain/chapter/model/ChapterUpdate.kt index ad5d08046..3c344f550 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/model/ChapterUpdate.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/model/ChapterUpdate.kt @@ -6,7 +6,7 @@ import kotlin.time.Instant class ChapterUpdate(val id: Long, block: ChapterUpdate.() -> Unit) : PartialUpdate() { var read: Boolean? by field(null) var bookmark: Boolean? by field(null) - var lastPageRead: Long? by field(null) + var lastPageRead: Int? by field(null) var dateFetch: Instant? by field(null) init { diff --git a/domain/src/main/java/tachiyomi/domain/updates/model/UpdatesWithRelations.kt b/domain/src/main/java/tachiyomi/domain/updates/model/UpdatesWithRelations.kt index e9a3275ad..49841d5e6 100644 --- a/domain/src/main/java/tachiyomi/domain/updates/model/UpdatesWithRelations.kt +++ b/domain/src/main/java/tachiyomi/domain/updates/model/UpdatesWithRelations.kt @@ -12,7 +12,7 @@ data class UpdatesWithRelations( val chapterUrl: String, val read: Boolean, val bookmark: Boolean, - val lastPageRead: Long, + val lastPageRead: Int, val sourceId: Long, val dateFetch: Instant, val coverData: MangaCover,