From 90c85b880e38a10cde7d22437c19f7ac7eea3f7d Mon Sep 17 00:00:00 2001 From: Vikke Matikainen Date: Mon, 24 Feb 2020 11:58:03 +0200 Subject: [PATCH] Android: Fix android accessibility not being set active Android platform event of activating accessibility might be received, before the platform plugin is initialized, thus disregarding the activation step. This change saves the activation event state and defers setting it in platform integration. Fixes: QTBUG-77320 Change-Id: I06aab76159d1de0e72c0c535dbe80c2858f8e79b Reviewed-by: Volker Hilsheimer (cherry picked from commit b1433a6988d79c162ab5bed116be1ffeedca2ea9) Reviewed-by: Qt Cherry-pick Bot --- .../platforms/android/androidjniaccessibility.cpp | 10 +++++++++- .../platforms/android/androidjniaccessibility.h | 1 + .../platforms/android/qandroidplatformintegration.cpp | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index 309e41bfd6f..6f1178e0416 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -72,20 +72,28 @@ namespace QtAndroidAccessibility static jmethodID m_setTextSelectionMethodID = 0; static jmethodID m_setVisibleToUserMethodID = 0; + static bool m_accessibilityActivated = false; + void initialize() { QJNIObjectPrivate::callStaticMethod(QtAndroid::applicationClass(), "initializeAccessibility"); } + bool isActive() + { + return m_accessibilityActivated; + } + static void setActive(JNIEnv */*env*/, jobject /*thiz*/, jboolean active) { QMutexLocker lock(QtAndroid::platformInterfaceMutex()); QAndroidPlatformIntegration *platformIntegration = QtAndroid::androidPlatformIntegration(); + m_accessibilityActivated = active; if (platformIntegration) platformIntegration->accessibility()->setActive(active); else - __android_log_print(ANDROID_LOG_WARN, m_qtTag, "Could not activate platform accessibility."); + __android_log_print(ANDROID_LOG_WARN, m_qtTag, "Could not (yet) activate platform accessibility."); } QAccessibleInterface *interfaceFromId(jint objectId) diff --git a/src/plugins/platforms/android/androidjniaccessibility.h b/src/plugins/platforms/android/androidjniaccessibility.h index f393ce0b08f..508ed4462b5 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.h +++ b/src/plugins/platforms/android/androidjniaccessibility.h @@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE namespace QtAndroidAccessibility { void initialize(); + bool isActive(); bool registerNatives(JNIEnv *env); } diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index e0c437be278..ff59ca6bdee 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -52,6 +52,7 @@ #include #include "androidjnimain.h" +#include "androidjniaccessibility.h" #include "qabstracteventdispatcher.h" #include "qandroideventdispatcher.h" #include "qandroidplatformbackingstore.h" @@ -149,6 +150,12 @@ void QAndroidPlatformNativeInterface::customEvent(QEvent *event) QMutexLocker lock(QtAndroid::platformInterfaceMutex()); QAndroidPlatformIntegration *api = static_cast(QGuiApplicationPrivate::platformIntegration()); QtAndroid::setAndroidPlatformIntegration(api); + +#ifndef QT_NO_ACCESSIBILITY + // Android accessibility activation event might have been already received + api->accessibility()->setActive(QtAndroidAccessibility::isActive()); +#endif // QT_NO_ACCESSIBILITY + api->flushPendingUpdates(); }