summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2021-05-10 16:16:37 +0300
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2021-05-26 23:24:11 +0000
commit478ed8b71f289438ed664bf2676b270325c93bfc (patch)
tree0f698686f6c01b638f8f6b60da218289c06b30bb /src/corelib/kernel
parentda30e402f38a434f856fa8670a8813c3cffe6440 (diff)
Android: Add runOnMainAndroidThread() under QNativeInterface
This replaces QtAndroidPrivate::runOnAndroidThread{Sync} calls. This also now allows passing std::function<> that can return values, and not only an std::function<void()>. This adds some tests for this calls as well. Fixes: QTBUG-90501 Change-Id: I138d2aae64be17347f7ff712d8a86edb49ea8350 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qcoreapplication_platform.h21
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp3
-rw-r--r--src/corelib/kernel/qjnihelpers_p.h2
3 files changed, 26 insertions, 0 deletions
diff --git a/src/corelib/kernel/qcoreapplication_platform.h b/src/corelib/kernel/qcoreapplication_platform.h
index 6830e4d3ab8..c65010faeee 100644
--- a/src/corelib/kernel/qcoreapplication_platform.h
+++ b/src/corelib/kernel/qcoreapplication_platform.h
@@ -44,6 +44,11 @@
#include <QtCore/qnativeinterface.h>
#include <QtCore/qcoreapplication.h>
+#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
+#include <QtCore/qfuture.h>
+#include <QtCore/qvariant.h>
+#endif
+
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
class _jobject;
typedef _jobject* jobject;
@@ -61,6 +66,22 @@ struct Q_CORE_EXPORT QAndroidApplication
static bool isActivityContext();
static int sdkVersion();
static void hideSplashScreen(int duration = 0);
+
+#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
+ static QFuture<QVariant> runOnAndroidMainThread(const std::function<QVariant()> &runnable,
+ const QDeadlineTimer
+ &timeout = QDeadlineTimer(-1));
+
+ template <class T>
+ std::enable_if_t<std::is_invocable_v<T> && std::is_same_v<std::invoke_result_t<T>, void>,
+ QFuture<void>> static runOnAndroidMainThread(const T &runnable,
+ const QDeadlineTimer
+ &timeout = QDeadlineTimer(-1))
+ {
+ std::function<QVariant()> func = [&](){ runnable(); return QVariant(); };
+ return static_cast<QFuture<void>>(runOnAndroidMainThread(func, timeout));
+ }
+#endif
};
#endif
}
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp
index edb07b47cf4..46143d4c2c3 100644
--- a/src/corelib/kernel/qjnihelpers.cpp
+++ b/src/corelib/kernel/qjnihelpers.cpp
@@ -358,6 +358,9 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
if (!registerPermissionNatives())
return JNI_ERR;
+ if (!registerNativeInterfaceNatives())
+ return JNI_ERR;
+
g_runPendingCppRunnablesMethodID = env->GetStaticMethodID(jQtNative,
"runPendingCppRunnablesOnAndroidThread",
"()V");
diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h
index 90dbcd1cd82..07f5ff8e8a3 100644
--- a/src/corelib/kernel/qjnihelpers_p.h
+++ b/src/corelib/kernel/qjnihelpers_p.h
@@ -128,7 +128,9 @@ namespace QtAndroidPrivate
Q_CORE_EXPORT PermissionsHash requestPermissionsSync(JNIEnv *env, const QStringList &permissions, int timeoutMs = INT_MAX);
Q_CORE_EXPORT PermissionsResult checkPermission(const QString &permission);
Q_CORE_EXPORT bool shouldShowRequestPermissionRationale(const QString &permission);
+
bool registerPermissionNatives();
+ bool registerNativeInterfaceNatives();
Q_CORE_EXPORT void handleActivityResult(jint requestCode, jint resultCode, jobject data);
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener);