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 cc8e6fe4c1ee..5529a0a28945 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 2ff46bbd34ad..9aac282c6c39 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 72ff13a88f67..3ea307416ec2 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 45f7a27197fe..d8083c7222db 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