SDL: Android: Skip duplicated joystick axes during poll (59769)

From 597694e4a1bbc675c5c3931649c6661a6ebe1b25 Mon Sep 17 00:00:00 2001
From: NY00123 <[EMAIL REDACTED]>
Date: Mon, 25 May 2026 00:10:18 +0300
Subject: [PATCH] Android: Skip duplicated joystick axes during poll

Resolves https://github.com/libsdl-org/SDL/issues/15414

(cherry picked from commit 199d509820ae3c72dab4cbbacdc8cd5c4bc1285c)
---
 .../app/src/main/java/org/libsdl/app/SDLControllerManager.java | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java
index a41467c61d06d..8681d050b72b6 100644
--- a/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java
+++ b/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java
@@ -242,12 +242,13 @@ synchronized void pollInputDevices() {
                     joystick.desc = getJoystickDescriptor(joystickDevice);
                     joystick.axes = new ArrayList<InputDevice.MotionRange>();
                     joystick.hats = new ArrayList<InputDevice.MotionRange>();
+                    java.util.Set<Integer> axisStrsSet = new java.util.HashSet<Integer>();
                     joystick.lights = new ArrayList<Light>();
 
                     List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();
                     Collections.sort(ranges, new RangeComparator());
                     for (InputDevice.MotionRange range : ranges) {
-                        if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
+                        if (((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) && axisStrsSet.add(range.getAxis())) {
                             if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {
                                 joystick.hats.add(range);
                             } else {