From f1afeac0bcd3904c323e24d67dd945c85c666f92 Mon Sep 17 00:00:00 2001
From: CVIUS <84634607+CVIUS@users.noreply.github.com>
Date: Thu, 12 May 2022 20:58:37 +0800
Subject: [PATCH] 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
---
 .../source/browse/BrowseSourceController.kt   | 74 +++++++++++--------
 .../source/browse/BrowseSourcePresenter.kt    |  4 +
 2 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
index 00ac8da409..cac78a0a44 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
@@ -38,6 +38,7 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
 import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
 import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
 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.more.MoreController
 import eu.kanade.tachiyomi.ui.webview.WebViewActivity
@@ -591,6 +592,7 @@ open class BrowseSourceController(bundle: Bundle) :
     override fun onItemLongClick(position: Int) {
         val activity = activity ?: return
         val manga = (adapter?.getItem(position) as? SourceItem?)?.manga ?: return
+        val duplicateManga = presenter.getDuplicateLibraryManga(manga)
 
         if (manga.favorite) {
             MaterialAlertDialogBuilder(activity)
@@ -606,43 +608,53 @@ open class BrowseSourceController(bundle: Bundle) :
                 }
                 .show()
         } else {
-            val categories = presenter.getCategories()
-            val defaultCategoryId = preferences.defaultCategory()
-            val defaultCategory = categories.find { it.id == defaultCategoryId }
+            if (duplicateManga != null) {
+                AddDuplicateMangaDialog(this, duplicateManga) { addToLibrary(manga, position) }
+                    .showDialog(router)
+            } else {
+                addToLibrary(manga, position)
+            }
+        }
+    }
 
-            when {
-                // Default category set
-                defaultCategory != null -> {
-                    presenter.moveMangaToCategory(manga, defaultCategory)
+    private fun addToLibrary(newManga: Manga, position: Int) {
+        val activity = activity ?: return
+        val categories = presenter.getCategories()
+        val defaultCategoryId = preferences.defaultCategory()
+        val defaultCategory = categories.find { it.id == defaultCategoryId }
 
-                    presenter.changeMangaFavorite(manga)
-                    adapter?.notifyItemChanged(position)
-                    activity.toast(activity.getString(R.string.manga_added_library))
-                }
+        when {
+            // Default category set
+            defaultCategory != null -> {
+                presenter.moveMangaToCategory(newManga, defaultCategory)
 
-                // Automatic 'Default' or no categories
-                defaultCategoryId == 0 || categories.isEmpty() -> {
-                    presenter.moveMangaToCategory(manga, null)
+                presenter.changeMangaFavorite(newManga)
+                adapter?.notifyItemChanged(position)
+                activity.toast(activity.getString(R.string.manga_added_library))
+            }
 
-                    presenter.changeMangaFavorite(manga)
-                    adapter?.notifyItemChanged(position)
-                    activity.toast(activity.getString(R.string.manga_added_library))
-                }
+            // Automatic 'Default' or no categories
+            defaultCategoryId == 0 || categories.isEmpty() -> {
+                presenter.moveMangaToCategory(newManga, null)
 
-                // Choose a category
-                else -> {
-                    val ids = presenter.getMangaCategoryIds(manga)
-                    val preselected = categories.map {
-                        if (it.id in ids) {
-                            QuadStateTextView.State.CHECKED.ordinal
-                        } else {
-                            QuadStateTextView.State.UNCHECKED.ordinal
-                        }
-                    }.toTypedArray()
+                presenter.changeMangaFavorite(newManga)
+                adapter?.notifyItemChanged(position)
+                activity.toast(activity.getString(R.string.manga_added_library))
+            }
 
-                    ChangeMangaCategoriesDialog(this, listOf(manga), categories, preselected)
-                        .showDialog(router)
-                }
+            // Choose a category
+            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)
             }
         }
     }
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
index 1bae71a314..afcb0c60ef 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
@@ -351,6 +351,10 @@ open class BrowseSourcePresenter(
         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.
      *