From 4192818ba0db63e1b8d73e2b717d02c156bb33dd Mon Sep 17 00:00:00 2001 From: nzoba <55888232+nzoba@users.noreply.github.com> Date: Mon, 22 Aug 2022 20:05:53 +0200 Subject: [PATCH] Add option to keep read manga in Clear Database (#1382) --- .../data/database/queries/MangaQueries.kt | 16 ++++++++++++++++ .../setting/database/ClearDatabaseController.kt | 14 ++++++++++---- .../setting/database/ClearDatabasePresenter.kt | 8 ++++++-- app/src/main/res/values/strings.xml | 1 + 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt index cc8e6fe4c1..5529a0a289 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt @@ -167,6 +167,22 @@ interface MangaQueries : DbProvider { ) .prepare() + fun deleteMangasNotInLibraryAndNotReadBySourceIds(sourceIds: List) = db.delete() + .byQuery( + DeleteQuery.builder() + .table(MangaTable.TABLE) + .where( + """ + ${MangaTable.COL_FAVORITE} = ? AND ${MangaTable.COL_SOURCE} IN (${Queries.placeholders(sourceIds.size)}) AND ${MangaTable.COL_ID} NOT IN ( + SELECT ${ChapterTable.COL_MANGA_ID} FROM ${ChapterTable.TABLE} WHERE ${ChapterTable.COL_READ} = 1 OR ${ChapterTable.COL_LAST_PAGE_READ} != 0 + ) + """.trimIndent(), + ) + .whereArgs(0, *sourceIds.toTypedArray()) + .build(), + ) + .prepare() + fun deleteMangas() = db.delete() .byQuery( DeleteQuery.builder() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabaseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabaseController.kt index 2ff46bbd34..9aac282c6c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabaseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabaseController.kt @@ -27,6 +27,7 @@ import eu.kanade.tachiyomi.ui.base.controller.BaseCoroutineController import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.system.materialAlertDialog import eu.kanade.tachiyomi.util.system.rootWindowInsetsCompat +import eu.kanade.tachiyomi.util.system.setCustomTitleAndMessage import eu.kanade.tachiyomi.util.view.activityBinding import eu.kanade.tachiyomi.util.view.fullAppBarHeight import eu.kanade.tachiyomi.util.view.scrollViewWith @@ -229,10 +230,15 @@ class ClearDatabaseController : class ClearDatabaseSourcesDialog : DialogController() { override fun onCreateDialog(savedViewState: Bundle?): Dialog { + val item = arrayOf(activity!!.getString(R.string.clear_db_exclude_read)) + val selected = booleanArrayOf(true) return activity!!.materialAlertDialog() - .setMessage(R.string.clear_database_confirmation) + .setCustomTitleAndMessage(0, activity!!.getString(R.string.clear_database_confirmation)) + .setMultiChoiceItems(item, selected) { _, which, checked -> + selected[which] = checked + } .setPositiveButton(android.R.string.ok) { _, _ -> - (targetController as? ClearDatabaseController)?.clearDatabaseForSelectedSources() + (targetController as? ClearDatabaseController)?.clearDatabaseForSelectedSources(selected.last()) } .setNegativeButton(android.R.string.cancel, null) .create() @@ -240,12 +246,12 @@ class ClearDatabaseController : } @SuppressLint("NotifyDataSetChanged") - private fun clearDatabaseForSelectedSources() { + private fun clearDatabaseForSelectedSources(keepReadManga: Boolean) { val adapter = adapter ?: return val selectedSourceIds = adapter.selectedPositions.mapNotNull { position -> adapter.getItem(position)?.source?.id } - presenter.clearDatabaseForSourceIds(selectedSourceIds) + presenter.clearDatabaseForSourceIds(selectedSourceIds, keepReadManga) binding.fab.isVisible = false adapter.clearSelection() adapter.notifyDataSetChanged() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabasePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabasePresenter.kt index 72ff13a88f..3ea307416e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabasePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabasePresenter.kt @@ -29,8 +29,12 @@ class ClearDatabasePresenter : BaseCoroutinePresenter() getDatabaseSources() } - fun clearDatabaseForSourceIds(sources: List) { - db.deleteMangasNotInLibraryBySourceIds(sources).executeAsBlocking() + fun clearDatabaseForSourceIds(sources: List, keepReadManga: Boolean) { + if (keepReadManga) { + db.deleteMangasNotInLibraryAndNotReadBySourceIds(sources).executeAsBlocking() + } else { + db.deleteMangasNotInLibraryBySourceIds(sources).executeAsBlocking() + } db.deleteHistoryNoLastRead().executeAsBlocking() getDatabaseSources() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 45f7a27197..d8083c7222 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -831,6 +831,7 @@ %1$d non-library manga in database Delete manga and chapters that are not in your library Are you sure? Read chapters and progress of non-library manga will be lost + Keep manga with read chapters Entries deleted Database clean Refresh library metadata