summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2014-08-27 17:49:17 +0200
committerChristian Stromme <christian.stromme@digia.com>2014-09-05 16:11:21 +0200
commitc08eef29b45646643535e917f70492727160720b (patch)
treeddcdeca1bf7481cda73a70f0aa7d72e076824c08
parentda4a9b5deb8200621753252bc742702964ebf801 (diff)
Android: Call onResume() and onPause() when the application is paused.
To avoid unnecessary resource usage we should call onPause() and onResume() on the WebView when the application state changes to avoid unnecessary resource usage. Change-Id: I31bf37f8b13e8f9da65a7a6c616c536456c5bea2 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r--src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java36
-rw-r--r--src/webview/qwebview_android.cpp20
-rw-r--r--src/webview/qwebview_android_p.h3
3 files changed, 57 insertions, 2 deletions
diff --git a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java
index 037b0ad..84068fc 100644
--- a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java
+++ b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java
@@ -47,6 +47,8 @@ import android.util.Log;
import android.webkit.WebSettings.PluginState;
import android.graphics.Bitmap;
import java.util.concurrent.Semaphore;
+import java.lang.reflect.Method;
+import android.os.Build;
public class QtAndroidWebViewController
{
@@ -54,6 +56,11 @@ public class QtAndroidWebViewController
private final long m_id;
private WebView m_webView = null;
private static final String TAG = "QtAndroidWebViewController";
+
+ // API 11 methods
+ private Method m_webViewOnResume = null;
+ private Method m_webViewOnPause = null;
+
// Native callbacks
private native void c_onPageFinished(long id, String url);
private native void c_onPageStarted(long id, String url, Bitmap icon);
@@ -135,6 +142,13 @@ public class QtAndroidWebViewController
} catch (Exception e) {
e.printStackTrace();
}
+
+ if (Build.VERSION.SDK_INT > 10) {
+ try {
+ m_webViewOnResume = m_webView.getClass().getMethod("onResume");
+ m_webViewOnPause = m_webView.getClass().getMethod("onPause");
+ } catch (Exception e) { /* Do nothing */ e.printStackTrace(); }
+ }
}
public void loadUrl(final String url)
@@ -249,4 +263,26 @@ public class QtAndroidWebViewController
{
return m_webView;
}
+
+ public void onPause()
+ {
+ if (m_webViewOnPause == null)
+ return;
+
+ m_activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() { try { m_webViewOnPause.invoke(m_webView); } catch (Exception e) { e.printStackTrace(); } }
+ });
+ }
+
+ public void onResume()
+ {
+ if (m_webViewOnResume == null)
+ return;
+
+ m_activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() { try { m_webViewOnResume.invoke(m_webView); } catch (Exception e) { e.printStackTrace(); } }
+ });
+ }
}
diff --git a/src/webview/qwebview_android.cpp b/src/webview/qwebview_android.cpp
index 81cedb3..8ea891d 100644
--- a/src/webview/qwebview_android.cpp
+++ b/src/webview/qwebview_android.cpp
@@ -41,9 +41,12 @@
#include <QtQuick/qquickitem.h>
#include <QtCore/qmap.h>
#include <android/bitmap.h>
+#include <QtGui/qguiapplication.h>
QT_BEGIN_NAMESPACE
+static const char qtAndroidWebViewControllerClass[] = "org/qtproject/qt5/android/view/QtAndroidWebViewController";
+
QWebViewPrivate *QWebViewPrivate::create(QWebView *q)
{
return new QAndroidWebViewPrivate(q);
@@ -73,13 +76,15 @@ QAndroidWebViewPrivate::QAndroidWebViewPrivate(QWebView *q)
: QWebViewPrivate(q)
, m_id(reinterpret_cast<quintptr>(this))
{
- m_viewController = QAndroidJniObject("org/qtproject/qt5/android/view/QtAndroidWebViewController",
+ m_viewController = QAndroidJniObject(qtAndroidWebViewControllerClass,
"(Landroid/app/Activity;J)V",
QtAndroid::androidActivity().object(),
m_id);
m_webView = m_viewController.callObjectMethod("getWebView",
"()Landroid/webkit/WebView;");
g_webViews->insert(m_id, this);
+ connect(qApp, &QGuiApplication::applicationStateChanged,
+ this, &QAndroidWebViewPrivate::onApplicationStateChanged);
}
QAndroidWebViewPrivate::~QAndroidWebViewPrivate()
@@ -134,6 +139,17 @@ void *QAndroidWebViewPrivate::nativeWebView() const
return m_webView.object();
}
+void QAndroidWebViewPrivate::onApplicationStateChanged(Qt::ApplicationState state)
+{
+ if (QtAndroid::androidSdkVersion() < 11)
+ return;
+
+ if (state == Qt::ApplicationActive)
+ m_viewController.callMethod<void>("onResume");
+ else
+ m_viewController.callMethod<void>("onPause");
+}
+
QT_END_NAMESPACE
static void c_onPageFinished(JNIEnv *env,
@@ -243,7 +259,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
JNIEnv *jniEnv = uenv.nativeEnvironment;
- jclass clazz = jniEnv->FindClass("org/qtproject/qt5/android/view/QtAndroidWebViewController");
+ jclass clazz = jniEnv->FindClass(qtAndroidWebViewControllerClass);
if (!clazz)
return JNI_ERR;
diff --git a/src/webview/qwebview_android_p.h b/src/webview/qwebview_android_p.h
index 1ab2709..761881a 100644
--- a/src/webview/qwebview_android_p.h
+++ b/src/webview/qwebview_android_p.h
@@ -77,6 +77,9 @@ public Q_SLOTS:
void goForward() const;
void stopLoading() const;
+private Q_SLOTS:
+ void onApplicationStateChanged(Qt::ApplicationState state);
+
private:
quintptr m_id;
QAndroidJniObject m_viewController;