Disable header gesture detector on swiping

master
M66B 3 weeks ago
parent 1b263cc319
commit c092096a46

@ -389,6 +389,8 @@ public class FragmentMessages extends FragmentBase
private boolean scrolling = false; private boolean scrolling = false;
private boolean navigating = false; private boolean navigating = false;
private GestureDetector gestureDetector;
private AdapterMessage adapter; private AdapterMessage adapter;
private AdapterMessage.ViewType viewType; private AdapterMessage.ViewType viewType;
@ -1196,70 +1198,72 @@ public class FragmentMessages extends FragmentBase
}; };
rvMessage.addItemDecoration(dateDecorator); rvMessage.addItemDecoration(dateDecorator);
rvMessage.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
private final GestureDetector gestureDetector = @Override
new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { public void onLongPress(@NonNull MotionEvent e) {
@Override if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
public void onLongPress(@NonNull MotionEvent e) { return;
if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
return;
if (swiping)
return;
int x = Math.round(e.getX()); int x = Math.round(e.getX());
int y = Math.round(e.getY()); int y = Math.round(e.getY());
Rect rect = new Rect(); Rect rect = new Rect();
for (int i = 0; i < rvMessage.getChildCount(); i++) { for (int i = 0; i < rvMessage.getChildCount(); i++) {
View child = rvMessage.getChildAt(i); View child = rvMessage.getChildAt(i);
if (child == null) if (child == null)
continue; continue;
dateDecorator.getItemOffsets(rect, child, rvMessage, null); dateDecorator.getItemOffsets(rect, child, rvMessage, null);
if (rect.height() == 0) if (rect.height() == 0)
continue; continue;
rect.set(child.getLeft(), child.getTop() - rect.top, child.getRight(), child.getTop()); rect.set(child.getLeft(), child.getTop() - rect.top, child.getRight(), child.getTop());
if (!rect.contains(x, y)) if (!rect.contains(x, y))
continue; continue;
int pos = rvMessage.getChildAdapterPosition(child); int pos = rvMessage.getChildAdapterPosition(child);
if (pos == NO_POSITION) if (pos == NO_POSITION)
continue; continue;
TupleMessageEx message = adapter.getItemAtPosition(pos); TupleMessageEx message = adapter.getItemAtPosition(pos);
if (message == null) if (message == null)
continue; continue;
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(message.received); cal.setTimeInMillis(message.received);
cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0); cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0); cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0); cal.set(Calendar.MILLISECOND, 0);
if (date_week) { if (date_week) {
cal.setMinimalDaysInFirstWeek(4); // ISO 8601 cal.setMinimalDaysInFirstWeek(4); // ISO 8601
cal.setFirstDayOfWeek(Calendar.MONDAY); cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DATE, 7); cal.add(Calendar.DATE, 7);
} else } else
cal.add(Calendar.DATE, 1); cal.add(Calendar.DATE, 1);
long to = cal.getTimeInMillis(); long to = cal.getTimeInMillis();
cal.add(Calendar.DATE, date_week ? -7 : -1); cal.add(Calendar.DATE, date_week ? -7 : -1);
long from = cal.getTimeInMillis(); long from = cal.getTimeInMillis();
onMenuSelect(from, to, true); onMenuSelect(from, to, true);
Helper.performHapticFeedback(view, HapticFeedbackConstants.CONFIRM); Helper.performHapticFeedback(view, HapticFeedbackConstants.CONFIRM);
return; return;
} }
} }
}); });
rvMessage.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override @Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
gestureDetector.onTouchEvent(e); if (!swiping)
try {
gestureDetector.onTouchEvent(e);
} catch (Throwable ex) {
Log.e(ex);
}
return false; return false;
} }
@ -3290,9 +3294,18 @@ public class FragmentMessages extends FragmentBase
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState); super.onSelectedChanged(viewHolder, actionState);
getMainHandler().removeCallbacks(disableSwiping); getMainHandler().removeCallbacks(disableSwiping);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
swiping = true; swiping = true;
Log.i("Swiping started"); Log.i("Swiping started");
try {
MotionEvent cancel = MotionEvent.obtain(
SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_CANCEL, 0, 0, 0);
gestureDetector.onTouchEvent(cancel);
} catch (Throwable ex) {
Log.e(ex);
}
} else } else
getMainHandler().postDelayed(disableSwiping, ViewConfiguration.getLongPressTimeout() + 100); getMainHandler().postDelayed(disableSwiping, ViewConfiguration.getLongPressTimeout() + 100);
} }

Loading…
Cancel
Save