|
|
|
@@ -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;
|
|
|
|
@@ -1176,6 +1181,23 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Always update the position before sending any button events. If we're
|
|
|
|
|
// dealing with a stylus without hover support, our position might be
|
|
|
|
|
// significantly different than before.
|
|
|
|
|
if (inputCaptureProvider.eventHasRelativeMouseAxes(event)) {
|
|
|
|
|
// Send the deltas straight from the motion event
|
|
|
|
|
short deltaX = (short)inputCaptureProvider.getRelativeAxisX(event);
|
|
|
|
|
short deltaY = (short)inputCaptureProvider.getRelativeAxisY(event);
|
|
|
|
|
|
|
|
|
|
if (deltaX != 0 || deltaY != 0) {
|
|
|
|
|
conn.sendMouseMove(deltaX, deltaY);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (view != null) {
|
|
|
|
|
// Otherwise send absolute position
|
|
|
|
|
updateMousePosition(view, event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (event.getActionMasked() == MotionEvent.ACTION_SCROLL) {
|
|
|
|
|
// Send the vertical scroll packet
|
|
|
|
|
byte vScrollClicks = (byte) event.getAxisValue(MotionEvent.AXIS_VSCROLL);
|
|
|
|
@@ -1235,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);
|
|
|
|
@@ -1252,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);
|
|
|
|
@@ -1271,17 +1291,6 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get relative axis values if we can
|
|
|
|
|
if (inputCaptureProvider.eventHasRelativeMouseAxes(event)) {
|
|
|
|
|
// Send the deltas straight from the motion event
|
|
|
|
|
conn.sendMouseMove((short) inputCaptureProvider.getRelativeAxisX(event),
|
|
|
|
|
(short) inputCaptureProvider.getRelativeAxisY(event));
|
|
|
|
|
}
|
|
|
|
|
else if (view != null) {
|
|
|
|
|
// Otherwise send absolute position
|
|
|
|
|
updateMousePosition(view, event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastButtonState = event.getButtonState();
|
|
|
|
|
}
|
|
|
|
|
// This case is for fingers
|
|
|
|
@@ -1403,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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|