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 3c072eae6..88a3c0f3d 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -338,4 +338,6 @@ object PreferenceKeys { const val sortTagsForLibrary = "sort_tags_for_library" const val createLegacyBackup = "create_legacy_backup" + + const val dontDeleteFromCategories = "dont_delete_from_categories" } 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 728e6a46c..b2b2848b9 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -458,4 +458,6 @@ class PreferencesHelper(val context: Context) { fun sortTagsForLibrary() = flowPrefs.getStringSet(Keys.sortTagsForLibrary, mutableSetOf()) fun createLegacyBackup() = flowPrefs.getBoolean(Keys.createLegacyBackup, false) + + fun dontDeleteFromCategories() = flowPrefs.getStringSet(Keys.dontDeleteFromCategories, emptySet()) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index e6d1a9ce6..4094593e3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -47,6 +47,7 @@ import exh.metadata.metadata.base.getFlatMetadataForManga import exh.source.EnhancedHttpSource.Companion.getMainSource import exh.util.asObservable import exh.util.await +import exh.util.shouldDeleteChapters import exh.util.trimOrNull import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.withContext @@ -807,7 +808,7 @@ class MangaPresenter( launchIO { db.updateChaptersProgress(chapters).executeAsBlocking() - if (preferences.removeAfterMarkedAsRead()) { + if (preferences.removeAfterMarkedAsRead() /* SY --> */ && manga.shouldDeleteChapters(db, preferences) /* SY <-- */) { deleteChapters(chapters) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 752c800a1..14da640cb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -36,6 +36,7 @@ import exh.EXH_SOURCE_ID import exh.MERGED_SOURCE_ID import exh.md.utils.FollowStatus import exh.util.defaultReaderType +import exh.util.shouldDeleteChapters import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.singleOrNull import kotlinx.coroutines.runBlocking @@ -453,7 +454,10 @@ class ReaderPresenter( val removeAfterReadSlots = preferences.removeAfterReadSlots() val chapterToDelete = chapterList.getOrNull(currentChapterPosition - removeAfterReadSlots) // Check if deleting option is enabled and chapter exists - if (removeAfterReadSlots != -1 && chapterToDelete != null) { + // SY --> + val manga = manga + // SY <-- + if (removeAfterReadSlots != -1 && chapterToDelete != null && (manga == null || manga.shouldDeleteChapters(db, preferences)) /* SY <-- */) { enqueueDeleteReadChapters(chapterToDelete) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterSheet.kt index bd4438fd9..b0b026e3b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterSheet.kt @@ -30,6 +30,7 @@ class ReaderChapterSheet(private val activity: ReaderActivity) : BottomSheetDial private var sheetBehavior: BottomSheetBehavior<*>? = null private val binding = ReaderChaptersSheetBinding.inflate(activity.layoutInflater, null, false) + private var initialized = false var presenter: ReaderPresenter var adapter: FastAdapter? = null @@ -79,7 +80,7 @@ class ReaderChapterSheet(private val activity: ReaderActivity) : BottomSheetDial ) binding.chapterRecycler.layoutManager = LinearLayoutManager(context) - refreshList() + // refreshList() binding.webviewButton.clicks() .onEach { activity.openMangaInBrowser() } .launchIn(activity.scope) @@ -106,6 +107,10 @@ class ReaderChapterSheet(private val activity: ReaderActivity) : BottomSheetDial } override fun show() { + if (!initialized) { + refreshList() + initialized = true + } binding.pageText.text = activity.binding.pageText.text binding.pageSeekbar.max = activity.binding.pageSeekbar.max binding.pageSeekbar.progress = activity.binding.pageSeekbar.progress 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 2794433d7..0e89668b3 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 @@ -112,6 +112,34 @@ class SettingsDownloadController : SettingsController() { titleRes = R.string.pref_remove_bookmarked_chapters defaultValue = false } + // SY --> + multiSelectListPreference { + val dbCategories = db.getCategories().executeAsBlocking() + val categories = listOf(Category.createDefault()) + dbCategories + + key = Keys.dontDeleteFromCategories + titleRes = R.string.pref_dont_delete_from_categories + entries = categories.map { it.name }.toTypedArray() + entryValues = categories.map { it.id.toString() }.toTypedArray() + + preferences.dontDeleteFromCategories().asFlow() + .onEach { mutableSet -> + val selectedCategories = mutableSet + .mapNotNull { id -> categories.find { it.id == id.toInt() } } + .sortedBy { it.order } + + summary = context.getString( + R.string.pref_dont_delete_from_categories_summary, + if (selectedCategories.isEmpty()) { + context.getString(R.string.all) + } else { + selectedCategories.joinToString { it.name } + } + ) + } + .launchIn(scope) + } + // SY <-- } val dbCategories = db.getCategories().executeAsBlocking() diff --git a/app/src/main/java/exh/util/MangaExtensions.kt b/app/src/main/java/exh/util/MangaExtensions.kt new file mode 100644 index 000000000..44845ea69 --- /dev/null +++ b/app/src/main/java/exh/util/MangaExtensions.kt @@ -0,0 +1,20 @@ +package exh.util + +import eu.kanade.tachiyomi.data.database.DatabaseHelper +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.preference.PreferencesHelper + +fun Manga.shouldDeleteChapters(db: DatabaseHelper, prefs: PreferencesHelper): Boolean { + if (!favorite) return true + + val categoriesToNotDeleteFrom = prefs.dontDeleteFromCategories().get().map(String::toInt) + if (categoriesToNotDeleteFrom.isEmpty()) return true + + // Get all categories, else default category (0) + val categoriesForManga = + db.getCategoriesForManga(this).executeAsBlocking() + .mapNotNull { it.id } + .takeUnless { it.isEmpty() } ?: listOf(0) + + return categoriesForManga.any { it !in categoriesToNotDeleteFrom } +} diff --git a/app/src/main/res/values/strings_sy.xml b/app/src/main/res/values/strings_sy.xml index ed41e48ff..b38034c9d 100644 --- a/app/src/main/res/values/strings_sy.xml +++ b/app/src/main/res/values/strings_sy.xml @@ -189,6 +189,8 @@ Save Chapters as CBZ CBZ Compression level + Categories to exclude from deletion + If a manga is only in these categories, chapters will not be deleted when marking as read and when finishing a chapter.\nCategories:\n%1$s Biometric lock times