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.
- package/BleNitro.podspec +39 -0
- package/LICENSE +1 -1
- package/README.md +273 -77
- package/ios/BleNitroBleManager.swift +425 -464
- package/ios/BlePeripheralDelegate.swift +174 -0
- package/lib/commonjs/index.d.ts +174 -10
- package/lib/commonjs/index.d.ts.map +1 -1
- package/lib/commonjs/index.js +461 -38
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeBleNitro.d.ts +5 -0
- package/lib/commonjs/specs/NativeBleNitro.d.ts.map +1 -0
- package/lib/commonjs/{utils/index.js → specs/NativeBleNitro.js} +6 -3
- package/lib/commonjs/specs/NativeBleNitro.js.map +1 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.d.ts +69 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.d.ts.map +1 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.js +14 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.js.map +1 -0
- package/lib/index.d.ts +174 -10
- package/lib/index.js +456 -16
- package/lib/specs/NativeBleNitro.d.ts +4 -0
- package/lib/specs/NativeBleNitro.js +5 -0
- package/lib/specs/NativeBleNitro.nitro.d.ts +68 -0
- package/lib/specs/NativeBleNitro.nitro.js +10 -0
- package/nitro.json +1 -1
- package/nitrogen/generated/android/BleNitro+autolinking.cmake +2 -10
- package/nitrogen/generated/android/BleNitroOnLoad.cpp +25 -22
- package/nitrogen/generated/android/c++/JBLEDevice.hpp +95 -0
- package/nitrogen/generated/android/c++/{JState.hpp → JBLEState.hpp} +22 -22
- package/nitrogen/generated/android/c++/JFunc_void_BLEDevice.hpp +82 -0
- package/nitrogen/generated/android/c++/JFunc_void_BLEState.hpp +76 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +74 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool_std__string.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool_std__string_std__string.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool_std__vector_double__std__string.hpp +86 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_bool_std__string.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_std__vector_double_.hpp +86 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_BLEDevice_.hpp +99 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_std__string_.hpp +93 -0
- package/nitrogen/generated/android/c++/JHybridNativeBleNitroSpec.cpp +171 -0
- package/nitrogen/generated/android/c++/JHybridNativeBleNitroSpec.hpp +83 -0
- package/nitrogen/generated/android/c++/JManufacturerData.hpp +73 -0
- package/nitrogen/generated/android/c++/JManufacturerDataEntry.hpp +68 -0
- package/nitrogen/generated/android/c++/JScanFilter.hpp +79 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BLEDevice.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{LogLevel.kt → BLEState.kt} +9 -13
- 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
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void.kt → Func_void_BLEState.kt} +15 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_State.kt → Func_void_bool.kt} +15 -14
- 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
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_bool_std__string_std__string.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_bool_std__vector_double__std__string.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__string_bool_std__string.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__string_std__vector_double_.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__vector_BLEDevice_.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__vector_std__string_.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridNativeBleNitroSpec.kt +223 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{ServiceDataEntry.kt → ManufacturerData.kt} +7 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{ConnectionOptions.kt → ManufacturerDataEntry.kt} +10 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{NativeService.kt → ScanFilter.kt} +13 -7
- package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Bridge.cpp +67 -175
- package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Bridge.hpp +205 -867
- package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Umbrella.hpp +20 -88
- package/nitrogen/generated/ios/BleNitroAutolinking.mm +3 -3
- package/nitrogen/generated/ios/BleNitroAutolinking.swift +4 -4
- package/nitrogen/generated/ios/c++/{HybridCharacteristicSpecSwift.cpp → HybridNativeBleNitroSpecSwift.cpp} +2 -2
- package/nitrogen/generated/ios/c++/HybridNativeBleNitroSpecSwift.hpp +205 -0
- package/nitrogen/generated/ios/swift/BLEDevice.swift +102 -0
- package/nitrogen/generated/ios/swift/{State.swift → BLEState.swift} +6 -6
- package/nitrogen/generated/ios/swift/Func_void.swift +1 -0
- package/nitrogen/generated/ios/swift/{Func_void_State.swift → Func_void_BLEDevice.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_LogLevel.swift → Func_void_BLEState.swift} +12 -11
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +6 -5
- package/nitrogen/generated/ios/swift/{Func_void_NativeDescriptor.swift → Func_void_bool_std__string.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_std__vector_NativeCharacteristic_.swift → Func_void_bool_std__string_std__string.swift} +12 -11
- package/nitrogen/generated/ios/swift/Func_void_bool_std__vector_double__std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -0
- package/nitrogen/generated/ios/swift/{Func_void_NativeDevice.swift → Func_void_std__string_bool_std__string.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_std__optional_BleRestoredState_.swift → Func_void_std__string_std__vector_double_.swift} +12 -17
- package/nitrogen/generated/ios/swift/{Func_void_NativeCharacteristic.swift → Func_void_std__vector_BLEDevice_.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_std__vector_NativeDevice_.swift → Func_void_std__vector_std__string_.swift} +12 -11
- package/nitrogen/generated/ios/swift/HybridNativeBleNitroSpec.swift +68 -0
- package/nitrogen/generated/ios/swift/HybridNativeBleNitroSpec_cxx.swift +485 -0
- package/nitrogen/generated/ios/swift/ManufacturerData.swift +47 -0
- package/nitrogen/generated/ios/swift/ManufacturerDataEntry.swift +58 -0
- package/nitrogen/generated/ios/swift/ScanFilter.swift +69 -0
- package/nitrogen/generated/shared/c++/BLEDevice.hpp +90 -0
- package/nitrogen/generated/shared/c++/{State.hpp → BLEState.hpp} +13 -15
- package/nitrogen/generated/shared/c++/HybridNativeBleNitroSpec.cpp +40 -0
- package/nitrogen/generated/shared/c++/HybridNativeBleNitroSpec.hpp +93 -0
- package/nitrogen/generated/shared/c++/ManufacturerData.hpp +69 -0
- package/nitrogen/generated/shared/c++/{ServiceDataEntry.hpp → ManufacturerDataEntry.hpp} +19 -20
- package/nitrogen/generated/shared/c++/ScanFilter.hpp +76 -0
- package/package.json +9 -11
- package/react-native.config.js +2 -7
- package/src/__tests__/index.test.ts +188 -0
- package/src/index.ts +604 -45
- package/src/specs/NativeBleNitro.nitro.ts +84 -0
- package/src/specs/NativeBleNitro.ts +8 -0
- package/android/build.gradle +0 -58
- package/android/src/main/AndroidManifest.xml +0 -23
- package/android/src/main/kotlin/com/margelo/nitro/co/zyke/ble/BleNitroBleManager.kt +0 -760
- package/ios/BleNitro.podspec +0 -44
- package/ios/BleNitroModule.swift +0 -24
- package/lib/BleManagerCompatFactory.d.ts +0 -55
- package/lib/BleManagerCompatFactory.js +0 -194
- package/lib/BleManagerFactory.d.ts +0 -30
- package/lib/BleManagerFactory.js +0 -73
- package/lib/commonjs/BleManagerCompatFactory.d.ts +0 -56
- package/lib/commonjs/BleManagerCompatFactory.d.ts.map +0 -1
- package/lib/commonjs/BleManagerCompatFactory.js +0 -201
- package/lib/commonjs/BleManagerCompatFactory.js.map +0 -1
- package/lib/commonjs/BleManagerFactory.d.ts +0 -31
- package/lib/commonjs/BleManagerFactory.d.ts.map +0 -1
- package/lib/commonjs/BleManagerFactory.js +0 -81
- package/lib/commonjs/BleManagerFactory.js.map +0 -1
- package/lib/commonjs/compatibility/constants.d.ts +0 -50
- package/lib/commonjs/compatibility/constants.d.ts.map +0 -1
- package/lib/commonjs/compatibility/constants.js +0 -58
- package/lib/commonjs/compatibility/constants.js.map +0 -1
- package/lib/commonjs/compatibility/deviceWrapper.d.ts +0 -100
- package/lib/commonjs/compatibility/deviceWrapper.d.ts.map +0 -1
- package/lib/commonjs/compatibility/deviceWrapper.js +0 -268
- package/lib/commonjs/compatibility/deviceWrapper.js.map +0 -1
- package/lib/commonjs/compatibility/enums.d.ts +0 -39
- package/lib/commonjs/compatibility/enums.d.ts.map +0 -1
- package/lib/commonjs/compatibility/enums.js +0 -179
- package/lib/commonjs/compatibility/enums.js.map +0 -1
- package/lib/commonjs/compatibility/index.d.ts +0 -13
- package/lib/commonjs/compatibility/index.d.ts.map +0 -1
- package/lib/commonjs/compatibility/index.js +0 -41
- package/lib/commonjs/compatibility/index.js.map +0 -1
- package/lib/commonjs/compatibility/serviceData.d.ts +0 -52
- package/lib/commonjs/compatibility/serviceData.d.ts.map +0 -1
- package/lib/commonjs/compatibility/serviceData.js +0 -80
- package/lib/commonjs/compatibility/serviceData.js.map +0 -1
- package/lib/commonjs/errors/BleError.d.ts +0 -60
- package/lib/commonjs/errors/BleError.d.ts.map +0 -1
- package/lib/commonjs/errors/BleError.js +0 -125
- package/lib/commonjs/errors/BleError.js.map +0 -1
- package/lib/commonjs/specs/BleManager.nitro.d.ts +0 -45
- package/lib/commonjs/specs/BleManager.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/BleManager.nitro.js +0 -3
- package/lib/commonjs/specs/BleManager.nitro.js.map +0 -1
- package/lib/commonjs/specs/Characteristic.nitro.d.ts +0 -27
- package/lib/commonjs/specs/Characteristic.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Characteristic.nitro.js +0 -3
- package/lib/commonjs/specs/Characteristic.nitro.js.map +0 -1
- package/lib/commonjs/specs/Descriptor.nitro.d.ts +0 -18
- package/lib/commonjs/specs/Descriptor.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Descriptor.nitro.js +0 -3
- package/lib/commonjs/specs/Descriptor.nitro.js.map +0 -1
- package/lib/commonjs/specs/Device.nitro.d.ts +0 -38
- package/lib/commonjs/specs/Device.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Device.nitro.js +0 -3
- package/lib/commonjs/specs/Device.nitro.js.map +0 -1
- package/lib/commonjs/specs/Service.nitro.d.ts +0 -20
- package/lib/commonjs/specs/Service.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Service.nitro.js +0 -3
- package/lib/commonjs/specs/Service.nitro.js.map +0 -1
- package/lib/commonjs/specs/types.d.ts +0 -229
- package/lib/commonjs/specs/types.d.ts.map +0 -1
- package/lib/commonjs/specs/types.js +0 -150
- package/lib/commonjs/specs/types.js.map +0 -1
- package/lib/commonjs/utils/base64.d.ts +0 -26
- package/lib/commonjs/utils/base64.d.ts.map +0 -1
- package/lib/commonjs/utils/base64.js +0 -88
- package/lib/commonjs/utils/base64.js.map +0 -1
- package/lib/commonjs/utils/index.d.ts +0 -3
- package/lib/commonjs/utils/index.d.ts.map +0 -1
- package/lib/commonjs/utils/index.js.map +0 -1
- package/lib/commonjs/utils/uuid.d.ts +0 -10
- package/lib/commonjs/utils/uuid.d.ts.map +0 -1
- package/lib/commonjs/utils/uuid.js +0 -41
- package/lib/commonjs/utils/uuid.js.map +0 -1
- package/lib/compatibility/constants.d.ts +0 -49
- package/lib/compatibility/constants.js +0 -50
- package/lib/compatibility/deviceWrapper.d.ts +0 -99
- package/lib/compatibility/deviceWrapper.js +0 -259
- package/lib/compatibility/enums.d.ts +0 -38
- package/lib/compatibility/enums.js +0 -159
- package/lib/compatibility/index.d.ts +0 -12
- package/lib/compatibility/index.js +0 -12
- package/lib/compatibility/serviceData.d.ts +0 -51
- package/lib/compatibility/serviceData.js +0 -70
- package/lib/errors/BleError.d.ts +0 -59
- package/lib/errors/BleError.js +0 -120
- package/lib/specs/BleManager.nitro.d.ts +0 -44
- package/lib/specs/BleManager.nitro.js +0 -1
- package/lib/specs/Characteristic.nitro.d.ts +0 -26
- package/lib/specs/Characteristic.nitro.js +0 -1
- package/lib/specs/Descriptor.nitro.d.ts +0 -17
- package/lib/specs/Descriptor.nitro.js +0 -1
- package/lib/specs/Device.nitro.d.ts +0 -37
- package/lib/specs/Device.nitro.js +0 -1
- package/lib/specs/Service.nitro.d.ts +0 -19
- package/lib/specs/Service.nitro.js +0 -1
- package/lib/specs/types.d.ts +0 -228
- package/lib/specs/types.js +0 -146
- package/lib/utils/base64.d.ts +0 -25
- package/lib/utils/base64.js +0 -80
- package/lib/utils/index.d.ts +0 -2
- package/lib/utils/index.js +0 -2
- package/lib/utils/uuid.d.ts +0 -9
- package/lib/utils/uuid.js +0 -37
- package/nitrogen/generated/android/c++/JBleATTErrorCode.hpp +0 -107
- package/nitrogen/generated/android/c++/JBleAndroidErrorCode.hpp +0 -101
- package/nitrogen/generated/android/c++/JBleErrorCode.hpp +0 -170
- package/nitrogen/generated/android/c++/JBleIOSErrorCode.hpp +0 -92
- package/nitrogen/generated/android/c++/JBleManagerNitroOptions.hpp +0 -54
- package/nitrogen/generated/android/c++/JBleRestoredState.hpp +0 -76
- package/nitrogen/generated/android/c++/JCharacteristicSubscriptionType.hpp +0 -59
- package/nitrogen/generated/android/c++/JConnectionOptions.hpp +0 -61
- package/nitrogen/generated/android/c++/JConnectionPriority.hpp +0 -62
- package/nitrogen/generated/android/c++/JFunc_void.hpp +0 -74
- package/nitrogen/generated/android/c++/JFunc_void_State.hpp +0 -76
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.hpp +0 -88
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_NativeBleError__std__optional_NativeDevice_.hpp +0 -91
- package/nitrogen/generated/android/c++/JHybridBleManagerSpec.cpp +0 -653
- package/nitrogen/generated/android/c++/JHybridBleManagerSpec.hpp +0 -92
- package/nitrogen/generated/android/c++/JHybridCharacteristicSpec.cpp +0 -253
- package/nitrogen/generated/android/c++/JHybridCharacteristicSpec.hpp +0 -79
- package/nitrogen/generated/android/c++/JHybridDescriptorSpec.cpp +0 -115
- package/nitrogen/generated/android/c++/JHybridDescriptorSpec.hpp +0 -70
- package/nitrogen/generated/android/c++/JHybridDeviceSpec.cpp +0 -476
- package/nitrogen/generated/android/c++/JHybridDeviceSpec.hpp +0 -90
- package/nitrogen/generated/android/c++/JHybridServiceSpec.cpp +0 -232
- package/nitrogen/generated/android/c++/JHybridServiceSpec.hpp +0 -72
- package/nitrogen/generated/android/c++/JLogLevel.hpp +0 -71
- package/nitrogen/generated/android/c++/JNativeBleError.hpp +0 -98
- package/nitrogen/generated/android/c++/JNativeCharacteristic.hpp +0 -98
- package/nitrogen/generated/android/c++/JNativeDescriptor.hpp +0 -82
- package/nitrogen/generated/android/c++/JNativeDevice.hpp +0 -173
- package/nitrogen/generated/android/c++/JNativeService.hpp +0 -65
- package/nitrogen/generated/android/c++/JScanCallbackType.hpp +0 -62
- package/nitrogen/generated/android/c++/JScanMode.hpp +0 -65
- package/nitrogen/generated/android/c++/JScanOptions.hpp +0 -69
- package/nitrogen/generated/android/c++/JServiceDataEntry.hpp +0 -57
- package/nitrogen/generated/android/c++/JSubscription.hpp +0 -64
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleATTErrorCode.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleAndroidErrorCode.kt +0 -39
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleErrorCode.kt +0 -62
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleIOSErrorCode.kt +0 -36
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleManagerNitroOptions.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleRestoredState.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/CharacteristicSubscriptionType.kt +0 -25
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ConnectionPriority.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridBleManagerSpec.kt +0 -192
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridCharacteristicSpec.kt +0 -127
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridDescriptorSpec.kt +0 -86
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridDeviceSpec.kt +0 -176
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridServiceSpec.kt +0 -99
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeBleError.kt +0 -35
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeCharacteristic.kt +0 -37
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeDescriptor.kt +0 -33
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeDevice.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanCallbackType.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanMode.kt +0 -27
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanOptions.kt +0 -29
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/State.kt +0 -29
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Subscription.kt +0 -30
- package/nitrogen/generated/ios/c++/HybridBleManagerSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridBleManagerSpecSwift.hpp +0 -377
- package/nitrogen/generated/ios/c++/HybridCharacteristicSpecSwift.hpp +0 -192
- package/nitrogen/generated/ios/c++/HybridDescriptorSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridDescriptorSpecSwift.hpp +0 -112
- package/nitrogen/generated/ios/c++/HybridDeviceSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridDeviceSpecSwift.hpp +0 -294
- package/nitrogen/generated/ios/c++/HybridServiceSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridServiceSpecSwift.hpp +0 -170
- package/nitrogen/generated/ios/swift/BleATTErrorCode.swift +0 -104
- package/nitrogen/generated/ios/swift/BleAndroidErrorCode.swift +0 -96
- package/nitrogen/generated/ios/swift/BleErrorCode.swift +0 -188
- package/nitrogen/generated/ios/swift/BleIOSErrorCode.swift +0 -84
- package/nitrogen/generated/ios/swift/BleManagerNitroOptions.swift +0 -53
- package/nitrogen/generated/ios/swift/BleRestoredState.swift +0 -47
- package/nitrogen/generated/ios/swift/CharacteristicSubscriptionType.swift +0 -40
- package/nitrogen/generated/ios/swift/ConnectionOptions.swift +0 -57
- package/nitrogen/generated/ios/swift/ConnectionPriority.swift +0 -44
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.swift +0 -58
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NativeBleError__std__optional_NativeDevice_.swift +0 -58
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__co__zyke__ble__HybridCharacteristicSpec_.swift +0 -50
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__co__zyke__ble__HybridDescriptorSpec_.swift +0 -50
- package/nitrogen/generated/ios/swift/Func_void_std__vector_NativeDescriptor_.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_std__vector_NativeService_.swift +0 -46
- package/nitrogen/generated/ios/swift/HybridBleManagerSpec.swift +0 -78
- package/nitrogen/generated/ios/swift/HybridBleManagerSpec_cxx.swift +0 -852
- package/nitrogen/generated/ios/swift/HybridCharacteristicSpec.swift +0 -65
- package/nitrogen/generated/ios/swift/HybridCharacteristicSpec_cxx.swift +0 -384
- package/nitrogen/generated/ios/swift/HybridDescriptorSpec.swift +0 -56
- package/nitrogen/generated/ios/swift/HybridDescriptorSpec_cxx.swift +0 -218
- package/nitrogen/generated/ios/swift/HybridDeviceSpec.swift +0 -76
- package/nitrogen/generated/ios/swift/HybridDeviceSpec_cxx.swift +0 -702
- package/nitrogen/generated/ios/swift/HybridServiceSpec.swift +0 -58
- package/nitrogen/generated/ios/swift/HybridServiceSpec_cxx.swift +0 -338
- package/nitrogen/generated/ios/swift/LogLevel.swift +0 -56
- package/nitrogen/generated/ios/swift/NativeBleError.swift +0 -278
- package/nitrogen/generated/ios/swift/NativeCharacteristic.swift +0 -174
- package/nitrogen/generated/ios/swift/NativeDescriptor.swift +0 -130
- package/nitrogen/generated/ios/swift/NativeDevice.swift +0 -377
- package/nitrogen/generated/ios/swift/NativeService.swift +0 -68
- package/nitrogen/generated/ios/swift/ScanCallbackType.swift +0 -44
- package/nitrogen/generated/ios/swift/ScanMode.swift +0 -48
- package/nitrogen/generated/ios/swift/ScanOptions.swift +0 -116
- package/nitrogen/generated/ios/swift/ServiceDataEntry.swift +0 -46
- package/nitrogen/generated/ios/swift/Subscription.swift +0 -46
- package/nitrogen/generated/shared/c++/BleATTErrorCode.hpp +0 -80
- package/nitrogen/generated/shared/c++/BleAndroidErrorCode.hpp +0 -78
- package/nitrogen/generated/shared/c++/BleErrorCode.hpp +0 -101
- package/nitrogen/generated/shared/c++/BleIOSErrorCode.hpp +0 -75
- package/nitrogen/generated/shared/c++/BleManagerNitroOptions.hpp +0 -70
- package/nitrogen/generated/shared/c++/BleRestoredState.hpp +0 -71
- package/nitrogen/generated/shared/c++/CharacteristicSubscriptionType.hpp +0 -64
- package/nitrogen/generated/shared/c++/ConnectionOptions.hpp +0 -77
- package/nitrogen/generated/shared/c++/ConnectionPriority.hpp +0 -65
- package/nitrogen/generated/shared/c++/HybridBleManagerSpec.cpp +0 -51
- package/nitrogen/generated/shared/c++/HybridBleManagerSpec.hpp +0 -137
- package/nitrogen/generated/shared/c++/HybridCharacteristicSpec.cpp +0 -39
- package/nitrogen/generated/shared/c++/HybridCharacteristicSpec.hpp +0 -101
- package/nitrogen/generated/shared/c++/HybridDescriptorSpec.cpp +0 -30
- package/nitrogen/generated/shared/c++/HybridDescriptorSpec.hpp +0 -75
- package/nitrogen/generated/shared/c++/HybridDeviceSpec.cpp +0 -50
- package/nitrogen/generated/shared/c++/HybridDeviceSpec.hpp +0 -123
- package/nitrogen/generated/shared/c++/HybridServiceSpec.cpp +0 -32
- package/nitrogen/generated/shared/c++/HybridServiceSpec.hpp +0 -90
- package/nitrogen/generated/shared/c++/LogLevel.hpp +0 -68
- package/nitrogen/generated/shared/c++/NativeBleError.hpp +0 -117
- package/nitrogen/generated/shared/c++/NativeCharacteristic.hpp +0 -114
- package/nitrogen/generated/shared/c++/NativeDescriptor.hpp +0 -98
- package/nitrogen/generated/shared/c++/NativeDevice.hpp +0 -121
- package/nitrogen/generated/shared/c++/NativeService.hpp +0 -81
- package/nitrogen/generated/shared/c++/ScanCallbackType.hpp +0 -65
- package/nitrogen/generated/shared/c++/ScanMode.hpp +0 -66
- package/nitrogen/generated/shared/c++/ScanOptions.hpp +0 -86
- package/nitrogen/generated/shared/c++/Subscription.hpp +0 -69
- package/src/BleManagerCompatFactory.ts +0 -371
- package/src/BleManagerFactory.ts +0 -93
- package/src/__tests__/BleManager.test.ts +0 -327
- package/src/__tests__/compatibility/deviceWrapper.test.ts +0 -563
- package/src/__tests__/compatibility/enums.test.ts +0 -264
- package/src/compatibility/constants.ts +0 -71
- package/src/compatibility/deviceWrapper.ts +0 -427
- package/src/compatibility/enums.ts +0 -190
- package/src/compatibility/index.ts +0 -32
- package/src/compatibility/serviceData.ts +0 -85
- package/src/errors/BleError.ts +0 -193
- package/src/specs/BleManager.nitro.ts +0 -165
- package/src/specs/Characteristic.nitro.ts +0 -61
- package/src/specs/Descriptor.nitro.ts +0 -28
- package/src/specs/Device.nitro.ts +0 -104
- package/src/specs/Service.nitro.ts +0 -64
- package/src/specs/types.ts +0 -259
- package/src/utils/base64.ts +0 -80
- package/src/utils/index.ts +0 -2
- 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
|
-
}
|