diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index 60190eb126..b46ba1f262 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -105,6 +105,11 @@ class LibraryUpdateService( // List containing new updates private val newUpdates = mutableMapOf>() + // For updates delete removed chapters if not preference is set as well + private val deleteRemoved by lazy { + preferences.deleteRemovedChapters().get() != 1 + } + /** * Cached progress notification to avoid creating a lot. */ @@ -415,6 +420,14 @@ class LibraryUpdateService( newUpdates[manga] = newChapters.first.sortedBy { it.chapter_number }.toTypedArray() } + if (deleteRemoved && newChapters.second.isNotEmpty()) { + val removedChapters = newChapters.second.filter { + downloadManager.isChapterDownloaded(it, manga) + } + if (removedChapters.isNotEmpty()) { + downloadManager.deleteChapters(removedChapters, manga, source) + } + } if (newChapters.first.size + newChapters.second.size > 0) listener?.onUpdateManga( manga ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index c510b9c110..c4714e2ab8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -79,6 +79,8 @@ object PreferenceKeys { const val removeAfterReadSlots = "remove_after_read_slots" + const val deleteRemovedChapters = "delete_removed_chapters" + const val removeAfterMarkedAsRead = "pref_remove_after_marked_as_read_key" const val libraryUpdateInterval = "pref_library_update_interval_key" 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 09e32a31c6..19a47e1b5b 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 @@ -261,7 +261,9 @@ class PreferencesHelper(val context: Context) { fun alwaysShowChapterTransition() = rxPrefs.getBoolean(Keys.alwaysShowChapterTransition, true) - // Tutorial preference + fun deleteRemovedChapters() = flowPrefs.getInt(Keys.deleteRemovedChapters, 0) + + // Tutorial preferences fun shownFilterTutorial() = flowPrefs.getBoolean("shown_filter_tutorial", false) fun shownChapterSwipeTutorial() = flowPrefs.getBoolean("shown_swipe_tutorial", false) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt index b1e7959f67..abe99d2cb3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt @@ -45,6 +45,8 @@ import androidx.transition.ChangeImageTransform import androidx.transition.TransitionManager import androidx.transition.TransitionSet import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.checkbox.checkBoxPrompt +import com.afollestad.materialdialogs.checkbox.isCheckPromptChecked import com.afollestad.materialdialogs.list.listItems import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType @@ -575,6 +577,31 @@ class MangaDetailsController : BaseController, view?.snack(message) } + fun showChaptersRemovedPopup(deletedChapters: List) { + val context = activity ?: return + val deleteRemovedPref = presenter.preferences.deleteRemovedChapters() + when (deleteRemovedPref.get()) { + 2 -> { + presenter.deleteChapters(deletedChapters, false) + return + } + 1 -> return + else -> { + MaterialDialog(context).title(R.string.chapters_removed).message( + text = context.resources.getQuantityString(R.plurals.deleted_chapters, + deletedChapters.size, + deletedChapters.size, + deletedChapters.joinToString("\n") { "${it.name}" }) + ).positiveButton(R.string.delete) { + presenter.deleteChapters(deletedChapters, false) + if (it.isCheckPromptChecked()) deleteRemovedPref.set(2) + }.negativeButton(R.string.keep) { + if (it.isCheckPromptChecked()) deleteRemovedPref.set(1) + }.cancelOnTouchOutside(false).checkBoxPrompt(R.string.remember_this_choice) {}.show() + } + } + } + fun setRefresh(enabled: Boolean) { swipe_refresh.isRefreshing = enabled } 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 9d11131868..8820b2d55e 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 @@ -423,6 +423,19 @@ class MangaDetailsPresenter( .map { it.toModel() }) } } + if (newChapters.second.isNotEmpty()) { + val removedChaptersId = newChapters.second.map { it.id } + val removedChapters = this@MangaDetailsPresenter.chapters.filter { + it.id in removedChaptersId && it.isDownloaded + } + if (removedChapters.isNotEmpty()) { + withContext(Dispatchers.Main) { + controller.showChaptersRemovedPopup( + removedChapters + ) + } + } + } withContext(Dispatchers.IO) { updateChapters() } } isLoading = false 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 f282d2f15a..995352527e 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 @@ -102,6 +102,20 @@ class SettingsDownloadController : SettingsController() { selectedCategories.joinToString { it.name } } } + preferenceCategory { + intListPreference(activity) { + key = Keys.deleteRemovedChapters + titleRes = R.string.delete_removed_chapters + customSummary = activity?.getString(R.string.delete_downloaded_if_removed_online) + entriesRes = arrayOf( + R.string.ask_on_chapters_page, + R.string.always_keep, + R.string.always_delete + ) + entryRange = 0..2 + defaultValue = 0 + } + } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt index 4776dd7fff..85394c5d15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt @@ -149,7 +149,7 @@ fun syncChaptersWithSource( db.updateLastUpdated(manga).executeAsBlocking() } - return Pair(toAdd.subtract(readded).toList(), toDelete.subtract(readded).toList()) + return Pair(toAdd.subtract(readded).toList(), toDelete - readded) } // checks if the chapter in db needs updated diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 26b6b3935d..95938eae2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,6 +47,7 @@ Marked as read Marked as unread Removed bookmark + Chapters removed. Remove %1$d downloaded chapter? Remove %1$d downloaded chapters? @@ -368,6 +369,13 @@ Reset cover Failed to update cover Manga must be in your library to edit + Remember this choice + + A chapter has been removed from the source:\n%2$s\nDelete + its download? + %1$s chapters have been removed from the source:\n%2$s\n\nDelete + their downloads? + Tracking @@ -575,6 +583,12 @@ Fifth to last chapter Download new chapters Categories to include in download + Delete removed chapters + Delete downloaded chapters if the source + has removed the chapter online + Delete during global updates, ask on chapters page + Always keep + Always delete Manual @@ -633,6 +647,7 @@ Hide Ignore Install + Keep Left Less Loading…