diff options
author | Petri Virkkunen <[email protected]> | 2024-03-27 16:05:20 +0200 |
---|---|---|
committer | Petri Virkkunen <[email protected]> | 2024-05-21 16:15:13 +0300 |
commit | 2322c71cc7576ddfcb5d0897dc67798786980285 (patch) | |
tree | 2c47b12fead9c5802a12234cb373dfe1c225993d | |
parent | 46a23b1fae7eadca3b8a5c3d459d234df106e94d (diff) |
Android: Implement accessibility backend interface
This will provide the JNI API used by QtAndroidAccessibility namespace
via QtAndroid namespace.
Removed unnecessary functions like createAccessibilityDelegate from
QtEmbeddedDelegate, moved the interface extension to where it is
actually supported: QtActivityDelegate.
Until now, QtActivityDelegateBase has called the QtEmbeddedDelegate
implementation on createAccessibilityDelegate() in order to create a
QtAccessibilityDelegate - which has not actually created the delegate -
and then done a null check before trying to call the - always null -
QtAccessibilityDelegate member.
The embedding and service-embedding usecases are now dealt with via the
interface validity checks on the C++ side, until an actual
implementation for those is completed.
Task-number: QTBUG-118874
Change-Id: Iea3db0e17ae80c0443e9027bdfe36bba311eed2b
Reviewed-by: Tinja Paavoseppä <[email protected]>
Reviewed-by: Assam Boudjelthia <[email protected]>
10 files changed, 94 insertions, 88 deletions
diff --git a/src/android/jar/CMakeLists.txt b/src/android/jar/CMakeLists.txt index 707fe4ccfbb..c9731786a6b 100644 --- a/src/android/jar/CMakeLists.txt +++ b/src/android/jar/CMakeLists.txt @@ -42,6 +42,7 @@ set(java_sources src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java src/org/qtproject/qt/android/BackendRegister.java src/org/qtproject/qt/android/QtWindowInterface.java + src/org/qtproject/qt/android/QtAccessibilityInterface.java ) qt_internal_add_jar(Qt${QtBase_VERSION_MAJOR}Android diff --git a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java index d23c87e7923..8558e42c3b8 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java @@ -61,6 +61,8 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate } // TODO do we want to have one QtAccessibilityDelegate for the whole app (QtRootLayout) or // e.g. one per window? + // FIXME make QtAccessibilityDelegate window based or verify current way works + // also for child windows: QTBUG-120685 public QtAccessibilityDelegate(QtLayout layout) { m_layout = layout; diff --git a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityInterface.java b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityInterface.java new file mode 100644 index 00000000000..41d0c4c6122 --- /dev/null +++ b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityInterface.java @@ -0,0 +1,14 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +package org.qtproject.qt.android; + +@UsedFromNativeCode +public interface QtAccessibilityInterface { + default void initializeAccessibility() { } + default void notifyLocationChange(int viewId) { } + default void notifyObjectHide(int viewId, int parentId) { } + default void notifyObjectFocus(int viewId) { } + default void notifyScrolledEvent(int viewId) { } + default void notifyValueChanged(int viewId, String value) { } + default void notifyObjectShow(int parentId) { } +} diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java index 169140afbde..fac42bc221c 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -31,7 +31,8 @@ import android.widget.PopupMenu; import java.util.HashMap; -class QtActivityDelegate extends QtActivityDelegateBase implements QtWindowInterface +class QtActivityDelegate + extends QtActivityDelegateBase implements QtWindowInterface, QtAccessibilityInterface { private static final String QtTAG = "QtActivityDelegate"; @@ -42,7 +43,7 @@ class QtActivityDelegate extends QtActivityDelegateBase implements QtWindowInter private View m_dummyView = null; private HashMap<Integer, View> m_nativeViews = new HashMap<Integer, View>(); - + private QtAccessibilityDelegate m_accessibilityDelegate = null; QtActivityDelegate(Activity activity) { @@ -58,6 +59,8 @@ class QtActivityDelegate extends QtActivityDelegateBase implements QtWindowInter m_backendsRegistered = true; BackendRegister.registerBackend(QtWindowInterface.class, (QtWindowInterface)QtActivityDelegate.this); + BackendRegister.registerBackend(QtAccessibilityInterface.class, + (QtAccessibilityInterface)QtActivityDelegate.this); } } @@ -66,6 +69,7 @@ class QtActivityDelegate extends QtActivityDelegateBase implements QtWindowInter if (m_backendsRegistered) { m_backendsRegistered = false; BackendRegister.unregisterBackend(QtWindowInterface.class); + BackendRegister.unregisterBackend(QtAccessibilityInterface.class); } } @@ -226,7 +230,55 @@ class QtActivityDelegate extends QtActivityDelegateBase implements QtWindowInter }); } - @UsedFromNativeCode + @Override + public void notifyLocationChange(int viewId) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyLocationChange(viewId); + } + + @Override + public void notifyObjectHide(int viewId, int parentId) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyObjectHide(viewId, parentId); + } + + @Override + public void notifyObjectShow(int parentId) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyObjectShow(parentId); + } + + @Override + public void notifyObjectFocus(int viewId) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyObjectFocus(viewId); + } + + @Override + public void notifyValueChanged(int viewId, String value) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyValueChanged(viewId, value); + } + + @Override + public void notifyScrolledEvent(int viewId) + { + if (m_accessibilityDelegate == null) + return; + m_accessibilityDelegate.notifyScrolledEvent(viewId); + } + + @Override public void initializeAccessibility() { QtNative.runAction(() -> { @@ -362,16 +414,6 @@ class QtActivityDelegate extends QtActivityDelegateBase implements QtWindowInter }); } - @Override - QtAccessibilityDelegate createAccessibilityDelegate() - { - if (m_layout != null) - return new QtAccessibilityDelegate(m_layout); - - Log.w(QtTAG, "Null layout, failed to initialize accessibility delegate."); - return null; - } - private void setActivityBackgroundDrawable() { TypedValue attr = new TypedValue(); diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java index 9f8738b042d..4a9df33a36f 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java @@ -37,7 +37,6 @@ abstract class QtActivityDelegateBase { protected Activity m_activity; protected HashMap<Integer, QtWindow> m_topLevelWindows; - protected QtAccessibilityDelegate m_accessibilityDelegate = null; protected QtDisplayManager m_displayManager = null; protected QtInputDelegate m_inputDelegate = null; @@ -46,7 +45,6 @@ abstract class QtActivityDelegateBase // Subclass must implement these abstract void startNativeApplicationImpl(String appParams, String mainLib); - abstract QtAccessibilityDelegate createAccessibilityDelegate(); abstract QtLayout getQtLayout(); // With these we are okay with default implementation doing nothing @@ -153,62 +151,6 @@ abstract class QtActivityDelegateBase hideSplashScreen(0); } - @UsedFromNativeCode - public void notifyLocationChange(int viewId) - { - if (m_accessibilityDelegate == null) - return; - m_accessibilityDelegate.notifyLocationChange(viewId); - } - - @UsedFromNativeCode - public void notifyObjectHide(int viewId, int parentId) - { - if (m_accessibilityDelegate == null) - return; - m_accessibilityDelegate.notifyObjectHide(viewId, parentId); - } - - @UsedFromNativeCode - public void notifyObjectShow(int parentId) - { - if (m_accessibilityDelegate == null) - return; - m_accessibilityDelegate.notifyObjectShow(parentId); - } - - @UsedFromNativeCode - public void notifyObjectFocus(int viewId) - { - if (m_accessibilityDelegate == null) - return; - m_accessibilityDelegate.notifyObjectFocus(viewId); - } - - @UsedFromNativeCode - public void notifyValueChanged(int viewId, String value) - { - if (m_accessibilityDelegate == null) - return; - m_accessibilityDelegate.notifyValueChanged(viewId, value); - } - - @UsedFromNativeCode - public void notifyScrolledEvent(int viewId) - { - if (m_accessibilityDelegate == null) - return; - m_accessibilityDelegate.notifyScrolledEvent(viewId); - } - - @UsedFromNativeCode - public void initializeAccessibility() - { - QtNative.runAction(() -> { - m_accessibilityDelegate = createAccessibilityDelegate(); - }); - } - void handleUiModeChange(int uiMode) { // QTBUG-108365 diff --git a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java index 78e1b5e2654..20d34180007 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java @@ -122,14 +122,6 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase QtNative.startApplication(appParams, mainLib); } - @Override - QtAccessibilityDelegate createAccessibilityDelegate() - { - // FIXME make QtAccessibilityDelegate window based or verify current way works - // also for child windows: QTBUG-120685 - return null; - } - @UsedFromNativeCode @Override QtLayout getQtLayout() diff --git a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java index 29f1d1790fd..22152f7e69e 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java @@ -28,6 +28,7 @@ class QtServiceEmbeddedDelegate implements QtEmbeddedViewInterface, QtNative.App m_service = service; QtNative.registerAppStateListener(this); QtNative.setService(service); + // QTBUG-122920 TODO Implement accessibility for service UIs } @UsedFromNativeCode diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index da5b63ef219..805616e481a 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -82,7 +82,7 @@ namespace QtAndroidAccessibility void initialize() { - QtAndroid::qtActivityDelegate().callMethod<void>("initializeAccessibility"); + QtAndroid::initializeAccessibility(); } bool isActive() diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 08a56039e43..35dfeb6a42d 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -95,6 +95,7 @@ Q_CONSTINIT static QBasicAtomicInt startQtAndroidPluginCalled = Q_BASIC_ATOMIC_I Q_DECLARE_JNI_CLASS(QtEmbeddedDelegateFactory, "org/qtproject/qt/android/QtEmbeddedDelegateFactory") Q_DECLARE_JNI_CLASS(QtWindowInterface, "org/qtproject/qt/android/QtWindowInterface") +Q_DECLARE_JNI_CLASS(QtAccessibilityInterface, "org/qtproject/qt/android/QtAccessibilityInterface"); namespace QtAndroid { @@ -237,36 +238,46 @@ namespace QtAndroid return true; } + void initializeAccessibility() + { + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "initializeAccessibility"); + } + void notifyAccessibilityLocationChange(uint accessibilityObjectId) { - qtActivityDelegate().callMethod<void>("notifyLocationChange", accessibilityObjectId); + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "notifyLocationChange", accessibilityObjectId); } void notifyObjectHide(uint accessibilityObjectId, uint parentObjectId) { - qtActivityDelegate().callMethod<void>("notifyObjectHide", - accessibilityObjectId, parentObjectId); + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "notifyObjectHide", accessibilityObjectId, parentObjectId); } void notifyObjectShow(uint parentObjectId) { - qtActivityDelegate().callMethod<void>("notifyObjectShow", - parentObjectId); + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "notifyObjectShow", parentObjectId); } void notifyObjectFocus(uint accessibilityObjectId) { - qtActivityDelegate().callMethod<void>("notifyObjectFocus", accessibilityObjectId); + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "notifyObjectFocus", accessibilityObjectId); } void notifyValueChanged(uint accessibilityObjectId, jstring value) { - qtActivityDelegate().callMethod<void>("notifyValueChanged", accessibilityObjectId, value); + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "notifyValueChanged", accessibilityObjectId, value); } void notifyScrolledEvent(uint accessibilityObjectId) { - qtActivityDelegate().callMethod<void>("notifyScrolledEvent", accessibilityObjectId); + m_backendRegister->callInterface<QtJniTypes::QtAccessibilityInterface, void>( + "notifyScrolledEvent", accessibilityObjectId); } void notifyNativePluginIntegrationReady(bool ready) diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index 755b69ad726..40db9e86827 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -65,6 +65,7 @@ namespace QtAndroid jobject createBitmap(int width, int height, QImage::Format format, JNIEnv *env); jobject createBitmapDrawable(jobject bitmap, JNIEnv *env = nullptr); + void initializeAccessibility(); void notifyAccessibilityLocationChange(uint accessibilityObjectId); void notifyObjectHide(uint accessibilityObjectId, uint parentObjectId); void notifyObjectShow(uint parentObjectId); |