From 41607ab259adfbf6606ff9e4b8d78ac1e4d7ffe4 Mon Sep 17 00:00:00 2001 From: Clarence Castillo Date: Sat, 23 Jan 2021 06:35:51 +0800 Subject: [PATCH] Fix multi-select phantom anchor bug in manga chapters and library (#4201) * Fix phantom anchor bug in manga chapters list when multi-selecting * Fix phantom bug when long pressing selected items not at top of stack * Fix phantom anchor bug in library page (cherry picked from commit 496a476c13396f3063388e0d7e8f5ab2c3663858) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt --- .../ui/library/LibraryCategoryView.kt | 25 +++++++++++++++---- .../tachiyomi/ui/manga/MangaController.kt | 19 +++++++++++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt index ed76edf85..f7cfaebbf 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt @@ -35,6 +35,7 @@ import reactivecircus.flowbinding.swiperefreshlayout.refreshes import rx.android.schedulers.AndroidSchedulers import rx.subscriptions.CompositeSubscription import uy.kohesive.injekt.injectLazy +import java.util.ArrayDeque import java.util.concurrent.TimeUnit /** @@ -81,7 +82,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att */ private var subscriptions = CompositeSubscription() - private var lastClickPosition = -1 + private var lastClickPositionStack = ArrayDeque(listOf(-1)) // EXH --> private var initialLoadHandle: LoadingHandle? = null @@ -294,7 +295,11 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att } is LibrarySelectionEvent.Unselected -> { findAndToggleSelection(event.manga) - if (adapter.indexOf(event.manga) != -1) lastClickPosition = -1 + + with(adapter.indexOf(event.manga)) { + if (this != -1) lastClickPositionStack.remove(this) + } + if (controller.selectedMangas.isEmpty()) { adapter.mode = SelectableAdapter.Mode.SINGLE // SY --> @@ -305,7 +310,9 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att is LibrarySelectionEvent.Cleared -> { adapter.mode = SelectableAdapter.Mode.SINGLE adapter.clearSelection() - lastClickPosition = -1 + + lastClickPositionStack.clear() + lastClickPositionStack.push(-1) // SY --> adapter.isLongPressDragEnabled = adapter.canDrag() // SY <-- @@ -336,7 +343,11 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att // If the action mode is created and the position is valid, toggle the selection. val item = adapter.getItem(position) ?: return false return if (adapter.mode == SelectableAdapter.Mode.MULTI) { - lastClickPosition = position + if (adapter.isSelected(position)) { + lastClickPositionStack.remove(position) + } else { + lastClickPositionStack.push(position) + } toggleSelection(position) true } else { @@ -352,6 +363,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att */ override fun onItemLongClick(position: Int) { controller.createActionModeIfNeeded() + val lastClickPosition = lastClickPositionStack.peek()!! // SY --> adapter.isLongPressDragEnabled = adapter.canDrag() // SY <-- @@ -365,7 +377,10 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att setSelection(i) else -> setSelection(position) } - lastClickPosition = position + if (lastClickPosition != position) { + lastClickPositionStack.remove(position) + lastClickPositionStack.push(position) + } } // SY --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 20c40601e..39ae4e840 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -119,6 +119,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.io.IOException +import java.util.ArrayDeque import kotlin.math.min class MangaController : @@ -216,7 +217,7 @@ class MangaController : private val isLocalSource by lazy { presenter.source.id == LocalSource.ID } - private var lastClickPosition = -1 + private var lastClickPositionStack = ArrayDeque(listOf(-1)) private var isRefreshingInfo = false private var isRefreshingChapters = false @@ -1138,7 +1139,12 @@ class MangaController : val adapter = chaptersAdapter ?: return false val item = adapter.getItem(position) ?: return false return if (actionMode != null && adapter.mode == SelectableAdapter.Mode.MULTI) { - lastClickPosition = position + if (adapter.isSelected(position)) { + lastClickPositionStack.remove(position) // possible that it's not there, but no harm + } else { + lastClickPositionStack.push(position) + } + toggleSelection(position) true } else { @@ -1149,6 +1155,7 @@ class MangaController : override fun onItemLongClick(position: Int) { createActionModeIfNeeded() + val lastClickPosition = lastClickPositionStack.peek()!! when { lastClickPosition == -1 -> setSelection(position) lastClickPosition > position -> @@ -1159,7 +1166,10 @@ class MangaController : setSelection(i) else -> setSelection(position) } - lastClickPosition = position + if (lastClickPosition != position) { + lastClickPositionStack.remove(position) // move to top if already exists + lastClickPositionStack.push(position) + } chaptersAdapter?.notifyDataSetChanged() } @@ -1208,7 +1218,8 @@ class MangaController : } private fun destroyActionModeIfNeeded() { - lastClickPosition = -1 + lastClickPositionStack.clear() + lastClickPositionStack.push(-1) actionMode?.finish() }