Android A11Y: Add content change type to content change event

This fixes a problem where the accessibility tree is not correctly
updated, when using e.g. a StackView. The problem was, that sometimes
when pushing items of the previous view where still selectable via
TalkBack. When popping this sometimes lead to some views not being
selectable because the subtree wasn't updated. To solve this, lets tell
android directly that the subtree changed when invalidating a view.

Fixes: QTBUG-102825
Change-Id: Ifbf8da1b95f02935b9bcffabfe821547b1128103
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit d48ebb02fb171d0b6fe3749a28a312fc624f8b8e)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Mike Achtelik 2022-06-24 16:15:26 +02:00 committed by Qt Cherry-pick Bot
parent 3f473f4025
commit 68158a8ae9

View File

@ -227,26 +227,33 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
public boolean sendEventForVirtualViewId(int virtualViewId, int eventType) public boolean sendEventForVirtualViewId(int virtualViewId, int eventType)
{ {
if ((virtualViewId == INVALID_ID) || !m_manager.isEnabled()) { final AccessibilityEvent event = getEventForVirtualViewId(virtualViewId, eventType);
Log.w(TAG, "sendEventForVirtualViewId for invalid view"); return sendAccessibilityEvent(event);
return false;
} }
public boolean sendAccessibilityEvent(AccessibilityEvent event)
{
if (event == null)
return false;
final ViewGroup group = (ViewGroup) m_view.getParent(); final ViewGroup group = (ViewGroup) m_view.getParent();
if (group == null) { if (group == null) {
Log.w(TAG, "Could not send AccessibilityEvent because group was null. This should really not happen."); Log.w(TAG, "Could not send AccessibilityEvent because group was null. This should really not happen.");
return false; return false;
} }
final AccessibilityEvent event;
event = getEventForVirtualViewId(virtualViewId, eventType);
return group.requestSendAccessibilityEvent(m_view, event); return group.requestSendAccessibilityEvent(m_view, event);
} }
public void invalidateVirtualViewId(int virtualViewId) public void invalidateVirtualViewId(int virtualViewId)
{ {
if (virtualViewId != INVALID_ID) final AccessibilityEvent event = getEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
if (event == null)
return;
event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
sendAccessibilityEvent(event);
} }
private void setHoveredVirtualViewId(int virtualViewId) private void setHoveredVirtualViewId(int virtualViewId)
@ -263,6 +270,11 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
private AccessibilityEvent getEventForVirtualViewId(int virtualViewId, int eventType) private AccessibilityEvent getEventForVirtualViewId(int virtualViewId, int eventType)
{ {
if ((virtualViewId == INVALID_ID) || !m_manager.isEnabled()) {
Log.w(TAG, "getEventForVirtualViewId for invalid view");
return null;
}
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
event.setEnabled(true); event.setEnabled(true);