From 1968ff04710e48ceb830f9a816fc8f0b06361add Mon Sep 17 00:00:00 2001 From: Philipp Wiesemann Date: Fri, 22 May 2015 22:34:08 +0200 Subject: [PATCH] Android: Fixed touch pressure being out of range. According to the documentation of Android's MotionEvent, the getPressure() may return values higher than 1 on some devices. To prevent passing such values into SDL they are now corrected to 1 in Java before the JNI call (where it is assumed to be correct). Currently SDL only sends SDL_FINGERMOTION events if the touch state (position or pressure) changed. By correcting pressure down to 1 some events may get dropped in the rare case that only the pressure was changed but was out of range and the position did not change. --- .../src/org/libsdl/app/SDLActivity.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index cc453c08225d5..5e88108365ac6 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -1156,6 +1156,11 @@ public boolean onTouch(View v, MotionEvent event) { x = event.getX(i) / mWidth; y = event.getY(i) / mHeight; p = event.getPressure(i); + if (p > 1.0f) { + // may be larger than 1.0f on some devices + // see the documentation of getPressure(i) + p = 1.0f; + } SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p); } break; @@ -1175,6 +1180,11 @@ public boolean onTouch(View v, MotionEvent event) { x = event.getX(i) / mWidth; y = event.getY(i) / mHeight; p = event.getPressure(i); + if (p > 1.0f) { + // may be larger than 1.0f on some devices + // see the documentation of getPressure(i) + p = 1.0f; + } SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p); break; @@ -1184,6 +1194,11 @@ public boolean onTouch(View v, MotionEvent event) { x = event.getX(i) / mWidth; y = event.getY(i) / mHeight; p = event.getPressure(i); + if (p > 1.0f) { + // may be larger than 1.0f on some devices + // see the documentation of getPressure(i) + p = 1.0f; + } SDLActivity.onNativeTouch(touchDevId, pointerFingerId, MotionEvent.ACTION_UP, x, y, p); } break;