Android: Propagate a11y ObjectShow events to screen reader

Sending an ObjectShow event, e.g. by setting QQuickItem::visible to
true, has to trigger a refresh of the screen reader hierarchy. If the
signal is ignored the source of the signal will be ignored by the
screen reader.

Fixes: QTBUG-122436
Pick-to: 6.5
Change-Id: I32ee2e8b2602cd0dd9b9a83ff1fe426d88d137a8
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit efd00066b42d9cbd3a85336f4851213d94cdc28e)
This commit is contained in:
Jens Trillmann 2024-02-19 09:10:46 +01:00
parent 5eecb650f6
commit 56c8ed47a1
7 changed files with 33 additions and 0 deletions

View File

@ -176,6 +176,14 @@ abstract class QtActivityDelegateBase
m_accessibilityDelegate.notifyObjectHide(viewId, parentId);
}
@UsedFromNativeCode
public void notifyObjectShow(int parentId)
{
if (m_accessibilityDelegate == null)
return;
m_accessibilityDelegate.notifyObjectShow(parentId);
}
@UsedFromNativeCode
public void notifyObjectFocus(int viewId)
{

View File

@ -191,6 +191,15 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
});
}
public void notifyObjectShow(int parentId)
{
QtNative.runAction(() -> {
// When the object is shown, we need to notify its parent about
// content change, not the shown object itself
invalidateVirtualViewId(parentId);
});
}
public void notifyObjectFocus(int viewId)
{
QtNative.runAction(() -> {

View File

@ -127,6 +127,12 @@ namespace QtAndroidAccessibility
QtAndroid::notifyObjectHide(accessibilityObjectId, parentObjectId);
}
void notifyObjectShow(uint accessibilityObjectId)
{
const auto parentObjectId = parentId_helper(accessibilityObjectId);
QtAndroid::notifyObjectShow(parentObjectId);
}
void notifyObjectFocus(uint accessibilityObjectId)
{
QtAndroid::notifyObjectFocus(accessibilityObjectId);

View File

@ -18,6 +18,7 @@ namespace QtAndroidAccessibility
bool registerNatives(QJniEnvironment &env);
void notifyLocationChange(uint accessibilityObjectId);
void notifyObjectHide(uint accessibilityObjectId);
void notifyObjectShow(uint accessibilityObjectId);
void notifyObjectFocus(uint accessibilityObjectId);
void notifyValueChanged(uint accessibilityObjectId);
void notifyScrolledEvent(uint accessibilityObjectId);

View File

@ -245,6 +245,12 @@ namespace QtAndroid
accessibilityObjectId, parentObjectId);
}
void notifyObjectShow(uint parentObjectId)
{
qtActivityDelegate().callMethod<void>("notifyObjectShow",
parentObjectId);
}
void notifyObjectFocus(uint accessibilityObjectId)
{
qtActivityDelegate().callMethod<void>("notifyObjectFocus", accessibilityObjectId);

View File

@ -65,6 +65,7 @@ namespace QtAndroid
void notifyAccessibilityLocationChange(uint accessibilityObjectId);
void notifyObjectHide(uint accessibilityObjectId, uint parentObjectId);
void notifyObjectShow(uint parentObjectId);
void notifyObjectFocus(uint accessibilityObjectId);
void notifyValueChanged(uint accessibilityObjectId, jstring value);
void notifyScrolledEvent(uint accessibilityObjectId);

View File

@ -28,6 +28,8 @@ void QAndroidPlatformAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *
QtAndroidAccessibility::notifyLocationChange(event->uniqueId());
} else if (event->type() == QAccessible::ObjectHide) {
QtAndroidAccessibility::notifyObjectHide(event->uniqueId());
} else if (event->type() == QAccessible::ObjectShow) {
QtAndroidAccessibility::notifyObjectShow(event->uniqueId());
} else if (event->type() == QAccessible::Focus) {
QtAndroidAccessibility::notifyObjectFocus(event->uniqueId());
} else if (event->type() == QAccessible::ValueChanged) {