diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index 992fc00a71..507fa8dd01 100755 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -2078,6 +2078,10 @@ public boolean handleKeyDown(KeyEvent event) { return false; } + if (event.getKeyCode() == KeyEvent.KEYCODE_HOME) { + disconnect(); + } + // We'll send it as a raw key event if we have a key mapping, otherwise we'll send it // as UTF-8 text (if it's a printable character). short translated = keyboardTranslator.translate(event.getKeyCode(), event.getScanCode(), deviceId); @@ -3158,12 +3162,14 @@ private boolean handleTouchInput(MotionEvent event, TouchContext[] inputContextM // some devices report inverted axis when trackpad pointer is captured // but not when they're simulated as swipes on the screen if (invertAxis) { + aTouchContextMap.setActualPointerCount(actualPointerCount); aTouchContextMap.touchMoveEvent( historicalY, historicalX, event.getHistoricalEventTime(i) ); } else { + aTouchContextMap.setActualPointerCount(actualPointerCount); aTouchContextMap.touchMoveEvent( historicalX, historicalY, @@ -3222,7 +3228,9 @@ private boolean handleTouchInput(MotionEvent event, TouchContext[] inputContextM case MotionEvent.ACTION_DOWN: for (TouchContext touchContext : inputContextMap) { touchContext.setPointerCount(pointerCount); + touchContext.setActualPointerCount(actualPointerCount); } + context.setActualPointerCount(actualPointerCount); context.touchDownEvent(eventX, eventY, event.getEventTime(), true); break; case MotionEvent.ACTION_POINTER_UP: @@ -3251,11 +3259,13 @@ private boolean handleTouchInput(MotionEvent event, TouchContext[] inputContextM context.cancelTouch(); } else { + context.setActualPointerCount(actualPointerCount); context.touchUpEvent(eventX, eventY, event.getEventTime()); } for (TouchContext touchContext : inputContextMap) { touchContext.setPointerCount(pointerCount - 1); + touchContext.setActualPointerCount(actualPointerCount); } if (actionIndex == 0 && pointerCount > 1 && !context.isCancelled()) { // The original secondary touch now becomes primary @@ -3266,6 +3276,7 @@ private boolean handleTouchInput(MotionEvent event, TouchContext[] inputContextM pointer1X = (int)normalizedCoords[0]; pointer1Y = (int)normalizedCoords[1]; } + context.setActualPointerCount(actualPointerCount); context.touchDownEvent( pointer1X, pointer1Y, @@ -3276,6 +3287,7 @@ private boolean handleTouchInput(MotionEvent event, TouchContext[] inputContextM for (TouchContext aTouchContext : inputContextMap) { aTouchContext.cancelTouch(); aTouchContext.setPointerCount(0); + aTouchContext.setActualPointerCount(0); } break; default: @@ -3341,6 +3353,7 @@ private void cancelStaleTouchState(MotionEvent event, View view) { for (TouchContext aTouchContext : touchContextMap) { aTouchContext.cancelTouch(); aTouchContext.setPointerCount(0); + aTouchContext.setActualPointerCount(0); } } diff --git a/app/src/main/java/com/limelight/KeyboardAccessibilityService.java b/app/src/main/java/com/limelight/KeyboardAccessibilityService.java index fa2e3225ea..1664ae8ee5 100755 --- a/app/src/main/java/com/limelight/KeyboardAccessibilityService.java +++ b/app/src/main/java/com/limelight/KeyboardAccessibilityService.java @@ -15,7 +15,9 @@ public class KeyboardAccessibilityService extends AccessibilityService { private final static List BLACKLIST_KEYS = Arrays.asList( KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN, - KeyEvent.KEYCODE_POWER + KeyEvent.KEYCODE_POWER, + KeyEvent.KEYCODE_BRIGHTNESS_DOWN, + KeyEvent.KEYCODE_BRIGHTNESS_UP ); @Override diff --git a/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java b/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java index 9d3e203d56..bd3c2f340f 100755 --- a/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java +++ b/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java @@ -8,6 +8,7 @@ import android.view.KeyEvent; import com.limelight.LimeLog; +import com.limelight.binding.input.touch.Debug; import com.limelight.nvstream.input.KeyboardPacket; import com.limelight.preferences.PreferenceConfiguration; import com.limelight.utils.KeyMapper; @@ -52,7 +53,8 @@ public class KeyboardTranslator implements InputManager.InputDeviceListener { public static final int VK_SEMICOLON = 59; public static final int VK_SLASH = 47; public static final int VK_SPACE = 32; - public static final int VK_PRINTSCREEN = 154; +// public static final int VK_PRINTSCREEN = 154; why??? + public static final int VK_PRINTSCREEN = 44; public static final int VK_TAB = 9; public static final int VK_LEFT = 37; public static final int VK_RIGHT = 39; @@ -182,8 +184,8 @@ public boolean hasNormalizedMapping(int keycode, int deviceId) { */ public short translate(int keycode, int scancode, int deviceId) { int translated; - - // If a device ID was provided, look up the keyboard mapping + Debug.format("keycode {0}", keycode); + // If a device ID was provided, look up the keylllboard mapping // Force qwerty will break user's keyboard layout settings if (prefConfig.forceQwerty && deviceId >= 0) { KeyboardMapping mapping = keyboardMappings.get(deviceId); diff --git a/app/src/main/java/com/limelight/binding/input/touch/Debug.java b/app/src/main/java/com/limelight/binding/input/touch/Debug.java new file mode 100644 index 0000000000..334fb83fba --- /dev/null +++ b/app/src/main/java/com/limelight/binding/input/touch/Debug.java @@ -0,0 +1,12 @@ +package com.limelight.binding.input.touch; + +import java.text.MessageFormat; + +public class Debug { + public static int maxCount = 0; + public static String actions = ""; + + public static void format(String pattern, Object... arguments) { + actions = MessageFormat.format(pattern, arguments); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/limelight/binding/input/touch/TouchContext.java b/app/src/main/java/com/limelight/binding/input/touch/TouchContext.java index 431ea18162..e15ee03d6d 100755 --- a/app/src/main/java/com/limelight/binding/input/touch/TouchContext.java +++ b/app/src/main/java/com/limelight/binding/input/touch/TouchContext.java @@ -3,6 +3,7 @@ public interface TouchContext { int getActionIndex(); void setPointerCount(int pointerCount); + default void setActualPointerCount(int pointerCount){} boolean touchDownEvent(int eventX, int eventY, long eventTime, boolean isNewFinger); boolean touchMoveEvent(int eventX, int eventY, long eventTime); void touchUpEvent(int eventX, int eventY, long eventTime); diff --git a/app/src/main/java/com/limelight/binding/input/touch/TrackpadContext.java b/app/src/main/java/com/limelight/binding/input/touch/TrackpadContext.java index 155cd0496c..471a5beb51 100644 --- a/app/src/main/java/com/limelight/binding/input/touch/TrackpadContext.java +++ b/app/src/main/java/com/limelight/binding/input/touch/TrackpadContext.java @@ -22,6 +22,8 @@ public class TrackpadContext implements TouchContext { private double distanceMoved; private int pointerCount; private boolean clickedMiddle = false; + private int maxCount = 0; + private int actualPointerCount = 0; private int maxPointerCountInGesture; private boolean isClickPending; private boolean isDblClickPending; @@ -168,11 +170,11 @@ private boolean isTap(long eventTime) { } private byte getMouseButtonIndex() { - if (pointerCount == 2) { - return MouseButtonPacket.BUTTON_RIGHT; - } else if (pointerCount == 3) { + if (maxCount == 3) { clickedMiddle = true; return MouseButtonPacket.BUTTON_MIDDLE; + } else if (pointerCount == 2) { + return MouseButtonPacket.BUTTON_RIGHT; } else { return MouseButtonPacket.BUTTON_LEFT; } @@ -198,18 +200,22 @@ public boolean touchDownEvent(int eventX, int eventY, long eventTime, boolean is isScrollTransitioning = false; maxPointerCountInGesture = pointerCount; originalTouchTime = eventTime; + maxCount = pointerCount; cancelled = confirmedMove = confirmedScroll = false; distanceMoved = 0; velocityX = 0; velocityY = 0; lastMoveTime = eventTime; + if (pointerCount == 3){ + clickedMiddle = true; + } if (isClickPending) { isClickPending = false; isDblClickPending = true; confirmedDrag = true; } } else { - if (pointerCount == 2 && !confirmedMove) { + if ((actualPointerCount == 3) && !confirmedMove) { conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_MIDDLE); conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_MIDDLE); isClickPending = false; @@ -217,7 +223,7 @@ public boolean touchDownEvent(int eventX, int eventY, long eventTime, boolean is confirmedDrag = false; clickedMiddle = true; // Second finger released, should trigger right click immediately - } else if (pointerCount == 1 && !confirmedMove && !clickedMiddle) { + } else if (pointerCount == 1 && actualPointerCount == 2 && !confirmedMove && !clickedMiddle && maxCount == 2) { conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_RIGHT); conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_RIGHT); isClickPending = false; @@ -385,7 +391,7 @@ public boolean touchMoveEvent(int eventX, int eventY, long eventTime) { if (sendDeltaX != 0 || sendDeltaY != 0) { conn.sendMouseMove(sendDeltaX, sendDeltaY); } - } else if (pointerCount == 2) { + } else if (pointerCount == 2 && maxCount == 2 && actualPointerCount == 2) { checkForConfirmedScroll(); if (confirmedScroll) { if (absDeltaX > absDeltaY) { @@ -430,6 +436,13 @@ public boolean isCancelled() { return cancelled; } + @Override + public void setActualPointerCount(int pointerCount){ +// Debug.format("Set pointerCount {0}", pointerCount); + actualPointerCount = pointerCount; + maxCount = Math.max(maxCount, pointerCount); + } + @Override public void setPointerCount(int pointerCount) { if (this.pointerCount == 2 && pointerCount == 1) { diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java index b131684e2b..1c94b0bfc6 100755 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -16,6 +16,7 @@ import com.limelight.BuildConfig; import com.limelight.LimeLog; import com.limelight.R; +import com.limelight.binding.input.touch.Debug; import com.limelight.nvstream.av.video.VideoDecoderRenderer; import com.limelight.nvstream.jni.MoonBridge; import com.limelight.preferences.PreferenceConfiguration; @@ -1791,6 +1792,10 @@ public int submitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength, int dec float decodeTimeMs = (float)lastTwo.decoderTimeMs / lastTwo.totalFramesReceived; long rttInfo = MoonBridge.getEstimatedRttInfo(); StringBuilder sb = new StringBuilder(); + sb.append("max count: ").append(Debug.maxCount).append("\n"); + sb.append(Debug.actions); + Debug.maxCount = 0; + Debug.actions = ""; if(prefs.enablePerfOverlayLite){ if(TrafficStatsHelper.getPackageRxBytes(Process.myUid()) != TrafficStats.UNSUPPORTED){ long netData=TrafficStatsHelper.getPackageRxBytes(Process.myUid())+TrafficStatsHelper.getPackageTxBytes(Process.myUid());