summaryrefslogtreecommitdiffstats
path: root/src/android
diff options
context:
space:
mode:
authorPiotr Mikolajczyk <piotr.mikolajczyk@qt.io>2020-11-20 15:07:59 +0100
committerPiotr Mikolajczyk <piotr.mikolajczyk@qt.io>2020-12-09 10:52:51 +0100
commit020a6f0daec2e36866888b23c8b3a65bfb366146 (patch)
treebc0b12306b9c71ebcc45ef6e7be6e6851dae979f /src/android
parent6c6e56c42028d5775a977b4be14a243b1d3deb0c (diff)
Android: Qml accessibility fixes
- Accessibility focus can follow the position of the widget (for example when swiping on a scrollview) - controls are clickable directly after appearing on the screen after scroll (previously you had to click somewhere else on the screen, and after that you could focus the newly appeared control) - checkbox and switch react correctly on click action - fixed combobox behavior with accessibility enabled Task-number: QTBUG-79611 Change-Id: If36914ab0165f33593e68fd7ecf168693f8538a7 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> (cherry picked from commit fd20bc2277f98b86bddbd3f8a0ca92457a8c7c70)
Diffstat (limited to 'src/android')
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java24
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtNative.java36
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java23
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java15
4 files changed, 93 insertions, 5 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index 742505c39a..b06ccc5ec6 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -231,6 +231,8 @@ public class QtActivityDelegate
public static final int ApplicationInactive = 0x2;
public static final int ApplicationActive = 0x4;
+ private QtAccessibilityDelegate m_accessibilityDelegate = null;
+
public boolean setKeyboardVisibility(boolean visibility, long timeStamp)
{
@@ -859,10 +861,30 @@ public class QtActivityDelegate
m_splashScreen.startAnimation(fadeOut);
}
+ public void notifyAccessibilityLocationChange()
+ {
+ if (m_accessibilityDelegate == null)
+ return;
+ m_accessibilityDelegate.notifyLocationChange();
+ }
+
+ public void notifyObjectHide(int viewId)
+ {
+ if (m_accessibilityDelegate == null)
+ return;
+ m_accessibilityDelegate.notifyObjectHide(viewId);
+ }
+
+ public void notifyObjectFocus(int viewId)
+ {
+ if (m_accessibilityDelegate == null)
+ return;
+ m_accessibilityDelegate.notifyObjectFocus(viewId);
+ }
public void initializeAccessibility()
{
- new QtAccessibilityDelegate(m_activity, m_layout, this);
+ m_accessibilityDelegate = new QtAccessibilityDelegate(m_activity, m_layout, this);
}
public void onWindowFocusChanged(boolean hasFocus) {
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
index 341ac7b75e..39f1220722 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
@@ -929,6 +929,42 @@ public class QtNative
});
}
+ private static void notifyAccessibilityLocationChange()
+ {
+ runAction(new Runnable() {
+ @Override
+ public void run() {
+ if (m_activityDelegate != null) {
+ m_activityDelegate.notifyAccessibilityLocationChange();
+ }
+ }
+ });
+ }
+
+ private static void notifyObjectHide(final int viewId)
+ {
+ runAction(new Runnable() {
+ @Override
+ public void run() {
+ if (m_activityDelegate != null) {
+ m_activityDelegate.notifyObjectHide(viewId);
+ }
+ }
+ });
+ }
+
+ private static void notifyObjectFocus(final int viewId)
+ {
+ runAction(new Runnable() {
+ @Override
+ public void run() {
+ if (m_activityDelegate != null) {
+ m_activityDelegate.notifyObjectFocus(viewId);
+ }
+ }
+ });
+ }
+
private static void registerClipboardManager()
{
if (m_service == null || m_activity != null) { // Avoid freezing if only service
diff --git a/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
index 79caaf318e..a607eccc85 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
@@ -191,6 +191,23 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
return true;
}
+ public void notifyLocationChange()
+ {
+ invalidateVirtualViewId(m_focusedVirtualViewId);
+ }
+
+ public void notifyObjectHide(int viewId)
+ {
+ invalidateVirtualViewId(viewId);
+ }
+
+ public void notifyObjectFocus(int viewId)
+ {
+ m_view.invalidate();
+ sendEventForVirtualViewId(viewId,
+ AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
+ }
+
public boolean sendEventForVirtualViewId(int virtualViewId, int eventType)
{
if ((virtualViewId == INVALID_ID) || !m_manager.isEnabled()) {
@@ -211,7 +228,8 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
public void invalidateVirtualViewId(int virtualViewId)
{
- sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ if (virtualViewId != INVALID_ID)
+ sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
}
private void setHoveredVirtualViewId(int virtualViewId)
@@ -336,9 +354,6 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
node.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
}
- int[] ids = QtNativeAccessibility.childIdListForAccessibleObject(virtualViewId);
- for (int i = 0; i < ids.length; ++i)
- node.addChild(m_view, ids[i]);
return node;
}
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
index 9d8c46fc26..b257a16567 100644
--- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -1121,4 +1121,19 @@ public class QtActivity extends Activity
{
QtNative.activityDelegate().setFullScreen(enterFullScreen);
}
+
+ public void notifyAccessibilityLocationChange()
+ {
+ QtNative.activityDelegate().notifyAccessibilityLocationChange();
+ }
+
+ public void notifyObjectHide(int viewId)
+ {
+ QtNative.activityDelegate().notifyObjectHide(viewId);
+ }
+
+ public void notifyObjectFocus(int viewId)
+ {
+ QtNative.activityDelegate().notifyObjectFocus(viewId);
+ }
}