From f8fff318ba0fa3b59a2c8254d6a8ff0d85a890ad Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 27 Sep 2026 22:36:13 +0600 Subject: [PATCH] Build manga and chapter updates with a lambda and track assigned fields MangaUpdate and ChapterUpdate are built with a lambda that records which fields were assigned, so an update writes only those fields. --- .../chapter/interactor/SetReadStatus.kt | 9 ++- .../manga/interactor/SetMangaViewerFlags.kt | 14 ++--- .../domain/manga/interactor/UpdateManga.kt | 16 +++--- .../SyncChapterProgressWithTrack.kt | 4 +- .../backup/restore/restorers/MangaRestorer.kt | 2 +- .../data/notification/NotificationReceiver.kt | 5 +- .../source/browse/BrowseSourceViewModel.kt | 25 +++++---- .../tachiyomi/ui/library/LibraryViewModel.kt | 7 +-- .../tachiyomi/ui/manga/MangaViewModel.kt | 2 +- .../tachiyomi/ui/reader/ReaderViewModel.kt | 18 +++--- .../tachiyomi/ui/updates/UpdatesViewModel.kt | 2 +- .../migration/usecases/MigrateMangaUseCase.kt | 55 ++++++++----------- .../data/chapter/ChapterRepositoryImpl.kt | 1 - .../data/manga/MangaRepositoryImpl.kt | 26 +++++---- .../sqldelight/tachiyomi/data/chapters.sq | 3 +- .../java/mihon/domain/common/PartialUpdate.kt | 15 +++++ .../domain/chapter/model/ChapterUpdate.kt | 27 ++++----- .../domain/manga/interactor/FetchInterval.kt | 7 ++- .../manga/interactor/SetMangaChapterFlags.kt | 42 ++++++-------- .../manga/interactor/UpdateMangaNotes.kt | 7 +-- .../domain/manga/model/MangaUpdate.kt | 40 +++++--------- 21 files changed, 155 insertions(+), 172 deletions(-) create mode 100644 domain/src/main/java/mihon/domain/common/PartialUpdate.kt diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt index 1ecf3e5ba..690b8f964 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt @@ -21,11 +21,10 @@ class SetReadStatus( ) { private val mapper = { chapter: Chapter, read: Boolean -> - ChapterUpdate( - read = read, - lastPageRead = if (!read) 0 else null, - id = chapter.id, - ) + ChapterUpdate(chapter.id) { + this.read = read + if (!read) lastPageRead = 0 + } } suspend fun await(read: Boolean, vararg chapters: Chapter): Result = withNonCancellableContext { diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/SetMangaViewerFlags.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/SetMangaViewerFlags.kt index 820d41373..8531be301 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/SetMangaViewerFlags.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/SetMangaViewerFlags.kt @@ -14,20 +14,18 @@ class SetMangaViewerFlags( suspend fun awaitSetReadingMode(id: Long, flag: Long) { val manga = mangaRepository.getMangaById(id) mangaRepository.update( - MangaUpdate( - id = id, - viewerFlags = manga.viewerFlags.setFlag(flag, ReadingMode.MASK.toLong()), - ), + MangaUpdate(id) { + viewerFlags = manga.viewerFlags.setFlag(flag, ReadingMode.MASK.toLong()) + }, ) } suspend fun awaitSetOrientation(id: Long, flag: Long) { val manga = mangaRepository.getMangaById(id) mangaRepository.update( - MangaUpdate( - id = id, - viewerFlags = manga.viewerFlags.setFlag(flag, ReaderOrientation.MASK.toLong()), - ), + MangaUpdate(id) { + viewerFlags = manga.viewerFlags.setFlag(flag, ReaderOrientation.MASK.toLong()) + }, ) } diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt index b84251b83..1e7c6010a 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt @@ -31,20 +31,19 @@ class UpdateManga( window: Pair = fetchInterval.getWindow(dateTime.date, timeZone), ): Boolean { return mangaRepository.update( - fetchInterval.toMangaUpdate(manga, dateTime, timeZone, window), + fetchInterval.withFetchInterval(manga, dateTime, timeZone, window), ) } suspend fun awaitUpdateLastUpdate(mangaId: Long): Boolean { - return mangaRepository.update(MangaUpdate(id = mangaId, lastUpdate = Clock.System.now().toEpochMilliseconds())) + return mangaRepository.update(MangaUpdate(mangaId) { lastUpdate = Clock.System.now().toEpochMilliseconds() }) } suspend fun awaitUpdateCoverLastModified(mangaId: Long): Boolean { return mangaRepository.update( - MangaUpdate( - id = mangaId, - coverLastModified = Clock.System.now().toEpochMilliseconds(), - ), + MangaUpdate(mangaId) { + coverLastModified = Clock.System.now().toEpochMilliseconds() + }, ) } @@ -54,7 +53,10 @@ class UpdateManga( false -> 0 } return mangaRepository.update( - MangaUpdate(id = mangaId, favorite = favorite, dateAdded = dateAdded), + MangaUpdate(mangaId) { + this.favorite = favorite + this.dateAdded = dateAdded + }, ) } } diff --git a/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt b/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt index edc8c4826..29e6cdf54 100644 --- a/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt +++ b/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt @@ -8,7 +8,7 @@ import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.interactor.UpdateChapter -import tachiyomi.domain.chapter.model.toChapterUpdate +import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.track.interactor.InsertTrack import tachiyomi.domain.track.model.Track import kotlin.math.max @@ -35,7 +35,7 @@ class SyncChapterProgressWithTrack( val chapterUpdates = sortedChapters .filter { chapter -> chapter.chapterNumber <= remoteTrack.lastChapterRead && !chapter.read } - .map { it.copy(read = true).toChapterUpdate() } + .map { ChapterUpdate(it.id) { read = true } } // only take into account continuous reading val localLastRead = sortedChapters.takeWhile { it.read }.lastOrNull()?.chapterNumber ?: 0F diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt index 085b49e8a..184b50415 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt @@ -59,7 +59,7 @@ class MangaRestorer( } restoreRepository.restoreManga(entries) { - fetchInterval.toMangaUpdate(it, now, timeZone, currentFetchWindow) + fetchInterval.withFetchInterval(it, now, timeZone, currentFetchWindow) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index 5bd3f30e9..7e12c9f07 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -25,7 +25,7 @@ import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.chapter.interactor.GetChapter import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.model.Chapter -import tachiyomi.domain.chapter.model.toChapterUpdate +import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.model.Manga @@ -192,7 +192,6 @@ class NotificationReceiver : BroadcastReceiver() { launchIO { val toUpdate = chapterUrls.mapNotNull { getChapter.await(it, mangaId) } .map { - val chapter = it.copy(read = true) if (downloadPreferences.removeAfterMarkedAsRead.get()) { val manga = getManga.await(mangaId) if (manga != null) { @@ -202,7 +201,7 @@ class NotificationReceiver : BroadcastReceiver() { } } } - chapter.toChapterUpdate() + ChapterUpdate(it.id) { read = true } } updateChapter.awaitAll(toUpdate) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceViewModel.kt index ea39231f3..5b4e771de 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceViewModel.kt @@ -51,8 +51,8 @@ import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.manga.interactor.GetDuplicateLibraryManga import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.model.Manga +import tachiyomi.domain.manga.model.MangaUpdate import tachiyomi.domain.manga.model.MangaWithChapterCount -import tachiyomi.domain.manga.model.toMangaUpdate import tachiyomi.domain.source.interactor.GetRemoteManga import tachiyomi.domain.source.service.SourceManager import kotlin.time.Clock @@ -233,22 +233,23 @@ class BrowseSourceViewModel( */ fun changeMangaFavorite(manga: Manga) { viewModelScope.launch { - var new = manga.copy( - favorite = !manga.favorite, - dateAdded = when (manga.favorite) { - true -> 0 - false -> Clock.System.now().toEpochMilliseconds() - }, - ) - - if (!new.favorite) { - new = new.removeCovers(coverCache) + val update = if (manga.favorite) { + val coverLastModified = manga.removeCovers(coverCache).coverLastModified + MangaUpdate(manga.id) { + favorite = false + dateAdded = 0 + if (coverLastModified != manga.coverLastModified) this.coverLastModified = coverLastModified + } } else { setMangaDefaultChapterFlags.await(manga) addTracks.bindEnhancedTrackers(manga, sourceManager.getOrStub(manga.source)) + MangaUpdate(manga.id) { + favorite = true + dateAdded = Clock.System.now().toEpochMilliseconds() + } } - updateManga.await(new.toMangaUpdate()) + updateManga.await(update) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryViewModel.kt index 36284623a..bf42d0878 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryViewModel.kt @@ -571,10 +571,9 @@ class LibraryViewModel( if (deleteFromLibrary) { val toDelete = mangas.map { it.removeCovers(coverCache) - MangaUpdate( - favorite = false, - id = it.id, - ) + MangaUpdate(it.id) { + favorite = false + } } updateManga.awaitAll(toDelete) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt index 505740172..8262ccbce 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt @@ -812,7 +812,7 @@ class MangaViewModel( viewModelScope.launchIO { chapters .filterNot { it.bookmark == bookmarked } - .map { ChapterUpdate(id = it.id, bookmark = bookmarked) } + .map { ChapterUpdate(it.id) { bookmark = bookmarked } } .let { updateChapter.awaitAll(it) } } toggleAllSelection(false) 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 914c6cf77..2edd7c0f8 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 @@ -583,11 +583,10 @@ class ReaderViewModel( } updateChapter.await( - ChapterUpdate( - id = readerChapter.chapter.id!!, - read = readerChapter.chapter.read, - lastPageRead = readerChapter.chapter.last_page_read.toLong(), - ), + ChapterUpdate(readerChapter.chapter.id!!) { + read = readerChapter.chapter.read + lastPageRead = readerChapter.chapter.last_page_read.toLong() + }, ) } } @@ -608,7 +607,7 @@ class ReaderViewModel( chapter.isRecognizedNumber && chapter.chapterNumber.toFloat() == readerChapter.chapter.chapter_number ) { - ChapterUpdate(id = chapter.id, read = true) + ChapterUpdate(chapter.id) { read = true } } else { null } @@ -683,10 +682,9 @@ class ReaderViewModel( viewModelScope.launchNonCancellable { updateChapter.await( - ChapterUpdate( - id = chapter.id!!, - bookmark = bookmarked, - ), + ChapterUpdate(chapter.id!!) { + bookmark = bookmarked + }, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt index 48b7dde46..8e94b2b0b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt @@ -303,7 +303,7 @@ class UpdatesViewModel( viewModelScope.launchIO { updates .filterNot { it.update.bookmark == bookmark } - .map { ChapterUpdate(id = it.update.chapterId, bookmark = bookmark) } + .map { ChapterUpdate(it.update.chapterId) { this.bookmark = bookmark } } .let { updateChapter.awaitAll(it) } } toggleAllSelection(false) diff --git a/app/src/main/java/mihon/domain/migration/usecases/MigrateMangaUseCase.kt b/app/src/main/java/mihon/domain/migration/usecases/MigrateMangaUseCase.kt index fe7f71d96..630a0c9ec 100644 --- a/app/src/main/java/mihon/domain/migration/usecases/MigrateMangaUseCase.kt +++ b/app/src/main/java/mihon/domain/migration/usecases/MigrateMangaUseCase.kt @@ -15,7 +15,7 @@ import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.interactor.UpdateChapter -import tachiyomi.domain.chapter.model.toChapterUpdate +import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MangaUpdate import tachiyomi.domain.source.service.SourceManager @@ -58,28 +58,23 @@ class MigrateMangaUseCase( .filter { it.read } .maxOfOrNull { it.chapterNumber } - val updatedMangaChapters = mangaChapters.map { mangaChapter -> - var updatedChapter = mangaChapter - if (updatedChapter.isRecognizedNumber) { + val chapterUpdates = mangaChapters + .filter { it.isRecognizedNumber } + .map { mangaChapter -> val prevChapter = prevMangaChapters - .find { it.isRecognizedNumber && it.chapterNumber == updatedChapter.chapterNumber } + .find { it.isRecognizedNumber && it.chapterNumber == mangaChapter.chapterNumber } - if (prevChapter != null) { - updatedChapter = updatedChapter.copy( - dateFetch = prevChapter.dateFetch, - bookmark = prevChapter.bookmark, - ) - } + ChapterUpdate(mangaChapter.id) { + if (prevChapter != null) { + dateFetch = prevChapter.dateFetch + bookmark = prevChapter.bookmark + } - if (maxChapterRead != null && updatedChapter.chapterNumber <= maxChapterRead) { - updatedChapter = updatedChapter.copy(read = true) + if (maxChapterRead != null && mangaChapter.chapterNumber <= maxChapterRead) { + read = true + } } } - - updatedChapter - } - - val chapterUpdates = updatedMangaChapters.map { it.toChapterUpdate() } updateChapter.awaitAll(chapterUpdates) } @@ -115,20 +110,18 @@ class MigrateMangaUseCase( coverCache.setCustomCoverToCache(target, coverCache.getCustomCoverFile(current.id).inputStream()) } - val currentMangaUpdate = MangaUpdate( - id = current.id, - favorite = false, - dateAdded = 0, - ) + val currentMangaUpdate = MangaUpdate(current.id) { + favorite = false + dateAdded = 0 + } .takeIf { replace } - val targetMangaUpdate = MangaUpdate( - id = target.id, - favorite = true, - chapterFlags = current.chapterFlags, - viewerFlags = current.viewerFlags, - dateAdded = if (replace) current.dateAdded else Clock.System.now().toEpochMilliseconds(), - notes = if (MigrationFlag.NOTES in flags) current.notes else null, - ) + val targetMangaUpdate = MangaUpdate(target.id) { + favorite = true + chapterFlags = current.chapterFlags + viewerFlags = current.viewerFlags + dateAdded = if (replace) current.dateAdded else Clock.System.now().toEpochMilliseconds() + if (MigrationFlag.NOTES in flags) notes = current.notes + } updateManga.awaitAll(listOfNotNull(currentMangaUpdate, targetMangaUpdate)) } catch (e: Throwable) { diff --git a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt index 11ff79288..2eb4c5135 100644 --- a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt @@ -82,7 +82,6 @@ class ChapterRepositoryImpl( database.transaction { chapterUpdates.forEach { chapterUpdate -> database.chaptersQueries.update( - mangaId = chapterUpdate.mangaId, read = chapterUpdate.read, bookmark = chapterUpdate.bookmark, lastPageRead = chapterUpdate.lastPageRead, diff --git a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt index c2d107a50..d631b70f4 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt @@ -245,18 +245,20 @@ class MangaRepositoryImpl( private suspend fun partialUpdate(vararg mangaUpdates: MangaUpdate) { database.transaction { mangaUpdates.forEach { value -> - database.mangasQueries.update( - favorite = value.favorite, - lastUpdate = value.lastUpdate, - nextUpdate = value.nextUpdate, - calculateInterval = value.fetchInterval?.toLong(), - viewer = value.viewerFlags, - chapterFlags = value.chapterFlags, - coverLastModified = value.coverLastModified, - dateAdded = value.dateAdded, - mangaId = value.id, - notes = value.notes, - ) + with(value) { + database.mangasQueries.update( + favorite = favorite, + lastUpdate = lastUpdate, + nextUpdate = nextUpdate, + calculateInterval = fetchInterval?.toLong(), + viewer = viewerFlags, + chapterFlags = chapterFlags, + coverLastModified = coverLastModified, + dateAdded = dateAdded, + mangaId = id, + notes = notes, + ) + } } } } diff --git a/data/src/main/sqldelight/tachiyomi/data/chapters.sq b/data/src/main/sqldelight/tachiyomi/data/chapters.sq index 563704021..c9ea3ebe4 100644 --- a/data/src/main/sqldelight/tachiyomi/data/chapters.sq +++ b/data/src/main/sqldelight/tachiyomi/data/chapters.sq @@ -79,8 +79,7 @@ RETURNING _id; update: UPDATE chapters -SET manga_id = coalesce(:mangaId, manga_id), - read = coalesce(:read, read), +SET read = coalesce(:read, read), bookmark = coalesce(:bookmark, bookmark), last_page_read = coalesce(:lastPageRead, last_page_read), date_fetch = coalesce(:dateFetch, date_fetch) diff --git a/domain/src/main/java/mihon/domain/common/PartialUpdate.kt b/domain/src/main/java/mihon/domain/common/PartialUpdate.kt new file mode 100644 index 000000000..187fa8012 --- /dev/null +++ b/domain/src/main/java/mihon/domain/common/PartialUpdate.kt @@ -0,0 +1,15 @@ +package mihon.domain.common + +import kotlin.properties.Delegates +import kotlin.reflect.KProperty + +abstract class PartialUpdate { + + private val assigned = mutableSetOf() + + fun isSet(property: KProperty<*>): Boolean = property.name in assigned + + protected fun field(initial: T) = Delegates.observable(initial) { property, _, _ -> + assigned += property.name + } +} 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 61a54472d..e87886fd1 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/model/ChapterUpdate.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/model/ChapterUpdate.kt @@ -1,21 +1,14 @@ package tachiyomi.domain.chapter.model -data class ChapterUpdate( - val id: Long, - val mangaId: Long? = null, - val read: Boolean? = null, - val bookmark: Boolean? = null, - val lastPageRead: Long? = null, - val dateFetch: Long? = null, -) +import mihon.domain.common.PartialUpdate -fun Chapter.toChapterUpdate(): ChapterUpdate { - return ChapterUpdate( - id = id, - mangaId = mangaId, - read = read, - bookmark = bookmark, - lastPageRead = lastPageRead, - dateFetch = dateFetch, - ) +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 dateFetch: Long? by field(null) + + init { + block() + } } diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt index a38e9e4d2..c62f07af2 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt @@ -22,7 +22,7 @@ class FetchInterval( private val getChaptersByMangaId: GetChaptersByMangaId, ) { - suspend fun toMangaUpdate( + suspend fun withFetchInterval( manga: Manga, dateTime: LocalDateTime, timeZone: TimeZone, @@ -39,7 +39,10 @@ class FetchInterval( } val nextUpdate = calculateNextUpdate(manga, interval, dateTime, timeZone, currentWindow) - return MangaUpdate(id = manga.id, nextUpdate = nextUpdate, fetchInterval = interval) + return MangaUpdate(manga.id) { + this.nextUpdate = nextUpdate + fetchInterval = interval + } } fun getWindow(localDateTime: LocalDate, timeZone: TimeZone): Pair { diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/SetMangaChapterFlags.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/SetMangaChapterFlags.kt index bd7e6a326..150105295 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/SetMangaChapterFlags.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/SetMangaChapterFlags.kt @@ -12,37 +12,33 @@ class SetMangaChapterFlags( suspend fun awaitSetDownloadedFilter(manga: Manga, flag: Long): Boolean { return mangaRepository.update( - MangaUpdate( - id = manga.id, - chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_DOWNLOADED_MASK), - ), + MangaUpdate(manga.id) { + chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_DOWNLOADED_MASK) + }, ) } suspend fun awaitSetUnreadFilter(manga: Manga, flag: Long): Boolean { return mangaRepository.update( - MangaUpdate( - id = manga.id, - chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_UNREAD_MASK), - ), + MangaUpdate(manga.id) { + chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_UNREAD_MASK) + }, ) } suspend fun awaitSetBookmarkFilter(manga: Manga, flag: Long): Boolean { return mangaRepository.update( - MangaUpdate( - id = manga.id, - chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_BOOKMARKED_MASK), - ), + MangaUpdate(manga.id) { + chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_BOOKMARKED_MASK) + }, ) } suspend fun awaitSetDisplayMode(manga: Manga, flag: Long): Boolean { return mangaRepository.update( - MangaUpdate( - id = manga.id, - chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_DISPLAY_MASK), - ), + MangaUpdate(manga.id) { + chapterFlags = manga.chapterFlags.setFlag(flag, Manga.CHAPTER_DISPLAY_MASK) + }, ) } @@ -64,10 +60,9 @@ class SetMangaChapterFlags( } } return mangaRepository.update( - MangaUpdate( - id = manga.id, - chapterFlags = newFlags, - ), + MangaUpdate(manga.id) { + chapterFlags = newFlags + }, ) } @@ -81,15 +76,14 @@ class SetMangaChapterFlags( displayMode: Long, ): Boolean { return mangaRepository.update( - MangaUpdate( - id = mangaId, + MangaUpdate(mangaId) { chapterFlags = 0L.setFlag(unreadFilter, Manga.CHAPTER_UNREAD_MASK) .setFlag(downloadedFilter, Manga.CHAPTER_DOWNLOADED_MASK) .setFlag(bookmarkedFilter, Manga.CHAPTER_BOOKMARKED_MASK) .setFlag(sortingMode, Manga.CHAPTER_SORTING_MASK) .setFlag(sortingDirection, Manga.CHAPTER_SORT_DIR_MASK) - .setFlag(displayMode, Manga.CHAPTER_DISPLAY_MASK), - ), + .setFlag(displayMode, Manga.CHAPTER_DISPLAY_MASK) + }, ) } diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/UpdateMangaNotes.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/UpdateMangaNotes.kt index c6319c5a5..7dbe2611f 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/UpdateMangaNotes.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/UpdateMangaNotes.kt @@ -11,10 +11,9 @@ class UpdateMangaNotes( suspend operator fun invoke(mangaId: Long, notes: String): Boolean { return mangaRepository.update( - MangaUpdate( - id = mangaId, - notes = notes, - ), + MangaUpdate(mangaId) { + this.notes = notes + }, ) } } diff --git a/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt b/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt index 052ada530..d2a92196c 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt @@ -1,29 +1,19 @@ package tachiyomi.domain.manga.model -data class MangaUpdate( - val id: Long, - val favorite: Boolean? = null, - val lastUpdate: Long? = null, - val nextUpdate: Long? = null, - val fetchInterval: Int? = null, - val dateAdded: Long? = null, - val viewerFlags: Long? = null, - val chapterFlags: Long? = null, - val coverLastModified: Long? = null, - val notes: String? = null, -) +import mihon.domain.common.PartialUpdate -fun Manga.toMangaUpdate(): MangaUpdate { - return MangaUpdate( - id = id, - favorite = favorite, - lastUpdate = lastUpdate, - nextUpdate = nextUpdate, - fetchInterval = fetchInterval, - dateAdded = dateAdded, - viewerFlags = viewerFlags, - chapterFlags = chapterFlags, - coverLastModified = coverLastModified, - notes = notes, - ) +class MangaUpdate(val id: Long, block: MangaUpdate.() -> Unit) : PartialUpdate() { + var favorite: Boolean? by field(null) + var lastUpdate: Long? by field(null) + var nextUpdate: Long? by field(null) + var fetchInterval: Int? by field(null) + var dateAdded: Long? by field(null) + var viewerFlags: Long? by field(null) + var chapterFlags: Long? by field(null) + var coverLastModified: Long? by field(null) + var notes: String? by field(null) + + init { + block() + } }