From 3bf1786d02cc4e44872a6a339edc2cb589322c1e Mon Sep 17 00:00:00 2001 From: Jens Trillmann Date: Tue, 28 Jun 2022 14:10:30 +0200 Subject: [PATCH] Android A11Y: Notify android about scroll events QtQuick Flickable has an issue that after a scroll the previously hidden items are not added to the A11Y hierarchy. That happens because Android has no ways to detect that something has changed. This patch uses the ScrollingEnd event to notify Android A11Y backend that the Flickable was scrolled, so that it could update the A11Y hierarchy and add the previously hidden nodes. The ScrollingEnd event generation is added to QQuickFlickable in a separate commit. Task-number: QTBUG-103513 Change-Id: Ie6cd688d56343bcfe7ce9580c0b9244dd6d6c068 Reviewed-by: Ivan Solovev Reviewed-by: Samuel Mira Reviewed-by: Assam Boudjelthia (cherry picked from commit 3c709198838866d5122c69a30cacdc806605d0cf) Reviewed-by: Qt Cherry-pick Bot --- .../org/qtproject/qt/android/QtActivityDelegate.java | 8 ++++++++ .../jar/src/org/qtproject/qt/android/QtNative.java | 12 ++++++++++++ .../accessibility/QtAccessibilityDelegate.java | 5 +++++ .../platforms/android/androidjniaccessibility.cpp | 5 +++++ .../platforms/android/androidjniaccessibility.h | 1 + src/plugins/platforms/android/androidjnimain.cpp | 6 ++++++ src/plugins/platforms/android/androidjnimain.h | 1 + .../android/qandroidplatformaccessibility.cpp | 2 ++ 8 files changed, 40 insertions(+) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java index c36459ad3a3..b7415f22445 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -941,6 +941,14 @@ public class QtActivityDelegate m_accessibilityDelegate.notifyValueChanged(viewId, value); } + public void notifyScrolledEvent(int viewId) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyScrolledEvent(viewId); + } + + public void notifyQtAndroidPluginRunning(boolean running) { m_isPluginRunning = running; diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java index 8140a46f113..e67990becc2 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -985,6 +985,18 @@ public class QtNative }); } + private static void notifyScrolledEvent(final int viewId) + { + runAction(new Runnable() { + @Override + public void run() { + if (m_activityDelegate != null) { + m_activityDelegate.notifyScrolledEvent(viewId); + } + } + }); + } + public static void notifyQtAndroidPluginRunning(final boolean running) { m_activityDelegate.notifyQtAndroidPluginRunning(running); diff --git a/src/android/jar/src/org/qtproject/qt/android/accessibility/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/accessibility/QtAccessibilityDelegate.java index b53a04a685a..23d021b785b 100644 --- a/src/android/jar/src/org/qtproject/qt/android/accessibility/QtAccessibilityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/accessibility/QtAccessibilityDelegate.java @@ -159,6 +159,11 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate return true; } + public void notifyScrolledEvent(int viewId) + { + sendEventForVirtualViewId(viewId, AccessibilityEvent.TYPE_VIEW_SCROLLED); + } + public void notifyLocationChange(int viewId) { if (m_focusedVirtualViewId == viewId) diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index dbb85ab023e..3067cb178a3 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -131,6 +131,11 @@ namespace QtAndroidAccessibility QtAndroid::notifyValueChanged(accessibilityObjectId, value); } + void notifyScrolledEvent(uint accessiblityObjectId) + { + QtAndroid::notifyScrolledEvent(accessiblityObjectId); + } + static QVarLengthArray childIdListForAccessibleObject_helper(int objectId) { QAccessibleInterface *iface = interfaceFromId(objectId); diff --git a/src/plugins/platforms/android/androidjniaccessibility.h b/src/plugins/platforms/android/androidjniaccessibility.h index 94e64762e44..9bbbe80fe98 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.h +++ b/src/plugins/platforms/android/androidjniaccessibility.h @@ -19,6 +19,7 @@ namespace QtAndroidAccessibility void notifyObjectHide(uint accessibilityObjectId); void notifyObjectFocus(uint accessibilityObjectId); void notifyValueChanged(uint accessibilityObjectId); + void notifyScrolledEvent(uint accessibilityObjectId); void createAccessibilityContextObject(QObject *parent); } diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index fee7c438e51..9817fcabe76 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -198,6 +198,12 @@ namespace QtAndroid "(ILjava/lang/String;)V", accessibilityObjectId, value); } + void notifyScrolledEvent(uint accessibilityObjectId) + { + QJniObject::callStaticMethod(m_applicationClass, "notifyScrolledEvent", "(I)V", + accessibilityObjectId); + } + void notifyQtAndroidPluginRunning(bool running) { QJniObject::callStaticMethod(m_applicationClass, "notifyQtAndroidPluginRunning","(Z)V", running); diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index 8d05e31f667..4879d7e5b20 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -69,6 +69,7 @@ namespace QtAndroid void notifyObjectHide(uint accessibilityObjectId, uint parentObjectId); void notifyObjectFocus(uint accessibilityObjectId); void notifyValueChanged(uint accessibilityObjectId, jstring value); + void notifyScrolledEvent(uint accessibilityObjectId); void notifyQtAndroidPluginRunning(bool running); const char *classErrorMsgFmt(); diff --git a/src/plugins/platforms/android/qandroidplatformaccessibility.cpp b/src/plugins/platforms/android/qandroidplatformaccessibility.cpp index 33eafd54aa3..61fc21a6bc2 100644 --- a/src/plugins/platforms/android/qandroidplatformaccessibility.cpp +++ b/src/plugins/platforms/android/qandroidplatformaccessibility.cpp @@ -32,6 +32,8 @@ void QAndroidPlatformAccessibility::notifyAccessibilityUpdate(QAccessibleEvent * QtAndroidAccessibility::notifyObjectFocus(event->uniqueId()); } else if (event->type() == QAccessible::ValueChanged) { QtAndroidAccessibility::notifyValueChanged(event->uniqueId()); + } else if (event->type() == QAccessible::ScrollingEnd) { + QtAndroidAccessibility::notifyScrolledEvent(event->uniqueId()); } }