mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2025-01-22 01:57:18 +01:00
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
This commit is contained in:
parent
708ad1fd8d
commit
3e3ce6e95c
@ -1,6 +1,5 @@
|
|||||||
package org.libsdl.app;
|
package org.libsdl.app;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
@ -12,7 +11,7 @@ import android.view.*;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
|
||||||
public class SDLControllerManager
|
public class SDLControllerManager
|
||||||
{
|
{
|
||||||
|
|
||||||
public static native int nativeSetupJNI();
|
public static native int nativeSetupJNI();
|
||||||
@ -53,7 +52,12 @@ public class SDLControllerManager
|
|||||||
} else {
|
} else {
|
||||||
mJoystickHandler = new SDLJoystickHandler();
|
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
|
// Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance
|
||||||
@ -410,6 +414,38 @@ class SDLJoystickHandler_API19 extends SDLJoystickHandler_API16 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 SDLHapticHandler {
|
||||||
|
|
||||||
class SDLHaptic {
|
class SDLHaptic {
|
||||||
@ -419,7 +455,7 @@ class SDLHapticHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ArrayList<SDLHaptic> mHaptics;
|
private ArrayList<SDLHaptic> mHaptics;
|
||||||
|
|
||||||
public SDLHapticHandler() {
|
public SDLHapticHandler() {
|
||||||
mHaptics = new ArrayList<SDLHaptic>();
|
mHaptics = new ArrayList<SDLHaptic>();
|
||||||
}
|
}
|
||||||
@ -427,47 +463,7 @@ class SDLHapticHandler {
|
|||||||
public void run(int device_id, float intensity, int length) {
|
public void run(int device_id, float intensity, int length) {
|
||||||
SDLHaptic haptic = getHaptic(device_id);
|
SDLHaptic haptic = getHaptic(device_id);
|
||||||
if (haptic != null) {
|
if (haptic != null) {
|
||||||
|
haptic.vib.vibrate(length);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,7 +475,7 @@ class SDLHapticHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void pollHapticDevices() {
|
public void pollHapticDevices() {
|
||||||
|
|
||||||
final int deviceId_VIBRATOR_SERVICE = 999999;
|
final int deviceId_VIBRATOR_SERVICE = 999999;
|
||||||
boolean hasVibratorService = false;
|
boolean hasVibratorService = false;
|
||||||
|
|
||||||
@ -523,7 +519,7 @@ class SDLHapticHandler {
|
|||||||
haptic = new SDLHaptic();
|
haptic = new SDLHaptic();
|
||||||
haptic.device_id = deviceId_VIBRATOR_SERVICE;
|
haptic.device_id = deviceId_VIBRATOR_SERVICE;
|
||||||
haptic.name = "VIBRATOR_SERVICE";
|
haptic.name = "VIBRATOR_SERVICE";
|
||||||
haptic.vib = vib;
|
haptic.vib = vib;
|
||||||
mHaptics.add(haptic);
|
mHaptics.add(haptic);
|
||||||
SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name);
|
SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name);
|
||||||
}
|
}
|
||||||
@ -565,7 +561,7 @@ class SDLHapticHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {
|
class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {
|
||||||
@ -655,7 +651,7 @@ class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 {
|
|||||||
case InputDevice.SOURCE_GAMEPAD:
|
case InputDevice.SOURCE_GAMEPAD:
|
||||||
case InputDevice.SOURCE_DPAD:
|
case InputDevice.SOURCE_DPAD:
|
||||||
return SDLControllerManager.handleJoystickMotionEvent(event);
|
return SDLControllerManager.handleJoystickMotionEvent(event);
|
||||||
|
|
||||||
case InputDevice.SOURCE_MOUSE:
|
case InputDevice.SOURCE_MOUSE:
|
||||||
if (!SDLActivity.mSeparateMouseAndTouch) {
|
if (!SDLActivity.mSeparateMouseAndTouch) {
|
||||||
break;
|
break;
|
||||||
@ -746,7 +742,7 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {
|
|||||||
case InputDevice.SOURCE_GAMEPAD:
|
case InputDevice.SOURCE_GAMEPAD:
|
||||||
case InputDevice.SOURCE_DPAD:
|
case InputDevice.SOURCE_DPAD:
|
||||||
return SDLControllerManager.handleJoystickMotionEvent(event);
|
return SDLControllerManager.handleJoystickMotionEvent(event);
|
||||||
|
|
||||||
case InputDevice.SOURCE_MOUSE:
|
case InputDevice.SOURCE_MOUSE:
|
||||||
case 12290: // DeX desktop mouse cursor is a separate non-standard input type.
|
case 12290: // DeX desktop mouse cursor is a separate non-standard input type.
|
||||||
if (!SDLActivity.mSeparateMouseAndTouch) {
|
if (!SDLActivity.mSeparateMouseAndTouch) {
|
||||||
@ -820,12 +816,12 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {
|
|||||||
SDLActivity.getContentView().requestPointerCapture();
|
SDLActivity.getContentView().requestPointerCapture();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SDLActivity.getContentView().releasePointerCapture();
|
SDLActivity.getContentView().releasePointerCapture();
|
||||||
}
|
}
|
||||||
mRelativeModeEnabled = enabled;
|
mRelativeModeEnabled = enabled;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -850,4 +846,4 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {
|
|||||||
// Relative mouse in capture mode will only have relative for X/Y
|
// Relative mouse in capture mode will only have relative for X/Y
|
||||||
return event.getY(0);
|
return event.getY(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user