aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/io/trygvis/android/bt/DefaultBtService.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/io/trygvis/android/bt/DefaultBtService.java')
-rw-r--r--app/src/main/java/io/trygvis/android/bt/DefaultBtService.java77
1 files changed, 53 insertions, 24 deletions
diff --git a/app/src/main/java/io/trygvis/android/bt/DefaultBtService.java b/app/src/main/java/io/trygvis/android/bt/DefaultBtService.java
index e42e685..2487bd8 100644
--- a/app/src/main/java/io/trygvis/android/bt/DefaultBtService.java
+++ b/app/src/main/java/io/trygvis/android/bt/DefaultBtService.java
@@ -31,6 +31,7 @@ import io.trygvis.android.Function;
import io.trygvis.android.LocalBinder;
import io.trygvis.soilmoisture.R;
+import static android.bluetooth.BluetoothAdapter.LeScanCallback;
import static java.util.Collections.unmodifiableCollection;
public class DefaultBtService<A> extends Service implements BtService<A> {
@@ -54,6 +55,8 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
private boolean scanning = false;
+ private Scanner scanner = new Scanner();
+
// -----------------------------------------------------------------------
// BtService Implementation
// -----------------------------------------------------------------------
@@ -111,7 +114,7 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
for (String address : addresses) {
BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(address);
- register(bluetoothDevice, null, null);
+ register(bluetoothDevice, null, false);
}
return true;
@@ -134,8 +137,9 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
handler.postDelayed(this::stopScanning, timeoutMs);
}
- if (bluetoothAdapter.startLeScan(leScanCallback)) {
+ if (bluetoothAdapter.startLeScan(scanner)) {
scanning = true;
+ scanner.found.clear();
sendBroadcast(createScanStarted());
return true;
}
@@ -148,9 +152,22 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
Log.d(TAG, "stopScanning");
// This doesn't mind being called twice.
- bluetoothAdapter.stopLeScan(leScanCallback);
+ bluetoothAdapter.stopLeScan(scanner);
scanning = false;
+ for (BtDevice<A> device : devices) {
+ boolean recentlySeen = scanner.found.contains(device);
+ Log.i(TAG, "scanner.found.contains(device)=" + recentlySeen + ", " +
+ "address=" + device.getAddress());
+
+ boolean old = device.isRecentlySeen();
+ device.setRecentlySeen(recentlySeen);
+
+ // Only if it not seen and it wasn't previously seen
+ if (!recentlySeen && old) {
+ sendBroadcast(createDevicePropertyUpdated(device.getAddress()));
+ }
+ }
sendBroadcast(createScanStopped());
}
@@ -163,7 +180,7 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
}
BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(mac);
- return register(bluetoothDevice, null, null);
+ return register(bluetoothDevice, null, false);
}
@Override
@@ -205,16 +222,6 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
}
// -----------------------------------------------------------------------
- // Scanning
- // -----------------------------------------------------------------------
-
- private BluetoothAdapter.LeScanCallback leScanCallback = (device, rssi, scanRecord) -> {
- BtScanResult scanResult = new BtScanResult(scanRecord);
-
- register(device, rssi, scanResult);
- };
-
- // -----------------------------------------------------------------------
// Service Implementation
// -----------------------------------------------------------------------
@@ -278,17 +285,19 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
return openOrCreateDatabase("bt-devices", MODE_ENABLE_WRITE_AHEAD_LOGGING, null);
}
- private BtDevice<A> register(BluetoothDevice bluetoothDevice, Integer rssi, BtScanResult scanResult) {
+ private BtDevice<A> register(BluetoothDevice bluetoothDevice, Integer rssi, boolean fromScan) {
String address = bluetoothDevice.getAddress();
- BtDevice<A> btDevice = findDevice(address);
+ BtDevice<A> device = findDevice(address);
- if (btDevice != null) {
- return btDevice;
+ if (device != null) {
+ device.setRecentlySeen(true);
+ sendBroadcast(createDevicePropertyUpdated(device.getAddress()));
+ return device;
}
long now = System.currentTimeMillis();
- btDevice = runTx(db -> {
+ device = runTx(db -> {
Cursor cursor = db.query(Tables.T_BT_DEVICE, new String[]{Tables.C_ID, Tables.C_FIRST_SEEN},
Tables.C_ADDRESS + "=?", new String[]{address}, null, null, null);
@@ -315,15 +324,15 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
Log.i(TAG, "New device: " + address + ", seenBefore=" + seenBefore);
cursor.close();
- return new BtDevice<>(this, bluetoothDevice, db, btDbIntegration, id, rssi, scanResult,
- seenBefore, firstSeen, lastSeen);
+ return new BtDevice<>(this, bluetoothDevice, db, btDbIntegration, id, rssi, seenBefore,
+ firstSeen, lastSeen, fromScan);
});
- devices.add(btDevice);
+ devices.add(device);
- sendBroadcast(createNewDevice(btDevice.getAddress()));
+ sendBroadcast(createNewDevice(device.getAddress()));
- return btDevice;
+ return device;
}
Intent createScanStarted() {
@@ -348,6 +357,12 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
putExtra("address", address);
}
+ Intent createDevicePropertyUpdated(String address) {
+ return new Intent(BtServiceListenerBroadcastReceiver.INTENT_NAME).
+ putExtra("event", "devicePropertyUpdated").
+ putExtra("address", address);
+ }
+
public static void dispatchEvent(Intent intent, BtServiceListenerBroadcastReceiver listener) {
String event = intent.getStringExtra("event");
Log.i(TAG, "Dispatching event " + intent.getAction() + "/" + event);
@@ -361,6 +376,9 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
case "newDevice":
listener.onNewDevice(intent.getStringExtra("address"));
break;
+ case "devicePropertyUpdated":
+ listener.onDevicePropertyUpdated(intent.getStringExtra("address"));
+ break;
case "deviceConnection":
listener.onDeviceConnection(intent.getStringExtra("address"));
break;
@@ -377,4 +395,15 @@ public class DefaultBtService<A> extends Service implements BtService<A> {
}
return null;
}
+
+ private class Scanner implements LeScanCallback {
+
+ private List<BtDevice> found = new ArrayList<>();
+
+ @Override
+ public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
+ BtDevice<A> d = register(device, rssi, true);
+ found.add(d);
+ }
+ }
}