Detect identical mangas when long pressing to add to library (#7095)

* Detect identical mangas when long pressing to add to library

* Use extracted duplicate manga dialog to avoid duplication

* Partially revert previous commit

* Review changes

* Review changes part 2

(cherry picked from commit f1afeac0bc)
This commit is contained in:
CVIUS 2022-05-12 20:58:37 +08:00 committed by arkon
parent f461c71625
commit 431c04e54f
5 changed files with 98 additions and 45 deletions

View file

@ -253,7 +253,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
else -> "$url/multisrc/overrides/$pkgFactory/" + (pkgName.split(".").lastOrNull() ?: "") + path else -> "$url/multisrc/overrides/$pkgFactory/" + (pkgName.split(".").lastOrNull() ?: "") + path
} }
} else { } else {
url + "/src/" + pkgName.replace(".", "/") + path url + "/src/" + pkgName.replace(".", "/") + path
} }
} }

View file

@ -37,6 +37,7 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.manga.AddDuplicateMangaDialog
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.ui.more.MoreController import eu.kanade.tachiyomi.ui.more.MoreController
import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.ui.webview.WebViewActivity
@ -588,6 +589,7 @@ open class BrowseSourceController(bundle: Bundle) :
override fun onItemLongClick(position: Int) { override fun onItemLongClick(position: Int) {
val activity = activity ?: return val activity = activity ?: return
val manga = (adapter?.getItem(position) as? SourceItem?)?.manga ?: return val manga = (adapter?.getItem(position) as? SourceItem?)?.manga ?: return
val duplicateManga = presenter.getDuplicateLibraryManga(manga)
if (manga.favorite) { if (manga.favorite) {
MaterialAlertDialogBuilder(activity) MaterialAlertDialogBuilder(activity)
@ -603,43 +605,53 @@ open class BrowseSourceController(bundle: Bundle) :
} }
.show() .show()
} else { } else {
val categories = presenter.getCategories() if (duplicateManga != null) {
val defaultCategoryId = preferences.defaultCategory() AddDuplicateMangaDialog(this, duplicateManga) { addToLibrary(manga, position) }
val defaultCategory = categories.find { it.id == defaultCategoryId } .showDialog(router)
} else {
addToLibrary(manga, position)
}
}
}
when { private fun addToLibrary(newManga: Manga, position: Int) {
// Default category set val activity = activity ?: return
defaultCategory != null -> { val categories = presenter.getCategories()
presenter.moveMangaToCategory(manga, defaultCategory) val defaultCategoryId = preferences.defaultCategory()
val defaultCategory = categories.find { it.id == defaultCategoryId }
presenter.changeMangaFavorite(manga) when {
adapter?.notifyItemChanged(position) // Default category set
activity.toast(activity.getString(R.string.manga_added_library)) defaultCategory != null -> {
} presenter.moveMangaToCategory(newManga, defaultCategory)
// Automatic 'Default' or no categories presenter.changeMangaFavorite(newManga)
defaultCategoryId == 0 || categories.isEmpty() -> { adapter?.notifyItemChanged(position)
presenter.moveMangaToCategory(manga, null) activity.toast(activity.getString(R.string.manga_added_library))
}
presenter.changeMangaFavorite(manga) // Automatic 'Default' or no categories
adapter?.notifyItemChanged(position) defaultCategoryId == 0 || categories.isEmpty() -> {
activity.toast(activity.getString(R.string.manga_added_library)) presenter.moveMangaToCategory(newManga, null)
}
// Choose a category presenter.changeMangaFavorite(newManga)
else -> { adapter?.notifyItemChanged(position)
val ids = presenter.getMangaCategoryIds(manga) activity.toast(activity.getString(R.string.manga_added_library))
val preselected = categories.map { }
if (it.id in ids) {
QuadStateTextView.State.CHECKED.ordinal
} else {
QuadStateTextView.State.UNCHECKED.ordinal
}
}.toTypedArray()
ChangeMangaCategoriesDialog(this, listOf(manga), categories, preselected) // Choose a category
.showDialog(router) else -> {
} val ids = presenter.getMangaCategoryIds(newManga)
val preselected = categories.map {
if (it.id in ids) {
QuadStateTextView.State.CHECKED.ordinal
} else {
QuadStateTextView.State.UNCHECKED.ordinal
}
}.toTypedArray()
ChangeMangaCategoriesDialog(this, listOf(newManga), categories, preselected)
.showDialog(router)
} }
} }
} }

View file

@ -351,6 +351,10 @@ open class BrowseSourcePresenter(
return db.getCategories().executeAsBlocking() return db.getCategories().executeAsBlocking()
} }
fun getDuplicateLibraryManga(manga: Manga): Manga? {
return db.getDuplicateLibraryManga(manga).executeAsBlocking()
}
/** /**
* Gets the category id's the manga is in, if the manga is not in a category, returns the default id. * Gets the category id's the manga is in, if the manga is not in a category, returns the default id.
* *

View file

@ -0,0 +1,48 @@
package eu.kanade.tachiyomi.ui.manga
import android.app.Dialog
import android.os.Bundle
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import uy.kohesive.injekt.injectLazy
class AddDuplicateMangaDialog(bundle: Bundle? = null) : DialogController(bundle) {
private val sourceManager: SourceManager by injectLazy()
private lateinit var libraryManga: Manga
private lateinit var onAddToLibrary: () -> Unit
constructor(
target: Controller,
libraryManga: Manga,
onAddToLibrary: () -> Unit,
) : this() {
targetController = target
this.libraryManga = libraryManga
this.onAddToLibrary = onAddToLibrary
}
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
val source = sourceManager.getOrStub(libraryManga.source)
return MaterialAlertDialogBuilder(activity!!)
.setMessage(activity?.getString(R.string.confirm_manga_add_duplicate, source.name))
.setPositiveButton(activity?.getString(R.string.action_add)) { _, _ ->
onAddToLibrary()
}
.setNegativeButton(android.R.string.cancel, null)
.setNeutralButton(activity?.getString(R.string.action_show_manga)) { _, _ ->
dismissDialog()
router.pushController(MangaController(libraryManga.id!!).withFadeTransaction())
}
.setCancelable(true)
.create()
}
}

View file

@ -29,7 +29,6 @@ import coil.request.ImageRequest
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
@ -542,18 +541,8 @@ class MangaController :
private fun showAddDuplicateDialog(newManga: Manga, libraryManga: Manga) { private fun showAddDuplicateDialog(newManga: Manga, libraryManga: Manga) {
activity?.let { activity?.let {
val source = sourceManager.getOrStub(libraryManga.source) AddDuplicateMangaDialog(this, libraryManga) { addToLibrary(newManga) }
MaterialAlertDialogBuilder(it).apply { .showDialog(router)
setMessage(activity?.getString(R.string.confirm_manga_add_duplicate, source.name))
setPositiveButton(activity?.getString(R.string.action_add)) { _, _ ->
addToLibrary(newManga)
}
setNegativeButton(activity?.getString(R.string.action_cancel)) { _, _ -> }
setNeutralButton(activity?.getString(R.string.action_show_manga)) { _, _ ->
router.pushController(MangaController(libraryManga).withFadeTransaction())
}
setCancelable(true)
}.create().show()
} }
} }