diff options
author | Peter Rustler <peter.rustler@basyskom.com> | 2015-02-11 17:32:34 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-03-18 08:46:06 +0000 |
commit | 62fb78e9f6fd93e26cbe9fdc1fb1fffbb3ff4ef3 (patch) | |
tree | 7c0765f1ab09d786f9bf5682e921e6ab5441e230 /src | |
parent | 319223134d5f0461286402ae970ad0502a17c208 (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.java | 10 | ||||
-rw-r--r-- | src/nfc/android/androidjninfc.cpp | 11 | ||||
-rw-r--r-- | src/nfc/android/androidmainnewintentlistener.cpp | 36 | ||||
-rw-r--r-- | src/nfc/android/androidmainnewintentlistener_p.h | 7 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android.cpp | 3 |
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); } } |