react-native-ble-manager 8.7.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +96 -47
  2. package/android/.gradle/7.4/checksums/checksums.lock +0 -0
  3. package/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock +0 -0
  4. package/android/.gradle/7.4/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/7.4/executionHistory/executionHistory.bin +0 -0
  6. package/android/.gradle/7.4/executionHistory/executionHistory.lock +0 -0
  7. package/android/.gradle/7.4/fileChanges/last-build.bin +0 -0
  8. package/android/.gradle/7.4/fileHashes/fileHashes.bin +0 -0
  9. package/android/.gradle/7.4/fileHashes/fileHashes.lock +0 -0
  10. package/android/.gradle/7.4/fileHashes/resourceHashesCache.bin +0 -0
  11. package/android/.gradle/7.4/gc.properties +0 -0
  12. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  13. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  14. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  15. package/android/.gradle/file-system.probe +0 -0
  16. package/android/.gradle/vcs-1/gc.properties +0 -0
  17. package/android/.idea/.name +1 -0
  18. package/android/.idea/compiler.xml +6 -0
  19. package/android/.idea/gradle.xml +18 -0
  20. package/android/.idea/jarRepositories.xml +40 -0
  21. package/android/.idea/misc.xml +10 -0
  22. package/android/.idea/vcs.xml +6 -0
  23. package/android/build.gradle +17 -17
  24. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  25. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  26. package/android/gradle.properties +3 -1
  27. package/android/gradlew +234 -0
  28. package/android/gradlew.bat +89 -0
  29. package/android/local.properties +8 -0
  30. package/android/src/main/java/it/innove/BleManager.java +33 -17
  31. package/android/src/main/java/it/innove/LegacyScanManager.java +33 -28
  32. package/android/src/main/java/it/innove/LollipopPeripheral.java +66 -65
  33. package/android/src/main/java/it/innove/LollipopScanManager.java +52 -25
  34. package/android/src/main/java/it/innove/Peripheral.java +889 -837
  35. package/android/src/main/java/it/innove/ScanManager.java +24 -23
  36. package/dist/cjs/index.d.ts +147 -0
  37. package/dist/cjs/index.js +487 -0
  38. package/dist/cjs/index.js.map +1 -0
  39. package/dist/cjs/types.d.ts +311 -0
  40. package/dist/cjs/types.js +110 -0
  41. package/dist/cjs/types.js.map +1 -0
  42. package/dist/esm/index.d.ts +147 -0
  43. package/dist/esm/index.js +471 -0
  44. package/dist/esm/index.js.map +1 -0
  45. package/dist/esm/types.d.ts +311 -0
  46. package/dist/esm/types.js +107 -0
  47. package/dist/esm/types.js.map +1 -0
  48. package/ios/BleManager.m +87 -110
  49. package/ios/BleManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  50. package/package.json +31 -4
  51. package/src/index.ts +569 -0
  52. package/src/types.ts +336 -0
  53. package/.github/FUNDING.yml +0 -3
  54. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  55. package/BleManager.js +0 -427
  56. package/index.d.ts +0 -168
@@ -5,6 +5,7 @@ import android.bluetooth.le.ScanRecord;
5
5
  import android.bluetooth.le.ScanResult;
6
6
  import android.os.Build;
7
7
  import android.os.ParcelUuid;
8
+
8
9
  import androidx.annotation.RequiresApi;
9
10
 
10
11
  import com.facebook.react.bridge.Arguments;
@@ -18,76 +19,76 @@ import java.util.Map;
18
19
  @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
19
20
  public class LollipopPeripheral extends Peripheral {
20
21
 
21
- private ScanRecord advertisingData;
22
- private ScanResult scanResult;
23
-
24
- public LollipopPeripheral(ReactContext reactContext, ScanResult result) {
25
- super(result.getDevice(), result.getRssi(), result.getScanRecord().getBytes(), reactContext);
26
- this.advertisingData = result.getScanRecord();
27
- this.scanResult = result;
28
- }
29
-
30
- public LollipopPeripheral(BluetoothDevice device, ReactApplicationContext reactContext) {
31
- super(device, reactContext);
32
- }
33
-
34
- @Override
35
- public WritableMap asWritableMap() {
36
- WritableMap map = super.asWritableMap();
37
- WritableMap advertising = Arguments.createMap();
38
-
39
- try {
40
- advertising.putMap("manufacturerData", byteArrayToWritableMap(advertisingDataBytes));
41
-
42
- if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
43
- // We can check if peripheral is connectable using the scanresult
44
- if (this.scanResult != null) {
45
- advertising.putBoolean("isConnectable", scanResult.isConnectable());
46
- }
47
- } else{
48
- // We can't check if peripheral is connectable
49
- advertising.putBoolean("isConnectable", true);
50
- }
51
-
52
-
53
- if (advertisingData != null) {
54
- String deviceName = advertisingData.getDeviceName();
55
- if (deviceName != null)
56
- advertising.putString("localName", deviceName.replace("\0", ""));
57
-
58
- WritableArray serviceUuids = Arguments.createArray();
59
- if (advertisingData.getServiceUuids() != null && advertisingData.getServiceUuids().size() != 0) {
60
- for (ParcelUuid uuid : advertisingData.getServiceUuids()) {
61
- serviceUuids.pushString(UUIDHelper.uuidToString(uuid.getUuid()));
62
- }
63
- }
64
- advertising.putArray("serviceUUIDs", serviceUuids);
65
-
66
- WritableMap serviceData = Arguments.createMap();
67
- if (advertisingData.getServiceData() != null) {
68
- for (Map.Entry<ParcelUuid, byte[]> entry : advertisingData.getServiceData().entrySet()) {
69
- if (entry.getValue() != null) {
70
- serviceData.putMap(UUIDHelper.uuidToString((entry.getKey()).getUuid()), byteArrayToWritableMap(entry.getValue()));
71
- }
72
- }
73
- }
22
+ private ScanRecord advertisingData;
23
+ private ScanResult scanResult;
24
+
25
+ public LollipopPeripheral(ReactContext reactContext, ScanResult result) {
26
+ super(result.getDevice(), result.getRssi(), result.getScanRecord().getBytes(), reactContext);
27
+ this.advertisingData = result.getScanRecord();
28
+ this.scanResult = result;
29
+ }
30
+
31
+ public LollipopPeripheral(BluetoothDevice device, ReactApplicationContext reactContext) {
32
+ super(device, reactContext);
33
+ }
34
+
35
+ @Override
36
+ public WritableMap asWritableMap() {
37
+ WritableMap map = super.asWritableMap();
38
+ WritableMap advertising = Arguments.createMap();
39
+
40
+ try {
41
+ advertising.putMap("manufacturerData", byteArrayToWritableMap(advertisingDataBytes));
42
+
43
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
44
+ // We can check if peripheral is connectable using the scanresult
45
+ if (this.scanResult != null) {
46
+ advertising.putBoolean("isConnectable", scanResult.isConnectable());
47
+ }
48
+ } else {
49
+ // We can't check if peripheral is connectable
50
+ advertising.putBoolean("isConnectable", true);
51
+ }
52
+
53
+
54
+ if (advertisingData != null) {
55
+ String deviceName = advertisingData.getDeviceName();
56
+ if (deviceName != null)
57
+ advertising.putString("localName", deviceName.replace("\0", ""));
58
+
59
+ WritableArray serviceUuids = Arguments.createArray();
60
+ if (advertisingData.getServiceUuids() != null && advertisingData.getServiceUuids().size() != 0) {
61
+ for (ParcelUuid uuid : advertisingData.getServiceUuids()) {
62
+ serviceUuids.pushString(UUIDHelper.uuidToString(uuid.getUuid()));
63
+ }
64
+ }
65
+ advertising.putArray("serviceUUIDs", serviceUuids);
66
+
67
+ WritableMap serviceData = Arguments.createMap();
68
+ if (advertisingData.getServiceData() != null) {
69
+ for (Map.Entry<ParcelUuid, byte[]> entry : advertisingData.getServiceData().entrySet()) {
70
+ if (entry.getValue() != null) {
71
+ serviceData.putMap(UUIDHelper.uuidToString((entry.getKey()).getUuid()), byteArrayToWritableMap(entry.getValue()));
72
+ }
73
+ }
74
+ }
74
75
 
75
76
  advertising.putMap("serviceData", serviceData);
76
- advertising.putInt("txPowerLevel", advertisingData.getTxPowerLevel());
77
- }
77
+ advertising.putInt("txPowerLevel", advertisingData.getTxPowerLevel());
78
+ }
78
79
 
79
- map.putMap("advertising", advertising);
80
- } catch (Exception e) { // this shouldn't happen
81
- e.printStackTrace();
82
- }
80
+ map.putMap("advertising", advertising);
81
+ } catch (Exception e) { // this shouldn't happen
82
+ e.printStackTrace();
83
+ }
83
84
 
84
- return map;
85
- }
85
+ return map;
86
+ }
86
87
 
87
- public void updateData(ScanResult result) {
88
- advertisingData = result.getScanRecord();
89
- advertisingDataBytes = advertisingData.getBytes();
90
- }
88
+ public void updateData(ScanResult result) {
89
+ advertisingData = result.getScanRecord();
90
+ advertisingDataBytes = advertisingData.getBytes();
91
+ }
91
92
 
92
93
 
93
94
  }
@@ -88,11 +88,19 @@ public class LollipopScanManager extends ScanManager {
88
88
  for (int i = 0; i < serviceUUIDs.size(); i++) {
89
89
  ScanFilter filter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(UUIDHelper.uuidFromString(serviceUUIDs.getString(i)))).build();
90
90
  filters.add(filter);
91
- Log.d(bleManager.LOG_TAG, "Filter service: " + serviceUUIDs.getString(i));
91
+ Log.d(BleManager.LOG_TAG, "Filter service: " + serviceUUIDs.getString(i));
92
92
  }
93
93
  }
94
94
 
95
+ if (options.hasKey("exactAdvertisingName")) {
96
+ String expectedName = options.getString("exactAdvertisingName");
97
+ Log.d(BleManager.LOG_TAG, "Filter on advertising name:" + expectedName);
98
+ ScanFilter filter = new ScanFilter.Builder().setDeviceName(expectedName).build();
99
+ filters.add(filter);
100
+ }
101
+
95
102
  getBluetoothAdapter().getBluetoothLeScanner().startScan(filters, scanSettingsBuilder.build(), mScanCallback);
103
+
96
104
  if (scanSeconds > 0) {
97
105
  Thread thread = new Thread() {
98
106
  private int currentScanSession = scanSessionId.incrementAndGet();
@@ -109,11 +117,13 @@ public class LollipopScanManager extends ScanManager {
109
117
  @Override
110
118
  public void run() {
111
119
  BluetoothAdapter btAdapter = getBluetoothAdapter();
120
+
112
121
  // check current scan session was not stopped
113
122
  if (scanSessionId.intValue() == currentScanSession) {
114
123
  if (btAdapter.getState() == BluetoothAdapter.STATE_ON) {
115
124
  btAdapter.getBluetoothLeScanner().stopScan(mScanCallback);
116
125
  }
126
+
117
127
  WritableMap map = Arguments.createMap();
118
128
  map.putInt("status", 10);
119
129
  bleManager.sendEvent("BleManagerStopScan", map);
@@ -129,41 +139,58 @@ public class LollipopScanManager extends ScanManager {
129
139
  callback.invoke();
130
140
  }
131
141
 
132
- private ScanCallback mScanCallback = new ScanCallback() {
142
+ private void onDiscoveredPeripheral(final ScanResult result) {
143
+ String info;
144
+ ScanRecord record = result.getScanRecord();
145
+
146
+ if (record != null) {
147
+ info = record.getDeviceName();
148
+ } else if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED) {
149
+ info = result.getDevice().getName();
150
+ } else {
151
+ info = result.toString();
152
+ }
153
+
154
+ Log.i(BleManager.LOG_TAG, "DiscoverPeripheral: " + info);
155
+
156
+ LollipopPeripheral peripheral = (LollipopPeripheral) bleManager.getPeripheral(result.getDevice());
157
+ if (peripheral == null) {
158
+ peripheral = new LollipopPeripheral(bleManager.getReactContext(), result);
159
+ } else {
160
+ peripheral.updateData(result);
161
+ peripheral.updateRssi(result.getRssi());
162
+ }
163
+ bleManager.savePeripheral(peripheral);
164
+
165
+ WritableMap map = peripheral.asWritableMap();
166
+ bleManager.sendEvent("BleManagerDiscoverPeripheral", map);
167
+ }
168
+
169
+ private final ScanCallback mScanCallback = new ScanCallback() {
133
170
  @Override
134
171
  public void onScanResult(final int callbackType, final ScanResult result) {
135
-
136
172
  runOnUiThread(new Runnable() {
137
173
  @Override
138
174
  public void run() {
139
- String info;
140
- ScanRecord record = result.getScanRecord();
141
- if (record != null)
142
- info = record.getDeviceName();
143
- else if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED)
144
- info = result.getDevice().getName();
145
- else
146
- info = result.toString();
147
-
148
- Log.i(bleManager.LOG_TAG, "DiscoverPeripheral: " + info);
149
-
150
- LollipopPeripheral peripheral = (LollipopPeripheral) bleManager.getPeripheral(result.getDevice());
151
- if (peripheral == null) {
152
- peripheral = new LollipopPeripheral(bleManager.getReactContext(), result);
153
- } else {
154
- peripheral.updateData(result);
155
- peripheral.updateRssi(result.getRssi());
156
- }
157
- bleManager.savePeripheral(peripheral);
158
-
159
- WritableMap map = peripheral.asWritableMap();
160
- bleManager.sendEvent("BleManagerDiscoverPeripheral", map);
175
+ onDiscoveredPeripheral(result);
161
176
  }
162
177
  });
163
178
  }
164
179
 
165
180
  @Override
166
181
  public void onBatchScanResults(final List<ScanResult> results) {
182
+ runOnUiThread(new Runnable() {
183
+ @Override
184
+ public void run() {
185
+ if (results.isEmpty()) {
186
+ return;
187
+ }
188
+
189
+ for (ScanResult result : results) {
190
+ onDiscoveredPeripheral(result);
191
+ }
192
+ }
193
+ });
167
194
  }
168
195
 
169
196
  @Override