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