diff --git a/packages/gamepads/lib/src/mappings/android_mapping.dart b/packages/gamepads/lib/src/mappings/android_mapping.dart index f1e865b4f..f57344b6e 100644 --- a/packages/gamepads/lib/src/mappings/android_mapping.dart +++ b/packages/gamepads/lib/src/mappings/android_mapping.dart @@ -78,12 +78,15 @@ class AndroidMapping extends PlatformMapping { ]; } if (key == _dpadYAxis) { + // gamepads_android's EventListener already inverts AXIS_HAT_Y, so the + // value reaching here follows up = +1.0, down = -1.0 (the opposite of + // Android's native AXIS_HAT_Y convention). See issue #123. return [ NormalizedButton( GamepadButton.dpadDown, - value > 0 ? 1.0 : 0.0, + value < 0 ? 1.0 : 0.0, ), - NormalizedButton(GamepadButton.dpadUp, value < 0 ? 1.0 : 0.0), + NormalizedButton(GamepadButton.dpadUp, value > 0 ? 1.0 : 0.0), ]; } return const []; diff --git a/packages/gamepads/test/mappings_test.dart b/packages/gamepads/test/mappings_test.dart index 739eb8267..4e836456e 100644 --- a/packages/gamepads/test/mappings_test.dart +++ b/packages/gamepads/test/mappings_test.dart @@ -245,8 +245,16 @@ void main() { expect(right[1].button, GamepadButton.dpadRight); expect(right[1].value, 1.0); - // Android hat Y: positive = down - final down = mapping.normalizeDpadAxis('AXIS_HAT_Y', 1.0); + // gamepads_android's EventListener inverts AXIS_HAT_Y before it reaches + // the mapping, so +1.0 = up and -1.0 = down here (regression for #123: + // pressing up must emit dpadUp, not dpadDown). + final up = mapping.normalizeDpadAxis('AXIS_HAT_Y', 1.0); + expect(up[0].button, GamepadButton.dpadDown); + expect(up[0].value, 0.0); + expect(up[1].button, GamepadButton.dpadUp); + expect(up[1].value, 1.0); + + final down = mapping.normalizeDpadAxis('AXIS_HAT_Y', -1.0); expect(down[0].button, GamepadButton.dpadDown); expect(down[0].value, 1.0); expect(down[1].button, GamepadButton.dpadUp);