summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2022-01-19 11:43:21 +0100
committerIvan Solovev <ivan.solovev@qt.io>2022-01-28 00:22:41 +0100
commitf6ddb3e921e39cf165fcc184e30bd16d5311c575 (patch)
treedeb7d5dff8e5423362e679f24ec6647a5bb7faa6 /src
parentc1a93b20ff1fec370b2483276b74f07eb54486ef (diff)
Android: explicitly remove accessibility focus when element is hidden
Before this patch when an element that had an Accessibility focus was hidden (for example, a button because of Accessibility.onPressAction), the focus was still remaining on that hidden element. So the next doubletaps on the screen caused the Accessibility.onPressAction() of the hidden element to be executed again and again. To fix this, we have to explicitly send a FOCUS_CLEARED event to the Android OS, when the object is hidden. Another needed fix is to set the m_focusedVirtualViewId in notifyObjectFocus() properly. Fixes: QTBUG-93393 Pick-to: 6.3 6.2 5.15 Change-Id: I6ff8a19868b96842719924037545c4ecc91e0dad Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/accessibility/QtAccessibilityDelegate.java11
1 files changed, 11 insertions, 0 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 4e54f41143..d6b234226e 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
@@ -198,6 +198,16 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
public void notifyObjectHide(int viewId)
{
+ // If the object had accessibility focus, we need to clear it.
+ // Note: This code is mostly copied from
+ // AccessibilityNodeProvider::performAction, but we remove the
+ // focus only if the focused view id matches the one that was hidden.
+ if (m_focusedVirtualViewId == viewId) {
+ m_focusedVirtualViewId = INVALID_ID;
+ m_view.invalidate();
+ sendEventForVirtualViewId(viewId,
+ AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
+ }
invalidateVirtualViewId(viewId);
}
@@ -205,6 +215,7 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
{
if (m_view == null)
return;
+ m_focusedVirtualViewId = viewId;
m_view.invalidate();
sendEventForVirtualViewId(viewId,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);