From 5a278dd42a9fa6a27dca3a6ec1f8ada3c433a780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Wed, 27 Aug 2014 23:06:48 +0100 Subject: Android: Fix crash at shutdown when keyboard is visible This is a follow-up to 4c6ebe5f9e4ddc0d799a0f2bf4aef9f7e48e0dfb. Crash was still 100% reproducible for me with the previous fix. Task-number: QTBUG-40957 Change-Id: Ie59cfe4f1fc746251fe06ba96369738098b2a35f Reviewed-by: Paul Olav Tvete --- src/plugins/platforms/android/androidjniinput.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/plugins/platforms/android/androidjniinput.cpp') diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index defc59abf09..cd0659227da 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -47,6 +47,7 @@ #include #include +#include #include QT_BEGIN_NAMESPACE @@ -716,7 +717,7 @@ namespace QtAndroidInput static void keyboardVisibilityChanged(JNIEnv */*env*/, jobject /*thiz*/, jboolean /*visibility*/) { QAndroidInputContext *inputContext = QAndroidInputContext::androidInputContext(); - if (inputContext) + if (inputContext && qGuiApp) inputContext->emitInputPanelVisibleChanged(); #ifdef QT_DEBUG_ANDROID_IM_PROTOCOL qDebug() << "@@@ KEYBOARDVISIBILITYCHANGED" << inputContext; -- cgit v1.2.3 From b9a7cedb6ebd85f249f54c8688943346c7a98260 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Mon, 1 Sep 2014 13:27:23 +0200 Subject: Android: Avoid deadlock in Qt.inputMethod.visible A blocking isSoftwareKeyboardVisible() is a deadlock waiting to happen: when the android input method performs blocking metacalls from the android thread to the GUI thread all the time, we cannot block the GUI thread waiting for the android thread. Task-number: QTBUG-40750 Change-Id: I2490897b0f65e0d92214907e239b10b372d949dd Reviewed-by: Christian Stromme --- src/plugins/platforms/android/androidjniinput.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'src/plugins/platforms/android/androidjniinput.cpp') diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index cd0659227da..2c4b664487f 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -59,10 +59,10 @@ namespace QtAndroidInput static jmethodID m_showSoftwareKeyboardMethodID = 0; static jmethodID m_resetSoftwareKeyboardMethodID = 0; static jmethodID m_hideSoftwareKeyboardMethodID = 0; - static jmethodID m_isSoftwareKeyboardVisibleMethodID = 0; static jmethodID m_updateSelectionMethodID = 0; static bool m_ignoreMouseEvents = false; + static bool m_softwareKeyboardVisible = false; static QList m_touchPoints; @@ -125,15 +125,7 @@ namespace QtAndroidInput bool isSoftwareKeyboardVisible() { - AttachedJNIEnv env; - if (!env.jniEnv) - return false; - - bool visibility = env.jniEnv->CallStaticBooleanMethod(applicationClass(), m_isSoftwareKeyboardVisibleMethodID); -#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL - qDebug() << "@@@ ISSOFTWAREKEYBOARDVISIBLE" << visibility; -#endif - return visibility; + return m_softwareKeyboardVisible; } @@ -714,8 +706,9 @@ namespace QtAndroidInput false); } - static void keyboardVisibilityChanged(JNIEnv */*env*/, jobject /*thiz*/, jboolean /*visibility*/) + static void keyboardVisibilityChanged(JNIEnv */*env*/, jobject /*thiz*/, jboolean visibility) { + m_softwareKeyboardVisible = visibility; QAndroidInputContext *inputContext = QAndroidInputContext::androidInputContext(); if (inputContext && qGuiApp) inputContext->emitInputPanelVisibleChanged(); @@ -756,7 +749,6 @@ namespace QtAndroidInput GET_AND_CHECK_STATIC_METHOD(m_showSoftwareKeyboardMethodID, appClass, "showSoftwareKeyboard", "(IIIII)V"); GET_AND_CHECK_STATIC_METHOD(m_resetSoftwareKeyboardMethodID, appClass, "resetSoftwareKeyboard", "()V"); GET_AND_CHECK_STATIC_METHOD(m_hideSoftwareKeyboardMethodID, appClass, "hideSoftwareKeyboard", "()V"); - GET_AND_CHECK_STATIC_METHOD(m_isSoftwareKeyboardVisibleMethodID, appClass, "isSoftwareKeyboardVisible", "()Z"); GET_AND_CHECK_STATIC_METHOD(m_updateSelectionMethodID, appClass, "updateSelection", "(IIII)V"); return true; } -- cgit v1.2.3