Add option to keep read manga in Clear Database (#1382)

This commit is contained in:
nzoba 2022-08-22 20:05:53 +02:00 committed by GitHub
parent 0f54058aee
commit 4192818ba0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 6 deletions

View file

@ -167,6 +167,22 @@ interface MangaQueries : DbProvider {
) )
.prepare() .prepare()
fun deleteMangasNotInLibraryAndNotReadBySourceIds(sourceIds: List<Long>) = 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() fun deleteMangas() = db.delete()
.byQuery( .byQuery(
DeleteQuery.builder() DeleteQuery.builder()

View file

@ -27,6 +27,7 @@ import eu.kanade.tachiyomi.ui.base.controller.BaseCoroutineController
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.system.materialAlertDialog import eu.kanade.tachiyomi.util.system.materialAlertDialog
import eu.kanade.tachiyomi.util.system.rootWindowInsetsCompat 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.activityBinding
import eu.kanade.tachiyomi.util.view.fullAppBarHeight import eu.kanade.tachiyomi.util.view.fullAppBarHeight
import eu.kanade.tachiyomi.util.view.scrollViewWith import eu.kanade.tachiyomi.util.view.scrollViewWith
@ -229,10 +230,15 @@ class ClearDatabaseController :
class ClearDatabaseSourcesDialog : DialogController() { class ClearDatabaseSourcesDialog : DialogController() {
override fun onCreateDialog(savedViewState: Bundle?): Dialog { override fun onCreateDialog(savedViewState: Bundle?): Dialog {
val item = arrayOf(activity!!.getString(R.string.clear_db_exclude_read))
val selected = booleanArrayOf(true)
return activity!!.materialAlertDialog() 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) { _, _ -> .setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? ClearDatabaseController)?.clearDatabaseForSelectedSources() (targetController as? ClearDatabaseController)?.clearDatabaseForSelectedSources(selected.last())
} }
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.create() .create()
@ -240,12 +246,12 @@ class ClearDatabaseController :
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun clearDatabaseForSelectedSources() { private fun clearDatabaseForSelectedSources(keepReadManga: Boolean) {
val adapter = adapter ?: return val adapter = adapter ?: return
val selectedSourceIds = adapter.selectedPositions.mapNotNull { position -> val selectedSourceIds = adapter.selectedPositions.mapNotNull { position ->
adapter.getItem(position)?.source?.id adapter.getItem(position)?.source?.id
} }
presenter.clearDatabaseForSourceIds(selectedSourceIds) presenter.clearDatabaseForSourceIds(selectedSourceIds, keepReadManga)
binding.fab.isVisible = false binding.fab.isVisible = false
adapter.clearSelection() adapter.clearSelection()
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()

View file

@ -29,8 +29,12 @@ class ClearDatabasePresenter : BaseCoroutinePresenter<ClearDatabaseController>()
getDatabaseSources() getDatabaseSources()
} }
fun clearDatabaseForSourceIds(sources: List<Long>) { fun clearDatabaseForSourceIds(sources: List<Long>, keepReadManga: Boolean) {
db.deleteMangasNotInLibraryBySourceIds(sources).executeAsBlocking() if (keepReadManga) {
db.deleteMangasNotInLibraryAndNotReadBySourceIds(sources).executeAsBlocking()
} else {
db.deleteMangasNotInLibraryBySourceIds(sources).executeAsBlocking()
}
db.deleteHistoryNoLastRead().executeAsBlocking() db.deleteHistoryNoLastRead().executeAsBlocking()
getDatabaseSources() getDatabaseSources()
} }

View file

@ -831,6 +831,7 @@
<string name="clear_database_source_item_count">%1$d non-library manga in database</string> <string name="clear_database_source_item_count">%1$d non-library manga in database</string>
<string name="clear_database_summary">Delete manga and chapters that are not in your library</string> <string name="clear_database_summary">Delete manga and chapters that are not in your library</string>
<string name="clear_database_confirmation">Are you sure? Read chapters and progress of non-library manga will be lost</string> <string name="clear_database_confirmation">Are you sure? Read chapters and progress of non-library manga will be lost</string>
<string name="clear_db_exclude_read">Keep manga with read chapters</string>
<string name="clear_database_completed">Entries deleted</string> <string name="clear_database_completed">Entries deleted</string>
<string name="database_clean">Database clean</string> <string name="database_clean">Database clean</string>
<string name="refresh_library_metadata">Refresh library metadata</string> <string name="refresh_library_metadata">Refresh library metadata</string>