summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qjnihelpers.cpp
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>2014-02-14 10:25:23 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-15 22:25:36 +0100
commit8d721b3c567aeecb04a39a3f75b76f5ef10db25c (patch)
tree807d3d48636d6cb87bc2578505f6710eb70026b8 /src/corelib/kernel/qjnihelpers.cpp
parentc9cdbcb12f80cd72905e49ce1a673eae9f559ca3 (diff)
Android: Add enablers for listening to activity results
When you launch an activity through an intent, data can be provided back from the activity when it has finished using onActivityResult() in the activity which launched it. This is okay for applications, since they can easily create their own activities, but does not work for libraries that need to use intents. There is no listener API for activity results which allow external classes to eavesdrop. In order to support launching intents from third-party or add-on libraries, we provide a low-level way to hook into the activity result event. The corresponding public API will be added to QtAndroidExtras. Change-Id: I89417f485e2c0e69028dcccc7c155788346a7417 Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Diffstat (limited to 'src/corelib/kernel/qjnihelpers.cpp')
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp
index 74eb6f5b27..311ebaa092 100644
--- a/src/corelib/kernel/qjnihelpers.cpp
+++ b/src/corelib/kernel/qjnihelpers.cpp
@@ -40,6 +40,8 @@
****************************************************************************/
#include "qjnihelpers_p.h"
+#include "qmutex.h"
+#include "qlist.h"
QT_BEGIN_NAMESPACE
@@ -48,6 +50,39 @@ static jobject g_jActivity = Q_NULLPTR;
static jobject g_jClassLoader = Q_NULLPTR;
static jint g_androidSdkVersion = 0;
+namespace {
+ class ActivityResultListeners
+ {
+ public:
+ QMutex mutex;
+ QList<QtAndroidPrivate::ActivityResultListener *> listeners;
+ };
+}
+
+Q_GLOBAL_STATIC(ActivityResultListeners, g_activityResultListeners)
+
+void QtAndroidPrivate::registerActivityResultListener(ActivityResultListener *listener)
+{
+ QMutexLocker locker(&g_activityResultListeners()->mutex);
+ g_activityResultListeners()->listeners.append(listener);
+}
+
+void QtAndroidPrivate::unregisterActivityResultListener(ActivityResultListener *listener)
+{
+ QMutexLocker locker(&g_activityResultListeners()->mutex);
+ g_activityResultListeners()->listeners.removeAll(listener);
+}
+
+void QtAndroidPrivate::handleActivityResult(jint requestCode, jint resultCode, jobject data)
+{
+ QMutexLocker locker(&g_activityResultListeners()->mutex);
+ const QList<QtAndroidPrivate::ActivityResultListener *> &listeners = g_activityResultListeners()->listeners;
+ for (int i=0; i<listeners.size(); ++i) {
+ if (listeners.at(i)->handleActivityResult(requestCode, resultCode, data))
+ break;
+ }
+}
+
static inline bool exceptionCheck(JNIEnv *env)
{
if (env->ExceptionCheck()) {