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:
parent
1a833d82f4
commit
707388775e
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user