react-native-ble-nitro 1.0.0-beta.8 → 1.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 (354) hide show
  1. package/BleNitro.podspec +39 -0
  2. package/LICENSE +1 -1
  3. package/README.md +273 -77
  4. package/ios/BleNitroBleManager.swift +425 -464
  5. package/ios/BlePeripheralDelegate.swift +174 -0
  6. package/lib/commonjs/index.d.ts +174 -10
  7. package/lib/commonjs/index.d.ts.map +1 -1
  8. package/lib/commonjs/index.js +461 -38
  9. package/lib/commonjs/index.js.map +1 -1
  10. package/lib/commonjs/specs/NativeBleNitro.d.ts +5 -0
  11. package/lib/commonjs/specs/NativeBleNitro.d.ts.map +1 -0
  12. package/lib/commonjs/{utils/index.js → specs/NativeBleNitro.js} +6 -3
  13. package/lib/commonjs/specs/NativeBleNitro.js.map +1 -0
  14. package/lib/commonjs/specs/NativeBleNitro.nitro.d.ts +69 -0
  15. package/lib/commonjs/specs/NativeBleNitro.nitro.d.ts.map +1 -0
  16. package/lib/commonjs/specs/NativeBleNitro.nitro.js +14 -0
  17. package/lib/commonjs/specs/NativeBleNitro.nitro.js.map +1 -0
  18. package/lib/index.d.ts +174 -10
  19. package/lib/index.js +456 -16
  20. package/lib/specs/NativeBleNitro.d.ts +4 -0
  21. package/lib/specs/NativeBleNitro.js +5 -0
  22. package/lib/specs/NativeBleNitro.nitro.d.ts +68 -0
  23. package/lib/specs/NativeBleNitro.nitro.js +10 -0
  24. package/nitro.json +1 -1
  25. package/nitrogen/generated/android/BleNitro+autolinking.cmake +2 -10
  26. package/nitrogen/generated/android/BleNitroOnLoad.cpp +25 -22
  27. package/nitrogen/generated/android/c++/JBLEDevice.hpp +95 -0
  28. package/nitrogen/generated/android/c++/{JState.hpp → JBLEState.hpp} +22 -22
  29. package/nitrogen/generated/android/c++/JFunc_void_BLEDevice.hpp +82 -0
  30. package/nitrogen/generated/android/c++/JFunc_void_BLEState.hpp +76 -0
  31. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +74 -0
  32. package/nitrogen/generated/android/c++/JFunc_void_bool_std__string.hpp +75 -0
  33. package/nitrogen/generated/android/c++/JFunc_void_bool_std__string_std__string.hpp +75 -0
  34. package/nitrogen/generated/android/c++/JFunc_void_bool_std__vector_double__std__string.hpp +86 -0
  35. package/nitrogen/generated/android/c++/JFunc_void_std__string_bool_std__string.hpp +75 -0
  36. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__vector_double_.hpp +86 -0
  37. package/nitrogen/generated/android/c++/JFunc_void_std__vector_BLEDevice_.hpp +99 -0
  38. package/nitrogen/generated/android/c++/JFunc_void_std__vector_std__string_.hpp +93 -0
  39. package/nitrogen/generated/android/c++/JHybridNativeBleNitroSpec.cpp +171 -0
  40. package/nitrogen/generated/android/c++/JHybridNativeBleNitroSpec.hpp +83 -0
  41. package/nitrogen/generated/android/c++/JManufacturerData.hpp +73 -0
  42. package/nitrogen/generated/android/c++/JManufacturerDataEntry.hpp +68 -0
  43. package/nitrogen/generated/android/c++/JScanFilter.hpp +79 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BLEDevice.kt +44 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{LogLevel.kt → BLEState.kt} +9 -13
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_std__optional_NativeBleError__std__optional_NativeDevice_.kt → Func_void_BLEDevice.kt} +15 -14
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void.kt → Func_void_BLEState.kt} +15 -14
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_State.kt → Func_void_bool.kt} +15 -14
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.kt → Func_void_bool_std__string.kt} +15 -14
  50. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_bool_std__string_std__string.kt +81 -0
  51. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_bool_std__vector_double__std__string.kt +81 -0
  52. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__string_bool_std__string.kt +81 -0
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__string_std__vector_double_.kt +81 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__vector_BLEDevice_.kt +81 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__vector_std__string_.kt +81 -0
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridNativeBleNitroSpec.kt +223 -0
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{ServiceDataEntry.kt → ManufacturerData.kt} +7 -5
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{ConnectionOptions.kt → ManufacturerDataEntry.kt} +10 -6
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{NativeService.kt → ScanFilter.kt} +13 -7
  60. package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Bridge.cpp +67 -175
  61. package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Bridge.hpp +205 -867
  62. package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Umbrella.hpp +20 -88
  63. package/nitrogen/generated/ios/BleNitroAutolinking.mm +3 -3
  64. package/nitrogen/generated/ios/BleNitroAutolinking.swift +4 -4
  65. package/nitrogen/generated/ios/c++/{HybridCharacteristicSpecSwift.cpp → HybridNativeBleNitroSpecSwift.cpp} +2 -2
  66. package/nitrogen/generated/ios/c++/HybridNativeBleNitroSpecSwift.hpp +205 -0
  67. package/nitrogen/generated/ios/swift/BLEDevice.swift +102 -0
  68. package/nitrogen/generated/ios/swift/{State.swift → BLEState.swift} +6 -6
  69. package/nitrogen/generated/ios/swift/Func_void.swift +1 -0
  70. package/nitrogen/generated/ios/swift/{Func_void_State.swift → Func_void_BLEDevice.swift} +12 -11
  71. package/nitrogen/generated/ios/swift/{Func_void_LogLevel.swift → Func_void_BLEState.swift} +12 -11
  72. package/nitrogen/generated/ios/swift/Func_void_bool.swift +6 -5
  73. package/nitrogen/generated/ios/swift/{Func_void_NativeDescriptor.swift → Func_void_bool_std__string.swift} +12 -11
  74. package/nitrogen/generated/ios/swift/{Func_void_std__vector_NativeCharacteristic_.swift → Func_void_bool_std__string_std__string.swift} +12 -11
  75. package/nitrogen/generated/ios/swift/Func_void_bool_std__vector_double__std__string.swift +47 -0
  76. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -0
  77. package/nitrogen/generated/ios/swift/{Func_void_NativeDevice.swift → Func_void_std__string_bool_std__string.swift} +12 -11
  78. package/nitrogen/generated/ios/swift/{Func_void_std__optional_BleRestoredState_.swift → Func_void_std__string_std__vector_double_.swift} +12 -17
  79. package/nitrogen/generated/ios/swift/{Func_void_NativeCharacteristic.swift → Func_void_std__vector_BLEDevice_.swift} +12 -11
  80. package/nitrogen/generated/ios/swift/{Func_void_std__vector_NativeDevice_.swift → Func_void_std__vector_std__string_.swift} +12 -11
  81. package/nitrogen/generated/ios/swift/HybridNativeBleNitroSpec.swift +68 -0
  82. package/nitrogen/generated/ios/swift/HybridNativeBleNitroSpec_cxx.swift +485 -0
  83. package/nitrogen/generated/ios/swift/ManufacturerData.swift +47 -0
  84. package/nitrogen/generated/ios/swift/ManufacturerDataEntry.swift +58 -0
  85. package/nitrogen/generated/ios/swift/ScanFilter.swift +69 -0
  86. package/nitrogen/generated/shared/c++/BLEDevice.hpp +90 -0
  87. package/nitrogen/generated/shared/c++/{State.hpp → BLEState.hpp} +13 -15
  88. package/nitrogen/generated/shared/c++/HybridNativeBleNitroSpec.cpp +40 -0
  89. package/nitrogen/generated/shared/c++/HybridNativeBleNitroSpec.hpp +93 -0
  90. package/nitrogen/generated/shared/c++/ManufacturerData.hpp +69 -0
  91. package/nitrogen/generated/shared/c++/{ServiceDataEntry.hpp → ManufacturerDataEntry.hpp} +19 -20
  92. package/nitrogen/generated/shared/c++/ScanFilter.hpp +76 -0
  93. package/package.json +9 -11
  94. package/react-native.config.js +2 -7
  95. package/src/__tests__/index.test.ts +188 -0
  96. package/src/index.ts +604 -45
  97. package/src/specs/NativeBleNitro.nitro.ts +84 -0
  98. package/src/specs/NativeBleNitro.ts +8 -0
  99. package/android/build.gradle +0 -58
  100. package/android/src/main/AndroidManifest.xml +0 -23
  101. package/android/src/main/kotlin/com/margelo/nitro/co/zyke/ble/BleNitroBleManager.kt +0 -760
  102. package/ios/BleNitro.podspec +0 -44
  103. package/ios/BleNitroModule.swift +0 -24
  104. package/lib/BleManagerCompatFactory.d.ts +0 -55
  105. package/lib/BleManagerCompatFactory.js +0 -194
  106. package/lib/BleManagerFactory.d.ts +0 -30
  107. package/lib/BleManagerFactory.js +0 -73
  108. package/lib/commonjs/BleManagerCompatFactory.d.ts +0 -56
  109. package/lib/commonjs/BleManagerCompatFactory.d.ts.map +0 -1
  110. package/lib/commonjs/BleManagerCompatFactory.js +0 -201
  111. package/lib/commonjs/BleManagerCompatFactory.js.map +0 -1
  112. package/lib/commonjs/BleManagerFactory.d.ts +0 -31
  113. package/lib/commonjs/BleManagerFactory.d.ts.map +0 -1
  114. package/lib/commonjs/BleManagerFactory.js +0 -81
  115. package/lib/commonjs/BleManagerFactory.js.map +0 -1
  116. package/lib/commonjs/compatibility/constants.d.ts +0 -50
  117. package/lib/commonjs/compatibility/constants.d.ts.map +0 -1
  118. package/lib/commonjs/compatibility/constants.js +0 -58
  119. package/lib/commonjs/compatibility/constants.js.map +0 -1
  120. package/lib/commonjs/compatibility/deviceWrapper.d.ts +0 -100
  121. package/lib/commonjs/compatibility/deviceWrapper.d.ts.map +0 -1
  122. package/lib/commonjs/compatibility/deviceWrapper.js +0 -268
  123. package/lib/commonjs/compatibility/deviceWrapper.js.map +0 -1
  124. package/lib/commonjs/compatibility/enums.d.ts +0 -39
  125. package/lib/commonjs/compatibility/enums.d.ts.map +0 -1
  126. package/lib/commonjs/compatibility/enums.js +0 -179
  127. package/lib/commonjs/compatibility/enums.js.map +0 -1
  128. package/lib/commonjs/compatibility/index.d.ts +0 -13
  129. package/lib/commonjs/compatibility/index.d.ts.map +0 -1
  130. package/lib/commonjs/compatibility/index.js +0 -41
  131. package/lib/commonjs/compatibility/index.js.map +0 -1
  132. package/lib/commonjs/compatibility/serviceData.d.ts +0 -52
  133. package/lib/commonjs/compatibility/serviceData.d.ts.map +0 -1
  134. package/lib/commonjs/compatibility/serviceData.js +0 -80
  135. package/lib/commonjs/compatibility/serviceData.js.map +0 -1
  136. package/lib/commonjs/errors/BleError.d.ts +0 -60
  137. package/lib/commonjs/errors/BleError.d.ts.map +0 -1
  138. package/lib/commonjs/errors/BleError.js +0 -125
  139. package/lib/commonjs/errors/BleError.js.map +0 -1
  140. package/lib/commonjs/specs/BleManager.nitro.d.ts +0 -45
  141. package/lib/commonjs/specs/BleManager.nitro.d.ts.map +0 -1
  142. package/lib/commonjs/specs/BleManager.nitro.js +0 -3
  143. package/lib/commonjs/specs/BleManager.nitro.js.map +0 -1
  144. package/lib/commonjs/specs/Characteristic.nitro.d.ts +0 -27
  145. package/lib/commonjs/specs/Characteristic.nitro.d.ts.map +0 -1
  146. package/lib/commonjs/specs/Characteristic.nitro.js +0 -3
  147. package/lib/commonjs/specs/Characteristic.nitro.js.map +0 -1
  148. package/lib/commonjs/specs/Descriptor.nitro.d.ts +0 -18
  149. package/lib/commonjs/specs/Descriptor.nitro.d.ts.map +0 -1
  150. package/lib/commonjs/specs/Descriptor.nitro.js +0 -3
  151. package/lib/commonjs/specs/Descriptor.nitro.js.map +0 -1
  152. package/lib/commonjs/specs/Device.nitro.d.ts +0 -38
  153. package/lib/commonjs/specs/Device.nitro.d.ts.map +0 -1
  154. package/lib/commonjs/specs/Device.nitro.js +0 -3
  155. package/lib/commonjs/specs/Device.nitro.js.map +0 -1
  156. package/lib/commonjs/specs/Service.nitro.d.ts +0 -20
  157. package/lib/commonjs/specs/Service.nitro.d.ts.map +0 -1
  158. package/lib/commonjs/specs/Service.nitro.js +0 -3
  159. package/lib/commonjs/specs/Service.nitro.js.map +0 -1
  160. package/lib/commonjs/specs/types.d.ts +0 -229
  161. package/lib/commonjs/specs/types.d.ts.map +0 -1
  162. package/lib/commonjs/specs/types.js +0 -150
  163. package/lib/commonjs/specs/types.js.map +0 -1
  164. package/lib/commonjs/utils/base64.d.ts +0 -26
  165. package/lib/commonjs/utils/base64.d.ts.map +0 -1
  166. package/lib/commonjs/utils/base64.js +0 -88
  167. package/lib/commonjs/utils/base64.js.map +0 -1
  168. package/lib/commonjs/utils/index.d.ts +0 -3
  169. package/lib/commonjs/utils/index.d.ts.map +0 -1
  170. package/lib/commonjs/utils/index.js.map +0 -1
  171. package/lib/commonjs/utils/uuid.d.ts +0 -10
  172. package/lib/commonjs/utils/uuid.d.ts.map +0 -1
  173. package/lib/commonjs/utils/uuid.js +0 -41
  174. package/lib/commonjs/utils/uuid.js.map +0 -1
  175. package/lib/compatibility/constants.d.ts +0 -49
  176. package/lib/compatibility/constants.js +0 -50
  177. package/lib/compatibility/deviceWrapper.d.ts +0 -99
  178. package/lib/compatibility/deviceWrapper.js +0 -259
  179. package/lib/compatibility/enums.d.ts +0 -38
  180. package/lib/compatibility/enums.js +0 -159
  181. package/lib/compatibility/index.d.ts +0 -12
  182. package/lib/compatibility/index.js +0 -12
  183. package/lib/compatibility/serviceData.d.ts +0 -51
  184. package/lib/compatibility/serviceData.js +0 -70
  185. package/lib/errors/BleError.d.ts +0 -59
  186. package/lib/errors/BleError.js +0 -120
  187. package/lib/specs/BleManager.nitro.d.ts +0 -44
  188. package/lib/specs/BleManager.nitro.js +0 -1
  189. package/lib/specs/Characteristic.nitro.d.ts +0 -26
  190. package/lib/specs/Characteristic.nitro.js +0 -1
  191. package/lib/specs/Descriptor.nitro.d.ts +0 -17
  192. package/lib/specs/Descriptor.nitro.js +0 -1
  193. package/lib/specs/Device.nitro.d.ts +0 -37
  194. package/lib/specs/Device.nitro.js +0 -1
  195. package/lib/specs/Service.nitro.d.ts +0 -19
  196. package/lib/specs/Service.nitro.js +0 -1
  197. package/lib/specs/types.d.ts +0 -228
  198. package/lib/specs/types.js +0 -146
  199. package/lib/utils/base64.d.ts +0 -25
  200. package/lib/utils/base64.js +0 -80
  201. package/lib/utils/index.d.ts +0 -2
  202. package/lib/utils/index.js +0 -2
  203. package/lib/utils/uuid.d.ts +0 -9
  204. package/lib/utils/uuid.js +0 -37
  205. package/nitrogen/generated/android/c++/JBleATTErrorCode.hpp +0 -107
  206. package/nitrogen/generated/android/c++/JBleAndroidErrorCode.hpp +0 -101
  207. package/nitrogen/generated/android/c++/JBleErrorCode.hpp +0 -170
  208. package/nitrogen/generated/android/c++/JBleIOSErrorCode.hpp +0 -92
  209. package/nitrogen/generated/android/c++/JBleManagerNitroOptions.hpp +0 -54
  210. package/nitrogen/generated/android/c++/JBleRestoredState.hpp +0 -76
  211. package/nitrogen/generated/android/c++/JCharacteristicSubscriptionType.hpp +0 -59
  212. package/nitrogen/generated/android/c++/JConnectionOptions.hpp +0 -61
  213. package/nitrogen/generated/android/c++/JConnectionPriority.hpp +0 -62
  214. package/nitrogen/generated/android/c++/JFunc_void.hpp +0 -74
  215. package/nitrogen/generated/android/c++/JFunc_void_State.hpp +0 -76
  216. package/nitrogen/generated/android/c++/JFunc_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.hpp +0 -88
  217. package/nitrogen/generated/android/c++/JFunc_void_std__optional_NativeBleError__std__optional_NativeDevice_.hpp +0 -91
  218. package/nitrogen/generated/android/c++/JHybridBleManagerSpec.cpp +0 -653
  219. package/nitrogen/generated/android/c++/JHybridBleManagerSpec.hpp +0 -92
  220. package/nitrogen/generated/android/c++/JHybridCharacteristicSpec.cpp +0 -253
  221. package/nitrogen/generated/android/c++/JHybridCharacteristicSpec.hpp +0 -79
  222. package/nitrogen/generated/android/c++/JHybridDescriptorSpec.cpp +0 -115
  223. package/nitrogen/generated/android/c++/JHybridDescriptorSpec.hpp +0 -70
  224. package/nitrogen/generated/android/c++/JHybridDeviceSpec.cpp +0 -476
  225. package/nitrogen/generated/android/c++/JHybridDeviceSpec.hpp +0 -90
  226. package/nitrogen/generated/android/c++/JHybridServiceSpec.cpp +0 -232
  227. package/nitrogen/generated/android/c++/JHybridServiceSpec.hpp +0 -72
  228. package/nitrogen/generated/android/c++/JLogLevel.hpp +0 -71
  229. package/nitrogen/generated/android/c++/JNativeBleError.hpp +0 -98
  230. package/nitrogen/generated/android/c++/JNativeCharacteristic.hpp +0 -98
  231. package/nitrogen/generated/android/c++/JNativeDescriptor.hpp +0 -82
  232. package/nitrogen/generated/android/c++/JNativeDevice.hpp +0 -173
  233. package/nitrogen/generated/android/c++/JNativeService.hpp +0 -65
  234. package/nitrogen/generated/android/c++/JScanCallbackType.hpp +0 -62
  235. package/nitrogen/generated/android/c++/JScanMode.hpp +0 -65
  236. package/nitrogen/generated/android/c++/JScanOptions.hpp +0 -69
  237. package/nitrogen/generated/android/c++/JServiceDataEntry.hpp +0 -57
  238. package/nitrogen/generated/android/c++/JSubscription.hpp +0 -64
  239. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleATTErrorCode.kt +0 -41
  240. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleAndroidErrorCode.kt +0 -39
  241. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleErrorCode.kt +0 -62
  242. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleIOSErrorCode.kt +0 -36
  243. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleManagerNitroOptions.kt +0 -26
  244. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleRestoredState.kt +0 -26
  245. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/CharacteristicSubscriptionType.kt +0 -25
  246. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ConnectionPriority.kt +0 -26
  247. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridBleManagerSpec.kt +0 -192
  248. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridCharacteristicSpec.kt +0 -127
  249. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridDescriptorSpec.kt +0 -86
  250. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridDeviceSpec.kt +0 -176
  251. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridServiceSpec.kt +0 -99
  252. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeBleError.kt +0 -35
  253. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeCharacteristic.kt +0 -37
  254. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeDescriptor.kt +0 -33
  255. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeDevice.kt +0 -38
  256. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanCallbackType.kt +0 -26
  257. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanMode.kt +0 -27
  258. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanOptions.kt +0 -29
  259. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/State.kt +0 -29
  260. package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Subscription.kt +0 -30
  261. package/nitrogen/generated/ios/c++/HybridBleManagerSpecSwift.cpp +0 -11
  262. package/nitrogen/generated/ios/c++/HybridBleManagerSpecSwift.hpp +0 -377
  263. package/nitrogen/generated/ios/c++/HybridCharacteristicSpecSwift.hpp +0 -192
  264. package/nitrogen/generated/ios/c++/HybridDescriptorSpecSwift.cpp +0 -11
  265. package/nitrogen/generated/ios/c++/HybridDescriptorSpecSwift.hpp +0 -112
  266. package/nitrogen/generated/ios/c++/HybridDeviceSpecSwift.cpp +0 -11
  267. package/nitrogen/generated/ios/c++/HybridDeviceSpecSwift.hpp +0 -294
  268. package/nitrogen/generated/ios/c++/HybridServiceSpecSwift.cpp +0 -11
  269. package/nitrogen/generated/ios/c++/HybridServiceSpecSwift.hpp +0 -170
  270. package/nitrogen/generated/ios/swift/BleATTErrorCode.swift +0 -104
  271. package/nitrogen/generated/ios/swift/BleAndroidErrorCode.swift +0 -96
  272. package/nitrogen/generated/ios/swift/BleErrorCode.swift +0 -188
  273. package/nitrogen/generated/ios/swift/BleIOSErrorCode.swift +0 -84
  274. package/nitrogen/generated/ios/swift/BleManagerNitroOptions.swift +0 -53
  275. package/nitrogen/generated/ios/swift/BleRestoredState.swift +0 -47
  276. package/nitrogen/generated/ios/swift/CharacteristicSubscriptionType.swift +0 -40
  277. package/nitrogen/generated/ios/swift/ConnectionOptions.swift +0 -57
  278. package/nitrogen/generated/ios/swift/ConnectionPriority.swift +0 -44
  279. package/nitrogen/generated/ios/swift/Func_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.swift +0 -58
  280. package/nitrogen/generated/ios/swift/Func_void_std__optional_NativeBleError__std__optional_NativeDevice_.swift +0 -58
  281. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__co__zyke__ble__HybridCharacteristicSpec_.swift +0 -50
  282. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__co__zyke__ble__HybridDescriptorSpec_.swift +0 -50
  283. package/nitrogen/generated/ios/swift/Func_void_std__vector_NativeDescriptor_.swift +0 -46
  284. package/nitrogen/generated/ios/swift/Func_void_std__vector_NativeService_.swift +0 -46
  285. package/nitrogen/generated/ios/swift/HybridBleManagerSpec.swift +0 -78
  286. package/nitrogen/generated/ios/swift/HybridBleManagerSpec_cxx.swift +0 -852
  287. package/nitrogen/generated/ios/swift/HybridCharacteristicSpec.swift +0 -65
  288. package/nitrogen/generated/ios/swift/HybridCharacteristicSpec_cxx.swift +0 -384
  289. package/nitrogen/generated/ios/swift/HybridDescriptorSpec.swift +0 -56
  290. package/nitrogen/generated/ios/swift/HybridDescriptorSpec_cxx.swift +0 -218
  291. package/nitrogen/generated/ios/swift/HybridDeviceSpec.swift +0 -76
  292. package/nitrogen/generated/ios/swift/HybridDeviceSpec_cxx.swift +0 -702
  293. package/nitrogen/generated/ios/swift/HybridServiceSpec.swift +0 -58
  294. package/nitrogen/generated/ios/swift/HybridServiceSpec_cxx.swift +0 -338
  295. package/nitrogen/generated/ios/swift/LogLevel.swift +0 -56
  296. package/nitrogen/generated/ios/swift/NativeBleError.swift +0 -278
  297. package/nitrogen/generated/ios/swift/NativeCharacteristic.swift +0 -174
  298. package/nitrogen/generated/ios/swift/NativeDescriptor.swift +0 -130
  299. package/nitrogen/generated/ios/swift/NativeDevice.swift +0 -377
  300. package/nitrogen/generated/ios/swift/NativeService.swift +0 -68
  301. package/nitrogen/generated/ios/swift/ScanCallbackType.swift +0 -44
  302. package/nitrogen/generated/ios/swift/ScanMode.swift +0 -48
  303. package/nitrogen/generated/ios/swift/ScanOptions.swift +0 -116
  304. package/nitrogen/generated/ios/swift/ServiceDataEntry.swift +0 -46
  305. package/nitrogen/generated/ios/swift/Subscription.swift +0 -46
  306. package/nitrogen/generated/shared/c++/BleATTErrorCode.hpp +0 -80
  307. package/nitrogen/generated/shared/c++/BleAndroidErrorCode.hpp +0 -78
  308. package/nitrogen/generated/shared/c++/BleErrorCode.hpp +0 -101
  309. package/nitrogen/generated/shared/c++/BleIOSErrorCode.hpp +0 -75
  310. package/nitrogen/generated/shared/c++/BleManagerNitroOptions.hpp +0 -70
  311. package/nitrogen/generated/shared/c++/BleRestoredState.hpp +0 -71
  312. package/nitrogen/generated/shared/c++/CharacteristicSubscriptionType.hpp +0 -64
  313. package/nitrogen/generated/shared/c++/ConnectionOptions.hpp +0 -77
  314. package/nitrogen/generated/shared/c++/ConnectionPriority.hpp +0 -65
  315. package/nitrogen/generated/shared/c++/HybridBleManagerSpec.cpp +0 -51
  316. package/nitrogen/generated/shared/c++/HybridBleManagerSpec.hpp +0 -137
  317. package/nitrogen/generated/shared/c++/HybridCharacteristicSpec.cpp +0 -39
  318. package/nitrogen/generated/shared/c++/HybridCharacteristicSpec.hpp +0 -101
  319. package/nitrogen/generated/shared/c++/HybridDescriptorSpec.cpp +0 -30
  320. package/nitrogen/generated/shared/c++/HybridDescriptorSpec.hpp +0 -75
  321. package/nitrogen/generated/shared/c++/HybridDeviceSpec.cpp +0 -50
  322. package/nitrogen/generated/shared/c++/HybridDeviceSpec.hpp +0 -123
  323. package/nitrogen/generated/shared/c++/HybridServiceSpec.cpp +0 -32
  324. package/nitrogen/generated/shared/c++/HybridServiceSpec.hpp +0 -90
  325. package/nitrogen/generated/shared/c++/LogLevel.hpp +0 -68
  326. package/nitrogen/generated/shared/c++/NativeBleError.hpp +0 -117
  327. package/nitrogen/generated/shared/c++/NativeCharacteristic.hpp +0 -114
  328. package/nitrogen/generated/shared/c++/NativeDescriptor.hpp +0 -98
  329. package/nitrogen/generated/shared/c++/NativeDevice.hpp +0 -121
  330. package/nitrogen/generated/shared/c++/NativeService.hpp +0 -81
  331. package/nitrogen/generated/shared/c++/ScanCallbackType.hpp +0 -65
  332. package/nitrogen/generated/shared/c++/ScanMode.hpp +0 -66
  333. package/nitrogen/generated/shared/c++/ScanOptions.hpp +0 -86
  334. package/nitrogen/generated/shared/c++/Subscription.hpp +0 -69
  335. package/src/BleManagerCompatFactory.ts +0 -371
  336. package/src/BleManagerFactory.ts +0 -93
  337. package/src/__tests__/BleManager.test.ts +0 -327
  338. package/src/__tests__/compatibility/deviceWrapper.test.ts +0 -563
  339. package/src/__tests__/compatibility/enums.test.ts +0 -264
  340. package/src/compatibility/constants.ts +0 -71
  341. package/src/compatibility/deviceWrapper.ts +0 -427
  342. package/src/compatibility/enums.ts +0 -190
  343. package/src/compatibility/index.ts +0 -32
  344. package/src/compatibility/serviceData.ts +0 -85
  345. package/src/errors/BleError.ts +0 -193
  346. package/src/specs/BleManager.nitro.ts +0 -165
  347. package/src/specs/Characteristic.nitro.ts +0 -61
  348. package/src/specs/Descriptor.nitro.ts +0 -28
  349. package/src/specs/Device.nitro.ts +0 -104
  350. package/src/specs/Service.nitro.ts +0 -64
  351. package/src/specs/types.ts +0 -259
  352. package/src/utils/base64.ts +0 -80
  353. package/src/utils/index.ts +0 -2
  354. package/src/utils/uuid.ts +0 -45
@@ -1,760 +0,0 @@
1
- /**
2
- * BleNitroBleManager.kt
3
- * React Native BLE Nitro - Android Implementation
4
- * Copyright © 2025 Zyke (https://zyke.co)
5
- */
6
-
7
- package com.margelo.nitro.co.zyke.ble
8
-
9
- import android.bluetooth.*
10
- import android.bluetooth.le.*
11
- import android.content.Context
12
- import android.content.pm.PackageManager
13
- import android.os.Build
14
- import android.util.Base64
15
- import android.util.Log
16
- import androidx.core.content.ContextCompat
17
- import com.facebook.react.bridge.ReactApplicationContext
18
- import com.margelo.nitro.co.zyke.ble.HybridBleManagerSpec
19
- import com.margelo.nitro.NitroModules
20
- import kotlinx.coroutines.*
21
- import kotlinx.coroutines.channels.Channel
22
- import no.nordicsemi.android.ble.BleManager
23
- import no.nordicsemi.android.ble.ktx.suspend
24
- import java.util.*
25
- import java.util.concurrent.ConcurrentHashMap
26
- import kotlin.coroutines.resume
27
- import kotlin.coroutines.resumeWithException
28
- import kotlin.coroutines.suspendCoroutine
29
-
30
- // Import generated Nitro types
31
- import com.margelo.nitro.co.zyke.ble.*
32
-
33
- /**
34
- * Core BLE Manager implementation using Android BLE APIs
35
- * Implements the HybridBleManagerSpec interface generated by Nitro
36
- */
37
- class BleNitroBleManager : HybridBleManagerSpec {
38
-
39
- // Get context from Nitro's context system
40
- private val context: ReactApplicationContext by lazy {
41
- NitroModules.getReactApplicationContext()
42
- }
43
-
44
- companion object {
45
- private const val TAG = "BleNitroBleManager"
46
- private const val DEFAULT_MTU = 23
47
- }
48
-
49
- // Core BLE components
50
- private val bluetoothManager: BluetoothManager by lazy {
51
- context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
52
- }
53
-
54
- private val bluetoothAdapter: BluetoothAdapter? by lazy {
55
- bluetoothManager.adapter
56
- }
57
-
58
- private val bleScanner: BluetoothLeScanner? by lazy {
59
- bluetoothAdapter?.bluetoothLeScanner
60
- }
61
-
62
- // State management
63
- private var logLevel: LogLevel = LogLevel.None
64
- private var isScanning = false
65
- private var scanCallback: ScanCallback? = null
66
-
67
- // State restoration
68
- private var restoreIdentifier: String? = null
69
- private var isInitialized = false
70
- private var restoredState: BleRestoredState? = null
71
- private var scanListener: ((NativeBleError?, NativeDevice?) -> Unit)? = null
72
- private var stateChangeListener: ((State) -> Unit)? = null
73
-
74
- // Device management
75
- private val connectedDevices = ConcurrentHashMap<String, BluetoothGatt>()
76
- private val discoveredDevices = ConcurrentHashMap<String, BluetoothDevice>()
77
- private val deviceCallbacks = ConcurrentHashMap<String, BleGattCallback>()
78
- private val pendingOperations = ConcurrentHashMap<String, Any>()
79
- private val deviceDisconnectListeners = ConcurrentHashMap<String, (NativeBleError?, NativeDevice?) -> Unit>()
80
- private val characteristicMonitors = ConcurrentHashMap<String, (NativeBleError?, NativeCharacteristic?) -> Unit>()
81
-
82
- // Coroutines
83
- private val coroutineScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
84
-
85
- // MARK: - HybridBleManagerSpec Implementation
86
-
87
- override fun destroy(): Promise<Unit> = Promise.async { resolve, reject ->
88
- try {
89
- stopDeviceScan().get()
90
-
91
- // Disconnect all devices
92
- connectedDevices.values.forEach { gatt ->
93
- gatt.disconnect()
94
- gatt.close()
95
- }
96
-
97
- // Clear all state
98
- connectedDevices.clear()
99
- discoveredDevices.clear()
100
- deviceCallbacks.clear()
101
- pendingOperations.clear()
102
- deviceDisconnectListeners.clear()
103
- characteristicMonitors.clear()
104
-
105
- // Cancel coroutine scope
106
- coroutineScope.cancel()
107
-
108
- resolve(Unit)
109
- } catch (e: Exception) {
110
- reject(e)
111
- }
112
- }
113
-
114
- override fun initialize(options: BleManagerNitroOptions): Promise<Unit> = Promise.resolve {
115
- options.restoreStateIdentifier?.let { restoreId ->
116
- this.restoreIdentifier = restoreId
117
-
118
- // Attempt to restore previous state from SharedPreferences
119
- restoreConnectionState(restoreId)
120
-
121
- Log.d(TAG, "BleNitro: Initialized with restore state identifier: $restoreId")
122
- }
123
-
124
- this.isInitialized = true
125
- Log.d(TAG, "BleNitro: BLE Manager initialized")
126
- Unit
127
- }
128
-
129
- override fun getRestoredState(): Promise<BleRestoredState?> = Promise.resolve {
130
- restoredState
131
- }
132
-
133
- private fun restoreConnectionState(restoreId: String) {
134
- try {
135
- val sharedPrefs = context.getSharedPreferences("BleNitro_$restoreId", Context.MODE_PRIVATE)
136
- val connectedDevicesJson = sharedPrefs.getString("connected_devices", null)
137
-
138
- connectedDevicesJson?.let { json ->
139
- // Parse stored device IDs and attempt to reconnect
140
- val deviceIds = json.split(",").filter { it.isNotEmpty() }
141
-
142
- if (deviceIds.isNotEmpty()) {
143
- Log.d(TAG, "BleNitro: Restoring ${deviceIds.size} devices")
144
-
145
- deviceIds.forEach { deviceId ->
146
- // Attempt to reconnect to previously connected devices
147
- restoreDeviceConnection(deviceId)
148
- }
149
-
150
- // Store restored state (initially empty, will be populated as devices reconnect)
151
- val initialDevices = deviceIds.mapNotNull { deviceId ->
152
- bluetoothAdapter?.getRemoteDevice(deviceId)?.let { device ->
153
- createNativeDevice(device, null, -1) // Initial state without GATT
154
- }
155
- }
156
-
157
- if (initialDevices.isNotEmpty()) {
158
- this.restoredState = BleRestoredState(initialDevices)
159
- Log.d(TAG, "BleNitro: Stored restored state with ${initialDevices.size} devices")
160
- }
161
- }
162
- }
163
- } catch (e: Exception) {
164
- Log.e(TAG, "BleNitro: Error restoring connection state", e)
165
- }
166
- }
167
-
168
- private fun restoreDeviceConnection(deviceId: String) {
169
- try {
170
- val bluetoothDevice = bluetoothAdapter?.getRemoteDevice(deviceId)
171
- bluetoothDevice?.let { device ->
172
- Log.d(TAG, "BleNitro: Attempting to restore connection to $deviceId")
173
-
174
- val gatt = device.connectGatt(context, true, object : BluetoothGattCallback() {
175
- override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
176
- if (newState == BluetoothProfile.STATE_CONNECTED) {
177
- connectedDevices[deviceId] = gatt!!
178
- Log.d(TAG, "BleNitro: Successfully restored connection to $deviceId")
179
- } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
180
- Log.d(TAG, "BleNitro: Failed to restore connection to $deviceId")
181
- gatt?.close()
182
- }
183
- }
184
- })
185
-
186
- if (gatt != null) {
187
- deviceCallbacks[deviceId] = gatt
188
- }
189
- }
190
- } catch (e: Exception) {
191
- Log.e(TAG, "BleNitro: Error restoring device connection for $deviceId", e)
192
- }
193
- }
194
-
195
- private fun saveConnectionState() {
196
- restoreIdentifier?.let { restoreId ->
197
- try {
198
- val sharedPrefs = context.getSharedPreferences("BleNitro_$restoreId", Context.MODE_PRIVATE)
199
- val deviceIds = connectedDevices.keys.joinToString(",")
200
-
201
- sharedPrefs.edit()
202
- .putString("connected_devices", deviceIds)
203
- .apply()
204
-
205
- Log.d(TAG, "BleNitro: Saved connection state for ${connectedDevices.size} devices")
206
- } catch (e: Exception) {
207
- Log.e(TAG, "BleNitro: Error saving connection state", e)
208
- }
209
- }
210
- }
211
-
212
- override fun setLogLevel(logLevel: LogLevel): Promise<LogLevel> = Promise.resolve {
213
- this.logLevel = logLevel
214
- logLevel
215
- }
216
-
217
- override fun logLevel(): Promise<LogLevel> = Promise.resolve(logLevel)
218
-
219
- override fun cancelTransaction(transactionId: String): Promise<Unit> = Promise.resolve {
220
- pendingOperations.remove(transactionId)
221
- }
222
-
223
- override fun enable(transactionId: String?): Promise<Unit> = Promise.async { resolve, reject ->
224
- if (bluetoothAdapter?.isEnabled == true) {
225
- resolve(Unit)
226
- } else {
227
- reject(createBleError(BleErrorCode.BluetoothPoweredOff, "Bluetooth is not enabled"))
228
- }
229
- }
230
-
231
- override fun disable(transactionId: String?): Promise<Unit> = Promise.async { resolve, reject ->
232
- // Android doesn't allow programmatic disabling of Bluetooth
233
- reject(createBleError(BleErrorCode.BluetoothUnsupported, "Cannot programmatically disable Bluetooth"))
234
- }
235
-
236
- override fun state(): Promise<State> = Promise.resolve {
237
- when {
238
- bluetoothAdapter == null -> State.Unsupported
239
- !bluetoothAdapter.isEnabled -> State.PoweredOff
240
- bluetoothAdapter.isEnabled -> State.PoweredOn
241
- else -> State.Unknown
242
- }
243
- }
244
-
245
- override fun onStateChange(
246
- listener: (State) -> Unit,
247
- emitCurrentState: Boolean?
248
- ): Subscription {
249
- stateChangeListener = listener
250
-
251
- if (emitCurrentState == true) {
252
- coroutineScope.launch {
253
- listener(state().get())
254
- }
255
- }
256
-
257
- return object : Subscription {
258
- override fun remove() {
259
- stateChangeListener = null
260
- }
261
- }
262
- }
263
-
264
- override fun startDeviceScan(
265
- uuids: List<String>?,
266
- options: ScanOptions?,
267
- listener: (NativeBleError?, NativeDevice?) -> Unit
268
- ): Promise<Unit> = Promise.async { resolve, reject ->
269
- try {
270
- // Check permissions
271
- if (!hasBluetoothPermissions()) {
272
- reject(createBleError(BleErrorCode.BluetoothUnauthorized, "Missing Bluetooth permissions"))
273
- return@async
274
- }
275
-
276
- val scanner = bleScanner ?: run {
277
- reject(createBleError(BleErrorCode.BluetoothUnsupported, "BLE scanning not supported"))
278
- return@async
279
- }
280
-
281
- if (bluetoothAdapter?.isEnabled != true) {
282
- reject(createBleError(BleErrorCode.BluetoothPoweredOff, "Bluetooth is not enabled"))
283
- return@async
284
- }
285
-
286
- // Stop any existing scan
287
- stopCurrentScan()
288
-
289
- // Setup scan settings
290
- val scanSettings = ScanSettings.Builder()
291
- .setScanMode(mapScanMode(options?.scanMode))
292
- .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
293
- .build()
294
-
295
- // Setup scan filters
296
- val scanFilters = mutableListOf<ScanFilter>()
297
- uuids?.forEach { uuid ->
298
- val filter = ScanFilter.Builder()
299
- .setServiceUuid(ParcelUuid.fromString(uuid))
300
- .build()
301
- scanFilters.add(filter)
302
- }
303
-
304
- // Create scan callback
305
- scanCallback = object : ScanCallback() {
306
- override fun onScanResult(callbackType: Int, result: ScanResult) {
307
- val device = createNativeDevice(result.device, result.scanRecord, result.rssi)
308
- discoveredDevices[device.id] = result.device
309
- listener(null, device)
310
- }
311
-
312
- override fun onScanFailed(errorCode: Int) {
313
- val error = createBleError(BleErrorCode.ScanStartFailed, "Scan failed with error: $errorCode")
314
- listener(error, null)
315
- }
316
- }
317
-
318
- scanListener = listener
319
- scanner.startScan(scanFilters, scanSettings, scanCallback)
320
- isScanning = true
321
-
322
- resolve(Unit)
323
-
324
- } catch (e: SecurityException) {
325
- reject(createBleError(BleErrorCode.BluetoothUnauthorized, "Permission denied: ${e.message}"))
326
- } catch (e: Exception) {
327
- reject(createBleError(BleErrorCode.ScanStartFailed, "Failed to start scan: ${e.message}"))
328
- }
329
- }
330
-
331
- override fun stopDeviceScan(): Promise<Unit> = Promise.resolve {
332
- stopCurrentScan()
333
- }
334
-
335
- private fun stopCurrentScan() {
336
- if (isScanning) {
337
- try {
338
- scanCallback?.let { bleScanner?.stopScan(it) }
339
- } catch (e: SecurityException) {
340
- Log.w(TAG, "Permission denied when stopping scan: ${e.message}")
341
- } catch (e: Exception) {
342
- Log.w(TAG, "Error stopping scan: ${e.message}")
343
- }
344
-
345
- scanCallback = null
346
- scanListener = null
347
- isScanning = false
348
- }
349
- }
350
-
351
- override fun requestConnectionPriorityForDevice(
352
- deviceIdentifier: String,
353
- connectionPriority: ConnectionPriority,
354
- transactionId: String?
355
- ): Promise<NativeDevice> = Promise.async { resolve, reject ->
356
- val gatt = connectedDevices[deviceIdentifier] ?: run {
357
- reject(createBleError(BleErrorCode.DeviceNotFound, "Device not found: $deviceIdentifier"))
358
- return@async
359
- }
360
-
361
- try {
362
- val androidPriority = when (connectionPriority) {
363
- ConnectionPriority.Balanced -> BluetoothGatt.CONNECTION_PRIORITY_BALANCED
364
- ConnectionPriority.High -> BluetoothGatt.CONNECTION_PRIORITY_HIGH
365
- ConnectionPriority.LowPower -> BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER
366
- }
367
-
368
- val success = gatt.requestConnectionPriority(androidPriority)
369
- if (success) {
370
- val device = createNativeDevice(gatt.device)
371
- resolve(device)
372
- } else {
373
- reject(createBleError(BleErrorCode.OperationCancelled, "Failed to request connection priority"))
374
- }
375
- } catch (e: Exception) {
376
- reject(createBleError(BleErrorCode.OperationCancelled, "Error requesting connection priority: ${e.message}"))
377
- }
378
- }
379
-
380
- override fun readRSSIForDevice(
381
- deviceIdentifier: String,
382
- transactionId: String?
383
- ): Promise<NativeDevice> = Promise.async { resolve, reject ->
384
- val gatt = connectedDevices[deviceIdentifier] ?: run {
385
- reject(createBleError(BleErrorCode.DeviceNotFound, "Device not found: $deviceIdentifier"))
386
- return@async
387
- }
388
-
389
- try {
390
- val callback = deviceCallbacks[deviceIdentifier]
391
- callback?.setRssiPromise(resolve, reject)
392
-
393
- if (!gatt.readRemoteRssi()) {
394
- reject(createBleError(BleErrorCode.OperationCancelled, "Failed to read RSSI"))
395
- }
396
- } catch (e: Exception) {
397
- reject(createBleError(BleErrorCode.OperationCancelled, "Error reading RSSI: ${e.message}"))
398
- }
399
- }
400
-
401
- override fun requestMTUForDevice(
402
- deviceIdentifier: String,
403
- mtu: Double,
404
- transactionId: String?
405
- ): Promise<NativeDevice> = Promise.async { resolve, reject ->
406
- val gatt = connectedDevices[deviceIdentifier] ?: run {
407
- reject(createBleError(BleErrorCode.DeviceNotFound, "Device not found: $deviceIdentifier"))
408
- return@async
409
- }
410
-
411
- try {
412
- val callback = deviceCallbacks[deviceIdentifier]
413
- callback?.setMtuPromise(resolve, reject)
414
-
415
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
416
- if (!gatt.requestMtu(mtu.toInt())) {
417
- reject(createBleError(BleErrorCode.OperationCancelled, "Failed to request MTU"))
418
- }
419
- } else {
420
- // MTU request not supported on older versions
421
- val device = createNativeDevice(gatt.device)
422
- resolve(device)
423
- }
424
- } catch (e: Exception) {
425
- reject(createBleError(BleErrorCode.OperationCancelled, "Error requesting MTU: ${e.message}"))
426
- }
427
- }
428
-
429
- override fun devices(deviceIdentifiers: List<String>): Promise<List<NativeDevice>> = Promise.resolve {
430
- deviceIdentifiers.mapNotNull { identifier ->
431
- val bluetoothDevice = discoveredDevices[identifier] ?: connectedDevices[identifier]?.device
432
- bluetoothDevice?.let { createNativeDevice(it) }
433
- }
434
- }
435
-
436
- override fun connectedDevices(serviceUUIDs: List<String>): Promise<List<NativeDevice>> = Promise.resolve {
437
- val uuids = serviceUUIDs.map { UUID.fromString(it) }
438
- bluetoothManager.getConnectedDevices(BluetoothProfile.GATT)
439
- .filter { device ->
440
- serviceUUIDs.isEmpty() || device.uuids?.any { uuid -> uuids.contains(uuid.uuid) } == true
441
- }
442
- .map { createNativeDevice(it) }
443
- }
444
-
445
- override fun connectToDevice(
446
- deviceIdentifier: String,
447
- options: ConnectionOptions?
448
- ): Promise<NativeDevice> = Promise.async { resolve, reject ->
449
- try {
450
- val device = discoveredDevices[deviceIdentifier] ?: run {
451
- // Try to get device by MAC address
452
- if (BluetoothAdapter.checkBluetoothAddress(deviceIdentifier)) {
453
- bluetoothAdapter?.getRemoteDevice(deviceIdentifier)
454
- } else null
455
- } ?: run {
456
- reject(createBleError(BleErrorCode.DeviceNotFound, "Device not found: $deviceIdentifier"))
457
- return@async
458
- }
459
-
460
- // Check if already connected
461
- if (connectedDevices.containsKey(deviceIdentifier)) {
462
- val nativeDevice = createNativeDevice(device)
463
- resolve(nativeDevice)
464
- return@async
465
- }
466
-
467
- val callback = BleGattCallback(deviceIdentifier) { error, device ->
468
- if (error != null) {
469
- reject(error)
470
- } else if (device != null) {
471
- resolve(device)
472
- }
473
- }
474
-
475
- deviceCallbacks[deviceIdentifier] = callback
476
-
477
- val autoConnect = options?.autoConnect ?: false
478
- val gatt = device.connectGatt(context, autoConnect, callback)
479
-
480
- if (gatt == null) {
481
- reject(createBleError(BleErrorCode.DeviceConnectionFailed, "Failed to create GATT connection"))
482
- return@async
483
- }
484
-
485
- } catch (e: SecurityException) {
486
- reject(createBleError(BleErrorCode.BluetoothUnauthorized, "Permission denied: ${e.message}"))
487
- } catch (e: Exception) {
488
- reject(createBleError(BleErrorCode.DeviceConnectionFailed, "Connection failed: ${e.message}"))
489
- }
490
- }
491
-
492
- override fun cancelDeviceConnection(deviceIdentifier: String): Promise<NativeDevice> = Promise.async { resolve, reject ->
493
- val gatt = connectedDevices[deviceIdentifier] ?: run {
494
- reject(createBleError(BleErrorCode.DeviceNotFound, "Device not found: $deviceIdentifier"))
495
- return@async
496
- }
497
-
498
- try {
499
- val callback = deviceCallbacks[deviceIdentifier]
500
- callback?.setDisconnectPromise(resolve, reject)
501
-
502
- gatt.disconnect()
503
- } catch (e: Exception) {
504
- reject(createBleError(BleErrorCode.OperationCancelled, "Error cancelling connection: ${e.message}"))
505
- }
506
- }
507
-
508
- override fun onDeviceDisconnected(
509
- deviceIdentifier: String,
510
- listener: (NativeBleError?, NativeDevice?) -> Unit
511
- ): Subscription {
512
- deviceDisconnectListeners[deviceIdentifier] = listener
513
-
514
- return object : Subscription {
515
- override fun remove() {
516
- deviceDisconnectListeners.remove(deviceIdentifier)
517
- }
518
- }
519
- }
520
-
521
- override fun isDeviceConnected(deviceIdentifier: String): Promise<Boolean> = Promise.resolve {
522
- connectedDevices.containsKey(deviceIdentifier)
523
- }
524
-
525
- override fun discoverAllServicesAndCharacteristicsForDevice(
526
- deviceIdentifier: String,
527
- transactionId: String?
528
- ): Promise<NativeDevice> = Promise.async { resolve, reject ->
529
- val gatt = connectedDevices[deviceIdentifier] ?: run {
530
- reject(createBleError(BleErrorCode.DeviceNotFound, "Device not found: $deviceIdentifier"))
531
- return@async
532
- }
533
-
534
- try {
535
- val callback = deviceCallbacks[deviceIdentifier]
536
- callback?.setServiceDiscoveryPromise(resolve, reject)
537
-
538
- if (!gatt.discoverServices()) {
539
- reject(createBleError(BleErrorCode.OperationCancelled, "Failed to start service discovery"))
540
- }
541
- } catch (e: Exception) {
542
- reject(createBleError(BleErrorCode.OperationCancelled, "Error discovering services: ${e.message}"))
543
- }
544
- }
545
-
546
- override fun servicesForDevice(deviceIdentifier: String): Promise<List<NativeService>> = Promise.resolve {
547
- val gatt = connectedDevices[deviceIdentifier] ?: return@resolve emptyList()
548
-
549
- gatt.services.mapIndexed { index, service ->
550
- NativeService(
551
- id = index.toDouble(),
552
- uuid = service.uuid.toString(),
553
- deviceID = deviceIdentifier,
554
- isPrimary = service.type == BluetoothGattService.SERVICE_TYPE_PRIMARY
555
- )
556
- }
557
- }
558
-
559
- // Additional methods implementation would continue here...
560
- // For brevity, showing the core pattern. The full implementation would include
561
- // all remaining methods from the HybridBleManagerSpec interface.
562
-
563
- // MARK: - Helper Methods
564
-
565
- private fun hasBluetoothPermissions(): Boolean {
566
- val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
567
- arrayOf(
568
- android.Manifest.permission.BLUETOOTH_SCAN,
569
- android.Manifest.permission.BLUETOOTH_CONNECT
570
- )
571
- } else {
572
- arrayOf(
573
- android.Manifest.permission.BLUETOOTH,
574
- android.Manifest.permission.BLUETOOTH_ADMIN,
575
- android.Manifest.permission.ACCESS_FINE_LOCATION
576
- )
577
- }
578
-
579
- return permissions.all { permission ->
580
- ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
581
- }
582
- }
583
-
584
- private fun mapScanMode(scanMode: ScanMode?): Int {
585
- return when (scanMode) {
586
- ScanMode.Opportunistic -> ScanSettings.SCAN_MODE_OPPORTUNISTIC
587
- ScanMode.LowPower -> ScanSettings.SCAN_MODE_LOW_POWER
588
- ScanMode.Balanced -> ScanSettings.SCAN_MODE_BALANCED
589
- ScanMode.LowLatency -> ScanSettings.SCAN_MODE_LOW_LATENCY
590
- null -> ScanSettings.SCAN_MODE_LOW_LATENCY
591
- }
592
- }
593
-
594
- private fun createNativeDevice(
595
- device: BluetoothDevice,
596
- scanRecord: ScanRecord? = null,
597
- rssi: Int? = null
598
- ): NativeDevice {
599
- val serviceData = mutableListOf<ServiceDataEntry>()
600
- var serviceUUIDs: List<String>? = null
601
- var manufacturerData: String? = null
602
- var localName: String? = null
603
- var txPowerLevel: Double? = null
604
- var isConnectable: Boolean? = null
605
-
606
- scanRecord?.let { record ->
607
- // Parse service UUIDs
608
- serviceUUIDs = record.serviceUuids?.map { it.toString() }
609
-
610
- // Parse manufacturer data
611
- record.manufacturerSpecificData?.let { data ->
612
- if (data.size() > 0) {
613
- val key = data.keyAt(0)
614
- val value = data.get(key)
615
- manufacturerData = Base64.encodeToString(value, Base64.NO_WRAP)
616
- }
617
- }
618
-
619
- // Parse service data
620
- record.serviceData?.forEach { (uuid, data) ->
621
- serviceData.add(ServiceDataEntry(uuid.toString(), Base64.encodeToString(data, Base64.NO_WRAP)))
622
- }
623
-
624
- localName = record.deviceName
625
- txPowerLevel = record.txPowerLevel.toDouble().takeIf { it != Int.MIN_VALUE }
626
- }
627
-
628
- return NativeDevice(
629
- id = device.address,
630
- deviceName = device.name ?: localName,
631
- rssi = rssi?.toDouble(),
632
- mtu = DEFAULT_MTU.toDouble(),
633
- manufacturerData = manufacturerData,
634
- serviceData = serviceData,
635
- serviceUUIDs = serviceUUIDs,
636
- localName = localName,
637
- txPowerLevel = txPowerLevel,
638
- solicitedServiceUUIDs = null, // Not available in Android ScanRecord
639
- isConnectable = isConnectable,
640
- overflowServiceUUIDs = null, // Not available in Android ScanRecord
641
- rawScanRecord = scanRecord?.bytes?.let { Base64.encodeToString(it, Base64.NO_WRAP) } ?: ""
642
- )
643
- }
644
-
645
- private fun createBleError(
646
- errorCode: BleErrorCode,
647
- message: String,
648
- deviceId: String? = null
649
- ): NativeBleError {
650
- return NativeBleError(
651
- errorCode = errorCode,
652
- attErrorCode = null,
653
- iosErrorCode = null,
654
- androidErrorCode = null,
655
- reason = message,
656
- deviceID = deviceId,
657
- serviceUUID = null,
658
- characteristicUUID = null,
659
- descriptorUUID = null,
660
- internalMessage = message
661
- )
662
- }
663
-
664
- // MARK: - GATT Callback Implementation
665
-
666
- private inner class BleGattCallback(
667
- private val deviceId: String,
668
- private val connectionCallback: (NativeBleError?, NativeDevice?) -> Unit
669
- ) : BluetoothGattCallback() {
670
-
671
- private var disconnectPromise: ((NativeDevice) -> Unit, (Throwable) -> Unit)? = null
672
- private var rssiPromise: ((NativeDevice) -> Unit, (Throwable) -> Unit)? = null
673
- private var mtuPromise: ((NativeDevice) -> Unit, (Throwable) -> Unit)? = null
674
- private var serviceDiscoveryPromise: ((NativeDevice) -> Unit, (Throwable) -> Unit)? = null
675
-
676
- fun setDisconnectPromise(resolve: (NativeDevice) -> Unit, reject: (Throwable) -> Unit) {
677
- disconnectPromise = Pair(resolve, reject)
678
- }
679
-
680
- fun setRssiPromise(resolve: (NativeDevice) -> Unit, reject: (Throwable) -> Unit) {
681
- rssiPromise = Pair(resolve, reject)
682
- }
683
-
684
- fun setMtuPromise(resolve: (NativeDevice) -> Unit, reject: (Throwable) -> Unit) {
685
- mtuPromise = Pair(resolve, reject)
686
- }
687
-
688
- fun setServiceDiscoveryPromise(resolve: (NativeDevice) -> Unit, reject: (Throwable) -> Unit) {
689
- serviceDiscoveryPromise = Pair(resolve, reject)
690
- }
691
-
692
- override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
693
- when (newState) {
694
- BluetoothProfile.STATE_CONNECTED -> {
695
- connectedDevices[deviceId] = gatt
696
- val device = createNativeDevice(gatt.device)
697
- connectionCallback(null, device)
698
- }
699
- BluetoothProfile.STATE_DISCONNECTED -> {
700
- connectedDevices.remove(deviceId)
701
- deviceCallbacks.remove(deviceId)
702
-
703
- val device = createNativeDevice(gatt.device)
704
- val error = if (status != BluetoothGatt.GATT_SUCCESS) {
705
- createBleError(BleErrorCode.DeviceDisconnected, "Device disconnected with status: $status", deviceId)
706
- } else null
707
-
708
- // Notify disconnect listeners
709
- deviceDisconnectListeners[deviceId]?.invoke(error, device)
710
-
711
- // Handle pending disconnect promise
712
- disconnectPromise?.let { (resolve, _) ->
713
- resolve(device)
714
- disconnectPromise = null
715
- }
716
-
717
- gatt.close()
718
- }
719
- }
720
- }
721
-
722
- override fun onReadRemoteRssi(gatt: BluetoothGatt, rssi: Int, status: Int) {
723
- rssiPromise?.let { (resolve, reject) ->
724
- if (status == BluetoothGatt.GATT_SUCCESS) {
725
- val device = createNativeDevice(gatt.device, rssi = rssi)
726
- resolve(device)
727
- } else {
728
- reject(createBleError(BleErrorCode.OperationCancelled, "Failed to read RSSI: $status"))
729
- }
730
- rssiPromise = null
731
- }
732
- }
733
-
734
- override fun onMtuChanged(gatt: BluetoothGatt, mtu: Int, status: Int) {
735
- mtuPromise?.let { (resolve, reject) ->
736
- if (status == BluetoothGatt.GATT_SUCCESS) {
737
- val device = createNativeDevice(gatt.device)
738
- resolve(device)
739
- } else {
740
- reject(createBleError(BleErrorCode.OperationCancelled, "Failed to change MTU: $status"))
741
- }
742
- mtuPromise = null
743
- }
744
- }
745
-
746
- override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
747
- serviceDiscoveryPromise?.let { (resolve, reject) ->
748
- if (status == BluetoothGatt.GATT_SUCCESS) {
749
- val device = createNativeDevice(gatt.device)
750
- resolve(device)
751
- } else {
752
- reject(createBleError(BleErrorCode.ServicesNotDiscovered, "Service discovery failed: $status"))
753
- }
754
- serviceDiscoveryPromise = null
755
- }
756
- }
757
-
758
- // Additional callback methods for characteristic and descriptor operations would be here...
759
- }
760
- }