From 707388775e48869978d5140d10450bcd57a19c48 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Wed, 5 Jun 2024 17:45:28 +0300 Subject: [PATCH] Android: private export GenericMotionEventListener and KeyEventListener MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Partially reverts ac7f22ed0a4bb25146b87c0f6be54323909ea401. Bring back the following to qjnihelpers_p.h so they can be exported as private APIs used to handle event listeners. * GenericMotionEventListener and KeyEventListener * register and unregister listener calls Task-number: QTBUG-118077 Change-Id: I5b9c7073801f0b1305237184bb2ab91678e1b1b1 Reviewed-by: Andy Nichols Reviewed-by: Tinja Paavoseppä (cherry picked from commit 6b105c54eee069f6ddeeac41d9f93ad533f24586) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qjnihelpers.cpp | 75 +++++++++++++++++++ src/corelib/kernel/qjnihelpers_p.h | 20 +++++ .../platforms/android/androidjniinput.cpp | 62 --------------- .../platforms/android/androidjniinput.h | 20 ----- 4 files changed, 95 insertions(+), 82 deletions(-) diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index d900b74d373..4d5ccd7d9b1 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -18,6 +18,10 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_JNI_CLASS(QtInputDelegate, "org/qtproject/qt/android/QtInputDelegate"); +Q_DECLARE_JNI_CLASS(MotionEvent, "android/view/MotionEvent"); +Q_DECLARE_JNI_CLASS(KeyEvent, "android/view/KeyEvent"); + namespace QtAndroidPrivate { // *Listener virtual function implementations. // Defined out-of-line to pin the vtable/type_info. @@ -141,6 +145,68 @@ void QtAndroidPrivate::handleNewIntent(JNIEnv *env, jobject intent) } } +QtAndroidPrivate::GenericMotionEventListener::~GenericMotionEventListener() {} +namespace { +struct GenericMotionEventListeners { + QMutex mutex; + QList listeners; +}; +} +Q_GLOBAL_STATIC(GenericMotionEventListeners, g_genericMotionEventListeners) + +static jboolean dispatchGenericMotionEvent(JNIEnv *, jclass, QtJniTypes::MotionEvent event) +{ + jboolean ret = JNI_FALSE; + QMutexLocker locker(&g_genericMotionEventListeners()->mutex); + for (auto *listener : std::as_const(g_genericMotionEventListeners()->listeners)) + ret |= listener->handleGenericMotionEvent(event.object()); + return ret; +} +Q_DECLARE_JNI_NATIVE_METHOD(dispatchGenericMotionEvent); + +QtAndroidPrivate::KeyEventListener::~KeyEventListener() {} +namespace { +struct KeyEventListeners { + QMutex mutex; + QList listeners; +}; +} +Q_GLOBAL_STATIC(KeyEventListeners, g_keyEventListeners) + +static jboolean dispatchKeyEvent(JNIEnv *, jclass, QtJniTypes::KeyEvent event) +{ + jboolean ret = JNI_FALSE; + QMutexLocker locker(&g_keyEventListeners()->mutex); + for (auto *listener : std::as_const(g_keyEventListeners()->listeners)) + ret |= listener->handleKeyEvent(event.object()); + return ret; +} +Q_DECLARE_JNI_NATIVE_METHOD(dispatchKeyEvent); + +void QtAndroidPrivate::registerGenericMotionEventListener(QtAndroidPrivate::GenericMotionEventListener *listener) +{ + QMutexLocker locker(&g_genericMotionEventListeners()->mutex); + g_genericMotionEventListeners()->listeners.push_back(listener); +} + +void QtAndroidPrivate::unregisterGenericMotionEventListener(QtAndroidPrivate::GenericMotionEventListener *listener) +{ + QMutexLocker locker(&g_genericMotionEventListeners()->mutex); + g_genericMotionEventListeners()->listeners.removeOne(listener); +} + +void QtAndroidPrivate::registerKeyEventListener(QtAndroidPrivate::KeyEventListener *listener) +{ + QMutexLocker locker(&g_keyEventListeners()->mutex); + g_keyEventListeners()->listeners.push_back(listener); +} + +void QtAndroidPrivate::unregisterKeyEventListener(QtAndroidPrivate::KeyEventListener *listener) +{ + QMutexLocker locker(&g_keyEventListeners()->mutex); + g_keyEventListeners()->listeners.removeOne(listener); +} + namespace { class ResumePauseListeners { @@ -245,6 +311,15 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env) return JNI_ERR; QJniEnvironment qJniEnv; + using namespace QtJniTypes; + if (!QtInputDelegate::registerNativeMethods( + { Q_JNI_NATIVE_METHOD(dispatchGenericMotionEvent), + Q_JNI_NATIVE_METHOD(dispatchKeyEvent) })) { + qCritical() << "Failed to register natives methods for" + << Traits::className(); + return JNI_ERR; + } + if (!registerPermissionNatives(qJniEnv)) return JNI_ERR; diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h index b5e05fcaf11..a7b879d9e12 100644 --- a/src/corelib/kernel/qjnihelpers_p.h +++ b/src/corelib/kernel/qjnihelpers_p.h @@ -56,6 +56,20 @@ namespace QtAndroidPrivate virtual jobject onBind(jobject intent) = 0; }; + class Q_CORE_EXPORT GenericMotionEventListener + { + public: + virtual ~GenericMotionEventListener(); + virtual bool handleGenericMotionEvent(jobject event) = 0; + }; + + class Q_CORE_EXPORT KeyEventListener + { + public: + virtual ~KeyEventListener(); + virtual bool handleKeyEvent(jobject event) = 0; + }; + Q_CORE_EXPORT QtJniTypes::Activity activity(); Q_CORE_EXPORT QtJniTypes::Service service(); Q_CORE_EXPORT QtJniTypes::Context context(); @@ -77,6 +91,12 @@ namespace QtAndroidPrivate Q_CORE_EXPORT void registerNewIntentListener(NewIntentListener *listener); Q_CORE_EXPORT void unregisterNewIntentListener(NewIntentListener *listener); + Q_CORE_EXPORT void registerGenericMotionEventListener(GenericMotionEventListener *listener); + Q_CORE_EXPORT void unregisterGenericMotionEventListener(GenericMotionEventListener *listener); + + Q_CORE_EXPORT void registerKeyEventListener(KeyEventListener *listener); + Q_CORE_EXPORT void unregisterKeyEventListener(KeyEventListener *listener); + Q_CORE_EXPORT void handlePause(); Q_CORE_EXPORT void handleResume(); Q_CORE_EXPORT void registerResumePauseListener(ResumePauseListener *listener); diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index 266d027b3c1..07f2786cc63 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -38,66 +38,6 @@ namespace QtAndroidInput static QPointer m_mouseGrabber; - GenericMotionEventListener::~GenericMotionEventListener() {} - namespace { - struct GenericMotionEventListeners { - QMutex mutex; - QList listeners; - }; - } - Q_GLOBAL_STATIC(GenericMotionEventListeners, g_genericMotionEventListeners) - - static jboolean dispatchGenericMotionEvent(JNIEnv *, jclass, jobject event) - { - jboolean ret = JNI_FALSE; - QMutexLocker locker(&g_genericMotionEventListeners()->mutex); - for (auto *listener : std::as_const(g_genericMotionEventListeners()->listeners)) - ret |= listener->handleGenericMotionEvent(event); - return ret; - } - - KeyEventListener::~KeyEventListener() {} - namespace { - struct KeyEventListeners { - QMutex mutex; - QList listeners; - }; - } - Q_GLOBAL_STATIC(KeyEventListeners, g_keyEventListeners) - - static jboolean dispatchKeyEvent(JNIEnv *, jclass, jobject event) - { - jboolean ret = JNI_FALSE; - QMutexLocker locker(&g_keyEventListeners()->mutex); - for (auto *listener : std::as_const(g_keyEventListeners()->listeners)) - ret |= listener->handleKeyEvent(event); - return ret; - } - - void registerGenericMotionEventListener(QtAndroidInput::GenericMotionEventListener *listener) - { - QMutexLocker locker(&g_genericMotionEventListeners()->mutex); - g_genericMotionEventListeners()->listeners.push_back(listener); - } - - void unregisterGenericMotionEventListener(QtAndroidInput::GenericMotionEventListener *listener) - { - QMutexLocker locker(&g_genericMotionEventListeners()->mutex); - g_genericMotionEventListeners()->listeners.removeOne(listener); - } - - void registerKeyEventListener(QtAndroidInput::KeyEventListener *listener) - { - QMutexLocker locker(&g_keyEventListeners()->mutex); - g_keyEventListeners()->listeners.push_back(listener); - } - - void unregisterKeyEventListener(QtAndroidInput::KeyEventListener *listener) - { - QMutexLocker locker(&g_keyEventListeners()->mutex); - g_keyEventListeners()->listeners.removeOne(listener); - } - QJniObject qtLayout() { AndroidBackendRegister *reg = QtAndroid::backendRegister(); @@ -978,8 +918,6 @@ namespace QtAndroidInput {"keyboardVisibilityChanged", "(Z)V", (void *)keyboardVisibilityChanged}, {"keyboardGeometryChanged", "(IIII)V", (void *)keyboardGeometryChanged}, {"handleLocationChanged", "(III)V", (void *)handleLocationChanged}, - {"dispatchGenericMotionEvent", "(Landroid/view/MotionEvent;)Z", reinterpret_cast(dispatchGenericMotionEvent)}, - {"dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z", reinterpret_cast(dispatchKeyEvent)}, }; bool registerNatives(QJniEnvironment &env) diff --git a/src/plugins/platforms/android/androidjniinput.h b/src/plugins/platforms/android/androidjniinput.h index 28a2665bf64..629b2937f04 100644 --- a/src/plugins/platforms/android/androidjniinput.h +++ b/src/plugins/platforms/android/androidjniinput.h @@ -31,26 +31,6 @@ namespace QtAndroidInput QPoint cursor = QPoint(), QPoint anchor = QPoint(), bool rtl = false); int getSelectHandleWidth(); - class GenericMotionEventListener - { - public: - virtual ~GenericMotionEventListener(); - virtual bool handleGenericMotionEvent(jobject event) = 0; - }; - - class KeyEventListener - { - public: - virtual ~KeyEventListener(); - virtual bool handleKeyEvent(jobject event) = 0; - }; - - void registerGenericMotionEventListener(GenericMotionEventListener *listener); - void unregisterGenericMotionEventListener(GenericMotionEventListener *listener); - - void registerKeyEventListener(KeyEventListener *listener); - void unregisterKeyEventListener(KeyEventListener *listener); - bool registerNatives(QJniEnvironment &env); }