From 0663ea37e6134172e429f1be2641cd64a88a0f9b Mon Sep 17 00:00:00 2001 From: Jarrad Whitaker Date: Fri, 27 Nov 2015 23:53:55 +1100 Subject: [PATCH] make the android client sent stylus-in-range events if required --- .../java/at/bitfire/gfxtablet/CanvasView.java | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/app-android/app/src/main/java/at/bitfire/gfxtablet/CanvasView.java b/app-android/app/src/main/java/at/bitfire/gfxtablet/CanvasView.java index 388e58b..8cc27bb 100644 --- a/app-android/app/src/main/java/at/bitfire/gfxtablet/CanvasView.java +++ b/app-android/app/src/main/java/at/bitfire/gfxtablet/CanvasView.java @@ -17,10 +17,17 @@ import at.bitfire.gfxtablet.NetEvent.Type; public class CanvasView extends View implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "GfxTablet.CanvasView"; + private enum InRangeStatus { + OutOfRange, + InRange, + FakeInRange + } + final SharedPreferences settings; NetworkClient netClient; boolean acceptStylusOnly; int maxX, maxY; + InRangeStatus inRangeStatus; // setup @@ -35,6 +42,7 @@ public class CanvasView extends View implements SharedPreferences.OnSharedPrefer settings.registerOnSharedPreferenceChangeListener(this); setBackground(); setInputMethods(); + inRangeStatus = InRangeStatus.OutOfRange; } public void setNetworkClient(NetworkClient networkClient) { @@ -83,13 +91,23 @@ public class CanvasView extends View implements SharedPreferences.OnSharedPrefer if (isEnabled()) { for (int ptr = 0; ptr < event.getPointerCount(); ptr++) if (!acceptStylusOnly || (event.getToolType(ptr) == MotionEvent.TOOL_TYPE_STYLUS)) { + short nx = normalizeX(event.getX(ptr)), + ny = normalizeY(event.getY(ptr)), + npressure = normalizePressure(event.getPressure(ptr)); Log.v(TAG, String.format("Generic motion event logged: %f|%f, pressure %f", event.getX(ptr), event.getY(ptr), event.getPressure(ptr))); - if (event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) - netClient.getQueue().add(new NetEvent(Type.TYPE_MOTION, - normalizeX(event.getX(ptr)), - normalizeY(event.getY(ptr)), - normalizePressure(event.getPressure(ptr)) - )); + switch (event.getActionMasked()) { + case MotionEvent.ACTION_HOVER_MOVE: + netClient.getQueue().add(new NetEvent(Type.TYPE_MOTION, nx, ny, npressure)); + break; + case MotionEvent.ACTION_HOVER_ENTER: + inRangeStatus = InRangeStatus.InRange; + netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, -1, true)); + break; + case MotionEvent.ACTION_HOVER_EXIT: + inRangeStatus = InRangeStatus.OutOfRange; + netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, -1, false)); + break; + } } return true; } @@ -110,11 +128,19 @@ public class CanvasView extends View implements SharedPreferences.OnSharedPrefer netClient.getQueue().add(new NetEvent(Type.TYPE_MOTION, nx, ny, npressure)); break; case MotionEvent.ACTION_DOWN: + if (inRangeStatus == inRangeStatus.OutOfRange) { + inRangeStatus = inRangeStatus.FakeInRange; + netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, (short)0, -1, true)); + } netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, 0, true)); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, 0, false)); + if (inRangeStatus == inRangeStatus.FakeInRange) { + inRangeStatus = inRangeStatus.OutOfRange; + netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, (short)0, -1, false)); + } break; }