diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index aa232dcef..b1bbf1ecc 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -182,12 +182,15 @@ public class SDLActivity extends Activity { // Set up the surface mSurface = new SDLSurface(getApplication()); - if(Build.VERSION.SDK_INT >= 12) { + + if(Build.VERSION.SDK_INT >= 16) { + mJoystickHandler = new SDLJoystickHandler_API16(); + } else if(Build.VERSION.SDK_INT >= 12) { mJoystickHandler = new SDLJoystickHandler_API12(); - } - else { + } else { mJoystickHandler = new SDLJoystickHandler(); } + mHapticHandler = new SDLHapticHandler(); if (Build.VERSION.SDK_INT >= 11) { @@ -511,7 +514,7 @@ public class SDLActivity extends Activity { public static native void onNativeClipboardChanged(); public static native void onNativeSurfaceChanged(); public static native void onNativeSurfaceDestroyed(); - public static native int nativeAddJoystick(int device_id, String name, + public static native int nativeAddJoystick(int device_id, String name, String desc, int is_accelerometer, int nbuttons, int naxes, int nhats, int nballs); public static native int nativeRemoveJoystick(int device_id); @@ -1737,6 +1740,7 @@ class SDLJoystickHandler_API12 extends SDLJoystickHandler { static class SDLJoystick { public int device_id; public String name; + public String desc; public ArrayList axes; public ArrayList hats; } @@ -1770,6 +1774,7 @@ class SDLJoystickHandler_API12 extends SDLJoystickHandler { if (SDLActivity.isDeviceSDLJoystick(deviceIds[i])) { joystick.device_id = deviceIds[i]; joystick.name = joystickDevice.getName(); + joystick.desc = getJoystickDescriptor(joystickDevice); joystick.axes = new ArrayList(); joystick.hats = new ArrayList(); @@ -1788,7 +1793,7 @@ class SDLJoystickHandler_API12 extends SDLJoystickHandler { } mJoysticks.add(joystick); - SDLActivity.nativeAddJoystick(joystick.device_id, joystick.name, 0, -1, + SDLActivity.nativeAddJoystick(joystick.device_id, joystick.name, joystick.desc, 0, -1, joystick.axes.size(), joystick.hats.size()/2, 0); } } @@ -1856,6 +1861,25 @@ class SDLJoystickHandler_API12 extends SDLJoystickHandler { } return true; } + + public String getJoystickDescriptor(InputDevice joystickDevice) { + return joystickDevice.getName(); + } +} + + +class SDLJoystickHandler_API16 extends SDLJoystickHandler_API12 { + + @Override + public String getJoystickDescriptor(InputDevice joystickDevice) { + String desc = joystickDevice.getDescriptor(); + + if (desc != null && desc != "") { + return desc; + } + + return super.getJoystickDescriptor(joystickDevice); + } } class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 6dd078f32..926b68497 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -84,7 +84,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeHat)( JNIEXPORT jint JNICALL SDL_JAVA_INTERFACE(nativeAddJoystick)( JNIEnv* env, jclass jcls, - jint device_id, jstring device_name, jint is_accelerometer, + jint device_id, jstring device_name, jstring device_desc, jint is_accelerometer, jint nbuttons, jint naxes, jint nhats, jint nballs); JNIEXPORT jint JNICALL SDL_JAVA_INTERFACE(nativeRemoveJoystick)( @@ -365,15 +365,17 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeHat)( JNIEXPORT jint JNICALL SDL_JAVA_INTERFACE(nativeAddJoystick)( JNIEnv* env, jclass jcls, - jint device_id, jstring device_name, jint is_accelerometer, + jint device_id, jstring device_name, jstring device_desc, jint is_accelerometer, jint nbuttons, jint naxes, jint nhats, jint nballs) { int retval; const char *name = (*env)->GetStringUTFChars(env, device_name, NULL); + const char *desc = (*env)->GetStringUTFChars(env, device_desc, NULL); - retval = Android_AddJoystick(device_id, name, (SDL_bool) is_accelerometer, nbuttons, naxes, nhats, nballs); + retval = Android_AddJoystick(device_id, name, desc, (SDL_bool) is_accelerometer, nbuttons, naxes, nhats, nballs); (*env)->ReleaseStringUTFChars(env, device_name, name); + (*env)->ReleaseStringUTFChars(env, device_desc, desc); return retval; } diff --git a/src/core/android/SDL_android.h b/src/core/android/SDL_android.h index aae7180dd..e0ae7b5b3 100644 --- a/src/core/android/SDL_android.h +++ b/src/core/android/SDL_android.h @@ -35,6 +35,7 @@ extern "C" { /* Interface from the SDL library into the Android Java activity */ extern void Android_JNI_SetActivityTitle(const char *title); extern void Android_JNI_SetOrientation(int w, int h, int resizable, const char *hint); + extern SDL_bool Android_JNI_GetAccelerometerValues(float values[3]); extern void Android_JNI_ShowTextInput(SDL_Rect *inputRect); extern void Android_JNI_HideTextInput(void); diff --git a/src/joystick/android/SDL_sysjoystick.c b/src/joystick/android/SDL_sysjoystick.c index f8358427d..59adb85bd 100644 --- a/src/joystick/android/SDL_sysjoystick.c +++ b/src/joystick/android/SDL_sysjoystick.c @@ -244,7 +244,7 @@ Android_OnHat(int device_id, int hat_id, int x, int y) int -Android_AddJoystick(int device_id, const char *name, SDL_bool is_accelerometer, int nbuttons, int naxes, int nhats, int nballs) +Android_AddJoystick(int device_id, const char *name, const char *desc, SDL_bool is_accelerometer, int nbuttons, int naxes, int nhats, int nballs) { SDL_JoystickGUID guid; SDL_joylist_item *item; @@ -255,7 +255,7 @@ Android_AddJoystick(int device_id, const char *name, SDL_bool is_accelerometer, /* the GUID is just the first 16 chars of the name for now */ SDL_zero( guid ); - SDL_memcpy( &guid, name, SDL_min( sizeof(guid), SDL_strlen( name ) ) ); + SDL_memcpy( &guid, desc, SDL_min( sizeof(guid), SDL_strlen( desc) ) ); item = (SDL_joylist_item *) SDL_malloc(sizeof (SDL_joylist_item)); if (item == NULL) { @@ -356,7 +356,7 @@ SDL_SYS_JoystickInit(void) if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE)) { /* Default behavior, accelerometer as joystick */ - Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, SDL_TRUE, 0, 3, 0, 0); + Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, ANDROID_ACCELEROMETER_NAME, SDL_TRUE, 0, 3, 0, 0); } return (numjoysticks); diff --git a/src/joystick/android/SDL_sysjoystick_c.h b/src/joystick/android/SDL_sysjoystick_c.h index a9347731e..cae7aff16 100644 --- a/src/joystick/android/SDL_sysjoystick_c.h +++ b/src/joystick/android/SDL_sysjoystick_c.h @@ -32,7 +32,7 @@ extern int Android_OnPadDown(int device_id, int keycode); extern int Android_OnPadUp(int device_id, int keycode); extern int Android_OnJoy(int device_id, int axisnum, float value); extern int Android_OnHat(int device_id, int hat_id, int x, int y); -extern int Android_AddJoystick(int device_id, const char *name, SDL_bool is_accelerometer, int nbuttons, int naxes, int nhats, int nballs); +extern int Android_AddJoystick(int device_id, const char *name, const char *desc, SDL_bool is_accelerometer, int nbuttons, int naxes, int nhats, int nballs); extern int Android_RemoveJoystick(int device_id); /* A linked list of available joysticks */