Option to delete chapters automatically if the source has removed them

For global updates this is on by default, manga details asks first
This commit is contained in:
Jay 2020-04-28 22:33:03 -04:00
parent e1f26d5497
commit 79745e19d2
8 changed files with 88 additions and 2 deletions

View File

@ -105,6 +105,11 @@ class LibraryUpdateService(
// List containing new updates
private val newUpdates = mutableMapOf<LibraryManga, Array<Chapter>>()
// 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
)

View File

@ -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"

View File

@ -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)

View File

@ -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<ChapterItem>) {
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
}

View File

@ -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

View File

@ -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
}
}
}
}

View File

@ -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

View File

@ -47,6 +47,7 @@
<string name="marked_as_read">Marked as read</string>
<string name="marked_as_unread">Marked as unread</string>
<string name="removed_bookmark">Removed bookmark</string>
<string name="chapters_removed">Chapters removed.</string>
<plurals name="remove_n_chapters">
<item quantity="one">Remove %1$d downloaded chapter?</item>
<item quantity="other">Remove %1$d downloaded chapters?</item>
@ -368,6 +369,13 @@
<string name="reset_cover">Reset cover</string>
<string name="failed_to_update_cover">Failed to update cover</string>
<string name="must_be_in_library_to_edit">Manga must be in your library to edit</string>
<string name="remember_this_choice">Remember this choice</string>
<plurals name="deleted_chapters">
<item quantity="one">A chapter has been removed from the source:\n%2$s\nDelete
its download?</item>
<item quantity="other">%1$s chapters have been removed from the source:\n%2$s\n\nDelete
their downloads?</item>
</plurals>
<!-- Tracking -->
<string name="tracking">Tracking</string>
@ -575,6 +583,12 @@
<string name="fifth_to_last">Fifth to last chapter</string>
<string name="download_new_chapters">Download new chapters</string>
<string name="categories_to_include_in_download">Categories to include in download</string>
<string name="delete_removed_chapters">Delete removed chapters</string>
<string name="delete_downloaded_if_removed_online">Delete downloaded chapters if the source
has removed the chapter online</string>
<string name="ask_on_chapters_page">Delete during global updates, ask on chapters page</string>
<string name="always_keep">Always keep</string>
<string name="always_delete">Always delete</string>
<!-- Time -->
<string name="manual">Manual</string>
@ -633,6 +647,7 @@
<string name="hide">Hide</string>
<string name="ignore">Ignore</string>
<string name="install">Install</string>
<string name="keep">Keep</string>
<string name="left">Left</string>
<string name="less">Less</string>
<string name="loading">Loading…</string>