From c360eb3392ca36094d55b8d29bca9f6bc773ca01 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 26 May 2016 19:03:38 +0200 Subject: [PATCH] This should fix some connection problems #274 Some APIs have become synchronous, it seems, e.g. connectGatt() -> onConnectionStateChanged() -> discoverServices() -> onServicesDiscovered() appears to happen synchronously. So connectGatt() will not return before services are discovered! So now we deal with this situation. --- .../service/btle/AbstractBTLEDeviceSupport.java | 3 +-- .../freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java index 04179458c..261181128 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java @@ -147,7 +147,6 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im } private void gattServicesDiscovered(List discoveredGattServices) { - if (discoveredGattServices == null) { return; } @@ -180,7 +179,7 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im @Override public void onServicesDiscovered(BluetoothGatt gatt) { - gattServicesDiscovered(getQueue().getSupportedGattServices()); + gattServicesDiscovered(gatt.getServices()); initializeDevice(createTransactionBuilder("Initializing device")).queue(getQueue()); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java index f60094356..4a432d0b5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java @@ -308,6 +308,12 @@ public final class BtLEQueue { public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { LOG.debug("connection state change, newState: " + newState + getStatusString(status)); + synchronized (mGattMonitor) { + if (mBluetoothGatt == null) { + mBluetoothGatt = gatt; + } + } + if (!checkCorrectGattInstance(gatt, "connection state event")) { return; }