Bug 1364267 - Prevent Android gamepad from dropping axis values r=ted
MozReview-Commit-ID: 3G5xwPKD4mq
--- a/dom/gamepad/android/AndroidGamepad.cpp
+++ b/dom/gamepad/android/AndroidGamepad.cpp
@@ -60,17 +60,19 @@ public:
return;
}
const auto& valid = aValid->GetElements();
const auto& values = aValues->GetElements();
MOZ_ASSERT(valid.Length() == values.Length());
for (size_t i = 0; i < values.Length(); i++) {
- service->NewAxisMoveEvent(aID, i, values[i]);
+ if (valid[i]) {
+ service->NewAxisMoveEvent(aID, i, values[i]);
+ }
}
}
};
void StartGamepadMonitoring()
{
AndroidGamepadManager::Init();
java::AndroidGamepadManager::Start();
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/AndroidGamepadManager.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/AndroidGamepadManager.java
@@ -124,21 +124,21 @@ public class AndroidGamepadManager {
MotionEvent.AXIS_GAS};
} else {
triggerAxes = null;
}
}
}
}
- @WrapForJNI(calledFrom = "ui", dispatchTo = "gecko_priority")
+ @WrapForJNI(calledFrom = "ui")
private static native void onGamepadChange(int id, boolean added);
- @WrapForJNI(calledFrom = "ui", dispatchTo = "gecko_priority")
+ @WrapForJNI(calledFrom = "ui")
private static native void onButtonChange(int id, int button, boolean pressed, float value);
- @WrapForJNI(calledFrom = "ui", dispatchTo = "gecko_priority")
+ @WrapForJNI(calledFrom = "ui")
private static native void onAxisChange(int id, boolean[] valid, float[] values);
private static boolean sStarted;
private static final SparseArray<Gamepad> sGamepads = new SparseArray<>();
private static final SparseArray<List<KeyEvent>> sPendingGamepads = new SparseArray<>();
private static InputManager.InputDeviceListener sListener;
private static Timer sPollTimer;
@@ -179,17 +179,17 @@ public class AndroidGamepadManager {
if (sStarted) {
removeDeviceListener();
sPendingGamepads.clear();
sGamepads.clear();
sStarted = false;
}
}
- @WrapForJNI(calledFrom = "gecko")
+ @WrapForJNI
private static void onGamepadAdded(final int device_id, final int service_id) {
ThreadUtils.postToUiThread(new Runnable() {
@Override
public void run() {
handleGamepadAdded(device_id, service_id);
}
});
}
--- a/widget/android/GeneratedJNIWrappers.h
+++ b/widget/android/GeneratedJNIWrappers.h
@@ -31,17 +31,17 @@ public:
static constexpr char signature[] =
"(I[Z[F)V";
static const bool isStatic = true;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
static const mozilla::jni::CallingThread callingThread =
mozilla::jni::CallingThread::UI;
static const mozilla::jni::DispatchTarget dispatchTarget =
- mozilla::jni::DispatchTarget::GECKO_PRIORITY;
+ mozilla::jni::DispatchTarget::CURRENT;
};
struct OnButtonChange_t {
typedef AndroidGamepadManager Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
int32_t,
@@ -52,34 +52,34 @@ public:
static constexpr char signature[] =
"(IIZF)V";
static const bool isStatic = true;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
static const mozilla::jni::CallingThread callingThread =
mozilla::jni::CallingThread::UI;
static const mozilla::jni::DispatchTarget dispatchTarget =
- mozilla::jni::DispatchTarget::GECKO_PRIORITY;
+ mozilla::jni::DispatchTarget::CURRENT;
};
struct OnGamepadAdded_t {
typedef AndroidGamepadManager Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
int32_t,
int32_t> Args;
static constexpr char name[] = "onGamepadAdded";
static constexpr char signature[] =
"(II)V";
static const bool isStatic = true;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
static const mozilla::jni::CallingThread callingThread =
- mozilla::jni::CallingThread::GECKO;
+ mozilla::jni::CallingThread::ANY;
static const mozilla::jni::DispatchTarget dispatchTarget =
mozilla::jni::DispatchTarget::CURRENT;
};
static auto OnGamepadAdded(int32_t, int32_t) -> void;
struct OnGamepadChange_t {
typedef AndroidGamepadManager Owner;
@@ -92,17 +92,17 @@ public:
static constexpr char signature[] =
"(IZ)V";
static const bool isStatic = true;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
static const mozilla::jni::CallingThread callingThread =
mozilla::jni::CallingThread::UI;
static const mozilla::jni::DispatchTarget dispatchTarget =
- mozilla::jni::DispatchTarget::GECKO_PRIORITY;
+ mozilla::jni::DispatchTarget::CURRENT;
};
struct Start_t {
typedef AndroidGamepadManager Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<> Args;
static constexpr char name[] = "start";