diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2013-08-27 17:49:40 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-28 17:00:15 +0200 |
commit | e94c22165559b7d81ee255d328d39b5252d16132 (patch) | |
tree | b327a1bebf92a98c3516d802b44277c08280516b /src | |
parent | fd871694e74debc1bde5a7a19c6a5b94f3069bb2 (diff) |
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 <eskil.abrahamsen-blomfeldt@digia.com>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Diffstat (limited to 'src')
8 files changed, 64 insertions, 0 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index 8d67db7f40..8dc804cce4 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -160,6 +160,12 @@ public class QtActivityDelegate private final int ImhEmailCharactersOnly = 0x200000; private final int ImhUrlCharactersOnly = 0x400000; + // application state + private final int ApplicationSuspended = 0x0; + private final int ApplicationHidden = 0x1; + private final int ApplicationInactive = 0x2; + private final int ApplicationActive = 0x4; + public void resetSoftwareKeyboard() { if (m_imm == null) @@ -621,6 +627,11 @@ public class QtActivityDelegate m_surface.applicationStarted(true); } + public void onPause() + { + QtNative.updateApplicationState(ApplicationInactive); + } + public void onResume() { // fire all lostActions @@ -631,12 +642,18 @@ public class QtActivityDelegate m_activity.runOnUiThread(itr.next()); if (m_started) { + QtNative.updateApplicationState(ApplicationActive); QtNative.clearLostActions(); QtNative.updateWindow(); } } } + public void onStop() + { + QtNative.updateApplicationState(ApplicationSuspended); + } + public Object onRetainNonConfigurationInstance() { try { diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 122fc55aad..51f00a73c6 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -582,6 +582,9 @@ public class QtNative public static native void updateWindow(); // window methods + // application methods + public static native void updateApplicationState(int state); + // menu methods public static native boolean onPrepareOptionsMenu(Menu menu); public static native boolean onOptionsItemSelected(int itemId, boolean checked); 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 <qpa/qwindowsysteminterface.h> + 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); |