mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	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
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							441fc6e45b
						
					
				
				
					commit
					496a476c13
				
			@@ -27,6 +27,7 @@ import reactivecircus.flowbinding.recyclerview.scrollStateChanges
 | 
			
		||||
import reactivecircus.flowbinding.swiperefreshlayout.refreshes
 | 
			
		||||
import rx.subscriptions.CompositeSubscription
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.util.ArrayDeque
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fragment containing the library manga for a certain category.
 | 
			
		||||
@@ -66,7 +67,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
 | 
			
		||||
     */
 | 
			
		||||
    private var subscriptions = CompositeSubscription()
 | 
			
		||||
 | 
			
		||||
    private var lastClickPosition = -1
 | 
			
		||||
    private var lastClickPositionStack = ArrayDeque(listOf(-1))
 | 
			
		||||
 | 
			
		||||
    fun onCreate(controller: LibraryController, binding: LibraryCategoryBinding) {
 | 
			
		||||
        this.controller = controller
 | 
			
		||||
@@ -205,7 +206,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
 | 
			
		||||
                }
 | 
			
		||||
@@ -213,7 +218,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)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -241,7 +248,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 {
 | 
			
		||||
@@ -257,6 +268,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemLongClick(position: Int) {
 | 
			
		||||
        controller.createActionModeIfNeeded()
 | 
			
		||||
        val lastClickPosition = lastClickPositionStack.peek()!!
 | 
			
		||||
        when {
 | 
			
		||||
            lastClickPosition == -1 -> setSelection(position)
 | 
			
		||||
            lastClickPosition > position ->
 | 
			
		||||
@@ -267,7 +279,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)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -82,6 +82,7 @@ import timber.log.Timber
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.util.ArrayDeque
 | 
			
		||||
import kotlin.math.min
 | 
			
		||||
 | 
			
		||||
class MangaController :
 | 
			
		||||
@@ -154,7 +155,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
 | 
			
		||||
@@ -727,7 +728,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 {
 | 
			
		||||
@@ -738,6 +744,7 @@ class MangaController :
 | 
			
		||||
 | 
			
		||||
    override fun onItemLongClick(position: Int) {
 | 
			
		||||
        createActionModeIfNeeded()
 | 
			
		||||
        val lastClickPosition = lastClickPositionStack.peek()!!
 | 
			
		||||
        when {
 | 
			
		||||
            lastClickPosition == -1 -> setSelection(position)
 | 
			
		||||
            lastClickPosition > position ->
 | 
			
		||||
@@ -748,7 +755,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()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -797,7 +807,8 @@ class MangaController :
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun destroyActionModeIfNeeded() {
 | 
			
		||||
        lastClickPosition = -1
 | 
			
		||||
        lastClickPositionStack.clear()
 | 
			
		||||
        lastClickPositionStack.push(-1)
 | 
			
		||||
        actionMode?.finish()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user