Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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
  • Loading branch information
slouken committed Oct 16, 2018
1 parent 708ad1f commit 3e3ce6e
Showing 1 changed file with 49 additions and 53 deletions.
@@ -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;
Expand All @@ -12,7 +11,7 @@
import android.util.Log;


public class SDLControllerManager
public class SDLControllerManager
{

public static native int nativeSetupJNI();
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand All @@ -419,55 +455,15 @@ class SDLHaptic {
}

private ArrayList<SDLHaptic> mHaptics;

public SDLHapticHandler() {
mHaptics = new ArrayList<SDLHaptic>();
}

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);
}
}

Expand All @@ -479,7 +475,7 @@ public void stop(int device_id) {
}

public void pollHapticDevices() {

final int deviceId_VIBRATOR_SERVICE = 999999;
boolean hasVibratorService = false;

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -565,7 +561,7 @@ protected SDLHaptic getHaptic(int device_id) {
}
}
return null;
}
}
}

class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
}
}
}

0 comments on commit 3e3ce6e

Please sign in to comment.