summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorMike Harris <atarimike@gmail.com>2017-10-18 13:53:44 -0700
committerMike Harris <atarimike@gmail.com>2017-10-21 13:01:13 -0700
commitfb6274f7bcabdc617d6aa65f07b277dd42b548ae (patch)
treea167307c56044d96a01c14a5719923c109ff43ae /Source/Android/app/src/main/java
parentb8d45ad4bede7d2cbf6cf4b5e32a89f7474cab0c (diff)
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)
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java77
1 files 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<Float> 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<InputDevice.MotionRange> motions = input.getMotionRanges();
- if (firstEvent)
- {
- m_values.clear();
+ List<InputDevice.MotionRange> motionRanges = input.getMotionRanges();
- for (InputDevice.MotionRange range : motions)
- {
- m_values.add(event.getAxisValue(range.getAxis()));
- }
-
- firstEvent = false;
- }
- else
+ int numMovedAxis = 0;
+ InputDevice.MotionRange lastMovedRange = null;
+ char lastMovedDir = '?';
+ if (mWaitingForEvent)
{
- for (int a = 0; a < motions.size(); ++a)
+ // Get only the axis that seem to have moved (more than .5)
+ for (InputDevice.MotionRange range : motionRanges)
{
- 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))
+ int axis = range.getAxis();
+ float value = event.getAxisValue(axis);
+ if (Math.abs(value) > 0.5f)
{
- saveMotionInput(input, range, '+');
+ numMovedAxis++;
+ lastMovedRange = range;
+ lastMovedDir = value < 0.0f ? '-' : '+';
}
}
+
+ // If only one axis moved, that's the winner.
+ if (numMovedAxis == 1)
+ {
+ 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.)