From 8f2115fe0c86898929f46cfc8c51c8a2cf44230d Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 30 Jan 2019 18:11:22 +0000 Subject: [PATCH] Added swipe to previous/next conversation --- FAQ.md | 1 - .../java/eu/faircode/email/ActivityBase.java | 13 ++++++ .../eu/faircode/email/FragmentMessages.java | 24 ++++++++++ .../java/eu/faircode/email/SwipeListener.java | 46 +++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/eu/faircode/email/SwipeListener.java diff --git a/FAQ.md b/FAQ.md index 44988b35d9..8f5e756ab8 100644 --- a/FAQ.md +++ b/FAQ.md @@ -35,7 +35,6 @@ Anything on this list is in random order and *might* be added in the near future ## Frequently requested features -* Swipe left/right to go to previous/next message: besides that swiping left/right is already being used to move messages to archive/trash, swiping also selects message text, so this will not work reliably. You can use the bottom navigation bar instead. * Rich text editor: besides that very few people would use this on a small mobile device, Android doesn't support a rich text editor and most rich text editor open source projects are abandoned. * Widget to read e-mail: widgets can have limited user interaction only, so a widget to read e-mail would not be very useful. Moreover, it would be not very useful to duplicate functions which are already available in the app. * Badge count: there is no standard Android API for this and third party solutions might stop working anytime. For example *ShortcutBadger* [has lots of problems](https://github.com/leolin310148/ShortcutBadger/issues). You can use the provided widget instead. diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index dd480a663c..49a61359a5 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -26,6 +26,7 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceManager; +import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; @@ -39,6 +40,7 @@ import androidx.fragment.app.Fragment; abstract class ActivityBase extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener { private boolean contacts; + private SwipeListener swipeListener; @Override protected void onCreate(Bundle savedInstanceState) { @@ -59,6 +61,17 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc super.onCreate(savedInstanceState); } + void setSwipeListener(SwipeListener.ISwipeListener listener) { + swipeListener = new SwipeListener(this, listener); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (swipeListener != null) + swipeListener.onTouch(null, ev); + return super.dispatchTouchEvent(ev); + } + @Override protected void onResume() { Log.i("Resume " + this.getClass().getName()); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 1aaef9930f..884ce11139 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -297,6 +297,30 @@ public class FragmentMessages extends FragmentBase { } }); } + + ActivityBase activity = (ActivityBase) getActivity(); + activity.setSwipeListener(new SwipeListener.ISwipeListener() { + @Override + public boolean onSwipeRight() { + return swipe(R.id.action_prev); + } + + @Override + public boolean onSwipeLeft() { + return swipe(R.id.action_next); + } + + private boolean swipe(int menu) { + Intent intent = bottom_navigation.getMenu().findItem(menu).getIntent(); + Long id = (intent == null ? null : intent.getLongExtra("id", -1)); + if (id != null && id > 0) { + navigate(id); + return true; + } else + return false; + } + }); + } else { final SelectionPredicateMessage predicate = new SelectionPredicateMessage(rvMessage); diff --git a/app/src/main/java/eu/faircode/email/SwipeListener.java b/app/src/main/java/eu/faircode/email/SwipeListener.java new file mode 100644 index 0000000000..9dbfd0f390 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/SwipeListener.java @@ -0,0 +1,46 @@ +package eu.faircode.email; + +import android.content.Context; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; + +public class SwipeListener implements View.OnTouchListener { + private final GestureDetector gestureDetector; + + public SwipeListener(Context context, final ISwipeListener listener) { + gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { + private static final int MOVE_THRESHOLD = 100; + private static final int SPEED_THRESHOLD = 100; + + @Override + public boolean onFling(MotionEvent me1, MotionEvent me2, float vx, float vy) { + boolean consumed = false; + float dx = me2.getX() - me1.getX(); + float dy = me2.getY() - me1.getY(); + if (Math.abs(dx) > Math.abs(dy)) { + if (Math.abs(dx) > MOVE_THRESHOLD && Math.abs(vx) > SPEED_THRESHOLD) + try { + if (dx > 0) + consumed = listener.onSwipeRight(); + else + consumed = listener.onSwipeLeft(); + } catch (Throwable ex) { + Log.e(ex); + } + } + return consumed; + } + }); + } + + public boolean onTouch(final View v, final MotionEvent event) { + return gestureDetector.onTouchEvent(event); + } + + interface ISwipeListener { + boolean onSwipeRight(); + + boolean onSwipeLeft(); + } +} \ No newline at end of file