diff options
author | Mike Achtelik <mike.achtelik@gmail.com> | 2022-06-24 16:15:26 +0200 |
---|---|---|
committer | Mike Achtelik <mike.achtelik@gmail.com> | 2022-07-05 22:08:21 +0200 |
commit | d48ebb02fb171d0b6fe3749a28a312fc624f8b8e (patch) | |
tree | efb0666f2e0947da5bb1b957dd9f67fe03c3f2e0 /src/android | |
parent | 49d29440457a89bb0438ed882eb47f4f28fd328a (diff) |
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
Pick-to: 6.4 6.3 6.2 5.15
Change-Id: Ifbf8da1b95f02935b9bcffabfe821547b1128103
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/android')
-rw-r--r-- | src/android/jar/src/org/qtproject/qt/android/accessibility/QtAccessibilityDelegate.java | 26 |
1 files changed, 19 insertions, 7 deletions
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 09c84f6c60..84cbc0b456 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 @@ -227,10 +227,14 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate public boolean sendEventForVirtualViewId(int virtualViewId, int eventType) { - if ((virtualViewId == INVALID_ID) || !m_manager.isEnabled()) { - Log.w(TAG, "sendEventForVirtualViewId for invalid view"); + final AccessibilityEvent event = getEventForVirtualViewId(virtualViewId, eventType); + return sendAccessibilityEvent(event); + } + + public boolean sendAccessibilityEvent(AccessibilityEvent event) + { + if (event == null) return false; - } final ViewGroup group = (ViewGroup) m_view.getParent(); if (group == null) { @@ -238,15 +242,18 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate return false; } - final AccessibilityEvent event; - event = getEventForVirtualViewId(virtualViewId, eventType); return group.requestSendAccessibilityEvent(m_view, event); } public void invalidateVirtualViewId(int virtualViewId) { - if (virtualViewId != INVALID_ID) - sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + final AccessibilityEvent event = getEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + + if (event == null) + return; + + event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE); + sendAccessibilityEvent(event); } private void setHoveredVirtualViewId(int virtualViewId) @@ -263,6 +270,11 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate 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); event.setEnabled(true); |