Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 3ef9ba32 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #6473 from thundernest/swipe_ux_fixes

Various swipe fixes
parents 23b68555 be17b94c
Loading
Loading
Loading
Loading
+28 −11
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ class MessageListFragment :
    private lateinit var fragmentListener: MessageListFragmentListener

    private var recyclerView: RecyclerView? = null
    private var itemTouchHelper: ItemTouchHelper? = null
    private var swipeRefreshLayout: SwipeRefreshLayout? = null

    private lateinit var adapter: MessageListAdapter
@@ -278,6 +279,7 @@ class MessageListFragment :
        recyclerView.adapter = adapter

        this.recyclerView = recyclerView
        this.itemTouchHelper = itemTouchHelper
    }

    private fun initializeSortSettings() {
@@ -421,6 +423,7 @@ class MessageListFragment :

    override fun onDestroyView() {
        recyclerView = null
        itemTouchHelper = null
        swipeRefreshLayout = null

        if (isNewMessagesView && !requireActivity().isChangingConfigurations) {
@@ -1108,8 +1111,25 @@ class MessageListFragment :

    override fun doNegativeClick(dialogId: Int) {
        if (dialogId == R.id.dialog_confirm_spam || dialogId == R.id.dialog_confirm_delete) {
            // No further need for this reference
            activeMessages = null
            val activeMessages = this.activeMessages ?: return
            if (activeMessages.size == 1) {
                // List item might have been swiped and is still showing the "swipe action background"
                resetSwipedView(activeMessages.first())
            }

            this.activeMessages = null
        }
    }

    private fun resetSwipedView(messageReference: MessageReference) {
        val recyclerView = this.recyclerView ?: return
        val itemTouchHelper = this.itemTouchHelper ?: return

        adapter.getItem(messageReference)?.let { messageListItem ->
            recyclerView.findViewHolderForItemId(messageListItem.uniqueId)?.let { viewHolder ->
                itemTouchHelper.stopSwipe(viewHolder)
                notifyItemChanged(messageListItem)
            }
        }
    }

@@ -1491,20 +1511,15 @@ class MessageListFragment :
                    onArchive(item.messageReference)
                }
                SwipeAction.Delete -> {
                    if (K9.isConfirmDelete) {
                        notifyItemChanged(item)
                    }
                    onDelete(listOf(item.messageReference))
                }
                SwipeAction.Spam -> {
                    if (K9.isConfirmSpam) {
                        notifyItemChanged(item)
                    }
                    onSpam(listOf(item.messageReference))
                }
                SwipeAction.Move -> {
                    notifyItemChanged(item)
                    onMove(item.messageReference)
                    val messageReference = item.messageReference
                    resetSwipedView(messageReference)
                    onMove(messageReference)
                }
            }
        }
@@ -1527,7 +1542,9 @@ class MessageListFragment :
            SwipeAction.ToggleSelection -> true
            SwipeAction.ToggleRead -> !isOutbox
            SwipeAction.ToggleStar -> !isOutbox
            SwipeAction.Archive -> !isOutbox && item.account.hasArchiveFolder()
            SwipeAction.Archive -> {
                !isOutbox && item.account.hasArchiveFolder() && item.folderId != item.account.archiveFolderId
            }
            SwipeAction.Delete -> true
            SwipeAction.Move -> !isOutbox && messagingController.isMoveCapable(item.account)
            SwipeAction.Spam -> !isOutbox && item.account.hasSpamFolder() && item.folderId != item.account.spamFolderId
+3 −3
Original line number Diff line number Diff line
@@ -69,6 +69,9 @@ class MessageListSwipeCallback(
    }

    override fun onSwipeStarted(viewHolder: ViewHolder, direction: Int) {
        // Mark view to prevent MessageListItemAnimator from interfering with swipe animations
        viewHolder.markAsSwiped(true)

        val swipeAction = when (direction) {
            ItemTouchHelper.RIGHT -> swipeRightAction
            ItemTouchHelper.LEFT -> swipeLeftAction
@@ -91,9 +94,6 @@ class MessageListSwipeCallback(
    override fun onSwiped(viewHolder: ViewHolder, direction: Int) {
        val item = viewHolder.messageListItem

        // Mark view to prevent MessageListItemAnimator from interfering with swipe animations
        viewHolder.markAsSwiped(true)

        when (direction) {
            ItemTouchHelper.RIGHT -> listener.onSwipeAction(item, swipeRightAction)
            ItemTouchHelper.LEFT -> listener.onSwipeAction(item, swipeLeftAction)
+8 −0
Original line number Diff line number Diff line
@@ -938,6 +938,10 @@ public class ItemTouchHelper extends RecyclerView.ItemDecoration

    @Override
    public void onChildViewDetachedFromWindow(@NonNull View view) {
        resetSwipeView(view);
    }

    private void resetSwipeView(@NonNull View view) {
        removeChildDrawingOrderCallbackIfNecessary(view);
        final ViewHolder holder = mRecyclerView.getChildViewHolder(view);
        if (holder == null) {
@@ -953,6 +957,10 @@ public class ItemTouchHelper extends RecyclerView.ItemDecoration
        }
    }

    public void stopSwipe(@NonNull ViewHolder viewHolder) {
        resetSwipeView(viewHolder.itemView);
    }

    /**
     * Returns the animation type or 0 if cannot be found.
     */