From 1ed146347681e58adebaf727dc9349e29bf104ea Mon Sep 17 00:00:00 2001 From: iwgeric Date: Fri, 12 Dec 2014 12:48:25 -0500 Subject: [PATCH] Add support for enabling/disabling KeyEvent simulation for soft keyboards on Android similar to MouseEvents. --- .../java/com/jme3/app/AndroidHarness.java | 5 +++ .../input/android/AndroidInputHandler.java | 7 ++-- .../jme3/input/android/AndroidKeyHandler.java | 30 +++++++++-------- .../java/com/jme3/system/AppSettings.java | 32 +++++++++++++++---- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/jme3-android/src/main/java/com/jme3/app/AndroidHarness.java b/jme3-android/src/main/java/com/jme3/app/AndroidHarness.java index d8dc6e7e9..92713c666 100644 --- a/jme3-android/src/main/java/com/jme3/app/AndroidHarness.java +++ b/jme3-android/src/main/java/com/jme3/app/AndroidHarness.java @@ -107,6 +107,10 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt * JoyAxisTriggers. */ protected boolean joystickEventsEnabled = false; + /** + * If true KeyEvents are generated from TouchEvents + */ + protected boolean keyEventsEnabled = true; /** * If true MouseEvents are generated from TouchEvents */ @@ -224,6 +228,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt settings.setEmulateMouse(mouseEventsEnabled); settings.setEmulateMouseFlipAxis(mouseEventsInvertX, mouseEventsInvertY); settings.setUseJoysticks(joystickEventsEnabled); + settings.setEmulateKeyboard(keyEventsEnabled); settings.setBitsPerPixel(eglBitsPerPixel); settings.setAlphaBits(eglAlphaBits); diff --git a/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler.java b/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler.java index 94f124d0a..be5989f32 100644 --- a/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler.java +++ b/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler.java @@ -136,8 +136,7 @@ public class AndroidInputHandler implements TouchInput { } public void loadSettings(AppSettings settings) { - // TODO: add simulate keyboard to settings -// keyboardEventsEnabled = true; + keyboardEventsEnabled = settings.isEmulateKeyboard(); mouseEventsEnabled = settings.isEmulateMouse(); mouseEventsInvertX = settings.isEmulateMouseFlipX(); mouseEventsInvertY = settings.isEmulateMouseFlipY(); @@ -259,6 +258,10 @@ public class AndroidInputHandler implements TouchInput { this.keyboardEventsEnabled = simulate; } + public boolean isSimulateKeyboard() { + return keyboardEventsEnabled; + } + public void setOmitHistoricEvents(boolean dontSendHistory) { this.dontSendHistory = dontSendHistory; } diff --git a/jme3-android/src/main/java/com/jme3/input/android/AndroidKeyHandler.java b/jme3-android/src/main/java/com/jme3/input/android/AndroidKeyHandler.java index 68edf1469..997974c31 100644 --- a/jme3-android/src/main/java/com/jme3/input/android/AndroidKeyHandler.java +++ b/jme3-android/src/main/java/com/jme3/input/android/AndroidKeyHandler.java @@ -108,20 +108,21 @@ public class AndroidKeyHandler implements View.OnKeyListener { } - - KeyInputEvent kie; - char unicodeChar = (char)event.getUnicodeChar(); - int jmeKeyCode = AndroidKeyMapping.getJmeKey(keyCode); - - boolean pressed = event.getAction() == KeyEvent.ACTION_DOWN; - boolean repeating = pressed && event.getRepeatCount() > 0; - - kie = new KeyInputEvent(jmeKeyCode, unicodeChar, pressed, repeating); - kie.setTime(event.getEventTime()); - androidInput.addEvent(kie); -// logger.log(Level.FINE, "onKey keyCode: {0}, jmeKeyCode: {1}, pressed: {2}, repeating: {3}", -// new Object[]{keyCode, jmeKeyCode, pressed, repeating}); -// logger.log(Level.FINE, "creating KeyInputEvent: {0}", kie); + if (androidInput.isSimulateKeyboard()) { + KeyInputEvent kie; + char unicodeChar = (char)event.getUnicodeChar(); + int jmeKeyCode = AndroidKeyMapping.getJmeKey(keyCode); + + boolean pressed = event.getAction() == KeyEvent.ACTION_DOWN; + boolean repeating = pressed && event.getRepeatCount() > 0; + + kie = new KeyInputEvent(jmeKeyCode, unicodeChar, pressed, repeating); + kie.setTime(event.getEventTime()); + androidInput.addEvent(kie); +// logger.log(Level.FINE, "onKey keyCode: {0}, jmeKeyCode: {1}, pressed: {2}, repeating: {3}", +// new Object[]{keyCode, jmeKeyCode, pressed, repeating}); +// logger.log(Level.FINE, "creating KeyInputEvent: {0}", kie); + } // consume all keys ourself except Volume Up/Down and Menu // Don't do Menu so that typical Android Menus can be created and used @@ -133,6 +134,7 @@ public class AndroidKeyHandler implements View.OnKeyListener { } else { return true; } + } } diff --git a/jme3-core/src/main/java/com/jme3/system/AppSettings.java b/jme3-core/src/main/java/com/jme3/system/AppSettings.java index 7c9a99923..0c8f56bd9 100644 --- a/jme3-core/src/main/java/com/jme3/system/AppSettings.java +++ b/jme3-core/src/main/java/com/jme3/system/AppSettings.java @@ -90,10 +90,10 @@ public final class AppSettings extends HashMap { /** * Use the Android MediaPlayer / SoundPool based renderer for Android audio capabilities. *

- * NOTE: Supports Android 2.2+ platforms. + * NOTE: Supports Android 2.2+ platforms. * * @see AppSettings#setAudioRenderer(java.lang.String) - * @deprecated This audio renderer has too many limitations. + * @deprecated This audio renderer has too many limitations. * use {@link #ANDROID_OPENAL_SOFT} instead. */ @Deprecated @@ -455,6 +455,26 @@ public final class AppSettings extends HashMap { return getBoolean("TouchEmulateMouseFlipY"); } + /** + * Enable or disable keyboard emulation on touchscreen based devices. + * This will convert soft keyboard key presses on the touchscreen + * into the appropriate key events. + * + * @param emulateKeyboard If soft keyboard emulation should be enabled. + */ + public void setEmulateKeyboard(boolean emulateKeyboard) { + putBoolean("TouchEmulateKeyboard", emulateKeyboard); + } + + /** + * Returns true if keyboard emulation is enabled, false otherwise. + * + * @return Soft keyboard emulation mode. + */ + public boolean isEmulateKeyboard() { + return getBoolean("TouchEmulateKeyboard"); + } + /** * @param frameRate The frame-rate is the upper limit on how high * the application's frames-per-second can go. @@ -731,12 +751,12 @@ public final class AppSettings extends HashMap { public void setSettingsDialogImage(String path) { putString("SettingsDialogImage", path); } - + /** * Enables Gamma Correction - * This requires that the GPU supports GL_ARB_framebuffer_sRGB and will + * This requires that the GPU supports GL_ARB_framebuffer_sRGB and will * disabled otherwise. - * @param gammaCorrection + * @param gammaCorrection * (Default : true) */ public void setGammaCorrection(boolean gammaCorrection) { @@ -911,7 +931,7 @@ public final class AppSettings extends HashMap { public String getSettingsDialogImage() { return getString("SettingsDialogImage"); } - + public boolean getGammaCorrection() { return getBoolean("GammaCorrection"); }