From e94c22165559b7d81ee255d328d39b5252d16132 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 27 Aug 2013 17:49:40 +0200 Subject: Android: added ApplicationState capability. The application state is tied to the QtActivity lifecycle. Mapping of states between Android and Qt is as follows: onResume --> ApplicationActive onPause --> ApplicationInactive onStop --> ApplicationSuspended Change-Id: Iefef08d6c7a7fde28fba1f4886882458cda6a0c0 Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/android/src/androidjnimain.cpp | 20 ++++++++++++++++++++ src/plugins/platforms/android/src/androidjnimain.h | 2 ++ .../src/opengl/qandroidopenglplatformwindow.cpp | 6 ++++++ .../android/src/qandroidplatformintegration.cpp | 1 + .../android/src/raster/qandroidplatformwindow.cpp | 13 +++++++++++++ .../android/src/raster/qandroidplatformwindow.h | 2 ++ 6 files changed, 44 insertions(+) (limited to 'src/plugins/platforms/android') diff --git a/src/plugins/platforms/android/src/androidjnimain.cpp b/src/plugins/platforms/android/src/androidjnimain.cpp index 8282b3b558..023cce30ec 100644 --- a/src/plugins/platforms/android/src/androidjnimain.cpp +++ b/src/plugins/platforms/android/src/androidjnimain.cpp @@ -89,6 +89,9 @@ static AAssetManager *m_assetManager = NULL; static jobject m_resourcesObj; static jobject m_activityObject = NULL; +static bool m_activityActive = true; // defaults to true because when the platform plugin is + // initialized, QtActivity::onResume() has already been called + static jclass m_bitmapClass = 0; static jmethodID m_createBitmapMethodID = 0; static jobject m_ARGB_8888_BitmapConfigValue = 0; @@ -320,6 +323,12 @@ namespace QtAndroid return m_activityObject; } + void setApplicationActive() + { + if (m_activityActive) + QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive); + } + jobject createBitmap(QImage img, JNIEnv *env) { if (img.format() != QImage::Format_ARGB32 && img.format() != QImage::Format_RGB16) @@ -652,6 +661,16 @@ static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/) #endif } +static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state) +{ + m_activityActive = (state == Qt::ApplicationActive); + + if (!m_androidPlatformIntegration) + return; + + QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState(state)); +} + static void handleOrientationChanged(JNIEnv */*env*/, jobject /*thiz*/, jint newOrientation) { if (m_androidPlatformIntegration == 0) @@ -678,6 +697,7 @@ static JNINativeMethod methods[] = { {"lockSurface", "()V", (void *)lockSurface}, {"unlockSurface", "()V", (void *)unlockSurface}, {"updateWindow", "()V", (void *)updateWindow}, + {"updateApplicationState", "(I)V", (void *)updateApplicationState}, {"handleOrientationChanged", "(I)V", (void *)handleOrientationChanged} }; diff --git a/src/plugins/platforms/android/src/androidjnimain.h b/src/plugins/platforms/android/src/androidjnimain.h index f75df55e02..9a3d8a9607 100644 --- a/src/plugins/platforms/android/src/androidjnimain.h +++ b/src/plugins/platforms/android/src/androidjnimain.h @@ -88,6 +88,8 @@ namespace QtAndroid jclass applicationClass(); jobject activity(); + void setApplicationActive(); + jobject createBitmap(QImage img, JNIEnv *env = 0); jobject createBitmapDrawable(jobject bitmap, JNIEnv *env = 0); diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp index 5362906e0e..d20bab7c5b 100644 --- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp +++ b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp @@ -121,6 +121,12 @@ void QAndroidOpenGLPlatformWindow::raise() void QAndroidOpenGLPlatformWindow::setVisible(bool visible) { QEglFSWindow::setVisible(visible); + + // The Android Activity is activated before Qt is initialized, causing the application state to + // never be set to 'active'. We explicitly set this state when the first window becomes visible. + if (visible) + QtAndroid::setApplicationActive(); + QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); // Expose event QWindowSystemInterface::flushWindowSystemEvents(); } diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp index 3e7b046edb..045eb57148 100644 --- a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp @@ -121,6 +121,7 @@ bool QAndroidPlatformIntegration::hasCapability(Capability cap) const { switch (cap) { case ThreadedPixmaps: return true; + case ApplicationState: return true; case NonFullScreenWindows: return false; case NativeWidgets: return false; default: diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp b/src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp index 94a69c10c7..f5fce0ae34 100644 --- a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp @@ -41,6 +41,9 @@ #include "qandroidplatformwindow.h" +#include "androidjnimain.h" +#include + QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) : QFbWindow(window) { } @@ -54,3 +57,13 @@ void QAndroidPlatformWindow::propagateSizeHints() { //shut up warning from default implementation } + +void QAndroidPlatformWindow::setVisible(bool visible) +{ + QFbWindow::setVisible(visible); + + // The Android Activity is activated before Qt is initialized, causing the application state to + // never be set to 'active'. We explicitly set this state when the first window becomes visible. + if (visible) + QtAndroid::setApplicationActive(); +} diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.h b/src/plugins/platforms/android/src/raster/qandroidplatformwindow.h index 3ee815fd69..58e6451ea1 100644 --- a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.h +++ b/src/plugins/platforms/android/src/raster/qandroidplatformwindow.h @@ -52,6 +52,8 @@ public: void propagateSizeHints(); + void setVisible(bool visible); + public slots: void setGeometry(const QRect &rect); -- cgit v1.2.3