summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@theqtcompany.com>2016-08-03 10:25:41 +0200
committerAlex Blasche <alexander.blasche@qt.io>2016-08-03 11:38:09 +0000
commitaf14b0d0e3b374f130e580c03dee6af1250cd6e1 (patch)
treed29585916011d31c8b645f79ba2bfa4d1f3894e9
parent60d1ebac9e81619a24e66fc6defc3e0299491a9d (diff)
Make Classic QtBluetooth work as an Android service
Change-Id: Ibde0242b058f728fd7e060b37f427c208325db13 Reviewed-by: BogDan Vatra <bogdan@kdab.com>
-rw-r--r--src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java32
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver.cpp8
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver_p.h2
3 files changed, 28 insertions, 14 deletions
diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java
index b8de83ca..6b46ec0a 100644
--- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java
+++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java
@@ -46,6 +46,7 @@ import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -58,14 +59,15 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver
@SuppressWarnings("WeakerAccess")
long qtObject = 0;
@SuppressWarnings("WeakerAccess")
- static Activity qtactivity = null;
+ static Context qtContext = null;
private static final int TURN_BT_ON = 3330;
private static final int TURN_BT_DISCOVERABLE = 3331;
+ private static final String TAG = "QtBluetoothBroadcastReceiver";
public void onReceive(Context context, Intent intent)
{
- synchronized (qtactivity) {
+ synchronized (qtContext) {
if (qtObject == 0)
return;
@@ -75,25 +77,30 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver
public void unregisterReceiver()
{
- synchronized (qtactivity) {
+ synchronized (qtContext) {
qtObject = 0;
- qtactivity.unregisterReceiver(this);
+ qtContext.unregisterReceiver(this);
}
}
public native void jniOnReceive(long qtObject, Context context, Intent intent);
- static public void setActivity(Activity activity, Object activityDelegate)
+ static public void setContext(Context context)
{
- qtactivity = activity;
+ qtContext = context;
}
static public void setDiscoverable()
{
+ if (!(qtContext instanceof android.app.Activity)) {
+ Log.w(TAG, "Discovery mode cannot be enabled from a service.");
+ return;
+ }
+
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
try {
- qtactivity.startActivityForResult(intent, TURN_BT_ON);
+ ((Activity)qtContext).startActivityForResult(intent, TURN_BT_ON);
} catch (Exception ex) {
ex.printStackTrace();
}
@@ -101,9 +108,14 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver
static public void setConnectable()
{
+ if (!(qtContext instanceof android.app.Activity)) {
+ Log.w(TAG, "Connectable mode cannot be enabled from a service.");
+ return;
+ }
+
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
try {
- qtactivity.startActivityForResult(intent, TURN_BT_DISCOVERABLE);
+ ((Activity)qtContext).startActivityForResult(intent, TURN_BT_DISCOVERABLE);
} catch (Exception ex) {
ex.printStackTrace();
}
@@ -142,7 +154,7 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver
try {
//Bluetooth service name
Field f = Context.class.getField("BLUETOOTH_SERVICE");
- String serviceValueString = (String)f.get(qtactivity);
+ String serviceValueString = (String)f.get(qtContext);
Class btProfileClz = Class.forName("android.bluetooth.BluetoothProfile");
@@ -155,7 +167,7 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver
int gattServer = f.getInt(null);
//get BluetoothManager instance
- Object bluetoothManager = qtactivity.getSystemService(serviceValueString);
+ Object bluetoothManager = qtContext.getSystemService(serviceValueString);
Class[] cArg = new Class[1];
cArg[0] = int.class;
diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp
index d2a088c4..50465017 100644
--- a/src/bluetooth/android/androidbroadcastreceiver.cpp
+++ b/src/bluetooth/android/androidbroadcastreceiver.cpp
@@ -53,8 +53,10 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
AndroidBroadcastReceiver::AndroidBroadcastReceiver(QObject* parent)
: QObject(parent), valid(false)
{
- //get QtActivity
- activityObject = QAndroidJniObject(QtAndroidPrivate::activity());
+ // get Qt Context
+ // TODO: replace with QtAndroidPrivate::context() introduced by Qt 5.8
+ contextObject = QAndroidJniObject(QtAndroidPrivate::activity()
+ ? QtAndroidPrivate::activity() : QtAndroidPrivate::service());
broadcastReceiverObject = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver");
if (!broadcastReceiverObject.isValid())
@@ -92,7 +94,7 @@ void AndroidBroadcastReceiver::addAction(const QAndroidJniObject &action)
intentFilterObject.callMethod<void>("addAction", "(Ljava/lang/String;)V", action.object<jstring>());
- activityObject.callObjectMethod(
+ contextObject.callObjectMethod(
"registerReceiver",
"(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;",
broadcastReceiverObject.object<jobject>(),
diff --git a/src/bluetooth/android/androidbroadcastreceiver_p.h b/src/bluetooth/android/androidbroadcastreceiver_p.h
index 1aa3049d..01d57992 100644
--- a/src/bluetooth/android/androidbroadcastreceiver_p.h
+++ b/src/bluetooth/android/androidbroadcastreceiver_p.h
@@ -79,7 +79,7 @@ protected:
virtual void onReceiveLeScan(JNIEnv *env, jobject jBluetoothDevice, jint rssi) = 0;
- QAndroidJniObject activityObject;
+ QAndroidJniObject contextObject;
QAndroidJniObject intentFilterObject;
QAndroidJniObject broadcastReceiverObject;
bool valid;