From fb6274f7bcabdc617d6aa65f07b277dd42b548ae Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Wed, 18 Oct 2017 13:53:44 -0700 Subject: [PATCH] Android: Refactor onMotionEvent. This works the same, but only looks for the initial event and ignores the keyup / return to home. It handles joystick diagonals smarter, in that it ignore diagonals until the stick moves in a more cardinal direction. This fixes an odd bug where the dpad up/down were switched (thread post I think found it - https://forums.dolphin-emu.org/Thread-arm64-version-on-shield-tv-x1-local-multiplayer-not-working-d-pad-mappings?pid=379918#pid379918) --- .../dolphinemu/dialogs/MotionAlertDialog.java | 77 +++++++++---------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java index 0bd0834af5..592aee6838 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java @@ -11,7 +11,6 @@ import android.view.MotionEvent; import org.dolphinemu.dolphinemu.model.settings.view.InputBindingSetting; import org.dolphinemu.dolphinemu.utils.Log; -import java.util.ArrayList; import java.util.List; /** @@ -22,9 +21,7 @@ public final class MotionAlertDialog extends AlertDialog { // The selected input preference private final InputBindingSetting setting; - - private boolean firstEvent = true; - private final ArrayList m_values = new ArrayList<>(); + private boolean mWaitingForEvent = true; /** * Constructor @@ -39,14 +36,12 @@ public final class MotionAlertDialog extends AlertDialog this.setting = setting; } - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) + public boolean onKeyEvent(int keyCode, KeyEvent event) { Log.debug("[MotionAlertDialog] Received key event: " + event.getAction()); switch (event.getAction()) { case KeyEvent.ACTION_DOWN: - case KeyEvent.ACTION_UP: saveKeyInput(event); return true; @@ -56,9 +51,20 @@ public final class MotionAlertDialog extends AlertDialog } } + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + // Handle this key if we care about it, otherwise pass it down the framework + return onKeyEvent(event.getKeyCode(), event) || super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) + { + // Handle this event if we care about it, otherwise pass it down the framework + return onMotionEvent(event) || super.dispatchGenericMotionEvent(event); + } - // Method that will be called within dispatchGenericMotionEvent - // that handles joystick/controller movements. private boolean onMotionEvent(MotionEvent event) { if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) @@ -67,50 +73,37 @@ public final class MotionAlertDialog extends AlertDialog Log.debug("[MotionAlertDialog] Received motion event: " + event.getAction()); InputDevice input = event.getDevice(); - List motions = input.getMotionRanges(); - if (firstEvent) - { - m_values.clear(); + List motionRanges = input.getMotionRanges(); - for (InputDevice.MotionRange range : motions) + int numMovedAxis = 0; + InputDevice.MotionRange lastMovedRange = null; + char lastMovedDir = '?'; + if (mWaitingForEvent) + { + // Get only the axis that seem to have moved (more than .5) + for (InputDevice.MotionRange range : motionRanges) { - m_values.add(event.getAxisValue(range.getAxis())); + int axis = range.getAxis(); + float value = event.getAxisValue(axis); + if (Math.abs(value) > 0.5f) + { + numMovedAxis++; + lastMovedRange = range; + lastMovedDir = value < 0.0f ? '-' : '+'; + } } - firstEvent = false; - } - else - { - for (int a = 0; a < motions.size(); ++a) + // If only one axis moved, that's the winner. + if (numMovedAxis == 1) { - InputDevice.MotionRange range = motions.get(a); - - if (m_values.get(a) > (event.getAxisValue(range.getAxis()) + 0.5f)) - { - saveMotionInput(input, range, '-'); - } - else if (m_values.get(a) < (event.getAxisValue(range.getAxis()) - 0.5f)) - { - saveMotionInput(input, range, '+'); - } + mWaitingForEvent = false; + saveMotionInput(input, lastMovedRange, lastMovedDir); } } return true; } - @Override - public boolean dispatchKeyEvent(KeyEvent event) - { - return onKeyDown(event.getKeyCode(), event) || super.dispatchKeyEvent(event); - } - - @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) - { - return onMotionEvent(event) || super.dispatchGenericMotionEvent(event); - } - /** * Saves the provided key input setting both to the INI file (so native code can use it) and as * an Android preference (so it persists correctly and is human-readable.)