summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeter Rustler <peter.rustler@basyskom.com>2015-02-11 17:32:34 +0100
committerAlex Blasche <alexander.blasche@theqtcompany.com>2015-03-18 08:46:06 +0000
commit62fb78e9f6fd93e26cbe9fdc1fb1fffbb3ff4ef3 (patch)
tree7c0765f1ab09d786f9bf5682e921e6ab5441e230 /src
parent319223134d5f0461286402ae970ad0502a17c208 (diff)
Adapt to the new "onResumePause" API
In Anroid the foreground activity get an onResume/onPause by implemmenting callbacks. This callback will be called from android when your activity go into foreground or background. In Nfc we need to know if we are the activity in foreground for calling enableForegroundDispatch. In Android this is mandatory. To support this callback an API was added in qtbase. This patch implement an listener of this API to get that events and use some logic to enable and disable foreground dispatch of nfc tags. Change-Id: Ibceed51c5d5905a28f01081027fdf5e0e8b4ef12 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java10
-rw-r--r--src/nfc/android/androidjninfc.cpp11
-rw-r--r--src/nfc/android/androidmainnewintentlistener.cpp36
-rw-r--r--src/nfc/android/androidmainnewintentlistener_p.h7
-rw-r--r--src/nfc/qnearfieldmanager_android.cpp3
5 files changed, 52 insertions, 15 deletions
diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
index aefd73c0..e2c14431 100644
--- a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
+++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
@@ -90,9 +90,9 @@ public class QtNfc
//Log.d(TAG, "Thread:" + Thread.currentThread().getId());
}
- static public void start()
+ static public boolean start()
{
- if (m_adapter == null) return;
+ if (m_adapter == null) return false;
m_activity.runOnUiThread(new Runnable() {
public void run() {
//Log.d(TAG, "Enabling NFC");
@@ -120,17 +120,19 @@ public class QtNfc
}
}
});
+ return true;
}
- static public void stop()
+ static public boolean stop()
{
- if (m_adapter == null) return;
+ if (m_adapter == null) return false;
m_activity.runOnUiThread(new Runnable() {
public void run() {
//Log.d(TAG, "Disabling NFC");
m_adapter.disableForegroundDispatch(m_activity);
}
});
+ return true;
}
static public boolean isAvailable()
diff --git a/src/nfc/android/androidjninfc.cpp b/src/nfc/android/androidjninfc.cpp
index cf804bb8..7083e8d3 100644
--- a/src/nfc/android/androidjninfc.cpp
+++ b/src/nfc/android/androidjninfc.cpp
@@ -79,8 +79,7 @@ bool startDiscovery()
if (!aenv.jniEnv)
return false;
- aenv.jniEnv->CallStaticObjectMethod(nfcClass, startDiscoveryId);
- return true;
+ return aenv.jniEnv->CallStaticBooleanMethod(nfcClass, startDiscoveryId);
}
bool isAvailable()
@@ -95,12 +94,12 @@ bool isAvailable()
bool stopDiscovery()
{
+ __android_log_print(ANDROID_LOG_INFO, "Qt", "QtNfc::stopDiscovery()");
AttachedJNIEnv aenv;
if (!aenv.jniEnv)
return false;
- aenv.jniEnv->CallStaticObjectMethod(nfcClass, stopDiscoveryId);
- return true;
+ return aenv.jniEnv->CallStaticBooleanMethod(nfcClass, startDiscoveryId);
}
bool registerListener(AndroidNfcListenerInterface *listener)
@@ -168,8 +167,8 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/nfc/QtNfc");
nfcClass = static_cast<jclass>(env->NewGlobalRef(clazz));
- GET_AND_CHECK_STATIC_METHOD(startDiscoveryId, nfcClass, "start", "()V");
- GET_AND_CHECK_STATIC_METHOD(stopDiscoveryId, nfcClass, "stop", "()V");
+ GET_AND_CHECK_STATIC_METHOD(startDiscoveryId, nfcClass, "start", "()Z");
+ GET_AND_CHECK_STATIC_METHOD(stopDiscoveryId, nfcClass, "stop", "()Z");
GET_AND_CHECK_STATIC_METHOD(isAvailableId, nfcClass, "isAvailable", "()Z");
javaVM = vm;
diff --git a/src/nfc/android/androidmainnewintentlistener.cpp b/src/nfc/android/androidmainnewintentlistener.cpp
index 3772e60f..a23695d3 100644
--- a/src/nfc/android/androidmainnewintentlistener.cpp
+++ b/src/nfc/android/androidmainnewintentlistener.cpp
@@ -37,14 +37,16 @@
QT_BEGIN_ANDROIDNFC_NAMESPACE
MainNfcNewIntentListener::MainNfcNewIntentListener()
- : listeners(), listenersLock()
+ : listeners(), listenersLock(), paused(true), receiving(false)
{
QtAndroidPrivate::registerNewIntentListener(this);
+ QtAndroidPrivate::registerResumePauseListener(this);
}
MainNfcNewIntentListener::~MainNfcNewIntentListener()
{
QtAndroidPrivate::unregisterNewIntentListener(this);
+ QtAndroidPrivate::unregisterResumePauseListener(this);
}
bool MainNfcNewIntentListener::handleNewIntent(JNIEnv *env, jobject intent)
@@ -67,6 +69,7 @@ bool MainNfcNewIntentListener::registerListener(AndroidNfcListenerInterface *lis
if (!listeners.contains(listener))
listeners.push_back(listener);
listenersLock.unlock();
+ updateReceiveState();
return true;
}
@@ -75,7 +78,38 @@ bool MainNfcNewIntentListener::unregisterListener(AndroidNfcListenerInterface *l
listenersLock.lockForWrite();
listeners.removeOne(listener);
listenersLock.unlock();
+ updateReceiveState();
return true;
}
+void MainNfcNewIntentListener::handleResume()
+{
+ paused = false;
+ updateReceiveState();
+}
+
+void MainNfcNewIntentListener::handlePause()
+{
+ paused = true;
+ updateReceiveState();
+}
+
+void MainNfcNewIntentListener::updateReceiveState()
+{
+ if (paused && receiving) {
+ AndroidNfc::stopDiscovery();
+ receiving = false;
+ return;
+ }
+ listenersLock.lockForRead();
+ if (listeners.count() && !receiving)
+ receiving = AndroidNfc::startDiscovery();
+
+ if (!listeners.count() && receiving) {
+ AndroidNfc::stopDiscovery();
+ receiving = false;
+ }
+ listenersLock.unlock();
+}
+
QT_END_ANDROIDNFC_NAMESPACE
diff --git a/src/nfc/android/androidmainnewintentlistener_p.h b/src/nfc/android/androidmainnewintentlistener_p.h
index 5c0f751c..fd68ac7b 100644
--- a/src/nfc/android/androidmainnewintentlistener_p.h
+++ b/src/nfc/android/androidmainnewintentlistener_p.h
@@ -42,7 +42,7 @@
QT_BEGIN_ANDROIDNFC_NAMESPACE
-class MainNfcNewIntentListener : public QtAndroidPrivate::NewIntentListener
+class MainNfcNewIntentListener : public QtAndroidPrivate::NewIntentListener, QtAndroidPrivate::ResumePauseListener
{
public:
MainNfcNewIntentListener();
@@ -50,9 +50,14 @@ public:
bool handleNewIntent(JNIEnv *env, jobject intent);
bool registerListener(AndroidNfcListenerInterface *listener);
bool unregisterListener(AndroidNfcListenerInterface *listener);
+ void handleResume();
+ void handlePause();
+ void updateReceiveState();
protected:
QList<AndroidNfc::AndroidNfcListenerInterface*> listeners;
QReadWriteLock listenersLock;
+ bool paused;
+ bool receiving;
};
QT_END_ANDROIDNFC_NAMESPACE
diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp
index 2b76e91f..b317fadf 100644
--- a/src/nfc/qnearfieldmanager_android.cpp
+++ b/src/nfc/qnearfieldmanager_android.cpp
@@ -276,13 +276,10 @@ void QNearFieldManagerPrivateImpl::updateReceiveState()
{
if (m_detecting) {
AndroidNfc::registerListener(this);
- AndroidNfc::startDiscovery();
} else {
if (ndefMessageHandlers.count() || ndefFilterHandlers.count()) {
AndroidNfc::registerListener(this);
- AndroidNfc::startDiscovery();
} else {
- AndroidNfc::stopDiscovery();
AndroidNfc::unregisterListener(this);
}
}