Bug 1350510 - WIP draft
authorTom Klein <twointofive@gmail.com>
Fri, 24 Mar 2017 00:40:54 -0500
changeset 701420 12215af47ad3674f555febed89b809ae1e7d019d
parent 701250 72ee4800d4156931c89b58bd807af4a3083702bb
child 741152 3900ccb49492525f9434b29e4998358399910d74
push id90146
push userbmo:twointofive@gmail.com
push dateTue, 21 Nov 2017 16:13:41 +0000
bugs1350510
milestone59.0a1
Bug 1350510 - WIP MozReview-Commit-ID: 8zbfzFxjLjo
mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java
mobile/android/base/java/org/mozilla/gecko/tabs/TabsTouchHelperCallback.java
--- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java
+++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java
@@ -33,16 +33,17 @@ public class TabStripItemView extends Th
     private static final String LOGTAG = "GeckoTabStripItem";
 
     private static final int[] STATE_CHECKED = {
         android.R.attr.state_checked
     };
 
     private int id = -1;
     private boolean checked;
+    private boolean dragging;
 
     private final ImageView faviconView;
     private final ThemedTextView titleView;
     private final ThemedImageButton closeView;
     private final View indicatorView;
 
     private final int faviconSize;
     private Bitmap lastFavicon;
@@ -129,26 +130,39 @@ public class TabStripItemView extends Th
 
     @Override
     public void toggle() {
         setChecked(!checked);
     }
 
     @Override
     public void setPressed(boolean pressed) {
+        if (pressed == isPressed() || dragging) {
+            // When the RecyclerView TouchHelper takes over event handling for a drag (which happens
+            // once the move after a long press starts), we get an ACTION_CANCEL touch event which
+            // leads to a setPressed(false) - if we're dragging then ignore that since we are
+            // actually still pressed.
+            return;
+        }
+
         super.setPressed(pressed);
 
         // The surrounding tab strip dividers need to be hidden
         // when a tab item enters pressed state.
         View parent = (View) getParent();
         if (parent != null) {
             parent.invalidate();
         }
     }
 
+    void setDragging(boolean dragging) {
+        this.dragging = dragging;
+        setPressed(dragging);
+    }
+
     void updateFromTab(Tab tab) {
         if (tab == null) {
             return;
         }
 
         id = tab.getId();
 
         setChecked(Tabs.getInstance().isSelectedTab(tab));
--- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsTouchHelperCallback.java
+++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsTouchHelperCallback.java
@@ -11,16 +11,17 @@ import android.support.annotation.Nullab
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.helper.ItemTouchHelper;
 import android.view.View;
 
 class TabsTouchHelperCallback extends ItemTouchHelper.Callback {
     private final @Nullable DismissListener dismissListener;
     private final @NonNull DragListener dragListener;
     private final int movementFlags;
+    private View dragItemView;
 
     interface DismissListener {
         void onItemDismiss(View view);
     }
 
     interface DragListener {
         boolean onItemMove(int fromPosition, int toPosition);
     }
@@ -89,13 +90,30 @@ class TabsTouchHelperCallback extends It
         if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
             // Alpha on an itemView being swiped should decrease to a min over a distance equal to
             // the width of the item being swiped.
             viewHolder.itemView.setAlpha(alphaForItemSwipeDx(dX, viewHolder.itemView.getWidth()));
         }
     }
 
     @Override
+    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
+        super.onSelectedChanged(viewHolder, actionState);
+
+        if (viewHolder != null) {
+            if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
+                dragItemView = viewHolder.itemView;
+                ((TabStripItemView) dragItemView).setDragging(true);
+            }
+        } else if (dragItemView != null && actionState == ItemTouchHelper.ACTION_STATE_IDLE) {
+            ((TabStripItemView) dragItemView).setDragging(false);
+            dragItemView = null;
+        }
+    }
+
+    @Override
     public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
         super.clearView(recyclerView, viewHolder);
         viewHolder.itemView.setAlpha(1);
+        dragItemView = null;
+        viewHolder.itemView.setPressed(false);
     }
 }