From 6d00aac1092d813446a44fbb234995733233f003 Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Mon, 31 Jan 2022 18:08:08 +0100 Subject: [PATCH] Android: extract parentId for hidden object in advance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit amends 850a7f1238e84b6960a84e12687e40cf939a44d9. We can't extract the parentId for the hidden object on Java side, because the Java call is executed in a separate thread, so the original hidden object can be destroyed somewhere in the middle of parentId() call. As a workaround, we get the parentId in advance, on C++ side, and pass it as a parameter to JNI function. Task-number: QTBUG-95764 Pick-to: 6.3 6.2 5.15 Change-Id: Ied2ab4ab39b947f3f582575cf77cc76fbac9e274 Reviewed-by: Jarkko Koivikko Reviewed-by: Jan Arve Sæther Reviewed-by: Rami Potinkara Reviewed-by: Assam Boudjelthia --- .../src/org/qtproject/qt/android/QtActivityDelegate.java | 4 ++-- src/android/jar/src/org/qtproject/qt/android/QtNative.java | 4 ++-- .../qt/android/accessibility/QtAccessibilityDelegate.java | 3 +-- .../src/org/qtproject/qt/android/bindings/QtActivity.java | 4 ++-- src/plugins/platforms/android/androidjniaccessibility.cpp | 6 +++++- src/plugins/platforms/android/androidjnimain.cpp | 5 +++-- src/plugins/platforms/android/androidjnimain.h | 2 +- 7 files changed, 16 insertions(+), 12 deletions(-) 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 8cf71597e4..83f86b0d97 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -907,11 +907,11 @@ public class QtActivityDelegate m_accessibilityDelegate.notifyLocationChange(); } - public void notifyObjectHide(int viewId) + public void notifyObjectHide(int viewId, int parentId) { if (m_accessibilityDelegate == null) return; - m_accessibilityDelegate.notifyObjectHide(viewId); + m_accessibilityDelegate.notifyObjectHide(viewId, parentId); } public void notifyObjectFocus(int viewId) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java index 11b27f96c0..ccf18ca0a6 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -974,13 +974,13 @@ public class QtNative }); } - private static void notifyObjectHide(final int viewId) + private static void notifyObjectHide(final int viewId, final int parentId) { runAction(new Runnable() { @Override public void run() { if (m_activityDelegate != null) { - m_activityDelegate.notifyObjectHide(viewId); + m_activityDelegate.notifyObjectHide(viewId, parentId); } } }); 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 e75682c654..72c1e4f023 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 @@ -196,7 +196,7 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate invalidateVirtualViewId(m_focusedVirtualViewId); } - public void notifyObjectHide(int viewId) + public void notifyObjectHide(int viewId, int parentId) { // If the object had accessibility focus, we need to clear it. // Note: This code is mostly copied from @@ -210,7 +210,6 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate } // When the object is hidden, we need to notify its parent about // content change, not the hidden object itself - final int parentId = QtNativeAccessibility.parentId(viewId); invalidateVirtualViewId(parentId); } diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java index 9bfa8738b6..e4073948de 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java @@ -1138,9 +1138,9 @@ public class QtActivity extends Activity QtNative.activityDelegate().notifyAccessibilityLocationChange(); } - public void notifyObjectHide(int viewId) + public void notifyObjectHide(int viewId, int parentId) { - QtNative.activityDelegate().notifyObjectHide(viewId); + QtNative.activityDelegate().notifyObjectHide(viewId, parentId); } public void notifyObjectFocus(int viewId) diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index 62460f5e6d..10a71bca4a 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -113,9 +113,13 @@ namespace QtAndroidAccessibility QtAndroid::notifyAccessibilityLocationChange(); } + static jint parentId(JNIEnv *, jobject, jint objectId); // forward declaration + void notifyObjectHide(uint accessibilityObjectId) { - QtAndroid::notifyObjectHide(accessibilityObjectId); + jobject unused {}; + const auto parentObjectId = parentId(nullptr, unused, accessibilityObjectId); + QtAndroid::notifyObjectHide(accessibilityObjectId, parentObjectId); } void notifyObjectFocus(uint accessibilityObjectId) diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index e99dca17a2..9816dfb93e 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -215,9 +215,10 @@ namespace QtAndroid QJniObject::callStaticMethod(m_applicationClass, "notifyAccessibilityLocationChange"); } - void notifyObjectHide(uint accessibilityObjectId) + void notifyObjectHide(uint accessibilityObjectId, uint parentObjectId) { - QJniObject::callStaticMethod(m_applicationClass, "notifyObjectHide","(I)V", accessibilityObjectId); + QJniObject::callStaticMethod(m_applicationClass, "notifyObjectHide", "(II)V", + accessibilityObjectId, parentObjectId); } void notifyObjectFocus(uint accessibilityObjectId) diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index c7dd5c0ca0..5ebf8c5048 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -101,7 +101,7 @@ namespace QtAndroid jobject createBitmapDrawable(jobject bitmap, JNIEnv *env = nullptr); void notifyAccessibilityLocationChange(); - void notifyObjectHide(uint accessibilityObjectId); + void notifyObjectHide(uint accessibilityObjectId, uint parentObjectId); void notifyObjectFocus(uint accessibilityObjectId); void notifyQtAndroidPluginRunning(bool running);