Skip to content

Commit 9ac57ff

Browse files
authored
Fix issue when using Central and Peripheral modes at the same time (#174)
* Add checks to see if connect event is really for a Central or Peripheral * Update gradle
1 parent 5c6c46a commit 9ac57ff

File tree

4 files changed

+19
-5
lines changed

4 files changed

+19
-5
lines changed

blessed/src/main/java/com/welie/blessed/BluetoothCentralManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ public class BluetoothCentralManager {
7979
private @Nullable volatile BluetoothLeScanner bluetoothScanner;
8080
private @Nullable volatile BluetoothLeScanner autoConnectScanner;
8181
private @NotNull final BluetoothCentralManagerCallback bluetoothCentralManagerCallback;
82-
private @NotNull final Map<String, BluetoothPeripheral> connectedPeripherals = new ConcurrentHashMap<>();
83-
private @NotNull final Map<String, BluetoothPeripheral> unconnectedPeripherals = new ConcurrentHashMap<>();
82+
protected @NotNull final Map<String, BluetoothPeripheral> connectedPeripherals = new ConcurrentHashMap<>();
83+
protected @NotNull final Map<String, BluetoothPeripheral> unconnectedPeripherals = new ConcurrentHashMap<>();
8484
private @NotNull final Map<String, BluetoothPeripheral> scannedPeripherals = new ConcurrentHashMap<>();
8585
private @NotNull final List<String> reconnectPeripheralAddresses = new ArrayList<>();
8686
private @NotNull final Map<String, BluetoothPeripheralCallback> reconnectCallbacks = new ConcurrentHashMap<>();

blessed/src/main/java/com/welie/blessed/BluetoothPeripheralManager.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public class BluetoothPeripheralManager {
9090
private @NotNull final BluetoothLeAdvertiser bluetoothLeAdvertiser;
9191
private @NotNull final BluetoothGattServer bluetoothGattServer;
9292
private @NotNull final BluetoothPeripheralManagerCallback callback;
93+
private @Nullable BluetoothCentralManager centralManager = null;
9394
protected @NotNull final Queue<Runnable> commandQueue = new ConcurrentLinkedQueue<>();
9495
private @NotNull final HashMap<BluetoothGattCharacteristic, byte[]> writeLongCharacteristicTemporaryBytes = new HashMap<>();
9596
private @NotNull final HashMap<BluetoothGattDescriptor, byte[]> writeLongDescriptorTemporaryBytes = new HashMap<>();
@@ -106,6 +107,15 @@ public class BluetoothPeripheralManager {
106107
public void onConnectionStateChange(final BluetoothDevice device, final int status, final int newState) {
107108
if (status == BluetoothGatt.GATT_SUCCESS) {
108109
if (newState == BluetoothProfile.STATE_CONNECTED) {
110+
111+
// First check if this is a connecting peripheral because Android
112+
// will also call this callback for connecting peripherals
113+
if (centralManager != null) {
114+
if (centralManager.unconnectedPeripherals.containsKey(device.getAddress())) {
115+
return;
116+
}
117+
}
118+
109119
// Call connect() even though we are already connected
110120
// It basically tells Android we will really use this connection
111121
// If we don't do this, then cancelConnection won't work
@@ -119,7 +129,7 @@ public void onConnectionStateChange(final BluetoothDevice device, final int stat
119129

120130
handleDeviceConnected(device);
121131
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
122-
// Deal is double disconnect messages
132+
// Deal with double disconnect messages
123133
if (!connectedCentralsMap.containsKey(device.getAddress())) return;
124134

125135
handleDeviceDisconnected(device);
@@ -486,6 +496,10 @@ public BluetoothPeripheralManager(@NotNull final Context context, @NotNull final
486496
context.registerReceiver(adapterStateReceiver, filter);
487497
}
488498

499+
public void setCentralManager(@NotNull final BluetoothCentralManager central) {
500+
this.centralManager = Objects.requireNonNull(central);
501+
}
502+
489503
/**
490504
* Close the BluetoothPeripheralManager
491505
*

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77

88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:7.2.2'
10+
classpath 'com.android.tools.build:gradle:7.3.1'
1111

1212
// NOTE: Do not place your application dependencies here; they belong
1313
// in the individual module build.gradle files

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip

0 commit comments

Comments
 (0)