From 4f7507c52390cd19d76e0f36744f21fbc3e14674 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Tue, 8 Nov 2016 17:12:05 +0200 Subject: Forward Service.onBind notification to Qt It is needed to implement Android Binder in Qt. Change-Id: I8f6f8ef778f97a444a1b16d6f62e211e188b65cc Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/corelib/kernel/qjnihelpers.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/corelib/kernel/qjnihelpers.cpp') diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index dc60b0bc2b..02c58858ff 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -75,6 +75,11 @@ static jmethodID g_hideSplashScreenMethodID = Q_NULLPTR; Q_GLOBAL_STATIC(std::deque, g_pendingRunnables); static QBasicMutex g_pendingRunnablesMutex; +Q_GLOBAL_STATIC_WITH_ARGS(QtAndroidPrivate::OnBindListener*, g_onBindListener, (nullptr)); +Q_GLOBAL_STATIC(QMutex, g_onBindListenerMutex); +Q_GLOBAL_STATIC(QSemaphore, g_waitForServiceSetupSemaphore); +Q_GLOBAL_STATIC(QAtomicInt, g_serviceSetupLockers); + class PermissionsResultClass : public QObject { Q_OBJECT @@ -511,7 +516,7 @@ void QtAndroidPrivate::requestPermissions(JNIEnv *env, const QStringList &permis }, env); } -QHash QtAndroidPrivate::requestPermissionsSync(JNIEnv *env, const QStringList &permissions, int timeoutMs) +QtAndroidPrivate::PermissionsHash QtAndroidPrivate::requestPermissionsSync(JNIEnv *env, const QStringList &permissions, int timeoutMs) { QSharedPointer> res(new QHash()); QSharedPointer sem(new QSemaphore); @@ -572,6 +577,33 @@ void QtAndroidPrivate::hideSplashScreen(JNIEnv *env, int duration) env->CallStaticVoidMethod(g_jNativeClass, g_hideSplashScreenMethodID, duration); } +void QtAndroidPrivate::waitForServiceSetup() +{ + g_waitForServiceSetupSemaphore->acquire(); +} + +int QtAndroidPrivate::acuqireServiceSetup(int flags) +{ + g_serviceSetupLockers->ref(); + return flags; +} + +void QtAndroidPrivate::setOnBindListener(QtAndroidPrivate::OnBindListener *listener) +{ + QMutexLocker lock(g_onBindListenerMutex); + *g_onBindListener = listener; + if (!(*g_serviceSetupLockers)--) + g_waitForServiceSetupSemaphore->release(); +} + +jobject QtAndroidPrivate::callOnBindListener(jobject intent) +{ + QMutexLocker lock(g_onBindListenerMutex); + if (g_onBindListener) + return (*g_onBindListener)->onBind(intent); + return nullptr; +} + QT_END_NAMESPACE #include "qjnihelpers.moc" -- cgit v1.2.3