summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/androidjnimain.cpp
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@qt.io>2017-03-28 15:53:42 +0200
committerChristian Stromme <christian.stromme@qt.io>2017-04-11 11:58:02 +0000
commit9091a058bc61e297abea03edca322edcd658cc1f (patch)
tree1e00f6ebeb4861feb5bddf755c0c77ed059d0687 /src/plugins/platforms/android/androidjnimain.cpp
parent05b3295a570bd4f605dd3959f8abd4df1c7f7261 (diff)
Android: Fix application state tracking
- Make sure we don't process state changes before the platform plugin is completely created and registered. - Protect shared data with mutexes. - Don't update the application state from different threads. This was causing issues when testing run-time permission checks, when the application quickly switches state due to permission dialog being shown. In this case the states would be incorrectly delivered when the application was made active again. Change-Id: I3446eab9414ee5437cd788c27d65f808d1314aa5 Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Diffstat (limited to 'src/plugins/platforms/android/androidjnimain.cpp')
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index bde7457c0b..e47dd91a3e 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -82,8 +82,8 @@ static jobject m_serviceObject = nullptr;
static jmethodID m_setSurfaceGeometryMethodID = nullptr;
static jmethodID m_destroySurfaceMethodID = nullptr;
-static bool m_activityActive = true; // defaults to true because when the platform plugin is
- // initialized, QtActivity::onResume() has already been called
+static int m_pendingApplicationState = -1;
+static QBasicMutex m_pendingAppStateMtx;
static jclass m_bitmapClass = nullptr;
static jmethodID m_createBitmapMethodID = nullptr;
@@ -130,13 +130,22 @@ static const char m_qtTag[] = "Qt";
static const char m_classErrorMsg[] = "Can't find class \"%s\"";
static const char m_methodErrorMsg[] = "Can't find method \"%s%s\"";
+static void flushPendingApplicationState();
+
namespace QtAndroid
{
void setAndroidPlatformIntegration(QAndroidPlatformIntegration *androidPlatformIntegration)
{
- m_surfacesMutex.lock();
+ QMutexLocker lock(&m_surfacesMutex);
m_androidPlatformIntegration = androidPlatformIntegration;
- m_surfacesMutex.unlock();
+
+ // flush the pending state if necessary.
+ if (m_androidPlatformIntegration) {
+ flushPendingApplicationState();
+ } else {
+ QMutexLocker locker(&m_pendingAppStateMtx);
+ m_pendingApplicationState = -1;
+ }
}
QAndroidPlatformIntegration *androidPlatformIntegration()
@@ -215,12 +224,6 @@ namespace QtAndroid
m_statusBarShowing = false;
}
- void setApplicationActive()
- {
- if (m_activityActive)
- QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive);
- }
-
jobject createBitmap(QImage img, JNIEnv *env)
{
if (!m_bitmapClass)
@@ -446,6 +449,16 @@ namespace QtAndroid
} // namespace QtAndroid
+// Force an update of the pending application state (state set before the platform plugin was created)
+static void flushPendingApplicationState()
+{
+ QMutexLocker locker(&m_pendingAppStateMtx);
+ if (m_pendingApplicationState == -1)
+ return;
+
+ QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState(m_pendingApplicationState));
+ m_pendingApplicationState = -1;
+}
static jboolean startQtAndroidPlugin(JNIEnv* /*env*/, jobject /*object*//*, jobject applicationAssetManager*/)
{
@@ -655,13 +668,14 @@ static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/)
static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state)
{
- m_activityActive = (state == Qt::ApplicationActive);
-
- if (!m_main || !m_androidPlatformIntegration || !QGuiApplicationPrivate::platformIntegration()) {
- QAndroidPlatformIntegration::setDefaultApplicationState(Qt::ApplicationState(state));
+ if (!m_main || !QtAndroid::androidPlatformIntegration()) {
+ QMutexLocker locker(&m_pendingAppStateMtx);
+ m_pendingApplicationState = Qt::ApplicationState(state);
return;
}
+ flushPendingApplicationState();
+
if (state == Qt::ApplicationActive)
QtAndroidPrivate::handleResume();
else if (state == Qt::ApplicationInactive)