From c4685214d8db34166213ffa373a16af1a99401a5 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Tue, 27 Jan 2015 21:23:50 +0100 Subject: o Adding 'recently seen' on BtDevice. Updated when scanning. o Removing BtScanResult, it was never used. o Getting MainActivity to listen on device property changed so the UI is properly updated. o Adding a status bar with color to indicate if the device is available, connected or not seen. --- .../io/trygvis/android/bt/DefaultBtService.java | 77 +++++++++++++++------- 1 file changed, 53 insertions(+), 24 deletions(-) (limited to 'app/src/main/java/io/trygvis/android/bt/DefaultBtService.java') 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 extends Service implements BtService { @@ -54,6 +55,8 @@ public class DefaultBtService extends Service implements BtService { private boolean scanning = false; + private Scanner scanner = new Scanner(); + // ----------------------------------------------------------------------- // BtService Implementation // ----------------------------------------------------------------------- @@ -111,7 +114,7 @@ public class DefaultBtService extends Service implements BtService { 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 extends Service implements BtService { 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 extends Service implements BtService { Log.d(TAG, "stopScanning"); // This doesn't mind being called twice. - bluetoothAdapter.stopLeScan(leScanCallback); + bluetoothAdapter.stopLeScan(scanner); scanning = false; + for (BtDevice 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 extends Service implements BtService { } BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(mac); - return register(bluetoothDevice, null, null); + return register(bluetoothDevice, null, false); } @Override @@ -204,16 +221,6 @@ public class DefaultBtService extends Service implements BtService { } } - // ----------------------------------------------------------------------- - // 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 extends Service implements BtService { return openOrCreateDatabase("bt-devices", MODE_ENABLE_WRITE_AHEAD_LOGGING, null); } - private BtDevice register(BluetoothDevice bluetoothDevice, Integer rssi, BtScanResult scanResult) { + private BtDevice register(BluetoothDevice bluetoothDevice, Integer rssi, boolean fromScan) { String address = bluetoothDevice.getAddress(); - BtDevice btDevice = findDevice(address); + BtDevice 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 extends Service implements BtService { 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 extends Service implements BtService { 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 extends Service implements BtService { 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 extends Service implements BtService { } return null; } + + private class Scanner implements LeScanCallback { + + private List found = new ArrayList<>(); + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + BtDevice d = register(device, rssi, true); + found.add(d); + } + } } -- cgit v1.2.3