summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTinja Paavoseppä <tinja.paavoseppa@qt.io>2023-10-31 14:25:45 +0200
committerSoheil Armin <soheil.armin@qt.io>2023-12-14 00:26:55 +0200
commitc1a79b442ce0a50e176f72f3c738ea1263e8dd98 (patch)
tree477f3b14f64a1d7a3d2305c815ffd1bd0f2f6659
parentcca81a663661ef1fce5f4a9f4c5a5f5fd1381325 (diff)
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 <assam.boudjelthia@qt.io>
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp26
-rw-r--r--src/plugins/platforms/android/androidjnimain.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 9a9a0ac777..7beae1993d 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<void>("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,
"<init>", "(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V");
+ FIND_AND_CHECK_CLASS("org/qtproject/qt/android/QtActivityBase");
+ m_qtActivityClass = static_cast<jclass>(env->NewGlobalRef(clazz));
+ FIND_AND_CHECK_CLASS("org/qtproject/qt/android/QtServiceBase");
+ m_qtServiceClass = static_cast<jclass>(env->NewGlobalRef(clazz));
+
return true;
}
diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h
index 2affde4961..2d9ac730f5 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