From f6ddb3e921e39cf165fcc184e30bd16d5311c575 Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Wed, 19 Jan 2022 11:43:21 +0100 Subject: [PATCH] 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 --- .../accessibility/QtAccessibilityDelegate.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 4e54f411438..d6b234226e2 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);