diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index c7030b02..a91ee4f4 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -95,8 +95,11 @@ public class Game extends Activity implements SurfaceHolder.Callback, private static final int REFERENCE_HORIZ_RES = 1280; private static final int REFERENCE_VERT_RES = 720; - private static final int STYLUS_DEAD_ZONE_DELAY = 250; - private static final int STYLUS_DEAD_ZONE_RADIUS = 50; + private static final int STYLUS_DOWN_DEAD_ZONE_DELAY = 100; + private static final int STYLUS_DOWN_DEAD_ZONE_RADIUS = 20; + + private static final int STYLUS_UP_DEAD_ZONE_DELAY = 150; + private static final int STYLUS_UP_DEAD_ZONE_RADIUS = 50; private static final int THREE_FINGER_TAP_THRESHOLD = 300; @@ -119,8 +122,10 @@ public class Game extends Activity implements SurfaceHolder.Callback, private boolean grabbedInput = true; private boolean grabComboDown = false; private StreamView streamView; - private long stylusDownTime = 0; - private float stylusDownX, stylusDownY; + private long lastAbsTouchUpTime = 0; + private long lastAbsTouchDownTime = 0; + private float lastAbsTouchUpX, lastAbsTouchUpY; + private float lastAbsTouchDownX, lastAbsTouchDownY; private boolean isHidingOverlays; private TextView notificationOverlayView; @@ -1252,16 +1257,16 @@ public class Game extends Activity implements SurfaceHolder.Callback, if (event.getPointerCount() == 1 && event.getActionIndex() == 0) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) { - stylusDownTime = SystemClock.uptimeMillis(); - stylusDownX = event.getX(0); - stylusDownY = event.getY(0); + lastAbsTouchDownTime = SystemClock.uptimeMillis(); + lastAbsTouchDownX = event.getX(0); + lastAbsTouchDownY = event.getY(0); // Stylus is left click conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_LEFT); } else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) { - stylusDownTime = SystemClock.uptimeMillis(); - stylusDownX = event.getX(0); - stylusDownY = event.getY(0); + lastAbsTouchDownTime = SystemClock.uptimeMillis(); + lastAbsTouchDownX = event.getX(0); + lastAbsTouchDownY = event.getY(0); // Eraser is right click conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_RIGHT); @@ -1269,18 +1274,16 @@ public class Game extends Activity implements SurfaceHolder.Callback, } else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) { - // It looks odd to set these on ACTION_UP, but it makes sense. - // The last "down" position is actually when we come up. - stylusDownTime = SystemClock.uptimeMillis(); - stylusDownX = event.getX(0); - stylusDownY = event.getY(0); + lastAbsTouchUpTime = SystemClock.uptimeMillis(); + lastAbsTouchUpX = event.getX(0); + lastAbsTouchUpY = event.getY(0); // Stylus is left click conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_LEFT); } else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) { - stylusDownTime = SystemClock.uptimeMillis(); - stylusDownX = event.getX(0); - stylusDownY = event.getY(0); + lastAbsTouchUpTime = SystemClock.uptimeMillis(); + lastAbsTouchUpX = event.getX(0); + lastAbsTouchUpY = event.getY(0); // Eraser is right click conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_RIGHT); @@ -1409,13 +1412,29 @@ public class Game extends Activity implements SurfaceHolder.Callback, float eventY = event.getY(0); if (event.getPointerCount() == 1 && event.getActionIndex() == 0 && - (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) || - event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) + (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER || + event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS)) { - if (SystemClock.uptimeMillis() - stylusDownTime <= STYLUS_DEAD_ZONE_DELAY && - Math.sqrt(Math.pow(eventX - stylusDownX, 2) + Math.pow(eventY - stylusDownY, 2)) <= STYLUS_DEAD_ZONE_RADIUS) { - // Ignore small inputs shortly after the stylus has been pressed. This ensures users can reliably double click. - return; + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_HOVER_ENTER: + case MotionEvent.ACTION_HOVER_EXIT: + case MotionEvent.ACTION_HOVER_MOVE: + if (SystemClock.uptimeMillis() - lastAbsTouchUpTime <= STYLUS_UP_DEAD_ZONE_DELAY && + Math.sqrt(Math.pow(eventX - lastAbsTouchUpX, 2) + Math.pow(eventY - lastAbsTouchUpY, 2)) <= STYLUS_UP_DEAD_ZONE_RADIUS) { + // Enforce a small deadzone between touch up and hover or touch down to allow more precise double-clicking + return; + } + break; + + case MotionEvent.ACTION_MOVE: + case MotionEvent.ACTION_UP: + if (SystemClock.uptimeMillis() - lastAbsTouchDownTime <= STYLUS_DOWN_DEAD_ZONE_DELAY && + Math.sqrt(Math.pow(eventX - lastAbsTouchDownX, 2) + Math.pow(eventY - lastAbsTouchDownY, 2)) <= STYLUS_DOWN_DEAD_ZONE_RADIUS) { + // Enforce a small deadzone between touch down and move or touch up to allow more precise double-clicking + return; + } + break; } }