Bug 1350510 - WIP
MozReview-Commit-ID: 8zbfzFxjLjo
--- 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);
}
}