From 3e3ce6e95cfbebeae030f99e1e570dfca0c31b68 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 16 Oct 2018 15:00:43 -0700 Subject: [PATCH] Fixed bug 4318 - Android move Haptic code to API26 class Sylvain - Create SDLHapticHandler_API26 - No need of reflection since SDL2 compile with Android 26 as a min requirement. - remove spaces --- .../org/libsdl/app/SDLControllerManager.java | 102 +++++++++--------- 1 file changed, 49 insertions(+), 53 deletions(-) diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java index c6a33e8073146..782a92edef4b3 100644 --- a/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java +++ b/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java @@ -1,6 +1,5 @@ package org.libsdl.app; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -12,7 +11,7 @@ import android.util.Log; -public class SDLControllerManager +public class SDLControllerManager { public static native int nativeSetupJNI(); @@ -53,7 +52,12 @@ public static void setup() { } else { mJoystickHandler = new SDLJoystickHandler(); } - mHapticHandler = new SDLHapticHandler(); + + if (Build.VERSION.SDK_INT >= 26) { + mHapticHandler = new SDLHapticHandler_API26(); + } else { + mHapticHandler = new SDLHapticHandler(); + } } // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance @@ -410,6 +414,38 @@ public int getButtonMask(InputDevice joystickDevice) { } } +class SDLHapticHandler_API26 extends SDLHapticHandler { + @Override + public void run(int device_id, float intensity, int length) { + SDLHaptic haptic = getHaptic(device_id); + if (haptic != null) { + Log.d("SDL", "Rtest: Vibe with intensity " + intensity + " for " + length); + if (intensity == 0.0f) { + stop(device_id); + return; + } + + int vibeValue = Math.round(intensity * 255); + + if (vibeValue > 255) { + vibeValue = 255; + } + if (vibeValue < 1) { + stop(device_id); + return; + } + try { + haptic.vib.vibrate(VibrationEffect.createOneShot(length, vibeValue)); + } + catch (Exception e) { + // Fall back to the generic method, which uses DEFAULT_AMPLITUDE, but works even if + // something went horribly wrong with the Android 8.0 APIs. + haptic.vib.vibrate(length); + } + } + } +} + class SDLHapticHandler { class SDLHaptic { @@ -419,7 +455,7 @@ class SDLHaptic { } private ArrayList mHaptics; - + public SDLHapticHandler() { mHaptics = new ArrayList(); } @@ -427,47 +463,7 @@ public SDLHapticHandler() { public void run(int device_id, float intensity, int length) { SDLHaptic haptic = getHaptic(device_id); if (haptic != null) { - - Log.d("SDL", "Rtest: Vibe with intensity " + intensity + " for " + length); - if (intensity == 0.0f) { - stop(device_id); - return; - } - - if (Build.VERSION.SDK_INT >= 26) { - // We have to do this dynamically to avoid issues on earlier SDKs. - // But we want to use the VibrationEffect so we can set amplitude. - - try { - int vibeValue = Math.round(intensity * 255); - - if (vibeValue > 255) { - vibeValue = 255; - } - if (vibeValue < 1) { - stop(device_id); - return; - } - - long longLength = length; - Class vibrationEffectClass = Class.forName("android.os.VibrationEffect"); - Method oneShotMethod = vibrationEffectClass.getMethod("createOneShot", long.class, int.class); - Object effect = oneShotMethod.invoke(null, longLength, vibeValue); - Method vibeEffect = android.os.Vibrator.class.getMethod("vibrate", vibrationEffectClass); - vibeEffect.invoke(haptic.vib, vibrationEffectClass.cast(effect)); - } - catch (Exception e) { - // Fall back to the generic method, which uses DEFAULT_AMPLITUDE, but works even if - // something went horribly wrong with the Android 8.0 APIs. - haptic.vib.vibrate(length); - } - } - else { - // Fall back to the generic method, which uses DEFAULT_AMPLITUDE, but exists - // on earlier SDKs. - - haptic.vib.vibrate (length); - } + haptic.vib.vibrate(length); } } @@ -479,7 +475,7 @@ public void stop(int device_id) { } public void pollHapticDevices() { - + final int deviceId_VIBRATOR_SERVICE = 999999; boolean hasVibratorService = false; @@ -523,7 +519,7 @@ public void pollHapticDevices() { haptic = new SDLHaptic(); haptic.device_id = deviceId_VIBRATOR_SERVICE; haptic.name = "VIBRATOR_SERVICE"; - haptic.vib = vib; + haptic.vib = vib; mHaptics.add(haptic); SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); } @@ -565,7 +561,7 @@ protected SDLHaptic getHaptic(int device_id) { } } return null; - } + } } class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { @@ -655,7 +651,7 @@ public boolean onGenericMotion(View v, MotionEvent event) { case InputDevice.SOURCE_GAMEPAD: case InputDevice.SOURCE_DPAD: return SDLControllerManager.handleJoystickMotionEvent(event); - + case InputDevice.SOURCE_MOUSE: if (!SDLActivity.mSeparateMouseAndTouch) { break; @@ -746,7 +742,7 @@ public boolean onGenericMotion(View v, MotionEvent event) { case InputDevice.SOURCE_GAMEPAD: case InputDevice.SOURCE_DPAD: return SDLControllerManager.handleJoystickMotionEvent(event); - + case InputDevice.SOURCE_MOUSE: case 12290: // DeX desktop mouse cursor is a separate non-standard input type. if (!SDLActivity.mSeparateMouseAndTouch) { @@ -820,12 +816,12 @@ public boolean setRelativeMouseEnabled(boolean enabled) { SDLActivity.getContentView().requestPointerCapture(); } else { - SDLActivity.getContentView().releasePointerCapture(); + SDLActivity.getContentView().releasePointerCapture(); } mRelativeModeEnabled = enabled; return true; } - else + else { return false; } @@ -850,4 +846,4 @@ public float getEventY(MotionEvent event) { // Relative mouse in capture mode will only have relative for X/Y return event.getY(0); } -} \ No newline at end of file +}