From 621cb19c5bbd270dbc19e5f0e9ff6dde6194436f Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 10 Jul 2025 08:48:10 +0300 Subject: [PATCH] Fix saving override for non-library manga --- .../alternatives/domain/MigrateUseCase.kt | 38 +++++++++---------- .../kotatsu/core/os/AppShortcutManager.kt | 2 +- .../core/parser/MangaDataRepository.kt | 14 ++++--- .../download/ui/worker/DownloadWorker.kt | 2 +- .../explore/domain/RecoverMangaUseCase.kt | 2 +- .../kotatsu/history/data/HistoryRepository.kt | 2 +- .../local/data/index/LocalMangaIndex.kt | 2 +- .../main/domain/CoverRestoreInterceptor.kt | 2 +- .../override/OverrideConfigViewModel.kt | 2 +- 9 files changed, 34 insertions(+), 32 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/alternatives/domain/MigrateUseCase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/alternatives/domain/MigrateUseCase.kt index df5dd5233..afd2b6b30 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/alternatives/domain/MigrateUseCase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/alternatives/domain/MigrateUseCase.kt @@ -30,21 +30,19 @@ constructor( oldManga: Manga, newManga: Manga, ) { - val oldDetails = - if (oldManga.chapters.isNullOrEmpty()) { - runCatchingCancellable { - mangaRepositoryFactory.create(oldManga.source).getDetails(oldManga) - }.getOrDefault(oldManga) - } else { - oldManga - } - val newDetails = - if (newManga.chapters.isNullOrEmpty()) { - mangaRepositoryFactory.create(newManga.source).getDetails(newManga) - } else { - newManga - } - mangaDataRepository.storeManga(newDetails) + val oldDetails = if (oldManga.chapters.isNullOrEmpty()) { + runCatchingCancellable { + mangaRepositoryFactory.create(oldManga.source).getDetails(oldManga) + }.getOrDefault(oldManga) + } else { + oldManga + } + val newDetails = if (newManga.chapters.isNullOrEmpty()) { + mangaRepositoryFactory.create(newManga.source).getDetails(newManga) + } else { + newManga + } + mangaDataRepository.storeManga(newDetails, replaceExisting = true) database.withTransaction { // replace favorites val favoritesDao = database.getFavouritesDao() @@ -101,11 +99,11 @@ constructor( mangaId = newDetails.id, rating = prevInfo.rating, status = - prevInfo.status ?: when { - newHistory == null -> ScrobblingStatus.PLANNED - newHistory.percent == 1f -> ScrobblingStatus.COMPLETED - else -> ScrobblingStatus.READING - }, + prevInfo.status ?: when { + newHistory == null -> ScrobblingStatus.PLANNED + newHistory.percent == 1f -> ScrobblingStatus.COMPLETED + else -> ScrobblingStatus.READING + }, comment = prevInfo.comment, ) if (newHistory != null) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppShortcutManager.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppShortcutManager.kt index 6e2c4be9d..5b28e6efc 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppShortcutManager.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppShortcutManager.kt @@ -149,7 +149,7 @@ class AppShortcutManager @Inject constructor( onSuccess = { IconCompat.createWithAdaptiveBitmap(it) }, onFailure = { IconCompat.createWithResource(context, R.drawable.ic_shortcut_default) }, ) - mangaRepository.storeManga(manga) + mangaRepository.storeManga(manga, replaceExisting = true) val title = manga.title.ifEmpty { manga.altTitles.firstOrNull() }.ifNullOrEmpty { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt index e7decb17e..dedba6923 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt @@ -41,7 +41,7 @@ class MangaDataRepository @Inject constructor( suspend fun saveReaderMode(manga: Manga, mode: ReaderMode) { db.withTransaction { - storeManga(manga) + storeManga(manga, replaceExisting = false) val entity = db.getPreferencesDao().find(manga.id) ?: newEntity(manga.id) db.getPreferencesDao().upsert(entity.copy(mode = mode.id)) } @@ -49,7 +49,7 @@ class MangaDataRepository @Inject constructor( suspend fun saveColorFilter(manga: Manga, colorFilter: ReaderColorFilter?) { db.withTransaction { - storeManga(manga) + storeManga(manga, replaceExisting = false) val entity = db.getPreferencesDao().find(manga.id) ?: newEntity(manga.id) db.getPreferencesDao().upsert( entity.copy( @@ -87,10 +87,11 @@ class MangaDataRepository @Inject constructor( return map } - suspend fun setOverride(mangaId: Long, override: MangaOverride?) { + suspend fun setOverride(manga: Manga, override: MangaOverride?) { db.withTransaction { + storeManga(manga, replaceExisting = false) val dao = db.getPreferencesDao() - val entity = dao.find(mangaId) ?: newEntity(mangaId) + val entity = dao.find(manga.id) ?: newEntity(manga.id) dao.upsert( entity.copy( titleOverride = override?.title?.nullIfEmpty(), @@ -127,7 +128,10 @@ class MangaDataRepository @Inject constructor( else -> null } - suspend fun storeManga(manga: Manga) { + suspend fun storeManga(manga: Manga, replaceExisting: Boolean) { + if (!replaceExisting && db.getMangaDao().find(manga.id) != null) { + return + } db.withTransaction { // avoid storing local manga if remote one is already stored val existing = if (manga.isLocal) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt index c5a0691bd..aa4a86e8e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt @@ -537,7 +537,7 @@ class DownloadWorker @AssistedInject constructor( return } val requests = tasks.map { (manga, task) -> - mangaDataRepository.storeManga(manga) + mangaDataRepository.storeManga(manga, replaceExisting = true) OneTimeWorkRequestBuilder() .setConstraints(createConstraints(task.allowMeteredNetwork)) .addTag(TAG) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/explore/domain/RecoverMangaUseCase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/explore/domain/RecoverMangaUseCase.kt index a5228f473..c2d52b82c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/explore/domain/RecoverMangaUseCase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/explore/domain/RecoverMangaUseCase.kt @@ -24,7 +24,7 @@ class RecoverMangaUseCase @Inject constructor( repository.getDetails(it) } ?: return@runCatchingCancellable null val merged = merge(manga, newManga) - mangaDataRepository.storeManga(merged) + mangaDataRepository.storeManga(merged, replaceExisting = true) merged }.onFailure { it.printStackTraceDebug() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt index c3d1c9298..e6883a1a4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt @@ -118,7 +118,7 @@ class HistoryRepository @Inject constructor( } assert(manga.chapters != null) db.withTransaction { - mangaRepository.storeManga(manga) + mangaRepository.storeManga(manga, replaceExisting = true) val branch = manga.chapters?.findById(chapterId)?.branch db.getHistoryDao().upsert( HistoryEntity( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/index/LocalMangaIndex.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/index/LocalMangaIndex.kt index a81ca5aab..06877bc65 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/index/LocalMangaIndex.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/index/LocalMangaIndex.kt @@ -97,7 +97,7 @@ class LocalMangaIndex @Inject constructor( } private suspend fun upsert(manga: LocalManga) { - mangaDataRepository.storeManga(manga.manga) + mangaDataRepository.storeManga(manga.manga, replaceExisting = true) db.getLocalMangaIndexDao().upsert(manga.toEntity()) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/domain/CoverRestoreInterceptor.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/domain/CoverRestoreInterceptor.kt index 7ff4951e5..5418fbaf7 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/main/domain/CoverRestoreInterceptor.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/domain/CoverRestoreInterceptor.kt @@ -72,7 +72,7 @@ class CoverRestoreInterceptor @Inject constructor( val repo = repositoryFactory.create(manga.source) val fixed = repo.find(manga) ?: return false return if (fixed != manga) { - dataRepository.storeManga(fixed) + dataRepository.storeManga(fixed, replaceExisting = true) fixed.coverUrl != manga.coverUrl } else { false diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/override/OverrideConfigViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/override/OverrideConfigViewModel.kt index 30862cde2..241491fc5 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/override/OverrideConfigViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/override/OverrideConfigViewModel.kt @@ -37,7 +37,7 @@ class OverrideConfigViewModel @Inject constructor( val override = checkNotNull(data.value).second.copy( title = title, ) - dataRepository.setOverride(manga.id, override) + dataRepository.setOverride(manga, override) onSaved.call(Unit) } }