From 9903242ecab82c1ed72dcaf90e90a171c942a84a Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Wed, 25 Dec 2024 13:41:29 +0100 Subject: [PATCH] Android: Fix freeze on start when the activity was destroyed before This can be tested by enabling "Don't keep activities" in the developer options. With this option Android will immediately destroy the activity when it is moved to the background. In this case registerBackends will be called the first time before the BackendRegister was created. Because m_backendsRegistered was set to true even if it failed, the final call has no effect. So we need to ensure to set m_backendsRegistered only if a BackendRegister is available. Fixes: QTBUG-132085 Pick-to: 6.9 6.8 Change-Id: I2ea1c0e0737c982594ceb06cbaf540399c45e3f4 Reviewed-by: Assam Boudjelthia --- .../jar/src/org/qtproject/qt/android/BackendRegister.java | 1 + .../src/org/qtproject/qt/android/QtActivityDelegate.java | 7 ++++++- .../src/org/qtproject/qt/android/QtEmbeddedDelegate.java | 7 +++++++ src/plugins/platforms/android/androidbackendregister.cpp | 8 +++++++- src/plugins/platforms/android/androidbackendregister.h | 2 ++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/BackendRegister.java b/src/android/jar/src/org/qtproject/qt/android/BackendRegister.java index b66a593ec6b..590c7d84aac 100644 --- a/src/android/jar/src/org/qtproject/qt/android/BackendRegister.java +++ b/src/android/jar/src/org/qtproject/qt/android/BackendRegister.java @@ -4,6 +4,7 @@ package org.qtproject.qt.android; class BackendRegister { + static native boolean isNull(); static native void registerBackend(Class interfaceType, Object interfaceObject); static native void unregisterBackend(Class interfaceType); } 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 07ca4daeba7..e1292eed87a 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -59,8 +59,9 @@ class QtActivityDelegate extends QtActivityDelegateBase void registerBackends() { - if (m_backendsRegistered) + if (m_backendsRegistered || BackendRegister.isNull()) return; + m_backendsRegistered = true; BackendRegister.registerBackend(QtWindowInterface.class, QtActivityDelegate.this); BackendRegister.registerBackend(QtAccessibilityInterface.class, QtActivityDelegate.this); @@ -74,6 +75,10 @@ class QtActivityDelegate extends QtActivityDelegateBase return; m_backendsRegistered = false; + + if (BackendRegister.isNull()) + return; + BackendRegister.unregisterBackend(QtWindowInterface.class); BackendRegister.unregisterBackend(QtAccessibilityInterface.class); BackendRegister.unregisterBackend(QtMenuInterface.class); 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 fb1ddd9907e..67175370e6f 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java @@ -88,12 +88,19 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase synchronized (this) { m_stateDetails = details; if (details.isStarted && !m_backendsRegistered) { + if (BackendRegister.isNull()) + return; + m_backendsRegistered = true; BackendRegister.registerBackend(QtWindowInterface.class, this); BackendRegister.registerBackend(QtMenuInterface.class, this); BackendRegister.registerBackend(QtInputInterface.class, m_inputDelegate); } else if (!details.isStarted && m_backendsRegistered) { m_backendsRegistered = false; + + if (BackendRegister.isNull()) + return; + BackendRegister.unregisterBackend(QtWindowInterface.class); BackendRegister.unregisterBackend(QtMenuInterface.class); BackendRegister.unregisterBackend(QtInputInterface.class); diff --git a/src/plugins/platforms/android/androidbackendregister.cpp b/src/plugins/platforms/android/androidbackendregister.cpp index bfd86138aa5..98f0ea59356 100644 --- a/src/plugins/platforms/android/androidbackendregister.cpp +++ b/src/plugins/platforms/android/androidbackendregister.cpp @@ -14,10 +14,16 @@ Q_DECLARE_JNI_CLASS(BackendRegister, "org/qtproject/qt/android/BackendRegister") bool AndroidBackendRegister::registerNatives() { return QtJniTypes::BackendRegister::registerNativeMethods( - { Q_JNI_NATIVE_SCOPED_METHOD(registerBackend, AndroidBackendRegister), + { Q_JNI_NATIVE_SCOPED_METHOD(isNull, AndroidBackendRegister), + Q_JNI_NATIVE_SCOPED_METHOD(registerBackend, AndroidBackendRegister), Q_JNI_NATIVE_SCOPED_METHOD(unregisterBackend, AndroidBackendRegister) }); } +jboolean AndroidBackendRegister::isNull(JNIEnv *, jclass) +{ + return QtAndroid::backendRegister() == nullptr; +} + void AndroidBackendRegister::registerBackend(JNIEnv *, jclass, jclass interfaceClass, jobject interface) { diff --git a/src/plugins/platforms/android/androidbackendregister.h b/src/plugins/platforms/android/androidbackendregister.h index 502880a77f3..06b7b832416 100644 --- a/src/plugins/platforms/android/androidbackendregister.h +++ b/src/plugins/platforms/android/androidbackendregister.h @@ -60,6 +60,8 @@ private: QMutex m_registerMutex; QMap m_register; + static jboolean isNull(JNIEnv *, jclass); + Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(isNull) static void registerBackend(JNIEnv *, jclass, jclass interfaceClass, jobject interface); Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(registerBackend) static void unregisterBackend(JNIEnv *, jclass, jclass interfaceClass);