From 15a16048aed10c387eeeeab325ec21ba3aebbf22 Mon Sep 17 00:00:00 2001 From: Jays2Kings Date: Tue, 14 Feb 2023 13:55:33 -0500 Subject: [PATCH] Allow deleting bookmarked chapters option Some minor tweaks to this: * tapping delete download on manga details/recents WILL delete the chapter, regardless of bookmark status * Tapping Remove all downloads in manga details will remove all downloads still, since there's an option to remove all but bookmarks anyway (library like upstream still deletes all) closes #1470 Co-Authored-By: arkon <4098258+arkon@users.noreply.github.com> --- .../data/download/DownloadManager.kt | 29 ++++++++++++++----- .../data/preference/PreferencesHelper.kt | 2 ++ .../ui/manga/MangaDetailsPresenter.kt | 4 ++- .../tachiyomi/ui/recents/RecentsPresenter.kt | 3 +- .../ui/setting/SettingsDownloadController.kt | 4 +++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt index e2d9ce2e66..9f4d6076c9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -8,6 +8,7 @@ import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.DownloadQueue +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.Page @@ -31,6 +32,8 @@ class DownloadManager(val context: Context) { */ private val sourceManager by injectLazy() + private val preferences by injectLazy() + /** * Downloads provider, used to retrieve the folders where the chapters are or should be stored. */ @@ -249,16 +252,17 @@ class DownloadManager(val context: Context) { * @param manga the manga of the chapters. * @param source the source of the chapters. */ - fun deleteChapters(chapters: List, manga: Manga, source: Source) { + fun deleteChapters(chapters: List, manga: Manga, source: Source, force: Boolean = false) { + val filteredChapters = if (force) chapters else getChaptersToDelete(chapters, manga) GlobalScope.launch(Dispatchers.IO) { val wasPaused = isPaused() - if (chapters.isEmpty()) { + if (filteredChapters.isEmpty()) { DownloadService.stop(context) downloader.queue.clear() return@launch } downloader.pause() - downloader.queue.remove(chapters) + downloader.queue.remove(filteredChapters) if (!wasPaused && downloader.queue.isNotEmpty()) { downloader.start() DownloadService.callListeners(true) @@ -268,15 +272,15 @@ class DownloadManager(val context: Context) { DownloadService.callListeners(false) downloader.stop() } - queue.remove(chapters) + queue.remove(filteredChapters) val chapterDirs = - provider.findChapterDirs(chapters, manga, source) + provider.findTempChapterDirs( - chapters, + provider.findChapterDirs(filteredChapters, manga, source) + provider.findTempChapterDirs( + filteredChapters, manga, source, ) chapterDirs.forEach { it.delete() } - cache.removeChapters(chapters, manga) + cache.removeChapters(filteredChapters, manga) if (cache.getDownloadCount(manga, true) == 0) { // Delete manga directory if empty chapterDirs.firstOrNull()?.parentFile?.delete() } @@ -356,7 +360,7 @@ class DownloadManager(val context: Context) { * @param manga the manga of the chapters. */ fun enqueueDeleteChapters(chapters: List, manga: Manga) { - pendingDeleter.addChapters(chapters, manga) + pendingDeleter.addChapters(getChaptersToDelete(chapters, manga), manga) } /** @@ -398,4 +402,13 @@ class DownloadManager(val context: Context) { fun addListener(listener: DownloadQueue.DownloadListener) = queue.addListener(listener) fun removeListener(listener: DownloadQueue.DownloadListener) = queue.removeListener(listener) + + private fun getChaptersToDelete(chapters: List, manga: Manga): List { + // Retrieve the categories that are set to exclude from being deleted on read + return if (!preferences.removeBookmarkedChapters().get()) { + chapters.filterNot { it.bookmark } + } else { + chapters + } + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index fbaa95d056..6dbf8dc6ec 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -393,6 +393,8 @@ class PreferencesHelper(val context: Context) { fun deleteRemovedChapters() = flowPrefs.getInt(Keys.deleteRemovedChapters, 0) + fun removeBookmarkedChapters() = flowPrefs.getBoolean("pref_remove_bookmarked", false) + fun showAllCategories() = flowPrefs.getBoolean("show_all_categories", true) fun showAllCategoriesWhenSearchingSingleCategory() = flowPrefs.getBoolean("show_all_categories_when_searching_single_category", false) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt index add06652c1..abb69a063c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt @@ -280,8 +280,9 @@ class MangaDetailsPresenter( * @param chapter the chapter to delete. */ fun deleteChapter(chapter: ChapterItem) { - downloadManager.deleteChapters(listOf(chapter), manga, source) + downloadManager.deleteChapters(listOf(chapter), manga, source, true) this.chapters.find { it.id == chapter.id }?.apply { + if (chapter.chapter.bookmark && !preferences.removeBookmarkedChapters().get()) return@apply status = Download.State.QUEUE download = null } @@ -303,6 +304,7 @@ class MangaDetailsPresenter( } chapters.forEach { chapter -> this.chapters.find { it.id == chapter.id }?.apply { + if (chapter.chapter.bookmark && !preferences.removeBookmarkedChapters().get() && !isEverything) return@apply status = Download.State.QUEUE download = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt index 6a70e026d7..c48a87e633 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt @@ -425,11 +425,12 @@ class RecentsPresenter( fun deleteChapter(chapter: Chapter, manga: Manga, update: Boolean = true) { val source = Injekt.get().getOrStub(manga.source) launchIO { - downloadManager.deleteChapters(listOf(chapter), manga, source) + downloadManager.deleteChapters(listOf(chapter), manga, source, true) } if (update) { val item = recentItems.find { it.chapter.id == chapter.id } ?: return item.apply { + if (chapter.bookmark && !preferences.removeBookmarkedChapters().get()) return@apply status = Download.State.NOT_DOWNLOADED download = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt index 10d3f9ac26..7736fecbc0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt @@ -79,6 +79,10 @@ class SettingsDownloadController : SettingsController() { entryRange = -1..4 defaultValue = -1 } + switchPreference { + bindTo(preferences.removeBookmarkedChapters()) + titleRes = R.string.allow_deleting_bookmarked_chapters + } } val dbCategories = db.getCategories().executeAsBlocking() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d3bdabd005..21229cc97f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -955,6 +955,7 @@ Download location Only download over Wi-Fi Remove when marked as read + Allow deleting bookmarked chapters Remove after read Custom location Last read chapter