From c1a79b442ce0a50e176f72f3c738ea1263e8dd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tinja=20Paavosepp=C3=A4?= Date: Tue, 31 Oct 2023 14:25:45 +0200 Subject: [PATCH] Android: Differentiate between standalone Qt app and embedded view Add a helper method to tell whether the app is a standalone Qt for Android app, where also the Context is created by Qt, or whether Qt content is embedded as a View into a Context created by the user, i.e. a "native" Android app. Pick-to: 6.7 Change-Id: I618ba1c8cb40c9b132fc12a7ee6d54c071efa983 Reviewed-by: Assam Boudjelthia --- .../platforms/android/androidjnimain.cpp | 26 +++++++++++++++++++ .../platforms/android/androidjnimain.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 9a9a0ac777f..7beae1993dc 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -50,6 +50,9 @@ static AAssetManager *m_assetManager = nullptr; static jobject m_assets = nullptr; static jobject m_resourcesObj = nullptr; +static jclass m_qtActivityClass = nullptr; +static jclass m_qtServiceClass = nullptr; + static QtJniTypes::QtActivityDelegate m_activityDelegate = nullptr; static QtJniTypes::QtInputDelegate m_inputDelegate = nullptr; @@ -203,6 +206,20 @@ namespace QtAndroid return m_inputDelegate; } + bool isQtApplication() + { + // Returns true if the app is a Qt app, i.e. Qt controls the whole app and + // the Activity/Service is created by Qt. Returns false if instead Qt is + // embedded into a native Android app, where the Activity/Service is created + // by the user, outside of Qt, and Qt content is added as a view. + JNIEnv *env = QJniEnvironment::getJniEnv(); + static const jint isQtActivity = env->IsInstanceOf(QtAndroidPrivate::activity().object(), + m_qtActivityClass); + static const jint isQtService = env->IsInstanceOf(QtAndroidPrivate::service().object(), + m_qtServiceClass); + return isQtActivity || isQtService; + } + void notifyAccessibilityLocationChange(uint accessibilityObjectId) { qtActivityDelegate().callMethod("notifyLocationChange", accessibilityObjectId); @@ -500,6 +517,10 @@ static void terminateQt(JNIEnv *env, jclass /*clazz*/) env->DeleteGlobalRef(m_bitmapDrawableClass); if (m_assets) env->DeleteGlobalRef(m_assets); + if (m_qtActivityClass) + env->DeleteGlobalRef(m_qtActivityClass); + if (m_qtServiceClass) + env->DeleteGlobalRef(m_qtServiceClass); m_androidPlatformIntegration = nullptr; delete m_androidAssetsFileEngineHandler; m_androidAssetsFileEngineHandler = nullptr; @@ -817,6 +838,11 @@ static bool registerNatives(QJniEnvironment &env) m_bitmapDrawableClass, "", "(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V"); + FIND_AND_CHECK_CLASS("org/qtproject/qt/android/QtActivityBase"); + m_qtActivityClass = static_cast(env->NewGlobalRef(clazz)); + FIND_AND_CHECK_CLASS("org/qtproject/qt/android/QtServiceBase"); + m_qtServiceClass = static_cast(env->NewGlobalRef(clazz)); + return true; } diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index 2affde49613..2d9ac730f59 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -76,6 +76,8 @@ namespace QtAndroid QString deviceName(); bool blockEventLoopsWhenSuspended(); + + bool isQtApplication(); } QT_END_NAMESPACE