Android: private export GenericMotionEventListener and KeyEventListener

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 <andy.nichols@qt.io>
Reviewed-by: Tinja Paavoseppä <tinja.paavoseppa@qt.io>
(cherry picked from commit 6b105c54eee069f6ddeeac41d9f93ad533f24586)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Assam Boudjelthia 2024-06-05 17:45:28 +03:00 committed by Qt Cherry-pick Bot
parent 1a833d82f4
commit 707388775e
4 changed files with 95 additions and 82 deletions

View File

@ -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<QtAndroidPrivate::GenericMotionEventListener *> 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<QtAndroidPrivate::KeyEventListener *> 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<QtInputDelegate>::className();
return JNI_ERR;
}
if (!registerPermissionNatives(qJniEnv))
return JNI_ERR;

View File

@ -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);

View File

@ -38,66 +38,6 @@ namespace QtAndroidInput
static QPointer<QWindow> m_mouseGrabber;
GenericMotionEventListener::~GenericMotionEventListener() {}
namespace {
struct GenericMotionEventListeners {
QMutex mutex;
QList<QtAndroidInput::GenericMotionEventListener *> 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<QtAndroidInput::KeyEventListener *> 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<void *>(dispatchGenericMotionEvent)},
{"dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z", reinterpret_cast<void *>(dispatchKeyEvent)},
};
bool registerNatives(QJniEnvironment &env)

View File

@ -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);
}