From 116adbba1f5844a17c38a0e90bb36e58e153c95c Mon Sep 17 00:00:00 2001 From: iwgeric Date: Sun, 19 Apr 2015 12:40:17 -0400 Subject: [PATCH] Android: Support JoystickCompatibilityMappings for reassigning joystick axes and buttons. Also added ability to add new buttons as events come in due to Android not providing a definitive way to determine which buttons are supported on the device. --- .../android/AndroidJoystickJoyInput14.java | 73 +++++++++++-------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/jme3-android/src/main/java/com/jme3/input/android/AndroidJoystickJoyInput14.java b/jme3-android/src/main/java/com/jme3/input/android/AndroidJoystickJoyInput14.java index 370db4f10..1ed98977c 100644 --- a/jme3-android/src/main/java/com/jme3/input/android/AndroidJoystickJoyInput14.java +++ b/jme3-android/src/main/java/com/jme3/input/android/AndroidJoystickJoyInput14.java @@ -44,6 +44,7 @@ import com.jme3.input.JoyInput; import com.jme3.input.Joystick; import com.jme3.input.JoystickAxis; import com.jme3.input.JoystickButton; +import com.jme3.input.JoystickCompatibilityMappings; import com.jme3.input.event.JoyAxisEvent; import com.jme3.input.event.JoyButtonEvent; import java.util.ArrayList; @@ -220,11 +221,16 @@ public class AndroidJoystickJoyInput14 { AndroidJoystick joystick = joystickIndex.get(event.getDeviceId()); if (joystick != null) { JoystickButton button = joystick.getButton(event.getKeyCode()); + boolean pressed = event.getAction() == KeyEvent.ACTION_DOWN; if (button != null) { - boolean pressed = event.getAction() == KeyEvent.ACTION_DOWN; JoyButtonEvent buttonEvent = new JoyButtonEvent(button, pressed); joyInput.addEvent(buttonEvent); consumed = true; + } else { + JoystickButton newButton = joystick.addButton(event.getKeyCode()); + JoyButtonEvent buttonEvent = new JoyButtonEvent(newButton, pressed); + joyInput.addEvent(buttonEvent); + consumed = true; } } @@ -273,44 +279,50 @@ public class AndroidJoystickJoyInput14 { // logger.log(Level.FINE, "Adding button: {0}", keyCode); String name = KeyEvent.keyCodeToString(keyCode); - String logicalId = KeyEvent.keyCodeToString(keyCode); + String original = KeyEvent.keyCodeToString(keyCode); // A/B/X/Y buttons if (keyCode == KeyEvent.KEYCODE_BUTTON_Y) { - logicalId = JoystickButton.BUTTON_0; - } else if (keyCode == KeyEvent.KEYCODE_BUTTON_A) { - logicalId = JoystickButton.BUTTON_2; + original = JoystickButton.BUTTON_0; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_B) { - logicalId = JoystickButton.BUTTON_1; + original = JoystickButton.BUTTON_1; + } else if (keyCode == KeyEvent.KEYCODE_BUTTON_A) { + original = JoystickButton.BUTTON_2; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_X) { - logicalId = JoystickButton.BUTTON_3; + original = JoystickButton.BUTTON_3; // Front buttons Some of these have the top ones and the bottoms ones flipped. } else if (keyCode == KeyEvent.KEYCODE_BUTTON_L1) { - logicalId = JoystickButton.BUTTON_4; + original = JoystickButton.BUTTON_4; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_R1) { - logicalId = JoystickButton.BUTTON_5; + original = JoystickButton.BUTTON_5; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_L2) { - logicalId = JoystickButton.BUTTON_6; + original = JoystickButton.BUTTON_6; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_R2) { - logicalId = JoystickButton.BUTTON_7; + original = JoystickButton.BUTTON_7; // // Dpad buttons // } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { -// logicalId = JoystickButton.BUTTON_8; +// original = JoystickButton.BUTTON_8; // } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { -// logicalId = JoystickButton.BUTTON_9; +// original = JoystickButton.BUTTON_9; // } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { -// logicalId = JoystickButton.BUTTON_8; +// original = JoystickButton.BUTTON_8; // } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { -// logicalId = JoystickButton.BUTTON_9; +// original = JoystickButton.BUTTON_9; // Select and start buttons } else if (keyCode == KeyEvent.KEYCODE_BUTTON_SELECT) { - logicalId = JoystickButton.BUTTON_8; + original = JoystickButton.BUTTON_8; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_START) { - logicalId = JoystickButton.BUTTON_9; + original = JoystickButton.BUTTON_9; // Joystick push buttons } else if (keyCode == KeyEvent.KEYCODE_BUTTON_THUMBL) { - logicalId = JoystickButton.BUTTON_10; + original = JoystickButton.BUTTON_10; } else if (keyCode == KeyEvent.KEYCODE_BUTTON_THUMBR) { - logicalId = JoystickButton.BUTTON_11; + original = JoystickButton.BUTTON_11; + } + + String logicalId = JoystickCompatibilityMappings.remapComponent( getName(), original ); + if( logicalId == null ? original != null : !logicalId.equals(original) ) { + logger.log(Level.FINE, "Remapped: {0} to: {1}", + new Object[]{original, logicalId}); } JoystickButton button = new DefaultJoystickButton( getInputManager(), this, getButtonCount(), @@ -324,24 +336,25 @@ public class AndroidJoystickJoyInput14 { String name = MotionEvent.axisToString(motionRange.getAxis()); - String logicalId = MotionEvent.axisToString(motionRange.getAxis()); + String original = MotionEvent.axisToString(motionRange.getAxis()); if (motionRange.getAxis() == MotionEvent.AXIS_X) { - logicalId = JoystickAxis.X_AXIS; + original = JoystickAxis.X_AXIS; } else if (motionRange.getAxis() == MotionEvent.AXIS_Y) { - logicalId = JoystickAxis.Y_AXIS; + original = JoystickAxis.Y_AXIS; } else if (motionRange.getAxis() == MotionEvent.AXIS_Z) { - logicalId = JoystickAxis.Z_AXIS; + original = JoystickAxis.Z_AXIS; } else if (motionRange.getAxis() == MotionEvent.AXIS_RZ) { - logicalId = JoystickAxis.Z_ROTATION; + original = JoystickAxis.Z_ROTATION; } else if (motionRange.getAxis() == MotionEvent.AXIS_HAT_X) { - logicalId = JoystickAxis.POV_X; + original = JoystickAxis.POV_X; } else if (motionRange.getAxis() == MotionEvent.AXIS_HAT_Y) { - logicalId = JoystickAxis.POV_Y; + original = JoystickAxis.POV_Y; + } + String logicalId = JoystickCompatibilityMappings.remapComponent( getName(), original ); + if( logicalId == null ? original != null : !logicalId.equals(original) ) { + logger.log(Level.FINE, "Remapped: {0} to: {1}", + new Object[]{original, logicalId}); } -// String logicalId = JoystickCompatibilityMappings.remapComponent( controller.getName(), original ); -// if( name != original ) { -// logger.log(Level.FINE, "Remapped:" + original + " to:" + logicalId); -// } JoystickAxis axis = new DefaultJoystickAxis(getInputManager(), this,