From e7a150bd9a66d292395d868198f120d3fcca0517 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 28 Mar 2020 12:46:57 +0200 Subject: [PATCH] Replace history with remote manga when delete local --- .../kotatsu/core/parser/LocalMangaRepository.kt | 10 ++++++++++ .../kotatsu/domain/history/HistoryRepository.kt | 11 +++++++++++ .../kotatsu/ui/details/MangaDetailsPresenter.kt | 3 ++- .../kotatsu/ui/main/list/local/LocalListPresenter.kt | 3 ++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt index b7bfddd96..8a98d8398 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt @@ -105,6 +105,16 @@ class LocalMangaRepository : MangaRepository, KoinComponent { } } + fun getRemoteManga(localManga: Manga): Manga? { + val file = safe { + Uri.parse(localManga.url).toFile() + } ?: return null + val zip = ZipFile(file) + val entry = zip.getEntry(MangaZip.INDEX_ENTRY) + val index = entry?.let(zip::readText)?.let(::MangaIndex) ?: return null + return index.getMangaInfo() + } + private fun zipUri(file: File, entryName: String) = Uri.fromParts("cbz", file.path, entryName).toString() diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt index 6bd1a280b..806707785 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt @@ -58,6 +58,17 @@ class HistoryRepository : KoinComponent { notifyHistoryChanged() } + /** + * Try to replace one manga with another one + * Useful for replacing saved manga on deleting it with remove source + */ + suspend fun deleteOrSwap(manga: Manga, alternative: Manga?) { + if (alternative == null || db.mangaDao().update(MangaEntity.from(alternative)) <= 0) { + db.historyDao().delete(manga.id) + notifyHistoryChanged() + } + } + companion object { private val listeners = HashSet() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt index bae4c74a6..7fa9f912a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt @@ -94,9 +94,10 @@ class MangaDetailsPresenter private constructor() : BasePresenter>() { presenterScope.launch { try { withContext(Dispatchers.IO) { + val original = repository.getRemoteManga(manga) repository.delete(manga) || throw IOException("Unable to delete file") safe { - HistoryRepository().delete(manga) + HistoryRepository().deleteOrSwap(manga, original) } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {