From 9ae5ba11a38347c40bff1975cf05c835784dbefa Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 20:21:56 -0400 Subject: [PATCH 01/39] Add generated sources --- .../AndroidBluetooth/AdvertiseCallback.swift | 31 + .../AdvertiseData+Builder.swift | 36 + Sources/AndroidBluetooth/AdvertiseData.swift | 63 + .../AdvertiseSettings+Builder.swift | 29 + .../AndroidBluetooth/AdvertiseSettings.swift | 62 + Sources/AndroidBluetooth/AdvertisingSet.swift | 27 + .../AdvertisingSetCallback.swift | 55 + .../AdvertisingSetParameters+Builder.swift | 44 + .../AdvertisingSetParameters.swift | 89 + Sources/AndroidBluetooth/BluetoothA2dp.swift | 307 +--- .../BluetoothAdapter+LeScanCallback.swift | 11 + .../AndroidBluetooth/BluetoothAdapter.swift | 1533 +++-------------- .../BluetoothAdapterLeScanCallback.swift | 121 -- .../BluetoothClass+Device+Major.swift | 45 + .../BluetoothClass+Device.swift | 174 ++ .../BluetoothClass+Service.swift | 42 + Sources/AndroidBluetooth/BluetoothClass.swift | 209 +-- .../BluetoothClassDevice.swift | 963 ----------- .../BluetoothClassDeviceMajor.swift | 256 --- .../BluetoothClassService.swift | 220 --- .../BluetoothCodecConfig+Builder.swift | 44 + .../BluetoothCodecConfig.swift | 140 ++ .../BluetoothCodecStatus+Builder.swift | 24 + .../BluetoothCodecStatus.swift | 48 + .../AndroidBluetooth/BluetoothCodecType.swift | 59 + .../BluetoothCsipSetCoordinator.swift | 78 + .../AndroidBluetooth/BluetoothDevice.swift | 1461 +++------------- Sources/AndroidBluetooth/BluetoothGatt.swift | 1074 ++---------- .../BluetoothGattCallback.swift | 561 +----- .../BluetoothGattCharacteristic.swift | 1282 ++------------ .../BluetoothGattDescriptor.swift | 500 +----- .../BluetoothGattServer.swift | 533 ++---- .../BluetoothGattServerCallback.swift | 83 +- .../BluetoothGattService.swift | 385 +---- .../AndroidBluetooth/BluetoothHeadset.swift | 137 ++ .../AndroidBluetooth/BluetoothHealth.swift | 120 ++ .../BluetoothHealthAppConfiguration.swift | 32 + .../BluetoothHealthCallback.swift | 16 + .../BluetoothHearingAid.swift | 71 + .../BluetoothHidDevice+Callback.swift | 32 + .../AndroidBluetooth/BluetoothHidDevice.swift | 155 ++ .../BluetoothHidDeviceAppQosSettings.swift | 56 + .../BluetoothHidDeviceAppSdpSettings.swift | 41 + .../BluetoothLeAdvertiseCallback.swift | 150 -- .../BluetoothLeAdvertiseData.swift | 186 -- .../BluetoothLeAdvertiseDataBuilder.swift | 231 --- .../BluetoothLeAdvertiseSettings.swift | 336 ---- .../BluetoothLeAdvertiseSettingsBuilder.swift | 203 --- .../BluetoothLeAdvertiser.swift | 31 + .../BluetoothLeAdvertisingSet.swift | 189 -- .../BluetoothLeAdvertisingSetCallback.swift | 573 ------ .../BluetoothLeAdvertisingSetParameters.swift | 521 ------ ...othLeAdvertisingSetParametersBuilder.swift | 350 ---- .../AndroidBluetooth/BluetoothLeAudio.swift | 87 + .../BluetoothLeAudioCodecConfig+Builder.swift | 44 + .../BluetoothLeAudioCodecConfig.swift | 149 ++ .../BluetoothLeAudioCodecStatus.swift | 63 + ...toothLePeriodicAdvertisingParameters.swift | 108 -- ...PeriodicAdvertisingParametersBuilder.swift | 156 -- .../BluetoothLeScanCallback.swift | 304 ---- .../BluetoothLeScanFilter.swift | 365 ---- .../BluetoothLeScanFilterBuilder.swift | 308 ---- .../BluetoothLeScanRecord.swift | 306 ---- .../BluetoothLeScanResult.swift | 623 ------- .../BluetoothLeScanSettings.swift | 566 ------ .../BluetoothLeScanSettingsBuilder.swift | 302 ---- .../AndroidBluetooth/BluetoothLeScanner.swift | 36 + .../BluetoothLowEnergyAdvertiser.swift | 312 ---- .../BluetoothLowEnergyScanner.swift | 315 ---- .../AndroidBluetooth/BluetoothManager.swift | 204 +-- .../BluetoothProfile+ServiceListener.swift | 14 + .../AndroidBluetooth/BluetoothProfile.swift | 455 +---- .../BluetoothProfileServiceListener.swift | 154 -- .../BluetoothServerSocket.swift | 169 +- .../AndroidBluetooth/BluetoothSocket.swift | 352 +--- .../BluetoothSocketException.swift | 83 + .../BluetoothStatusCodes.swift | 45 + ...eriodicAdvertisingParameters+Builder.swift | 20 + .../PeriodicAdvertisingParameters.swift | 29 + Sources/AndroidBluetooth/ScanCallback.swift | 38 + .../AndroidBluetooth/ScanFilter+Builder.swift | 51 + Sources/AndroidBluetooth/ScanFilter.swift | 80 + Sources/AndroidBluetooth/ScanRecord.swift | 188 ++ Sources/AndroidBluetooth/ScanResult.swift | 92 + .../ScanSettings+Builder.swift | 35 + Sources/AndroidBluetooth/ScanSettings.swift | 86 + Sources/AndroidBluetooth/TransportBlock.swift | 50 + .../TransportDiscoveryData.swift | 51 + 88 files changed, 4332 insertions(+), 15927 deletions(-) create mode 100644 Sources/AndroidBluetooth/AdvertiseCallback.swift create mode 100644 Sources/AndroidBluetooth/AdvertiseData+Builder.swift create mode 100644 Sources/AndroidBluetooth/AdvertiseData.swift create mode 100644 Sources/AndroidBluetooth/AdvertiseSettings+Builder.swift create mode 100644 Sources/AndroidBluetooth/AdvertiseSettings.swift create mode 100644 Sources/AndroidBluetooth/AdvertisingSet.swift create mode 100644 Sources/AndroidBluetooth/AdvertisingSetCallback.swift create mode 100644 Sources/AndroidBluetooth/AdvertisingSetParameters+Builder.swift create mode 100644 Sources/AndroidBluetooth/AdvertisingSetParameters.swift create mode 100644 Sources/AndroidBluetooth/BluetoothAdapter+LeScanCallback.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothAdapterLeScanCallback.swift create mode 100644 Sources/AndroidBluetooth/BluetoothClass+Device+Major.swift create mode 100644 Sources/AndroidBluetooth/BluetoothClass+Device.swift create mode 100644 Sources/AndroidBluetooth/BluetoothClass+Service.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothClassDevice.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothClassDeviceMajor.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothClassService.swift create mode 100644 Sources/AndroidBluetooth/BluetoothCodecConfig+Builder.swift create mode 100644 Sources/AndroidBluetooth/BluetoothCodecConfig.swift create mode 100644 Sources/AndroidBluetooth/BluetoothCodecStatus+Builder.swift create mode 100644 Sources/AndroidBluetooth/BluetoothCodecStatus.swift create mode 100644 Sources/AndroidBluetooth/BluetoothCodecType.swift create mode 100644 Sources/AndroidBluetooth/BluetoothCsipSetCoordinator.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHeadset.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHealth.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHealthAppConfiguration.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHealthCallback.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHearingAid.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHidDevice+Callback.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHidDevice.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHidDeviceAppQosSettings.swift create mode 100644 Sources/AndroidBluetooth/BluetoothHidDeviceAppSdpSettings.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertiseCallback.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertiseData.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertiseDataBuilder.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertiseSettings.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertiseSettingsBuilder.swift create mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertiser.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertisingSet.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertisingSetCallback.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParameters.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParametersBuilder.swift create mode 100644 Sources/AndroidBluetooth/BluetoothLeAudio.swift create mode 100644 Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig+Builder.swift create mode 100644 Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig.swift create mode 100644 Sources/AndroidBluetooth/BluetoothLeAudioCodecStatus.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParameters.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParametersBuilder.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanCallback.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanFilter.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanFilterBuilder.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanRecord.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanResult.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanSettings.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLeScanSettingsBuilder.swift create mode 100644 Sources/AndroidBluetooth/BluetoothLeScanner.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLowEnergyAdvertiser.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothLowEnergyScanner.swift create mode 100644 Sources/AndroidBluetooth/BluetoothProfile+ServiceListener.swift delete mode 100644 Sources/AndroidBluetooth/BluetoothProfileServiceListener.swift create mode 100644 Sources/AndroidBluetooth/BluetoothSocketException.swift create mode 100644 Sources/AndroidBluetooth/BluetoothStatusCodes.swift create mode 100644 Sources/AndroidBluetooth/PeriodicAdvertisingParameters+Builder.swift create mode 100644 Sources/AndroidBluetooth/PeriodicAdvertisingParameters.swift create mode 100644 Sources/AndroidBluetooth/ScanCallback.swift create mode 100644 Sources/AndroidBluetooth/ScanFilter+Builder.swift create mode 100644 Sources/AndroidBluetooth/ScanFilter.swift create mode 100644 Sources/AndroidBluetooth/ScanRecord.swift create mode 100644 Sources/AndroidBluetooth/ScanResult.swift create mode 100644 Sources/AndroidBluetooth/ScanSettings+Builder.swift create mode 100644 Sources/AndroidBluetooth/ScanSettings.swift create mode 100644 Sources/AndroidBluetooth/TransportBlock.swift create mode 100644 Sources/AndroidBluetooth/TransportDiscoveryData.swift diff --git a/Sources/AndroidBluetooth/AdvertiseCallback.swift b/Sources/AndroidBluetooth/AdvertiseCallback.swift new file mode 100644 index 0000000..374fb1a --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertiseCallback.swift @@ -0,0 +1,31 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.AdvertiseCallback") +open class AdvertiseCallback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func onStartSuccess(_ arg0: AdvertiseSettings?) + + @JavaMethod + open func onStartFailure(_ arg0: Int32) +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_ALREADY_STARTED: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_DATA_TOO_LARGE: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_FEATURE_UNSUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_INTERNAL_ERROR: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_TOO_MANY_ADVERTISERS: Int32 +} diff --git a/Sources/AndroidBluetooth/AdvertiseData+Builder.swift b/Sources/AndroidBluetooth/AdvertiseData+Builder.swift new file mode 100644 index 0000000..f334c6e --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertiseData+Builder.swift @@ -0,0 +1,36 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +extension AdvertiseData { + @JavaClass("android.bluetooth.le.AdvertiseData$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func addServiceUuid(_ arg0: ParcelUuid?) -> AdvertiseData.Builder! + + @JavaMethod + open func addServiceData(_ arg0: ParcelUuid?, _ arg1: [Int8]) -> AdvertiseData.Builder! + + @JavaMethod + open func addServiceSolicitationUuid(_ arg0: ParcelUuid?) -> AdvertiseData.Builder! + + @JavaMethod + open func addTransportDiscoveryData(_ arg0: TransportDiscoveryData?) -> AdvertiseData.Builder! + + @JavaMethod + open func addManufacturerData(_ arg0: Int32, _ arg1: [Int8]) -> AdvertiseData.Builder! + + @JavaMethod + open func setIncludeTxPowerLevel(_ arg0: Bool) -> AdvertiseData.Builder! + + @JavaMethod + open func setIncludeDeviceName(_ arg0: Bool) -> AdvertiseData.Builder! + + @JavaMethod + open func build() -> AdvertiseData! + } +} diff --git a/Sources/AndroidBluetooth/AdvertiseData.swift b/Sources/AndroidBluetooth/AdvertiseData.swift new file mode 100644 index 0000000..2f31d5f --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertiseData.swift @@ -0,0 +1,63 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import AndroidUtil +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaUtil + +@JavaClass("android.bluetooth.le.AdvertiseData", implements: Parcelable.self) +open class AdvertiseData: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getServiceUuids() -> List! + + @JavaMethod + open func getServiceData() -> Map! + + @JavaMethod + open func getServiceSolicitationUuids() -> List! + + @JavaMethod + open func getManufacturerSpecificData() -> SparseArray! + + @JavaMethod + open func getTransportDiscoveryData() -> List! + + @JavaMethod + open func getIncludeTxPowerLevel() -> Bool + + @JavaMethod + open func getIncludeDeviceName() -> Bool + + @JavaMethod + open override func equals(_ arg0: AdvertiseData?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} + +extension AdvertiseData: CustomStringConvertible { + + public var description: String { + toString() + } +} diff --git a/Sources/AndroidBluetooth/AdvertiseSettings+Builder.swift b/Sources/AndroidBluetooth/AdvertiseSettings+Builder.swift new file mode 100644 index 0000000..4169997 --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertiseSettings+Builder.swift @@ -0,0 +1,29 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension AdvertiseSettings { + @JavaClass("android.bluetooth.le.AdvertiseSettings$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setAdvertiseMode(_ arg0: Int32) -> AdvertiseSettings.Builder! + + @JavaMethod + open func setTxPowerLevel(_ arg0: Int32) -> AdvertiseSettings.Builder! + + @JavaMethod + open func setConnectable(_ arg0: Bool) -> AdvertiseSettings.Builder! + + @JavaMethod + open func setDiscoverable(_ arg0: Bool) -> AdvertiseSettings.Builder! + + @JavaMethod + open func setTimeout(_ arg0: Int32) -> AdvertiseSettings.Builder! + + @JavaMethod + open func build() -> AdvertiseSettings! + } +} diff --git a/Sources/AndroidBluetooth/AdvertiseSettings.swift b/Sources/AndroidBluetooth/AdvertiseSettings.swift new file mode 100644 index 0000000..a3e5023 --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertiseSettings.swift @@ -0,0 +1,62 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.AdvertiseSettings", implements: Parcelable.self) +open class AdvertiseSettings: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func isConnectable() -> Bool + + @JavaMethod + open func isDiscoverable() -> Bool + + @JavaMethod + open func getTxPowerLevel() -> Int32 + + @JavaMethod + open func getMode() -> Int32 + + @JavaMethod + open func getTimeout() -> Int32 + + @JavaMethod + open override func toString() -> String +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ADVERTISE_MODE_BALANCED: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_MODE_LOW_LATENCY: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_MODE_LOW_POWER: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_TX_POWER_HIGH: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_TX_POWER_LOW: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_TX_POWER_MEDIUM: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_TX_POWER_ULTRA_LOW: Int32 + + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/AdvertisingSet.swift b/Sources/AndroidBluetooth/AdvertisingSet.swift new file mode 100644 index 0000000..f02a8ed --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertisingSet.swift @@ -0,0 +1,27 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.AdvertisingSet") +open class AdvertisingSet: JavaObject { + @JavaMethod + open func enableAdvertising(_ arg0: Bool, _ arg1: Int32, _ arg2: Int32) + + @JavaMethod + open func setAdvertisingData(_ arg0: AdvertiseData?) + + @JavaMethod + open func setScanResponseData(_ arg0: AdvertiseData?) + + @JavaMethod + open func setAdvertisingParameters(_ arg0: AdvertisingSetParameters?) + + @JavaMethod + open func setPeriodicAdvertisingParameters(_ arg0: PeriodicAdvertisingParameters?) + + @JavaMethod + open func setPeriodicAdvertisingData(_ arg0: AdvertiseData?) + + @JavaMethod + open func setPeriodicAdvertisingEnabled(_ arg0: Bool) +} diff --git a/Sources/AndroidBluetooth/AdvertisingSetCallback.swift b/Sources/AndroidBluetooth/AdvertisingSetCallback.swift new file mode 100644 index 0000000..3b579c3 --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertisingSetCallback.swift @@ -0,0 +1,55 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.AdvertisingSetCallback") +open class AdvertisingSetCallback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func onPeriodicAdvertisingParametersUpdated(_ arg0: AdvertisingSet?, _ arg1: Int32) + + @JavaMethod + open func onAdvertisingSetStarted(_ arg0: AdvertisingSet?, _ arg1: Int32, _ arg2: Int32) + + @JavaMethod + open func onAdvertisingSetStopped(_ arg0: AdvertisingSet?) + + @JavaMethod + open func onAdvertisingEnabled(_ arg0: AdvertisingSet?, _ arg1: Bool, _ arg2: Int32) + + @JavaMethod + open func onAdvertisingDataSet(_ arg0: AdvertisingSet?, _ arg1: Int32) + + @JavaMethod + open func onScanResponseDataSet(_ arg0: AdvertisingSet?, _ arg1: Int32) + + @JavaMethod + open func onAdvertisingParametersUpdated(_ arg0: AdvertisingSet?, _ arg1: Int32, _ arg2: Int32) + + @JavaMethod + open func onPeriodicAdvertisingDataSet(_ arg0: AdvertisingSet?, _ arg1: Int32) + + @JavaMethod + open func onPeriodicAdvertisingEnabled(_ arg0: AdvertisingSet?, _ arg1: Bool, _ arg2: Int32) +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_ALREADY_STARTED: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_DATA_TOO_LARGE: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_FEATURE_UNSUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_INTERNAL_ERROR: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_FAILED_TOO_MANY_ADVERTISERS: Int32 + + @JavaStaticField(isFinal: true) + public var ADVERTISE_SUCCESS: Int32 +} diff --git a/Sources/AndroidBluetooth/AdvertisingSetParameters+Builder.swift b/Sources/AndroidBluetooth/AdvertisingSetParameters+Builder.swift new file mode 100644 index 0000000..e6fc530 --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertisingSetParameters+Builder.swift @@ -0,0 +1,44 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension AdvertisingSetParameters { + @JavaClass("android.bluetooth.le.AdvertisingSetParameters$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setTxPowerLevel(_ arg0: Int32) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setConnectable(_ arg0: Bool) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setDiscoverable(_ arg0: Bool) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setScannable(_ arg0: Bool) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setLegacyMode(_ arg0: Bool) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setAnonymous(_ arg0: Bool) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setIncludeTxPower(_ arg0: Bool) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setPrimaryPhy(_ arg0: Int32) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setSecondaryPhy(_ arg0: Int32) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func setInterval(_ arg0: Int32) -> AdvertisingSetParameters.Builder! + + @JavaMethod + open func build() -> AdvertisingSetParameters! + } +} diff --git a/Sources/AndroidBluetooth/AdvertisingSetParameters.swift b/Sources/AndroidBluetooth/AdvertisingSetParameters.swift new file mode 100644 index 0000000..3fe8cb3 --- /dev/null +++ b/Sources/AndroidBluetooth/AdvertisingSetParameters.swift @@ -0,0 +1,89 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.AdvertisingSetParameters", implements: Parcelable.self) +open class AdvertisingSetParameters: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func isConnectable() -> Bool + + @JavaMethod + open func isDiscoverable() -> Bool + + @JavaMethod + open func isScannable() -> Bool + + @JavaMethod + open func isLegacy() -> Bool + + @JavaMethod + open func isAnonymous() -> Bool + + @JavaMethod + open func includeTxPower() -> Bool + + @JavaMethod + open func getPrimaryPhy() -> Int32 + + @JavaMethod + open func getSecondaryPhy() -> Int32 + + @JavaMethod + open func getInterval() -> Int32 + + @JavaMethod + open func getTxPowerLevel() -> Int32 + + @JavaMethod + open override func toString() -> String +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var INTERVAL_HIGH: Int32 + + @JavaStaticField(isFinal: true) + public var INTERVAL_LOW: Int32 + + @JavaStaticField(isFinal: true) + public var INTERVAL_MAX: Int32 + + @JavaStaticField(isFinal: true) + public var INTERVAL_MEDIUM: Int32 + + @JavaStaticField(isFinal: true) + public var INTERVAL_MIN: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_HIGH: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_LOW: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_MAX: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_MEDIUM: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_MIN: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_ULTRA_LOW: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothA2dp.swift b/Sources/AndroidBluetooth/BluetoothA2dp.swift index 7cc344c..562ddbc 100644 --- a/Sources/AndroidBluetooth/BluetoothA2dp.swift +++ b/Sources/AndroidBluetooth/BluetoothA2dp.swift @@ -1,230 +1,89 @@ -// -// BluetoothA2dp.swift -// Android -// -// Created by Marco Estrella on 6/7/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth { - - typealias A2dp = AndroidBluetoothA2dp -} +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime -/** - * This class provides the public APIs to control the Bluetooth A2DP profile. - * - * BluetoothA2dp is a proxy object for controlling the Bluetooth A2DP Service via IPC. Use - * BluetoothAdapter.getProfileProxy(Context, BluetoothProfile.ServiceListener, int) to get the BluetoothA2dp proxy object. - * - * Android only supports one connected Bluetooth A2dp device at a time. Each method is protected with its appropriate permission. - */ -public final class AndroidBluetoothA2dp: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} +@JavaClass("android.bluetooth.BluetoothA2dp", implements: BluetoothProfile.self) +open class BluetoothA2dp: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 -// MARK: - Constants - -internal extension AndroidBluetoothA2dp { - - static var ACTION_CONNECTION_STATE_CHANGED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_CONNECTION_STATE_CHANGED", - fieldType: "I", - fieldCache: &JNICache.FieldID.ACTION_CONNECTION_STATE_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - static var ACTION_PLAYING_STATE_CHANGED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_PLAYING_STATE_CHANGED", - fieldType: "I", - fieldCache: &JNICache.FieldID.ACTION_PLAYING_STATE_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - static var STATE_NOT_PLAYING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_NOT_PLAYING", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_NOT_PLAYING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - static var STATE_PLAYING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_PLAYING", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_PLAYING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaMethod + open func isA2dpPlaying(_ arg0: BluetoothDevice?) -> Bool -// MARK: - Methods - -public extension AndroidBluetoothA2dp { - - /** - * Get connected devices for this specific profile. - */ - func getConnectedDevices() -> List? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getConnectedDevices", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getConnectedDevices, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return ListForward(javaObject: __return) - } - - /** - * Get the current connection state of the profile. - */ - func getConnectionState(device: Android.Bluetooth.Device) -> Int { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals) - ] - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getConnectionState", - methodSig: "(Landroid/bluetooth/BluetoothDevice;)I", - methodCache: &JNICache.MethodID.getConnectionState, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get a list of devices that match any of the given connection states. - */ - func getDevicesMatchingConnectionStates(states: [Int]) -> List? { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: states, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDevicesMatchingConnectionStates", - methodSig: "([I)Ljava/util/List;", - methodCache: &JNICache.MethodID.getDevicesMatchingConnectionStates, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return ListForward(javaObject: __return) - } - - /** - * Check if A2DP profile is streaming music. - */ - func isA2dpPlaying(device: Android.Bluetooth.Device) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isA2dpPlaying", - methodSig: "(Landroid/bluetooth/BluetoothDevice;)Z", - methodCache: &JNICache.MethodID.isA2dpPlaying, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} + @JavaMethod + open func getConnectedDevices() -> List! -// MARK: - JNI - -private extension AndroidBluetoothA2dp { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/BluetoothA2dp" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var ACTION_CONNECTION_STATE_CHANGED: jfieldID? - static var ACTION_PLAYING_STATE_CHANGED: jfieldID? - static var STATE_NOT_PLAYING: jfieldID? - static var STATE_PLAYING: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var getConnectedDevices: jmethodID? - static var getConnectionState: jmethodID? - static var getDevicesMatchingConnectionStates: jmethodID? - static var isA2dpPlaying: jmethodID? - } - } + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open func getSupportedCodecTypes() -> JavaCollection! + + @JavaMethod + open override func finalize() } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_PLAYING_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var STATE_NOT_PLAYING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_PLAYING: Int32 + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothAdapter+LeScanCallback.swift b/Sources/AndroidBluetooth/BluetoothAdapter+LeScanCallback.swift new file mode 100644 index 0000000..9134eac --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothAdapter+LeScanCallback.swift @@ -0,0 +1,11 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothAdapter { + @JavaInterface("android.bluetooth.BluetoothAdapter$LeScanCallback") + public struct LeScanCallback { + @JavaMethod + public func onLeScan(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: [Int8]) + } +} diff --git a/Sources/AndroidBluetooth/BluetoothAdapter.swift b/Sources/AndroidBluetooth/BluetoothAdapter.swift index ed0058c..63a3ca9 100644 --- a/Sources/AndroidBluetooth/BluetoothAdapter.swift +++ b/Sources/AndroidBluetooth/BluetoothAdapter.swift @@ -1,1325 +1,224 @@ -// -// AndroidBluetoothAdapter.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth { - - typealias Adapter = AndroidBluetoothAdapter -} +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidContent +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaTime +import JavaUtil -public extension Android.Bluetooth.Adapter { - - typealias Action = AndroidBluetoothAdapterAction - typealias Extra = AndroidBluetoothAdapterExtra -} +@JavaClass("android.bluetooth.BluetoothAdapter") +open class BluetoothAdapter: JavaObject { + @JavaMethod + open func getRemoteDevice(_ arg0: [Int8]) -> BluetoothDevice! -public final class AndroidBluetoothAdapter: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - /** - * Get a handle to the default local Bluetooth adapter. - * - * Currently Android only supports one Bluetooth adapter, but the API - * could be extended to support more. This will always return the default - * adapter. - * - * - Returns: The default local adapter, or null if Bluetooth is not supported on this hardware platform. - */ - public static var `default`: Android.Bluetooth.Adapter? { - - @inline(__always) - get { return getDefaultAdapter() } - } - - internal func getBluetoothLeAdvertiser() -> JavaObject? { - assertionFailure("Not implemented") - // TODO - return nil - } - - public var lowEnergyScanner: Android.Bluetooth.LE.Scanner? { - - @inline(__always) - get { return getBluetoothLeScanner() } - } -} + @JavaMethod + open func getRemoteDevice(_ arg0: String) -> BluetoothDevice! -// MARK: - Methods - -public extension Android.Bluetooth.Adapter { - - /** - * Cancel the current device discovery process. - */ - func cancelDiscovery() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "cancelDiscovery", - methodSig: "()Z", - methodCache: &JNICache.MethodID.cancelDiscovery, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Validate a String Bluetooth address, such as "00:43:A8:23:10:F0" - * - * Alphabetic characters must be uppercase to be valid. - */ - class func checkBluetoothAddress() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallStaticBooleanMethod(className: JNICache.className, - classCache: &JNICache.jniClass, - methodName: "checkBluetoothAddress", - methodSig: "()Z", - methodCache: &JNICache.MethodID.checkBluetoothAddress, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Close the connection of the profile proxy to the Service. - */ - func closeProfileProxy(profile: Int, proxy: JavaObject) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(profile) ), - JNIType.toJava( value: proxy, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "closeProfileProxy", - methodSig: "(ILandroid/bluetooth/BluetoothProfile;)V", - methodCache: &JNICache.MethodID.closeProfileProxy, - args: &__args, - locals: &__locals) - } - - /** - * Turn off the local Bluetooth adapter—do not use without explicit user action to turn off Bluetooth. - */ - func disable() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "disable", - methodSig: "()Z", - methodCache: &JNICache.MethodID.disable, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Turn on the local Bluetooth adapter—do not use without explicit user action to turn on Bluetooth. - */ - func enable() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "enable", - methodSig: "()Z", - methodCache: &JNICache.MethodID.enable, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Returns the hardware address of the local Bluetooth adapter. - */ - func getAddress() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getAddress", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getAddress, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return String(javaObject: __return) - } - - /** - * Returns a BluetoothLeAdvertiser object for Bluetooth LE Advertising operations. - */ - func getBluetoothLeAdvertiser() -> Android.Bluetooth.LE.Advertiser { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getBluetoothLeAdvertiser", - methodSig: "()Landroid/bluetooth/le/BluetoothLeAdvertiser;", - methodCache: &JNICache.MethodID.getBluetoothLeAdvertiser, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.LE.Advertiser(javaObject: __return) - } - - /** - * Returns a BluetoothLeScanner object for Bluetooth LE scan operations. - */ - func getBluetoothLeScanner() -> Android.Bluetooth.LE.Scanner? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getBluetoothLeScanner", - methodSig: "()Landroid/bluetooth/le/BluetoothLeScanner;", - methodCache: &JNICache.MethodID.getBluetoothLeScanner, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? Android.Bluetooth.LE.Scanner( javaObject: __return ) : nil - } - - /** - * Returns a BluetoothLeScanner object for Bluetooth LE scan operations. - */ - func getBondedDevices() -> JavaSet { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getBondedDevices", - methodSig: "()Ljava/util/Set;", - methodCache: &JNICache.MethodID.getBondedDevices, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JavaSetForward(javaObject: __return) - } - - /** - * Get a handle to the default local Bluetooth adapter. - * - * Currently Android only supports one Bluetooth adapter, but the API - * could be extended to support more. This will always return the default - * adapter. - * - * - Returns: The default local adapter, or null if Bluetooth is not supported on this hardware platform. - */ - static func getDefaultAdapter() -> Android.Bluetooth.Adapter? { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallStaticObjectMethod(className: JNICache.className, - classCache: &JNICache.jniClass, - methodName: "getDefaultAdapter", - methodSig: JNIMethodSignature( - argumentTypes: [], - returnType: .object(JNICache.classSignature)).rawValue, - methodCache: &JNICache.MethodID.getDefaultAdapter, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? Android.Bluetooth.Adapter( javaObject: __return ) : nil - } - - - /** - * Return the maximum LE advertising data length in bytes, if LE Extended Advertising feature is supported, 0 otherwise. - */ - func getLeMaximumAdvertisingDataLength() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getLeMaximumAdvertisingDataLength", - methodSig: "()I", - methodCache: &JNICache.MethodID.getLeMaximumAdvertisingDataLength, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get the friendly Bluetooth name of the local Bluetooth adapter. - */ - func getName() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getName", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getName, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return String(javaObject: __return) - } - - /** - * Get the current connection state of a profile. - */ - func getProfileConnectionState(profile: Int) -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = jvalue(i: jint(profile)) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getProfileConnectionState", - methodSig: "(I)I", - methodCache: &JNICache.MethodID.getProfileConnectionState, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get the profile proxy object associated with the profile. - */ - func getProfileProxy(context: Android.Content.Context, listener: JavaObject, profile: Int) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: context, locals: &__locals ), - JNIType.toJava( value: listener, locals: &__locals ), - jvalue(i: jint(profile)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "getProfileProxy", - methodSig: "(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;I)I", - methodCache: &JNICache.MethodID.getProfileProxy, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Get a BluetoothDevice object for the given Bluetooth hardware address. - */ - func getRemoteDevice(address: [Int8]) -> Android.Bluetooth.Device { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: address, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getRemoteDevice", - methodSig: "([B)I", - methodCache: &JNICache.MethodID.getRemoteDevice, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.Device(javaObject: __return) - } - - /** - * Get a BluetoothDevice object for the given Bluetooth hardware address. - */ - func getRemoteDevice(address: String) -> Android.Bluetooth.Device { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: address, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getRemoteDevice", - methodSig: "(Ljava/lang/String;)I", - methodCache: &JNICache.MethodID.getRemoteDevice2, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.Device(javaObject: __return) - } - - /** - * Get the current Bluetooth scan mode of the local Bluetooth adapter. - */ - func getScanMode() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getScanMode", - methodSig: "()I", - methodCache: &JNICache.MethodID.getScanMode, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get the current state of the local Bluetooth adapter. - */ - func getState() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getState", - methodSig: "()I", - methodCache: &JNICache.MethodID.getState, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Return true if the local Bluetooth adapter is currently in the device discovery process. - */ - func isDiscovering() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isDiscovering", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isDiscovering, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if Bluetooth is currently enabled and ready for use. - */ - func isEnabled() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isEnabled", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isEnabled, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if LE 2M PHY feature is supported. - */ - func isLe2MPhySupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isLe2MPhySupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isLe2MPhySupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if LE Coded PHY feature is supported. - */ - func isLeCodedPhySupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isLeCodedPhySupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isLeCodedPhySupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if LE Extended Advertising feature is supported. - */ - func isLeExtendedAdvertisingSupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isLeExtendedAdvertisingSupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isLeExtendedAdvertisingSupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if LE Periodic Advertising feature is supported. - */ - func isLePeriodicAdvertisingSupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isLePeriodicAdvertisingSupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isLePeriodicAdvertisingSupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if the multi advertisement is supported by the chipset. - */ - func isMultipleAdvertisementSupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isMultipleAdvertisementSupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isMultipleAdvertisementSupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if offloaded filters are supported. - */ - func isOffloadedFilteringSupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isOffloadedFilteringSupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isOffloadedFilteringSupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return true if offloaded scan batching is supported. - */ - func isOffloadedScanBatchingSupported() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isOffloadedScanBatchingSupported", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isOffloadedScanBatchingSupported, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Create a listening, insecure RFCOMM Bluetooth socket with Service Record. - */ - func listenUsingInsecureRfcommWithServiceRecord(name: String, uuid: java_util.UUID) -> Android.Bluetooth.ServerSocket { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: name, locals: &__locals), - JNIType.toJava(value: uuid, locals: &__locals), - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "listenUsingInsecureRfcommWithServiceRecord", - methodSig: "(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;", - methodCache: &JNICache.MethodID.listenUsingInsecureRfcommWithServiceRecord, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.ServerSocket(javaObject: __return) - } - - /** - * Create a listening, secure RFCOMM Bluetooth socket with Service Record. - */ - func listenUsingRfcommWithServiceRecord(name: String, uuid: java_util.UUID) -> Android.Bluetooth.ServerSocket { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: name, locals: &__locals), - JNIType.toJava(value: uuid, locals: &__locals), - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "listenUsingRfcommWithServiceRecord", - methodSig: "(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;", - methodCache: &JNICache.MethodID.listenUsingRfcommWithServiceRecord, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.ServerSocket(javaObject: __return) - } - - /** - * Set the friendly Bluetooth name of the local Bluetooth adapter. - */ - func setName(name: String) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: name, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setName", - methodSig: "(Ljava/lang/String;)Z", - methodCache: &JNICache.MethodID.setName, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Start the remote device discovery process. - */ - func startDiscovery() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "startDiscovery", - methodSig: "()Z", - methodCache: &JNICache.MethodID.startDiscovery, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} + @JavaMethod + open func getRemoteLeDevice(_ arg0: String, _ arg1: Int32) -> BluetoothDevice! -// MARK: - Constants - -internal extension Android.Bluetooth.Adapter { - - /// Intent used to broadcast the change in connection state of the local Bluetooth adapter to a profile of the remote device. - static var ACTION_CONNECTION_STATE_CHANGED: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_CONNECTION_STATE_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_CONNECTION_STATE_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Broadcast Action: The local Bluetooth adapter has finished the device discovery process. - static var ACTION_DISCOVERY_FINISHED: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_DISCOVERY_FINISHED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_DISCOVERY_FINISHED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Broadcast Action: The local Bluetooth adapter has started the remote device discovery process. - static var ACTION_DISCOVERY_STARTED: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_DISCOVERY_STARTED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_DISCOVERY_STARTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Broadcast Action: The local Bluetooth adapter has changed its friendly Bluetooth name. - static var ACTION_LOCAL_NAME_CHANGED: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_LOCAL_NAME_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_LOCAL_NAME_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Activity Action: Show a system activity that requests discoverable mode. - static var ACTION_REQUEST_DISCOVERABLE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_REQUEST_DISCOVERABLE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_REQUEST_DISCOVERABLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Activity Action: Show a system activity that allows the user to turn on Bluetooth. - static var ACTION_REQUEST_ENABLE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_REQUEST_ENABLE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_REQUEST_ENABLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Broadcast Action: Indicates the Bluetooth scan mode of the local Adapter has changed. - static var ACTION_SCAN_MODE_CHANGED: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_SCAN_MODE_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_SCAN_MODE_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Broadcast Action: The state of the local Bluetooth adapter has been changed. - static var ACTION_STATE_CHANGED: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ACTION_STATE_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_STATE_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Sentinel error value for this class. - static var ERROR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ERROR", - fieldType: "I", - fieldCache: &JNICache.FieldID.ERROR, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Extra used by ACTION_CONNECTION_STATE_CHANGED This extra represents the current connection state. - static var EXTRA_CONNECTION_STATE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_CONNECTION_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_CONNECTION_STATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Used as an optional int extra field in ACTION_REQUEST_DISCOVERABLE intents to request a specific duration for discoverability in seconds. - static var EXTRA_DISCOVERABLE_DURATION: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_DISCOVERABLE_DURATION", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_DISCOVERABLE_DURATION, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Used as a String extra field in ACTION_LOCAL_NAME_CHANGED intents to request the local Bluetooth name. - static var EXTRA_LOCAL_NAME: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_LOCAL_NAME", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_LOCAL_NAME, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Extra used by ACTION_CONNECTION_STATE_CHANGED This extra represents the previous connection state. - static var EXTRA_PREVIOUS_CONNECTION_STATE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_PREVIOUS_CONNECTION_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_PREVIOUS_CONNECTION_STATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents to request the previous scan mode. - static var EXTRA_PREVIOUS_SCAN_MODE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_PREVIOUS_SCAN_MODE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_PREVIOUS_SCAN_MODE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Used as an int extra field in ACTION_STATE_CHANGED intents to request the previous power state. - static var EXTRA_PREVIOUS_STATE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_PREVIOUS_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_PREVIOUS_STATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents to request the current scan mode. - static var EXTRA_SCAN_MODE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_SCAN_MODE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_SCAN_MODE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Used as an int extra field in ACTION_STATE_CHANGED intents to request the current power state. - static var EXTRA_STATE: String { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "EXTRA_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_STATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - defer { JNI.DeleteLocalRef(__value) } - - return String(javaObject: __value) - } - } - - /// Indicates that inquiry scan is disabled, but page scan is enabled on the local Bluetooth adapter. - static var SCAN_MODE_CONNECTABLE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_CONNECTABLE", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_MODE_CONNECTABLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates that both inquiry scan and page scan are enabled on the local Bluetooth adapter. - static var SCAN_MODE_CONNECTABLE_DISCOVERABLE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_CONNECTABLE_DISCOVERABLE", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_MODE_CONNECTABLE_DISCOVERABLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates that both inquiry scan and page scan are disabled on the local Bluetooth adapter. - static var SCAN_MODE_NONE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_NONE", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_MODE_NONE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// The profile is in connected state - static var STATE_CONNECTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_CONNECTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_CONNECTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// The profile is in connecting state - static var STATE_CONNECTING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_CONNECTING", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_CONNECTING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// The profile is in disconnected state - static var STATE_DISCONNECTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_DISCONNECTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_DISCONNECTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// The profile is in disconnecting state - static var STATE_DISCONNECTING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_DISCONNECTING", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_DISCONNECTING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates the local Bluetooth adapter is off. - static var STATE_OFF: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_OFF", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_OFF, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates the local Bluetooth adapter is on, and ready for use. - static var STATE_ON: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_ON", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_ON, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates the local Bluetooth adapter is turning off. - static var STATE_TURNING_OFF: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_TURNING_OFF", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_TURNING_OFF, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates the local Bluetooth adapter is turning on. - static var STATE_TURNING_ON: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_TURNING_ON", - fieldType: "I", - fieldCache: &JNICache.FieldID.STATE_TURNING_ON, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaMethod + open func disable() -> Bool + + @JavaMethod + open func getScanMode() -> Int32 + + @JavaMethod + open func startDiscovery() -> Bool + + @JavaMethod + open func cancelDiscovery() -> Bool + + @JavaMethod + open func isDiscovering() -> Bool + + @JavaMethod + open func isLe2MPhySupported() -> Bool + + @JavaMethod + open func isLeAudioSupported() -> Int32 + + @JavaMethod + open func getBondedDevices() -> JavaSet! + + @JavaMethod + open func getProfileProxy(_ arg0: Context?, _ arg1: BluetoothProfile.ServiceListener?, _ arg2: Int32) -> Bool + + @JavaMethod + open func closeProfileProxy(_ arg0: Int32, _ arg1: BluetoothProfile?) + + @JavaMethod + open func startLeScan(_ arg0: [UUID?], _ arg1: BluetoothAdapter.LeScanCallback?) -> Bool + + @JavaMethod + open func startLeScan(_ arg0: BluetoothAdapter.LeScanCallback?) -> Bool + + @JavaMethod + open func stopLeScan(_ arg0: BluetoothAdapter.LeScanCallback?) + + @JavaMethod + open func getBluetoothLeAdvertiser() -> BluetoothLeAdvertiser! + + @JavaMethod + open func getBluetoothLeScanner() -> BluetoothLeScanner! + + @JavaMethod + open func getDiscoverableTimeout() -> Duration! + + @JavaMethod + open func isMultipleAdvertisementSupported() -> Bool + + @JavaMethod + open func isOffloadedFilteringSupported() -> Bool + + @JavaMethod + open func isOffloadedScanBatchingSupported() -> Bool + + @JavaMethod + open func isLeCodedPhySupported() -> Bool + + @JavaMethod + open func isLeExtendedAdvertisingSupported() -> Bool + + @JavaMethod + open func isLePeriodicAdvertisingSupported() -> Bool + + @JavaMethod + open func isLeAudioBroadcastSourceSupported() -> Int32 + + @JavaMethod + open func getLeMaximumAdvertisingDataLength() -> Int32 + + @JavaMethod + open func getMaxConnectedAudioDevices() -> Int32 + + @JavaMethod + open func getProfileConnectionState(_ arg0: Int32) -> Int32 + + @JavaMethod + open func listenUsingRfcommWithServiceRecord(_ arg0: String, _ arg1: UUID?) throws -> BluetoothServerSocket! + + @JavaMethod + open func listenUsingL2capChannel() throws -> BluetoothServerSocket! + + @JavaMethod + open func listenUsingInsecureL2capChannel() throws -> BluetoothServerSocket! + + @JavaMethod + open func isLeAudioBroadcastAssistantSupported() -> Int32 + + @JavaMethod + open func listenUsingInsecureRfcommWithServiceRecord(_ arg0: String, _ arg1: UUID?) throws -> BluetoothServerSocket! -// Mark: Supporting Types - -public extension Android.Bluetooth.Adapter { - - /// Adapter Action - struct AndroidBluetoothAdapterAction: RawRepresentable { - - public let rawValue: String - - public init(rawValue: String) { - self.rawValue = rawValue - } - - public static let connectionStateChanged = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_CONNECTION_STATE_CHANGED) - - public static let discoveryFinished = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_DISCOVERY_FINISHED) - - public static let discoveryStarted = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_DISCOVERY_STARTED) - - public static let localNameChanged = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_LOCAL_NAME_CHANGED) - - public static let requestDiscoverable = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_REQUEST_DISCOVERABLE) - - public static let requestEnable = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_REQUEST_ENABLE) - - public static let scanModeChanged = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_SCAN_MODE_CHANGED) - - public static let stateChanged = Android.Bluetooth.Adapter.Action(rawValue: Android.Bluetooth.Adapter.ACTION_STATE_CHANGED) - } - - /// Adapter Action - struct AndroidBluetoothAdapterExtra: RawRepresentable { - - public let rawValue: String - - public init(rawValue: String) { - self.rawValue = rawValue - } - - public static let connectionState = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_CONNECTION_STATE) - - public static let discoverableDuration = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_DISCOVERABLE_DURATION) - - public static let localName = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_LOCAL_NAME) - - public static let previousConnectionState = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_PREVIOUS_CONNECTION_STATE) - - public static let previousScanMode = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_PREVIOUS_SCAN_MODE) - - public static let previousState = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_PREVIOUS_STATE) - - public static let scanMode = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_SCAN_MODE) - - public static let state = Android.Bluetooth.Adapter.Extra(rawValue: Android.Bluetooth.Adapter.EXTRA_STATE) - } + @JavaMethod + open func getName() -> String + + @JavaMethod + open override func finalize() throws + + @JavaMethod + open func isEnabled() -> Bool + + @JavaMethod + open func setName(_ arg0: String) -> Bool + + @JavaMethod + open func getState() -> Int32 + + @JavaMethod + open func getAddress() -> String + + @JavaMethod + open func enable() -> Bool } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_DISCOVERY_FINISHED: String + + @JavaStaticField(isFinal: true) + public var ACTION_DISCOVERY_STARTED: String + + @JavaStaticField(isFinal: true) + public var ACTION_LOCAL_NAME_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_REQUEST_DISCOVERABLE: String + + @JavaStaticField(isFinal: true) + public var ACTION_REQUEST_ENABLE: String + + @JavaStaticField(isFinal: true) + public var ACTION_SCAN_MODE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ERROR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_CONNECTION_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_DISCOVERABLE_DURATION: String + + @JavaStaticField(isFinal: true) + public var EXTRA_LOCAL_NAME: String + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_CONNECTION_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_SCAN_MODE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_SCAN_MODE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_CONNECTABLE: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_CONNECTABLE_DISCOVERABLE: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_OFF: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_ON: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_TURNING_OFF: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_TURNING_ON: Int32 + + @JavaStaticMethod + public func getDefaultAdapter() -> BluetoothAdapter! -// MARK: - JNICache - -internal extension Android.Bluetooth.Adapter { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothAdapter"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var ACTION_CONNECTION_STATE_CHANGED: jfieldID? - static var ACTION_DISCOVERY_FINISHED: jfieldID? - static var ACTION_DISCOVERY_STARTED: jfieldID? - static var ACTION_LOCAL_NAME_CHANGED: jfieldID? - static var ACTION_REQUEST_DISCOVERABLE: jfieldID? - static var ACTION_REQUEST_ENABLE: jfieldID? - static var ACTION_SCAN_MODE_CHANGED: jfieldID? - static var ACTION_STATE_CHANGED: jfieldID? - static var ERROR: jfieldID? - static var EXTRA_CONNECTION_STATE: jfieldID? - static var EXTRA_DISCOVERABLE_DURATION: jfieldID? - static var EXTRA_LOCAL_NAME: jfieldID? - static var EXTRA_PREVIOUS_CONNECTION_STATE: jfieldID? - static var EXTRA_PREVIOUS_SCAN_MODE: jfieldID? - static var EXTRA_PREVIOUS_STATE: jfieldID? - static var EXTRA_SCAN_MODE: jfieldID? - static var EXTRA_STATE: jfieldID? - static var SCAN_MODE_CONNECTABLE: jfieldID? - static var SCAN_MODE_CONNECTABLE_DISCOVERABLE: jfieldID? - static var SCAN_MODE_NONE: jfieldID? - static var STATE_CONNECTED: jfieldID? - static var STATE_CONNECTING: jfieldID? - static var STATE_DISCONNECTED: jfieldID? - static var STATE_DISCONNECTING: jfieldID? - static var STATE_OFF: jfieldID? - static var STATE_ON: jfieldID? - static var STATE_TURNING_OFF: jfieldID? - static var STATE_TURNING_ON: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var cancelDiscovery: jmethodID? - static var checkBluetoothAddress: jmethodID? - static var closeProfileProxy: jmethodID? - static var disable: jmethodID? - static var enable: jmethodID? - static var getAddress: jmethodID? - static var getBluetoothLeAdvertiser: jmethodID? - static var getBluetoothLeScanner: jmethodID? - static var getBondedDevices: jmethodID? - static var getDefaultAdapter: jmethodID? - static var getLeMaximumAdvertisingDataLength: jmethodID? - static var getName: jmethodID? - static var getProfileConnectionState: jmethodID? - static var getProfileProxy: jmethodID? - static var getRemoteDevice: jmethodID? - static var getRemoteDevice2: jmethodID? - static var getScanMode: jmethodID? - static var getState: jmethodID? - static var isDiscovering: jmethodID? - static var isEnabled: jmethodID? - static var isLe2MPhySupported: jmethodID? - static var isLeCodedPhySupported: jmethodID? - static var isLeExtendedAdvertisingSupported: jmethodID? - static var isLePeriodicAdvertisingSupported: jmethodID? - static var isMultipleAdvertisementSupported: jmethodID? - static var isOffloadedFilteringSupported: jmethodID? - static var isOffloadedScanBatchingSupported: jmethodID? - static var listenUsingInsecureRfcommWithServiceRecord: jmethodID? - static var listenUsingRfcommWithServiceRecord: jmethodID? - static var setName: jmethodID? - static var startDiscovery: jmethodID? - static var startLeScan: jmethodID? //deprecated api 21 - static var startLeScan2: jmethodID? //deprecated api 21 - static var startLeScan3: jmethodID? //deprecated api 21 - static var stopLeScan: jmethodID? //deprecated api 21 - } - } + @JavaStaticMethod + public func checkBluetoothAddress(_ arg0: String) -> Bool } diff --git a/Sources/AndroidBluetooth/BluetoothAdapterLeScanCallback.swift b/Sources/AndroidBluetooth/BluetoothAdapterLeScanCallback.swift deleted file mode 100644 index dda6eed..0000000 --- a/Sources/AndroidBluetooth/BluetoothAdapterLeScanCallback.swift +++ /dev/null @@ -1,121 +0,0 @@ -// -// BluetoothAdapterLeScanCallback.swift -// Android -// -// Created by Marco Estrella on 6/7/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth.Adapter { - - typealias LeScanCallback = AndroidBluetoothAdapterLeScanCallback -} - -/** - * Callback interface used to deliver LE scan results. - */ -public protocol AndroidBluetoothAdapterLeScanCallback: JavaProtocol { - - func onLeScan(device: Android.Bluetooth.Device, rssi: Int, scanRecord: [Int8]) -} - -// MARK: - Local Listener - -public extension AndroidBluetoothAdapterLeScanCallback { - - func localJavaObject( _ locals: UnsafeMutablePointer<[jobject]> ) -> jobject? { - - return AndroidBluetoothAdapterLeScanCallbackLocal( owned: self, proto: self ).localJavaObject( locals ) - } -} - -internal class AndroidBluetoothAdapterLeScanCallbackLocal: JNILocalProxy { - - fileprivate static let _proxyClass: jclass = { - - var natives: [JNINativeMethod] = [ - JNICache.Method.onLeScan.method, - .finalize - ] - - let clazz = JNI.FindClass( proxyClassName() ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - override open class func proxyClassName() -> String { return JNICache.className } - - override open class func proxyClass() -> jclass? { return _proxyClass } -} - -// MARK: - JNI - -private extension AndroidBluetoothAdapterLeScanCallbackLocal { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.className(["SwiftBluetoothAdapter$LeScanCallback"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method cache - fileprivate enum Method { - - internal enum onLeScan: JNINativeMethodEntry { - - static let name = "__on_le_scan" - - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(JNIClassName(rawValue: "android/bluetooth/BluetoothDevice")!), - .int, - .array(.byte) - ], returnType: .void) - - static let thunk: AndroidBluetoothAdapterLeScanCallback_OnLeScan_Type = AndroidBluetoothAdapterLeScanCallback_onLeScan - } - } - } -} - -// MARK: - Private Methods - -private typealias AndroidBluetoothAdapterLeScanCallback_OnLeScan_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jobject?) -> () - -private func AndroidBluetoothAdapterLeScanCallback_onLeScan( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ deviceParam: jobject?, - _ rssiParam: jint, - _ scanRecordParam: jobject? ) -> () { - - let device = Android.Bluetooth.Device(javaObject: deviceParam) - - let rssi = Int(rssiParam) - - let scanRecord = JNIType.toSwift(type: [Int8].self, from: scanRecordParam) - - AndroidBluetoothAdapterLeScanCallbackLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onLeScan(device: device, rssi: rssi, scanRecord: scanRecord!) -} diff --git a/Sources/AndroidBluetooth/BluetoothClass+Device+Major.swift b/Sources/AndroidBluetooth/BluetoothClass+Device+Major.swift new file mode 100644 index 0000000..61b882d --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothClass+Device+Major.swift @@ -0,0 +1,45 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothClass.Device { + @JavaClass("android.bluetooth.BluetoothClass$Device$Major") + open class Major: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + } +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var IMAGING: Int32 + + @JavaStaticField(isFinal: true) + public var MISC: Int32 + + @JavaStaticField(isFinal: true) + public var NETWORKING: Int32 + + @JavaStaticField(isFinal: true) + public var PERIPHERAL: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE: Int32 + + @JavaStaticField(isFinal: true) + public var TOY: Int32 + + @JavaStaticField(isFinal: true) + public var UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothClass+Device.swift b/Sources/AndroidBluetooth/BluetoothClass+Device.swift new file mode 100644 index 0000000..d35f221 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothClass+Device.swift @@ -0,0 +1,174 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothClass { + @JavaClass("android.bluetooth.BluetoothClass$Device") + open class Device: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + } +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_CAMCORDER: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_CAR_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_HANDSFREE: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_HEADPHONES: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_HIFI_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_LOUDSPEAKER: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_MICROPHONE: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_PORTABLE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_SET_TOP_BOX: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_VCR: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_VIDEO_CAMERA: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_VIDEO_CONFERENCING: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_VIDEO_GAMING_TOY: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_VIDEO_MONITOR: Int32 + + @JavaStaticField(isFinal: true) + public var AUDIO_VIDEO_WEARABLE_HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_DESKTOP: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_HANDHELD_PC_PDA: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_LAPTOP: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_PALM_SIZE_PC_PDA: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var COMPUTER_WEARABLE: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_BLOOD_PRESSURE: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_DATA_DISPLAY: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_GLUCOSE: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_PULSE_OXIMETER: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_PULSE_RATE: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_THERMOMETER: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH_WEIGHING: Int32 + + @JavaStaticField(isFinal: true) + public var PERIPHERAL_KEYBOARD: Int32 + + @JavaStaticField(isFinal: true) + public var PERIPHERAL_KEYBOARD_POINTING: Int32 + + @JavaStaticField(isFinal: true) + public var PERIPHERAL_NON_KEYBOARD_NON_POINTING: Int32 + + @JavaStaticField(isFinal: true) + public var PERIPHERAL_POINTING: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE_CELLULAR: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE_CORDLESS: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE_ISDN: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE_MODEM_OR_GATEWAY: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE_SMART: Int32 + + @JavaStaticField(isFinal: true) + public var PHONE_UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var TOY_CONTROLLER: Int32 + + @JavaStaticField(isFinal: true) + public var TOY_DOLL_ACTION_FIGURE: Int32 + + @JavaStaticField(isFinal: true) + public var TOY_GAME: Int32 + + @JavaStaticField(isFinal: true) + public var TOY_ROBOT: Int32 + + @JavaStaticField(isFinal: true) + public var TOY_UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var TOY_VEHICLE: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE_GLASSES: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE_HELMET: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE_JACKET: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE_PAGER: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE_UNCATEGORIZED: Int32 + + @JavaStaticField(isFinal: true) + public var WEARABLE_WRIST_WATCH: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothClass+Service.swift b/Sources/AndroidBluetooth/BluetoothClass+Service.swift new file mode 100644 index 0000000..87fae85 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothClass+Service.swift @@ -0,0 +1,42 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothClass { + @JavaClass("android.bluetooth.BluetoothClass$Service") + open class Service: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + } +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var CAPTURE: Int32 + + @JavaStaticField(isFinal: true) + public var INFORMATION: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var LIMITED_DISCOVERABILITY: Int32 + + @JavaStaticField(isFinal: true) + public var NETWORKING: Int32 + + @JavaStaticField(isFinal: true) + public var OBJECT_TRANSFER: Int32 + + @JavaStaticField(isFinal: true) + public var POSITIONING: Int32 + + @JavaStaticField(isFinal: true) + public var RENDER: Int32 + + @JavaStaticField(isFinal: true) + public var TELEPHONY: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothClass.swift b/Sources/AndroidBluetooth/BluetoothClass.swift index a061c8b..9dc8807 100644 --- a/Sources/AndroidBluetooth/BluetoothClass.swift +++ b/Sources/AndroidBluetooth/BluetoothClass.swift @@ -1,174 +1,53 @@ -// -// BluetoothClass.swift -// Android -// -// Created by Marco Estrella on 6/6/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime -import Foundation -import java_swift -import java_util -import Android +@JavaClass("android.bluetooth.BluetoothClass", implements: Parcelable.self) +open class BluetoothClass: JavaObject { + @JavaMethod + open func describeContents() -> Int32 -public extension Android.Bluetooth { - - typealias Class = AndroidBluetoothClass -} + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) -/** - * Represents a Bluetooth class, which describes general characteristics and capabilities of a device. For example, a - * Bluetooth class will specify the general device type such as a phone, a computer, or headset, and whether - * it's capable of services such as audio or telephony. - * - * Every Bluetooth class is composed of zero or more service classes, and exactly one device class. The device class is - * further broken down into major and minor device class components. - * - * BluetoothClass is useful as a hint to roughly describe a device (for example to show an icon in the UI), but does not - * reliably describe which Bluetooth profiles or services are actually supported by a device. Accurate service discovery is - * done through SDP requests, which are automatically performed when creating an RFCOMM socket with - * BluetoothDevice.createRfcommSocketToServiceRecord(UUID) and BluetoothAdapter.listenUsingRfcommWithServiceRecord(String, UUID) - * - * Use BluetoothDevice.getBluetoothClass() to retrieve the class for a remote device. - */ -public final class AndroidBluetoothClass: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} + @JavaMethod + open func hasService(_ arg0: Int32) -> Bool -// MARK: - Methods + @JavaMethod + open func getDeviceClass() -> Int32 -public extension AndroidBluetoothClass { - - /** - * Describe the kinds of special objects contained in this Parcelable instance's marshaled representation. - */ - func describeContents() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "describeContents", - methodSig: "()I", - methodCache: &JNICache.MethodID.describeContents, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Indicates whether some other object is "equal to" this one. - */ - func equals(object: Android.Bluetooth.Class) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: object, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "equals", - methodSig: "(Landroid/bluetooth/BluetoothClass;)Z", - methodCache: &JNICache.MethodID.equals, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return the (major and minor) device class component of this BluetoothClass. - */ - func getDeviceClass() -> Android.Bluetooth.Class.Device { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getDeviceClass", - methodSig: "()I", - methodCache: &JNICache.MethodID.getDeviceClass, - args: &__args, - locals: &__locals) - return Android.Bluetooth.Class.Device(rawValue: Int(__return)) - } - - /** - * Return the major device class component of this BluetoothClass. - */ - func getMajorDeviceClass() -> Android.Bluetooth.Class.Device.Major { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getMajorDeviceClass", - methodSig: "()I", - methodCache: &JNICache.MethodID.getMajorDeviceClass, - args: &__args, - locals: &__locals) - return Android.Bluetooth.Class.Device.Major(rawValue: Int(__return)) - } - - /** - * Return true if the specified service class is supported by this BluetoothClass. - */ - func hasService(service: Android.Bluetooth.Class.Service) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(service.rawValue)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "hasService", - methodSig: "(I)Z", - methodCache: &JNICache.MethodID.hasService, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} + @JavaMethod + open func doesClassMatch(_ arg0: Int32) -> Bool + + @JavaMethod + open func getMajorDeviceClass() -> Int32 + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool -// MARK: - JNI + @JavaMethod + open override func toString() -> String -private extension Android.Bluetooth.Class { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/BluetoothClass" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var describeContents: jmethodID? - static var equals: jmethodID? - static var getDeviceClass: jmethodID? - static var getMajorDeviceClass: jmethodID? - static var hasService: jmethodID? - } - } + @JavaMethod + open override func hashCode() -> Int32 } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + @JavaStaticField(isFinal: true) + public var PROFILE_A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var PROFILE_HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var PROFILE_HID: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothClassDevice.swift b/Sources/AndroidBluetooth/BluetoothClassDevice.swift deleted file mode 100644 index e46f57a..0000000 --- a/Sources/AndroidBluetooth/BluetoothClassDevice.swift +++ /dev/null @@ -1,963 +0,0 @@ -// -// BluetoothClassDevice.swift -// Android -// -// Created by Marco Estrella on 6/6/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.Class { - - typealias Device = AndroidBluetoothClassDevice -} - -/** - * Defines all device class constants. - * - * Each BluetoothClass encodes exactly one device class, with major and minor components. - * - * The constants in BluetoothClass.Device represent a combination of major and minor device components - * (the complete device class). The constants in BluetoothClass.Device.Major represent only major device classes. - * - * See BluetoothClass.Service for service class constants. - */ -public struct AndroidBluetoothClassDevice: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let audioVideoCamcorder = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_CAMCORDER) - - public static let audioVideoCarAudio = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_CAR_AUDIO) - - public static let audioVideoHandfree = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_HANDSFREE) - - public static let audioVideoHeadphones = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_HEADPHONES) - - public static let audioVideoHifiAudio = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_HIFI_AUDIO) - - public static let audioVideoLoudSpeaker = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_LOUDSPEAKER) - - public static let audioVideoMicrophone = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_MICROPHONE) - - public static let audioVideoPortableAudio = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_PORTABLE_AUDIO) - - public static let audioVideoSetTopBox = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_SET_TOP_BOX) - - public static let audioVideoUncategorized = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_UNCATEGORIZED) - - public static let audioVideoVcr = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_VCR) - - public static let audioVideoVideocamera = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_VIDEO_CAMERA) - - public static let audioVideoVideoconferencing = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_VIDEO_CONFERENCING) - - public static let audioVideoVideodisplayAndLoudspeaker = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER) - - public static let audioVideoVideogamingToy = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_VIDEO_GAMING_TOY) - - public static let audioVideoVideomonitor = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_VIDEO_MONITOR) - - public static let audioVideoWearableHeadset = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.AUDIO_VIDEO_WEARABLE_HEADSET) - - public static let computerDesktop = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_DESKTOP) - - public static let computerHandheldPcPda = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_HANDHELD_PC_PDA) - - public static let computerLaptop = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_LAPTOP) - - public static let computerPalmSizePcPda = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_PALM_SIZE_PC_PDA) - - public static let computerServer = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_SERVER) - - public static let computerUncategorized = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_UNCATEGORIZED) - - public static let computerWearable = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.COMPUTER_WEARABLE) - - public static let health = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_BLOOD_PRESSURE) - - public static let healthBloodPressure = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_BLOOD_PRESSURE) - - public static let healthDataDisplay = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_DATA_DISPLAY) - - public static let healthGlucose = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_GLUCOSE) - - public static let healthPulseOximeter = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_PULSE_OXIMETER) - - public static let healthPulseRate = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_PULSE_RATE) - - public static let healthThermometer = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_THERMOMETER) - - public static let healthUncategorized = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_UNCATEGORIZED) - - public static let healthWeighing = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.HEALTH_WEIGHING) - - public static let phoneCellular = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.PHONE_CELLULAR) - - public static let phoneCordless = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.PHONE_CORDLESS) - - public static let phoneIsdn = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.PHONE_ISDN) - - public static let phoneModemOrGateway = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.PHONE_MODEM_OR_GATEWAY) - - public static let phoneSmart = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.PHONE_SMART) - - public static let phoneUncategorized = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.PHONE_UNCATEGORIZED) - - public static let toyController = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.TOY_CONTROLLER) - - public static let toyDollActionFigure = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.TOY_DOLL_ACTION_FIGURE) - - public static let toyGame = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.TOY_GAME) - - public static let toyRobot = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.TOY_ROBOT) - - public static let toyUncategorized = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.TOY_UNCATEGORIZED) - - public static let toyVehicle = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.TOY_VEHICLE) - - public static let wearableGlasses = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.WEARABLE_GLASSES) - - public static let wearableHelmet = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.WEARABLE_HELMET) - - public static let wearableJacket = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.WEARABLE_JACKET) - - public static let wearablePager = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.WEARABLE_PAGER) - - public static let wearableUncategorized = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.WEARABLE_UNCATEGORIZED) - - public static let wearableWristWatch = Android.Bluetooth.Class.Device(rawValue: AndroidBluetoothClassDeviceConstants.WEARABLE_WRIST_WATCH) -} - -// MARK: - Constants - -fileprivate class AndroidBluetoothClassDeviceConstants { - - fileprivate static var AUDIO_VIDEO_CAMCORDER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_CAMCORDER", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_CAMCORDER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_CAR_AUDIO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_CAR_AUDIO", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_CAR_AUDIO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_HANDSFREE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_HANDSFREE", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_HANDSFREE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_HEADPHONES: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_HEADPHONES", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_HEADPHONES, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_HIFI_AUDIO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_HIFI_AUDIO", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_HIFI_AUDIO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_LOUDSPEAKER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_LOUDSPEAKER", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_LOUDSPEAKER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_MICROPHONE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_MICROPHONE", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_MICROPHONE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_PORTABLE_AUDIO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_PORTABLE_AUDIO", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_PORTABLE_AUDIO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_SET_TOP_BOX: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_SET_TOP_BOX", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_SET_TOP_BOX, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_VCR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_VCR", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_VCR, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_VIDEO_CAMERA: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_VIDEO_CAMERA", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_VIDEO_CAMERA, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_VIDEO_CONFERENCING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_VIDEO_CONFERENCING", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_VIDEO_CONFERENCING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_VIDEO_GAMING_TOY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_VIDEO_GAMING_TOY", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_VIDEO_GAMING_TOY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_VIDEO_MONITOR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_VIDEO_MONITOR", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_VIDEO_MONITOR, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var AUDIO_VIDEO_WEARABLE_HEADSET: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO_WEARABLE_HEADSET", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO_WEARABLE_HEADSET, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_DESKTOP: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_DESKTOP", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_DESKTOP, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_HANDHELD_PC_PDA: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_HANDHELD_PC_PDA", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_HANDHELD_PC_PDA, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_LAPTOP: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_LAPTOP", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_LAPTOP, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_PALM_SIZE_PC_PDA: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_PALM_SIZE_PC_PDA", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_PALM_SIZE_PC_PDA, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_SERVER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_SERVER", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_SERVER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER_WEARABLE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER_WEARABLE", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER_WEARABLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_BLOOD_PRESSURE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_BLOOD_PRESSURE", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_BLOOD_PRESSURE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - fileprivate static var HEALTH_DATA_DISPLAY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_DATA_DISPLAY", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_DATA_DISPLAY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_GLUCOSE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_GLUCOSE", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_GLUCOSE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_PULSE_OXIMETER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_PULSE_OXIMETER", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_PULSE_OXIMETER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_PULSE_RATE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_PULSE_RATE", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_PULSE_RATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_THERMOMETER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_THERMOMETER", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_THERMOMETER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH_WEIGHING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH_WEIGHING", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH_WEIGHING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE_CELLULAR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE_CELLULAR", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE_CELLULAR, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE_CORDLESS: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE_CORDLESS", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE_CORDLESS, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE_ISDN: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE_ISDN", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE_ISDN, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE_MODEM_OR_GATEWAY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE_MODEM_OR_GATEWAY", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE_MODEM_OR_GATEWAY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE_SMART: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE_SMART", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE_SMART, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE_UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE_UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE_UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY_CONTROLLER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY_CONTROLLER", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY_CONTROLLER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY_DOLL_ACTION_FIGURE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY_DOLL_ACTION_FIGURE", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY_DOLL_ACTION_FIGURE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY_GAME: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY_GAME", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY_GAME, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY_ROBOT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY_ROBOT", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY_ROBOT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY_UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY_UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY_UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY_VEHICLE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY_VEHICLE", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY_VEHICLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE_GLASSES: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE_GLASSES", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE_GLASSES, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE_HELMET: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE_HELMET", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE_HELMET, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE_JACKET: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE_JACKET", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE_JACKET, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE_PAGER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE_PAGER", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE_PAGER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE_UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE_UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE_UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE_WRIST_WATCH: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE_WRIST_WATCH", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE_WRIST_WATCH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} - -// MARK: - JNI Cache - -fileprivate extension AndroidBluetoothClassDeviceConstants { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothClass$Device"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var AUDIO_VIDEO_CAMCORDER: jfieldID? - static var AUDIO_VIDEO_CAR_AUDIO: jfieldID? - static var AUDIO_VIDEO_HANDSFREE: jfieldID? - static var AUDIO_VIDEO_HEADPHONES: jfieldID? - static var AUDIO_VIDEO_HIFI_AUDIO: jfieldID? - static var AUDIO_VIDEO_LOUDSPEAKER: jfieldID? - static var AUDIO_VIDEO_MICROPHONE: jfieldID? - static var AUDIO_VIDEO_PORTABLE_AUDIO: jfieldID? - static var AUDIO_VIDEO_SET_TOP_BOX: jfieldID? - static var AUDIO_VIDEO_UNCATEGORIZED: jfieldID? - static var AUDIO_VIDEO_VCR: jfieldID? - static var AUDIO_VIDEO_VIDEO_CAMERA: jfieldID? - static var AUDIO_VIDEO_VIDEO_CONFERENCING: jfieldID? - static var AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER: jfieldID? - static var AUDIO_VIDEO_VIDEO_GAMING_TOY: jfieldID? - static var AUDIO_VIDEO_VIDEO_MONITOR: jfieldID? - static var AUDIO_VIDEO_WEARABLE_HEADSET: jfieldID? - static var COMPUTER_DESKTOP: jfieldID? - static var COMPUTER_HANDHELD_PC_PDA: jfieldID? - static var COMPUTER_LAPTOP: jfieldID? - static var COMPUTER_PALM_SIZE_PC_PDA: jfieldID? - static var COMPUTER_SERVER: jfieldID? - static var COMPUTER_UNCATEGORIZED: jfieldID? - static var COMPUTER_WEARABLE: jfieldID? - static var HEALTH_BLOOD_PRESSURE: jfieldID? - static var HEALTH_DATA_DISPLAY: jfieldID? - static var HEALTH_GLUCOSE: jfieldID? - static var HEALTH_PULSE_OXIMETER: jfieldID? - static var HEALTH_PULSE_RATE: jfieldID? - static var HEALTH_THERMOMETER: jfieldID? - static var HEALTH_UNCATEGORIZED: jfieldID? - static var HEALTH_WEIGHING: jfieldID? - static var PHONE_CELLULAR: jfieldID? - static var PHONE_CORDLESS: jfieldID? - static var PHONE_ISDN: jfieldID? - static var PHONE_MODEM_OR_GATEWAY: jfieldID? - static var PHONE_SMART: jfieldID? - static var PHONE_UNCATEGORIZED: jfieldID? - static var TOY_CONTROLLER: jfieldID? - static var TOY_DOLL_ACTION_FIGURE: jfieldID? - static var TOY_GAME: jfieldID? - static var TOY_ROBOT: jfieldID? - static var TOY_UNCATEGORIZED: jfieldID? - static var TOY_VEHICLE: jfieldID? - static var WEARABLE_GLASSES: jfieldID? - static var WEARABLE_HELMET: jfieldID? - static var WEARABLE_JACKET: jfieldID? - static var WEARABLE_PAGER: jfieldID? - static var WEARABLE_UNCATEGORIZED: jfieldID? - static var WEARABLE_WRIST_WATCH: jfieldID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothClassDeviceMajor.swift b/Sources/AndroidBluetooth/BluetoothClassDeviceMajor.swift deleted file mode 100644 index b3ca662..0000000 --- a/Sources/AndroidBluetooth/BluetoothClassDeviceMajor.swift +++ /dev/null @@ -1,256 +0,0 @@ -// -// BluetoothClassDeviceMajor.swift -// Android -// -// Created by Marco Estrella on 6/6/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension AndroidBluetoothClassDevice { - - typealias Major = AndroidBluetoothClassDeviceMajor -} - -/** - * Defines all major device class constants. - * - * See BluetoothClass.Device for minor classes. - */ -public struct AndroidBluetoothClassDeviceMajor: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let audioVideo = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.AUDIO_VIDEO) - - public static let computer = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.COMPUTER) - - public static let health = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.HEALTH) - - public static let imaging = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.IMAGING) - - public static let misc = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.MISC) - - public static let networking = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.NETWORKING) - - public static let peripheral = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.PERIPHERAL) - - public static let phone = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.PHONE) - - public static let toy = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.TOY) - - public static let uncategorized = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.UNCATEGORIZED) - - public static let wearable = Android.Bluetooth.Class.Device.Major(rawValue: AndroidBluetoothClassDeviceMajorConstants.WEARABLE) -} - -// MARK: - Constants - -fileprivate class AndroidBluetoothClassDeviceMajorConstants { - - fileprivate static var AUDIO_VIDEO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO_VIDEO", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO_VIDEO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var COMPUTER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "COMPUTER", - fieldType: "I", - fieldCache: &JNICache.FieldID.COMPUTER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var HEALTH: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH", - fieldType: "I", - fieldCache: &JNICache.FieldID.HEALTH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var IMAGING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "IMAGING", - fieldType: "I", - fieldCache: &JNICache.FieldID.IMAGING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var MISC: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "MISC", - fieldType: "I", - fieldCache: &JNICache.FieldID.MISC, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var NETWORKING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "NETWORKING", - fieldType: "I", - fieldCache: &JNICache.FieldID.NETWORKING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PERIPHERAL: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERIPHERAL", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERIPHERAL, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var PHONE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHONE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHONE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TOY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TOY", - fieldType: "I", - fieldCache: &JNICache.FieldID.TOY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var UNCATEGORIZED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "UNCATEGORIZED", - fieldType: "I", - fieldCache: &JNICache.FieldID.UNCATEGORIZED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var WEARABLE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WEARABLE", - fieldType: "I", - fieldCache: &JNICache.FieldID.WEARABLE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} - -// MARK: - JNI Cache - -fileprivate extension AndroidBluetoothClassDeviceMajorConstants { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothClass$Device$Major"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var AUDIO_VIDEO: jfieldID? - static var COMPUTER: jfieldID? - static var HEALTH: jfieldID? - static var IMAGING: jfieldID? - static var MISC: jfieldID? - static var NETWORKING: jfieldID? - static var PERIPHERAL: jfieldID? - static var PHONE: jfieldID? - static var TOY: jfieldID? - static var UNCATEGORIZED: jfieldID? - static var WEARABLE: jfieldID? - } - } -} - diff --git a/Sources/AndroidBluetooth/BluetoothClassService.swift b/Sources/AndroidBluetooth/BluetoothClassService.swift deleted file mode 100644 index 3ebb281..0000000 --- a/Sources/AndroidBluetooth/BluetoothClassService.swift +++ /dev/null @@ -1,220 +0,0 @@ -// -// BluetoothClassService.swift -// Android -// -// Created by Marco Estrella on 6/6/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.Class { - - typealias Service = AndroidBluetoothClassService -} - -/** - * Defines all service class constants. - * - * Each BluetoothClass encodes zero or more service classes. - */ -public struct AndroidBluetoothClassService: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let audio = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.AUDIO) - - public static let capture = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.CAPTURE) - - public static let information = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.INFORMATION) - - public static let limitedDiscoverability = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.LIMITED_DISCOVERABILITY) - - public static let networking = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.NETWORKING) - - public static let objectTransfer = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.OBJECT_TRANSFER) - - public static let positioning = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.POSITIONING) - - public static let render = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.RENDER) - - public static let telephony = Android.Bluetooth.Class.Service(rawValue: AndroidBluetoothClassServiceConstants.TELEPHONY) -} - -// MARK: - Constants - -fileprivate class AndroidBluetoothClassServiceConstants { - - fileprivate static var AUDIO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "AUDIO", - fieldType: "I", - fieldCache: &JNICache.FieldID.AUDIO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var CAPTURE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CAPTURE", - fieldType: "I", - fieldCache: &JNICache.FieldID.CAPTURE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var INFORMATION: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "INFORMATION", - fieldType: "I", - fieldCache: &JNICache.FieldID.INFORMATION, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var LIMITED_DISCOVERABILITY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "LIMITED_DISCOVERABILITY", - fieldType: "I", - fieldCache: &JNICache.FieldID.LIMITED_DISCOVERABILITY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var NETWORKING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "NETWORKING", - fieldType: "I", - fieldCache: &JNICache.FieldID.NETWORKING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var OBJECT_TRANSFER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "OBJECT_TRANSFER", - fieldType: "I", - fieldCache: &JNICache.FieldID.OBJECT_TRANSFER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var POSITIONING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "POSITIONING", - fieldType: "I", - fieldCache: &JNICache.FieldID.POSITIONING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var RENDER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "RENDER", - fieldType: "I", - fieldCache: &JNICache.FieldID.RENDER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - fileprivate static var TELEPHONY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TELEPHONY", - fieldType: "I", - fieldCache: &JNICache.FieldID.TELEPHONY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} - -// MARK: - JNI Cache - -fileprivate extension AndroidBluetoothClassServiceConstants { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothClass$Service"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var AUDIO: jfieldID? - static var CAPTURE: jfieldID? - static var INFORMATION: jfieldID? - static var LIMITED_DISCOVERABILITY: jfieldID? - static var NETWORKING: jfieldID? - static var OBJECT_TRANSFER: jfieldID? - static var POSITIONING: jfieldID? - static var RENDER: jfieldID? - static var TELEPHONY: jfieldID? - } - } -} - diff --git a/Sources/AndroidBluetooth/BluetoothCodecConfig+Builder.swift b/Sources/AndroidBluetooth/BluetoothCodecConfig+Builder.swift new file mode 100644 index 0000000..d4aec5b --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothCodecConfig+Builder.swift @@ -0,0 +1,44 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothCodecConfig { + @JavaClass("android.bluetooth.BluetoothCodecConfig$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setCodecType(_ arg0: Int32) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setCodecPriority(_ arg0: Int32) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setSampleRate(_ arg0: Int32) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setBitsPerSample(_ arg0: Int32) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setChannelMode(_ arg0: Int32) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setCodecSpecific1(_ arg0: Int64) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setCodecSpecific2(_ arg0: Int64) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setCodecSpecific3(_ arg0: Int64) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setCodecSpecific4(_ arg0: Int64) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func setExtendedCodecType(_ arg0: BluetoothCodecType?) -> BluetoothCodecConfig.Builder! + + @JavaMethod + open func build() -> BluetoothCodecConfig! + } +} diff --git a/Sources/AndroidBluetooth/BluetoothCodecConfig.swift b/Sources/AndroidBluetooth/BluetoothCodecConfig.swift new file mode 100644 index 0000000..988194e --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothCodecConfig.swift @@ -0,0 +1,140 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothCodecConfig", implements: Parcelable.self) +open class BluetoothCodecConfig: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getCodecType() -> Int32 + + @JavaMethod + open func isMandatoryCodec() -> Bool + + @JavaMethod + open func getCodecPriority() -> Int32 + + @JavaMethod + open func getSampleRate() -> Int32 + + @JavaMethod + open func getBitsPerSample() -> Int32 + + @JavaMethod + open func getChannelMode() -> Int32 + + @JavaMethod + open func getCodecSpecific1() -> Int64 + + @JavaMethod + open func getCodecSpecific2() -> Int64 + + @JavaMethod + open func getCodecSpecific3() -> Int64 + + @JavaMethod + open func getCodecSpecific4() -> Int64 + + @JavaMethod + open func getExtendedCodecType() -> BluetoothCodecType! + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_16: Int32 + + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_24: Int32 + + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_32: Int32 + + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_MODE_MONO: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_MODE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_MODE_STEREO: Int32 + + @JavaStaticField(isFinal: true) + public var CODEC_PRIORITY_DEFAULT: Int32 + + @JavaStaticField(isFinal: true) + public var CODEC_PRIORITY_DISABLED: Int32 + + @JavaStaticField(isFinal: true) + public var CODEC_PRIORITY_HIGHEST: Int32 + + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_176400: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_192000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_44100: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_48000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_88200: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_96000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_AAC: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_APTX: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_APTX_HD: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_INVALID: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_LC3: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_LDAC: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_OPUS: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_SBC: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothCodecStatus+Builder.swift b/Sources/AndroidBluetooth/BluetoothCodecStatus+Builder.swift new file mode 100644 index 0000000..48159d5 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothCodecStatus+Builder.swift @@ -0,0 +1,24 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime + +extension BluetoothCodecStatus { + @JavaClass("android.bluetooth.BluetoothCodecStatus$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setCodecConfig(_ arg0: BluetoothCodecConfig?) -> BluetoothCodecStatus.Builder! + + @JavaMethod + open func setCodecsLocalCapabilities(_ arg0: List?) -> BluetoothCodecStatus.Builder! + + @JavaMethod + open func setCodecsSelectableCapabilities(_ arg0: List?) -> BluetoothCodecStatus.Builder! + + @JavaMethod + open func build() -> BluetoothCodecStatus! + } +} diff --git a/Sources/AndroidBluetooth/BluetoothCodecStatus.swift b/Sources/AndroidBluetooth/BluetoothCodecStatus.swift new file mode 100644 index 0000000..00ba18a --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothCodecStatus.swift @@ -0,0 +1,48 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothCodecStatus", implements: Parcelable.self) +open class BluetoothCodecStatus: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getCodecConfig() -> BluetoothCodecConfig! + + @JavaMethod + open func isCodecConfigSelectable(_ arg0: BluetoothCodecConfig?) -> Bool + + @JavaMethod + open func getCodecsLocalCapabilities() -> List! + + @JavaMethod + open func getCodecsSelectableCapabilities() -> List! + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var EXTRA_CODEC_STATUS: String + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothCodecType.swift b/Sources/AndroidBluetooth/BluetoothCodecType.swift new file mode 100644 index 0000000..c49c288 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothCodecType.swift @@ -0,0 +1,59 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothCodecType", implements: Parcelable.self) +open class BluetoothCodecType: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func isMandatoryCodec() -> Bool + + @JavaMethod + open func getCodecId() -> Int64 + + @JavaMethod + open func getCodecName() -> String + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CODEC_ID_AAC: Int64 + + @JavaStaticField(isFinal: true) + public var CODEC_ID_APTX: Int64 + + @JavaStaticField(isFinal: true) + public var CODEC_ID_APTX_HD: Int64 + + @JavaStaticField(isFinal: true) + public var CODEC_ID_LDAC: Int64 + + @JavaStaticField(isFinal: true) + public var CODEC_ID_OPUS: Int64 + + @JavaStaticField(isFinal: true) + public var CODEC_ID_SBC: Int64 + + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothCsipSetCoordinator.swift b/Sources/AndroidBluetooth/BluetoothCsipSetCoordinator.swift new file mode 100644 index 0000000..432f340 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothCsipSetCoordinator.swift @@ -0,0 +1,78 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaLang +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothCsipSetCoordinator", implements: BluetoothProfile.self, AutoCloseable.self) +open class BluetoothCsipSetCoordinator: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open override func finalize() + + @JavaMethod + open func close() +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_CSIS_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothDevice.swift b/Sources/AndroidBluetooth/BluetoothDevice.swift index a8c2db5..b48ca21 100644 --- a/Sources/AndroidBluetooth/BluetoothDevice.swift +++ b/Sources/AndroidBluetooth/BluetoothDevice.swift @@ -1,1239 +1,238 @@ -// -// AndroidBluetoothDevice.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import java_util -import Android -import Bluetooth - -public extension Android.Bluetooth { - - typealias Device = AndroidBluetoothDevice -} +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidContent +import AndroidOS +import JavaKit +import JavaRuntime +import JavaUtil -public extension Android.Bluetooth.Device { - - typealias DeviceType = AndroidBluetoothLowEnergyDeviceType - - typealias BondState = AndroidBluetoothLowEnergyBondState - - typealias State = AndroidBluetoothLowEnergyState - - typealias Transport = AndroidBluetoothLowEnergyDeviceTransportType -} +@JavaClass("android.bluetooth.BluetoothDevice", implements: Parcelable.self) +open class BluetoothDevice: JavaObject { + @JavaMethod + open func describeContents() -> Int32 -public final class AndroidBluetoothDevice: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - public var address: BluetoothAddress { - - let string = getAddress() - guard let address = BluetoothAddress(rawValue: string) - else { fatalError("Invalid Bluetooth Address string: \(string)") } - return address - } - - public var type: Android.Bluetooth.Device.DeviceType { - - get { return getType() } - } - - public var bondType: Android.Bluetooth.Device.BondState { - - get { return getBondState() } - } -} + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) -// MARK: - CONSTANTS - -public extension Android.Bluetooth.Device { - - /// Broadcast Action: Indicates a low level (ACL) connection has been established with a remote device. - static var ACTION_ACL_CONNECTED: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_ACL_CONNECTED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_ACL_CONNECTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: Indicates a low level (ACL) disconnection from a remote device. - static var ACTION_ACL_DISCONNECTED: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_ACL_DISCONNECTED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_ACL_DISCONNECTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: Indicates that a low level (ACL) disconnection has been requested for a remote device, and it will soon be disconnected. - static var ACTION_ACL_DISCONNECT_REQUESTED: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_ACL_DISCONNECT_REQUESTED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_ACL_DISCONNECT_REQUESTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: Indicates a change in the bond state of a remote device. For example, if a device is bonded (paired). - static var ACTION_BOND_STATE_CHANGED: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_BOND_STATE_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_BOND_STATE_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: Bluetooth class of a remote device has changed. - static var ACTION_CLASS_CHANGED: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_CLASS_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_CLASS_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: Remote device discovered. - static var ACTION_FOUND: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_FOUND", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_FOUND, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: Indicates the friendly name of a remote device has been retrieved for the first time, or changed since the last retrieval. - static var ACTION_NAME_CHANGED: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_NAME_CHANGED", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_NAME_CHANGED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: This intent is used to broadcast PAIRING REQUEST - static var ACTION_PAIRING_REQUEST: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_PAIRING_REQUEST", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_PAIRING_REQUEST, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Broadcast Action: This intent is used to broadcast the UUID wrapped as a ParcelUuid of the remote device after it has been fetched. - /// This intent is sent only when the UUIDs of the remote device are requested to be fetched using Service Discovery Protocol. - static var ACTION_UUID: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ACTION_UUID", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.ACTION_UUID, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// A shared link keys exists locally for the remote device, so communication can be authenticated and encrypted. - static var BOND_BONDED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "BOND_BONDED", - fieldType: "I", - fieldCache: &JNICache.FieldID.BOND_BONDED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates bonding (pairing) is in progress with the remote device. - static var BOND_BONDING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "BOND_BONDING", - fieldType: "I", - fieldCache: &JNICache.FieldID.BOND_BONDING, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates the remote device is not bonded (paired). - static var BOND_NONE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "BOND_NONE", - fieldType: "I", - fieldCache: &JNICache.FieldID.BOND_NONE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth device type, Classic - BR/EDR devices - static var DEVICE_TYPE_CLASSIC: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "DEVICE_TYPE_CLASSIC", - fieldType: "I", - fieldCache: &JNICache.FieldID.DEVICE_TYPE_CLASSIC, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth device type, Dual Mode - BR/EDR/LE - static var DEVICE_TYPE_DUAL: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "DEVICE_TYPE_DUAL", - fieldType: "I", - fieldCache: &JNICache.FieldID.DEVICE_TYPE_DUAL, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth device type, Low Energy - LE-only - static var DEVICE_TYPE_LE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "DEVICE_TYPE_LE", - fieldType: "I", - fieldCache: &JNICache.FieldID.DEVICE_TYPE_LE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth device type, Unknown - static var DEVICE_TYPE_UNKNOWN: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "DEVICE_TYPE_UNKNOWN", - fieldType: "I", - fieldCache: &JNICache.FieldID.DEVICE_TYPE_UNKNOWN, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Sentinel error value for this class. Guaranteed to not equal any other integer constant in this class. - /// Provided as a convenience for functions that require a sentinel error value, for example: - /// Intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR) - static var ERROR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ERROR", - fieldType: "I", - fieldCache: &JNICache.FieldID.ERROR, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Used as an int extra field in ACTION_BOND_STATE_CHANGED intents. Contains the bond state of the remote device. - static var EXTRA_BOND_STATE: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_BOND_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_BOND_STATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as a Parcelable BluetoothClass extra field in ACTION_FOUND and ACTION_CLASS_CHANGED intents. - static var EXTRA_CLASS: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_CLASS", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_CLASS, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as a Parcelable BluetoothDevice extra field in every intent broadcast by this class. It contains the BluetoothDevice that the intent applies to. - static var EXTRA_DEVICE: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_DEVICE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_DEVICE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as a String extra field in ACTION_NAME_CHANGED and ACTION_FOUND intents. It contains the friendly Bluetooth name. - static var EXTRA_NAME: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_NAME", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_NAME, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as an int extra field in ACTION_PAIRING_REQUEST intents as the value of passkey. - static var EXTRA_PAIRING_KEY: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_PAIRING_KEY", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_PAIRING_KEY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as an int extra field in ACTION_PAIRING_REQUEST intents to indicate pairing method used. Possible values are: PAIRING_VARIANT_PIN, PAIRING_VARIANT_PASSKEY_CONFIRMATION, - static var EXTRA_PAIRING_VARIANT: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_PAIRING_VARIANT", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_PAIRING_VARIANT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as an int extra field in ACTION_BOND_STATE_CHANGED intents. Contains the previous bond state of the remote device. - static var EXTRA_PREVIOUS_BOND_STATE: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_PREVIOUS_BOND_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_PREVIOUS_BOND_STATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as an optional short extra field in ACTION_FOUND intents. Contains the RSSI value of the remote device as reported by the Bluetooth hardware. - static var EXTRA_RSSI: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_RSSI", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_RSSI, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// Used as an extra field in ACTION_UUID intents, Contains the ParcelUuids of the remote device which is a parcelable version of UUID. - static var EXTRA_UUID: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_UUID", - fieldType: "Ljava/lang/String;", - fieldCache: &JNICache.FieldID.EXTRA_UUID, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return String(__value) - } - } - - /// The user will be prompted to confirm the passkey displayed on the screen or an app will confirm the passkey for the user. - static var PAIRING_VARIANT_PASSKEY_CONFIRMATION: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PAIRING_VARIANT_PASSKEY_CONFIRMATION", - fieldType: "I", - fieldCache: &JNICache.FieldID.PAIRING_VARIANT_PASSKEY_CONFIRMATION, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// The user will be prompted to enter a pin or an app will enter a pin for user. - static var PAIRING_VARIANT_PIN: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PAIRING_VARIANT_PIN", - fieldType: "I", - fieldCache: &JNICache.FieldID.PAIRING_VARIANT_PIN, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth LE 1M PHY. - static var PHY_LE_1M: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_1M", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_LE_1M, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth LE 1M PHY mask. - static var PHY_LE_1M_MASK: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_1M_MASK", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_LE_1M_MASK, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth LE 2M PHY. - static var PHY_LE_2M: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_2M", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_LE_2M, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth LE 2M PHY mask. - static var PHY_LE_2M_MASK: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_2M_MASK", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_LE_2M_MASK, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth LE Coded PHY. - static var PHY_LE_CODED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_CODED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_LE_CODED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Bluetooth LE Coded PHY mask. - static var PHY_LE_CODED_MASK: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_CODED_MASK", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_LE_CODED_MASK, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// No preferred coding when transmitting on the LE Coded PHY. - static var PHY_OPTION_NO_PREFERRED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_OPTION_NO_PREFERRED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_OPTION_NO_PREFERRED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Prefer the S=2 coding to be used when transmitting on the LE Coded PHY. - static var PHY_OPTION_S2: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_OPTION_S2", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_OPTION_S2, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Prefer the S=8 coding to be used when transmitting on the LE Coded PHY. - static var PHY_OPTION_S8: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_OPTION_S8", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_OPTION_S8, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// No preferrence of physical transport for GATT connections to remote dual-mode devices - static var TRANSPORT_AUTO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TRANSPORT_AUTO", - fieldType: "I", - fieldCache: &JNICache.FieldID.TRANSPORT_AUTO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Prefer BR/EDR transport for GATT connections to remote dual-mode devices - static var TRANSPORT_BREDR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TRANSPORT_BREDR", - fieldType: "I", - fieldCache: &JNICache.FieldID.TRANSPORT_BREDR, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Prefer LE transport for GATT connections to remote dual-mode devices - static var TRANSPORT_LE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TRANSPORT_LE", - fieldType: "I", - fieldCache: &JNICache.FieldID.TRANSPORT_LE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaMethod + open func getAddressType() -> Int32 -// MARK: - Methods - -public extension Android.Bluetooth.Device { - - /** - * Connect to GATT Server hosted by this device. - */ - func connectGatt(context: Android.Content.Context, autoConnect: Bool, callback: Android.Bluetooth.GattCallback) -> Android.Bluetooth.Gatt { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: context, locals: &__locals), - jvalue(z: jboolean(autoConnect ? JNI_TRUE : JNI_FALSE)), - JNIType.toJava(value: callback, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "connectGatt", - methodSig: "(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;)Landroid/bluetooth/BluetoothGatt;", - methodCache: &JNICache.MethodID.connectGatt, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Gatt(javaObject: __return) - } - - /** - * Connect to GATT Server hosted by this device. - */ - func connectGatt(context: Android.Content.Context, autoConnect: Bool, callback: Android.Bluetooth.GattCallback, transport: Android.Bluetooth.Device.Transport, phy: Int, handler: JavaObject) -> Android.Bluetooth.Gatt { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: context, locals: &__locals), - jvalue(z: jboolean(autoConnect ? JNI_TRUE : JNI_FALSE)), - JNIType.toJava(value: callback, locals: &__locals), - jvalue(i: jint(transport.rawValue)), - jvalue(i: jint(phy)), - JNIType.toJava(value: handler, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "connectGatt", - methodSig: "(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;IILandroid/os/Handler;)Landroid/bluetooth/BluetoothGatt;", - methodCache: &JNICache.MethodID.connectGatt2, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Gatt(javaObject: __return) - } - - /** - * Connect to GATT Server hosted by this device. - */ - func connectGatt(context: Android.Content.Context, autoConnect: Bool, callback: Android.Bluetooth.GattCallback, transport: Android.Bluetooth.Device.Transport, phy: Int) -> Android.Bluetooth.Gatt { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: context, locals: &__locals), - jvalue(z: jboolean(autoConnect ? JNI_TRUE : JNI_FALSE)), - JNIType.toJava(value: callback, locals: &__locals), - jvalue(i: jint(transport.rawValue)), - jvalue(i: jint(phy)) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "connectGatt", - methodSig: "(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;II)Landroid/bluetooth/BluetoothGatt;", - methodCache: &JNICache.MethodID.connectGatt3, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Gatt(javaObject: __return) - } - - /** - * Connect to GATT Server hosted by this device. - */ - func connectGatt(context: Android.Content.Context, autoConnect: Bool, callback: Android.Bluetooth.GattCallback, transport: Android.Bluetooth.Device.Transport) -> Android.Bluetooth.Gatt { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: context, locals: &__locals), - jvalue(z: jboolean(autoConnect ? JNI_TRUE : JNI_FALSE)), - JNIType.toJava(value: callback, locals: &__locals), - jvalue(i: jint(transport.rawValue)) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "connectGatt", - methodSig: "(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;I)Landroid/bluetooth/BluetoothGatt;", - methodCache: &JNICache.MethodID.connectGatt4, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Gatt(javaObject: __return) - } - - /** - * Start the bonding (pairing) process with the remote device. - */ - func createBond() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "createBond", - methodSig: "()Z", - methodCache: &JNICache.MethodID.createBond, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Create an RFCOMM BluetoothSocket socket ready to start an insecure outgoing connection to this remote device using SDP lookup of uuid. - */ - func createInsecureRfcommSocketToServiceRecord(uuid: java_util.UUID) -> Android.Bluetooth.Socket { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "createInsecureRfcommSocketToServiceRecord", - methodSig: "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;", - methodCache: &JNICache.MethodID.createInsecureRfcommSocketToServiceRecord, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Socket(javaObject: __return) - } - - /** - * Create an RFCOMM BluetoothSocket ready to start a secure outgoing connection to this remote device using SDP lookup of uuid. - */ - func createRfcommSocketToServiceRecord(uuid: java_util.UUID) -> Android.Bluetooth.Socket { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "createRfcommSocketToServiceRecord", - methodSig: "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;", - methodCache: &JNICache.MethodID.createRfcommSocketToServiceRecord, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Socket(javaObject: __return) - } - - /** - * Perform a service discovery on the remote device to get the UUIDs supported. - */ - func fetchUuidsWithSd() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "fetchUuidsWithSd", - methodSig: "()Z", - methodCache: &JNICache.MethodID.fetchUuidsWithSd, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Returns the hardware address of this BluetoothDevice. - */ - func getAddress() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getAddress", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getAddress, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return String(javaObject: __return) - } - - /** - * Get the Bluetooth class of the remote device. - */ - func getBluetoothClass() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getBluetoothClass", - methodSig: "()Landroid/bluetooth/BluetoothClass;", - methodCache: &JNICache.MethodID.getBluetoothClass, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return String(javaObject: __return) - } - - /** - * Get the bond state of the remote device. - */ - func getBondState() -> Android.Bluetooth.Device.BondState { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getBondState", - methodSig: "()I", - methodCache: &JNICache.MethodID.getBondState, - args: &__args, - locals: &__locals) - return Android.Bluetooth.Device.BondState(rawValue: Int(__return)) - } - - /** - * Get the friendly Bluetooth name of the remote device. - */ - func getName() -> String? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getName", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getName, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return __return != nil ? String(javaObject: __return) : nil - } - - /** - * Get the Bluetooth device type of the remote device. - */ - func getType() -> Android.Bluetooth.Device.DeviceType { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getType", - methodSig: "()I", - methodCache: &JNICache.MethodID.getType, - args: &__args, - locals: &__locals) - return Android.Bluetooth.Device.DeviceType(rawValue: Int(__return)) - } - - /** - * Get the friendly Bluetooth name of the remote device. - */ - func getUUIDs() -> [Android.OS.ParcelUuid]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getUuids", - methodSig: "()[Landroid/os/ParcelUuid;", - methodCache: &JNICache.MethodID.getUuids, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return JNIType.toSwift(type: [Android.OS.ParcelUuid].self, from: __return) - } - - /** - * Confirm passkey for PAIRING_VARIANT_PASSKEY_CONFIRMATION pairing. - */ - func setPairingConfirmation(confirm: Bool) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(z: jboolean(confirm ? JNI_TRUE : JNI_FALSE)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setPairingConfirmation", - methodSig: "(Z)Z", - methodCache: &JNICache.MethodID.setPairingConfirmation, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Set the pin during pairing when the pairing method is PAIRING_VARIANT_PIN. - */ - func setPin(pin: [Int8]) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: pin, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setPin", - methodSig: "([B)Z", - methodCache: &JNICache.MethodID.setPin, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} + @JavaMethod + open func getAlias() -> String + + @JavaMethod + open func setAlias(_ arg0: String) -> Int32 + + @JavaMethod + open func createBond() -> Bool + + @JavaMethod + open func getBondState() -> Int32 + + @JavaMethod + open func getBluetoothClass() -> BluetoothClass! + + @JavaMethod + open func getUuids() -> [ParcelUuid?] + + @JavaMethod + open func fetchUuidsWithSdp() -> Bool + + @JavaMethod + open func setPin(_ arg0: [Int8]) -> Bool + + @JavaMethod + open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?) -> BluetoothGatt! + + @JavaMethod + open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?, _ arg3: Int32) -> BluetoothGatt! + + @JavaMethod + open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?, _ arg3: Int32, _ arg4: Int32) -> BluetoothGatt! + + @JavaMethod + open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?, _ arg3: Int32, _ arg4: Int32, _ arg5: Handler?) -> BluetoothGatt! + + @JavaMethod + open func createL2capChannel(_ arg0: Int32) throws -> BluetoothSocket! + + @JavaMethod + open func setPairingConfirmation(_ arg0: Bool) -> Bool + + @JavaMethod + open func createRfcommSocketToServiceRecord(_ arg0: UUID?) throws -> BluetoothSocket! -// MARK: - Suporting type - -public extension Android.Bluetooth.Device { - - struct AndroidBluetoothLowEnergyDeviceTransportType: RawRepresentable, Equatable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let le = Android.Bluetooth.Device.Transport(rawValue: Android.Bluetooth.Device.TRANSPORT_LE) - - public static let auto = Android.Bluetooth.Device.DeviceType(rawValue: Android.Bluetooth.Device.TRANSPORT_AUTO) - - public static let bredr = Android.Bluetooth.Device.DeviceType(rawValue: Android.Bluetooth.Device.TRANSPORT_BREDR) - } - - struct AndroidBluetoothLowEnergyDeviceType: RawRepresentable, Equatable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth device type, Classic - BR/EDR devices - */ - public static let classic = Android.Bluetooth.Device.DeviceType(rawValue: Android.Bluetooth.Device.DEVICE_TYPE_CLASSIC) - - /** - * Bluetooth device type, Dual Mode - BR/EDR/LE - */ - public static let dual = Android.Bluetooth.Device.DeviceType(rawValue: Android.Bluetooth.Device.DEVICE_TYPE_DUAL) - - /** - * Bluetooth device type, Low Energy - LE-only - */ - public static let le = Android.Bluetooth.Device.DeviceType(rawValue: Android.Bluetooth.Device.DEVICE_TYPE_LE) - - /** - * Bluetooth device type, Unknown - */ - public static let unknow = Android.Bluetooth.Device.DeviceType(rawValue: Android.Bluetooth.Device.DEVICE_TYPE_UNKNOWN) - } - - struct AndroidBluetoothLowEnergyBondState: RawRepresentable, Equatable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Indicates the remote device is not bonded (paired). - */ - public static let none = Android.Bluetooth.Device.BondState(rawValue: Android.Bluetooth.Device.BOND_NONE) - - /** - * Indicates bonding (pairing) is in progress with the remote device. - */ - public static let bonding = Android.Bluetooth.Device.BondState(rawValue: Android.Bluetooth.Device.BOND_BONDING) - - /** - * Indicates the remote device is bonded (paired). - */ - public static let bonded = Android.Bluetooth.Device.BondState(rawValue: Android.Bluetooth.Device.BOND_BONDED) - } - - struct AndroidBluetoothLowEnergyState: RawRepresentable, Equatable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * The profile is in connected state - */ - public static let connected = Android.Bluetooth.Device.State(rawValue: Android.Bluetooth.Profile.Constants.STATE_CONNECTED) - - /** - * The profile is in disconnected state - */ - public static let disconnected = Android.Bluetooth.Device.State(rawValue: Android.Bluetooth.Profile.Constants.STATE_DISCONNECTED) - } + @JavaMethod + open func createInsecureL2capChannel(_ arg0: Int32) throws -> BluetoothSocket! + + @JavaMethod + open func createInsecureRfcommSocketToServiceRecord(_ arg0: UUID?) throws -> BluetoothSocket! + + @JavaMethod + open func getName() -> String + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func getType() -> Int32 + + @JavaMethod + open func getAddress() -> String } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_ACL_CONNECTED: String + + @JavaStaticField(isFinal: true) + public var ACTION_ACL_DISCONNECTED: String + + @JavaStaticField(isFinal: true) + public var ACTION_ACL_DISCONNECT_REQUESTED: String + + @JavaStaticField(isFinal: true) + public var ACTION_ALIAS_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_BOND_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_CLASS_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_FOUND: String + + @JavaStaticField(isFinal: true) + public var ACTION_NAME_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_PAIRING_REQUEST: String + + @JavaStaticField(isFinal: true) + public var ACTION_UUID: String + + @JavaStaticField(isFinal: true) + public var ADDRESS_TYPE_ANONYMOUS: Int32 + + @JavaStaticField(isFinal: true) + public var ADDRESS_TYPE_PUBLIC: Int32 + + @JavaStaticField(isFinal: true) + public var ADDRESS_TYPE_RANDOM: Int32 + + @JavaStaticField(isFinal: true) + public var ADDRESS_TYPE_UNKNOWN: Int32 + + @JavaStaticField(isFinal: true) + public var BOND_BONDED: Int32 + + @JavaStaticField(isFinal: true) + public var BOND_BONDING: Int32 + + @JavaStaticField(isFinal: true) + public var BOND_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var DEVICE_TYPE_CLASSIC: Int32 + + @JavaStaticField(isFinal: true) + public var DEVICE_TYPE_DUAL: Int32 + + @JavaStaticField(isFinal: true) + public var DEVICE_TYPE_LE: Int32 + + @JavaStaticField(isFinal: true) + public var DEVICE_TYPE_UNKNOWN: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_BOND_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_CLASS: String + + @JavaStaticField(isFinal: true) + public var EXTRA_DEVICE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_IS_COORDINATED_SET_MEMBER: String + + @JavaStaticField(isFinal: true) + public var EXTRA_NAME: String + + @JavaStaticField(isFinal: true) + public var EXTRA_PAIRING_KEY: String + + @JavaStaticField(isFinal: true) + public var EXTRA_PAIRING_VARIANT: String + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_BOND_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_RSSI: String + + @JavaStaticField(isFinal: true) + public var EXTRA_TRANSPORT: String + + @JavaStaticField(isFinal: true) + public var EXTRA_UUID: String + + @JavaStaticField(isFinal: true) + public var PAIRING_VARIANT_PASSKEY_CONFIRMATION: Int32 + + @JavaStaticField(isFinal: true) + public var PAIRING_VARIANT_PIN: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_1M: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_1M_MASK: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_2M: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_2M_MASK: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_CODED: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_CODED_MASK: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_OPTION_NO_PREFERRED: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_OPTION_S2: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_OPTION_S8: Int32 + + @JavaStaticField(isFinal: true) + public var TRANSPORT_AUTO: Int32 + + @JavaStaticField(isFinal: true) + public var TRANSPORT_BREDR: Int32 + + @JavaStaticField(isFinal: true) + public var TRANSPORT_LE: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 -// MARK: - JNI - -private extension Android.Bluetooth.Device { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/BluetoothDevice" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var ACTION_ACL_CONNECTED: jfieldID? - static var ACTION_ACL_DISCONNECTED: jfieldID? - static var ACTION_ACL_DISCONNECT_REQUESTED: jfieldID? - static var ACTION_BOND_STATE_CHANGED: jfieldID? - static var ACTION_CLASS_CHANGED: jfieldID? - static var ACTION_FOUND: jfieldID? - static var ACTION_NAME_CHANGED: jfieldID? - static var ACTION_PAIRING_REQUEST: jfieldID? - static var ACTION_UUID: jfieldID? - static var BOND_BONDED: jfieldID? - static var BOND_BONDING: jfieldID? - static var BOND_NONE: jfieldID? - static var DEVICE_TYPE_CLASSIC: jfieldID? - static var DEVICE_TYPE_DUAL: jfieldID? - static var DEVICE_TYPE_LE: jfieldID? - static var DEVICE_TYPE_UNKNOWN: jfieldID? - static var ERROR: jfieldID? - static var EXTRA_BOND_STATE: jfieldID? - static var EXTRA_CLASS: jfieldID? - static var EXTRA_DEVICE: jfieldID? - static var EXTRA_NAME: jfieldID? - static var EXTRA_PAIRING_KEY: jfieldID? - static var EXTRA_PAIRING_VARIANT: jfieldID? - static var EXTRA_PREVIOUS_BOND_STATE: jfieldID? - static var EXTRA_RSSI: jfieldID? - static var EXTRA_UUID: jfieldID? - static var PAIRING_VARIANT_PASSKEY_CONFIRMATION: jfieldID? - static var PAIRING_VARIANT_PIN: jfieldID? - static var PHY_LE_1M: jfieldID? - static var PHY_LE_1M_MASK: jfieldID? - static var PHY_LE_2M: jfieldID? - static var PHY_LE_2M_MASK: jfieldID? - static var PHY_LE_CODED: jfieldID? - static var PHY_LE_CODED_MASK: jfieldID? - static var PHY_OPTION_NO_PREFERRED: jfieldID? - static var PHY_OPTION_S2: jfieldID? - static var PHY_OPTION_S8: jfieldID? - static var TRANSPORT_AUTO: jfieldID? - static var TRANSPORT_BREDR: jfieldID? - static var TRANSPORT_LE: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var connectGatt: jmethodID? - static var connectGatt2: jmethodID? - static var connectGatt3: jmethodID? - static var connectGatt4: jmethodID? - static var createBond: jmethodID? - static var createInsecureRfcommSocketToServiceRecord: jmethodID? - static var createRfcommSocketToServiceRecord: jmethodID? - static var equals: jmethodID? - static var fetchUuidsWithSd: jmethodID? - static var getAddress: jmethodID? - static var getBluetoothClass: jmethodID? - static var getBondState: jmethodID? - static var getName: jmethodID? - static var getType: jmethodID? - static var getUuids: jmethodID? - static var setPairingConfirmation: jmethodID? - static var setPin: jmethodID? - } - } + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 } diff --git a/Sources/AndroidBluetooth/BluetoothGatt.swift b/Sources/AndroidBluetooth/BluetoothGatt.swift index 18a5cf2..0704e78 100644 --- a/Sources/AndroidBluetooth/BluetoothGatt.swift +++ b/Sources/AndroidBluetooth/BluetoothGatt.swift @@ -1,908 +1,186 @@ -// -// BluetoothGatt.swift -// Android -// -// Created by Marco Estrella on 6/1/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth { - - typealias Gatt = AndroidBluetoothGatt -} +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaUtil -public extension Android.Bluetooth.Gatt { - - typealias ConnectionPriority = AndroidBluetoothConnectionPriority - - typealias TxPhy = AndroidBluetoothTxPhy - - typealias RxPhy = AndroidBluetoothRxPhy - - typealias PhyOptions = AndroidBluetoothPhyOptions - - typealias Status = AndroidBluetoothGattStatus -} +@JavaClass("android.bluetooth.BluetoothGatt", implements: BluetoothProfile.self) +open class BluetoothGatt: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 -/** - * Public API for the Bluetooth GATT Profile. - * - * This class provides Bluetooth GATT functionality to enable communication with Bluetooth Smart or Smart Ready devices. - * - * To connect to a remote peripheral device, create a BluetoothGattCallback and call connectGatt(Context, boolean, BluetoothGattCallback) to - * get a instance of this class. GATT capable devices can be discovered using the Bluetooth device discovery or BLE scan process. - */ -public final class AndroidBluetoothGatt: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - public var services: [AndroidBluetoothGattService] { - - get { return getServices() } - } -} + @JavaMethod + open func disconnect() -// Mark: - Constants - -internal extension AndroidBluetoothGatt { - - /// Connection paramter update - Use the connection paramters recommended by the Bluetooth SIG. - static var CONNECTION_PRIORITY_BALANCED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CONNECTION_PRIORITY_BALANCED", - fieldType: "I", - fieldCache: &JNICache.FieldID.CONNECTION_PRIORITY_BALANCED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Connection paramter update - Request a high priority, low latency connection. - static var CONNECTION_PRIORITY_HIGH: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CONNECTION_PRIORITY_HIGH", - fieldType: "I", - fieldCache: &JNICache.FieldID.CONNECTION_PRIORITY_HIGH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Connection paramter update - Request low power, reduced data rate connection parameters. - static var CONNECTION_PRIORITY_LOW_POWER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CONNECTION_PRIORITY_LOW_POWER", - fieldType: "I", - fieldCache: &JNICache.FieldID.CONNECTION_PRIORITY_LOW_POWER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// A remote device connection is congested. - static var GATT_CONNECTION_CONGESTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_CONNECTION_CONGESTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_CONNECTION_CONGESTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Insufficient authentication for a given operation. - static var GATT_INSUFFICIENT_AUTHENTICATION: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_INSUFFICIENT_AUTHENTICATION", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_INSUFFICIENT_AUTHENTICATION, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// A GATT operation failed, errors other than the above - static var GATT_FAILURE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_FAILURE", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_FAILURE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Insufficient encryption for a given operation. - static var GATT_INSUFFICIENT_ENCRYPTION: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_INSUFFICIENT_ENCRYPTION", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_INSUFFICIENT_ENCRYPTION, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// A write operation exceeds the maximum length of the attribute - static var GATT_INVALID_ATTRIBUTE_LENGTH: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_INVALID_ATTRIBUTE_LENGTH", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_INVALID_ATTRIBUTE_LENGTH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// A read or write operation was requested with an invalid offset. - static var GATT_INVALID_OFFSET: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_INVALID_OFFSET", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_INVALID_OFFSET, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// GATT read operation is not permitted. - static var GATT_READ_NOT_PERMITTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_READ_NOT_PERMITTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_READ_NOT_PERMITTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// The given request is not supported. - static var GATT_REQUEST_NOT_SUPPORTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_REQUEST_NOT_SUPPORTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_REQUEST_NOT_SUPPORTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// A GATT operation completed successfully. - static var GATT_SUCCESS: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_SUCCESS", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_SUCCESS, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// GATT write operation is not permitted. - static var GATT_WRITE_NOT_PERMITTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_WRITE_NOT_PERMITTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.GATT_WRITE_NOT_PERMITTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaMethod + open func connect() -> Bool -// Mark: - Methods - -public extension AndroidBluetoothGatt { - - /** - * Cancels a reliable write transaction for a given device. - */ - func abortReliableWrite() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "abortReliableWrite", - methodSig: "()V", - methodCache: &JNICache.MethodID.abortReliableWrite, - args: &__args, - locals: &__locals) - } - - /** - * Initiates a reliable write transaction for a given remote device. - */ - func beginReliableWrite() -> Bool { - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "beginReliableWrite", - methodSig: "()Z", - methodCache: &JNICache.MethodID.beginReliableWrite, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Close this Bluetooth GATT client. - */ - func close() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "close", - methodSig: "()V", - methodCache: &JNICache.MethodID.close, - args: &__args, - locals: &__locals) - } - - /** - * Close this Bluetooth GATT client. - */ - func connect() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "connect", - methodSig: "()Z", - methodCache: &JNICache.MethodID.connect, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Disconnects an established connection, or cancels a connection attempt currently in progress. - */ - func disconnect() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "disconnect", - methodSig: "()V", - methodCache: &JNICache.MethodID.disconnect, - args: &__args, - locals: &__locals) - } - - /** - * Discovers services offered by a remote device as well as their characteristics and descriptors. - */ - func discoverServices() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "discoverServices", - methodSig: "()Z", - methodCache: &JNICache.MethodID.discoverServices, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Executes a reliable write transaction for a given remote device. - */ - func executeReliableWrite() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "executeReliableWrite", - methodSig: "()Z", - methodCache: &JNICache.MethodID.executeReliableWrite, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Return the remote bluetooth device this GATT client targets to. - */ - func getDevice() -> Android.Bluetooth.Device { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDevice", - methodSig: "()Landroid/bluetooth/BluetoothDevice;", - methodCache: &JNICache.MethodID.getDevice, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Device(javaObject: __return) - } - - /** - * Returns a BluetoothGattService, if the requested UUID is supported by the remote device. - */ - func getService(uuid: java_util.UUID) -> Android.Bluetooth.GattService { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getService", - methodSig: "()Landroid/bluetooth/BluetoothGattService;", - methodCache: &JNICache.MethodID.getService, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.GattService(javaObject: __return) - } - - /** - * Returns a list of GATT services offered by the remote device. - */ - @inline(__always) - internal func getServices() -> [AndroidBluetoothGattService] { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServices", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getServices, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - if(__return == nil){ - return [] - } - - let arrayListServices = ArrayList(javaObject: __return) - - if(arrayListServices.size() == 0){ - return [] - } - - var swiftServices = [Android.Bluetooth.GattService]() - - arrayListServices.forEach { item in - let service = Android.Bluetooth.GattService(javaObject: item.javaObject) - swiftServices.append(service) - } - - return swiftServices - } - - /** - * Reads the requested characteristic from the associated remote device. - */ - func readCharacteristic(characteristic: Android.Bluetooth.GattCharacteristic) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: characteristic, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "readCharacteristic", - methodSig: "(Landroid/bluetooth/BluetoothGattCharacteristic;)Z", - methodCache: &JNICache.MethodID.readCharacteristic, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Reads the value for a given descriptor from the associated remote device. - */ - func readDescriptor(descriptor: Android.Bluetooth.GattDescriptor) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: descriptor, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "readDescriptor", - methodSig: "(Landroid/bluetooth/BluetoothGattDescriptor;)Z", - methodCache: &JNICache.MethodID.readDescriptor, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Read the current transmitter PHY and receiver PHY of the connection. - */ - func readPhy() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "readPhy", - methodSig: "()V", - methodCache: &JNICache.MethodID.readPhy, - args: &__args, - locals: &__locals) - } - - /** - * Read the RSSI for a connected remote device. - */ - func readRemoteRssi() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "readRemoteRssi", - methodSig: "()Z", - methodCache: &JNICache.MethodID.readRemoteRssi, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Request a connection parameter update. - */ - func requestConnectionPriority(connectionPriority: Android.Bluetooth.Gatt.ConnectionPriority) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(connectionPriority.rawValue)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "requestConnectionPriority", - methodSig: "(I)Z", - methodCache: &JNICache.MethodID.requestConnectionPriority, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Request an MTU size used for a given connection. - */ - func requestMtu(mtu: Int) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(mtu)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "requestMtu", - methodSig: "(I)Z", - methodCache: &JNICache.MethodID.requestMtu, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Enable or disable notifications/indications for a given characteristic. - */ - func setCharacteristicNotification(characteristic: Android.Bluetooth.GattCharacteristic, enable: Bool) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: characteristic, locals: &__locals), - jvalue(z: jboolean(enable ? JNI_TRUE : JNI_FALSE)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setCharacteristicNotification", - methodSig: "(Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z", - methodCache: &JNICache.MethodID.setCharacteristicNotification, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Set the preferred connection PHY for this app. - */ - func setPreferredPhy(txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, phyOptions: Android.Bluetooth.Gatt.PhyOptions) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(txPhy.rawValue)), - jvalue(i: jint(rxPhy.rawValue)), - jvalue(i: jint(phyOptions.rawValue)) - ] - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setPreferredPhy", - methodSig: "(III)V", - methodCache: &JNICache.MethodID.setPreferredPhy, - args: &__args, - locals: &__locals) - } - - /** - * Writes a given characteristic and its values to the associated remote device. - */ - func writeCharacteristic(characteristic: Android.Bluetooth.GattCharacteristic) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: characteristic, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "writeCharacteristic", - methodSig: "(Landroid/bluetooth/BluetoothGattCharacteristic;)Z", - methodCache: &JNICache.MethodID.writeCharacteristic, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Write the value of a given descriptor to the associated remote device. - */ - func writeDescriptor(descriptor: Android.Bluetooth.GattDescriptor) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: descriptor, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "writeDescriptor", - methodSig: "(Landroid/bluetooth/BluetoothGattDescriptor;)Z", - methodCache: &JNICache.MethodID.writeDescriptor, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} + @JavaMethod + open func setPreferredPhy(_ arg0: Int32, _ arg1: Int32, _ arg2: Int32) -// MARK: - Supporting types - -public extension AndroidBluetoothGatt { - - struct AndroidBluetoothConnectionPriority: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Connection parameter update - Use the connection parameters recommended by the Bluetooth SIG. This is the default value if no connection parameter update is requested. - */ - public static let balanced = Android.Bluetooth.Gatt.ConnectionPriority(rawValue: Android.Bluetooth.Gatt.CONNECTION_PRIORITY_BALANCED) - - /** - * Connection parameter update - Request a high priority, low latency connection. An application should only request high priority connection parameters to transfer - * large amounts of data over LE quickly. Once the transfer is complete, the application should request CONNECTION_PRIORITY_BALANCED connection parameters to reduce energy use. - */ - public static let high = Android.Bluetooth.Gatt.ConnectionPriority(rawValue: Android.Bluetooth.Gatt.CONNECTION_PRIORITY_HIGH) - - /** - * Connection parameter update - Request low power, reduced data rate connection parameters. - */ - public static let lowPower = Android.Bluetooth.Gatt.ConnectionPriority(rawValue: Android.Bluetooth.Gatt.CONNECTION_PRIORITY_LOW_POWER) - } - - struct AndroidBluetoothTxPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY mask. Used to specify LE 1M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe1mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M_MASK) - - /** - * Bluetooth LE 2M PHY mask. Used to specify LE 2M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe2mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_2M_MASK) - - /** - * Bluetooth LE Coded PHY mask. Used to specify LE Coded Physical Channel as one of many available options in a bitmask. - */ - public static let phyLecodedMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED_MASK) - } - - struct AndroidBluetoothRxPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY mask. Used to specify LE 1M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe1mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M_MASK) - - /** - * Bluetooth LE 2M PHY mask. Used to specify LE 2M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe2mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_2M_MASK) - - /** - * Bluetooth LE Coded PHY mask. Used to specify LE Coded Physical Channel as one of many available options in a bitmask. - */ - public static let phyLecodedMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED_MASK) - } - - struct AndroidBluetoothPhyOptions: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * No preferred coding when transmitting on the LE Coded PHY. - */ - public static let noPreferred = Android.Bluetooth.Gatt.PhyOptions(rawValue: Android.Bluetooth.Device.PHY_OPTION_NO_PREFERRED) - - /** - * Prefer the S=2 coding to be used when transmitting on the LE Coded PHY. - */ - public static let optionS2 = Android.Bluetooth.Gatt.PhyOptions(rawValue: Android.Bluetooth.Device.PHY_OPTION_S2) - - /** - * Prefer the S=8 coding to be used when transmitting on the LE Coded PHY. - */ - public static let optionS8 = Android.Bluetooth.Gatt.PhyOptions(rawValue: Android.Bluetooth.Device.PHY_OPTION_S8) - } - - struct AndroidBluetoothGattStatus: RawRepresentable, Equatable, Error { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * A remote device connection is congested. - */ - public static let connectionCongested = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_CONNECTION_CONGESTED) - - /** - * A GATT operation failed, errors other than the above - */ - public static let failure = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_FAILURE) - - /** - * Insufficient authentication for a given operation - */ - public static let insufficientAuthentication = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_INSUFFICIENT_AUTHENTICATION) - - /** - * Insufficient encryption for a given operation - */ - public static let insufficientEncryption = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_INSUFFICIENT_ENCRYPTION) - - /** - * A write operation exceeds the maximum length of the attribute - */ - public static let invalidAttibuteLength = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_INVALID_ATTRIBUTE_LENGTH) - - /** - * A read or write operation was requested with an invalid offset - */ - public static let invalidOffset = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_INVALID_OFFSET) - - /** - * GATT read operation is not permitted - */ - public static let readNotPermitted = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_READ_NOT_PERMITTED) - - /** - * The given request is not supported - */ - public static let requestNotSupported = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_REQUEST_NOT_SUPPORTED) - - /** - * A GATT operation completed successfully - */ - public static let success = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_SUCCESS) - - /** - * GATT write operation is not permitted - */ - public static let writeNotPermitted = Android.Bluetooth.Gatt.Status(rawValue: Android.Bluetooth.Gatt.GATT_WRITE_NOT_PERMITTED) - } -} + @JavaMethod + open func readPhy() + + @JavaMethod + open func getDevice() -> BluetoothDevice! + + @JavaMethod + open func discoverServices() -> Bool + + @JavaMethod + open func getServices() -> List! + + @JavaMethod + open func getService(_ arg0: UUID?) -> BluetoothGattService! + + @JavaMethod + open func readCharacteristic(_ arg0: BluetoothGattCharacteristic?) -> Bool + + @JavaMethod + open func readDescriptor(_ arg0: BluetoothGattDescriptor?) -> Bool + + @JavaMethod + open func writeDescriptor(_ arg0: BluetoothGattDescriptor?, _ arg1: [Int8]) -> Int32 + + @JavaMethod + open func writeDescriptor(_ arg0: BluetoothGattDescriptor?) -> Bool -// MARK: - JNICache - -internal extension AndroidBluetoothGatt { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothGatt"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var CONNECTION_PRIORITY_BALANCED: jfieldID? - static var CONNECTION_PRIORITY_HIGH: jfieldID? - static var CONNECTION_PRIORITY_LOW_POWER: jfieldID? - static var GATT_CONNECTION_CONGESTED: jfieldID? - static var GATT_FAILURE: jfieldID? - static var GATT_INSUFFICIENT_AUTHENTICATION: jfieldID? - static var GATT_INSUFFICIENT_ENCRYPTION: jfieldID? - static var GATT_INVALID_ATTRIBUTE_LENGTH: jfieldID? - static var GATT_INVALID_OFFSET: jfieldID? - static var GATT_READ_NOT_PERMITTED: jfieldID? - static var GATT_REQUEST_NOT_SUPPORTED: jfieldID? - static var GATT_SUCCESS: jfieldID? - static var GATT_WRITE_NOT_PERMITTED: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var abortReliableWrite: jmethodID? - static var abortReliableWrite2: jmethodID? - static var beginReliableWrite: jmethodID? - static var close: jmethodID? - static var connect: jmethodID? - static var disconnect: jmethodID? - static var discoverServices: jmethodID? - static var executeReliableWrite: jmethodID? - static var getConnectedDevices: jmethodID? // Not supported - static var getConnectionState: jmethodID? // Not supported - static var getDevice: jmethodID? - static var getDevicesMatchingConnectionStates: jmethodID? // Not supported - static var getService: jmethodID? - static var getServices: jmethodID? - static var readCharacteristic: jmethodID? - static var readDescriptor: jmethodID? - static var readPhy: jmethodID? - static var readRemoteRssi: jmethodID? - static var requestConnectionPriority: jmethodID? - static var requestMtu: jmethodID? - static var setCharacteristicNotification: jmethodID? - static var setPreferredPhy: jmethodID? - static var writeCharacteristic: jmethodID? - static var writeDescriptor: jmethodID? - } - } + @JavaMethod + open func beginReliableWrite() -> Bool + + @JavaMethod + open func abortReliableWrite(_ arg0: BluetoothDevice?) + + @JavaMethod + open func abortReliableWrite() + + @JavaMethod + open func readRemoteRssi() -> Bool + + @JavaMethod + open func requestMtu(_ arg0: Int32) -> Bool + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open func writeCharacteristic(_ arg0: BluetoothGattCharacteristic?, _ arg1: [Int8], _ arg2: Int32) -> Int32 + + @JavaMethod + open func writeCharacteristic(_ arg0: BluetoothGattCharacteristic?) -> Bool + + @JavaMethod + open func executeReliableWrite() -> Bool + + @JavaMethod + open func setCharacteristicNotification(_ arg0: BluetoothGattCharacteristic?, _ arg1: Bool) -> Bool + + @JavaMethod + open func requestConnectionPriority(_ arg0: Int32) -> Bool + + @JavaMethod + open func close() } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CONNECTION_PRIORITY_BALANCED: Int32 + + @JavaStaticField(isFinal: true) + public var CONNECTION_PRIORITY_DCK: Int32 + + @JavaStaticField(isFinal: true) + public var CONNECTION_PRIORITY_HIGH: Int32 + @JavaStaticField(isFinal: true) + public var CONNECTION_PRIORITY_LOW_POWER: Int32 + @JavaStaticField(isFinal: true) + public var GATT_CONNECTION_CONGESTED: Int32 + @JavaStaticField(isFinal: true) + public var GATT_CONNECTION_TIMEOUT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_INSUFFICIENT_AUTHENTICATION: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_INSUFFICIENT_AUTHORIZATION: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_INSUFFICIENT_ENCRYPTION: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_INVALID_ATTRIBUTE_LENGTH: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_INVALID_OFFSET: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_READ_NOT_PERMITTED: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_REQUEST_NOT_SUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SUCCESS: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_WRITE_NOT_PERMITTED: Int32 + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothGattCallback.swift b/Sources/AndroidBluetooth/BluetoothGattCallback.swift index 7493c4c..5661ea2 100644 --- a/Sources/AndroidBluetooth/BluetoothGattCallback.swift +++ b/Sources/AndroidBluetooth/BluetoothGattCallback.swift @@ -1,540 +1,57 @@ -// -// BluetoothGattCallback.swift -// Android -// -// Created by Marco Estrella on 6/7/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime -import Foundation -import java_swift -import java_util -import JNI -import Android +@JavaClass("android.bluetooth.BluetoothGattCallback") +open class BluetoothGattCallback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) -public extension Android.Bluetooth { - - typealias GattCallback = AndroidBluetoothGattCallback -} - -/// his abstract class is used to implement BluetoothGatt callbacks. -open class AndroidBluetoothGattCallback: JavaObject { - - public required init(javaObject: jobject?) { - super.init(javaObject: javaObject) - } - - public convenience init?( casting object: JavaObject, _ file: StaticString = #file, _ line: Int = #line ) { - self.init( javaObject: nil ) - object.withJavaObject { - self.javaObject = $0 - } - } - - /// Create a Swift-owned Java Object. - public convenience init() { - - self.init(javaObject: nil) - bindNewJavaObject() - } - - /// Initialize a new Java instance and bind to this Swift object. - public func bindNewJavaObject() { - - let hasOldJavaObject = javaObject != nil - - /// Release old swift value. - if hasOldJavaObject { - - try! finalize() - } - - var locals = [jobject]() - - var args: [jvalue] = [self.swiftValue()] - - // returned objects are always local refs - guard let __object: jobject = JNIMethod.NewObject(className: JNICache.className, - classObject: JNICache.jniClass, - methodSig: "(J)V", - methodCache: &JNICache.MethodID.new_method, - args: &args, - locals: &locals ) - else { fatalError("Could not initialize \(className)") } - - self.javaObject = __object // dereference old value, add global ref for new value - - JNI.DeleteLocalRef( __object ) // delete local ref - } - - open func onCharacteristicChanged(gatt: Android.Bluetooth.Gatt, characteristic: Android.Bluetooth.GattCharacteristic) {} - - open func onCharacteristicRead(gatt: Android.Bluetooth.Gatt, characteristic: Android.Bluetooth.GattCharacteristic, status: Android.Bluetooth.Gatt.Status) {} - - open func onCharacteristicWrite(gatt: Android.Bluetooth.Gatt, characteristic: Android.Bluetooth.GattCharacteristic, status: Android.Bluetooth.Gatt.Status) {} - - open func onConnectionStateChange(gatt: Android.Bluetooth.Gatt, status: Android.Bluetooth.Gatt.Status, newState: Android.Bluetooth.Device.State) {} - - open func onDescriptorRead(gatt: Android.Bluetooth.Gatt, descriptor: Android.Bluetooth.GattDescriptor, status: Android.Bluetooth.Gatt.Status) {} - - open func onDescriptorWrite(gatt: Android.Bluetooth.Gatt, descriptor: Android.Bluetooth.GattDescriptor, status: Android.Bluetooth.Gatt.Status) {} - - open func onMtuChanged(gatt: Android.Bluetooth.Gatt, mtu: Int, status: Android.Bluetooth.Gatt.Status) {} - - open func onPhyRead(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: Android.Bluetooth.Gatt.Status) {} - - open func onPhyUpdate(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: Android.Bluetooth.Gatt.Status) {} - - open func onReadRemoteRssi(gatt: Android.Bluetooth.Gatt, rssi: Int, status: Android.Bluetooth.Gatt.Status) {} - - open func onReliableWriteCompleted(gatt: Android.Bluetooth.Gatt, status: Android.Bluetooth.Gatt.Status) {} - - open func onServicesDiscovered(gatt: Android.Bluetooth.Gatt, status: Android.Bluetooth.Gatt.Status) {} -} - -extension AndroidBluetoothGattCallback: JNIListener { } - -fileprivate extension AndroidBluetoothGattCallback { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.className(["SwiftBluetoothGattCallback"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - static var jniClassConstants: jclass? - - /// JNI Java class - static let jniClass: jclass = { - - var natives = [JNINativeMethod]() - - //onCharacteristicChanged - let OnCharacteristicChangedSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .object(Android.Bluetooth.GattCharacteristic.JNICache.classSignature) - ], returnType: .void) - - let OnCharacteristicChanged: AndroidBluetoothGattCallback_OnCharacteristicChanged_Type = AndroidBluetoothGattCallback_onCharacteristicChanged - - natives.append( JNINativeMethod(name: strdup("__onCharacteristicChanged"), - signature: strdup(OnCharacteristicChangedSignature.rawValue), - fnPtr: unsafeBitCast( OnCharacteristicChanged, to: UnsafeMutableRawPointer.self ) )) - - //onCharacteristicRead - let OnCharacteristicReadSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .object(Android.Bluetooth.GattCharacteristic.JNICache.classSignature), - .int - ], returnType: .void) - - let onCharacteristicRead: AndroidBluetoothGattCallback_OnCharacteristicRead_Type = AndroidBluetoothGattCallback_onCharacteristicRead - - natives.append( JNINativeMethod(name: strdup("__onCharacteristicRead"), - signature: strdup(OnCharacteristicReadSignature.rawValue), - fnPtr: unsafeBitCast( onCharacteristicRead, to: UnsafeMutableRawPointer.self ) )) - - //onCharacteristicWrite - let onCharacteristicWriteSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .object(Android.Bluetooth.GattCharacteristic.JNICache.classSignature), - .int - ], returnType: .void) - - let onCharacteristicWrite: AndroidBluetoothGattCallback_OnCharacteristicWrite_Type = AndroidBluetoothGattCallback_onCharacteristicWrite - - natives.append( JNINativeMethod(name: strdup("__onCharacteristicWrite"), - signature: strdup(onCharacteristicWriteSignature.rawValue), - fnPtr: unsafeBitCast( onCharacteristicWrite, to: UnsafeMutableRawPointer.self ) )) - - //onConnectionStateChange - let onConnectionStateChangeSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int, - .int - ], returnType: .void) - - let onConnectionStateChange: AndroidBluetoothGattCallback_OnConnectionStateChange_Type = AndroidBluetoothGattCallback_onConnectionStateChange - - natives.append( JNINativeMethod(name: strdup("__onConnectionStateChange"), - signature: strdup(onConnectionStateChangeSignature.rawValue), - fnPtr: unsafeBitCast( onConnectionStateChange, to: UnsafeMutableRawPointer.self ) )) - - //onDescriptorRead - let onDescriptorReadSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .object(Android.Bluetooth.GattDescriptor.JNICache.classSignature), - .int - ], returnType: .void) - - let onDescriptorRead: AndroidBluetoothGattCallback_OnDescriptorRead_Type = AndroidBluetoothGattCallback_onDescriptorRead - - natives.append( JNINativeMethod(name: strdup("__onDescriptorRead"), - signature: strdup(onDescriptorReadSignature.rawValue), - fnPtr: unsafeBitCast( onDescriptorRead, to: UnsafeMutableRawPointer.self ) )) - - //onDescriptorWrite - let onDescriptorWriteSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .object(Android.Bluetooth.GattDescriptor.JNICache.classSignature), - .int - ], returnType: .void) - - let onDescriptorWrite: AndroidBluetoothGattCallback_OnDescriptorWrite_Type = AndroidBluetoothGattCallback_onDescriptorWrite - - natives.append( JNINativeMethod(name: strdup("__onDescriptorWrite"), - signature: strdup(onDescriptorWriteSignature.rawValue), - fnPtr: unsafeBitCast( onDescriptorWrite, to: UnsafeMutableRawPointer.self ) )) - - //onMtuChanged - let onMtuChangedSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int, - .int - ], returnType: .void) - - let onMtuChanged: AndroidBluetoothGattCallback_OnMtuChanged_Type = AndroidBluetoothGattCallback_onMtuChanged - - natives.append( JNINativeMethod(name: strdup("__onMtuChanged"), - signature: strdup(onMtuChangedSignature.rawValue), - fnPtr: unsafeBitCast( onMtuChanged, to: UnsafeMutableRawPointer.self ) )) - - //onPhyRead - let onPhyReadSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int, - .int, - .int - ], returnType: .void) - - let onPhyRead: AndroidBluetoothGattCallback_OnPhyRead_Type = AndroidBluetoothGattCallback_onPhyRead - - natives.append( JNINativeMethod(name: strdup("__onPhyRead"), - signature: strdup(onPhyReadSignature.rawValue), - fnPtr: unsafeBitCast( onPhyRead, to: UnsafeMutableRawPointer.self ) )) - - //onPhyUpdate - - let onPhyUpdateSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int, - .int, - .int - ], returnType: .void) - - let onPhyUpdate: AndroidBluetoothGattCallback_OnPhyUpdate_Type = AndroidBluetoothGattCallback_onPhyUpdate - - natives.append( JNINativeMethod(name: strdup("__onPhyUpdate"), - signature: strdup(onPhyUpdateSignature.rawValue), - fnPtr: unsafeBitCast( onPhyUpdate, to: UnsafeMutableRawPointer.self ) )) - - //onReadRemoteRssi - let onReadRemoteRssiSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int, - .int - ], returnType: .void) - - let onReadRemoteRssi: AndroidBluetoothGattCallback_OnReadRemoteRssi_Type = AndroidBluetoothGattCallback_onReadRemoteRssi - - natives.append( JNINativeMethod(name: strdup("__onReadRemoteRssi"), - signature: strdup(onReadRemoteRssiSignature.rawValue), - fnPtr: unsafeBitCast( onReadRemoteRssi, to: UnsafeMutableRawPointer.self ) )) - - //onReliableWriteCompleted - let onReliableWriteCompletedSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int - ], returnType: .void) - - let onReliableWriteCompleted: AndroidBluetoothGattCallback_OnReliableWriteCompleted_Type = AndroidBluetoothGattCallback_onReliableWriteCompleted - - natives.append( JNINativeMethod(name: strdup("__onReliableWriteCompleted"), - signature: strdup(onReliableWriteCompletedSignature.rawValue), - fnPtr: unsafeBitCast( onReliableWriteCompleted, to: UnsafeMutableRawPointer.self ) )) - - //onServicesDiscovered - let onServicesDiscoveredSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.Gatt.JNICache.classSignature), - .int - ], returnType: .void) - - let onServicesDiscovered: AndroidBluetoothGattCallback_OnServicesDiscovered_Type = AndroidBluetoothGattCallback_onServicesDiscovered - - natives.append( JNINativeMethod(name: strdup("__onServicesDiscovered"), - signature: strdup(onServicesDiscoveredSignature.rawValue), - fnPtr: unsafeBitCast( onServicesDiscovered, to: UnsafeMutableRawPointer.self ) )) - - let clazz = JNI.FindClass( className ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - /// JNI Method ID cache - struct MethodID { - - static var new_method: jmethodID? - } - } -} - -// MARK: - Private Methods - -private typealias AndroidBluetoothGattCallback_OnCharacteristicChanged_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jobject?) -> () - -private func AndroidBluetoothGattCallback_onCharacteristicChanged( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ characteristicParam: jobject?) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let characteristic = Android.Bluetooth.GattCharacteristic(javaObject: characteristicParam) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onCharacteristicChanged(gatt: gatt, characteristic: characteristic) -} - -private typealias AndroidBluetoothGattCallback_OnCharacteristicRead_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jobject?, _: jint) -> () - -private func AndroidBluetoothGattCallback_onCharacteristicRead( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ characteristicParam: jobject?, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let characteristic = Android.Bluetooth.GattCharacteristic(javaObject: characteristicParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onCharacteristicRead(gatt: gatt, characteristic: characteristic, status: status) -} - -private typealias AndroidBluetoothGattCallback_OnCharacteristicWrite_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jobject?, _: jint) -> () + @JavaMethod + open func onMtuChanged(_ arg0: BluetoothGatt?, _ arg1: Int32, _ arg2: Int32) -private func AndroidBluetoothGattCallback_onCharacteristicWrite( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ characteristicParam: jobject?, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let characteristic = Android.Bluetooth.GattCharacteristic(javaObject: characteristicParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onCharacteristicWrite(gatt: gatt, characteristic: characteristic, status: status) -} - -private typealias AndroidBluetoothGattCallback_OnConnectionStateChange_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint) -> () - -private func AndroidBluetoothGattCallback_onConnectionStateChange( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ statusParam: jint, - _ newStateParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - let newState = Android.Bluetooth.Device.State(rawValue: Int(newStateParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onConnectionStateChange(gatt: gatt, status: status, newState: newState) -} - -private typealias AndroidBluetoothGattCallback_OnDescriptorRead_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jobject?, _: jint) -> () - -private func AndroidBluetoothGattCallback_onDescriptorRead( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ descriptorParam: jobject?, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let descriptor = Android.Bluetooth.GattDescriptor(javaObject: descriptorParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onDescriptorRead(gatt: gatt, descriptor: descriptor, status: status) -} + @JavaMethod + open func onPhyUpdate(_ arg0: BluetoothGatt?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) -private typealias AndroidBluetoothGattCallback_OnDescriptorWrite_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jobject?, _: jint) -> () + @JavaMethod + open func onPhyRead(_ arg0: BluetoothGatt?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) -private func AndroidBluetoothGattCallback_onDescriptorWrite( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ descriptorParam: jobject?, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let descriptor = Android.Bluetooth.GattDescriptor(javaObject: descriptorParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onDescriptorWrite(gatt: gatt, descriptor: descriptor, status: status) -} + @JavaMethod + open func onDescriptorRead(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattDescriptor?, _ arg2: Int32) -private typealias AndroidBluetoothGattCallback_OnMtuChanged_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint) -> () + @JavaMethod + open func onDescriptorRead(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattDescriptor?, _ arg2: Int32, _ arg3: [Int8]) -private func AndroidBluetoothGattCallback_onMtuChanged( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ mtuParam: jint, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let mtu = Int(mtuParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onMtuChanged(gatt: gatt, mtu: mtu, status: status) -} + @JavaMethod + open func onDescriptorWrite(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattDescriptor?, _ arg2: Int32) -private typealias AndroidBluetoothGattCallback_OnPhyRead_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint, _: jint) -> () + @JavaMethod + open func onReadRemoteRssi(_ arg0: BluetoothGatt?, _ arg1: Int32, _ arg2: Int32) -private func AndroidBluetoothGattCallback_onPhyRead( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ txPhyParam: jint, - _ rxPhyParam: jint, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let txPhy = Android.Bluetooth.Gatt.TxPhy(rawValue: Int(txPhyParam)) - - let rxPhy = Android.Bluetooth.Gatt.RxPhy(rawValue: Int(rxPhyParam)) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onPhyRead(gatt: gatt, txPhy: txPhy, rxPhy: rxPhy, status: status) -} + @JavaMethod + open func onServiceChanged(_ arg0: BluetoothGatt?) -private typealias AndroidBluetoothGattCallback_OnPhyUpdate_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint, _: jint) -> () + @JavaMethod + open func onConnectionStateChange(_ arg0: BluetoothGatt?, _ arg1: Int32, _ arg2: Int32) -private func AndroidBluetoothGattCallback_onPhyUpdate( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ txPhyParam: jint, - _ rxPhyParam: jint, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let txPhy = Android.Bluetooth.Gatt.TxPhy(rawValue: Int(txPhyParam)) - - let rxPhy = Android.Bluetooth.Gatt.RxPhy(rawValue: Int(rxPhyParam)) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onPhyUpdate(gatt: gatt, txPhy: txPhy, rxPhy: rxPhy, status: status) -} + @JavaMethod + open func onServicesDiscovered(_ arg0: BluetoothGatt?, _ arg1: Int32) -private typealias AndroidBluetoothGattCallback_OnReadRemoteRssi_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint) -> () + @JavaMethod + open func onCharacteristicRead(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattCharacteristic?, _ arg2: [Int8], _ arg3: Int32) -private func AndroidBluetoothGattCallback_onReadRemoteRssi( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ rssiParam: jint, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let rssi = Int(rssiParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onReadRemoteRssi(gatt: gatt, rssi: rssi, status: status) -} - -private typealias AndroidBluetoothGattCallback_OnReliableWriteCompleted_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint) -> () + @JavaMethod + open func onCharacteristicRead(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattCharacteristic?, _ arg2: Int32) -private func AndroidBluetoothGattCallback_onReliableWriteCompleted( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) + @JavaMethod + open func onCharacteristicWrite(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattCharacteristic?, _ arg2: Int32) - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onReliableWriteCompleted(gatt: gatt, status: status) -} + @JavaMethod + open func onCharacteristicChanged(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattCharacteristic?) -private typealias AndroidBluetoothGattCallback_OnServicesDiscovered_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint) -> () + @JavaMethod + open func onCharacteristicChanged(_ arg0: BluetoothGatt?, _ arg1: BluetoothGattCharacteristic?, _ arg2: [Int8]) -private func AndroidBluetoothGattCallback_onServicesDiscovered( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ gattParam: jobject?, - _ statusParam: jint) -> () { - let gatt = Android.Bluetooth.Gatt(javaObject: gattParam) - - let status = Android.Bluetooth.Gatt.Status(rawValue: Int(statusParam)) - - AndroidBluetoothGattCallback - .swiftObject(from: __swiftObject)? - .onServicesDiscovered(gatt: gatt, status: status) + @JavaMethod + open func onReliableWriteCompleted(_ arg0: BluetoothGatt?, _ arg1: Int32) } diff --git a/Sources/AndroidBluetooth/BluetoothGattCharacteristic.swift b/Sources/AndroidBluetooth/BluetoothGattCharacteristic.swift index dd9ba7b..ad54b7e 100644 --- a/Sources/AndroidBluetooth/BluetoothGattCharacteristic.swift +++ b/Sources/AndroidBluetooth/BluetoothGattCharacteristic.swift @@ -1,1149 +1,163 @@ -// -// BluetoothGattCharacteristic.swift -// Android -// -// Created by Marco Estrella on 5/31/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaUtil -import Foundation -import java_swift -import java_util -import Android +@JavaClass("android.bluetooth.BluetoothGattCharacteristic", implements: Parcelable.self) +open class BluetoothGattCharacteristic: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: UUID?, _ arg1: Int32, _ arg2: Int32, environment: JNIEnvironment? = nil) -public extension Android.Bluetooth { - - typealias GattCharacteristic = AndroidBluetoothGattCharacteristic -} + @JavaMethod + open func addDescriptor(_ arg0: BluetoothGattDescriptor?) -> Bool -public extension Android.Bluetooth.GattCharacteristic { - - typealias FormatType = AndroidBluetoothFormatType - typealias Permission = AndroidBluetoothPermission - typealias Property = AndroidBluetoothProperty - typealias WriteType = AndroidBluetoothWriteType -} + @JavaMethod + open func getWriteType() -> Int32 + @JavaMethod + open func setWriteType(_ arg0: Int32) -/** - * Represents a Bluetooth GATT Characteristic - * - * A GATT characteristic is a basic data element used to construct a GATT service, BluetoothGattService. The characteristic contains a value - * as well as additional information and optional GATT descriptors, BluetoothGattDescriptor. - */ -public final class AndroidBluetoothGattCharacteristic: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} + @JavaMethod + open func getIntValue(_ arg0: Int32, _ arg1: Int32) -> JavaInteger! -// MARK: Constants + @JavaMethod + open func getFloatValue(_ arg0: Int32, _ arg1: Int32) -> JavaFloat! -public extension AndroidBluetoothGattCharacteristic { - - /// Characteristic value format type float (32-bit float) - static var FORMAT_FLOAT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_FLOAT", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_FLOAT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type sfloat (16-bit float) - static var FORMAT_SFLOAT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_SFLOAT", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_SFLOAT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type sint16 - static var FORMAT_SINT16: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_SINT16", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_SINT16, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type sint32 - static var FORMAT_SINT32: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_SINT32", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_SINT32, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type sint8 - static var FORMAT_SINT8: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_SINT8", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_SINT8, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type uint16 - static var FORMAT_UINT16: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_UINT16", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_UINT16, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type uint32 - static var FORMAT_UINT32: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_UINT32", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_UINT32, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic value format type uint8 - static var FORMAT_UINT8: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "FORMAT_UINT8", - fieldType: "I", - fieldCache: &JNICache.FieldID.FORMAT_UINT8, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic read permission - static var PERMISSION_READ: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_READ", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_READ, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic permission: Allow encrypted read operations - static var PERMISSION_READ_ENCRYPTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_READ_ENCRYPTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_READ_ENCRYPTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic permission: Allow reading with man-in-the-middle protection - static var PERMISSION_READ_ENCRYPTED_MITM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_READ_ENCRYPTED_MITM", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_READ_ENCRYPTED_MITM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic write permission - static var PERMISSION_WRITE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic permission: Allow encrypted writes - static var PERMISSION_WRITE_ENCRYPTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_ENCRYPTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_ENCRYPTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic permission: Allow encrypted writes with man-in-the-middle protection - static var PERMISSION_WRITE_ENCRYPTED_MITM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_ENCRYPTED_MITM", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_ENCRYPTED_MITM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic permission: Allow signed write operations - static var PERMISSION_WRITE_SIGNED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_SIGNED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_SIGNED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic permission: Allow signed write operations with man-in-the-middle protection. - static var PERMISSION_WRITE_SIGNED_MITM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_SIGNED_MITM", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_SIGNED_MITM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic proprty: Characteristic is broadcastable. - static var PROPERTY_BROADCAST: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_BROADCAST", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_BROADCAST, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic has extended properties. - static var PROPERTY_EXTENDED_PROPS: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_EXTENDED_PROPS", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_EXTENDED_PROPS, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic supports indication. - static var PROPERTY_INDICATE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_INDICATE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_INDICATE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic supports notification. - static var PROPERTY_NOTIFY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_NOTIFY", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_NOTIFY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic is readable. - static var PROPERTY_READ: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_READ", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_READ, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic supports write with signature. - static var PROPERTY_SIGNED_WRITE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_SIGNED_WRITE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_SIGNED_WRITE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic can be written. - static var PROPERTY_WRITE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_WRITE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_WRITE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Characteristic property: Characteristic can be written without response. - static var PROPERTY_WRITE_NO_RESPONSE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PROPERTY_WRITE_NO_RESPONSE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PROPERTY_WRITE_NO_RESPONSE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Write characteristic, requesting acknoledgement by the remote device. - static var WRITE_TYPE_DEFAULT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WRITE_TYPE_DEFAULT", fieldType: "I", - fieldCache: &JNICache.FieldID.WRITE_TYPE_DEFAULT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Write characteristic without requiring a response by the remote device - static var WRITE_TYPE_NO_RESPONSE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WRITE_TYPE_NO_RESPONSE", - fieldType: "I", - fieldCache: &JNICache.FieldID.WRITE_TYPE_NO_RESPONSE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Write characteristic including authentication signature. - static var WRITE_TYPE_SIGNED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "WRITE_TYPE_SIGNED", - fieldType: "I", - fieldCache: &JNICache.FieldID.WRITE_TYPE_SIGNED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaMethod + open func getStringValue(_ arg0: Int32) -> String -// MARK: Methods + @JavaMethod + open func describeContents() -> Int32 -public extension AndroidBluetoothGattCharacteristic { - - /** - * Adds a descriptor to this characteristic. - */ - func addDescriptor(descriptor: Android.Bluetooth.GattDescriptor) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: descriptor, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "addDescriptor", - methodSig: "(Landroid/bluetooth/BluetoothGattDescriptor;)Z", - methodCache: &JNICache.MethodID.addDescriptor, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Returns a descriptor with a given UUID out of the list of descriptors for this characteristic. - */ - func getDescriptor(uuid: java_util.UUID) -> Android.Bluetooth.GattDescriptor? { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDescriptor", - methodSig: "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattDescriptor;", - methodCache: &JNICache.MethodID.getDescriptor, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return __return != nil ? Android.Bluetooth.GattDescriptor(javaObject: __return) : nil - } - - /** - * Returns a list of descriptors for this characteristic. - */ - func getDescriptors() -> [Android.Bluetooth.GattDescriptor] { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDescriptors", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getDescriptors, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - let list = ListForward(javaObject: __return) - - return (list.toArray() ?? []).map { - Android.Bluetooth.GattDescriptor(casting: $0)! - } - } - - /** - * Return the stored value of this characteristic. - */ - func getFloatValue(formatType: FormatType, offset: Int) -> Float { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(formatType.rawValue)), - jvalue(i: jint(offset)) - ] - - let __return = JNIMethod.CallFloatMethod(object: javaObject, - methodName: "getFloatValue", - methodSig: "(II)F", - methodCache: &JNICache.MethodID.getFloatValue, - args: &__args, - locals: &__locals) - return __return - } - - /** - * Returns the instance ID for this characteristic. - */ - func getInstanceId() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getInstanceId", - methodSig: "()I", - methodCache: &JNICache.MethodID.getInstanceId, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Return the stored value of this characteristic. - * - * The formatType parameter determines how the characteristic value is to be interpreted. For example, - * settting formatType to FORMAT_UINT16 specifies that the first two bytes of the characteristic value - * at the given offset are interpreted to generate the return value. - */ - func getIntValue(formatType: FormatType, offset: Int) -> Int { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(formatType.rawValue)), - jvalue(i: jint(offset)) - ] - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getIntValue", - methodSig: "(II)I", - methodCache: &JNICache.MethodID.getIntValue, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Returns the permissions for this characteristic. - */ - func getPermissions() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getPermissions", - methodSig: "()I", - methodCache: &JNICache.MethodID.getPermissions, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Returns the properties of this characteristic. - * - * The properties contain a bit mask of property flags indicating the features of this characteristic. - */ - func getProperties() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getProperties", - methodSig: "()I", - methodCache: &JNICache.MethodID.getProperties, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Returns the service this characteristic belongs to. - */ - func getService() -> Android.Bluetooth.GattService { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getService", - methodSig: "()Landroid/bluetooth/BluetoothGattService;", - methodCache: &JNICache.MethodID.getService, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.GattService(javaObject: __return) - } - - /** - * Return the stored value of this characteristic. - */ - func getStringValue(offSet: Int) -> String { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(offSet)) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getStringValue", - methodSig: "(I)Ljava/lang/String;", - methodCache: &JNICache.MethodID.getStringValue, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return String(javaObject: __return) - } - - /** - * Returns the UUID of this characteristic. - */ - func getUUID() -> java_util.UUID { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getUuid", - methodSig: "()Ljava/util/UUID;", - methodCache: &JNICache.MethodID.getUuid, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - return java_util.UUID(javaObject: __return) - } - - /** - * Get the stored value for this characteristic. - * - * This function returns the stored value for this characteristic as retrieved by calling readCharacteristic(BluetoothGattCharacteristic). - * The cached value of the characteristic is updated as a result of a read characteristic operation or if a characteristic update notification has been received. - */ - func getValue() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getValue", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getValue, - args: &__args, - locals: &__locals) - - if __return != nil { - - guard let from: jobject = __return - else { return nil } - - defer { JNI.DeleteLocalRef( from ) } - - let length: jsize = JNI.api.GetArrayLength( JNI.env, from ) - - if length == 0 { return [] } - - var value = [Int8]( repeating: Int8(), count: Int(length) ) - - withUnsafeMutablePointer(to: &value[0]) { valuePtr in - JNI.api.GetByteArrayRegion( JNI.env, from, 0, length, valuePtr ) - } - - return value - } else { - - return nil - } - } - - /** - * Gets the write type for this characteristic. - */ - func getWriteType() -> WriteType { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getWriteType", - methodSig: "()I", - methodCache: &JNICache.MethodID.getWriteType, - args: &__args, - locals: &__locals) - return WriteType(rawValue: Int(__return)) - } - - /** - * Set the locally stored value of this characteristic. - * - * See setValue(byte[]) for details. - */ - func setValue(value: String) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: value, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setValue", - methodSig: "(Ljava/lang/String;)Z", - methodCache: &JNICache.MethodID.setValue, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Set the locally stored value of this characteristic. - * - * See setValue(byte[]) for details. - */ - func setValue(value: Int, formatType: FormatType, offset: Int) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(value)), - jvalue(i: jint(formatType.rawValue)), - jvalue(i: jint(offset)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setValue", - methodSig: "(III)Z", - methodCache: &JNICache.MethodID.setValue2, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Updates the locally stored value of this characteristic. - * - * This function modifies the locally stored cached value of this characteristic. To send the value to the remote device, - * call writeCharacteristic(BluetoothGattCharacteristic) to send the value to the remote device. - */ - func setValue(value: [Int8]) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: value, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setValue", - methodSig: "([B)Z", - methodCache: &JNICache.MethodID.setValue3, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Set the locally stored value of this characteristic. - * - * See setValue(byte[]) for details. - */ - func setValue(mantissa: Int, exponent: Int, formatType: FormatType, offset: Int) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(mantissa)), - jvalue(i: jint(exponent)), - jvalue(i: jint(formatType.rawValue)), - jvalue(i: jint(offset)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setValue", - methodSig: "(IIII)Z", - methodCache: &JNICache.MethodID.setValue4, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Set the write type for this characteristic - * - * Setting the write type of a characteristic determines how the writeCharacteristic(BluetoothGattCharacteristic) function write this characteristic. - */ - func setWriteType(writeType: WriteType) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(writeType.rawValue)) - ] - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setWriteType", - methodSig: "(I)V", - methodCache: &JNICache.MethodID.setWriteType, - args: &__args, - locals: &__locals) - } -} + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) -// MARK: - Supporting types + @JavaMethod + open func getDescriptors() -> List! -public extension AndroidBluetoothGattCharacteristic { - - struct AndroidBluetoothPermission: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int){ - self.rawValue = rawValue - } - - /** - * Characteristic read permission. - */ - public static let read = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_READ) - - /** - * Characteristic permission: Allow encrypted read operations. - */ - public static let readEncrypted = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_READ_ENCRYPTED) - - /** - * Characteristic permission: Allow reading with man-in-the-middle protection. - */ - public static let readEncryptedMITM = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_READ_ENCRYPTED_MITM) - - /** - * Characteristic write permission. - */ - public static let write = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_WRITE) - - /** - * Characteristic permission: Allow encrypted writes. - */ - public static let writeEncrypted = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED) - - /** - * Characteristic permission: Allow encrypted writes with man-in-the-middle protection. - */ - public static let writeEncryptedMITM = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED_MITM) - - /** - * Characteristic permission: Allow signed write operations. - */ - public static let writeSigned = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_WRITE_SIGNED) - - /** - * Characteristic permission: Allow signed write operations with man-in-the-middle protection. - */ - public static let writeSignedMITM = AndroidBluetoothGattCharacteristic.Permission(rawValue: AndroidBluetoothGattCharacteristic.PERMISSION_WRITE_SIGNED_MITM) - } - - struct AndroidBluetoothProperty: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int){ - self.rawValue = rawValue - } - - /** - * Characteristic proprty: Characteristic is broadcastable. - */ - public static let broadcast = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_BROADCAST) - - /** - * Characteristic property: Characteristic has extended properties. - */ - public static let extendedProps = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_EXTENDED_PROPS) - - /** - * Characteristic property: Characteristic supports indication. - */ - public static let indicate = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_INDICATE) - - /** - * Characteristic property: Characteristic supports notification. - */ - public static let notify = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_NOTIFY) - - /** - * Characteristic property: Characteristic is readable. - */ - public static let read = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_READ) - - /** - * Characteristic property: Characteristic supports write with signature. - */ - public static let signedWrite = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_SIGNED_WRITE) - - /** - * Characteristic property: Characteristic can be written. - */ - public static let write = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_WRITE) - - /** - * Characteristic property: Characteristic can be written without response. - */ - public static let writeNoResponse = AndroidBluetoothGattCharacteristic.Property(rawValue: AndroidBluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) - } - - struct AndroidBluetoothWriteType: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int){ - self.rawValue = rawValue - } - - /** - * Write characteristic, requesting acknoledgement by the remote device. - */ - public static let `default` = AndroidBluetoothGattCharacteristic.WriteType(rawValue: AndroidBluetoothGattCharacteristic.WRITE_TYPE_DEFAULT) - - /** - * Write characteristic without requiring a response by the remote device. - */ - public static let noResponse = AndroidBluetoothGattCharacteristic.WriteType(rawValue: AndroidBluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE) - - /** - * Write characteristic including authentication signature. - */ - public static let signed = AndroidBluetoothGattCharacteristic.WriteType(rawValue: AndroidBluetoothGattCharacteristic.WRITE_TYPE_SIGNED) - } - - struct AndroidBluetoothFormatType: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int){ - self.rawValue = rawValue - } - - /** - * Characteristic value format type float (32-bit float). - */ - public static let float = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_FLOAT) - - /** - * Characteristic value format type sfloat (16-bit float). - */ - public static let sfloat = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_SFLOAT) - - /** - * Characteristic value format type sint16. - */ - public static let sInt16 = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_SINT16) - - /** - * Characteristic value format type sint32. - */ - public static let sInt32 = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_SINT32) - - /** - * Characteristic value format type sint8. - */ - public static let sInt8 = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_SINT8) - - /** - * Characteristic value format type uint16. - */ - public static let uInt16 = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_UINT16) - - /** - * Characteristic value format type uint32. - */ - public static let uInt32 = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_UINT32) - - /** - * Characteristic value format type uint8. - */ - public static let uInt8 = AndroidBluetoothGattCharacteristic.FormatType(rawValue: AndroidBluetoothGattCharacteristic.FORMAT_UINT8) - } -} + @JavaMethod + open func getService() -> BluetoothGattService! + + @JavaMethod + open func getUuid() -> UUID! + + @JavaMethod + open func getInstanceId() -> Int32 + + @JavaMethod + open func getValue() -> [Int8] + + @JavaMethod + open func getDescriptor(_ arg0: UUID?) -> BluetoothGattDescriptor! + + @JavaMethod + open func getProperties() -> Int32 -// MARK: - JNICache + @JavaMethod + open func getPermissions() -> Int32 -internal extension AndroidBluetoothGattCharacteristic { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothGattCharacteristic"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var FORMAT_FLOAT: jfieldID? - static var FORMAT_SFLOAT: jfieldID? - static var FORMAT_SINT16: jfieldID? - static var FORMAT_SINT32: jfieldID? - static var FORMAT_SINT8: jfieldID? - static var FORMAT_UINT16: jfieldID? - static var FORMAT_UINT32: jfieldID? - static var FORMAT_UINT8: jfieldID? - static var PERMISSION_READ: jfieldID? - static var PERMISSION_READ_ENCRYPTED: jfieldID? - static var PERMISSION_READ_ENCRYPTED_MITM: jfieldID? - static var PERMISSION_WRITE: jfieldID? - static var PERMISSION_WRITE_ENCRYPTED: jfieldID? - static var PERMISSION_WRITE_ENCRYPTED_MITM: jfieldID? - static var PERMISSION_WRITE_SIGNED: jfieldID? - static var PERMISSION_WRITE_SIGNED_MITM: jfieldID? - static var PROPERTY_BROADCAST: jfieldID? - static var PROPERTY_EXTENDED_PROPS: jfieldID? - static var PROPERTY_INDICATE: jfieldID? - static var PROPERTY_NOTIFY: jfieldID? - static var PROPERTY_READ: jfieldID? - static var PROPERTY_SIGNED_WRITE: jfieldID? - static var PROPERTY_WRITE: jfieldID? - static var PROPERTY_WRITE_NO_RESPONSE: jfieldID? - static var WRITE_TYPE_DEFAULT: jfieldID? - static var WRITE_TYPE_NO_RESPONSE: jfieldID? - static var WRITE_TYPE_SIGNED: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var addDescriptor: jmethodID? - static var getDescriptor: jmethodID? - static var getDescriptors: jmethodID? - static var getFloatValue: jmethodID? - static var getInstanceId: jmethodID? - static var getIntValue: jmethodID? - static var getPermissions: jmethodID? - static var getProperties: jmethodID? - static var getService: jmethodID? - static var getStringValue: jmethodID? - static var getUuid: jmethodID? - static var getValue: jmethodID? - static var getWriteType: jmethodID? - static var setValue: jmethodID? - static var setValue2: jmethodID? - static var setValue3: jmethodID? - static var setValue4: jmethodID? - static var setWriteType: jmethodID? - } - } + @JavaMethod + open func setValue(_ arg0: String) -> Bool + + @JavaMethod + open func setValue(_ arg0: [Int8]) -> Bool + + @JavaMethod + open func setValue(_ arg0: Int32, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) -> Bool + + @JavaMethod + open func setValue(_ arg0: Int32, _ arg1: Int32, _ arg2: Int32) -> Bool } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var FORMAT_FLOAT: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_SFLOAT: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_SINT16: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_SINT32: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_SINT8: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_UINT16: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_UINT32: Int32 + + @JavaStaticField(isFinal: true) + public var FORMAT_UINT8: Int32 + @JavaStaticField(isFinal: true) + public var PERMISSION_READ: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_READ_ENCRYPTED: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_READ_ENCRYPTED_MITM: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_ENCRYPTED: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_ENCRYPTED_MITM: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_SIGNED: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_SIGNED_MITM: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_BROADCAST: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_EXTENDED_PROPS: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_INDICATE: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_NOTIFY: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_READ: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_SIGNED_WRITE: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_WRITE: Int32 + + @JavaStaticField(isFinal: true) + public var PROPERTY_WRITE_NO_RESPONSE: Int32 + + @JavaStaticField(isFinal: true) + public var WRITE_TYPE_DEFAULT: Int32 + + @JavaStaticField(isFinal: true) + public var WRITE_TYPE_NO_RESPONSE: Int32 + + @JavaStaticField(isFinal: true) + public var WRITE_TYPE_SIGNED: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothGattDescriptor.swift b/Sources/AndroidBluetooth/BluetoothGattDescriptor.swift index e10395e..f2ad61a 100644 --- a/Sources/AndroidBluetooth/BluetoothGattDescriptor.swift +++ b/Sources/AndroidBluetooth/BluetoothGattDescriptor.swift @@ -1,455 +1,75 @@ -// -// BluetoothGattDescriptor.swift -// Android -// -// Created by Marco Estrella on 5/31/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime +import JavaUtil -import Foundation -import java_swift -import java_util -import Android +@JavaClass("android.bluetooth.BluetoothGattDescriptor", implements: Parcelable.self) +open class BluetoothGattDescriptor: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: UUID?, _ arg1: Int32, environment: JNIEnvironment? = nil) -public extension Android.Bluetooth { - - typealias GattDescriptor = AndroidBluetoothGattDescriptor -} + @JavaMethod + open func describeContents() -> Int32 -public extension Android.Bluetooth.GattDescriptor { - - typealias Permission = AndroidBluetoothPermission -} + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) -/** - * Represents a Bluetooth GATT Descriptor - * - * GATT Descriptors contain additional information and attributes of a GATT characteristic, BluetoothGattCharacteristic. - * They can be used to describe the characteristic's features or to control certain behaviours of the characteristic. - */ -public final class AndroidBluetoothGattDescriptor: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - /** - * Create a new BluetoothGattDescriptor. - * - * Requires BLUETOOTH permission. - */ - public convenience init(uuid: java_util.UUID, permissions: Permission){ - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals), - jvalue(i: jint(permissions.rawValue)) - ] - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "(Ljava/util/UUID;I)V", - methodCache: &JNICache.MethodID.init_method, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} + @JavaMethod + open func getUuid() -> UUID! + + @JavaMethod + open func getCharacteristic() -> BluetoothGattCharacteristic! -// MARK: Constants + @JavaMethod + open func getValue() -> [Int8] -public extension AndroidBluetoothGattDescriptor { - - /// Descriptor read permission - static var PERMISSION_READ: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_READ", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_READ, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor permission: Allow encrypted read operations - static var PERMISSION_READ_ENCRYPTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_READ_ENCRYPTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_READ_ENCRYPTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor permission: Allow reading with man-in-the-middle protection - static var PERMISSION_READ_ENCRYPTED_MITM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_READ_ENCRYPTED_MITM", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_READ_ENCRYPTED_MITM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor write permission - static var PERMISSION_WRITE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor permission: Allow encrypted writes - static var PERMISSION_WRITE_ENCRYPTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_ENCRYPTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_ENCRYPTED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor permission: Allow encrypted writes with man-in-the-middle protection - static var PERMISSION_WRITE_ENCRYPTED_MITM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_ENCRYPTED_MITM", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_ENCRYPTED_MITM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor permission: Allow signed write operations - static var PERMISSION_WRITE_SIGNED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_SIGNED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_SIGNED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Descriptor permission: Allow signed write operations with man-in-the-middle protection - static var PERMISSION_WRITE_SIGNED_MITM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERMISSION_WRITE_SIGNED_MITM", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERMISSION_WRITE_SIGNED_MITM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Value used to disable notifications or indicatinos - static var DISABLE_NOTIFICATION_VALUE: [Int8] { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "DISABLE_NOTIFICATION_VALUE", - fieldType: "[B", - fieldCache: &JNICache.FieldID.DISABLE_NOTIFICATION_VALUE, - className: JNICache.className, - classCache: &JNICache.jniClass ) + @JavaMethod + open func getPermissions() -> Int32 - return JNIType.toSwift(type: [Int8].self, from: __value)! - } - } - - /// Value used to enable indication for a client configuration descriptor - static var ENABLE_INDICATION_VALUE: [Int8] { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ENABLE_INDICATION_VALUE", - fieldType: "[B", - fieldCache: &JNICache.FieldID.ENABLE_INDICATION_VALUE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return JNIType.toSwift(type: [Int8].self, from: __value)! - } - } - - /// Value used to enable notification for a client configuration descriptor - static var ENABLE_NOTIFICATION_VALUE: [Int8] { - - get { - - let __value = JNIField.GetStaticObjectField( - fieldName: "ENABLE_NOTIFICATION_VALUE", - fieldType: "[B", - fieldCache: &JNICache.FieldID.ENABLE_NOTIFICATION_VALUE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return JNIType.toSwift(type: [Int8].self, from: __value)! - } - } - + @JavaMethod + open func setValue(_ arg0: [Int8]) -> Bool } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! -// MARK: Methods + @JavaStaticField(isFinal: true) + public var DISABLE_NOTIFICATION_VALUE: [Int8] -public extension AndroidBluetoothGattDescriptor { - - /** - * Returns the characteristic this descriptor belongs to. - */ - func getCharacteristic() -> Android.Bluetooth.GattCharacteristic { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getCharacteristic", - methodSig: "()Landroid/bluetooth/BluetoothGattCharacteristic;", - methodCache: &JNICache.MethodID.getCharacteristic, - args: &__args, - locals: &__locals) - return Android.Bluetooth.GattCharacteristic(javaObject: __return) - } - - /** - * Returns the permissions for this descriptor. - */ - func getPermissions() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getPermissions", - methodSig: "()I", - methodCache: &JNICache.MethodID.getPermissions, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Returns the UUID of this descriptor. - */ - func getUUID() -> java_util.UUID { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getUuid", - methodSig: "()Ljava/util/UUID;", - methodCache: &JNICache.MethodID.getUuid, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - return java_util.UUID(javaObject: __return) - } - - /** - * Returns the stored value for this descriptor - * - * This function returns the stored value for this descriptor as retrieved by calling readDescriptor(BluetoothGattDescriptor). - */ - func getValue() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getValue", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getValue, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - func setValue(_ value: [Int8]) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: value, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "setValue", - methodSig: "([B)Z", - methodCache: &JNICache.MethodID.setValue, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} + @JavaStaticField(isFinal: true) + public var ENABLE_INDICATION_VALUE: [Int8] -// MARKL - Supporting type + @JavaStaticField(isFinal: true) + public var ENABLE_NOTIFICATION_VALUE: [Int8] -public extension AndroidBluetoothGattDescriptor { - - public struct AndroidBluetoothPermission: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Descriptor read permission. - */ - public static let read = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_READ) - - /** - * Descriptor permission: Allow encrypted read operations. - */ - public static let readEncrypted = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_READ_ENCRYPTED) - - /** - * Descriptor permission: Allow reading with man-in-the-middle protection. - */ - public static let readEncryptedMITM = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_READ_ENCRYPTED_MITM) - - /** - * Descriptor permission: Allow encrypted read operations. - */ - public static let write = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_WRITE) - - /** - * Descriptor permission: Allow encrypted writes. - */ - public static let writeEncrypted = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_WRITE_ENCRYPTED) - - /** - * Descriptor permission: Allow encrypted writes with man-in-the-middle protection. - */ - public static let writeEncryptedMITM = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_WRITE_ENCRYPTED_MITM) - - - /** - * Descriptor permission: Allow signed write operations. - */ - public static let writeSigned = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_WRITE_SIGNED) - - /** - * Descriptor permission: Allow signed write operations with man-in-the-middle protection. - */ - public static let writeSignedMITM = AndroidBluetoothGattDescriptor.Permission(rawValue: AndroidBluetoothGattDescriptor.PERMISSION_WRITE_SIGNED_MITM) - } - -} + @JavaStaticField(isFinal: true) + public var PERMISSION_READ: Int32 -// MARK: - JNICache + @JavaStaticField(isFinal: true) + public var PERMISSION_READ_ENCRYPTED: Int32 -internal extension AndroidBluetoothGattDescriptor { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothGattDescriptor"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var PERMISSION_READ: jfieldID? - static var PERMISSION_READ_ENCRYPTED: jfieldID? - static var PERMISSION_READ_ENCRYPTED_MITM: jfieldID? - static var PERMISSION_WRITE: jfieldID? - static var PERMISSION_WRITE_ENCRYPTED: jfieldID? - static var PERMISSION_WRITE_ENCRYPTED_MITM: jfieldID? - static var PERMISSION_WRITE_SIGNED: jfieldID? - static var PERMISSION_WRITE_SIGNED_MITM: jfieldID? - static var DISABLE_NOTIFICATION_VALUE: jfieldID? - static var ENABLE_INDICATION_VALUE: jfieldID? - static var ENABLE_NOTIFICATION_VALUE: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var init_method: jmethodID? - static var getCharacteristic: jmethodID? - static var getPermissions: jmethodID? - static var getUuid: jmethodID? - static var getValue: jmethodID? - static var setValue: jmethodID? - } - } -} + @JavaStaticField(isFinal: true) + public var PERMISSION_READ_ENCRYPTED_MITM: Int32 + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_ENCRYPTED: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_ENCRYPTED_MITM: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_SIGNED: Int32 + + @JavaStaticField(isFinal: true) + public var PERMISSION_WRITE_SIGNED_MITM: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothGattServer.swift b/Sources/AndroidBluetooth/BluetoothGattServer.swift index 4a877ba..fe6387d 100644 --- a/Sources/AndroidBluetooth/BluetoothGattServer.swift +++ b/Sources/AndroidBluetooth/BluetoothGattServer.swift @@ -1,439 +1,108 @@ -// -// BluetoothGattServer.swift -// Android -// -// Created by Marco Estrella on 6/4/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth { - - typealias GattServer = AndroidBluetoothGattServer -} +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaUtil -public extension Android.Bluetooth.GattServer { - - typealias TxPhy = AndroidBluetoothTxPhy - - typealias RxPhy = AndroidBluetoothRxPhy - - typealias PhyOptions = AndroidBluetoothPhyOptions -} +@JavaClass("android.bluetooth.BluetoothGattServer", implements: BluetoothProfile.self) +open class BluetoothGattServer: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 -/** - * Public API for the Bluetooth GATT Profile server role. - * - * This class provides Bluetooth GATT server role functionality, allowing applications to create Bluetooth Smart services and characteristics. - * - * BluetoothGattServer is a proxy object for controlling the Bluetooth Service via IPC. Use openGattServer(Context, BluetoothGattServerCallback) to get an instance of this class. - */ -public final class AndroidBluetoothGattServer: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} + @JavaMethod + open func connect(_ arg0: BluetoothDevice?, _ arg1: Bool) -> Bool -// MARK: - Methods - -public extension AndroidBluetoothGattServer { - - /** - * Add a service to the list of services to be hosted. - */ - func addService(service: Android.Bluetooth.GattService) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: service, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "addService", - methodSig: "(Landroid/bluetooth/BluetoothGattService;)Z", - methodCache: &JNICache.MethodID.addService, - args: &__args, - locals: &__locals) - return __return != jboolean(__return) - } - - /** - * Disconnects an established connection, or cancels a connection attempt currently in progress. - */ - func cancelConnection(device: Android.Bluetooth.Device) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals) - ] - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "cancelConnection", - methodSig: "(Landroid/bluetooth/BluetoothDevice;)V", - methodCache: &JNICache.MethodID.cancelConnection, - args: &__args, - locals: &__locals) - } - - /** - * Remove all services from the list of provided services. - */ - func clearServices() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "clearServices", - methodSig: "()V", - methodCache: &JNICache.MethodID.clearServices, - args: &__args, - locals: &__locals) - } - - /** - * Close this GATT server instance. - */ - func close() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "close", - methodSig: "()V", - methodCache: &JNICache.MethodID.close, - args: &__args, - locals: &__locals) - } - - /** - * Initiate a connection to a Bluetooth GATT capable device. - */ - func connect(device: Android.Bluetooth.Device, autoConnect: Bool) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals), - jvalue(z: jboolean(autoConnect ? JNI_TRUE : JNI_FALSE)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "connect", - methodSig: "(Landroid/bluetooth/BluetoothDevice;Z)Z", - methodCache: &JNICache.MethodID.connect, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Returns a BluetoothGattService from the list of services offered by this device. - */ - func getService(uuid: java_util.UUID) -> Android.Bluetooth.GattService { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getService", - methodSig: "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;", - methodCache: &JNICache.MethodID.getService, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.GattService(javaObject: __return) - } - - /** - * Returns a list of GATT services offered by this device. - */ - func getServices() -> List? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServices", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getServices, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return ListForward(javaObject: __return) - } - - /** - * Send a notification or indication that a local characteristic has been updated. - */ - func notifyCharacteristicChanged(device: Android.Bluetooth.Device, characteristic: Android.Bluetooth.GattCharacteristic, confirm: Bool) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals), - JNIType.toJava(value: characteristic, locals: &__locals), - jvalue(z: jboolean(confirm ? JNI_TRUE : JNI_FALSE)) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "notifyCharacteristicChanged", - methodSig: "(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z", - methodCache: &JNICache.MethodID.notifyCharacteristicChanged, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Read the current transmitter PHY and receiver PHY of the connection. - */ - func readPhy(device: Android.Bluetooth.Device) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals) - ] - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "readPhy", - methodSig: "(Landroid/bluetooth/BluetoothDevice;)V", - methodCache: &JNICache.MethodID.readPhy, - args: &__args, - locals: &__locals) - } - - /** - * Removes a service from the list of services to be provided. - */ - func removeService(service: Android.Bluetooth.GattService) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: service, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "removeService", - methodSig: "(Landroid/bluetooth/BluetoothGattService;)Z", - methodCache: &JNICache.MethodID.removeService, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Send a response to a read or write request to a remote device. - */ - func sendResponse(device: Android.Bluetooth.Device, requestId: Int, status: Int, offset: Int, value: [Int8]) -> Bool { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals), - jvalue(i: jint(requestId)), - jvalue(i: jint(status)), - jvalue(i: jint(offset)), - JNIType.toJava(value: value, locals: &__locals), - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "removeService", - methodSig: "(Landroid/bluetooth/BluetoothDevice;III[B)Z", - methodCache: &JNICache.MethodID.removeService, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - /** - * Set the preferred connection PHY for this app. - */ - func setPreferredPhy(device: Android.Bluetooth.Device, txPhy: TxPhy, rxPhy: RxPhy, phyOptions: PhyOptions) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: device, locals: &__locals), - jvalue(i: jint(txPhy.rawValue)), - jvalue(i: jint(rxPhy.rawValue)), - jvalue(i: jint(phyOptions.rawValue)) - ] - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setPreferredPhy", - methodSig: "(Landroid/bluetooth/BluetoothDevice;III)V", - methodCache: &JNICache.MethodID.setPreferredPhy, - args: &__args, - locals: &__locals) - } -} + @JavaMethod + open func setPreferredPhy(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) + + @JavaMethod + open func readPhy(_ arg0: BluetoothDevice?) + + @JavaMethod + open func getServices() -> List! + + @JavaMethod + open func getService(_ arg0: UUID?) -> BluetoothGattService! + + @JavaMethod + open func addService(_ arg0: BluetoothGattService?) -> Bool + + @JavaMethod + open func cancelConnection(_ arg0: BluetoothDevice?) + + @JavaMethod + open func sendResponse(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32, _ arg4: [Int8]) -> Bool + + @JavaMethod + open func removeService(_ arg0: BluetoothGattService?) -> Bool + + @JavaMethod + open func clearServices() + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open func notifyCharacteristicChanged(_ arg0: BluetoothDevice?, _ arg1: BluetoothGattCharacteristic?, _ arg2: Bool, _ arg3: [Int8]) -> Int32 + + @JavaMethod + open func notifyCharacteristicChanged(_ arg0: BluetoothDevice?, _ arg1: BluetoothGattCharacteristic?, _ arg2: Bool) -> Bool -// MARK: - Supporting types - -public extension AndroidBluetoothGattServer { - - struct AndroidBluetoothConnectionPriority: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Connection parameter update - Use the connection parameters recommended by the Bluetooth SIG. This is the default value if no connection parameter update is requested. - */ - public static let balanced = Android.Bluetooth.Gatt.ConnectionPriority(rawValue: Android.Bluetooth.Gatt.CONNECTION_PRIORITY_BALANCED) - - /** - * Connection parameter update - Request a high priority, low latency connection. An application should only request high priority connection parameters to transfer - * large amounts of data over LE quickly. Once the transfer is complete, the application should request CONNECTION_PRIORITY_BALANCED connection parameters to reduce energy use. - */ - public static let high = Android.Bluetooth.Gatt.ConnectionPriority(rawValue: Android.Bluetooth.Gatt.CONNECTION_PRIORITY_HIGH) - - /** - * Connection parameter update - Request low power, reduced data rate connection parameters. - */ - public static let lowPower = Android.Bluetooth.Gatt.ConnectionPriority(rawValue: Android.Bluetooth.Gatt.CONNECTION_PRIORITY_LOW_POWER) - } - - struct AndroidBluetoothTxPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY mask. Used to specify LE 1M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe1mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M_MASK) - - /** - * Bluetooth LE 2M PHY mask. Used to specify LE 2M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe2mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_2M_MASK) - - /** - * Bluetooth LE Coded PHY mask. Used to specify LE Coded Physical Channel as one of many available options in a bitmask. - */ - public static let phyLecodedMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED_MASK) - } - - struct AndroidBluetoothRxPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY mask. Used to specify LE 1M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe1mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M_MASK) - - /** - * Bluetooth LE 2M PHY mask. Used to specify LE 2M Physical Channel as one of many available options in a bitmask. - */ - public static let phyLe2mMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_2M_MASK) - - /** - * Bluetooth LE Coded PHY mask. Used to specify LE Coded Physical Channel as one of many available options in a bitmask. - */ - public static let phyLecodedMask = Android.Bluetooth.Gatt.TxPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED_MASK) - } - - struct AndroidBluetoothPhyOptions: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * No preferred coding when transmitting on the LE Coded PHY. - */ - public static let noPreferred = Android.Bluetooth.Gatt.PhyOptions(rawValue: Android.Bluetooth.Device.PHY_OPTION_NO_PREFERRED) - - /** - * Prefer the S=2 coding to be used when transmitting on the LE Coded PHY. - */ - public static let optionS2 = Android.Bluetooth.Gatt.PhyOptions(rawValue: Android.Bluetooth.Device.PHY_OPTION_S2) - - /** - * Prefer the S=8 coding to be used when transmitting on the LE Coded PHY. - */ - public static let optionS8 = Android.Bluetooth.Gatt.PhyOptions(rawValue: Android.Bluetooth.Device.PHY_OPTION_S8) - } + @JavaMethod + open func close() } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 -// MARK: - JNICache - -internal extension AndroidBluetoothGattServer { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothGattServer"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var addService: jmethodID? - static var cancelConnection: jmethodID? - static var clearServices: jmethodID? - static var close: jmethodID? - static var connect: jmethodID? - static var getConnectedDevices: jmethodID? //Not supported - static var getConnectionState: jmethodID? //Not supported - static var getDevicesMatchingConnectionStates: jmethodID? //Not supported - static var getService: jmethodID? - static var getServices: jmethodID? - static var notifyCharacteristicChanged: jmethodID? - static var readPhy: jmethodID? - static var removeService: jmethodID? - static var sendResponse: jmethodID? - static var setPreferredPhy: jmethodID? - } - } + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 } diff --git a/Sources/AndroidBluetooth/BluetoothGattServerCallback.swift b/Sources/AndroidBluetooth/BluetoothGattServerCallback.swift index 21f243c..c1d9597 100644 --- a/Sources/AndroidBluetooth/BluetoothGattServerCallback.swift +++ b/Sources/AndroidBluetooth/BluetoothGattServerCallback.swift @@ -1,45 +1,42 @@ -// -// BluetoothGattServerCallback.swift -// Android -// -// Created by Marco Estrella on 6/7/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth { - - typealias GattServerCallback = AndroidBluetoothGattServerCallback -} +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothGattServerCallback") +open class BluetoothGattServerCallback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func onServiceAdded(_ arg0: Int32, _ arg1: BluetoothGattService?) + + @JavaMethod + open func onExecuteWrite(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Bool) + + @JavaMethod + open func onNotificationSent(_ arg0: BluetoothDevice?, _ arg1: Int32) + + @JavaMethod + open func onMtuChanged(_ arg0: BluetoothDevice?, _ arg1: Int32) + + @JavaMethod + open func onPhyUpdate(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) + + @JavaMethod + open func onPhyRead(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) + + @JavaMethod + open func onConnectionStateChange(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32) + + @JavaMethod + open func onCharacteristicReadRequest(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: BluetoothGattCharacteristic?) + + @JavaMethod + open func onCharacteristicWriteRequest(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: BluetoothGattCharacteristic?, _ arg3: Bool, _ arg4: Bool, _ arg5: Int32, _ arg6: [Int8]) + + @JavaMethod + open func onDescriptorReadRequest(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: BluetoothGattDescriptor?) -/// This abstract class is used to implement BluetoothGattServer callbacks. -public protocol AndroidBluetoothGattServerCallback: JavaProtocol { - - func onCharacteristicReadRequest(device: Android.Bluetooth.Device, requestId: Int, offset: Int, characteristic: Android.Bluetooth.GattCharacteristic) - - func onCharacteristicWriteRequest(device: Android.Bluetooth.Device, requestId: Int, characteristic: Android.Bluetooth.GattCharacteristic, preparedWrite: Bool, responseNeeded: Bool, offset: Int, value: [Int8]) - - func onConnectionStateChange(device: Android.Bluetooth.Device, status: Int, newState: Int) - - func onDescriptorReadRequest(device: Android.Bluetooth.Device, requestId: Int, offset: Int, descriptor: Android.Bluetooth.GattDescriptor) - - func onDescriptorWriteRequest(device: Android.Bluetooth.Device, requestId: Int, descriptor: Android.Bluetooth.GattDescriptor, preparedWrite: Bool, responseNeeded: Bool, offset: Int, value: [Int8]) - - func onExecuteWrite(device: Android.Bluetooth.Device, requestId: Int, execute: Bool) - - func onMtuChanged(device: Android.Bluetooth.Device, mtu: Int) - - func onNotificationSent(device: Android.Bluetooth.Device, status: Int) - - func onPhyRead(device: Android.Bluetooth.Device, txPhy: Int, rxPhy: Int, status: Int) - - func onPhyUpdate(device: Android.Bluetooth.Device, txPhy: Int, rxPhy: Int, status: Int) - - func onServiceAdded(status: Int, service: Android.Bluetooth.GattService) - - + @JavaMethod + open func onDescriptorWriteRequest(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: BluetoothGattDescriptor?, _ arg3: Bool, _ arg4: Bool, _ arg5: Int32, _ arg6: [Int8]) } diff --git a/Sources/AndroidBluetooth/BluetoothGattService.swift b/Sources/AndroidBluetooth/BluetoothGattService.swift index b392cf8..5453979 100644 --- a/Sources/AndroidBluetooth/BluetoothGattService.swift +++ b/Sources/AndroidBluetooth/BluetoothGattService.swift @@ -1,357 +1,58 @@ -// -// BluetoothGattService.swift -// Android -// -// Created by Marco Estrella on 5/31/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaUtil -import Foundation -import java_swift -import java_util -import Android +@JavaClass("android.bluetooth.BluetoothGattService", implements: Parcelable.self) +open class BluetoothGattService: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: UUID?, _ arg1: Int32, environment: JNIEnvironment? = nil) -public extension Android.Bluetooth { - - typealias GattService = AndroidBluetoothGattService -} + @JavaMethod + open func describeContents() -> Int32 -public extension Android.Bluetooth.GattService { - - typealias ServiceType = AndroidBluetootServiceType -} + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) -/** - * Represents a Bluetooth GATT Service - * - * Gatt Service contains a collection of BluetoothGattCharacteristic, as well as referenced services. - */ -public final class AndroidBluetoothGattService: JavaObject { - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - /** - * Create a new BluetoothGattService. - * - * Requires BLUETOOTH permission. - */ - public convenience init(uuid: java_util.UUID, serviceType: ServiceType){ - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals), - jvalue(i: jint(serviceType.rawValue)) - ] - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "(Ljava/util/UUID;I)V", - methodCache: &JNICache.MethodID.init_method, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } - - internal var mCharacteristics: java_util.List? { - get { - let __value = JNIField.GetObjectField(fieldName: "mCharacteristics", - fieldType: "L", - fieldCache: &JNICache.FieldID.mCharacteristics, - object: javaObject) - defer { JNI.DeleteLocalRef(__value) } - - return java_util.ListForward(javaObject: __value) - } - } - - internal var mIncludedServices: java_util.List? { - get { - let __value = JNIField.GetObjectField(fieldName: "mIncludedServices", - fieldType: "L", - fieldCache: &JNICache.FieldID.mIncludedServices, - object: javaObject) - defer { JNI.DeleteLocalRef(__value) } - - return java_util.ListForward(javaObject: __value) - } - } -} + @JavaMethod + open func addService(_ arg0: BluetoothGattService?) -> Bool -// MARK: Constants + @JavaMethod + open func addCharacteristic(_ arg0: BluetoothGattCharacteristic?) -> Bool -public extension AndroidBluetoothGattService { - - /// RFCOMM socket - static var SERVICE_TYPE_PRIMARY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SERVICE_TYPE_PRIMARY", - fieldType: "I", - fieldCache: &JNICache.FieldID.SERVICE_TYPE_PRIMARY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// RFCOMM socket - static var SERVICE_TYPE_SECONDARY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SERVICE_TYPE_SECONDARY", - fieldType: "I", - fieldCache: &JNICache.FieldID.SERVICE_TYPE_SECONDARY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaMethod + open func getUuid() -> UUID! -// MARK: Methods + @JavaMethod + open func getInstanceId() -> Int32 -public extension AndroidBluetoothGattService { - - func addCharacteristic(characteristic: Android.Bluetooth.GattCharacteristic) -> Bool { - - var __locals = [jobject]() - - var __args:[jvalue] = [ - JNIType.toJava(value: characteristic, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "addCharacteristic", - methodSig: "(Landroid/bluetooth/BluetoothGattCharacteristic;)Z", - methodCache: &JNICache.MethodID.addCharacteristic, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - func addService(service: Android.Bluetooth.GattService) -> Bool { - - var __locals = [jobject]() - - var __args:[jvalue] = [ - JNIType.toJava(value: service, locals: &__locals) - ] - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "addCharacteristic", - methodSig: "(Landroid/bluetooth/BluetoothGattService;)Z", - methodCache: &JNICache.MethodID.addService, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - func getCharacteristic(uuid: java_util.UUID) -> Android.Bluetooth.GattCharacteristic { - - var __locals = [jobject]() - - var __args:[jvalue] = [ - JNIType.toJava(value: uuid, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getCharacteristic", - methodSig: "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattCharacteristic;", - methodCache: &JNICache.MethodID.getCharacteristic, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.GattCharacteristic(javaObject: __return) - } - - func getCharacteristics() -> [Android.Bluetooth.GattCharacteristic] { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getCharacteristics", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getCharacteristics, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - if(__return == nil){ - return [] - } - - let arrayListCharacteristics = ArrayList(javaObject: __return) - - if(arrayListCharacteristics.size() == 0){ - return [] - } - - var swiftCharacteristics = [Android.Bluetooth.GattCharacteristic]() - - arrayListCharacteristics.forEach { item in - let characteristic = Android.Bluetooth.GattCharacteristic(javaObject: item.javaObject) - swiftCharacteristics.append(characteristic) - } - - return swiftCharacteristics - } - - func getIncludedServices() -> java_util.List? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getIncludedServices", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getIncludedServices, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - return java_util.ListForward(javaObject: __return) - } - - func getInstanceId() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getInstanceId", - methodSig: "()I", - methodCache: &JNICache.MethodID.getInstanceId, - args: &__args, - locals: &__locals) - return Int(__return) - } - - func getType() -> Android.Bluetooth.GattService.ServiceType { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getType", - methodSig: "()I", - methodCache: &JNICache.MethodID.getType, - args: &__args, - locals: &__locals) - - return Android.Bluetooth.GattService.ServiceType(rawValue: Int(__return)) - } - - func getUUID() -> java_util.UUID { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getUuid", - methodSig: "()Ljava/util/UUID;", - methodCache: &JNICache.MethodID.getUuid, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef(__return) } - - return java_util.UUID(javaObject: __return) - } -} + @JavaMethod + open func getCharacteristics() -> List! + + @JavaMethod + open func getCharacteristic(_ arg0: UUID?) -> BluetoothGattCharacteristic! -// MARK: - Supportinh types + @JavaMethod + open func getIncludedServices() -> List! -public extension AndroidBluetoothGattService { - - /// LE Secondary Phy - struct AndroidBluetootServiceType: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Primary service. - */ - public static let primary = AndroidBluetoothGattService.ServiceType(rawValue: AndroidBluetoothGattService.SERVICE_TYPE_PRIMARY) - - /** - * Secondary service (included by primary services). - */ - public static let secondary = AndroidBluetoothGattService.ServiceType(rawValue: AndroidBluetoothGattService.SERVICE_TYPE_SECONDARY) - } + @JavaMethod + open func getType() -> Int32 } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! -// MARK: - JNICache + @JavaStaticField(isFinal: true) + public var SERVICE_TYPE_PRIMARY: Int32 -internal extension AndroidBluetoothGattService { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothGattService"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var SERVICE_TYPE_PRIMARY: jfieldID? - static var SERVICE_TYPE_SECONDARY: jfieldID? - - static var mCharacteristics: jfieldID? - static var mIncludedServices: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var init_method: jmethodID? - static var addCharacteristic: jmethodID? - static var addService: jmethodID? - static var getCharacteristic: jmethodID? - static var getCharacteristics: jmethodID? - static var getIncludedServices: jmethodID? - static var getInstanceId: jmethodID? - static var getType: jmethodID? - static var getUuid: jmethodID? - } - } -} + @JavaStaticField(isFinal: true) + public var SERVICE_TYPE_SECONDARY: Int32 + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHeadset.swift b/Sources/AndroidBluetooth/BluetoothHeadset.swift new file mode 100644 index 0000000..842e64e --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHeadset.swift @@ -0,0 +1,137 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHeadset", implements: BluetoothProfile.self) +open class BluetoothHeadset: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func isAudioConnected(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open func isNoiseReductionSupported(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func isVoiceRecognitionSupported(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func startVoiceRecognition(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func stopVoiceRecognition(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func sendVendorSpecificResultCode(_ arg0: BluetoothDevice?, _ arg1: String, _ arg2: String) -> Bool + + @JavaMethod + open override func finalize() throws +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_AUDIO_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ACTION_VENDOR_SPECIFIC_HEADSET_EVENT: String + + @JavaStaticField(isFinal: true) + public var AT_CMD_TYPE_ACTION: Int32 + + @JavaStaticField(isFinal: true) + public var AT_CMD_TYPE_BASIC: Int32 + + @JavaStaticField(isFinal: true) + public var AT_CMD_TYPE_READ: Int32 + + @JavaStaticField(isFinal: true) + public var AT_CMD_TYPE_SET: Int32 + + @JavaStaticField(isFinal: true) + public var AT_CMD_TYPE_TEST: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS: String + + @JavaStaticField(isFinal: true) + public var EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD: String + + @JavaStaticField(isFinal: true) + public var EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE: String + + @JavaStaticField(isFinal: true) + public var STATE_AUDIO_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_AUDIO_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_AUDIO_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var VENDOR_RESULT_CODE_COMMAND_ANDROID: String + + @JavaStaticField(isFinal: true) + public var VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY: String + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHealth.swift b/Sources/AndroidBluetooth/BluetoothHealth.swift new file mode 100644 index 0000000..e9c6f05 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHealth.swift @@ -0,0 +1,120 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHealth", implements: BluetoothProfile.self) +open class BluetoothHealth: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func disconnectChannel(_ arg0: BluetoothDevice?, _ arg1: BluetoothHealthAppConfiguration?, _ arg2: Int32) -> Bool + + @JavaMethod + open func getMainChannelFd(_ arg0: BluetoothDevice?, _ arg1: BluetoothHealthAppConfiguration?) -> ParcelFileDescriptor! + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open func registerSinkAppConfiguration(_ arg0: String, _ arg1: Int32, _ arg2: BluetoothHealthCallback?) -> Bool + + @JavaMethod + open func unregisterAppConfiguration(_ arg0: BluetoothHealthAppConfiguration?) -> Bool + + @JavaMethod + open func connectChannelToSource(_ arg0: BluetoothDevice?, _ arg1: BluetoothHealthAppConfiguration?) -> Bool +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var APP_CONFIG_REGISTRATION_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var APP_CONFIG_REGISTRATION_SUCCESS: Int32 + + @JavaStaticField(isFinal: true) + public var APP_CONFIG_UNREGISTRATION_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var APP_CONFIG_UNREGISTRATION_SUCCESS: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_TYPE_RELIABLE: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_TYPE_STREAMING: Int32 + + @JavaStaticField(isFinal: true) + public var SINK_ROLE: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_ROLE: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CHANNEL_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CHANNEL_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CHANNEL_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CHANNEL_DISCONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHealthAppConfiguration.swift b/Sources/AndroidBluetooth/BluetoothHealthAppConfiguration.swift new file mode 100644 index 0000000..f271d8e --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHealthAppConfiguration.swift @@ -0,0 +1,32 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHealthAppConfiguration", implements: Parcelable.self) +open class BluetoothHealthAppConfiguration: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getDataType() -> Int32 + + @JavaMethod + open func getRole() -> Int32 + + @JavaMethod + open func getName() -> String +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHealthCallback.swift b/Sources/AndroidBluetooth/BluetoothHealthCallback.swift new file mode 100644 index 0000000..02e54d5 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHealthCallback.swift @@ -0,0 +1,16 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHealthCallback") +open class BluetoothHealthCallback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func onHealthChannelStateChange(_ arg0: BluetoothHealthAppConfiguration?, _ arg1: BluetoothDevice?, _ arg2: Int32, _ arg3: Int32, _ arg4: ParcelFileDescriptor?, _ arg5: Int32) + + @JavaMethod + open func onHealthAppConfigurationStatusChange(_ arg0: BluetoothHealthAppConfiguration?, _ arg1: Int32) +} diff --git a/Sources/AndroidBluetooth/BluetoothHearingAid.swift b/Sources/AndroidBluetooth/BluetoothHearingAid.swift new file mode 100644 index 0000000..fa38e0a --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHearingAid.swift @@ -0,0 +1,71 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHearingAid", implements: BluetoothProfile.self) +open class BluetoothHearingAid: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHidDevice+Callback.swift b/Sources/AndroidBluetooth/BluetoothHidDevice+Callback.swift new file mode 100644 index 0000000..da381e7 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHidDevice+Callback.swift @@ -0,0 +1,32 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothHidDevice { + @JavaClass("android.bluetooth.BluetoothHidDevice$Callback") + open class Callback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func onAppStatusChanged(_ arg0: BluetoothDevice?, _ arg1: Bool) + + @JavaMethod + open func onGetReport(_ arg0: BluetoothDevice?, _ arg1: Int8, _ arg2: Int8, _ arg3: Int32) + + @JavaMethod + open func onSetReport(_ arg0: BluetoothDevice?, _ arg1: Int8, _ arg2: Int8, _ arg3: [Int8]) + + @JavaMethod + open func onSetProtocol(_ arg0: BluetoothDevice?, _ arg1: Int8) + + @JavaMethod + open func onInterruptData(_ arg0: BluetoothDevice?, _ arg1: Int8, _ arg2: [Int8]) + + @JavaMethod + open func onConnectionStateChanged(_ arg0: BluetoothDevice?, _ arg1: Int32) + + @JavaMethod + open func onVirtualCableUnplug(_ arg0: BluetoothDevice?) + } +} diff --git a/Sources/AndroidBluetooth/BluetoothHidDevice.swift b/Sources/AndroidBluetooth/BluetoothHidDevice.swift new file mode 100644 index 0000000..e925cd0 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHidDevice.swift @@ -0,0 +1,155 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHidDevice", implements: BluetoothProfile.self) +open class BluetoothHidDevice: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func disconnect(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func connect(_ arg0: BluetoothDevice?) -> Bool + + @JavaMethod + open func unregisterApp() -> Bool + + @JavaMethod + open func sendReport(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: [Int8]) -> Bool + + @JavaMethod + open func replyReport(_ arg0: BluetoothDevice?, _ arg1: Int8, _ arg2: Int8, _ arg3: [Int8]) -> Bool + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open func reportError(_ arg0: BluetoothDevice?, _ arg1: Int8) -> Bool +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var ERROR_RSP_INVALID_PARAM: Int8 + + @JavaStaticField(isFinal: true) + public var ERROR_RSP_INVALID_RPT_ID: Int8 + + @JavaStaticField(isFinal: true) + public var ERROR_RSP_NOT_READY: Int8 + + @JavaStaticField(isFinal: true) + public var ERROR_RSP_SUCCESS: Int8 + + @JavaStaticField(isFinal: true) + public var ERROR_RSP_UNKNOWN: Int8 + + @JavaStaticField(isFinal: true) + public var ERROR_RSP_UNSUPPORTED_REQ: Int8 + + @JavaStaticField(isFinal: true) + public var PROTOCOL_BOOT_MODE: Int8 + + @JavaStaticField(isFinal: true) + public var PROTOCOL_REPORT_MODE: Int8 + + @JavaStaticField(isFinal: true) + public var REPORT_TYPE_FEATURE: Int8 + + @JavaStaticField(isFinal: true) + public var REPORT_TYPE_INPUT: Int8 + + @JavaStaticField(isFinal: true) + public var REPORT_TYPE_OUTPUT: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS1_COMBO: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS1_KEYBOARD: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS1_MOUSE: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS1_NONE: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_CARD_READER: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_DIGITIZER_TABLET: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_GAMEPAD: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_JOYSTICK: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_REMOTE_CONTROL: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_SENSING_DEVICE: Int8 + + @JavaStaticField(isFinal: true) + public var SUBCLASS2_UNCATEGORIZED: Int8 + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHidDeviceAppQosSettings.swift b/Sources/AndroidBluetooth/BluetoothHidDeviceAppQosSettings.swift new file mode 100644 index 0000000..3f880d2 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHidDeviceAppQosSettings.swift @@ -0,0 +1,56 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHidDeviceAppQosSettings", implements: Parcelable.self) +open class BluetoothHidDeviceAppQosSettings: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: Int32, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32, _ arg4: Int32, _ arg5: Int32, environment: JNIEnvironment? = nil) + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getServiceType() -> Int32 + + @JavaMethod + open func getTokenRate() -> Int32 + + @JavaMethod + open func getTokenBucketSize() -> Int32 + + @JavaMethod + open func getPeakBandwidth() -> Int32 + + @JavaMethod + open func getLatency() -> Int32 + + @JavaMethod + open func getDelayVariation() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var MAX: Int32 + + @JavaStaticField(isFinal: true) + public var SERVICE_BEST_EFFORT: Int32 + + @JavaStaticField(isFinal: true) + public var SERVICE_GUARANTEED: Int32 + + @JavaStaticField(isFinal: true) + public var SERVICE_NO_TRAFFIC: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothHidDeviceAppSdpSettings.swift b/Sources/AndroidBluetooth/BluetoothHidDeviceAppSdpSettings.swift new file mode 100644 index 0000000..dd62eb8 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothHidDeviceAppSdpSettings.swift @@ -0,0 +1,41 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothHidDeviceAppSdpSettings", implements: Parcelable.self) +open class BluetoothHidDeviceAppSdpSettings: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: Int8, _ arg4: [Int8], environment: JNIEnvironment? = nil) + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getDescription() -> String + + @JavaMethod + open func getSubclass() -> Int8 + + @JavaMethod + open func getDescriptors() -> [Int8] + + @JavaMethod + open func getName() -> String + + @JavaMethod + open func getProvider() -> String +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertiseCallback.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertiseCallback.swift deleted file mode 100644 index e938977..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertiseCallback.swift +++ /dev/null @@ -1,150 +0,0 @@ -// -// BluetoothLeAdvertiseCallback.swift -// Android -// -// Created by Marco Estrella on 5/28/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth.LE { - - typealias AdvertiseCallback = AndroidBluetoothLowEnergyAdvertiseCallback -} - -public extension Android.Bluetooth.LE.AdvertiseCallback { - - typealias Error = AndroidBluetoothLowEnergyAdvertiseCallbackError -} - -/// Bluetooth LE advertising callbacks, used to deliver advertising operation status. -public protocol AndroidBluetoothLowEnergyAdvertiseCallback: JavaProtocol { - - func onStartSuccess(settingsInEffect: Android.Bluetooth.LE.AdvertiseSettings) - - func onStartFailure(error: Android.Bluetooth.LE.AdvertiseCallback.Error) -} - -// MARK: - Supporting Types - -public struct AndroidBluetoothLowEnergyAdvertiseCallbackError: RawRepresentable, Swift.Error { - - public let rawValue: Int - - public init(rawValue: Int) { - - self.rawValue = rawValue - } -} -// MARK: - Local Listener - -extension AndroidBluetoothLowEnergyAdvertiseCallback { - - public func localJavaObject( _ locals: UnsafeMutablePointer<[jobject]> ) -> jobject? { - - return AndroidBluetoothLowEnergyAdvertiseCallbackListenerLocal( owned: self, proto: self ).localJavaObject( locals ) - } -} - -internal class AndroidBluetoothLowEnergyAdvertiseCallbackListenerLocal: JNILocalProxy { - - fileprivate static let _proxyClass: jclass = { - - var natives: [JNINativeMethod] = [ - JNICache.Method.onStartFailure.method, - JNICache.Method.onStartFailure.method, - .finalize - ] - - let clazz = JNI.FindClass( proxyClassName() ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - override open class func proxyClassName() -> String { return JNICache.className } - - override open class func proxyClass() -> jclass? { return _proxyClass } -} - -internal extension AndroidBluetoothLowEnergyAdvertiseCallbackListenerLocal { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.LE.className(["SwiftAdvertiseCallback"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Method cache - fileprivate enum Method { - internal - enum onStartSuccess: JNINativeMethodEntry { - - static let name = "__on_start_success" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertiseSettings.JNICache.classSignature) - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseCallback_OnStartSuccess_Type = AndroidBluetoothLowEnergyAdvertiseCallback_onStartSuccess - } - - enum onStartFailure: JNINativeMethodEntry { - - static let name = "__on_start_failure" - - /// "(JI)V" - static let signature = JNIMethodSignature(argumentTypes: [.long, .int], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseCallback_OnStartFailure_Type = AndroidBluetoothLowEnergyScanCallback_onStartFailure - } - } - } -} - -// MARK: - Private Methods - -private typealias AndroidBluetoothLowEnergyAdvertiseCallback_OnStartSuccess_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?) -> () - -private func AndroidBluetoothLowEnergyAdvertiseCallback_onStartSuccess( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ settingsInEffect: jobject? ) -> () { - - let swiftSettingsInEffect = AndroidBluetoothLowEnergyAdvertiseSettings(javaObject: settingsInEffect) - - AndroidBluetoothLowEnergyAdvertiseCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onStartSuccess(settingsInEffect: swiftSettingsInEffect) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseCallback_OnStartFailure_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jint) -> () - -private func AndroidBluetoothLowEnergyScanCallback_onStartFailure( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ __errorCode: jint) -> () { - - let error = AndroidBluetoothLowEnergyAdvertiseCallbackError(rawValue: Int(__errorCode)) - - AndroidBluetoothLowEnergyAdvertiseCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onStartFailure(error: error) -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertiseData.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertiseData.swift deleted file mode 100644 index d4b9111..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertiseData.swift +++ /dev/null @@ -1,186 +0,0 @@ -// -// BluetoothLeAdvertiseData.swift -// Android -// -// Created by Marco Estrella on 5/25/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.LE { - - typealias AdvertiseData = AndroidBluetoothLowEnergyAdvertiseData -} - -/** - * Advertise data packet container for Bluetooth LE advertising. This represents the data to be advertised as well as - * the scan response data for active scans. - * - * Use AdvertiseData.Builder to create an instance of AdvertiseData to be advertised. - */ -public final class AndroidBluetoothLowEnergyAdvertiseData: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - /** - * Whether the device name will be included in the advertisement packet. - */ - public var includeDeviceName: Bool { - - get { return getIncludeDeviceName() } - } - - /** - * Whether the transmission power level will be included in the advertisement packet. - */ - public var includeTxPowerLevel: Bool { - - get { return getIncludeTxPowerLevel() } - } - - /** - * Returns an array of manufacturer Id and the corresponding manufacturer specific data. - */ - public var manufacturerSpecificData: Android.Util.SparseArray? { - - get { return getManufacturerSpecificData() } - } -} - -// MARK: Internal Methods - -internal extension AndroidBluetoothLowEnergyAdvertiseData { - - @usableFromInline - func getIncludeDeviceName() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "getIncludeDeviceName", - methodSig: "()Z", - methodCache: &JNICache.MethodID.getIncludeDeviceName, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getIncludeTxPowerLevel() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "getIncludeTxPowerLevel", - methodSig: "()Z", - methodCache: &JNICache.MethodID.getIncludeTxPowerLevel, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getManufacturerSpecificData() -> Android.Util.SparseArray? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getManufacturerSpecificData", - methodSig: "()Landroid/util/SparseArray;", - methodCache: &JNICache.MethodID.getManufacturerSpecificData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? Android.Util.SparseArray( javaObject: __return ) : nil - } - - - @usableFromInline - func getServiceUuids() -> List? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceUuids", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getServiceUuids, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? ListForward( javaObject: __return ) : nil - } - - @usableFromInline - func getServiceData() -> JavaMap? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceData", - methodSig: "()Ljava/util/Map;", - methodCache: &JNICache.MethodID.getServiceData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: java_swift.JavaMapForward.self, from: __return ) - } -} - -// MARK: - JNICache - -internal extension AndroidBluetoothLowEnergyAdvertiseData { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["AdvertiseData"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var getIncludeDeviceName: jmethodID? - static var getIncludeTxPowerLevel: jmethodID? - static var getManufacturerSpecificData: jmethodID? - static var getServiceData: jmethodID? - static var getServiceUuids: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertiseDataBuilder.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertiseDataBuilder.swift deleted file mode 100644 index 901c488..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertiseDataBuilder.swift +++ /dev/null @@ -1,231 +0,0 @@ -// -// BluetoothLeAdvertiseDataBuilder.swift -// Android -// -// Created by Marco Estrella on 5/25/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE.AdvertiseData { - - typealias Builder = AndroidBluetoothLowEnergyAdvertiseDataBuilder -} - -/** - * Builder for AdvertiseData. - */ -public final class AndroidBluetoothLowEnergyAdvertiseDataBuilder: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "()V", - methodCache: &JNICache.MethodID.initMethod, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} - -// MARK: - METHODS - -public extension AndroidBluetoothLowEnergyAdvertiseDataBuilder { - - func build() -> AndroidBluetoothLowEnergyAdvertiseData { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "build", - methodSig: "()Landroid/bluetooth/le/AdvertiseData;", - methodCache: &JNICache.MethodID.build, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData( javaObject: __return ) - } - - /** - * Add manufacturer specific data. - */ - func addManufacturerData(_ manufacturerId: Int, _ manufacturerSpecificData: [Int8]) -> AndroidBluetoothLowEnergyAdvertiseData.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = jvalue(i: jint(manufacturerId)) - __args[1] = JNIType.toJava( value: manufacturerSpecificData, locals: &__locals ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "addManufacturerData", - methodSig: "(I[B)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.addManufacturerData, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setManufacturerData", - methodSig: "(I[B)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.addManufacturerData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData.Builder(javaObject: __return) - } - - func addServiceData(serviceDataUuid: Android.OS.ParcelUuid, serviceData: [Int8]) -> AndroidBluetoothLowEnergyAdvertiseData.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = JNIType.toJava( value: serviceDataUuid, locals: &__locals ) - __args[1] = JNIType.toJava( value: serviceData, locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "addServiceData", - methodSig: "(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.addServiceData2Params, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData.Builder(javaObject: __return) - } - - func addServiceData(serviceDataUuid: Android.OS.ParcelUuid) -> AndroidBluetoothLowEnergyAdvertiseData.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = JNIType.toJava( value: serviceDataUuid, locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "addServiceData", - methodSig: "(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.addServiceData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData.Builder(javaObject: __return) - } - - func setIncludeDeviceName( includeDeviceName: Bool) -> AndroidBluetoothLowEnergyAdvertiseData.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(includeDeviceName ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setIncludeDeviceName", - methodSig: "(Z)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.setIncludeDeviceName, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setIncludeDeviceName", - methodSig: "(Z)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.setIncludeDeviceName, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData.Builder(javaObject: __return) - } - - func setIncludeTxPowerLevel( includeTxPowerLevel: Bool) -> AndroidBluetoothLowEnergyAdvertiseData.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(includeTxPowerLevel ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setIncludeTxPowerLevel", - methodSig: "(Z)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPowerLevel, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setIncludeTxPowerLevel", - methodSig: "(Z)Landroid/bluetooth/le/AdvertiseData$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPowerLevel, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData.Builder(javaObject: __return) - } -} - -// MARK: - JNICache - -internal extension AndroidBluetoothLowEnergyAdvertiseDataBuilder { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/le/AdvertiseData$Builder" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var initMethod: jmethodID? - static var build: jmethodID? - static var addManufacturerData: jmethodID? - static var addServiceData: jmethodID? - static var addServiceData2Params: jmethodID? - static var addServiceUuid: jmethodID? - static var setIncludeDeviceName: jmethodID? - static var setIncludeTxPowerLevel: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertiseSettings.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertiseSettings.swift deleted file mode 100644 index a675ad7..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertiseSettings.swift +++ /dev/null @@ -1,336 +0,0 @@ -// -// BluetoothLeAdvertiseSettings.swift -// Android -// -// Created by Marco Estrella on 5/28/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE { - - typealias AdvertiseSettings = AndroidBluetoothLowEnergyAdvertiseSettings -} - -public extension AndroidBluetoothLowEnergyAdvertiseSettings { - - typealias AdvertiseMode = AndroidBluetoothLowEnergyAdvertiseMode - typealias TxPowerLevel = AndroidBluetoothLowEnergyTxPowerLevel -} - -/** - * The AdvertiseSettings provide a way to adjust advertising preferences for each Bluetooth LE advertisement instance. - * - * Use AdvertiseSettings.Builder to create an instance of this class. - */ -public final class AndroidBluetoothLowEnergyAdvertiseSettings: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - /** - * Returns the advertise mode. - */ - public var mode: AndroidBluetoothLowEnergyAdvertiseSettings.AdvertiseMode? { - - get { return getMode() } - } - - /** - * Returns the advertising time limit in milliseconds. - */ - public var timeout: Int { - - get { return getTimeout() } - } - - /** - * Returns the TX power level for advertising. - */ - public var txPowerLevel: AndroidBluetoothLowEnergyAdvertiseSettings.TxPowerLevel? { - - get { return nil } - } - - /** - * Returns whether the advertisement will indicate connectable. - */ - public var isConnectable: Bool { - - get { return getIsConnectable() } - } -} - -// MARK: - CONSTANTS - -public extension Android.Bluetooth.LE.AdvertiseSettings { - - static var ADVERTISE_MODE_BALANCED: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_MODE_BALANCED", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_MODE_BALANCED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var ADVERTISE_MODE_LOW_LATENCY: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_MODE_LOW_LATENCY", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_MODE_LOW_LATENCY, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var ADVERTISE_MODE_LOW_POWER: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_MODE_LOW_POWER", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_MODE_LOW_POWER, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var ADVERTISE_TX_POWER_HIGH: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_TX_POWER_HIGH", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_TX_POWER_HIGH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var ADVERTISE_TX_POWER_LOW: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_TX_POWER_LOW", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_TX_POWER_LOW, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var ADVERTISE_TX_POWER_MEDIUM: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_TX_POWER_MEDIUM", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_TX_POWER_MEDIUM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var ADVERTISE_TX_POWER_ULTRA_LOW: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_TX_POWER_ULTRA_LOW", - fieldType: "I", - fieldCache: &JNICache.FieldID.ADVERTISE_TX_POWER_ULTRA_LOW, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } -} - -// MARK: - INTERNAL METHODS - -internal extension Android.Bluetooth.LE.AdvertiseSettings { - - @usableFromInline - func getIsConnectable() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isConnectable", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isConnectable, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getMode() -> Android.Bluetooth.LE.AdvertiseSettings.AdvertiseMode? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getMode", - methodSig: "()I", - methodCache: &JNICache.MethodID.getMode, - args: &__args, - locals: &__locals) - - return Android.Bluetooth.LE.AdvertiseSettings.AdvertiseMode( rawValue: Int( __return )) - } - - @usableFromInline - func getTimeout() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getTimeout", - methodSig: "()I", - methodCache: &JNICache.MethodID.getTimeout, - args: &__args, - locals: &__locals) - - return Int( __return ) - } - - @usableFromInline - func getTxPowerLevel() -> Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getTxPowerLevel", - methodSig: "()I", - methodCache: &JNICache.MethodID.getTxPowerLevel, - args: &__args, - locals: &__locals) - - return Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel( rawValue: Int( __return )) - } -} - -// MARK: - JNICache - -internal extension Android.Bluetooth.LE.AdvertiseSettings { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["AdvertiseSettings"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var ADVERTISE_MODE_BALANCED: jfieldID? - static var ADVERTISE_MODE_LOW_LATENCY: jfieldID? - static var ADVERTISE_MODE_LOW_POWER: jfieldID? - static var ADVERTISE_TX_POWER_HIGH: jfieldID? - static var ADVERTISE_TX_POWER_LOW: jfieldID? - static var ADVERTISE_TX_POWER_MEDIUM: jfieldID? - static var ADVERTISE_TX_POWER_ULTRA_LOW: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var getMode: jmethodID? - static var getTimeout: jmethodID? - static var getTxPowerLevel: jmethodID? - static var isConnectable: jmethodID? - - } - } -} - -// MARK: - - -public extension Android.Bluetooth.LE.AdvertiseSettings { - - /// LE Advertise Mode. - struct AndroidBluetoothLowEnergyAdvertiseMode: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Perform Bluetooth LE advertising in low power mode. This is the default and preferred advertising mode as it consumes the least power. - */ - public static let lowPower = Android.Bluetooth.LE.AdvertiseSettings.AdvertiseMode(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_MODE_LOW_POWER) - - /** - * Perform Bluetooth LE advertising in low power mode. This is the default and preferred advertising mode as it consumes the least power. - */ - public static let balanced = Android.Bluetooth.LE.AdvertiseSettings.AdvertiseMode(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_MODE_BALANCED) - - /** - * Perform Bluetooth LE advertising in low power mode. This is the default and preferred advertising mode as it consumes the least power. - */ - public static let lowLatency = Android.Bluetooth.LE.AdvertiseSettings.AdvertiseMode(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) - } - - /// LE Advertise Mode. - struct AndroidBluetoothLowEnergyTxPowerLevel: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Advertise using the lowest transmission (TX) power level. Low transmission power can be used to restrict the visibility range of advertising packets. - */ - public static let ultraLow = Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW) - - /** - * Advertise using low TX power level. - */ - public static let low = Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_TX_POWER_LOW) - - /** - * Advertise using medium TX power level. - */ - public static let medium = Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM) - - /** - * Advertise using high TX power level. This corresponds to largest visibility range of the advertising packet. - */ - public static let high = Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertiseSettingsBuilder.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertiseSettingsBuilder.swift deleted file mode 100644 index 873a750..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertiseSettingsBuilder.swift +++ /dev/null @@ -1,203 +0,0 @@ -// -// BluetoothLeAdvertiseSettingsBuilder.swift -// Android -// -// Created by Marco Estrella on 5/28/18. -// - -import Foundation -import java_swift -import Android - -public extension AndroidBluetoothLowEnergyAdvertiseSettings { - - typealias Builder = AndroidBluetoothLowEnergyAdvertiseSettingsBuilder -} - -/** - * Builder class for AdvertiseSettings. - */ -public final class AndroidBluetoothLowEnergyAdvertiseSettingsBuilder: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "()V", - methodCache: &JNICache.MethodID.initMethod, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} - -// MARK: METHODS - -public extension AndroidBluetoothLowEnergyAdvertiseSettings.Builder { - - /** - * Set advertise mode to control the advertising power and latency. - */ - func setAdvertiseMode(advertiseMode: Android.Bluetooth.LE.AdvertiseSettings.AdvertiseMode) -> AndroidBluetoothLowEnergyAdvertiseSettings.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(advertiseMode.rawValue) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setAdvertiseMode", - methodSig: "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setAdvertiseMode, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setAdvertiseMode", - methodSig: "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setAdvertiseMode, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseSettings.Builder(javaObject: __return) - } - - /** - * Set whether the advertisement type should be connectable or non-connectable. - */ - func setConnectable( connectable: Bool) -> AndroidBluetoothLowEnergyAdvertiseData.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(connectable ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setConnectable", - methodSig: "(Z)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setConnectable, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setConnectable", - methodSig: "(Z)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setConnectable, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseData.Builder(javaObject: __return) - } - - /** - * Limit advertising to a given amount of time. - */ - func setTimeout(timeoutMillis: Int) -> AndroidBluetoothLowEnergyAdvertiseSettings.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(timeoutMillis) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setTimeout", - methodSig: "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setTimeout, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setTimeout", - methodSig: "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setTimeout, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseSettings.Builder(javaObject: __return) - } - - /** - * Set advertise mode to control the advertising power and latency. - */ - func setTxPowerLevel(txPowerLevel: Android.Bluetooth.LE.AdvertiseSettings.TxPowerLevel) -> AndroidBluetoothLowEnergyAdvertiseSettings.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(txPowerLevel.rawValue) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setTxPowerLevel", - methodSig: "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setTxPowerLevel, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setTxPowerLevel", - methodSig: "(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;", - methodCache: &JNICache.MethodID.setTxPowerLevel, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertiseSettings.Builder(javaObject: __return) - } -} - -// MARK: - JNICache - -internal extension AndroidBluetoothLowEnergyAdvertiseSettings.Builder { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/le/AdvertiseSettings$Builder" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var initMethod: jmethodID? - static var build: jmethodID? - static var setAdvertiseMode: jmethodID? - static var setConnectable: jmethodID? - static var setTimeout: jmethodID? - static var setTxPowerLevel: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertiser.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertiser.swift new file mode 100644 index 0000000..5c804cc --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothLeAdvertiser.swift @@ -0,0 +1,31 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.BluetoothLeAdvertiser") +open class BluetoothLeAdvertiser: JavaObject { + @JavaMethod + open func startAdvertising(_ arg0: AdvertiseSettings?, _ arg1: AdvertiseData?, _ arg2: AdvertiseData?, _ arg3: AdvertiseCallback?) + + @JavaMethod + open func startAdvertising(_ arg0: AdvertiseSettings?, _ arg1: AdvertiseData?, _ arg2: AdvertiseCallback?) + + @JavaMethod + open func stopAdvertising(_ arg0: AdvertiseCallback?) + + @JavaMethod + open func stopAdvertisingSet(_ arg0: AdvertisingSetCallback?) + + @JavaMethod + open func startAdvertisingSet(_ arg0: AdvertisingSetParameters?, _ arg1: AdvertiseData?, _ arg2: AdvertiseData?, _ arg3: PeriodicAdvertisingParameters?, _ arg4: AdvertiseData?, _ arg5: Int32, _ arg6: Int32, _ arg7: AdvertisingSetCallback?, _ arg8: Handler?) + + @JavaMethod + open func startAdvertisingSet(_ arg0: AdvertisingSetParameters?, _ arg1: AdvertiseData?, _ arg2: AdvertiseData?, _ arg3: PeriodicAdvertisingParameters?, _ arg4: AdvertiseData?, _ arg5: Int32, _ arg6: Int32, _ arg7: AdvertisingSetCallback?) + + @JavaMethod + open func startAdvertisingSet(_ arg0: AdvertisingSetParameters?, _ arg1: AdvertiseData?, _ arg2: AdvertiseData?, _ arg3: PeriodicAdvertisingParameters?, _ arg4: AdvertiseData?, _ arg5: AdvertisingSetCallback?, _ arg6: Handler?) + + @JavaMethod + open func startAdvertisingSet(_ arg0: AdvertisingSetParameters?, _ arg1: AdvertiseData?, _ arg2: AdvertiseData?, _ arg3: PeriodicAdvertisingParameters?, _ arg4: AdvertiseData?, _ arg5: AdvertisingSetCallback?) +} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSet.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertisingSet.swift deleted file mode 100644 index bb5bdf0..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSet.swift +++ /dev/null @@ -1,189 +0,0 @@ -// -// BluetoothLeAdvertisingSet.swift -// Android -// -// Created by Marco Estrella on 5/28/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE { - - typealias AdvertisingSet = AndroidBluetoothLowEnergyAdvertisingSet -} - -/** - * This class provides a way to control single Bluetooth LE advertising instance. - * - * To get an instance of AdvertisingSet, call the startAdvertisingSet(AdvertisingSetParameters, AdvertiseData, AdvertiseData, - * PeriodicAdvertisingParameters, AdvertiseData, AdvertisingSetCallback) method. - * - * Note: Most of the methods here require BLUETOOTH_ADMIN permission. - */ -public final class AndroidBluetoothLowEnergyAdvertisingSet: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} - -// MARK: - METHODS - -public extension AndroidBluetoothLowEnergyAdvertisingSet { - - /** - * Enables Advertising. - * - * Requires BLUETOOTH_ADMIN - */ - func enableAdvertising(enable: Bool, duration: Int, maxExtendedAdvertisingEvents: Int) { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 3) - __args[0] = jvalue(z: jboolean(enable ? JNI_TRUE : JNI_FALSE) ) - __args[1] = jvalue(i: jint(duration) ) - __args[2] = jvalue(i: jint(maxExtendedAdvertisingEvents) ) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "enableAdvertising", - methodSig: "(ZII)V", - methodCache: &JNICache.MethodID.enableAdvertising, - args: &__args, - locals: &__locals) - } - - /** - * Used to enable/disable periodic advertising. - */ - func setPeriodicAdvertisingEnabled(enable: Bool) { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = jvalue(z: jboolean(enable ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setPeriodicAdvertisingEnabled", - methodSig: "(Z)V", - methodCache: &JNICache.MethodID.setPeriodicAdvertisingEnabled, - args: &__args, - locals: &__locals) - } - - /** - * Set/update data being Advertised. - */ - func setAdvertisingData(advertiseData: Android.Bluetooth.LE.AdvertiseData) { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = JNIType.toJava( value: advertiseData, locals: &__locals ) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setAdvertisingData", - methodSig: "(Landroid/bluetooth/le/AdvertiseData;)V", - methodCache: &JNICache.MethodID.setAdvertisingData, - args: &__args, - locals: &__locals) - } - - /** - * Used to set periodic advertising data, must be called after setPeriodicAdvertisingParameters, - * or after advertising was started with periodic advertising data set. - */ - func setAdvertisingParameters(parameters: Android.Bluetooth.LE.AdvertisingSetParameters) { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = JNIType.toJava( value: parameters, locals: &__locals ) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setAdvertisingParameters", - methodSig: "(Landroid/bluetooth/le/AdvertisingSetParameters;)V", - methodCache: &JNICache.MethodID.setAdvertisingParameters, - args: &__args, - locals: &__locals) - } - - /** - * Update periodic advertising parameters associated with this set. - */ - func setPeriodicAdvertisingParameters(parameters: Android.Bluetooth.LE.PeriodicAdvertisingParameters) { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = JNIType.toJava( value: parameters, locals: &__locals ) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setPeriodicAdvertisingParameters", - methodSig: "(Landroid/bluetooth/le/PeriodicAdvertisingParameters;)V", - methodCache: &JNICache.MethodID.setPeriodicAdvertisingParameters, - args: &__args, - locals: &__locals) - } - - /** - * Set/update scan response data. - */ - func setScanResponseData(scanResponse: Android.Bluetooth.LE.AdvertiseData) { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = JNIType.toJava( value: scanResponse, locals: &__locals ) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "setScanResponseData", - methodSig: "(Landroid/bluetooth/le/AdvertiseData;)V", - methodCache: &JNICache.MethodID.setScanResponseData, - args: &__args, - locals: &__locals) - } -} - -// MARK: - JNICache - -internal extension AndroidBluetoothLowEnergyAdvertisingSet { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["AdvertisingSet"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var enableAdvertising: jmethodID? - static var setAdvertisingData: jmethodID? - static var setAdvertisingParameters: jmethodID? - static var setPeriodicAdvertisingData: jmethodID? - static var setPeriodicAdvertisingEnabled: jmethodID? - static var setPeriodicAdvertisingParameters: jmethodID? - static var setScanResponseData: jmethodID? - - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetCallback.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetCallback.swift deleted file mode 100644 index 79291cd..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetCallback.swift +++ /dev/null @@ -1,573 +0,0 @@ -// -// BluetoothLeAdvertisingSetCallback.swift -// Android -// -// Created by Marco Estrella on 5/28/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth.LE { - - typealias AdvertisingSetCallback = AndroidBluetoothLowEnergyAdvertisingSetCallback -} - -public extension Android.Bluetooth.LE.AdvertisingSetCallback { - - typealias Status = AndroidBluetoothLowEnergyAdvertisingStatus -} - -/// Bluetooth LE advertising set callbacks, used to deliver advertising operation status. -public protocol AndroidBluetoothLowEnergyAdvertisingSetCallback: JavaProtocol { - - /** - * Callback triggered in response to setAdvertisingData(AdvertiseData) indicating result of the operation. - */ - func onAdvertisingDataSet(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, status: Status) - - /** - * Callback triggered in response to startAdvertisingSet(AdvertisingSetParameters, AdvertiseData, AdvertiseData, PeriodicAdvertisingParameters, - * AdvertiseData, AdvertisingSetCallback) indicating result of the operation. - */ - func onAdvertisingEnabled(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, enable: Bool, status: Status) - - /** - * Callback triggered in response to setAdvertisingParameters(AdvertisingSetParameters) indicating result of the operation. - */ - func onAdvertisingParametersUpdated(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, txPower: Int, status: Status) - - /** - * Callback triggered in response to startAdvertisingSet(AdvertisingSetParameters, AdvertiseData, AdvertiseData, PeriodicAdvertisingParameters, - * AdvertiseData, AdvertisingSetCallback) indicating result of the operation. - */ - func onAdvertisingSetStarted(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, txPower: Int, status: Status) - - /** - * Callback triggered in response to stopAdvertisingSet(AdvertisingSetCallback) indicating advertising set is stopped. - */ - func onAdvertisingSetStopped(advertisingSet: Android.Bluetooth.LE.AdvertisingSet) - - /** - * Callback triggered in response to setPeriodicAdvertisingData(AdvertiseData) indicating result of the operation. - */ - func onPeriodicAdvertisingDataSet(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, status: Status) - - /** - * Callback triggered in response to setPeriodicAdvertisingEnabled(boolean) indicating result of the operation. - */ - func onPeriodicAdvertisingEnabled(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, enable: Bool, status: Status) - - /** - * Callback triggered in response to setPeriodicAdvertisingParameters(PeriodicAdvertisingParameters) indicating result of the operation. - */ - func onPeriodicAdvertisingParametersUpdated(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, status: Status) - - /** - * Callback triggered in response to setAdvertisingData(AdvertiseData) indicating result of the operation. - */ - func onScanResponseDataSet(advertisingSet: Android.Bluetooth.LE.AdvertisingSet, status: Status) -} - -// MARK: - Supporting Type - -public struct AndroidBluetoothLowEnergyAdvertisingStatus: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Failed to start advertising as the advertising is already started. - */ - public static let alreadyStarted = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants.ADVERTISE_FAILED_ALREADY_STARTED) - - /** - * Failed to start advertising as the advertise data to be broadcasted is too large. - */ - public static let dataTooLarge = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants.ADVERTISE_FAILED_DATA_TOO_LARGE) - - /** - * This feature is not supported on this platform. - */ - public static let featureUnsupported = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants.ADVERTISE_FAILED_FEATURE_UNSUPPORTED) - - /** - * Operation failed due to an internal error. - */ - public static let internalError = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants.ADVERTISE_FAILED_INTERNAL_ERROR) - - /** - * Failed to start advertising because no advertising instance is available. - */ - public static let tooManyAdvertisers = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS) - - /** - * The requested operation was successful. - */ - public static let success = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants.ADVERTISE_SUCCESS) - -} - -// MARK: - Constants - -internal class AndroidBluetoothLowEnergyAdvertisingSetCallbackConstants { - - /// Failed to start advertising as the advertising is already started. - static var ADVERTISE_FAILED_ALREADY_STARTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_FAILED_ALREADY_STARTED", - fieldType: "I", - fieldCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.FieldID.ADVERTISE_FAILED_ALREADY_STARTED, - className: AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.className, - classCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.jniClass ) - - return Int(__value) - } - } - - /// Failed to start advertising as the advertise data to be broadcasted is too large. - static var ADVERTISE_FAILED_DATA_TOO_LARGE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_FAILED_DATA_TOO_LARGE", - fieldType: "I", - fieldCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.FieldID.ADVERTISE_FAILED_DATA_TOO_LARGE, - className: AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.className, - classCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.jniClass ) - - return Int(__value) - } - } - - /// This feature is not supported on this platform. - static var ADVERTISE_FAILED_FEATURE_UNSUPPORTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_FAILED_FEATURE_UNSUPPORTED", - fieldType: "I", - fieldCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.FieldID.ADVERTISE_FAILED_FEATURE_UNSUPPORTED, - className: AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.className, - classCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.jniClass ) - - return Int(__value) - } - } - - - /// Operation failed due to an internal error. - static var ADVERTISE_FAILED_INTERNAL_ERROR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_FAILED_INTERNAL_ERROR", - fieldType: "I", - fieldCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.FieldID.ADVERTISE_FAILED_INTERNAL_ERROR, - className: AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.className, - classCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.jniClass ) - - return Int(__value) - } - } - - /// Failed to start advertising because no advertising instance is available. - static var ADVERTISE_FAILED_TOO_MANY_ADVERTISERS: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS", - fieldType: "I", - fieldCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.FieldID.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS, - className: AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.className, - classCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.jniClass ) - - return Int(__value) - } - } - - /// The requested operation was successful. - static var ADVERTISE_SUCCESS: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "ADVERTISE_SUCCESS", - fieldType: "I", - fieldCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.FieldID.ADVERTISE_SUCCESS, - className: AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.className, - classCache: &AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal.JNICache.jniClass ) - - return Int(__value) - } - } -} - -// MARK: - Local Listener - -extension AndroidBluetoothLowEnergyAdvertisingSetCallback { - - public func localJavaObject( _ locals: UnsafeMutablePointer<[jobject]> ) -> jobject? { - - return AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal( owned: self, proto: self ).localJavaObject( locals ) - } -} - -internal class AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal: JNILocalProxy { - - fileprivate static let _proxyClass: jclass = { - - var natives: [JNINativeMethod] = [ - JNICache.Method.onAdvertisingDataSet.method, - .finalize - ] - - let clazz = JNI.FindClass( proxyClassName() ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - override open class func proxyClassName() -> String { return JNICache.className } - - override open class func proxyClass() -> jclass? { return _proxyClass } -} - -internal extension AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.LE.className(["SwiftAdvertiseSetCallback"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - struct FieldID { - static var ADVERTISE_FAILED_ALREADY_STARTED: jfieldID? - static var ADVERTISE_FAILED_DATA_TOO_LARGE: jfieldID? - static var ADVERTISE_FAILED_FEATURE_UNSUPPORTED: jfieldID? - static var ADVERTISE_FAILED_INTERNAL_ERROR: jfieldID? - static var ADVERTISE_FAILED_TOO_MANY_ADVERTISERS: jfieldID? - static var ADVERTISE_SUCCESS: jfieldID? - } - - /// JNI Method cache - fileprivate enum Method { - internal - enum onAdvertisingDataSet: JNINativeMethodEntry { - - static let name = "__on_advertising_dataSet" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingDataSet_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingDataSet - } - - enum onAdvertisingEnabled: JNINativeMethodEntry { - - static let name = "__on_advertising_enabled" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .boolean, - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingEnabled_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingEnabled - } - - enum onAdvertisingParametersUpdated: JNINativeMethodEntry { - - static let name = "__on_avertising_parameters_updated" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .int, - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingParametersUpdated_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingParametersUpdated - } - - enum onAdvertisingSetStarted: JNINativeMethodEntry { - - static let name = "__on_advertising_set_started" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .int, - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingSetStarted_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingSetStarted - } - - enum onAdvertisingSetStopped: JNINativeMethodEntry { - - static let name = "__on_advertising_set_stopped" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature) - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingSetStopped_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingSetStopped - } - - enum onPeriodicAdvertisingDataSet: JNINativeMethodEntry { - - static let name = "__on_periodic_advertising_dataSet" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnPeriodicAdvertisingDataSet_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onPeriodicAdvertisingDataSet - } - - enum onPeriodicAdvertisingEnabled: JNINativeMethodEntry { - - static let name = "__on_periodic_advertising_enabled" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .boolean, - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnPeriodicAdvertisingEnabled_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onPeriodicAdvertisingEnabled - } - - enum onPeriodicAdvertisingParametersUpdated: JNINativeMethodEntry { - - static let name = "__on_periodic_advertising_parameters_updated" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnPeriodicAdvertisingParametersUpdated_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onPeriodicAdvertisingParametersUpdated - } - - enum onScanResponsaDataset: JNINativeMethodEntry { - - static let name = "__on_scan_response_dataSet" - - /// "(JILandroid/bluetooth/le/AdvertiseSettings;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(Android.Bluetooth.LE.AdvertisingSet.JNICache.classSignature), - .int - ], returnType: .void) - - static let thunk: AndroidBluetoothLowEnergyAdvertiseSetCallback_OnScanResponsaDataset_Type = AndroidBluetoothLowEnergyAdvertiseSetCallback_onScanResponsaDataset - } - } - } -} - -// MARK: - Private Methods - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingDataSet_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingDataSet( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onAdvertisingDataSet(advertisingSet: advertisingSet, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingEnabled_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jboolean, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingEnabled( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ enableParam: jboolean, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - let enable = enableParam != jboolean(JNI_FALSE) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onAdvertisingEnabled(advertisingSet: advertisingSet, enable: enable, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingParametersUpdated_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingParametersUpdated( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ txPowerParam: jint, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let txPower = Int(txPowerParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onAdvertisingParametersUpdated(advertisingSet: advertisingSet, txPower: txPower, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingSetStarted_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingSetStarted( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ txPowerParam: jint, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let txPower = Int(txPowerParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onAdvertisingSetStarted(advertisingSet: advertisingSet, txPower: txPower, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnAdvertisingSetStopped_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onAdvertisingSetStopped( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onAdvertisingSetStopped(advertisingSet: advertisingSet) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnPeriodicAdvertisingDataSet_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onPeriodicAdvertisingDataSet( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onPeriodicAdvertisingDataSet(advertisingSet: advertisingSet, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnPeriodicAdvertisingEnabled_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jboolean, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onPeriodicAdvertisingEnabled( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ enableParam: jboolean, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - let enable = enableParam != jboolean(JNI_FALSE) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onPeriodicAdvertisingEnabled(advertisingSet: advertisingSet, enable: enable, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnPeriodicAdvertisingParametersUpdated_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onPeriodicAdvertisingParametersUpdated( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onPeriodicAdvertisingParametersUpdated(advertisingSet: advertisingSet, status: status) -} - -private typealias AndroidBluetoothLowEnergyAdvertiseSetCallback_OnScanResponsaDataset_Type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?, _: jint) -> () - -private func AndroidBluetoothLowEnergyAdvertiseSetCallback_onScanResponsaDataset( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ advertisingSetParam: jobject?, - _ statusParam: jint) -> () { - - let advertisingSet = Android.Bluetooth.LE.AdvertisingSet(javaObject: advertisingSetParam) - let status = Android.Bluetooth.LE.AdvertisingSetCallback.Status(rawValue: Int(statusParam)) - - AndroidBluetoothLowEnergyAdvertiseSetCallbackListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onScanResponseDataSet(advertisingSet: advertisingSet, status: status) -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParameters.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParameters.swift deleted file mode 100644 index aabca07..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParameters.swift +++ /dev/null @@ -1,521 +0,0 @@ -// -// BluetoothLeAdvertisingSetParameters.swift -// Android -// -// Created by Marco Estrella on 5/25/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE { - - typealias AdvertisingSetParameters = AndroidBluetoothLowEnergyAdvertisingSetParameters -} - -public extension Android.Bluetooth.LE.AdvertisingSetParameters { - - typealias PrimaryPhy = AndroidBluetoothLowEnergyPrimaryPhy - - typealias SecondaryPhy = AndroidBluetoothLowEnergySecondaryPhy - - typealias TxPowerLevel = AndroidBluetoothLowEnergyTxPowerLevel -} - -public extension Android.Bluetooth.LE.AdvertisingSetParameters { - - /// LE Primary Phy - struct AndroidBluetoothLowEnergyPrimaryPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY. Used to refer to LE 1M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe1m = Android.Bluetooth.LE.AdvertisingSetParameters.PrimaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M) - - /** - * Bluetooth LE Coded PHY. Used to refer to LE Coded Physical Channel for advertising, scanning or connection. - */ - public static let phyLeCoded = Android.Bluetooth.LE.AdvertisingSetParameters.PrimaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED) - } - - /// LE Secondary Phy - struct AndroidBluetoothLowEnergySecondaryPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY. Used to refer to LE 1M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe1m = Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M) - - /** - * Bluetooth LE Coded PHY. Used to refer to LE Coded Physical Channel for advertising, scanning or connection. - */ - public static let phyLeCoded = Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED) - - /** - * Bluetooth LE 2M PHY. Used to refer to LE 2M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe2m = Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_2M) - } - - /// LE Secondary Phy - struct AndroidBluetoothLowEnergyTxPowerLevel: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let ultraLow = Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertisingSetParameters.TX_POWER_ULTRA_LOW) - - public static let low = Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertisingSetParameters.TX_POWER_LOW) - - public static let medium = Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertisingSetParameters.TX_POWER_MEDIUM) - - public static let high = Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel(rawValue: Android.Bluetooth.LE.AdvertisingSetParameters.TX_POWER_HIGH) - } -} - - - -public final class AndroidBluetoothLowEnergyAdvertisingSetParameters: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} - -// MARK: Properties - -public extension AndroidBluetoothLowEnergyAdvertisingSetParameters { - - /** - * Returns the advertising interval. - */ - var interval: Int { - - get { return getInterval() } - } - - /** - * Returns the primary advertising phy. - */ - var primaryPhy: Android.Bluetooth.LE.AdvertisingSetParameters.PrimaryPhy? { - - get { return getPrimaryPhy() } - } - - /** - * Returns the secondary advertising phy. - */ - var secondaryPhy: Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy? { - - get { return getSecondaryPhy() } - } - - /** - * Returns the TX power level for advertising. - */ - var txPowerLevel: Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel? { - - get { return getTxPowerLevel() } - } - - /** - * Returns whether the TX Power will be included. - */ - var includeTxPower: Bool { - - get { return getIncludeTxPower() } - } - - /** - * Returns whether the advertisement will be anonymous. - */ - var isAnonymous: Bool { - - get { return getIsAnonymous() } - } - - /** - * Returns whether the advertisement will be connectable. - */ - var isConnectable: Bool { - - get { return getIsConnectable() } - } - - /** - * Returns whether the legacy advertisement will be used. - */ - var isLegacy: Bool { - - get { return getIsLegacy() } - } - - /** - * Returns whether the advertisement will be scannable. - */ - var isScannable: Bool { - - get { return getIsScannable() } - } -} - -// MARK: CONSTANTS - -internal extension Android.Bluetooth.LE.AdvertisingSetParameters { - - static var INTERVAL_HIGH: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "INTERVAL_HIGH", - fieldType: "I", - fieldCache: &JNICache.FieldID.INTERVAL_HIGH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var INTERVAL_LOW: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "INTERVAL_LOW", - fieldType: "I", - fieldCache: &JNICache.FieldID.INTERVAL_LOW, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var INTERVAL_MAX: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "INTERVAL_MAX", - fieldType: "I", - fieldCache: &JNICache.FieldID.INTERVAL_MAX, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var INTERVAL_MEDIUM: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "INTERVAL_MEDIUM", - fieldType: "I", - fieldCache: &JNICache.FieldID.INTERVAL_MEDIUM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var INTERVAL_MIN: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "INTERVAL_MIN", - fieldType: "I", - fieldCache: &JNICache.FieldID.INTERVAL_MIN, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var TX_POWER_HIGH: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_HIGH", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_HIGH, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var TX_POWER_LOW: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_LOW", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_LOW, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var TX_POWER_MAX: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_MAX", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_MAX, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var TX_POWER_MEDIUM: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_MEDIUM", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_MEDIUM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var TX_POWER_MIN: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_MIN", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_MIN, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } - - static var TX_POWER_ULTRA_LOW: Int { - get { - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_ULTRA_LOW", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_ULTRA_LOW, - className: JNICache.className, - classCache: &JNICache.jniClass ) - return Int(__value) - } - } -} - -// MARK: INTERNAL METHODS - -internal extension Android.Bluetooth.LE.AdvertisingSetParameters { - - @usableFromInline - func getInterval() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getInterval", - methodSig: "()I", - methodCache: &JNICache.MethodID.getInterval, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getPrimaryPhy() -> Android.Bluetooth.LE.AdvertisingSetParameters.PrimaryPhy? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getPrimaryPhy", - methodSig: "()I", - methodCache: &JNICache.MethodID.getPrimaryPhy, - args: &__args, - locals: &__locals) - return Android.Bluetooth.LE.AdvertisingSetParameters.PrimaryPhy(rawValue: Int(__return)) - } - - @usableFromInline - func getSecondaryPhy() -> Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getSecondaryPhy", - methodSig: "()I", - methodCache: &JNICache.MethodID.getSecondaryPhy, - args: &__args, - locals: &__locals) - return Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy(rawValue: Int(__return)) - } - - @usableFromInline - func getTxPowerLevel() -> Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getTxPowerLevel", - methodSig: "()I", - methodCache: &JNICache.MethodID.getTxPowerLevel, - args: &__args, - locals: &__locals) - return Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel(rawValue: Int(__return)) - } - - @usableFromInline - func getIncludeTxPower() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "includeTxPower", - methodSig: "()Z", - methodCache: &JNICache.MethodID.includeTxPower, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getIsAnonymous() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isAnonymous", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isAnonymous, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getIsConnectable() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isConnectable", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isConnectable, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getIsLegacy() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isLegacy", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isLegacy, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getIsScannable() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isScannable", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isScannable, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} - -// MARK: - JNICache - -internal extension Android.Bluetooth.LE.AdvertisingSetParameters { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["AdvertisingParameters"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var INTERVAL_HIGH: jfieldID? - static var INTERVAL_LOW: jfieldID? - static var INTERVAL_MAX: jfieldID? - static var INTERVAL_MEDIUM: jfieldID? - static var INTERVAL_MIN: jfieldID? - static var TX_POWER_HIGH: jfieldID? - static var TX_POWER_LOW: jfieldID? - static var TX_POWER_MAX: jfieldID? - static var TX_POWER_MEDIUM: jfieldID? - static var TX_POWER_MIN: jfieldID? - static var TX_POWER_ULTRA_LOW: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var getInterval: jmethodID? - static var getPrimaryPhy: jmethodID? - static var getSecondaryPhy: jmethodID? - static var getTxPowerLevel: jmethodID? - static var includeTxPower: jmethodID? - static var isAnonymous: jmethodID? - static var isConnectable: jmethodID? - static var isLegacy: jmethodID? - static var isScannable: jmethodID? - - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParametersBuilder.swift b/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParametersBuilder.swift deleted file mode 100644 index 5afedc5..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeAdvertisingSetParametersBuilder.swift +++ /dev/null @@ -1,350 +0,0 @@ -// -// BluetoothLeAdvertisingSetParametersBuilder.swift -// Android -// -// Created by Marco Estrella on 5/25/18. -// - -import Foundation -import java_swift -import Android - -public extension AndroidBluetoothLowEnergyAdvertisingSetParameters { - - typealias Builder = AndroidBluetoothLowEnergyAdvertisingSetParametersBuilder -} - -public final class AndroidBluetoothLowEnergyAdvertisingSetParametersBuilder: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "()V", - methodCache: &JNICache.MethodID.initMethod, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} - -// MARK: - METHODS - -public extension AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - - func build() -> AndroidBluetoothLowEnergyAdvertisingSetParameters { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "build", - methodSig: "()Landroid/bluetooth/le/AdvertisingParameters;", - methodCache: &JNICache.MethodID.build, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters( javaObject: __return ) - } - - /** - * Set whether advertiser address should be ommited from all packets. - */ - func setConnectable(connectable: Bool) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(connectable ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setConnectable", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPower, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setConnectable", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setConnectable, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * Set whether TX power should be included in the extended header. - */ - func setIncludeTxPower(includeTxPower: Bool) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(includeTxPower ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setIncludeTxPower", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPower, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setIncludeTxPower", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPower, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * Set advertising interval. - * - * interval - int: Bluetooth LE Advertising interval, in 0.625ms unit. Valid range is from 160 (100ms) to 16777215 (10,485.759375 s). - * Recommended values are: INTERVAL_LOW, INTERVAL_MEDIUM, or INTERVAL_HIGH. - */ - func setInterval(interval: Int) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(interval) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setInterval", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setInterval, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setInterval", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setInterval, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * When set to true, advertising set will advertise 4.x Spec compliant advertisements. - */ - func setLegacyMode( isLegacy: Bool) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(isLegacy ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setLegacyMode", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setLegacyMode, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setLegacyMode", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setLegacyMode, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * Set the primary physical channel used for this advertising set. This is used only if legacy mode is not used. - * Use isLeCodedPhySupported() to determine if LE Coded PHY is supported on this device. - */ - func setPrimaryPhy(primaryphy: Android.Bluetooth.LE.AdvertisingSetParameters.PrimaryPhy) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(primaryphy.rawValue) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setPrimaryPhy", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setPrimaryPhy, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setPrimaryPhy", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setPrimaryPhy, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * Set whether the advertisement type should be scannable. - */ - func setScannable( scannable: Bool) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(scannable ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setScannable", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setScannable, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setScannable", - methodSig: "(Z)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setScannable, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * Set the secondary physical channel used for this advertising set. - */ - func setSecondaryPhy(secondaryPhy: Android.Bluetooth.LE.AdvertisingSetParameters.SecondaryPhy) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(secondaryPhy.rawValue) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setSecondaryPhy", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setSecondaryPhy, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setSecondaryPhy", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setSecondaryPhy, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } - - /** - * Set the transmission power level for the advertising. - */ - func setTxPowerLevel(txPowerLevel: Android.Bluetooth.LE.AdvertisingSetParameters.TxPowerLevel) -> AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(txPowerLevel.rawValue) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setTxPowerLevel", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setTxPowerLevel, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setTxPowerLevel", - methodSig: "(I)Landroid/bluetooth/le/AdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setTxPowerLevel, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder(javaObject: __return) - } -} - -// MARK: - JNICache - -internal extension AndroidBluetoothLowEnergyAdvertisingSetParameters.Builder { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/le/AdvertisingParameters$Builder" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var initMethod: jmethodID? - static var build: jmethodID? - static var setAnonymous: jmethodID? - static var setConnectable: jmethodID? - static var setIncludeTxPower: jmethodID? - static var setInterval: jmethodID? - static var setLegacyMode: jmethodID? - static var setPrimaryPhy: jmethodID? - static var setScannable: jmethodID? - static var setSecondaryPhy: jmethodID? - static var setTxPowerLevel: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeAudio.swift b/Sources/AndroidBluetooth/BluetoothLeAudio.swift new file mode 100644 index 0000000..6f96934 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothLeAudio.swift @@ -0,0 +1,87 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaLang +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothLeAudio", implements: BluetoothProfile.self, AutoCloseable.self) +open class BluetoothLeAudio: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func getGroupId(_ arg0: BluetoothDevice?) -> Int32 + + @JavaMethod + open func getConnectedGroupLeadDevice(_ arg0: Int32) -> BluetoothDevice! + + @JavaMethod + open func getConnectedDevices() -> List! + + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! + + @JavaMethod + open override func finalize() + + @JavaMethod + open func close() +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED: String + + @JavaStaticField(isFinal: true) + public var GROUP_ID_INVALID: Int32 + + @JavaStaticField(isFinal: true) + public var A2DP: Int32 + + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 + + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String + + @JavaStaticField(isFinal: true) + public var GATT: Int32 + + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 + + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 + + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 + + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 + + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 + + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 + + @JavaStaticField(isFinal: true) + public var SAP: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 + + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig+Builder.swift b/Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig+Builder.swift new file mode 100644 index 0000000..fd18993 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig+Builder.swift @@ -0,0 +1,44 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothLeAudioCodecConfig { + @JavaClass("android.bluetooth.BluetoothLeAudioCodecConfig$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + @_nonoverride public convenience init(_ arg0: BluetoothLeAudioCodecConfig?, environment: JNIEnvironment? = nil) + + @JavaMethod + open func setCodecType(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setCodecPriority(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setSampleRate(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setBitsPerSample(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setChannelCount(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setFrameDuration(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setOctetsPerFrame(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setMinOctetsPerFrame(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func setMaxOctetsPerFrame(_ arg0: Int32) -> BluetoothLeAudioCodecConfig.Builder! + + @JavaMethod + open func build() -> BluetoothLeAudioCodecConfig! + } +} diff --git a/Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig.swift b/Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig.swift new file mode 100644 index 0000000..9bf1641 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothLeAudioCodecConfig.swift @@ -0,0 +1,149 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothLeAudioCodecConfig", implements: Parcelable.self) +open class BluetoothLeAudioCodecConfig: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getCodecType() -> Int32 + + @JavaMethod + open func getCodecPriority() -> Int32 + + @JavaMethod + open func getSampleRate() -> Int32 + + @JavaMethod + open func getBitsPerSample() -> Int32 + + @JavaMethod + open func getCodecName() -> String + + @JavaMethod + open func getChannelCount() -> Int32 + + @JavaMethod + open func getFrameDuration() -> Int32 + + @JavaMethod + open func getOctetsPerFrame() -> Int32 + + @JavaMethod + open func getMinOctetsPerFrame() -> Int32 + + @JavaMethod + open func getMaxOctetsPerFrame() -> Int32 + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_16: Int32 + + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_24: Int32 + + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_32: Int32 + + @JavaStaticField(isFinal: true) + public var BITS_PER_SAMPLE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_COUNT_1: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_COUNT_2: Int32 + + @JavaStaticField(isFinal: true) + public var CHANNEL_COUNT_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var CODEC_PRIORITY_DEFAULT: Int32 + + @JavaStaticField(isFinal: true) + public var CODEC_PRIORITY_DISABLED: Int32 + + @JavaStaticField(isFinal: true) + public var CODEC_PRIORITY_HIGHEST: Int32 + + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var FRAME_DURATION_10000: Int32 + + @JavaStaticField(isFinal: true) + public var FRAME_DURATION_7500: Int32 + + @JavaStaticField(isFinal: true) + public var FRAME_DURATION_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_11025: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_16000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_176400: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_192000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_22050: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_24000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_32000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_384000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_44100: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_48000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_8000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_88200: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_96000: Int32 + + @JavaStaticField(isFinal: true) + public var SAMPLE_RATE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_INVALID: Int32 + + @JavaStaticField(isFinal: true) + public var SOURCE_CODEC_TYPE_LC3: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothLeAudioCodecStatus.swift b/Sources/AndroidBluetooth/BluetoothLeAudioCodecStatus.swift new file mode 100644 index 0000000..3a5c4d6 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothLeAudioCodecStatus.swift @@ -0,0 +1,63 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothLeAudioCodecStatus", implements: Parcelable.self) +open class BluetoothLeAudioCodecStatus: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: BluetoothLeAudioCodecConfig?, _ arg1: BluetoothLeAudioCodecConfig?, _ arg2: List?, _ arg3: List?, _ arg4: List?, _ arg5: List?, environment: JNIEnvironment? = nil) + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func isInputCodecConfigSelectable(_ arg0: BluetoothLeAudioCodecConfig?) -> Bool + + @JavaMethod + open func isOutputCodecConfigSelectable(_ arg0: BluetoothLeAudioCodecConfig?) -> Bool + + @JavaMethod + open func getInputCodecConfig() -> BluetoothLeAudioCodecConfig! + + @JavaMethod + open func getOutputCodecConfig() -> BluetoothLeAudioCodecConfig! + + @JavaMethod + open func getInputCodecLocalCapabilities() -> List! + + @JavaMethod + open func getOutputCodecLocalCapabilities() -> List! + + @JavaMethod + open func getInputCodecSelectableCapabilities() -> List! + + @JavaMethod + open func getOutputCodecSelectableCapabilities() -> List! + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var EXTRA_LE_AUDIO_CODEC_STATUS: String + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParameters.swift b/Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParameters.swift deleted file mode 100644 index 26956e0..0000000 --- a/Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParameters.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// BluetoothLePeriodicAdvertisingParameters.swift -// Android -// -// Created by Marco Estrella on 5/24/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE { - - typealias PeriodicAdvertisingParameters = AndroidBluetoothLowEnergyPeriodicAdvertisingParameters -} - -/** - * The PeriodicAdvertisingParameters provide a way to adjust periodic advertising preferences for each Bluetooth LE - * advertising set. Use AdvertisingSetParameters.Builder to create an instance of this class. - */ -public final class AndroidBluetoothLowEnergyPeriodicAdvertisingParameters: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - public var includeTxPower: Bool { - - get { return getIncludeTxPower() } - } - - public var interval: Int { - - get { return getInterval() } - } -} - -// MARK: - INTERNAL METHODS - -internal extension Android.Bluetooth.LE.PeriodicAdvertisingParameters { - - @usableFromInline - func getIncludeTxPower() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "getIncludeTxPower", - methodSig: "()Z", - methodCache: &JNICache.MethodID.getIncludeTxPower, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getInterval() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getInterval", - methodSig: "()I", - methodCache: &JNICache.MethodID.getInterval, - args: &__args, - locals: &__locals) - return Int(__return) - } -} - -// MARK: - JNICache - -internal extension Android.Bluetooth.LE.PeriodicAdvertisingParameters { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["PeriodicAdvertisingParameters"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var getIncludeTxPower: jmethodID? - static var getInterval: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParametersBuilder.swift b/Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParametersBuilder.swift deleted file mode 100644 index ab2895e..0000000 --- a/Sources/AndroidBluetooth/BluetoothLePeriodicAdvertisingParametersBuilder.swift +++ /dev/null @@ -1,156 +0,0 @@ -// -// BluetoothLePeriodicAdvertisingParametersBuilder.swift -// Android -// -// Created by Marco Estrella on 5/24/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE.PeriodicAdvertisingParameters { - - typealias Builder = AndroidBluetoothLowEnergyPeriodicAdvertisingParametersBuilder -} - -public final class AndroidBluetoothLowEnergyPeriodicAdvertisingParametersBuilder: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "()V", - methodCache: &JNICache.MethodID.initMethod, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} - -// MARK: - METHODS - -public extension Android.Bluetooth.LE.PeriodicAdvertisingParameters.Builder { - - func build() -> Android.Bluetooth.LE.PeriodicAdvertisingParameters { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "build", - methodSig: "()Landroid/bluetooth/le/PeriodicAdvertisingParameters;", - methodCache: &JNICache.MethodID.build, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.LE.PeriodicAdvertisingParameters( javaObject: __return ) - } - - /** - * Whether the transmission power level should be included in the periodic packet. - */ - func setIncludeTxPower(includeTxPower: Bool) -> Android.Bluetooth.LE.PeriodicAdvertisingParameters.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(includeTxPower ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setIncludeTxPower", - methodSig: "(Z)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPower, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setIncludeTxPower", - methodSig: "(Z)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setIncludeTxPower, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.LE.PeriodicAdvertisingParameters.Builder(javaObject: __return) - } - - /** - * Set advertising interval for periodic advertising, in 1.25ms unit. - */ - func setInterval(interval: Int) -> Android.Bluetooth.LE.PeriodicAdvertisingParameters.Builder { - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(interval) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setInterval", - methodSig: "(I)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setInterval, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setInterval", - methodSig: "(I)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;", - methodCache: &JNICache.MethodID.setInterval, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.LE.PeriodicAdvertisingParameters.Builder(javaObject: __return) - } -} - -// MARK: - JNICache - -internal extension Android.Bluetooth.LE.PeriodicAdvertisingParameters.Builder { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/le/PeriodicAdvertisingParameters$Builder" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var initMethod: jmethodID? - static var build: jmethodID? - static var setIncludeTxPower: jmethodID? - static var setInterval: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanCallback.swift b/Sources/AndroidBluetooth/BluetoothLeScanCallback.swift deleted file mode 100644 index d4f00d4..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanCallback.swift +++ /dev/null @@ -1,304 +0,0 @@ -// -// AndroidLEScanCallback.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth.LE { - - typealias ScanCallback = AndroidBluetoothLowEnergyScanCallback - - typealias ScanCallbackType = AndroidBluetoothLowEnergyScanCallbackType -} - -public extension Android.Bluetooth.LE.ScanCallback { - - typealias Error = AndroidBluetoothLowEnergyScanCallbackError -} - -/// Proxy listener class for Android Bluetooth LE callbacks. -open class AndroidBluetoothLowEnergyScanCallback: JavaObject { - - public required init(javaObject: jobject?) { - super.init(javaObject: javaObject) - } - - public convenience init?( casting object: JavaObject, _ file: StaticString = #file, _ line: Int = #line ) { - self.init( javaObject: nil ) - object.withJavaObject { - self.javaObject = $0 - } - } - - /// Create a Swift-owned Java Object. - public convenience init() { - - self.init(javaObject: nil) - bindNewJavaObject() - } - - /// Initialize a new Java instance and bind to this Swift object. - public func bindNewJavaObject() { - - let hasOldJavaObject = javaObject != nil - - /// Release old swift value. - if hasOldJavaObject { - - try! finalize() - } - - var locals = [jobject]() - - var args: [jvalue] = [self.swiftValue()] - - // returned objects are always local refs - guard let __object: jobject = JNIMethod.NewObject(className: JNICache.className, - classObject: JNICache.jniClass, - methodSig: "(J)V", - methodCache: &JNICache.MethodID.new_method, - args: &args, - locals: &locals ) - else { fatalError("Could not initialize \(className)") } - - self.javaObject = __object // dereference old value, add global ref for new value - - JNI.DeleteLocalRef( __object ) // delete local ref - } - - open func onScanResult(callbackType: Android.Bluetooth.LE.ScanCallbackType, result: Android.Bluetooth.LE.ScanResult){} - - open func onBatchScanResults(results: [Android.Bluetooth.LE.ScanResult]) {} - - open func onScanFailed(error: Android.Bluetooth.LE.ScanCallback.Error) {} -} - -public extension AndroidBluetoothLowEnergyScanCallback { - - /// Fails to start scan as BLE scan with the same settings is already started by the app. - static var SCAN_FAILED_ALREADY_STARTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_FAILED_ALREADY_STARTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_FAILED_ALREADY_STARTED, - className: JNICache.className, - classCache: &JNICache.jniClassConstants ) - - return Int(__value) - } - } - - /// Fails to start scan as app cannot be registered. - static var SCAN_FAILED_APPLICATION_REGISTRATION_FAILED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_FAILED_APPLICATION_REGISTRATION_FAILED", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED, - className: JNICache.className, - classCache: &JNICache.jniClassConstants ) - - return Int(__value) - } - } - - /// Fails to start power optimized scan as this feature is not supported. - static var SCAN_FAILED_FEATURE_UNSUPPORTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_FAILED_FEATURE_UNSUPPORTED", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_FAILED_FEATURE_UNSUPPORTED, - className: JNICache.className, - classCache: &JNICache.jniClassConstants ) - - return Int(__value) - } - } - - /// Fails to start scan due an internal error - static var SCAN_FAILED_INTERNAL_ERROR: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_FAILED_INTERNAL_ERROR", - fieldType: "I", - fieldCache: &JNICache.FieldID.SCAN_FAILED_INTERNAL_ERROR, - className: JNICache.className, - classCache: &JNICache.jniClassConstants ) - - return Int(__value) - } - } -} - -extension AndroidBluetoothLowEnergyScanCallback: JNIListener { } - -fileprivate extension AndroidBluetoothLowEnergyScanCallback { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.LE.className(["SwiftScanCallback"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - static var jniClassConstants: jclass? - - /// JNI Java class - static let jniClass: jclass = { - - var natives = [JNINativeMethod]() - - // onScanResult - let onScanResultSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .int, - .object(Android.Bluetooth.LE.ScanResult.JNICache.classSignature) - ], returnType: .void) - - let onScanResult: AndroidBluetoothLowEnergyScanCallback_onScanResult_type = AndroidBluetoothLowEnergyScanCallback_onScanResult - - natives.append( JNINativeMethod(name: strdup("__on_scan_result"), - signature: strdup(onScanResultSignature.rawValue), - fnPtr: unsafeBitCast( onScanResult, to: UnsafeMutableRawPointer.self ) )) - - // onBatchScanResults - let onBatchScanResultsSignature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(JNIClassName(rawValue: "java/util/List")!), - ], returnType: .void) - - let onBatchScanResults: AndroidBluetoothLowEnergyScanCallback_onBatchScanResults_type = AndroidBluetoothLowEnergyScanCallback_onBatchScanResults - - natives.append( JNINativeMethod(name: strdup("__on_batch_scan_results"), - signature: strdup(onBatchScanResultsSignature.rawValue), - fnPtr: unsafeBitCast( onBatchScanResults, to: UnsafeMutableRawPointer.self ) )) - - // onScanFailed - let onScanFailedSignature = JNIMethodSignature(argumentTypes: [.long, .int], returnType: .void) - - let onScanFailed: AndroidBluetoothLowEnergyScanCallback_onScanFailed_type = AndroidBluetoothLowEnergyScanCallback_onScanFailed - - natives.append( JNINativeMethod(name: strdup("__on_scan_failed"), - signature: strdup(onScanFailedSignature.rawValue), - fnPtr: unsafeBitCast( onScanFailed, to: UnsafeMutableRawPointer.self ) )) - - let clazz = JNI.FindClass( className ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - struct FieldID { - - static var SCAN_FAILED_ALREADY_STARTED: jfieldID? - static var SCAN_FAILED_APPLICATION_REGISTRATION_FAILED: jfieldID? - static var SCAN_FAILED_FEATURE_UNSUPPORTED: jfieldID? - static var SCAN_FAILED_INTERNAL_ERROR: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var new_method: jmethodID? - } - } -} - -// MARK: - Private Methods - -private typealias AndroidBluetoothLowEnergyScanCallback_onScanResult_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jint, _: jobject?) -> () - -private func AndroidBluetoothLowEnergyScanCallback_onScanResult( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ callbackType: jint, - _ result: jobject? ) -> () { - - let swiftCallbackType = AndroidBluetoothLowEnergyScanCallbackType(rawValue: Int(callbackType)) - - let swiftResult = AndroidBluetoothLowEnergyScanResult(javaObject: result) - - AndroidBluetoothLowEnergyScanCallback - .swiftObject(from: __swiftObject)? - .onScanResult(callbackType: swiftCallbackType, result: swiftResult) -} - -private typealias AndroidBluetoothLowEnergyScanCallback_onBatchScanResults_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?) -> () - -private func AndroidBluetoothLowEnergyScanCallback_onBatchScanResults( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ __results: jobject?) -> () { - - let swiftResultsList = __results != nil ? ListForward(javaObject: __results) : nil - - let results = swiftResultsList?.toArray()?.map { AndroidBluetoothLowEnergyScanResult(casting: $0)! } ?? [] - - AndroidBluetoothLowEnergyScanCallback - .swiftObject(from: __swiftObject)? - .onBatchScanResults(results: results) -} - -private typealias AndroidBluetoothLowEnergyScanCallback_onScanFailed_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jint) -> () - -private func AndroidBluetoothLowEnergyScanCallback_onScanFailed( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ __errorCode: jint) -> () { - - let error = AndroidBluetoothLowEnergyScanCallbackError(rawValue: Int(__errorCode)) - - AndroidBluetoothLowEnergyScanCallback - .swiftObject(from: __swiftObject)? - .onScanFailed(error: error) -} - -// MARK: - Supporting Types - -public struct AndroidBluetoothLowEnergyScanCallbackType: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - - self.rawValue = rawValue - } -} - -public struct AndroidBluetoothLowEnergyScanCallbackError: RawRepresentable, Swift.Error { - - public let rawValue: Int - - public init(rawValue: Int) { - - self.rawValue = rawValue - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanFilter.swift b/Sources/AndroidBluetooth/BluetoothLeScanFilter.swift deleted file mode 100644 index ddc7117..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanFilter.swift +++ /dev/null @@ -1,365 +0,0 @@ -// -// AndroidBluetoothLowEnergyScanFilter.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE { - - typealias ScanFilter = AndroidBluetoothLowEnergyScanFilter -} - -/** - * Criteria for filtering result from Bluetooth LE scans. A ScanFilter allows clients to restrict scan results to only those that are of interest to them. - * - * Current filtering on the following fields are supported: - * - * Service UUIDs which identify the bluetooth gatt services running on the device. - * Name of remote Bluetooth LE device. - * Mac address of the remote device. - * Service data which is the data associated with a service. - * Manufacturer specific data which is the data associated with a particular manufacturer. - */ -public final class AndroidBluetoothLowEnergyScanFilter: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - private static var new_MethodID_1: jmethodID? - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: JNICache.className, - classCache: &JNICache.jniClass, - methodSig: "()V", - methodCache: &type(of: self).new_MethodID_1, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } - - public var deviceAddress: String { - - get { return getDeviceAddress() } - } - - /** - * Returns the filter set the device name field of Bluetooth advertisement data. - */ - public var deviceName: String { - - get { return getDeviceAddress() } - } - - public var manufacturerData: [Int8]? { - - get { return getManufacturerData() } - } - - public var manufacturerDataMask: [Int8]? { - - get { return getManufacturerDataMask() } - } - - /** - * Returns the manufacturer id. - */ - public var manufacturerId: Int { - - get { return getManufacturerId() } - } - - public var serviceData: [Int8]? { - - get { return getServiceData() } - } - - public var serviceDataMask: [Int8]? { - - get { return getServiceDataMask() } - } - - public var serviceDataUuid: Android.OS.ParcelUuid? { - - get { return getServiceDataUuid() } - } - - public var serviceUuid: Android.OS.ParcelUuid? { - - get { return getServiceUuid() } - } - - public var serviceUuidMask: Android.OS.ParcelUuid? { - - get { return getServiceUuidMask() } - } -} - -// MARK: METHODS - -public extension Android.Bluetooth.LE.ScanFilter { - - func matches(scanResult: Android.Bluetooth.LE.ScanResult) -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - __args[0] = JNIType.toJava( value: scanResult, locals: &__locals ) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "matches", - methodSig: "(Landroid/bluetooth/le/ScanResult;)Z", - methodCache: &JNICache.MethodID.matches, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } -} - -// MARK: INTERNAL METHODS - -internal extension Android.Bluetooth.LE.ScanFilter { - - @usableFromInline - func getDeviceAddress() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDeviceAddress", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getDeviceAddress, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return String(javaObject: __return) - } - - @usableFromInline - func getDeviceName() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDeviceName", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getDeviceName, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return String(javaObject: __return) - } - - @usableFromInline - func getManufacturerData() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getManufacturerData", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getManufacturerData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - @usableFromInline - func getManufacturerDataMask() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getManufacturerDataMask", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getManufacturerDataMask, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - @usableFromInline - func getManufacturerId() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getManufacturerId", - methodSig: "()I", - methodCache: &JNICache.MethodID.getManufacturerId, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getServiceData() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceData", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getServiceData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - @usableFromInline - func getServiceDataMask() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceDataMask", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getServiceDataMask, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - @usableFromInline - func getServiceDataUuid() -> Android.OS.ParcelUuid? { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallStaticObjectMethod( className: JNICache.className, - classCache: &JNICache.jniClass, - methodName: "getServiceDataUuid", - methodSig: "()Landroid/os/ParcelUuid;", - methodCache: &JNICache.MethodID.getServiceDataUuid, - args: &__args, locals: &__locals ) - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? Android.OS.ParcelUuid( javaObject: __return ) : nil - } - - @usableFromInline - func getServiceUuid() -> Android.OS.ParcelUuid? { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallStaticObjectMethod( className: JNICache.className, - classCache: &JNICache.jniClass, - methodName: "getServiceUuid", - methodSig: "()Landroid/os/ParcelUuid;", - methodCache: &JNICache.MethodID.getServiceUuid, - args: &__args, locals: &__locals ) - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? Android.OS.ParcelUuid( javaObject: __return ) : nil - } - - @usableFromInline - func getServiceUuidMask() -> Android.OS.ParcelUuid? { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallStaticObjectMethod( className: JNICache.className, - classCache: &JNICache.jniClass, - methodName: "getServiceUuidMask", - methodSig: "()Landroid/os/ParcelUuid;", - methodCache: &JNICache.MethodID.getServiceUuidMask, - args: &__args, locals: &__locals ) - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? Android.OS.ParcelUuid( javaObject: __return ) : nil - } -} - -// MARK: - JNICache - -internal extension Android.Bluetooth.LE.ScanFilter { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["ScanFilter"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var getDeviceAddress: jmethodID? - static var getDeviceName: jmethodID? - static var getManufacturerData: jmethodID? - static var getManufacturerDataMask: jmethodID? - static var getManufacturerId: jmethodID? - static var getServiceData: jmethodID? - static var getServiceDataMask: jmethodID? - static var getServiceDataUuid: jmethodID? - static var getServiceUuid: jmethodID? - static var getServiceUuidMask: jmethodID? - static var matches: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanFilterBuilder.swift b/Sources/AndroidBluetooth/BluetoothLeScanFilterBuilder.swift deleted file mode 100644 index 435052c..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanFilterBuilder.swift +++ /dev/null @@ -1,308 +0,0 @@ -// -// BluetoothLeScanFilterBuilder.swift -// Android -// -// Created by Marco Estrella on 5/24/18. -// - -import Foundation -import java_swift -import Android - -public extension Android.Bluetooth.LE.ScanFilter { - - typealias Builder = AndroidBluetoothLowEnergyScanFilterBuilder -} - -/** - * Builder class for ScanFilter. - */ -public final class AndroidBluetoothLowEnergyScanFilterBuilder: JavaObject { - - private static let javaClassName = "android/bluetooth/le/ScanFilter$Builder" - - private static var JNIClass: jclass? - - private static var init_MethodID: jmethodID? - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: type(of: self).javaClassName, - classCache: &type(of: self).JNIClass, - methodSig: "()V", - methodCache: &type(of: self).init_MethodID, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} - -// MARK: METHODS - -public extension Android.Bluetooth.LE.ScanFilter { - private static var build_MethodID: jmethodID? - - func build() -> Android.Bluetooth.LE.ScanSettings { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "build", - methodSig: "()Landroid/bluetooth/le/ScanSettings;", - methodCache: &type(of: self).build_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettings( javaObject: __return ) - } - - private static var setDeviceAddress_MethodID: jmethodID? - - /// Set filter on device address. - func setDeviceAddress(_ deviceAddress: String) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = JNIType.toJava( value: deviceAddress, locals: &__locals ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setDeviceAddress", - methodSig: "(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setDeviceAddress_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setDeviceAddress", - methodSig: "(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setDeviceAddress_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - private static var setDeviceName_MethodID: jmethodID? - - /// Set filter on device name. - func setDeviceName(_ deviceName: String) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = JNIType.toJava( value: deviceName, locals: &__locals ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setDeviceName", - methodSig: "(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setDeviceName_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setDeviceName", - methodSig: "(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setDeviceName_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - private static var setManufacturerData_MethodID: jmethodID? - - /// Set filter on on manufacturerData. - func setManufacturerData(_ manufacturerId: Int, _ manufacturerData: [Int8]) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = jvalue(i: jint(manufacturerId)) - __args[1] = JNIType.toJava( value: manufacturerData, locals: &__locals ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setManufacturerData", - methodSig: "(I[B)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setManufacturerData_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setManufacturerData", - methodSig: "(I[B)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setManufacturerData_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - private static var setManufacturerData2_MethodID: jmethodID? - - /// Set filter on partial manufacture data. - func setManufacturerData(_ manufacturerId: Int, _ manufacturerData: [Int8], _ manufacturerDataMask: [Int8]) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 3 ) - - __args[0] = jvalue(i: jint(manufacturerId)) - __args[1] = JNIType.toJava( value: manufacturerData, locals: &__locals ) - __args[2] = JNIType.toJava( value: manufacturerDataMask, locals: &__locals ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setManufacturerData", - methodSig: "(I[B[B)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setManufacturerData2_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setManufacturerData", - methodSig: "(I[B[B)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setManufacturerData2_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - private static var setServiceData_MethodID: jmethodID? - /** - * Set filtering on service data. - */ - func setServiceData(serviceDataUuid: Android.OS.ParcelUuid, serviceData: [Int8]) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = JNIType.toJava( value: serviceDataUuid, locals: &__locals ) - __args[1] = JNIType.toJava( value: serviceData, locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setServiceData", - methodSig: "(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setServiceData_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - private static var setServiceData2_MethodID: jmethodID? - /** - * Set filtering on service data. - */ - func setServiceData(serviceDataUuid: Android.OS.ParcelUuid, serviceData: [Int8], serviceDataMask: [Int8]) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = JNIType.toJava( value: serviceDataUuid, locals: &__locals ) - __args[1] = JNIType.toJava( value: serviceData, locals: &__locals ) - __args[2] = JNIType.toJava( value: serviceDataMask, locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setServiceData", - methodSig: "(Landroid/os/ParcelUuid;[B[B)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setServiceData2_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - /// Set filter on partial service uuid. - private static var setServiceUuuid_MethodID: jmethodID? - func setServiceUuuid(serviceUuid: Android.OS.ParcelUuid, uuidMask: Android.OS.ParcelUuid) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = JNIType.toJava( value: serviceUuid, locals: &__locals ) - __args[1] = JNIType.toJava( value: uuidMask, locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setServiceUuid", - methodSig: "(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setServiceUuuid_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } - - /// Set filter on service uuid. - private static var setServiceUuuid2_MethodID: jmethodID? - func setServiceUuuid(serviceUuid: Android.OS.ParcelUuid) -> Android.Bluetooth.LE.ScanFilter.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 2 ) - - __args[0] = JNIType.toJava( value: serviceUuid, locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setServiceUuid", - methodSig: "(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;", - methodCache: &type(of: self).setServiceUuuid2_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanFilterBuilder(javaObject: __return) - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanRecord.swift b/Sources/AndroidBluetooth/BluetoothLeScanRecord.swift deleted file mode 100644 index 634a7e0..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanRecord.swift +++ /dev/null @@ -1,306 +0,0 @@ -// -// BluetoothLowEnergyScanRecord.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.LE { - - typealias ScanRecord = AndroidBluetoothLowEnergyScanRecord -} - -public final class AndroidBluetoothLowEnergyScanRecord: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - /** - * Returns the advertising flags indicating the discoverable mode and capability of the device. - */ - public var advertiseFlags: Int { - - @inline(__always) - get { return getAdvertiseFlags() } - } - - /** - * Returns raw bytes of scan record. - */ - public var bytes: [UInt8] { - - @inline(__always) - get { return unsafeBitCast(getBytes(), to: [UInt8]?.self) ?? [] } - } - - /** - * Returns the local name of the BLE device. - */ - public var deviceName: String? { - - @inline(__always) - get { return getDeviceName() } - } - - /** - * Returns a sparse array of manufacturer identifier and its corresponding manufacturer specific data. - */ - public var manufacturerSpecificData: [Int8]? { - - @inline(__always) - get { return __getManufacturerSpecificData() } - } - - /** - * Returns a map of service UUID and its corresponding service data. - */ - public var serviceData: JavaMap? { - - @inline(__always) - get { return __getServiceData() } - } - - /** - * Returns a list of service UUIDs within the advertisement that are used to identify the bluetooth GATT services. - */ - public var serviceUuids: List? { - - @inline(__always) - get { - return getServiceUuids() - } - } - - /** - * Returns the transmission power level of the packet in dBm. Returns MIN_VALUE if the field is not set. This value can be - * used to calculate the path loss of a received packet using the following equation: - */ - public var txPowerLevel: Int { - - @inline(__always) - get { return getTxPowerLevel() } - } - - // METHODS - - /// Returns the manufacturer specific data associated with the manufacturer id. - public func getManufacturerSpecificData(manufacturerId: Int) -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = JNIType.toJava(value: manufacturerId, locals: &__locals) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getManufacturerSpecificData", - methodSig: "(I)[B", - methodCache: &JNICache.MethodID.getManufacturerSpecificData_param, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - /// Returns the service data byte array associated with the serviceUuid. - public func getServiceData(serviceDataUuid: Android.OS.ParcelUuid) -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - __args[0] = JNIType.toJava(value: serviceDataUuid, locals: &__locals) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceData", - methodSig: "(Landroid/os/ParcelUuid;)[B", - methodCache: &JNICache.MethodID.getServiceData_param, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } -} - -// MARK: - METHODS - -internal extension Android.Bluetooth.LE.ScanRecord { - - @usableFromInline - func getServiceUuids() -> List? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceUuids", - methodSig: "()Ljava/util/List;", - methodCache: &JNICache.MethodID.getServiceUuids, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? ListForward( javaObject: __return ) : nil - } - - @usableFromInline - func __getServiceData() -> JavaMap? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getServiceData", - methodSig: "()Ljava/util/Map;", - methodCache: &JNICache.MethodID.getServiceData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: java_swift.JavaMapForward.self, from: __return ) - } - - @usableFromInline - func __getManufacturerSpecificData() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getManufacturerSpecificData", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getManufacturerSpecificData, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift( type: [Int8].self, from: __return ) - } - - @usableFromInline - func getDeviceName() -> String { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDeviceName", - methodSig: "()Ljava/lang/String;", - methodCache: &JNICache.MethodID.getDeviceName, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return String(javaObject: __return) - } - - @usableFromInline - func getBytes() -> [Int8]? { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getBytes", - methodSig: "()[B", - methodCache: &JNICache.MethodID.getBytes, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JNIType.toSwift(type: [Int8].self, from: __return, consume: false ) - } - - @usableFromInline - func getAdvertiseFlags() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getAdvertiseFlags", - methodSig: "()I", - methodCache: &JNICache.MethodID.getAdvertiseFlags, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getTxPowerLevel() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getTxPowerLevel", - methodSig: "()I", - methodCache: &JNICache.MethodID.getTxPowerLevel, - args: &__args, - locals: &__locals) - return Int(__return) - } -} - -// MARK: - JNI - -internal extension Android.Bluetooth.LE.ScanRecord { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["ScanRecord"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var getAdvertiseFlags: jmethodID? - static var getBytes: jmethodID? - static var getDeviceName: jmethodID? - static var getManufacturerSpecificData: jmethodID? - static var getManufacturerSpecificData_param: jmethodID? - static var getServiceData_param: jmethodID? - static var getServiceData: jmethodID? - static var getServiceUuids: jmethodID? - static var getTxPowerLevel: jmethodID? - } - } -} - diff --git a/Sources/AndroidBluetooth/BluetoothLeScanResult.swift b/Sources/AndroidBluetooth/BluetoothLeScanResult.swift deleted file mode 100644 index 80c644d..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanResult.swift +++ /dev/null @@ -1,623 +0,0 @@ -// -// AndroidBluetoothLEScanResult.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android -import Bluetooth -import BluetoothGAP - -public extension Android.Bluetooth.LE { - - typealias ScanResult = AndroidBluetoothLowEnergyScanResult -} - -public extension Android.Bluetooth.LE.ScanResult { - - typealias DataStatus = AndroidBluetoothLowEnergyDataStatus - - typealias PrimaryPhy = AndroidBluetoothLowEnergyPrimaryPhy - - typealias SecondaryPhy = AndroidBluetoothLowEnergySecondaryPhy -} - -/** - * ScanResult for Bluetooth LE scan. - */ -public final class AndroidBluetoothLowEnergyScanResult: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - /** Returns the advertising set id. May return SID_NOT_PRESENT if no set id was is present. - */ - public var advertisingSid: Int { - @inline(__always) - get { return getAdvertisingSid() } - } - - /** - * Returns the remote bluetooth device identified by the bluetooth device address. - */ - public var device: Android.Bluetooth.Device { - - @inline(__always) - get { return getDevice() } - } - - /** - * Returns the periodic advertising interval in units of 1.25ms. Valid range is 6 (7.5ms) to 65536 (81918.75ms). - * A value of PERIODIC_INTERVAL_NOT_PRESENT means periodic advertising interval is not present. - */ - public var periodicAdvertisingInterval: Int { - - @inline(__always) - get { return getPeriodicAdvertisingInterval() } - } - - /** - * Returns the primary Physical Layer on which this advertisment was received. Can be one of PHY_LE_1M or PHY_LE_CODED. - */ - public var primaryPhy: Android.Bluetooth.LE.ScanResult.PrimaryPhy { - - @inline(__always) - get { return getPrimaryPhy() } - } - - - /** - * Returns the received signal strength in dBm. The valid range is [-127, 126]. - */ - public var rssi: Int { - - @inline(__always) - get { return getRssi() } - } - - /** - * Returns the secondary Physical Layer on which this advertisment was received. Can be one of PHY_LE_1M, PHY_LE_2M, - * PHY_LE_CODED or PHY_UNUSED - if the advertisement was not received on a secondary physical channel. - */ - public var secondaryPhy: Android.Bluetooth.LE.ScanResult.SecondaryPhy { - - @inline(__always) - get { return getSecondaryPhy() } - } - - /** - * Returns the scan record, which is a combination of advertisement and scan response. - */ - public var scanRecord: Android.Bluetooth.LE.ScanRecord { - - @inline(__always) - get { return getScanRecord() } - } - - /** - * Returns timestamp since boot when the scan record was observed. - */ - public var timestampNanos: Int64 { - - @inline(__always) - get { return getTimestampNanos() } - } - - /** - * Returns the transmit power in dBm. Valid range is [-127, 126]. A value of TX_POWER_NOT_PRESENT indicates that the TX power is not present. - */ - public var txPower: Int { - - @inline(__always) - get { return getTxPower() } - } - - /** - * Returns true if this object represents connectable scan result. - */ - public var isConnectable: Bool { - - @inline(__always) - get { return getConnectable() } - } - - /** - * Returns true if this object represents legacy scan result. Legacy scan results do not contain advanced advertising information as specified in the Bluetooth Core Specification v5. - */ - public var isLegacy: Bool { - - @inline(__always) - get { return getLegacy() } - } - /** - * Returns the advertising flags indicating the discoverable mode and capability of the device. - * - * - Returns: Returns -1 if the flag field is not set. - */ - public var advertiseFlags: BitMaskOptionSet? { - - @inline(__always) - get { - let rawValue = getAdvertiseFlags() - return rawValue > 0 ? BitMaskOptionSet(rawValue: UInt8(rawValue)) : nil - } - } -} - -// MARK: CONSTANTS - -public extension Android.Bluetooth.LE.ScanResult { - - /// For chained advertisements, inidcates tha the data contained in this scan result is complete. - static var DATA_COMPLETE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "DATA_COMPLETE", - fieldType: "I", - fieldCache: &JNICache.FieldID.DATA_COMPLETE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// For chained advertisements, indicates that the controller was unable to receive all chained packets and the scan result contains incomplete truncated data. - static var DATA_TRUNCATED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "DATA_TRUNCATED", - fieldType: "I", - fieldCache: &JNICache.FieldID.DATA_TRUNCATED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Periodic advertising interval is not present in the packet. - static var PERIODIC_INTERVAL_NOT_PRESENT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PERIODIC_INTERVAL_NOT_PRESENT", - fieldType: "I", - fieldCache: &JNICache.FieldID.PERIODIC_INTERVAL_NOT_PRESENT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Indicates that the secondary physical layer was not used. - static var PHY_UNUSED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_UNUSED", - fieldType: "I", - fieldCache: &JNICache.FieldID.PHY_UNUSED, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Advertising Set ID is not present in the packet. - static var SID_NOT_PRESENT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SID_NOT_PRESENT", - fieldType: "I", - fieldCache: &JNICache.FieldID.SID_NOT_PRESENT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// TX power is not present in the packet. - static var TX_POWER_NOT_PRESENT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TX_POWER_NOT_PRESENT", - fieldType: "I", - fieldCache: &JNICache.FieldID.TX_POWER_NOT_PRESENT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} - -// MARK: METHODS - -internal extension Android.Bluetooth.LE.ScanResult { - - @usableFromInline - func getAdvertisingSid() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getAdvertisingSid", - methodSig: "()I", - methodCache: &JNICache.MethodID.getAdvertisingSid, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getDataStatus() -> Android.Bluetooth.LE.ScanResult.DataStatus { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getDataStatus", - methodSig: "()I", - methodCache: &JNICache.MethodID.getDataStatus, - args: &__args, - locals: &__locals) - - return Android.Bluetooth.LE.ScanResult.DataStatus(rawValue: Int(__return)) - } - - @usableFromInline - func getDevice() -> Android.Bluetooth.Device { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDevice", - methodSig: "()Landroid/bluetooth/BluetoothDevice;", - methodCache: &JNICache.MethodID.getDevice, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.Device( javaObject: __return ) - } - - @usableFromInline - func getPeriodicAdvertisingInterval() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getPeriodicAdvertisingInterval", - methodSig: "()I", - methodCache: &JNICache.MethodID.getPeriodicAdvertisingInterval, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getPrimaryPhy() -> Android.Bluetooth.LE.ScanResult.PrimaryPhy { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getPrimaryPhy", - methodSig: "()I", - methodCache: &JNICache.MethodID.getPrimaryPhy, - args: &__args, - locals: &__locals) - - return Android.Bluetooth.LE.ScanResult.PrimaryPhy(rawValue: Int(__return)) - } - - - - @usableFromInline - func getSecondaryPhy() -> Android.Bluetooth.LE.ScanResult.SecondaryPhy { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getSecondaryPhy", - methodSig: "()I", - methodCache: &JNICache.MethodID.getSecondaryPhy, - args: &__args, - locals: &__locals) - - return Android.Bluetooth.LE.ScanResult.SecondaryPhy(rawValue: Int(__return)) - } - - @usableFromInline - func getRssi() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getRssi", - methodSig: "()I", - methodCache: &JNICache.MethodID.getRssi, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getTimestampNanos() -> Int64 { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallLongMethod(object: javaObject, - methodName: "getTimestampNanos", - methodSig: "()J", - methodCache: &JNICache.MethodID.getTimestampNanos, - args: &__args, - locals: &__locals) - return Int64(__return) - } - - @usableFromInline - func getTxPower() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getTxPower", - methodSig: "()I", - methodCache: &JNICache.MethodID.getTxPower, - args: &__args, - locals: &__locals) - return Int(__return) - } - - @usableFromInline - func getConnectable() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isConnectable", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isConnectable, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getLegacy() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isLegacy", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isLegacy, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - @usableFromInline - func getScanRecord() -> Android.Bluetooth.LE.ScanRecord { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getScanRecord", - methodSig: JNICache.MethodSignature.getScanRecord, - methodCache: &JNICache.MethodID.getScanRecord, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.LE.ScanRecord(javaObject: __return) - } - - /** - Returns the advertising flags indicating the discoverable mode and capability of the device. Returns -1 if the flag field is not set. - */ - @usableFromInline - func getAdvertiseFlags() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getAdvertiseFlags", - methodSig: JNICache.MethodSignature.getAdvertiseFlags, - methodCache: &JNICache.MethodID.getAdvertiseFlags, - args: &__args, - locals: &__locals) - - return Int(__return) - } -} - -// MARK: - JNI - -internal extension Android.Bluetooth.LE.ScanResult { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.LE.className(["ScanResult"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - struct FieldID { - static var DATA_COMPLETE: jfieldID? - static var DATA_TRUNCATED: jfieldID? - static var PERIODIC_INTERVAL_NOT_PRESENT: jfieldID? - static var PHY_UNUSED: jfieldID? - static var SID_NOT_PRESENT: jfieldID? - static var TX_POWER_NOT_PRESENT: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var getAdvertisingSid: jmethodID? - static var getDataStatus: jmethodID? - static var getDevice: jmethodID? - static var getPeriodicAdvertisingInterval: jmethodID? - static var getPrimaryPhy: jmethodID? - static var getRssi: jmethodID? - static var getScanRecord: jmethodID? - static var getSecondaryPhy: jmethodID? - static var getTimestampNanos: jmethodID? - static var getTxPower: jmethodID? - static var isConnectable: jmethodID? - static var isLegacy: jmethodID? - static var getAdvertiseFlags: jmethodID? - } - - struct MethodSignature { - - static let getScanRecord = JNIMethodSignature( - argumentTypes: [], - returnType: .object(Android.Bluetooth.LE.ScanRecord.JNICache.classSignature) - ).rawValue - - static let getAdvertiseFlags = JNIMethodSignature( - argumentTypes: [], - returnType: .boolean - ).rawValue - } - } -} - -// MARK: - Supporting Types - -public extension Android.Bluetooth.LE.ScanResult { - - /// LE Primary Phy - struct AndroidBluetoothLowEnergyPrimaryPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY. Used to refer to LE 1M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe1m = Android.Bluetooth.LE.ScanResult.PrimaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M) - - /** - * Bluetooth LE Coded PHY. Used to refer to LE Coded Physical Channel for advertising, scanning or connection. - */ - public static let phyLeCoded = Android.Bluetooth.LE.ScanResult.PrimaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED) - } - - /// LE Secondary Phy - struct AndroidBluetoothLowEnergySecondaryPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY. Used to refer to LE 1M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe1m = Android.Bluetooth.LE.ScanResult.SecondaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_1M) - - /** - * Bluetooth LE Coded PHY. Used to refer to LE Coded Physical Channel for advertising, scanning or connection. - */ - public static let phyLeCoded = Android.Bluetooth.LE.ScanResult.SecondaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED) - - /** - * Bluetooth LE 2M PHY. Used to refer to LE 2M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe2m = Android.Bluetooth.LE.ScanResult.SecondaryPhy(rawValue: Android.Bluetooth.Device.PHY_LE_2M) - - /** - * Indicates that the secondary physical layer was not used. - */ - public static let phyUnused = Android.Bluetooth.LE.ScanResult.SecondaryPhy(rawValue: Android.Bluetooth.LE.ScanResult.PHY_UNUSED) - } - - /// LE Data Status. - struct AndroidBluetoothLowEnergyDataStatus: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * For chained advertisements, inidcates tha the data contained in this scan result is complete. - */ - public static let dataComplete = Android.Bluetooth.LE.ScanResult.DataStatus(rawValue: Android.Bluetooth.LE.ScanResult.DATA_COMPLETE) - - /** - * For chained advertisements, indicates that the controller was unable to receive all chained packets and the scan result contains incomplete truncated data. - */ - public static let dataTruncated = Android.Bluetooth.LE.ScanResult.DataStatus(rawValue: Android.Bluetooth.LE.ScanResult.DATA_TRUNCATED) - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanSettings.swift b/Sources/AndroidBluetooth/BluetoothLeScanSettings.swift deleted file mode 100644 index 46f88ef..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanSettings.swift +++ /dev/null @@ -1,566 +0,0 @@ -// -// AndroidLEScanSettings.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/20/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.LE { - - typealias ScanSettings = AndroidBluetoothLowEnergyScanSettings -} - -public extension Android.Bluetooth.LE.ScanSettings { - - typealias ScanMode = AndroidBluetoothLowEnergyScanMode - - typealias CallbackType = AndroidBluetoothLowEnergyCallbackType - - typealias MatchMode = AndroidBluetoothLowEnergyMatchMode - - typealias MatchNum = AndroidBluetoothLowEnergyMatchNum - - typealias Phy = AndroidBluetoothLowEnergyPhy -} - -/// android.bluetooth.le.ScanSettings -/// -/// Bluetooth LE scan settings are passed to startScan(ScanCallback) to define the parameters for the scan. -public final class AndroidBluetoothLowEnergyScanSettings: JavaObject { - - fileprivate static let javaClassName = "android/bluetooth/le/ScanSettings" - - fileprivate static var JNIClass: jclass? - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - private static var new_MethodID_1: jmethodID? - - static var `default`: Android.Bluetooth.LE.ScanSettings { - - struct Cache { - - static let builder = Android.Bluetooth.LE.ScanSettings.Builder() - } - - return Cache.builder.build() - } -} - -// MARK: CONSTANTS - -public extension Android.Bluetooth.LE.ScanSettings { - - private static var CALLBACK_TYPE_ALL_MATCHES_FieldID: jfieldID? - - /// Trigger a callback for every Bluetooth advertisement found that matches the filter criteria. - static var CALLBACK_TYPE_ALL_MATCHES: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CALLBACK_TYPE_ALL_MATCHES", - fieldType: "I", - fieldCache: &CALLBACK_TYPE_ALL_MATCHES_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var CALLBACK_TYPE_FIRST_MATCH_FieldID: jfieldID? - - /// A result callback is only triggered for the first advertisement packet received that matches the filter criteria. - static var CALLBACK_TYPE_FIRST_MATCH: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CALLBACK_TYPE_FIRST_MATCH", - fieldType: "I", - fieldCache: &CALLBACK_TYPE_FIRST_MATCH_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var CALLBACK_TYPE_MATCH_LOST_FieldID: jfieldID? - - /// Receive a callback when advertisements are no longer received from a device that has been previously reported by a first match callback. - static var CALLBACK_TYPE_MATCH_LOST: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "CALLBACK_TYPE_MATCH_LOST", - fieldType: "I", - fieldCache: &CALLBACK_TYPE_MATCH_LOST_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var MATCH_MODE_AGGRESSIVE_FieldID: jfieldID? - - /// In Aggressive mode, hw will determine a match sooner even with feeble signal strength and few number of sightings/match in a duration. - static var MATCH_MODE_AGGRESSIVE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "MATCH_MODE_AGGRESSIVE", - fieldType: "I", - fieldCache: &MATCH_MODE_AGGRESSIVE_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var MATCH_MODE_STICKY_FieldID: jfieldID? - - /// For sticky mode, higher threshold of signal strength and sightings is required before reporting by hw - static var MATCH_MODE_STICKY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "MATCH_MODE_STICKY", - fieldType: "I", - fieldCache: &MATCH_MODE_STICKY_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var MATCH_NUM_FEW_ADVERTISEMENT_FieldID: jfieldID? - - /// Match few advertisement per filter, depends on current capability and availibility of the resources in hw. - static var MATCH_NUM_FEW_ADVERTISEMENT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "MATCH_NUM_FEW_ADVERTISEMENT", - fieldType: "I", - fieldCache: &MATCH_NUM_FEW_ADVERTISEMENT_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var MATCH_NUM_MAX_ADVERTISEMENT_FieldID: jfieldID? - - /// Match as many advertisement per filter as hw could allow, depends on current capability and availibility of the resources in hw. - static var MATCH_NUM_MAX_ADVERTISEMENT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "MATCH_NUM_MAX_ADVERTISEMENT", - fieldType: "I", - fieldCache: &MATCH_NUM_MAX_ADVERTISEMENT_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var MATCH_NUM_ONE_ADVERTISEMENT_FieldID: jfieldID? - - /// Match one advertisement per filter - static var MATCH_NUM_ONE_ADVERTISEMENT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "MATCH_NUM_ONE_ADVERTISEMENT", - fieldType: "I", - fieldCache: &MATCH_NUM_ONE_ADVERTISEMENT_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var PHY_LE_ALL_SUPPORTED_FieldID: jfieldID? - - /// Use all supported PHYs for scanning. - static var PHY_LE_ALL_SUPPORTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "PHY_LE_ALL_SUPPORTED", - fieldType: "I", - fieldCache: &PHY_LE_ALL_SUPPORTED_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var SCAN_MODE_BALANCED_FieldID: jfieldID? - - /// Perform Bluetooth LE scan in balanced power mode. - static var SCAN_MODE_BALANCED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_BALANCED", - fieldType: "I", - fieldCache: &SCAN_MODE_BALANCED_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var SCAN_MODE_LOW_LATENCY_FieldID: jfieldID? - - /// Scan using highest duty cycle. - static var SCAN_MODE_LOW_LATENCY: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_LOW_LATENCY", - fieldType: "I", - fieldCache: &SCAN_MODE_LOW_LATENCY_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var SCAN_MODE_LOW_POWER_FieldID: jfieldID? - - /// Perform Bluetooth LE scan in low power mode. - static var SCAN_MODE_LOW_POWER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_LOW_POWER", - fieldType: "I", - fieldCache: &SCAN_MODE_LOW_POWER_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } - - private static var SCAN_MODE_OPPORTUNISTIC_FieldID: jfieldID? - - /// A special Bluetooth LE scan mode. - static var SCAN_MODE_OPPORTUNISTIC: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SCAN_MODE_OPPORTUNISTIC", - fieldType: "I", - fieldCache: &SCAN_MODE_OPPORTUNISTIC_FieldID, - className: javaClassName, - classCache: &JNIClass ) - - return Int(__value) - } - } -} - -// MARK: METHODS - -public extension Android.Bluetooth.LE.ScanSettings { - - private static var describeContents_MethodID: jmethodID? - - /// Describe the kinds of special objects contained in this Parcelable instance's marshaled representation. For example, if - /// the object will include a file descriptor in the output of writeToParcel(Parcel, int), the return value of this method - /// must include the CONTENTS_FILE_DESCRIPTOR bit. - /// - /// @return a bitmask indicating the set of special object types marshaled by this Parcelable object instance. - func describeContents() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "describeContents", - methodSig: "()I", - methodCache: &AndroidBluetoothLowEnergyScanSettings.describeContents_MethodID, - args: &__args, - locals: &__locals) - return Int(__return) - } - - private static var getCallbackType_MethodID: jmethodID? - - func getCallbackType() -> Android.Bluetooth.LE.ScanSettings.CallbackType { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getCallbackType", - methodSig: "()I", - methodCache: &AndroidBluetoothLowEnergyScanSettings.getCallbackType_MethodID, - args: &__args, - locals: &__locals) - return Android.Bluetooth.LE.ScanSettings.CallbackType(rawValue: Int(__return)) - } - - private static var getLegacy_MethodID: jmethodID? - - /// Returns whether only legacy advertisements will be returned. Legacy advertisements include advertisements as - /// specified by the Bluetooth core specification 4.2 and below. - func getLegacy() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "getLegacy", - methodSig: "()Z", - methodCache: &AndroidBluetoothLowEnergyScanSettings.getLegacy_MethodID, - args: &__args, - locals: &__locals) - return __return != jboolean(JNI_FALSE) - } - - private static var getPhy_MethodID: jmethodID? - - /// Returns the physical layer used during a scan. - func getPhy() -> Android.Bluetooth.LE.ScanSettings.Phy { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getPhy", - methodSig: "()I", - methodCache: &AndroidBluetoothLowEnergyScanSettings.getPhy_MethodID, - args: &__args, - locals: &__locals) - return Android.Bluetooth.LE.ScanSettings.Phy(rawValue: Int(__return)) - } - - private static var getReportDelayMillis_MethodID: jmethodID? - - /// Returns report delay timestamp based on the device clock. - func getReportDelayMillis() -> Int64 { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallLongMethod(object: javaObject, - methodName: "getReportDelayMillis", - methodSig: "()J", - methodCache: &AndroidBluetoothLowEnergyScanSettings.getReportDelayMillis_MethodID, - args: &__args, - locals: &__locals) - return __return - } - - private static var getScanMode_MethodID: jmethodID? - - func getScanMode() -> Android.Bluetooth.LE.ScanSettings.ScanMode { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getScanMode", - methodSig: "()I", - methodCache: &AndroidBluetoothLowEnergyScanSettings.getScanMode_MethodID, - args: &__args, - locals: &__locals) - return Android.Bluetooth.LE.ScanSettings.ScanMode(rawValue: Int(__return)) - } - - private static var getScanResultType_MethodID: jmethodID? - - func getScanResultType() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getScanResultType", - methodSig: "()I", - methodCache: &AndroidBluetoothLowEnergyScanSettings.getScanResultType_MethodID, - args: &__args, - locals: &__locals) - return Int(__return) - } -} - -// MARK: - Supporting Types - -public extension Android.Bluetooth.LE.ScanSettings { - - /// LE Scan mode. - struct AndroidBluetoothLowEnergyScanMode: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Perform Bluetooth LE scan in low power mode. This is the default scan mode as it consumes the least power. This mode - * is enforced if the scanning application is not in foreground. - */ - public static let lowPower = Android.Bluetooth.LE.ScanSettings.ScanMode(rawValue: Android.Bluetooth.LE.ScanSettings.SCAN_MODE_LOW_POWER) - - /** - * Perform Bluetooth LE scan in balanced power mode. Scan results are returned at a rate that - * provides a good trade-off between scan frequency and power consumption. - */ - public static let balanced = Android.Bluetooth.LE.ScanSettings.ScanMode(rawValue: Android.Bluetooth.LE.ScanSettings.SCAN_MODE_BALANCED) - - /** - * Scan using highest duty cycle. It's recommended to only use this mode when the application is running in the foreground. - */ - public static let lowLatency = Android.Bluetooth.LE.ScanSettings.ScanMode(rawValue: Android.Bluetooth.LE.ScanSettings.SCAN_MODE_LOW_LATENCY) - } - - /// LE Callback Type - struct AndroidBluetoothLowEnergyCallbackType: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - /** - * Trigger a callback for every Bluetooth advertisement found that matches the filter criteria. If no filter is active, all - * advertisement packets are reported. - */ - public static let allMatches = Android.Bluetooth.LE.ScanSettings.CallbackType(rawValue: Android.Bluetooth.LE.ScanSettings.CALLBACK_TYPE_ALL_MATCHES) - - /** - * A result callback is only triggered for the first advertisement packet received that matches the filter criteria. - */ - public static let firstMatch = Android.Bluetooth.LE.ScanSettings.CallbackType(rawValue: Android.Bluetooth.LE.ScanSettings.CALLBACK_TYPE_FIRST_MATCH) - - /** - * Receive a callback when advertisements are no longer received from a device that has been previously reported by a first match callback. - */ - public static let matchLost = Android.Bluetooth.LE.ScanSettings.CallbackType(rawValue: Android.Bluetooth.LE.ScanSettings.CALLBACK_TYPE_MATCH_LOST) - } - - /// LE Match Mode - struct AndroidBluetoothLowEnergyMatchMode: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * In Aggressive mode, hw will determine a match sooner even with feeble signal strength and few number of sightings/match in a duration. - */ - public static let aggressive = Android.Bluetooth.LE.ScanSettings.MatchMode(rawValue: Android.Bluetooth.LE.ScanSettings.MATCH_MODE_AGGRESSIVE) - - /** - * For sticky mode, higher threshold of signal strength and sightings is required before reporting by hw - */ - public static let sticky = Android.Bluetooth.LE.ScanSettings.MatchMode(rawValue: Android.Bluetooth.LE.ScanSettings.MATCH_MODE_STICKY) - } - - /// LE Match Num - struct AndroidBluetoothLowEnergyMatchNum: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Match one advertisement per filter. - */ - public static let oneAdvertisement = Android.Bluetooth.LE.ScanSettings.MatchNum(rawValue: Android.Bluetooth.LE.ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT) - - /** - * Match few advertisement per filter, depends on current capability and availibility of the resources in hw. - */ - public static let fewAdvertisement = Android.Bluetooth.LE.ScanSettings.MatchNum(rawValue: Android.Bluetooth.LE.ScanSettings.MATCH_NUM_FEW_ADVERTISEMENT) - - /** - * Match as many advertisement per filter as hw could allow, depends on current capability and availibility of the resources in hw. - */ - public static let maxAdvertisement = Android.Bluetooth.LE.ScanSettings.MatchNum(rawValue: Android.Bluetooth.LE.ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT) - } - - /// LE Phy - struct AndroidBluetoothLowEnergyPhy: RawRepresentable { - - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /** - * Bluetooth LE 1M PHY. Used to refer to LE 1M Physical Channel for advertising, scanning or connection. - */ - public static let phyLe1m = Android.Bluetooth.LE.ScanSettings.Phy(rawValue: Android.Bluetooth.Device.PHY_LE_1M) - - /** - * Bluetooth LE Coded PHY. Used to refer to LE Coded Physical Channel for advertising, scanning or connection. - */ - public static let phyCoded = Android.Bluetooth.LE.ScanSettings.Phy(rawValue: Android.Bluetooth.Device.PHY_LE_CODED) - - /** - * Use all supported PHYs for scanning. This will check the controller capabilities, and start the scan on 1Mbit and LE Coded PHYs if supported, or on the 1Mbit PHY only. - */ - public static let phyLeAllSupported = Android.Bluetooth.LE.ScanSettings.Phy(rawValue: Android.Bluetooth.LE.ScanSettings.PHY_LE_ALL_SUPPORTED) - } - -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanSettingsBuilder.swift b/Sources/AndroidBluetooth/BluetoothLeScanSettingsBuilder.swift deleted file mode 100644 index 997f9f0..0000000 --- a/Sources/AndroidBluetooth/BluetoothLeScanSettingsBuilder.swift +++ /dev/null @@ -1,302 +0,0 @@ -// -// BluetoothLeScanSettingsBuilder.swift -// Android -// -// Created by Marco Estrella on 5/24/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.LE.ScanSettings { - - typealias Builder = AndroidBluetoothLowEnergyScanSettingsBuilder -} - -// android.bluetooth.le.ScanSettings.Builder -/// -/// Builder for ScanSettings. -public final class AndroidBluetoothLowEnergyScanSettingsBuilder: JavaObject { - - private static let javaClassName = "android/bluetooth/le/ScanSettings$Builder" - - private static var JNIClass: jclass? - - private static var init_MethodID: jmethodID? - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public convenience init() { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - let __object = JNIMethod.NewObject( - className: AndroidBluetoothLowEnergyScanSettingsBuilder.javaClassName, - classCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.JNIClass, - methodSig: "()V", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.init_MethodID, - args: &__args, - locals: &__locals ) - - self.init( javaObject: __object ) - - JNI.DeleteLocalRef( __object ) - } -} - -// MARK: METHODS - -public extension Android.Bluetooth.LE.ScanSettings.Builder { - - private static var build_MethodID: jmethodID? - /// Build ScanSettings. - func build() -> Android.Bluetooth.LE.ScanSettings { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "build", - methodSig: "()Landroid/bluetooth/le/ScanSettings;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.build_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettings( javaObject: __return ) - } - - private static var setCallbackType_MethodID: jmethodID? - /// Set callback type for Bluetooth LE scan. - func setCallbackType(callbackType: Android.Bluetooth.LE.ScanSettings.CallbackType) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(callbackType.rawValue)) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setCallbackType", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setCallbackType_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setCallbackType", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setCallbackType_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } - - private static var setLegacy_MethodID: jmethodID? - - /// Set whether only legacy advertisments should be returned in scan results. Legacy advertisements include - /// advertisements as specified by the Bluetooth core specification 4.2 and below. This is true by default for compatibility - /// with older apps. - func setLegacy(legacy: Bool) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(z: jboolean(legacy ? JNI_TRUE : JNI_FALSE) ) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setLegacy", - methodSig: "(Z)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setLegacy_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setLegacy", - methodSig: "(Z)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setLegacy_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } - - private static var setMatchMode_MethodID: jmethodID? - - /// Set match mode for Bluetooth LE scan filters hardware match - func setMatchMode(matchMode: Android.Bluetooth.LE.ScanSettings.MatchMode) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(matchMode.rawValue)) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setMatchMode", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setMatchMode_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setMatchMode", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setMatchMode_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } - - private static var setNumOfMatches_MethodID: jmethodID? - - func setNumOfMatches(numOfMatches: Android.Bluetooth.LE.ScanSettings.MatchNum) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(numOfMatches.rawValue)) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setNumOfMatches", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setNumOfMatches_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setNumOfMatches", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setNumOfMatches_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } - - private static var setPhy_MethodID: jmethodID? - - func setPhy(phy: Android.Bluetooth.LE.ScanSettings.Phy) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(phy.rawValue)) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setPhy", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setPhy_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setPhy", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setPhy_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } - - private static var setReportDelay_MethodID: jmethodID? - - func setReportDelay(reportDelayMillis: Int64) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(j: jlong(reportDelayMillis)) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setReportDelay", - methodSig: "(J)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setReportDelay_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setReportDelay", - methodSig: "(J)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setReportDelay_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } - - private static var setScanMode_MethodID: jmethodID? - - // Set scan mode for Bluetooth LE scan. - func setScanMode(_ scanMode: Android.Bluetooth.LE.ScanSettings.ScanMode) -> Android.Bluetooth.LE.ScanSettings.Builder { - - var __locals = [jobject]() - - var __args = [jvalue]( repeating: jvalue(), count: 1 ) - - __args[0] = jvalue(i: jint(scanMode.rawValue)) - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "setScanMode", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setScanMode_MethodID, - args: &__args, - locals: &__locals ) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "setScanMode", - methodSig: "(I)Landroid/bluetooth/le/ScanSettings$Builder;", - methodCache: &AndroidBluetoothLowEnergyScanSettingsBuilder.setScanMode_MethodID, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return AndroidBluetoothLowEnergyScanSettingsBuilder(javaObject: __return) - } -} diff --git a/Sources/AndroidBluetooth/BluetoothLeScanner.swift b/Sources/AndroidBluetooth/BluetoothLeScanner.swift new file mode 100644 index 0000000..44aa341 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothLeScanner.swift @@ -0,0 +1,36 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidApp +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.le.BluetoothLeScanner") +open class BluetoothLeScanner: JavaObject { + @JavaMethod + open func startScan(_ arg0: List?, _ arg1: ScanSettings?, _ arg2: ScanCallback?) + + @JavaMethod + open func startScan(_ arg0: ScanCallback?) + + @JavaMethod + open func startScan(_ arg0: List?, _ arg1: ScanSettings?, _ arg2: PendingIntent?) -> Int32 + + @JavaMethod + open func stopScan(_ arg0: PendingIntent?) + + @JavaMethod + open func stopScan(_ arg0: ScanCallback?) + + @JavaMethod + open func flushPendingScanResults(_ arg0: ScanCallback?) +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var EXTRA_CALLBACK_TYPE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_ERROR_CODE: String + + @JavaStaticField(isFinal: true) + public var EXTRA_LIST_SCAN_RESULT: String +} diff --git a/Sources/AndroidBluetooth/BluetoothLowEnergyAdvertiser.swift b/Sources/AndroidBluetooth/BluetoothLowEnergyAdvertiser.swift deleted file mode 100644 index b008886..0000000 --- a/Sources/AndroidBluetooth/BluetoothLowEnergyAdvertiser.swift +++ /dev/null @@ -1,312 +0,0 @@ -// -// BluetoothLowEnergyAdvertiser.swift -// Android -// -// Created by Marco Estrella on 5/29/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth.LE { - - typealias Advertiser = AndroidBluetoothLowEnergyAdvertiser -} - -/** - * This class provides a way to perform Bluetooth LE advertise operations, such as starting and stopping advertising. An - * advertiser can broadcast up to 31 bytes of advertisement data represented by AdvertiseData. - * - * To get an instance of BluetoothLeAdvertiser, call the getBluetoothLeAdvertiser() method. - * - * Note: Most of the methods here require BLUETOOTH_ADMIN permission. - */ -public final class AndroidBluetoothLowEnergyAdvertiser: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} - -// MARK: - Methods - -public extension AndroidBluetoothLowEnergyAdvertiser { - - /** - * Start Bluetooth LE Advertising. On success, the advertiseData will be broadcasted. Returns immediately, the operation status is delivered through callback. - * - * Requires BLUETOOTH_ADMIN permission. - */ - func startAdvertising(settings: Android.Bluetooth.LE.AdvertiseSettings, - advertiseData: Android.Bluetooth.LE.AdvertiseData, - callback: Android.Bluetooth.LE.AdvertiseCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: settings, locals: &__locals ), - JNIType.toJava( value: advertiseData, locals: &__locals ), - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startAdvertising", - methodSig: "(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/ScanCallback;)V", - methodCache: &JNICache.MethodID.startAdvertising, - args: &__args, - locals: &__locals ) - } - - /** - * Start Bluetooth LE Advertising. The advertiseData will be broadcasted if the operation succeeds. The scanResponse - * is returned when a scanning device sends an active scan request. This method returns immediately, the operation status - * is delivered through callback. - * - * Requires BLUETOOTH_ADMIN - */ - func startAdvertising(settings: Android.Bluetooth.LE.AdvertiseSettings, - advertiseData: Android.Bluetooth.LE.AdvertiseData, - scanResponse: Android.Bluetooth.LE.AdvertiseData, - callback: Android.Bluetooth.LE.AdvertiseCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: settings, locals: &__locals ), - JNIType.toJava( value: advertiseData, locals: &__locals ), - JNIType.toJava( value: scanResponse, locals: &__locals ), - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startAdvertising", - methodSig: "(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/ScanCallback;)V", - methodCache: &JNICache.MethodID.startAdvertising2, - args: &__args, - locals: &__locals ) - } - - /** - * Creates a new advertising set. If operation succeed, device will start advertising. This method returns immediately, the - * operation status is delivered through callback.onAdvertisingSetStarted(). - */ - func startAdvertisingSet(parameters: Android.Bluetooth.LE.AdvertisingSetParameters, - advertiseData: Android.Bluetooth.LE.AdvertiseData, - scanResponse: Android.Bluetooth.LE.AdvertiseData, - periodicParameters: Android.Bluetooth.LE.PeriodicAdvertisingParameters, - periodicData: Android.Bluetooth.LE.AdvertiseData, - duration: Int, - maxExtendedAdvertisingEvents: Int, - callback: Android.Bluetooth.LE.AdvertisingSetCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: parameters, locals: &__locals ), - JNIType.toJava( value: advertiseData, locals: &__locals ), - JNIType.toJava( value: scanResponse, locals: &__locals ), - JNIType.toJava( value: periodicParameters, locals: &__locals ), - JNIType.toJava( value: periodicData, locals: &__locals ), - jvalue(i: jint(duration) ), - jvalue(i: jint(maxExtendedAdvertisingEvents) ), - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startAdvertisingSet", - methodSig: "(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/AdvertisingSetCallback;)V", - methodCache: &JNICache.MethodID.startAdvertisingSet, - args: &__args, - locals: &__locals ) - } - - /** - * Creates a new advertising set. If operation succeed, device will start advertising. This method returns immediately, the - * operation status is delivered through callback.onAdvertisingSetStarted(). - */ - func startAdvertisingSet(parameters: Android.Bluetooth.LE.AdvertisingSetParameters, - advertiseData: Android.Bluetooth.LE.AdvertiseData, - scanResponse: Android.Bluetooth.LE.AdvertiseData, - periodicParameters: Android.Bluetooth.LE.PeriodicAdvertisingParameters, - periodicData: Android.Bluetooth.LE.AdvertiseData, - duration: Int, - maxExtendedAdvertisingEvents: Int, - callback: Android.Bluetooth.LE.AdvertisingSetCallback, - handler: JavaObject) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: parameters, locals: &__locals ), - JNIType.toJava( value: advertiseData, locals: &__locals ), - JNIType.toJava( value: scanResponse, locals: &__locals ), - JNIType.toJava( value: periodicParameters, locals: &__locals ), - JNIType.toJava( value: periodicData, locals: &__locals ), - jvalue(i: jint(duration) ), - jvalue(i: jint(maxExtendedAdvertisingEvents) ), - JNIType.toJava( value: callback, locals: &__locals ), - JNIType.toJava( value: handler, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startAdvertisingSet", - methodSig: "(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)V", - methodCache: &JNICache.MethodID.startAdvertisingSet2, - args: &__args, - locals: &__locals ) - } - - /** - * Creates a new advertising set. If operation succeed, device will start advertising. This method returns immediately, the - * operation status is delivered through callback.onAdvertisingSetStarted(). - */ - func startAdvertisingSet(parameters: Android.Bluetooth.LE.AdvertisingSetParameters, - advertiseData: Android.Bluetooth.LE.AdvertiseData, - scanResponse: Android.Bluetooth.LE.AdvertiseData, - periodicParameters: Android.Bluetooth.LE.PeriodicAdvertisingParameters, - periodicData: Android.Bluetooth.LE.AdvertiseData, - callback: Android.Bluetooth.LE.AdvertisingSetCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: parameters, locals: &__locals ), - JNIType.toJava( value: advertiseData, locals: &__locals ), - JNIType.toJava( value: scanResponse, locals: &__locals ), - JNIType.toJava( value: periodicParameters, locals: &__locals ), - JNIType.toJava( value: periodicData, locals: &__locals ), - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startAdvertisingSet", - methodSig: "(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertisingSetCallback;)V", - methodCache: &JNICache.MethodID.startAdvertisingSet3, - args: &__args, - locals: &__locals ) - } - - /** - * Creates a new advertising set. If operation succeed, device will start advertising. This method returns immediately, the - * operation status is delivered through callback.onAdvertisingSetStarted(). - */ - func startAdvertisingSet(parameters: Android.Bluetooth.LE.AdvertisingSetParameters, - advertiseData: Android.Bluetooth.LE.AdvertiseData, - scanResponse: Android.Bluetooth.LE.AdvertiseData, - periodicParameters: Android.Bluetooth.LE.PeriodicAdvertisingParameters, - periodicData: Android.Bluetooth.LE.AdvertiseData, - callback: Android.Bluetooth.LE.AdvertisingSetCallback, - handler: JavaObject) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: parameters, locals: &__locals ), - JNIType.toJava( value: advertiseData, locals: &__locals ), - JNIType.toJava( value: scanResponse, locals: &__locals ), - JNIType.toJava( value: periodicParameters, locals: &__locals ), - JNIType.toJava( value: periodicData, locals: &__locals ), - JNIType.toJava( value: callback, locals: &__locals ), - JNIType.toJava( value: handler, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startAdvertisingSet", - methodSig: "(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)V", - methodCache: &JNICache.MethodID.startAdvertisingSet4, - args: &__args, - locals: &__locals ) - } - - /** - * Stop Bluetooth LE advertising. The callback must be the same one use in startAdvertising(AdvertiseSettings, AdvertiseData, AdvertiseCallback). - * - * Requires BLUETOOTH_ADMIN permission. - */ - func stopAdvertising(callback: Android.Bluetooth.LE.AdvertiseCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "stopAdvertising", - methodSig: "(Landroid/bluetooth/le/AdvertiseCallback;)V", - methodCache: &JNICache.MethodID.stopAdvertising, - args: &__args, - locals: &__locals ) - } - - /** - * Used to dispose of a AdvertisingSet object, obtained with startAdvertisingSet(AdvertisingSetParameters, - * AdvertiseData, AdvertiseData, PeriodicAdvertisingParameters, AdvertiseData, AdvertisingSetCallback). - */ - func stopAdvertising(callback: Android.Bluetooth.LE.AdvertisingSetCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "stopAdvertising", - methodSig: "(Landroid/bluetooth/le/AdvertisingSetCallback;)V", - methodCache: &JNICache.MethodID.stopAdvertisingSet, - args: &__args, - locals: &__locals ) - } -} - -// MARK: - Private - -private extension AndroidBluetoothLowEnergyAdvertiser { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/le/BluetoothLeAdvertiser" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var startAdvertising: jmethodID? - static var startAdvertising2: jmethodID? - static var startAdvertisingSet: jmethodID? - static var startAdvertisingSet2: jmethodID? - static var startAdvertisingSet3: jmethodID? - static var startAdvertisingSet4: jmethodID? - static var stopAdvertising: jmethodID? - static var stopAdvertisingSet: jmethodID? - } - } -} - diff --git a/Sources/AndroidBluetooth/BluetoothLowEnergyScanner.swift b/Sources/AndroidBluetooth/BluetoothLowEnergyScanner.swift deleted file mode 100644 index 47a5f92..0000000 --- a/Sources/AndroidBluetooth/BluetoothLowEnergyScanner.swift +++ /dev/null @@ -1,315 +0,0 @@ -// -// AndroidBluetoothLowEnergyScanner.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/21/18. -// - -import Foundation -import java_swift -import java_util -import Android - -public extension Android.Bluetooth.LE { - - typealias Scanner = AndroidBluetoothLowEnergyScanner -} - -public final class AndroidBluetoothLowEnergyScanner: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} - -// MARK: - Constants - -public extension AndroidBluetoothLowEnergyScanner { - - /// Optional extra indicating the callback type, which will be one of CALLBACK_TYPE_* constants in ScanSettings. - static var EXTRA_CALLBACK_TYPE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_CALLBACK_TYPE", - fieldType: "I", - fieldCache: &JNICache.FieldID.EXTRA_CALLBACK_TYPE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Optional extra indicating the error code, if any. - static var EXTRA_ERROR_CODE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_ERROR_CODE", - fieldType: "I", - fieldCache: &JNICache.FieldID.EXTRA_ERROR_CODE, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// Extra containing a list of ScanResults. - static var EXTRA_LIST_SCAN_RESULT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_LIST_SCAN_RESULT", - fieldType: "I", - fieldCache: &JNICache.FieldID.EXTRA_LIST_SCAN_RESULT, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } -} - -// MARK: - Methods - -public extension AndroidBluetoothLowEnergyScanner { - - /** - * Start Bluetooth LE scan using a PendingIntent. The scan results will be delivered via the PendingIntent. Use this method of scanning if your process is not always running - * and it should be started when scan results are available. - * - * An app must hold ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission in order to get results. - * - * When the PendingIntent is delivered, the Intent passed to the receiver or activity will contain one or more of the extras EXTRA_CALLBACK_TYPE, - * EXTRA_ERROR_CODE and EXTRA_LIST_SCAN_RESULT to indicate the result of the scan. - * - * Requires the BLUETOOTH_ADMIN permission. - * - * Returns 0 for success or an error code from ScanCallback if the scan request could not be sent. - */ - func startScan(filters: [Android.Bluetooth.LE.ScanFilter]? = nil, - settings: Android.Bluetooth.LE.ScanSettings = Android.Bluetooth.LE.ScanSettings.Builder().build(), - callbackIntent: JavaObject) -> Int { - let filterList: ArrayList? - - if let filters = filters, filters.isEmpty == false { - - let list = ArrayList(filters.count) - - filters.forEach { - let success = list.add($0) - assert(success, "Could not add to list") - } - - filterList = list - - } else { - - filterList = nil - } - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: filterList, locals: &__locals ), - JNIType.toJava( value: settings, locals: &__locals ), - JNIType.toJava( value: callbackIntent, locals: &__locals ) - ] - - let __return = JNIMethod.CallIntMethod( - object: javaObject, - methodName: "startScan", - methodSig: "(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/app/PendingIntent;)I", - methodCache: &JNICache.MethodID.startScan, - args: &__args, - locals: &__locals ) - - return Int(__return) - } - - /** - * Start Bluetooth LE scan with default parameters and no filters. The scan results will be delivered through callback. - * For unfiltered scans, scanning is stopped on screen off to save power. Scanning is resumed when screen is turned on again. - * To avoid this, use startScan(List, ScanSettings, ScanCallback) with desired ScanFilter. - * - * An app must hold ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission in order to get results. - * - * Requires the BLUETOOTH_ADMIN permission. - */ - func startScan(callback: Android.Bluetooth.LE.ScanCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startScan", - methodSig: "(Landroid/bluetooth/le/ScanCallback;)V", - methodCache: &JNICache.MethodID.startScan2, - args: &__args, - locals: &__locals ) - } - - /** - * Start Bluetooth LE scan. - * - * - Parameter filters: `Array` of `ScanFilter` for finding exact BLE devices. - * @- Parameter settings: Settings for the scan. - * @- Parameter callback: Callback used to deliver scan results. - */ - func startScan(filters: [Android.Bluetooth.LE.ScanFilter]? = nil, - settings: Android.Bluetooth.LE.ScanSettings, - callback: Android.Bluetooth.LE.ScanCallback) { - - let filterList: ArrayList? - - if let filters = filters, filters.isEmpty == false { - - let list = ArrayList(filters.count) - - filters.forEach { - let success = list.add($0) - assert(success, "Could not add to list") - } - - filterList = list - - } else { - - filterList = nil - } - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: filterList, locals: &__locals ), - JNIType.toJava( value: settings, locals: &__locals ), - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "startScan", - methodSig: "(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/bluetooth/le/ScanCallback;)V", - methodCache: &JNICache.MethodID.startScan3, - args: &__args, - locals: &__locals ) - } - - /** - * Stops an ongoing Bluetooth LE scan. - * - * Requires the BLUETOOTH_ADMIN permission. - */ - func stopScan(callback: Android.Bluetooth.LE.ScanCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "stopScan", - methodSig: "(Landroid/bluetooth/le/ScanCallback;)V", - methodCache: &JNICache.MethodID.stopScan, - args: &__args, - locals: &__locals ) - } - - /** - * Stops an ongoing Bluetooth LE scan started using a PendingIntent. - * - * Requires the BLUETOOTH_ADMIN permission. - */ - func stopScan(callbackIntent: JavaObject) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: callbackIntent, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "stopScan", - methodSig: "(Landroid/app/PendingIntent;)V", - methodCache: &JNICache.MethodID.stopScan2, - args: &__args, - locals: &__locals ) - } - - /** - * Flush pending batch scan results stored in Bluetooth controller. This will return Bluetooth LE scan results batched on bluetooth controller. - * Returns immediately, batch scan results data will be delivered through the callback. - */ - func flushPendingScanResults(callback: Android.Bluetooth.LE.ScanCallback) { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava( value: callback, locals: &__locals ) - ] - - JNIMethod.CallVoidMethod( - object: javaObject, - methodName: "flushPendingScanResults", - methodSig: "(Landroid/bluetooth/le/ScanCallback;)V", - methodCache: &JNICache.MethodID.flushPendingScanResults, - args: &__args, - locals: &__locals ) - } -} - -// MARK: - Private - -private extension AndroidBluetoothLowEnergyScanner { - - /// JNI Cache - struct JNICache { - - /// JNI Java class name - static let className = "android/bluetooth/le/BluetoothLeScanner" - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - static var EXTRA_CALLBACK_TYPE: jfieldID? - static var EXTRA_ERROR_CODE: jfieldID? - static var EXTRA_LIST_SCAN_RESULT: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var flushPendingScanResults: jmethodID? - static var startScan: jmethodID? - static var startScan2: jmethodID? - static var startScan3: jmethodID? - static var stopScan: jmethodID? - static var stopScan2: jmethodID? - } - } -} diff --git a/Sources/AndroidBluetooth/BluetoothManager.swift b/Sources/AndroidBluetooth/BluetoothManager.swift index 541ddb4..336110a 100644 --- a/Sources/AndroidBluetooth/BluetoothManager.swift +++ b/Sources/AndroidBluetooth/BluetoothManager.swift @@ -1,193 +1,23 @@ -// -// Bluetooth.swift -// PureSwift -// -// Created by Alsey Coleman Miller on 3/17/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidContent +import JavaKit +import JavaKitCollection +import JavaRuntime -import Foundation -import java_swift -import java_util -import Android +@JavaClass("android.bluetooth.BluetoothManager") +open class BluetoothManager: JavaObject { + @JavaMethod + open func getConnectionState(_ arg0: BluetoothDevice?, _ arg1: Int32) -> Int32 -public extension Android.Bluetooth { - - typealias Manager = AndroidBluetoothManager -} - -/** - * High level manager used to obtain an instance of an `Android.Bluetooth.Adapter` - * and to conduct overall Bluetooth Management. - */ -public final class AndroidBluetoothManager: JavaObject { - - private static var JNIClass: jclass? - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - /** - * Get the default BLUETOOTH Adapter for this device. - * - * @return the default BLUETOOTH Adapter - */ - public var adapter: AndroidBluetoothAdapter? { - - @inline(__always) - get { return getAdapter() } - } -} + @JavaMethod + open func openGattServer(_ arg0: Context?, _ arg1: BluetoothGattServerCallback?) -> BluetoothGattServer! -// MARK: - Methods - -public extension AndroidBluetoothManager { - - /** - * Get connected devices for the specified profile. - */ - func getConnectedDevices(profile: Int) -> List? { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(profile)) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getConnectedDevices", - methodSig: "(I)Ljava/util/List;", - methodCache: &JNICache.MethodID.getConnectedDevices, - args: &__args, - locals: &__locals) - return ListForward(javaObject: __return) - } - - /** - * Get connected devices for the specified profile. - */ - func getConnectionState(device: Android.Bluetooth.Device, profile: Int) -> Int { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(profile)), - JNIType.toJava(value: device, locals: &__locals) - ] - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getConnectionState", - methodSig: "(Landroid/bluetooth/BluetoothDevice;I)I", - methodCache: &JNICache.MethodID.getConnectionState, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get a list of devices that match any of the given connection states. - */ - func getDevicesMatchingConnectionStates(profile: Int, states: [Int]) -> List? { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(profile)), - JNIType.toJava(value: states, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getDevicesMatchingConnectionStates", - methodSig: "(I[I)Ljava/util/List;", - methodCache: &JNICache.MethodID.getDevicesMatchingConnectionStates, - args: &__args, - locals: &__locals) - return ListForward(javaObject: __return) - } - - /** - * Open a GATT Server The callback is used to deliver results to Caller, such as connection status as well as the results of any other GATT server operations. - */ - func openGattServer(context: Android.Content.Context, callback: JavaObject) -> Android.Bluetooth.GattServer? { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - JNIType.toJava(value: context, locals: &__locals), - JNIType.toJava(value: callback, locals: &__locals) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "openGattServer", - methodSig: "(Landroid/content/Context;Landroid/bluetooth/;LBluetoothGattServerCallback;)Landroid/bluetooth/BluetoothGattServer;", - methodCache: &JNICache.MethodID.openGattServer, - args: &__args, - locals: &__locals) - return __return != nil ? Android.Bluetooth.GattServer(javaObject: __return) : nil - } - - /** - * Get the default BLUETOOTH Adapter for this device. - * - * @return the default BLUETOOTH Adapter - */ - func getAdapter() -> Android.Bluetooth.Adapter? { - - var __locals = [jobject]() - - var __args = [jvalue].init(repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getAdapter", - methodSig: "()Landroid/bluetooth/BluetoothAdapter;", - methodCache: &JNICache.MethodID.getAdapter, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return __return != nil ? AndroidBluetoothAdapter( javaObject: __return ) : nil - } -} + @JavaMethod + open func getConnectedDevices(_ arg0: Int32) -> List! -// MARK: - Android.Content.Context.SystemService + @JavaMethod + open func getDevicesMatchingConnectionStates(_ arg0: Int32, _ arg1: [Int32]) -> List! -extension Android.Bluetooth.Manager: Android.Content.Context.SystemService { - - public static var systemServiceName: Android.Content.Context.SystemService.Name { return .bluetooth } + @JavaMethod + open func getAdapter() -> BluetoothAdapter! } - -// MARK: - JNICache - -internal extension AndroidBluetoothManager { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothManager"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var getAdapter: jmethodID? - static var getConnectedDevices: jmethodID? - static var getConnectionState: jmethodID? - static var getDevicesMatchingConnectionStates: jmethodID? - static var openGattServer: jmethodID? - } - } -} - diff --git a/Sources/AndroidBluetooth/BluetoothProfile+ServiceListener.swift b/Sources/AndroidBluetooth/BluetoothProfile+ServiceListener.swift new file mode 100644 index 0000000..ec74514 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothProfile+ServiceListener.swift @@ -0,0 +1,14 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension BluetoothProfile { + @JavaInterface("android.bluetooth.BluetoothProfile$ServiceListener") + public struct ServiceListener { + @JavaMethod + public func onServiceConnected(_ arg0: Int32, _ arg1: BluetoothProfile?) + + @JavaMethod + public func onServiceDisconnected(_ arg0: Int32) + } +} diff --git a/Sources/AndroidBluetooth/BluetoothProfile.swift b/Sources/AndroidBluetooth/BluetoothProfile.swift index 441fb17..bffc607 100644 --- a/Sources/AndroidBluetooth/BluetoothProfile.swift +++ b/Sources/AndroidBluetooth/BluetoothProfile.swift @@ -1,429 +1,68 @@ -// -// BluetoothProfile.swift -// Android -// -// Created by Marco Estrella on 6/7/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime -import Foundation -import java_swift -import java_util -import JNI -import Android +@JavaInterface("android.bluetooth.BluetoothProfile") +public struct BluetoothProfile { + @JavaMethod + public func getConnectionState(_ arg0: BluetoothDevice?) -> Int32 -public extension Android.Bluetooth { - - typealias Profile = AndroidBluetoothProfile -} + @JavaMethod + public func getConnectedDevices() -> List! -public extension Android.Bluetooth.Profile { - - typealias Constants = AndroidBluetoothProfileConstants + @JavaMethod + public func getDevicesMatchingConnectionStates(_ arg0: [Int32]) -> List! } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var A2DP: Int32 -/** - * Public APIs for the Bluetooth Profiles. - * - * Clients should call BluetoothAdapter.getProfileProxy(Context, BluetoothProfile.ServiceListener, int), - * to get the Profile Proxy. Each public profile implements this interface. - */ -public protocol AndroidBluetoothProfile: JavaProtocol { - - /** - * Get connected devices for this specific profile. - */ - func getConnectedDevices() -> List? - - /** - * Get the current connection state of the profile. - */ - func getConnectionState(device: Android.Bluetooth.Device) -> Int - - /** - * Get a list of devices that match any of the given connection states. - */ - func getDevicesMatchingConnectionStates(states: [Int]) -> List? -} + @JavaStaticField(isFinal: true) + public var CSIP_SET_COORDINATOR: Int32 -// MARK: - Constants + @JavaStaticField(isFinal: true) + public var EXTRA_PREVIOUS_STATE: String -public final class AndroidBluetoothProfileConstants { - - static var A2DP: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "A2DP", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.A2DP, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var EXTRA_PREVIOUS_STATE: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_PREVIOUS_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.EXTRA_PREVIOUS_STATE, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return String(__value) - } - } - - static var EXTRA_STATE: String { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "EXTRA_STATE", - fieldType: "Ljava/lang/String;", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.EXTRA_STATE, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return String(__value) - } - } - - static var GATT: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.GATT, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var GATT_SERVER: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "GATT_SERVER", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.GATT_SERVER, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var HEADSET: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEADSET", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.HEADSET, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var HEALTH: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HEALTH", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.HEALTH, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var HID_DEVICE: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "HID_DEVICE", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.HID_DEVICE, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var SAP: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "SAP", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.SAP, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var STATE_CONNECTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_CONNECTED", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.STATE_CONNECTED, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - static var STATE_CONNECTING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_CONNECTING", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.STATE_CONNECTING, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var STATE_DISCONNECTED: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_DISCONNECTED", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.STATE_DISCONNECTED, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } - - static var STATE_DISCONNECTING: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "STATE_DISCONNECTING", - fieldType: "I", - fieldCache: &AndroidBluetoothProfileConstants.JNICache.FieldID.STATE_DISCONNECTING, - className: AndroidBluetoothProfileConstants.JNICache.className, - classCache: &AndroidBluetoothProfileConstants.JNICache.jniClass ) - - return Int(__value) - } - } -} + @JavaStaticField(isFinal: true) + public var EXTRA_STATE: String -// MARK: - Local Listener + @JavaStaticField(isFinal: true) + public var GATT: Int32 -extension AndroidBluetoothProfile { - - public func localJavaObject( _ locals: UnsafeMutablePointer<[jobject]> ) -> jobject? { - - return AndroidBluetoothProfileLocal( owned: self, proto: self ).localJavaObject( locals ) - } -} + @JavaStaticField(isFinal: true) + public var GATT_SERVER: Int32 -internal class AndroidBluetoothProfileLocal: JNILocalProxy { - - fileprivate static let _proxyClass: jclass = { - - var natives: [JNINativeMethod] = [ - JNICache.Method.getConnectedDevices.method, - JNICache.Method.getConnectionState.method, - JNICache.Method.getDevicesMatchingConnectionStates.method, - .finalize - ] - - let clazz = JNI.FindClass( proxyClassName() ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - override open class func proxyClassName() -> String { return JNICache.className } - - override open class func proxyClass() -> jclass? { return _proxyClass } -} + @JavaStaticField(isFinal: true) + public var HAP_CLIENT: Int32 -// MARK: - JNI + @JavaStaticField(isFinal: true) + public var HEADSET: Int32 -private extension AndroidBluetoothProfileConstants { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothProfile"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var A2DP: jfieldID? - static var EXTRA_PREVIOUS_STATE: jfieldID? - static var EXTRA_STATE: jfieldID? - static var GATT: jfieldID? - static var GATT_SERVER: jfieldID? - static var HEADSET: jfieldID? - static var HEALTH: jfieldID? - static var HID_DEVICE: jfieldID? - static var SAP: jfieldID? - static var STATE_CONNECTED: jfieldID? - static var STATE_CONNECTING: jfieldID? - static var STATE_DISCONNECTED: jfieldID? - static var STATE_DISCONNECTING: jfieldID? - } - } -} + @JavaStaticField(isFinal: true) + public var HEALTH: Int32 -private extension AndroidBluetoothProfileLocal { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.className(["SwiftBluetoothProfile"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method cache - fileprivate enum Method { - internal - enum getConnectedDevices: JNINativeMethodEntry { - - static let name = "__get_connected_devices" - - /// "(J)Ljava/util/List;" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long - ], returnType: .object(JNIClassName(rawValue: "java/util/List")!)) - - static let thunk: AndroidBluetoothProfile_GetConnectedDevices_type = AndroidBluetoothProfile_getConnectedDevices - } - - enum getConnectionState: JNINativeMethodEntry { - - static let name = "__get_connection_state" - - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .object(JNIClassName(rawValue: "android/bluetooth/BluetoothDevice")!) - ], returnType: .object(JNIClassName(rawValue: "java/util/List")!)) - - static let thunk: AndroidBluetoothProfile_GetConnectionState_type = AndroidBluetoothProfile_getConnectionState - } - - enum getDevicesMatchingConnectionStates: JNINativeMethodEntry { - - static let name = "__get_devices_matching_connection_states" - - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .array(.int) - ], returnType: .object(JNIClassName(rawValue: "java/util/List")!)) - - static let thunk: AndroidBluetoothProfile_GetDevicesMatchingConnectionStates_type = AndroidBluetoothProfile_getDevicesMatchingConnectionStates - } - } - } -} + @JavaStaticField(isFinal: true) + public var HEARING_AID: Int32 -// MARK: - Private Methods + @JavaStaticField(isFinal: true) + public var HID_DEVICE: Int32 -private typealias AndroidBluetoothProfile_GetConnectedDevices_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong) -> jobject? + @JavaStaticField(isFinal: true) + public var LE_AUDIO: Int32 -private func AndroidBluetoothProfile_getConnectedDevices( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong ) -> jobject? { - - let __return = AndroidBluetoothProfileLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .getConnectedDevices() - - var __locals = [jobject]() - - return __return?.localJavaObject(&__locals) -} + @JavaStaticField(isFinal: true) + public var SAP: Int32 -private typealias AndroidBluetoothProfile_GetConnectionState_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?) -> (jint) + @JavaStaticField(isFinal: true) + public var STATE_CONNECTED: Int32 -private func AndroidBluetoothProfile_getConnectionState( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ __device: jobject?) -> jint { - - let device = Android.Bluetooth.Device(javaObject: __device) - - let __return = AndroidBluetoothProfileLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .getConnectionState(device: device) - - return jint(__return) -} + @JavaStaticField(isFinal: true) + public var STATE_CONNECTING: Int32 -private typealias AndroidBluetoothProfile_GetDevicesMatchingConnectionStates_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jobject?) -> jobject? + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTED: Int32 -private func AndroidBluetoothProfile_getDevicesMatchingConnectionStates( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ __states: jobject?) -> jobject? { - - let states: [Int]? = JNIType.toSwift(type: [Int].self, from: __states) - - let __return = AndroidBluetoothProfileLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .getDevicesMatchingConnectionStates(states: states!) - - var __locals = [jobject]() - - return __return?.localJavaObject(&__locals) + @JavaStaticField(isFinal: true) + public var STATE_DISCONNECTING: Int32 } diff --git a/Sources/AndroidBluetooth/BluetoothProfileServiceListener.swift b/Sources/AndroidBluetooth/BluetoothProfileServiceListener.swift deleted file mode 100644 index 6efc230..0000000 --- a/Sources/AndroidBluetooth/BluetoothProfileServiceListener.swift +++ /dev/null @@ -1,154 +0,0 @@ -// -// BluetoothProfileServiceListener.swift -// Android -// -// Created by Marco Estrella on 6/7/18. -// - -import Foundation -import java_swift -import java_util -import JNI -import Android - -public extension Android.Bluetooth.Profile { - - typealias ServiceListener = AndroidBluetoothProfileServiceListener -} - -/** - * An interface for notifying BluetoothProfile IPC clients when they have been connected or disconnected to the service. - */ -public protocol AndroidBluetoothProfileServiceListener: JavaProtocol { - - /** - * Called to notify the client when the proxy object has been connected to the service. - */ - func onServiceConnected(profile: Int, proxy: JavaObject) - - /** - * Called to notify the client that this proxy object has been disconnected from the service. - */ - func onServiceDisconnected(profile: Int) -} - -// MARK: - Local - -public extension AndroidBluetoothProfileServiceListener { - - func localJavaObject( _ locals: UnsafeMutablePointer<[jobject]> ) -> jobject? { - - return AndroidBluetoothProfileServiceListenerLocal( owned: self, proto: self ).localJavaObject( locals ) - } -} - -internal class AndroidBluetoothProfileServiceListenerLocal: JNILocalProxy { - - fileprivate static let _proxyClass: jclass = { - - var natives: [JNINativeMethod] = [ - JNICache.Method.onServiceConnected.method, - JNICache.Method.onServiceDisconnected.method, - .finalize - ] - - let clazz = JNI.FindClass( proxyClassName() ) - - let nativesCount = jint(natives.count) - withUnsafePointer(to: &natives[0]) { nativesPtr in - if JNI.api.RegisterNatives( JNI.env, clazz, nativesPtr, nativesCount ) != jint(JNI_OK) { - JNI.report( "Unable to register java natives" ) - } - } - - defer { JNI.DeleteLocalRef( clazz ) } - - return JNI.api.NewGlobalRef( JNI.env, clazz )! - }() - - override open class func proxyClassName() -> String { return JNICache.className } - - override open class func proxyClass() -> jclass? { return _proxyClass } -} - -// MARK: - JNI - -private extension AndroidBluetoothProfileServiceListenerLocal { - - /// JNI Cache - struct JNICache { - - static let classSignature = SwiftSupport.Bluetooth.className(["SwiftBluetoothAdapter$LeScanCallback"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method cache - fileprivate enum Method { - internal - enum onServiceConnected: JNINativeMethodEntry { - - static let name = "__on_service_connected" - - /// "(JILandroid/bluetooth/le/ScanResult;)V" - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .int, - .object(JNIClassName(rawValue: "android/bluetooth/BluetoothProfile")!) - ], returnType: .void) - - static let thunk: AndroidBluetoothProfileServiceListener_OnServiceConnected_type = AndroidBluetoothProfileServiceListener_onServiceConnected - } - - enum onServiceDisconnected: JNINativeMethodEntry { - - static let name = "__on_service_disconnected" - - static let signature = JNIMethodSignature( - argumentTypes: [ - .long, - .int, - ], returnType: .void) - - static let thunk: AndroidBluetoothProfileServiceListener_OnServiceDisconnected_type = AndroidBluetoothProfileServiceListener_onServiceDisconnected - } - } - } -} - -// MARK: - Private Methods - -private typealias AndroidBluetoothProfileServiceListener_OnServiceConnected_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jint, _: jobject?) -> () - -private func AndroidBluetoothProfileServiceListener_onServiceConnected( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ profileParam: jint, - _ proxyParam: jobject? ) -> () { - - let profile = Int(profileParam) - - let proxy = JavaObject(javaObject: proxyParam) - - AndroidBluetoothProfileServiceListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onServiceConnected(profile: profile, proxy: proxy) -} - -private typealias AndroidBluetoothProfileServiceListener_OnServiceDisconnected_type = @convention(c) ( _: UnsafeMutablePointer, _: jobject?, _: jlong, _: jint) -> () - -private func AndroidBluetoothProfileServiceListener_onServiceDisconnected( _ __env: UnsafeMutablePointer, - _ __this: jobject?, - _ __swiftObject: jlong, - _ profileParam: jint) -> () { - - let profile = Int(profileParam) - - AndroidBluetoothProfileServiceListenerLocal - .swiftObject( jniEnv: __env, javaObject: __this, swiftObject: __swiftObject ) - .onServiceDisconnected(profile: profile) -} diff --git a/Sources/AndroidBluetooth/BluetoothServerSocket.swift b/Sources/AndroidBluetooth/BluetoothServerSocket.swift index a0c357e..809d3bd 100644 --- a/Sources/AndroidBluetooth/BluetoothServerSocket.swift +++ b/Sources/AndroidBluetooth/BluetoothServerSocket.swift @@ -1,159 +1,22 @@ -// -// BluetoothServerSocket.swift -// Android -// -// Created by Marco Estrella on 5/30/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import JavaIO +import JavaKit +import JavaRuntime -import Foundation -import java_swift -import Android +@JavaClass("android.bluetooth.BluetoothServerSocket", implements: Closeable.self) +open class BluetoothServerSocket: JavaObject { + @JavaMethod + open func getPsm() -> Int32 -public extension Android.Bluetooth { - - typealias ServerSocket = AndroidBluetoothServerSocket -} - -/** - * A listening Bluetooth socket. - * - * The interface for Bluetooth Sockets is similar to that of TCP sockets: Socket and ServerSocket. On the server side, - * use a BluetoothServerSocket to create a listening server socket. When a connection is accepted by the - * BluetoothServerSocket, it will return a new BluetoothSocket to manage the connection. On the client side, use a - * single BluetoothSocket to both initiate an outgoing connection and to manage the connection. - * - * The most common type of Bluetooth socket is RFCOMM, which is the type supported by the Android APIs. RFCOMM is a - * connection-oriented, streaming transport over Bluetooth. It is also known as the Serial Port Profile (SPP). - * - * To create a listening BluetoothServerSocket that's ready for incoming connections, use BluetoothAdapter.listenUsingRfcommWithServiceRecord(). - * Then call accept() to listen for incoming connection requests. This call will block until a connection is established, at which point, - * it will return a BluetoothSocket to manage the connection. Once the BluetoothSocket is acquired, it's a good idea to call close() - * on the BluetoothServerSocket when it's no longer needed for accepting connections. Closing the BluetoothServerSocket will not close the returned BluetoothSocket. - * - * BluetoothServerSocket is thread safe. In particular, close() will always immediately abort ongoing operations and close the server socket. - * - * Note: Requires the BLUETOOTH permission. - */ -public final class AndroidBluetoothServerSocket: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} + @JavaMethod + open override func toString() -> String -// MARK: Maethods - -public extension AndroidBluetoothServerSocket { - - /** - * Block until a connection is established. - * - * Returns a connected BluetoothSocket on successful connection. - * - * Once this call returns, it can be called again to accept subsequent incoming connections. - * - * close() can be used to abort this call from another thread. - */ - func accept() -> Android.Bluetooth.Socket { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "accept", - methodSig: "()Landroid/bluetooth/BluetoothSocket;", - methodCache: &JNICache.MethodID.accept, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Socket(javaObject: __return) - } - - /** - * Block until a connection is established, with timeout. - * - * Returns a connected BluetoothSocket on successful connection. - * - * Once this call returns, it can be called again to accept subsequent incoming connections. - * - * close() can be used to abort this call from another thread. - */ - func accept(timeout: Int) -> Android.Bluetooth.Socket { - - var __locals = [jobject]() - - var __args: [jvalue] = [ - jvalue(i: jint(timeout) ) - ] - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "accept", - methodSig: "(I)Landroid/bluetooth/BluetoothSocket;", - methodCache: &JNICache.MethodID.accept, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef(__return) } - - return Android.Bluetooth.Socket(javaObject: __return) - } - - /** - * Immediately close this socket, and release all associated resources. - * - * Causes blocked calls on this socket in other threads to immediately throw an IOException. - * - * Closing the BluetoothServerSocket will not close any BluetoothSocket received from accept(). - */ - func clone() { - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "clone", - methodSig: "()V", - methodCache: &JNICache.MethodID.close, - args: &__args, - locals: &__locals) - } -} + @JavaMethod + open func accept(_ arg0: Int32) throws -> BluetoothSocket! -// MARK: - JNICache + @JavaMethod + open func accept() throws -> BluetoothSocket! -internal extension AndroidBluetoothServerSocket { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothServerSocket"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Method ID cache - struct MethodID { - - static var accept: jmethodID? - static var accept2: jmethodID? - static var close: jmethodID? - } - } + @JavaMethod + open func close() throws } diff --git a/Sources/AndroidBluetooth/BluetoothSocket.swift b/Sources/AndroidBluetooth/BluetoothSocket.swift index c8a9759..d9bee80 100644 --- a/Sources/AndroidBluetooth/BluetoothSocket.swift +++ b/Sources/AndroidBluetooth/BluetoothSocket.swift @@ -1,324 +1,50 @@ -// -// BluetoothSocket.swift -// Android -// -// Created by Marco Estrella on 5/30/18. -// +// Auto-generated by Java-to-Swift wrapper generator. +import JavaIO +import JavaKit +import JavaRuntime -import Foundation -import java_swift -import Android +@JavaClass("android.bluetooth.BluetoothSocket", implements: Closeable.self) +open class BluetoothSocket: JavaObject { + @JavaMethod + open func getRemoteDevice() -> BluetoothDevice! -public extension Android.Bluetooth { - - typealias Socket = AndroidBluetoothSocket -} + @JavaMethod + open func connect() throws -/** - * A connected or connecting Bluetooth socket. - * - * The interface for Bluetooth Sockets is similar to that of TCP sockets: Socket and ServerSocket. - * On the server side, use a BluetoothServerSocket to create a listening server socket. - * When a connection is accepted by the BluetoothServerSocket, it will return a new BluetoothSocket - * to manage the connection. On the client side, use a single BluetoothSocket to both initiate an - * outgoing connection and to manage the connection. - * - * The most common type of Bluetooth socket is RFCOMM, which is the type supported by the Android APIs. - * RFCOMM is a connection-oriented, streaming transport over Bluetooth. It is also known as the Serial Port Profile (SPP). - * - * To create a BluetoothSocket for connecting to a known device, use BluetoothDevice.createRfcommSocketToServiceRecord(). - * Then call connect() to attempt a connection to the remote device. This call will block until a connection is established or the connection fails. - * - * To create a BluetoothSocket as a server (or "host"), see the BluetoothServerSocket documentation. - * - * Once the socket is connected, whether initiated as a client or accepted as a server, open the IO streams by calling getInputStream() - * and getOutputStream() in order to retrieve InputStream and OutputStream objects, respectively, which are automatically connected to the socket. - * - * BluetoothSocket is thread safe. In particular, close() will always immediately abort ongoing operations and close the socket. - * - * Note: Requires the BLUETOOTH permission. - */ -public final class AndroidBluetoothSocket: JavaObject { - - public convenience init?( casting object: java_swift.JavaObject, - _ file: StaticString = #file, - _ line: Int = #line ) { - - self.init(javaObject: nil) - - object.withJavaObject { - self.javaObject = $0 - } - } - - public required init( javaObject: jobject? ) { - super.init(javaObject: javaObject) - } -} + @JavaMethod + open func getOutputStream() throws -> OutputStream! -// MARK: Constants + @JavaMethod + open func isConnected() -> Bool -internal extension AndroidBluetoothSocket { - - /// L2CAP socket - static var TYPE_L2CAP: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TYPE_L2CAP", - fieldType: "I", - fieldCache: &JNICache.FieldID.TYPE_L2CAP, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// RFCOMM socket - static var TYPE_RFCOMM: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TYPE_RFCOMM", - fieldType: "I", - fieldCache: &JNICache.FieldID.TYPE_RFCOMM, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - - /// SCO socket - static var TYPE_SCO: Int { - - get { - - let __value = JNIField.GetStaticIntField( - fieldName: "TYPE_SCO", - fieldType: "I", - fieldCache: &JNICache.FieldID.TYPE_SCO, - className: JNICache.className, - classCache: &JNICache.jniClass ) - - return Int(__value) - } - } - -} + @JavaMethod + open func getConnectionType() -> Int32 + + @JavaMethod + open func getMaxTransmitPacketSize() -> Int32 + + @JavaMethod + open func getMaxReceivePacketSize() -> Int32 + + @JavaMethod + open override func finalize() throws + + @JavaMethod + open override func toString() -> String -// MARK: Methods + @JavaMethod + open func close() throws -public extension AndroidBluetoothSocket { - - /** - * Closes this stream and releases any system resources associated with it. - */ - func close() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "close", - methodSig: "()V", - methodCache: &JNICache.MethodID.close, - args: &__args, - locals: &__locals) - } - - /** - * Attempt to connect to a remote device. - */ - func connect() { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - JNIMethod.CallVoidMethod(object: javaObject, - methodName: "connect", - methodSig: "()V", - methodCache: &JNICache.MethodID.connect, - args: &__args, - locals: &__locals) - } - - /** - * Attempt to connect to a remote device. - */ - func getConnectionType() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getConnectionType", - methodSig: "()I", - methodCache: &JNICache.MethodID.getConnectionType, - args: &__args, - locals: &__locals) - - return Int(__return) - } - - /** - * Get the input stream associated with this socket. - */ - func getInputStream() -> JavaObject { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getInputStream", - methodSig: "()Ljava/io/InputStream;", - methodCache: &JNICache.MethodID.getInputStream, - args: &__args, - locals: &__locals) - - defer { JNI.DeleteLocalRef( __return ) } - - return JavaObject(javaObject: __return) - } - - /** - * Get the maximum supported Receive packet size for the underlying transport. - */ - func getMaxReceivePacketSize() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getMaxReceivePacketSize", - methodSig: "()I", - methodCache: &JNICache.MethodID.getMaxReceivePacketSize, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get the maximum supported Transmit packet size for the underlying transport. - */ - func getMaxTransmitPacketSize() -> Int { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallIntMethod(object: javaObject, - methodName: "getMaxTransmitPacketSize", - methodSig: "()I", - methodCache: &JNICache.MethodID.getMaxTransmitPacketSize, - args: &__args, - locals: &__locals) - return Int(__return) - } - - /** - * Get the output stream associated with this socket. - */ - func getOutputStream() -> JavaObject { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getOutputStream", - methodSig: "()Ljava/io/OutputStream;", - methodCache: &JNICache.MethodID.getOutputStream, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef( __return ) } - - return JavaObject(javaObject: __return) - } - - /** - * Get the remote device this socket is connecting, or connected, to. - */ - func getRemoteDevice() -> Android.Bluetooth.Device { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallObjectMethod(object: javaObject, - methodName: "getRemoteDevice", - methodSig: "()Landroid/bluetooth/BluetoothDevice;", - methodCache: &JNICache.MethodID.getRemoteDevice, - args: &__args, - locals: &__locals) - defer { JNI.DeleteLocalRef( __return ) } - - return Android.Bluetooth.Device(javaObject: __return) - } - - /** - * Get the connection status of this socket, ie, whether there is an active connection with remote device. - */ - func isConnected() -> Bool { - - var __locals = [jobject]() - - var __args = [jvalue](repeating: jvalue(), count: 1) - - let __return = JNIMethod.CallBooleanMethod(object: javaObject, - methodName: "isConnected", - methodSig: "()Z", - methodCache: &JNICache.MethodID.isConnected, - args: &__args, - locals: &__locals) - - return __return != jboolean(JNI_FALSE) - } + @JavaMethod + open func getInputStream() throws -> InputStream! } +extension JavaClass { + @JavaStaticField(isFinal: true) + public var TYPE_L2CAP: Int32 -// MARK: - JNICache + @JavaStaticField(isFinal: true) + public var TYPE_RFCOMM: Int32 -internal extension AndroidBluetoothSocket { - - /// JNI Cache - struct JNICache { - - static let classSignature = Android.Bluetooth.className(["BluetoothSocket"]) - - /// JNI Java class name - static let className = classSignature.rawValue - - /// JNI Java class - static var jniClass: jclass? - - /// JNI Field ID cache - struct FieldID { - - static var TYPE_L2CAP: jfieldID? - static var TYPE_RFCOMM: jfieldID? - static var TYPE_SCO: jfieldID? - } - - /// JNI Method ID cache - struct MethodID { - - static var close: jmethodID? - static var connect: jmethodID? - static var getConnectionType: jmethodID? - static var getInputStream: jmethodID? - static var getMaxReceivePacketSize: jmethodID? - static var getMaxTransmitPacketSize: jmethodID? - static var getOutputStream: jmethodID? - static var getRemoteDevice: jmethodID? - static var isConnected: jmethodID? - } - } + @JavaStaticField(isFinal: true) + public var TYPE_SCO: Int32 } diff --git a/Sources/AndroidBluetooth/BluetoothSocketException.swift b/Sources/AndroidBluetooth/BluetoothSocketException.swift new file mode 100644 index 0000000..79dd265 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothSocketException.swift @@ -0,0 +1,83 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaIO +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothSocketException") +open class BluetoothSocketException: IOException { + @JavaMethod + @_nonoverride public convenience init(_ arg0: Int32, environment: JNIEnvironment? = nil) + + @JavaMethod + @_nonoverride public convenience init(_ arg0: Int32, _ arg1: String, environment: JNIEnvironment? = nil) + + @JavaMethod + open func getErrorCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var BLUETOOTH_OFF_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_ACL_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_CLIENT_SECURITY_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_INSUFFICIENT_AUTHENTICATION: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_INSUFFICIENT_AUTHORIZATION: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_INSUFFICIENT_ENCRYPTION: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_INSUFFICIENT_ENCRYPT_KEY_SIZE: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_INVALID_PARAMETERS: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_INVALID_SOURCE_CID: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_NO_PSM_AVAILABLE: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_NO_RESOURCES: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_SOURCE_CID_ALREADY_ALLOCATED: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_TIMEOUT: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_UNACCEPTABLE_PARAMETERS: Int32 + + @JavaStaticField(isFinal: true) + public var L2CAP_UNKNOWN: Int32 + + @JavaStaticField(isFinal: true) + public var NULL_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var RPC_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var SOCKET_CLOSED: Int32 + + @JavaStaticField(isFinal: true) + public var SOCKET_CONNECTION_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var SOCKET_MANAGER_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var UNIX_FILE_SOCKET_CREATION_FAILURE: Int32 + + @JavaStaticField(isFinal: true) + public var UNSPECIFIED: Int32 +} diff --git a/Sources/AndroidBluetooth/BluetoothStatusCodes.swift b/Sources/AndroidBluetooth/BluetoothStatusCodes.swift new file mode 100644 index 0000000..b8cd7ce --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothStatusCodes.swift @@ -0,0 +1,45 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothStatusCodes") +open class BluetoothStatusCodes: JavaObject { + +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var ERROR_BLUETOOTH_NOT_ALLOWED: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_BLUETOOTH_NOT_ENABLED: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_DEVICE_NOT_BONDED: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_GATT_WRITE_NOT_ALLOWED: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_GATT_WRITE_REQUEST_BUSY: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_PROFILE_SERVICE_NOT_BOUND: Int32 + + @JavaStaticField(isFinal: true) + public var ERROR_UNKNOWN: Int32 + + @JavaStaticField(isFinal: true) + public var FEATURE_NOT_CONFIGURED: Int32 + + @JavaStaticField(isFinal: true) + public var FEATURE_NOT_SUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var FEATURE_SUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var SUCCESS: Int32 +} diff --git a/Sources/AndroidBluetooth/PeriodicAdvertisingParameters+Builder.swift b/Sources/AndroidBluetooth/PeriodicAdvertisingParameters+Builder.swift new file mode 100644 index 0000000..bbf05ac --- /dev/null +++ b/Sources/AndroidBluetooth/PeriodicAdvertisingParameters+Builder.swift @@ -0,0 +1,20 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension PeriodicAdvertisingParameters { + @JavaClass("android.bluetooth.le.PeriodicAdvertisingParameters$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setIncludeTxPower(_ arg0: Bool) -> PeriodicAdvertisingParameters.Builder! + + @JavaMethod + open func setInterval(_ arg0: Int32) -> PeriodicAdvertisingParameters.Builder! + + @JavaMethod + open func build() -> PeriodicAdvertisingParameters! + } +} diff --git a/Sources/AndroidBluetooth/PeriodicAdvertisingParameters.swift b/Sources/AndroidBluetooth/PeriodicAdvertisingParameters.swift new file mode 100644 index 0000000..04a316f --- /dev/null +++ b/Sources/AndroidBluetooth/PeriodicAdvertisingParameters.swift @@ -0,0 +1,29 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.PeriodicAdvertisingParameters", implements: Parcelable.self) +open class PeriodicAdvertisingParameters: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getInterval() -> Int32 + + @JavaMethod + open func getIncludeTxPower() -> Bool +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/ScanCallback.swift b/Sources/AndroidBluetooth/ScanCallback.swift new file mode 100644 index 0000000..f017fd1 --- /dev/null +++ b/Sources/AndroidBluetooth/ScanCallback.swift @@ -0,0 +1,38 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.le.ScanCallback") +open class ScanCallback: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func onScanResult(_ arg0: Int32, _ arg1: ScanResult?) + + @JavaMethod + open func onBatchScanResults(_ arg0: List?) + + @JavaMethod + open func onScanFailed(_ arg0: Int32) +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var SCAN_FAILED_ALREADY_STARTED: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_FAILED_APPLICATION_REGISTRATION_FAILED: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_FAILED_FEATURE_UNSUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_FAILED_INTERNAL_ERROR: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_FAILED_SCANNING_TOO_FREQUENTLY: Int32 +} diff --git a/Sources/AndroidBluetooth/ScanFilter+Builder.swift b/Sources/AndroidBluetooth/ScanFilter+Builder.swift new file mode 100644 index 0000000..19e39df --- /dev/null +++ b/Sources/AndroidBluetooth/ScanFilter+Builder.swift @@ -0,0 +1,51 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +extension ScanFilter { + @JavaClass("android.bluetooth.le.ScanFilter$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setDeviceName(_ arg0: String) -> ScanFilter.Builder! + + @JavaMethod + open func setDeviceAddress(_ arg0: String) -> ScanFilter.Builder! + + @JavaMethod + open func setServiceUuid(_ arg0: ParcelUuid?, _ arg1: ParcelUuid?) -> ScanFilter.Builder! + + @JavaMethod + open func setServiceUuid(_ arg0: ParcelUuid?) -> ScanFilter.Builder! + + @JavaMethod + open func setServiceData(_ arg0: ParcelUuid?, _ arg1: [Int8], _ arg2: [Int8]) -> ScanFilter.Builder! + + @JavaMethod + open func setServiceData(_ arg0: ParcelUuid?, _ arg1: [Int8]) -> ScanFilter.Builder! + + @JavaMethod + open func setServiceSolicitationUuid(_ arg0: ParcelUuid?, _ arg1: ParcelUuid?) -> ScanFilter.Builder! + + @JavaMethod + open func setServiceSolicitationUuid(_ arg0: ParcelUuid?) -> ScanFilter.Builder! + + @JavaMethod + open func setManufacturerData(_ arg0: Int32, _ arg1: [Int8]) -> ScanFilter.Builder! + + @JavaMethod + open func setManufacturerData(_ arg0: Int32, _ arg1: [Int8], _ arg2: [Int8]) -> ScanFilter.Builder! + + @JavaMethod + open func setAdvertisingDataTypeWithData(_ arg0: Int32, _ arg1: [Int8], _ arg2: [Int8]) -> ScanFilter.Builder! + + @JavaMethod + open func setAdvertisingDataType(_ arg0: Int32) -> ScanFilter.Builder! + + @JavaMethod + open func build() -> ScanFilter! + } +} diff --git a/Sources/AndroidBluetooth/ScanFilter.swift b/Sources/AndroidBluetooth/ScanFilter.swift new file mode 100644 index 0000000..62209d1 --- /dev/null +++ b/Sources/AndroidBluetooth/ScanFilter.swift @@ -0,0 +1,80 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.ScanFilter", implements: Parcelable.self) +open class ScanFilter: JavaObject { + @JavaMethod + open func getDeviceAddress() -> String + + @JavaMethod + open func getServiceDataMask() -> [Int8] + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getServiceData() -> [Int8] + + @JavaMethod + open func getDeviceName() -> String + + @JavaMethod + open func getServiceUuid() -> ParcelUuid! + + @JavaMethod + open func getServiceUuidMask() -> ParcelUuid! + + @JavaMethod + open func getServiceDataUuid() -> ParcelUuid! + + @JavaMethod + open func getManufacturerId() -> Int32 + + @JavaMethod + open func getAdvertisingData() -> [Int8] + + @JavaMethod + open func getServiceSolicitationUuid() -> ParcelUuid! + + @JavaMethod + open func getServiceSolicitationUuidMask() -> ParcelUuid! + + @JavaMethod + open func getManufacturerData() -> [Int8] + + @JavaMethod + open func getManufacturerDataMask() -> [Int8] + + @JavaMethod + open func getAdvertisingDataType() -> Int32 + + @JavaMethod + open func getAdvertisingDataMask() -> [Int8] + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func matches(_ arg0: ScanResult?) -> Bool +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/ScanRecord.swift b/Sources/AndroidBluetooth/ScanRecord.swift new file mode 100644 index 0000000..e7b49ec --- /dev/null +++ b/Sources/AndroidBluetooth/ScanRecord.swift @@ -0,0 +1,188 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import AndroidUtil +import JavaKit +import JavaKitCollection +import JavaRuntime +import JavaUtil + +@JavaClass("android.bluetooth.le.ScanRecord") +open class ScanRecord: JavaObject { + @JavaMethod + open func getTxPowerLevel() -> Int32 + + @JavaMethod + open func getAdvertiseFlags() -> Int32 + + @JavaMethod + open func getServiceUuids() -> List! + + @JavaMethod + open func getServiceData(_ arg0: ParcelUuid?) -> [Int8] + + @JavaMethod + open func getServiceData() -> Map! + + @JavaMethod + open func getDeviceName() -> String + + @JavaMethod + open func getServiceSolicitationUuids() -> List! + + @JavaMethod + open func getManufacturerSpecificData(_ arg0: Int32) -> [Int8] + + @JavaMethod + open func getManufacturerSpecificData() -> SparseArray! + + @JavaMethod + open func getAdvertisingDataMap() -> Map! + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open func getBytes() -> [Int8] +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var DATA_TYPE_3D_INFORMATION_DATA: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_ADVERTISING_INTERVAL: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_ADVERTISING_INTERVAL_LONG: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_APPEARANCE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_BIG_INFO: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_BROADCAST_CODE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_CHANNEL_MAP_UPDATE_INDICATION: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_CLASS_OF_DEVICE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_DEVICE_ID: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_FLAGS: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_INDOOR_POSITIONING: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LE_ROLE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LE_SECURE_CONNECTIONS_RANDOM_VALUE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LE_SUPPORTED_FEATURES: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LOCAL_NAME_COMPLETE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_LOCAL_NAME_SHORT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_MANUFACTURER_SPECIFIC_DATA: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_MESH_BEACON: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_MESH_MESSAGE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_NONE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_PB_ADV: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_PUBLIC_TARGET_ADDRESS: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_RANDOM_TARGET_ADDRESS: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_RESOLVABLE_SET_IDENTIFIER: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SECURITY_MANAGER_OUT_OF_BAND_FLAGS: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_DATA_128_BIT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_DATA_16_BIT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_DATA_32_BIT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_SOLICITATION_UUIDS_128_BIT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_SOLICITATION_UUIDS_16_BIT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_SOLICITATION_UUIDS_32_BIT: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_UUIDS_128_BIT_COMPLETE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_UUIDS_128_BIT_PARTIAL: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_UUIDS_16_BIT_COMPLETE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_UUIDS_16_BIT_PARTIAL: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_UUIDS_32_BIT_COMPLETE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SERVICE_UUIDS_32_BIT_PARTIAL: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SIMPLE_PAIRING_HASH_C: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SIMPLE_PAIRING_HASH_C_256: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SIMPLE_PAIRING_RANDOMIZER_R: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SIMPLE_PAIRING_RANDOMIZER_R_256: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_TRANSPORT_DISCOVERY_DATA: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_TX_POWER_LEVEL: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TYPE_URI: Int32 +} diff --git a/Sources/AndroidBluetooth/ScanResult.swift b/Sources/AndroidBluetooth/ScanResult.swift new file mode 100644 index 0000000..a854c2a --- /dev/null +++ b/Sources/AndroidBluetooth/ScanResult.swift @@ -0,0 +1,92 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.ScanResult", implements: Parcelable.self) +open class ScanResult: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: BluetoothDevice?, _ arg1: ScanRecord?, _ arg2: Int32, _ arg3: Int64, environment: JNIEnvironment? = nil) + + @JavaMethod + @_nonoverride public convenience init(_ arg0: BluetoothDevice?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32, _ arg4: Int32, _ arg5: Int32, _ arg6: Int32, _ arg7: Int32, _ arg8: ScanRecord?, _ arg9: Int64, environment: JNIEnvironment? = nil) + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getDevice() -> BluetoothDevice! + + @JavaMethod + open func isConnectable() -> Bool + + @JavaMethod + open func isLegacy() -> Bool + + @JavaMethod + open func getPrimaryPhy() -> Int32 + + @JavaMethod + open func getSecondaryPhy() -> Int32 + + @JavaMethod + open func getScanRecord() -> ScanRecord! + + @JavaMethod + open func getRssi() -> Int32 + + @JavaMethod + open func getTimestampNanos() -> Int64 + + @JavaMethod + open func getDataStatus() -> Int32 + + @JavaMethod + open func getAdvertisingSid() -> Int32 + + @JavaMethod + open func getTxPower() -> Int32 + + @JavaMethod + open func getPeriodicAdvertisingInterval() -> Int32 + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var DATA_COMPLETE: Int32 + + @JavaStaticField(isFinal: true) + public var DATA_TRUNCATED: Int32 + + @JavaStaticField(isFinal: true) + public var PERIODIC_INTERVAL_NOT_PRESENT: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_UNUSED: Int32 + + @JavaStaticField(isFinal: true) + public var SID_NOT_PRESENT: Int32 + + @JavaStaticField(isFinal: true) + public var TX_POWER_NOT_PRESENT: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/ScanSettings+Builder.swift b/Sources/AndroidBluetooth/ScanSettings+Builder.swift new file mode 100644 index 0000000..1b6c232 --- /dev/null +++ b/Sources/AndroidBluetooth/ScanSettings+Builder.swift @@ -0,0 +1,35 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +extension ScanSettings { + @JavaClass("android.bluetooth.le.ScanSettings$Builder") + open class Builder: JavaObject { + @JavaMethod + @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + + @JavaMethod + open func setScanMode(_ arg0: Int32) -> ScanSettings.Builder! + + @JavaMethod + open func setCallbackType(_ arg0: Int32) -> ScanSettings.Builder! + + @JavaMethod + open func setReportDelay(_ arg0: Int64) -> ScanSettings.Builder! + + @JavaMethod + open func setNumOfMatches(_ arg0: Int32) -> ScanSettings.Builder! + + @JavaMethod + open func setMatchMode(_ arg0: Int32) -> ScanSettings.Builder! + + @JavaMethod + open func setLegacy(_ arg0: Bool) -> ScanSettings.Builder! + + @JavaMethod + open func setPhy(_ arg0: Int32) -> ScanSettings.Builder! + + @JavaMethod + open func build() -> ScanSettings! + } +} diff --git a/Sources/AndroidBluetooth/ScanSettings.swift b/Sources/AndroidBluetooth/ScanSettings.swift new file mode 100644 index 0000000..0d08995 --- /dev/null +++ b/Sources/AndroidBluetooth/ScanSettings.swift @@ -0,0 +1,86 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.ScanSettings", implements: Parcelable.self) +open class ScanSettings: JavaObject { + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getScanMode() -> Int32 + + @JavaMethod + open func getCallbackType() -> Int32 + + @JavaMethod + open func getScanResultType() -> Int32 + + @JavaMethod + open func getLegacy() -> Bool + + @JavaMethod + open func getPhy() -> Int32 + + @JavaMethod + open func getReportDelayMillis() -> Int64 +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var AUTO_BATCH_MIN_REPORT_DELAY_MILLIS: Int64 + + @JavaStaticField(isFinal: true) + public var CALLBACK_TYPE_ALL_MATCHES: Int32 + + @JavaStaticField(isFinal: true) + public var CALLBACK_TYPE_ALL_MATCHES_AUTO_BATCH: Int32 + + @JavaStaticField(isFinal: true) + public var CALLBACK_TYPE_FIRST_MATCH: Int32 + + @JavaStaticField(isFinal: true) + public var CALLBACK_TYPE_MATCH_LOST: Int32 + + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var MATCH_MODE_AGGRESSIVE: Int32 + + @JavaStaticField(isFinal: true) + public var MATCH_MODE_STICKY: Int32 + + @JavaStaticField(isFinal: true) + public var MATCH_NUM_FEW_ADVERTISEMENT: Int32 + + @JavaStaticField(isFinal: true) + public var MATCH_NUM_MAX_ADVERTISEMENT: Int32 + + @JavaStaticField(isFinal: true) + public var MATCH_NUM_ONE_ADVERTISEMENT: Int32 + + @JavaStaticField(isFinal: true) + public var PHY_LE_ALL_SUPPORTED: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_BALANCED: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_LOW_LATENCY: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_LOW_POWER: Int32 + + @JavaStaticField(isFinal: true) + public var SCAN_MODE_OPPORTUNISTIC: Int32 + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/TransportBlock.swift b/Sources/AndroidBluetooth/TransportBlock.swift new file mode 100644 index 0000000..c901907 --- /dev/null +++ b/Sources/AndroidBluetooth/TransportBlock.swift @@ -0,0 +1,50 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.le.TransportBlock", implements: Parcelable.self) +open class TransportBlock: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: Int32, _ arg1: Int32, _ arg2: Int32, _ arg3: [Int8], environment: JNIEnvironment? = nil) + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func totalBytes() -> Int32 + + @JavaMethod + open func getOrgId() -> Int32 + + @JavaMethod + open func getTdsFlags() -> Int32 + + @JavaMethod + open func getTransportData() -> [Int8] + + @JavaMethod + open func getTransportDataLength() -> Int32 + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func toByteArray() -> [Int8] +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} diff --git a/Sources/AndroidBluetooth/TransportDiscoveryData.swift b/Sources/AndroidBluetooth/TransportDiscoveryData.swift new file mode 100644 index 0000000..c946524 --- /dev/null +++ b/Sources/AndroidBluetooth/TransportDiscoveryData.swift @@ -0,0 +1,51 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import AndroidOS +import JavaKit +import JavaKitCollection +import JavaRuntime + +@JavaClass("android.bluetooth.le.TransportDiscoveryData", implements: Parcelable.self) +open class TransportDiscoveryData: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: Int32, _ arg1: List?, environment: JNIEnvironment? = nil) + + @JavaMethod + @_nonoverride public convenience init(_ arg0: [Int8], environment: JNIEnvironment? = nil) + + @JavaMethod + open func describeContents() -> Int32 + + @JavaMethod + open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + + @JavaMethod + open func getTransportBlocks() -> List! + + @JavaMethod + open func totalBytes() -> Int32 + + @JavaMethod + open func getTransportDataType() -> Int32 + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func toByteArray() -> [Int8] +} +extension JavaClass { + @JavaStaticField(isFinal: true) + public var CREATOR: Parcelable.Creator! + + @JavaStaticField(isFinal: true) + public var CONTENTS_FILE_DESCRIPTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PARCELABLE_WRITE_RETURN_VALUE: Int32 +} From b79b69ed4c3639680c2a4710ef6b25c0d88312ff Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 20:22:13 -0400 Subject: [PATCH 02/39] Update for Swift 6.1 --- Package.swift | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/Package.swift b/Package.swift index 596dd32..651c4c4 100644 --- a/Package.swift +++ b/Package.swift @@ -1,13 +1,23 @@ -// swift-tools-version:5.7 +// swift-tools-version:6.1 import PackageDescription +import CompilerPluginSupport + +import class Foundation.FileManager +import class Foundation.ProcessInfo + +// Get NDK version from command line +let environment = ProcessInfo.processInfo.environment +let ndkVersion = environment["ANDROID_NDK_VERSION"].flatMap { UInt($0) } ?? 27 +let ndkVersionDefine = SwiftSetting.define("ANDROID_NDK_VERSION_" + ndkVersion.description) + +// Get Android API version +let sdkVersion = environment["ANDROID_SDK_VERSION"].flatMap { UInt($0) } ?? 29 +let sdkVersionDefine = SwiftSetting.define("ANDROID_SDK_VERSION_" + ndkVersion.description) let package = Package( name: "AndroidBluetooth", platforms: [ - .macOS(.v10_15), - .iOS(.v13), - .watchOS(.v6), - .tvOS(.v13), + .macOS(.v15) ], products: [ .library( @@ -25,24 +35,39 @@ let package = Package( ), .package( url: "https://github.com/PureSwift/Bluetooth.git", - .upToNextMajor(from: "6.0.0") + from: "7.2.0" ) ], targets: [ .target( name: "AndroidBluetooth", dependencies: [ - "Android", - "Bluetooth", - "GATT", + .product( + name: "Bluetooth", + package: "Bluetooth" + ), .product( name: "BluetoothGAP", package: "Bluetooth" + ), + .product( + name: "GATT", + package: "GATT" + ), + .product( + name: "AndroidKit", + package: "Android" ) - ]), - .testTarget( - name: "AndroidBluetoothTests", - dependencies: ["AndroidBluetooth"] + ], + exclude: ["swift-java.config"], + swiftSettings: [ + .swiftLanguageMode(.v5), + ndkVersionDefine, + sdkVersionDefine + ], + plugins: [ + //.plugin(name: "SwiftJavaPlugin", package: "swift-java") + ] ) ] ) From aa92b7d0327d0fb0919a8eeaa65ecb80dd7e6459 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 20:22:25 -0400 Subject: [PATCH 03/39] Remove deprecated code --- Sources/AndroidBluetooth/JNI.swift | 98 ------------------- .../AndroidBluetoothTests.swift | 8 -- 2 files changed, 106 deletions(-) delete mode 100644 Sources/AndroidBluetooth/JNI.swift delete mode 100644 Tests/AndroidBluetoothTests/AndroidBluetoothTests.swift diff --git a/Sources/AndroidBluetooth/JNI.swift b/Sources/AndroidBluetooth/JNI.swift deleted file mode 100644 index 7507350..0000000 --- a/Sources/AndroidBluetooth/JNI.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// JNI.swift -// Android -// -// Created by Alsey Coleman Miller on 3/22/18. -// - -import Foundation -import JNI -import java_swift - -// MARK: - JNINativeMethodEntry - -internal protocol JNINativeMethodEntry { - - associatedtype Thunk - - static var name: String { get } - - static var signature: JNIMethodSignature { get } - - static var thunk: Thunk { get } -} - -extension JNINativeMethodEntry { - - static var method: JNINativeMethod { - - return JNINativeMethod ( name: strdup(name), - signature: strdup(signature.rawValue), - fnPtr: unsafeBitCast( thunk, to: UnsafeMutableRawPointer.self ) ) - } -} - -extension JNINativeMethod { - - static var finalize: JNINativeMethod { - - return JNINativeMethod( - name: strdup("__finalize"), - signature: strdup("(J)V"), - fnPtr: unsafeBitCast( JNIReleasableProxy__finalize_thunk, to: UnsafeMutableRawPointer.self ) ) - } -} - -// MARK: - JNIListener - -internal protocol JNIListener: AnyObject, JavaProtocol { } - -internal extension JNIListener { - - static fileprivate func recoverPointer( _ swiftObject: jlong, _ file: StaticString = #file, _ line: Int = #line ) -> uintptr_t { - let swiftPointer = uintptr_t(swiftObject) - if swiftPointer == 0 { - JNI.report( "Race condition setting swiftObject on Java Proxy. More thought required...", file, line ) - } - return swiftPointer - } - - func swiftValue() -> jvalue { - return jvalue( j: jlong(unsafeBitCast(Unmanaged.passRetained(self), to: uintptr_t.self)) ) - } - - func takeOwnership( javaObject: jobject?, _ file: StaticString = #file, _ line: Int = #line ) { - - guard javaObject != nil else { return } - var locals = [jobject]() - var fieldID: jfieldID? - - let existing: jlong = JNIField.GetLongField( fieldName: "__swiftObject", fieldType: "J", fieldCache: &fieldID, - object: javaObject, file, line ) - - // get retained pointer - let swiftValue = self.swiftValue().j - - // store pointer in Java property - JNIField.SetLongField( fieldName: "__swiftObject", fieldType: "J", fieldCache: &fieldID, - object: javaObject, value: swiftValue, locals: &locals, file, line ) - - // release old instance (if any) - if existing != 0 { - JNIReleasableProxy.canrelease( swiftObject: existing ) - } - } - - static func swiftObject(from pointer: jlong) -> Self? { - return unsafeBitCast( recoverPointer( pointer ), to: Self.self ) - } -} - -internal extension JNIListener where Self: JavaObject { - - static func release(swiftObject: jlong) { - - let toRelease = unsafeBitCast( recoverPointer( swiftObject ), to: JavaObject.self ) - Unmanaged.passUnretained(toRelease).release() - } -} diff --git a/Tests/AndroidBluetoothTests/AndroidBluetoothTests.swift b/Tests/AndroidBluetoothTests/AndroidBluetoothTests.swift deleted file mode 100644 index 94aae50..0000000 --- a/Tests/AndroidBluetoothTests/AndroidBluetoothTests.swift +++ /dev/null @@ -1,8 +0,0 @@ -import XCTest -@testable import AndroidBluetooth - -final class AndroidBluetoothTests: XCTestCase { - func testExample() { - - } -} From 5f8bb8e6a99616216ef6407d0ff26ef60b78d752 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 20:22:44 -0400 Subject: [PATCH 04/39] Add Swift Java configuration --- Sources/AndroidBluetooth/swift-java.config | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Sources/AndroidBluetooth/swift-java.config diff --git a/Sources/AndroidBluetooth/swift-java.config b/Sources/AndroidBluetooth/swift-java.config new file mode 100644 index 0000000..90b9711 --- /dev/null +++ b/Sources/AndroidBluetooth/swift-java.config @@ -0,0 +1,69 @@ +{ + "classes" : { + "android.bluetooth.BluetoothA2dp": "BluetoothA2dp", + "android.bluetooth.BluetoothAdapter": "BluetoothAdapter", + "android.bluetooth.BluetoothAdapter$LeScanCallback": "BluetoothAdapter.LeScanCallback", + "android.bluetooth.BluetoothAssignedNumbers": "BluetoothAssignedNumbers", + "android.bluetooth.BluetoothClass": "BluetoothClass", + "android.bluetooth.BluetoothClass$Device": "BluetoothClass.Device", + "android.bluetooth.BluetoothClass$Device$Major": "BluetoothClass.Device.Major", + "android.bluetooth.BluetoothClass$Service": "BluetoothClass.Service", + "android.bluetooth.BluetoothCodecConfig": "BluetoothCodecConfig", + "android.bluetooth.BluetoothCodecConfig$Builder": "BluetoothCodecConfig.Builder", + "android.bluetooth.BluetoothCodecStatus": "BluetoothCodecStatus", + "android.bluetooth.BluetoothCodecStatus$Builder": "BluetoothCodecStatus.Builder", + "android.bluetooth.BluetoothCodecType": "BluetoothCodecType", + "android.bluetooth.BluetoothCsipSetCoordinator": "BluetoothCsipSetCoordinator", + "android.bluetooth.BluetoothDevice": "BluetoothDevice", + "android.bluetooth.BluetoothGatt": "BluetoothGatt", + "android.bluetooth.BluetoothGattCallback": "BluetoothGattCallback", + "android.bluetooth.BluetoothGattCharacteristic": "BluetoothGattCharacteristic", + "android.bluetooth.BluetoothGattDescriptor": "BluetoothGattDescriptor", + "android.bluetooth.BluetoothGattServer": "BluetoothGattServer", + "android.bluetooth.BluetoothGattServerCallback": "BluetoothGattServerCallback", + "android.bluetooth.BluetoothGattService": "BluetoothGattService", + "android.bluetooth.BluetoothHeadset": "BluetoothHeadset", + "android.bluetooth.BluetoothHealth": "BluetoothHealth", + "android.bluetooth.BluetoothHealthAppConfiguration": "BluetoothHealthAppConfiguration", + "android.bluetooth.BluetoothHealthCallback": "BluetoothHealthCallback", + "android.bluetooth.BluetoothHearingAid": "BluetoothHearingAid", + "android.bluetooth.BluetoothHidDevice": "BluetoothHidDevice", + "android.bluetooth.BluetoothHidDevice$Callback": "BluetoothHidDevice.Callback", + "android.bluetooth.BluetoothHidDeviceAppQosSettings": "BluetoothHidDeviceAppQosSettings", + "android.bluetooth.BluetoothHidDeviceAppSdpSettings": "BluetoothHidDeviceAppSdpSettings", + "android.bluetooth.BluetoothLeAudio": "BluetoothLeAudio", + "android.bluetooth.BluetoothLeAudioCodecConfig": "BluetoothLeAudioCodecConfig", + "android.bluetooth.BluetoothLeAudioCodecConfig$Builder": "BluetoothLeAudioCodecConfig.Builder", + "android.bluetooth.BluetoothLeAudioCodecStatus": "BluetoothLeAudioCodecStatus", + "android.bluetooth.BluetoothManager": "BluetoothManager", + "android.bluetooth.BluetoothProfile": "BluetoothProfile", + "android.bluetooth.BluetoothProfile$ServiceListener": "BluetoothProfile.ServiceListener", + "android.bluetooth.BluetoothServerSocket": "BluetoothServerSocket", + "android.bluetooth.BluetoothSocket": "BluetoothSocket", + "android.bluetooth.BluetoothSocketException": "BluetoothSocketException", + "android.bluetooth.BluetoothStatusCodes": "BluetoothStatusCodes", + "android.bluetooth.le.AdvertiseCallback": "AdvertiseCallback", + "android.bluetooth.le.AdvertiseData": "AdvertiseData", + "android.bluetooth.le.AdvertiseData$Builder": "AdvertiseData.Builder", + "android.bluetooth.le.AdvertiseSettings": "AdvertiseSettings", + "android.bluetooth.le.AdvertiseSettings$Builder": "AdvertiseSettings.Builder", + "android.bluetooth.le.AdvertisingSet": "AdvertisingSet", + "android.bluetooth.le.AdvertisingSetCallback": "AdvertisingSetCallback", + "android.bluetooth.le.AdvertisingSetParameters": "AdvertisingSetParameters", + "android.bluetooth.le.AdvertisingSetParameters$Builder": "AdvertisingSetParameters.Builder", + "android.bluetooth.le.BluetoothLeAdvertiser": "BluetoothLeAdvertiser", + "android.bluetooth.le.BluetoothLeScanner": "BluetoothLeScanner", + "android.bluetooth.le.PeriodicAdvertisingParameters": "PeriodicAdvertisingParameters", + "android.bluetooth.le.PeriodicAdvertisingParameters$Builder": "PeriodicAdvertisingParameters.Builder", + "android.bluetooth.le.ScanCallback": "ScanCallback", + "android.bluetooth.le.ScanFilter": "ScanFilter", + "android.bluetooth.le.ScanFilter$Builder": "ScanFilter.Builder", + "android.bluetooth.le.ScanRecord": "ScanRecord", + "android.bluetooth.le.ScanResult": "ScanResult", + "android.bluetooth.le.ScanSettings": "ScanSettings", + "android.bluetooth.le.ScanSettings$Builder": "ScanSettings.Builder", + "android.bluetooth.le.TransportBlock": "TransportBlock", + "android.bluetooth.le.TransportDiscoveryData": "TransportDiscoveryData" + }, + "classpath" : "android.jar" +} From 4b6d1a597bf61454a20ad3cb22ff19cc0f343bcc Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 20:23:36 -0400 Subject: [PATCH 05/39] Add generated sources --- .../BluetoothAssignedNumbers.swift | 693 ++++++++++++++++++ 1 file changed, 693 insertions(+) create mode 100644 Sources/AndroidBluetooth/BluetoothAssignedNumbers.swift diff --git a/Sources/AndroidBluetooth/BluetoothAssignedNumbers.swift b/Sources/AndroidBluetooth/BluetoothAssignedNumbers.swift new file mode 100644 index 0000000..f7c7e53 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothAssignedNumbers.swift @@ -0,0 +1,693 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("android.bluetooth.BluetoothAssignedNumbers") +open class BluetoothAssignedNumbers: JavaObject { + +} + +#if DEBUG +extension JavaClass { + @JavaStaticField(isFinal: true) + public var AAMP_OF_AMERICA: Int32 + + @JavaStaticField(isFinal: true) + public var ACCEL_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var ACE_SENSOR: Int32 + + @JavaStaticField(isFinal: true) + public var ADIDAS: Int32 + + @JavaStaticField(isFinal: true) + public var ADVANCED_PANMOBIL_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var AIROHA_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var ALCATEL: Int32 + + @JavaStaticField(isFinal: true) + public var ALPWISE: Int32 + + @JavaStaticField(isFinal: true) + public var AMICCOM_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var APLIX: Int32 + + @JavaStaticField(isFinal: true) + public var APPLE: Int32 + + @JavaStaticField(isFinal: true) + public var APT_LICENSING: Int32 + + @JavaStaticField(isFinal: true) + public var ARCHOS: Int32 + + @JavaStaticField(isFinal: true) + public var ARP_DEVICES: Int32 + + @JavaStaticField(isFinal: true) + public var ATHEROS_COMMUNICATIONS: Int32 + + @JavaStaticField(isFinal: true) + public var ATMEL: Int32 + + @JavaStaticField(isFinal: true) + public var AUSTCO_COMMUNICATION_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var AUTONET_MOBILE: Int32 + + @JavaStaticField(isFinal: true) + public var AVAGO: Int32 + + @JavaStaticField(isFinal: true) + public var AVM_BERLIN: Int32 + + @JavaStaticField(isFinal: true) + public var A_AND_D_ENGINEERING: Int32 + + @JavaStaticField(isFinal: true) + public var A_AND_R_CAMBRIDGE: Int32 + + @JavaStaticField(isFinal: true) + public var BANDSPEED: Int32 + + @JavaStaticField(isFinal: true) + public var BAND_XI_INTERNATIONAL: Int32 + + @JavaStaticField(isFinal: true) + public var BDE_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var BEATS_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var BEAUTIFUL_ENTERPRISE: Int32 + + @JavaStaticField(isFinal: true) + public var BEKEY: Int32 + + @JavaStaticField(isFinal: true) + public var BELKIN_INTERNATIONAL: Int32 + + @JavaStaticField(isFinal: true) + public var BINAURIC: Int32 + + @JavaStaticField(isFinal: true) + public var BIOSENTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var BLUEGIGA: Int32 + + @JavaStaticField(isFinal: true) + public var BLUERADIOS: Int32 + + @JavaStaticField(isFinal: true) + public var BLUETOOTH_SIG: Int32 + + @JavaStaticField(isFinal: true) + public var BLUETREK_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var BOSE: Int32 + + @JavaStaticField(isFinal: true) + public var BRIARTEK: Int32 + + @JavaStaticField(isFinal: true) + public var BROADCOM: Int32 + + @JavaStaticField(isFinal: true) + public var CAEN_RFID: Int32 + + @JavaStaticField(isFinal: true) + public var CAMBRIDGE_SILICON_RADIO: Int32 + + @JavaStaticField(isFinal: true) + public var CATC: Int32 + + @JavaStaticField(isFinal: true) + public var CINETIX: Int32 + + @JavaStaticField(isFinal: true) + public var CLARINOX_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var COLORFY: Int32 + + @JavaStaticField(isFinal: true) + public var COMMIL: Int32 + + @JavaStaticField(isFinal: true) + public var CONEXANT_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var CONNECTBLUE: Int32 + + @JavaStaticField(isFinal: true) + public var CONTINENTAL_AUTOMOTIVE: Int32 + + @JavaStaticField(isFinal: true) + public var CONWISE_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var CREATIVE_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var C_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var DANLERS: Int32 + + @JavaStaticField(isFinal: true) + public var DELORME_PUBLISHING_COMPANY: Int32 + + @JavaStaticField(isFinal: true) + public var DEXCOM: Int32 + + @JavaStaticField(isFinal: true) + public var DIALOG_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var DIGIANSWER: Int32 + + @JavaStaticField(isFinal: true) + public var ECLIPSE: Int32 + + @JavaStaticField(isFinal: true) + public var ECOTEST: Int32 + + @JavaStaticField(isFinal: true) + public var ELGATO_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var EM_MICROELECTRONIC_MARIN: Int32 + + @JavaStaticField(isFinal: true) + public var EQUINOX_AG: Int32 + + @JavaStaticField(isFinal: true) + public var ERICSSON_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var EVLUMA: Int32 + + @JavaStaticField(isFinal: true) + public var FREE2MOVE: Int32 + + @JavaStaticField(isFinal: true) + public var FUNAI_ELECTRIC: Int32 + + @JavaStaticField(isFinal: true) + public var GARMIN_INTERNATIONAL: Int32 + + @JavaStaticField(isFinal: true) + public var GCT_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var GELO: Int32 + + @JavaStaticField(isFinal: true) + public var GENEQ: Int32 + + @JavaStaticField(isFinal: true) + public var GENERAL_MOTORS: Int32 + + @JavaStaticField(isFinal: true) + public var GENNUM: Int32 + + @JavaStaticField(isFinal: true) + public var GEOFORCE: Int32 + + @JavaStaticField(isFinal: true) + public var GIBSON_GUITARS: Int32 + + @JavaStaticField(isFinal: true) + public var GN_NETCOM: Int32 + + @JavaStaticField(isFinal: true) + public var GN_RESOUND: Int32 + + @JavaStaticField(isFinal: true) + public var GOOGLE: Int32 + + @JavaStaticField(isFinal: true) + public var GREEN_THROTTLE_GAMES: Int32 + + @JavaStaticField(isFinal: true) + public var GROUP_SENSE: Int32 + + @JavaStaticField(isFinal: true) + public var HANLYNN_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var HARMAN_INTERNATIONAL: Int32 + + @JavaStaticField(isFinal: true) + public var HEWLETT_PACKARD: Int32 + + @JavaStaticField(isFinal: true) + public var HITACHI: Int32 + + @JavaStaticField(isFinal: true) + public var HOSIDEN: Int32 + + @JavaStaticField(isFinal: true) + public var IBM: Int32 + + @JavaStaticField(isFinal: true) + public var INFINEON_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var INGENIEUR_SYSTEMGRUPPE_ZAHN: Int32 + + @JavaStaticField(isFinal: true) + public var INTEGRATED_SILICON_SOLUTION: Int32 + + @JavaStaticField(isFinal: true) + public var INTEGRATED_SYSTEM_SOLUTION: Int32 + + @JavaStaticField(isFinal: true) + public var INTEL: Int32 + + @JavaStaticField(isFinal: true) + public var INVENTEL: Int32 + + @JavaStaticField(isFinal: true) + public var IPEXTREME: Int32 + + @JavaStaticField(isFinal: true) + public var I_TECH_DYNAMIC_GLOBAL_DISTRIBUTION: Int32 + + @JavaStaticField(isFinal: true) + public var JAWBONE: Int32 + + @JavaStaticField(isFinal: true) + public var JIANGSU_TOPPOWER_AUTOMOTIVE_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var JOHNSON_CONTROLS: Int32 + + @JavaStaticField(isFinal: true) + public var J_AND_M: Int32 + + @JavaStaticField(isFinal: true) + public var KAWANTECH: Int32 + + @JavaStaticField(isFinal: true) + public var KC_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var KENSINGTON_COMPUTER_PRODUCTS_GROUP: Int32 + + @JavaStaticField(isFinal: true) + public var LAIRD_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var LESSWIRE: Int32 + + @JavaStaticField(isFinal: true) + public var LG_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var LINAK: Int32 + + @JavaStaticField(isFinal: true) + public var LUCENT: Int32 + + @JavaStaticField(isFinal: true) + public var LUDUS_HELSINKI: Int32 + + @JavaStaticField(isFinal: true) + public var MACRONIX: Int32 + + @JavaStaticField(isFinal: true) + public var MAGNETI_MARELLI: Int32 + + @JavaStaticField(isFinal: true) + public var MANSELLA: Int32 + + @JavaStaticField(isFinal: true) + public var MARVELL: Int32 + + @JavaStaticField(isFinal: true) + public var MATSUSHITA_ELECTRIC: Int32 + + @JavaStaticField(isFinal: true) + public var MC10: Int32 + + @JavaStaticField(isFinal: true) + public var MEDIATEK: Int32 + + @JavaStaticField(isFinal: true) + public var MESO_INTERNATIONAL: Int32 + + @JavaStaticField(isFinal: true) + public var META_WATCH: Int32 + + @JavaStaticField(isFinal: true) + public var MEWTEL_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var MICOMMAND: Int32 + + @JavaStaticField(isFinal: true) + public var MICROCHIP_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var MICROSOFT: Int32 + + @JavaStaticField(isFinal: true) + public var MINDTREE: Int32 + + @JavaStaticField(isFinal: true) + public var MISFIT_WEARABLES: Int32 + + @JavaStaticField(isFinal: true) + public var MITEL_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var MITSUBISHI_ELECTRIC: Int32 + + @JavaStaticField(isFinal: true) + public var MOBILIAN_CORPORATION: Int32 + + @JavaStaticField(isFinal: true) + public var MONSTER: Int32 + + @JavaStaticField(isFinal: true) + public var MOTOROLA: Int32 + + @JavaStaticField(isFinal: true) + public var MSTAR_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var MUZIK: Int32 + + @JavaStaticField(isFinal: true) + public var NEC: Int32 + + @JavaStaticField(isFinal: true) + public var NEC_LIGHTING: Int32 + + @JavaStaticField(isFinal: true) + public var NEWLOGIC: Int32 + + @JavaStaticField(isFinal: true) + public var NIKE: Int32 + + @JavaStaticField(isFinal: true) + public var NINE_SOLUTIONS: Int32 + + @JavaStaticField(isFinal: true) + public var NOKIA_MOBILE_PHONES: Int32 + + @JavaStaticField(isFinal: true) + public var NORDIC_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var NORWOOD_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var ODM_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var OMEGAWAVE: Int32 + + @JavaStaticField(isFinal: true) + public var ONSET_COMPUTER: Int32 + + @JavaStaticField(isFinal: true) + public var OPEN_INTERFACE: Int32 + + @JavaStaticField(isFinal: true) + public var OTL_DYNAMICS: Int32 + + @JavaStaticField(isFinal: true) + public var PANDA_OCEAN: Int32 + + @JavaStaticField(isFinal: true) + public var PARROT: Int32 + + @JavaStaticField(isFinal: true) + public var PARTHUS_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var PASSIF_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var PETER_SYSTEMTECHNIK: Int32 + + @JavaStaticField(isFinal: true) + public var PHILIPS_SEMICONDUCTORS: Int32 + + @JavaStaticField(isFinal: true) + public var PLANTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var POLAR_ELECTRO: Int32 + + @JavaStaticField(isFinal: true) + public var POLAR_ELECTRO_EUROPE: Int32 + + @JavaStaticField(isFinal: true) + public var PROCTER_AND_GAMBLE: Int32 + + @JavaStaticField(isFinal: true) + public var QUALCOMM: Int32 + + @JavaStaticField(isFinal: true) + public var QUALCOMM_CONNECTED_EXPERIENCES: Int32 + + @JavaStaticField(isFinal: true) + public var QUALCOMM_INNOVATION_CENTER: Int32 + + @JavaStaticField(isFinal: true) + public var QUALCOMM_LABS: Int32 + + @JavaStaticField(isFinal: true) + public var QUALCOMM_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var QUINTIC: Int32 + + @JavaStaticField(isFinal: true) + public var QUUPPA: Int32 + + @JavaStaticField(isFinal: true) + public var RALINK_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var RDA_MICROELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var REALTEK_SEMICONDUCTOR: Int32 + + @JavaStaticField(isFinal: true) + public var RED_M: Int32 + + @JavaStaticField(isFinal: true) + public var RENESAS_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var RESEARCH_IN_MOTION: Int32 + + @JavaStaticField(isFinal: true) + public var RF_MICRO_DEVICES: Int32 + + @JavaStaticField(isFinal: true) + public var RIVIERAWAVES: Int32 + + @JavaStaticField(isFinal: true) + public var ROHDE_AND_SCHWARZ: Int32 + + @JavaStaticField(isFinal: true) + public var RTX_TELECOM: Int32 + + @JavaStaticField(isFinal: true) + public var SAMSUNG_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var SARIS_CYCLING_GROUP: Int32 + + @JavaStaticField(isFinal: true) + public var SEERS_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var SEIKO_EPSON: Int32 + + @JavaStaticField(isFinal: true) + public var SELFLY: Int32 + + @JavaStaticField(isFinal: true) + public var SEMILINK: Int32 + + @JavaStaticField(isFinal: true) + public var SENNHEISER_COMMUNICATIONS: Int32 + + @JavaStaticField(isFinal: true) + public var SHANGHAI_SUPER_SMART_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var SHENZHEN_EXCELSECU_DATA_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var SIGNIA_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var SILICON_WAVE: Int32 + + @JavaStaticField(isFinal: true) + public var SIRF_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var SOCKET_MOBILE: Int32 + + @JavaStaticField(isFinal: true) + public var SONY_ERICSSON: Int32 + + @JavaStaticField(isFinal: true) + public var SOUND_ID: Int32 + + @JavaStaticField(isFinal: true) + public var SPORTS_TRACKING_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var SR_MEDIZINELEKTRONIK: Int32 + + @JavaStaticField(isFinal: true) + public var STACCATO_COMMUNICATIONS: Int32 + + @JavaStaticField(isFinal: true) + public var STALMART_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var STARKEY_LABORATORIES: Int32 + + @JavaStaticField(isFinal: true) + public var STOLLMAN_E_PLUS_V: Int32 + + @JavaStaticField(isFinal: true) + public var STONESTREET_ONE: Int32 + + @JavaStaticField(isFinal: true) + public var ST_MICROELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var SUMMIT_DATA_COMMUNICATIONS: Int32 + + @JavaStaticField(isFinal: true) + public var SUUNTO: Int32 + + @JavaStaticField(isFinal: true) + public var SWIRL_NETWORKS: Int32 + + @JavaStaticField(isFinal: true) + public var SYMBOL_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var SYNOPSYS: Int32 + + @JavaStaticField(isFinal: true) + public var SYSTEMS_AND_CHIPS: Int32 + + @JavaStaticField(isFinal: true) + public var S_POWER_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var TAIXINGBANG_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var TENOVIS: Int32 + + @JavaStaticField(isFinal: true) + public var TERAX: Int32 + + @JavaStaticField(isFinal: true) + public var TEXAS_INSTRUMENTS: Int32 + + @JavaStaticField(isFinal: true) + public var THINKOPTICS: Int32 + + @JavaStaticField(isFinal: true) + public var THREECOM: Int32 + + @JavaStaticField(isFinal: true) + public var THREE_DIJOY: Int32 + + @JavaStaticField(isFinal: true) + public var THREE_DSP: Int32 + + @JavaStaticField(isFinal: true) + public var TIMEKEEPING_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var TIMEX_GROUP_USA: Int32 + + @JavaStaticField(isFinal: true) + public var TOPCORN_POSITIONING_SYSTEMS: Int32 + + @JavaStaticField(isFinal: true) + public var TOSHIBA: Int32 + + @JavaStaticField(isFinal: true) + public var TRANSILICA: Int32 + + @JavaStaticField(isFinal: true) + public var TRELAB: Int32 + + @JavaStaticField(isFinal: true) + public var TTPCOM: Int32 + + @JavaStaticField(isFinal: true) + public var TXTR: Int32 + + @JavaStaticField(isFinal: true) + public var TZERO_TECHNOLOGIES: Int32 + + @JavaStaticField(isFinal: true) + public var UNIVERSAL_ELECTRONICS: Int32 + + @JavaStaticField(isFinal: true) + public var VERTU: Int32 + + @JavaStaticField(isFinal: true) + public var VISTEON: Int32 + + @JavaStaticField(isFinal: true) + public var VIZIO: Int32 + + @JavaStaticField(isFinal: true) + public var VOYETRA_TURTLE_BEACH: Int32 + + @JavaStaticField(isFinal: true) + public var WAVEPLUS_TECHNOLOGY: Int32 + + @JavaStaticField(isFinal: true) + public var WICENTRIC: Int32 + + @JavaStaticField(isFinal: true) + public var WIDCOMM: Int32 + + @JavaStaticField(isFinal: true) + public var WUXI_VIMICRO: Int32 + + @JavaStaticField(isFinal: true) + public var ZEEVO: Int32 + + @JavaStaticField(isFinal: true) + public var ZER01_TV: Int32 + + @JavaStaticField(isFinal: true) + public var ZOMM: Int32 + + @JavaStaticField(isFinal: true) + public var ZSCAN_SOFTWARE: Int32 +} +#endif From 5f693f8d8334d8007f6f4b9cb36f20db1a6e956e Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 21:30:29 -0400 Subject: [PATCH 06/39] Update `BluetoothStatusCodes` --- .../BluetoothStatusCodes.swift | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Sources/AndroidBluetooth/BluetoothStatusCodes.swift b/Sources/AndroidBluetooth/BluetoothStatusCodes.swift index b8cd7ce..bf6b211 100644 --- a/Sources/AndroidBluetooth/BluetoothStatusCodes.swift +++ b/Sources/AndroidBluetooth/BluetoothStatusCodes.swift @@ -3,9 +3,10 @@ import JavaKit import JavaRuntime @JavaClass("android.bluetooth.BluetoothStatusCodes") -open class BluetoothStatusCodes: JavaObject { +internal class BluetoothStatusCodes: JavaObject { } + extension JavaClass { @JavaStaticField(isFinal: true) public var ERROR_BLUETOOTH_NOT_ALLOWED: Int32 @@ -43,3 +44,37 @@ extension JavaClass { @JavaStaticField(isFinal: true) public var SUCCESS: Int32 } + +public struct BluetoothStatusCode: RawRepresentable, Equatable, Hashable, Sendable { + + public let rawValue: Int32 + + public init(rawValue: Int32) { + self.rawValue = rawValue + } + + private init(_ raw: Int32) { + self.init(rawValue: raw) + } +} + +internal extension BluetoothStatusCode { + + static let javaClass = try! JavaClass() +} + +public extension BluetoothStatusCode { + + static var success: Self { .init(javaClass.SUCCESS) } + static var bluetoothNotAllowed: Self { .init(javaClass.ERROR_BLUETOOTH_NOT_ALLOWED) } + static var bluetoothNotEnabled: Self { .init(javaClass.ERROR_BLUETOOTH_NOT_ENABLED) } + static var deviceNotBonded: Self { .init(javaClass.ERROR_DEVICE_NOT_BONDED) } + static var gattWriteNotAllowed: Self { .init(javaClass.ERROR_GATT_WRITE_NOT_ALLOWED) } + static var gattWriteRequestBusy: Self { .init(javaClass.ERROR_GATT_WRITE_REQUEST_BUSY) } + static var missingBluetoothConnectPermission: Self { .init(javaClass.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION) } + static var profileServiceNotBound: Self { .init(javaClass.ERROR_PROFILE_SERVICE_NOT_BOUND) } + static var unknown: Self { .init(javaClass.ERROR_UNKNOWN) } + static var featureNotConfigured: Self { .init(javaClass.FEATURE_NOT_CONFIGURED) } + static var featureNotSupported: Self { .init(javaClass.FEATURE_NOT_SUPPORTED) } + static var featureSupported: Self { .init(javaClass.FEATURE_SUPPORTED) } +} From 136ccf24aa94f62b9fc92a45ae15e5b04246940e Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 22:18:31 -0400 Subject: [PATCH 07/39] Add `BluetoothTransport` --- .../AndroidBluetooth/BluetoothDevice.swift | 76 +++++++++++++++++-- .../AndroidBluetooth/BluetoothTransport.swift | 19 +++++ 2 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 Sources/AndroidBluetooth/BluetoothTransport.swift diff --git a/Sources/AndroidBluetooth/BluetoothDevice.swift b/Sources/AndroidBluetooth/BluetoothDevice.swift index b48ca21..e526016 100644 --- a/Sources/AndroidBluetooth/BluetoothDevice.swift +++ b/Sources/AndroidBluetooth/BluetoothDevice.swift @@ -40,18 +40,80 @@ open class BluetoothDevice: JavaObject { @JavaMethod open func setPin(_ arg0: [Int8]) -> Bool + /** + Connect to GATT Server hosted by this device. Caller acts as GATT client. The callback is used to deliver results to Caller, such as connection status as well as any further GATT client operations. The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct GATT client operations. + For apps targeting Build.VERSION_CODES.S or or higher, this requires the Manifest.permission.BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int). + + Requires `Manifest.permission.BLUETOOTH_CONNECT` + */ @JavaMethod - open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?) -> BluetoothGatt! - + public func connectGatt( + context: AndroidContent.Context?, + autoConnect: Bool, + callback: BluetoothGattCallback? + ) -> BluetoothGatt! + + /** + Connect to GATT Server hosted by this device. Caller acts as GATT client. The callback is used to deliver results to Caller, such as connection status as well as any further GATT client operations. The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct GATT client operations. + For apps targeting `Build.VERSION_CODES.S` or or higher, this requires the `Manifest.permission.BLUETOOTH_CONNECT` permission which can be gained with Activity.requestPermissions(String[], int). + + Requires `Manifest.permission.BLUETOOTH_CONNECT` + */ @JavaMethod - open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?, _ arg3: Int32) -> BluetoothGatt! - + internal func connectGatt( + _ context: AndroidContent.Context?, + _ autoConnect: Bool, + _ callback: BluetoothGattCallback?, + _ transport: Int32 + ) -> BluetoothGatt! + + /// Connect to GATT Server hosted by this device. Caller acts as GATT client. The callback is used to deliver results to Caller, such as connection status as well as any further GATT client operations. + /// + /// - Parameter context: The running app's context. + /// + /// - Parameter autoConnect: Whether to directly connect to the remote device (false) or to automatically connect as soon as the remote device becomes available (true). + /// + /// - Parameter callback: GATT callback handler that will receive asynchronous callbacks. + /// + /// - Parameter transport: Preferred transport for GATT connections to remote dual-mode devices + /// + /// - Returns: The method returns a ``BluetoothGatt`` instance. + /// + /// - Note: Requires `Manifest.permission.BLUETOOTH_CONNECT` + public func connectGatt( + context: AndroidContent.Context, + autoConnect: Bool = false, + callback: BluetoothGattCallback, + transport: BluetoothTransport = .auto + ) -> BluetoothGatt! { + connectGatt(context, autoConnect, callback, transport.rawValue) + } + + /** + Connect to GATT Server hosted by this device. Caller acts as GATT client. The callback is used to deliver results to Caller, such as connection status as well as any further GATT client operations. The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct GATT client operations. + For apps targeting Build.VERSION_CODES.S or or higher, this requires the Manifest.permission.BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int). + + Requires Manifest.permission.BLUETOOTH_CONNECT + */ @JavaMethod - open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?, _ arg3: Int32, _ arg4: Int32) -> BluetoothGatt! + public func connectGatt( + _ context: AndroidContent.Context?, + _ autoConnect: Bool, + _ callback: BluetoothGattCallback?, + _ transport: BluetoothTransport, + _ phy: Int32 + ) -> BluetoothGatt! @JavaMethod - open func connectGatt(_ arg0: Context?, _ arg1: Bool, _ arg2: BluetoothGattCallback?, _ arg3: Int32, _ arg4: Int32, _ arg5: Handler?) -> BluetoothGatt! - + public func connectGatt( + _ context: AndroidContent.Context?, + _ autoConnect: Bool, + _ callback: BluetoothGattCallback?, + _ transport: Int, + _ phy: Int32, + _ handler: Handler? + ) -> BluetoothGatt! + @JavaMethod open func createL2capChannel(_ arg0: Int32) throws -> BluetoothSocket! diff --git a/Sources/AndroidBluetooth/BluetoothTransport.swift b/Sources/AndroidBluetooth/BluetoothTransport.swift new file mode 100644 index 0000000..c6c358c --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothTransport.swift @@ -0,0 +1,19 @@ +// +// BluetoothTransport.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/12/25. +// + +/// Preferred transport for GATT connections to remote dual-mode devices +public enum BluetoothTransport: Int32, Sendable, CaseIterable { + + /// No preference of physical transport for GATT connections to remote dual-mode devices + case auto = 0 + + /// Constant representing the BR/EDR transport. + case bredr = 1 + + /// Constant representing the Bluetooth Low Energy (BLE) Transport. + case le = 2 +} From db674fc133b6d68875f15ac525c11d0922b4fdfa Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 22:21:27 -0400 Subject: [PATCH 08/39] Disable legacy code --- Sources/AndroidBluetooth/AdvertiseData.swift | 7 ++- .../AndroidAdvertisement.swift | 7 ++- Sources/AndroidBluetooth/AndroidCentral.swift | 50 +++++++++++-------- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Sources/AndroidBluetooth/AdvertiseData.swift b/Sources/AndroidBluetooth/AdvertiseData.swift index 2f31d5f..80f8049 100644 --- a/Sources/AndroidBluetooth/AdvertiseData.swift +++ b/Sources/AndroidBluetooth/AdvertiseData.swift @@ -6,6 +6,11 @@ import JavaKitCollection import JavaRuntime import JavaUtil +/** + Advertise data packet container for Bluetooth LE advertising. This represents the data to be advertised as well as the scan response data for active scans. + + Use ``AdvertiseData.Builder`` to create an instance of ``AdvertiseData`` to be advertised. + */ @JavaClass("android.bluetooth.le.AdvertiseData", implements: Parcelable.self) open class AdvertiseData: JavaObject { @JavaMethod @@ -36,7 +41,7 @@ open class AdvertiseData: JavaObject { open func getIncludeDeviceName() -> Bool @JavaMethod - open override func equals(_ arg0: AdvertiseData?) -> Bool + open func equals(_ arg0: AdvertiseData?) -> Bool @JavaMethod open override func toString() -> String diff --git a/Sources/AndroidBluetooth/AndroidAdvertisement.swift b/Sources/AndroidBluetooth/AndroidAdvertisement.swift index 5262876..55545f8 100644 --- a/Sources/AndroidBluetooth/AndroidAdvertisement.swift +++ b/Sources/AndroidBluetooth/AndroidAdvertisement.swift @@ -5,7 +5,11 @@ // Created by Alsey Coleman Miller on 11/7/18. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) import Foundation +#endif import Bluetooth import BluetoothGAP import GATT @@ -19,7 +23,7 @@ public struct AndroidLowEnergyAdvertisementData: Equatable { self.data = data } } - +/* extension AndroidLowEnergyAdvertisementData: AdvertisementData { /// Decode GAP data types. @@ -157,3 +161,4 @@ extension AndroidLowEnergyAdvertisementData: AdvertisementData { return uuids } } +*/ diff --git a/Sources/AndroidBluetooth/AndroidCentral.swift b/Sources/AndroidBluetooth/AndroidCentral.swift index 2b0e7ff..4956ef3 100644 --- a/Sources/AndroidBluetooth/AndroidCentral.swift +++ b/Sources/AndroidBluetooth/AndroidCentral.swift @@ -8,10 +8,14 @@ import Foundation import GATT import Bluetooth -import Android -import java_swift -import java_util - +import JavaKit +import JavaLang +import JavaUtil +import AndroidOS +import AndroidContent +import AndroidLooper +/* +@AndroidMainActor public final class AndroidCentral: CentralManager { public typealias Advertisement = AndroidLowEnergyAdvertisementData @@ -20,11 +24,11 @@ public final class AndroidCentral: CentralManager { // MARK: - Properties - public var log: ((String) -> ())? + public nonisolated(unsafe) var log: (@Sendable (String) -> ())? - public let hostController: Android.Bluetooth.Adapter + public let hostController: BluetoothAdapter - public let context: Android.Content.Context + public let context: AndroidContent.Context public var peripherals: [GATT.Peripheral : Bool] { get async { @@ -38,9 +42,10 @@ public final class AndroidCentral: CentralManager { // MARK: - Intialization - public init(hostController: Android.Bluetooth.Adapter, - context: Android.Content.Context, - options: AndroidCentral.Options = Options()) { + public init( + hostController: BluetoothAdapter, + context: AndroidContent.Context, + options: AndroidCentral.Options = Options()) { self.hostController = hostController self.context = context @@ -58,8 +63,8 @@ public final class AndroidCentral: CentralManager { guard hostController.isEnabled() else { throw AndroidCentralError.bluetoothDisabled } - guard let scanner = hostController.lowEnergyScanner - else { throw AndroidCentralError.nullValue(\Android.Bluetooth.Adapter.lowEnergyScanner) } + guard let scanner = hostController.getBluetoothLeScanner() + else { throw AndroidCentralError.bluetoothDisabled } return .init(onTermination: { Task { @@ -73,7 +78,7 @@ public final class AndroidCentral: CentralManager { } let scanCallBack = ScanCallback() scanCallBack.central = self - scanner.startScan(callback: scanCallBack) + scanner.startScan(scanCallBack) } }) } @@ -87,7 +92,7 @@ public final class AndroidCentral: CentralManager { public func connect( to peripheral: Peripheral, autoConnect: Bool, - transport: Android.Bluetooth.Device.Transport + transport: BluetoothDevice ) async throws { log?("\(type(of: self)) \(#function)") @@ -95,7 +100,7 @@ public final class AndroidCentral: CentralManager { guard hostController.isEnabled() else { throw AndroidCentralError.bluetoothDisabled } - guard let scanDevice = await storage.state.scan.peripherals[peripheral] + guard let scanDevice = storage.state.scan.peripherals[peripheral] else { throw CentralError.unknownPeripheral } // wait for connection continuation @@ -107,10 +112,12 @@ public final class AndroidCentral: CentralManager { // store continuation let callback = GattCallback(central: self) - let gatt: AndroidBluetoothGatt + let gatt: BluetoothGatt // call the correct method for connecting - if Android.OS.Build.Version.Sdk.sdkInt.rawValue <= Android.OS.Build.VersionCodes.lollipopMr1 { + let sdkInt = try JavaClass().SDK_INT + let lollipopMr1 = try JavaClass().LOLLIPOP_MR1 + if sdkInt <= lollipopMr1 { gatt = scanDevice.scanResult.device.connectGatt( context: self.context, autoConnect: autoConnect, @@ -623,7 +630,7 @@ public extension AndroidCentral { internal extension AndroidCentral { - final class ScanCallback: Android.Bluetooth.LE.ScanCallback { + final class ScanCallback: AndroidBluetooth.ScanCallback { weak var central: AndroidCentral? @@ -1154,7 +1161,7 @@ internal extension AndroidCentral { struct Services { - fileprivate(set) var values: [AndroidCentral.AttributeID: Android.Bluetooth.GattService] = [:] + fileprivate(set) var values: [AndroidCentral.AttributeID: BluetoothGattService] = [:] } struct Characteristics { @@ -1165,7 +1172,7 @@ internal extension AndroidCentral { struct Descriptors { - fileprivate(set) var values: [AndroidCentral.AttributeID: Android.Bluetooth.GattDescriptor] = [:] + fileprivate(set) var values: [AndroidCentral.AttributeID: BluetoothGattDescriptor] = [:] } struct CharacteristicCache { @@ -1210,7 +1217,7 @@ fileprivate extension Peripheral { internal extension BluetoothUUID { - init(android javaUUID: java_util.UUID) { + init(android javaUUID: JavaUtil.UUID) { let uuid = UUID(uuidString: javaUUID.toString())! if let value = UInt16(bluetooth: uuid) { @@ -1243,3 +1250,4 @@ internal extension ScanData where Peripheral == AndroidCentral.Peripheral, Adver ) } } +*/ From 03f169841ca2db1159773a5583c4993cf6f1c167 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 22:21:38 -0400 Subject: [PATCH 09/39] Update `BluetoothDevice` --- Sources/AndroidBluetooth/BluetoothDevice.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/AndroidBluetooth/BluetoothDevice.swift b/Sources/AndroidBluetooth/BluetoothDevice.swift index e526016..588ff03 100644 --- a/Sources/AndroidBluetooth/BluetoothDevice.swift +++ b/Sources/AndroidBluetooth/BluetoothDevice.swift @@ -100,20 +100,20 @@ open class BluetoothDevice: JavaObject { _ context: AndroidContent.Context?, _ autoConnect: Bool, _ callback: BluetoothGattCallback?, - _ transport: BluetoothTransport, + _ transport: Int32, _ phy: Int32 ) -> BluetoothGatt! - +/* @JavaMethod public func connectGatt( _ context: AndroidContent.Context?, _ autoConnect: Bool, _ callback: BluetoothGattCallback?, - _ transport: Int, + _ transport: Int32, _ phy: Int32, _ handler: Handler? ) -> BluetoothGatt! - + */ @JavaMethod open func createL2capChannel(_ arg0: Int32) throws -> BluetoothSocket! From 25db770df7d9b3d45fec3b4d242b852487fc6b7b Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 22:23:33 -0400 Subject: [PATCH 10/39] Add GitHub CI --- .github/workflows/swift.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/swift.yml diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml new file mode 100644 index 0000000..83f4540 --- /dev/null +++ b/.github/workflows/swift.yml @@ -0,0 +1,21 @@ +name: Swift +on: [push] +jobs: + + android: + name: Android + strategy: + fail-fast: false + matrix: + swift: ['6.1'] + arch: ['aarch64', 'x86_64'] + sdk: ['24', '28', '29'] + runs-on: macos-15 + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + - name: "Build Swift Package for Android" + run: | + brew install skiptools/skip/skip || (brew update && brew install skiptools/skip/skip) + skip android sdk install --version ${{ matrix.swift }} + ANDROID_NDK_ROOT="" ANDROID_SDK_VERSION=${{ matrix.sdk }} skip android build --arch ${{ matrix.arch }} --android-api-level ${{ matrix.sdk }} \ No newline at end of file From 4a7ceb729f5d190c1902323b6699f8596cd27374 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 22:23:42 -0400 Subject: [PATCH 11/39] Add Funding --- .github/FUNDING.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..dc74f98 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +# These are supported funding model platforms +ko_fi: colemancda From 34dda661adccc5b0526797576cf1bc506f901fe6 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sat, 12 Jul 2025 22:23:49 -0400 Subject: [PATCH 12/39] Add PR template --- .github/pull_request_template.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..07929eb --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,15 @@ +**Issue** + +Fixes #1. + +**What does this PR Do?** + +Description of the changes in this pull request. + +**Where should the reviewer start?** + +`main.swift` + +**Sweet giphy showing how you feel about this PR** + +![Giphy](https://media.giphy.com/media/rkDXJA9GoWR2/giphy.gif) From 399e1a747014824afc2de703841f120cdcccf900 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 16:05:05 -0400 Subject: [PATCH 13/39] Update `AndroidLowEnergyAdvertisementData` --- .../AndroidAdvertisement.swift | 146 ++++++++---------- 1 file changed, 62 insertions(+), 84 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidAdvertisement.swift b/Sources/AndroidBluetooth/AndroidAdvertisement.swift index 55545f8..6e14914 100644 --- a/Sources/AndroidBluetooth/AndroidAdvertisement.swift +++ b/Sources/AndroidBluetooth/AndroidAdvertisement.swift @@ -23,58 +23,53 @@ public struct AndroidLowEnergyAdvertisementData: Equatable { self.data = data } } -/* + extension AndroidLowEnergyAdvertisementData: AdvertisementData { - /// Decode GAP data types. - private func decode() -> [GAPData] { - - var decoder = GAPDataDecoder() - decoder.ignoreUnknownType = true - return (try? decoder.decode(data)) ?? [] - } + #if canImport(FoundationEssentials) + public typealias Data = FoundationEssentials.Data + #elseif canImport(Foundation) + public typealias Data = Foundation.Data + #endif /// The local name of a peripheral. public var localName: String? { - let decoded = decode() - - guard let name = decoded.compactMap({ $0 as? GAPCompleteLocalName }).first?.name - ?? decoded.compactMap({ $0 as? GAPShortLocalName }).first?.name - else { return nil } - - return name + if let decoded = try? GAPDataDecoder.decode(GAPCompleteLocalName.self, from: data) { + return decoded.name + } else if let decoded = try? GAPDataDecoder.decode(GAPShortLocalName.self, from: data) { + return decoded.name + } else { + return nil + } } /// The Manufacturer data of a peripheral. - public var manufacturerData: ManufacturerSpecificData? { - - let decoded = decode() + public var manufacturerData: GAPManufacturerSpecificData? { - guard let value = decoded.compactMap({ $0 as? GAPManufacturerSpecificData }).first + guard let value = try? GAPDataDecoder.decode(GAPManufacturerSpecificData.self, from: data) else { return nil } - return value + return ManufacturerSpecificData( + companyIdentifier: value.companyIdentifier, + additionalData: value.additionalData + ) } /// Service-specific advertisement data. public var serviceData: [BluetoothUUID: Data]? { - let decoded = decode() + var serviceData = [BluetoothUUID: Data](minimumCapacity: 3) - guard decoded.isEmpty == false - else { return nil } - - var serviceData = [BluetoothUUID: Data](minimumCapacity: decoded.count) - - decoded.compactMap { $0 as? GAPServiceData16BitUUID } - .forEach { serviceData[.bit16($0.uuid)] = $0.serviceData } - - decoded.compactMap { $0 as? GAPServiceData32BitUUID } - .forEach { serviceData[.bit32($0.uuid)] = $0.serviceData } - - decoded.compactMap { $0 as? GAPServiceData128BitUUID } - .forEach { serviceData[.bit128(UInt128(uuid: $0.uuid))] = $0.serviceData } + if let value = try? GAPDataDecoder.decode(GAPServiceData16BitUUID.self, from: data) { + serviceData[.bit16(value.uuid)] = value.serviceData + } + if let value = try? GAPDataDecoder.decode(GAPServiceData32BitUUID.self, from: data) { + serviceData[.bit32(value.uuid)] = value.serviceData + } + if let value = try? GAPDataDecoder.decode(GAPServiceData128BitUUID.self, from: data) { + serviceData[.bit128(UInt128(uuid: value.uuid))] = value.serviceData + } guard serviceData.isEmpty == false else { return nil } @@ -85,37 +80,27 @@ extension AndroidLowEnergyAdvertisementData: AdvertisementData { /// An array of service UUIDs public var serviceUUIDs: [BluetoothUUID]? { - let decoded = decode() - - guard decoded.isEmpty == false - else { return nil } - var uuids = [BluetoothUUID]() - uuids.reserveCapacity(decoded.count) - - uuids += decoded - .compactMap { $0 as? GAPCompleteListOf16BitServiceClassUUIDs } - .reduce([BluetoothUUID](), { $0 + $1.uuids.map { BluetoothUUID.bit16($0) } }) - - uuids += decoded - .compactMap { $0 as? GAPIncompleteListOf16BitServiceClassUUIDs } - .reduce([BluetoothUUID](), { $0 + $1.uuids.map { BluetoothUUID.bit16($0) } }) - - uuids += decoded - .compactMap { $0 as? GAPCompleteListOf32BitServiceClassUUIDs } - .reduce([BluetoothUUID](), { $0 + $1.uuids.map { BluetoothUUID.bit32($0) } }) - - uuids += decoded - .compactMap { $0 as? GAPIncompleteListOf32BitServiceClassUUIDs } - .reduce([BluetoothUUID](), { $0 + $1.uuids.map { BluetoothUUID.bit32($0) } }) - - uuids += decoded - .compactMap { $0 as? GAPCompleteListOf128BitServiceClassUUIDs } - .reduce([BluetoothUUID](), { $0 + $1.uuids.map { BluetoothUUID(uuid: $0) } }) - - uuids += decoded - .compactMap { $0 as? GAPIncompleteListOf128BitServiceClassUUIDs } - .reduce([BluetoothUUID](), { $0 + $1.uuids.map { BluetoothUUID(uuid: $0) } }) + uuids.reserveCapacity(2) + + if let value = try? GAPDataDecoder.decode(GAPCompleteListOf16BitServiceClassUUIDs.self, from: data) { + uuids += value.uuids.map { .bit16($0) } + } + if let value = try? GAPDataDecoder.decode(GAPIncompleteListOf16BitServiceClassUUIDs.self, from: data) { + uuids += value.uuids.map { .bit16($0) } + } + if let value = try? GAPDataDecoder.decode(GAPIncompleteListOf32BitServiceClassUUIDs.self, from: data) { + uuids += value.uuids.map { .bit32($0) } + } + if let value = try? GAPDataDecoder.decode(GAPIncompleteListOf32BitServiceClassUUIDs.self, from: data) { + uuids += value.uuids.map { .bit32($0) } + } + if let value = try? GAPDataDecoder.decode(GAPCompleteListOf128BitServiceClassUUIDs.self, from: data) { + uuids += value.uuids.map { .init(uuid: $0) } + } + if let value = try? GAPDataDecoder.decode(GAPIncompleteListOf128BitServiceClassUUIDs.self, from: data) { + uuids += value.uuids.map { .init(uuid: $0) } + } guard uuids.isEmpty == false else { return nil } @@ -127,33 +112,27 @@ extension AndroidLowEnergyAdvertisementData: AdvertisementData { /// Using the RSSI value and the Tx power level, it is possible to calculate path loss. public var txPowerLevel: Double? { - let decoded = decode() - - guard let gapData = decoded.compactMap({ $0 as? GAPTxPowerLevel }).first + guard let value = try? GAPDataDecoder.decode(GAPTxPowerLevel.self, from: data) else { return nil } - return Double(gapData.powerLevel) + return Double(value.powerLevel) } /// An array of one or more `BluetoothUUID`, representing Service UUIDs. public var solicitedServiceUUIDs: [BluetoothUUID]? { - let decoded = decode() - - guard decoded.isEmpty == false - else { return nil } - var uuids = [BluetoothUUID]() - uuids.reserveCapacity(decoded.count) - - decoded.compactMap { $0 as? GAPListOf16BitServiceSolicitationUUIDs } - .forEach { $0.uuids.forEach { uuids.append(.bit16($0)) } } - - decoded.compactMap { $0 as? GAPListOf32BitServiceSolicitationUUIDs } - .forEach { $0.uuids.forEach { uuids.append(.bit32($0)) } } - - decoded.compactMap { $0 as? GAPListOf128BitServiceSolicitationUUIDs } - .forEach { $0.uuids.forEach { uuids.append(.bit128(UInt128(uuid: $0))) } } + uuids.reserveCapacity(2) + + if let value = try? GAPDataDecoder.decode(GAPListOf16BitServiceSolicitationUUIDs.self, from: data) { + uuids += value.uuids.map { .bit16($0) } + } + if let value = try? GAPDataDecoder.decode(GAPListOf32BitServiceSolicitationUUIDs.self, from: data) { + uuids += value.uuids.map { .bit32($0) } + } + if let value = try? GAPDataDecoder.decode(GAPListOf128BitServiceSolicitationUUIDs.self, from: data) { + uuids += value.uuids.map { .init(uuid: $0) } + } guard uuids.isEmpty == false else { return nil } @@ -161,4 +140,3 @@ extension AndroidLowEnergyAdvertisementData: AdvertisementData { return uuids } } -*/ From 38a2a95bac6cdfa41a7284fed3d61a5f5cf79419 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 16:09:37 -0400 Subject: [PATCH 14/39] Update `AndroidCentral` --- Sources/AndroidBluetooth/AndroidCentral.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentral.swift b/Sources/AndroidBluetooth/AndroidCentral.swift index 4956ef3..10dd4b6 100644 --- a/Sources/AndroidBluetooth/AndroidCentral.swift +++ b/Sources/AndroidBluetooth/AndroidCentral.swift @@ -100,7 +100,7 @@ public final class AndroidCentral: CentralManager { guard hostController.isEnabled() else { throw AndroidCentralError.bluetoothDisabled } - guard let scanDevice = storage.state.scan.peripherals[peripheral] + guard let scanDevice = await storage.state.scan.peripherals[peripheral] else { throw CentralError.unknownPeripheral } // wait for connection continuation @@ -502,13 +502,13 @@ public final class AndroidCentral: CentralManager { guard hostController.isEnabled() else { return } - guard let scanner = hostController.lowEnergyScanner + guard let scanner = hostController.getBluetoothLeScanner() else { return } guard let scanCallBack = await self.storage.state.scan.callback else { return } - scanner.stopScan(callback: scanCallBack) + scanner.stopScan(scanCallBack) } @discardableResult From 9b4293f8541fd704b2b89ee2a24fa36e9874c757 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:14:47 -0400 Subject: [PATCH 15/39] Add `AndroidBluetoothServiceType` --- .../AndroidBluetoothServiceType.swift | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Sources/AndroidBluetooth/AndroidBluetoothServiceType.swift diff --git a/Sources/AndroidBluetooth/AndroidBluetoothServiceType.swift b/Sources/AndroidBluetooth/AndroidBluetoothServiceType.swift new file mode 100644 index 0000000..2f641ec --- /dev/null +++ b/Sources/AndroidBluetooth/AndroidBluetoothServiceType.swift @@ -0,0 +1,69 @@ +// +// AndroidBluetoothServiceType.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +import JavaKit + +/// Bluetooth Service Type +public enum AndroidBluetoothServiceType: Equatable, Hashable, Sendable, CaseIterable { + + /** + * Primary service. + */ + case primary + + /** + * Secondary service (included by primary services). + */ + case secondary +} + +public extension AndroidBluetoothServiceType { + + init(isPrimary: Bool) { + self = isPrimary ? .primary : .secondary + } + + var isPrimary: Bool { + switch self { + case .primary: + true + case .secondary: + false + } + } +} + +// MARK: - RawRepresentable + +extension AndroidBluetoothServiceType: RawRepresentable { + + public init?(rawValue: Int32) { + guard let value = Self.allCases.first(where: { $0.rawValue == rawValue }) else { + return nil + } + self = value + } + + public var rawValue: Int32 { + switch self { + case .primary: + Self.javaClass.SERVICE_TYPE_PRIMARY + case .secondary: + Self.javaClass.SERVICE_TYPE_SECONDARY + } + } +} + +public extension BluetoothGattService { + + typealias ServiceType = AndroidBluetoothServiceType +} + +internal extension AndroidBluetoothServiceType { + + static let javaClass = try! JavaClass() +} From c7df32a370cd28e9dc0b7c671f642708ba9adbe9 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:14:56 -0400 Subject: [PATCH 16/39] Add `ScanData` extensions --- .../Extensions/ScanData.swift | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Sources/AndroidBluetooth/Extensions/ScanData.swift diff --git a/Sources/AndroidBluetooth/Extensions/ScanData.swift b/Sources/AndroidBluetooth/Extensions/ScanData.swift new file mode 100644 index 0000000..9ed7083 --- /dev/null +++ b/Sources/AndroidBluetooth/Extensions/ScanData.swift @@ -0,0 +1,41 @@ +// +// ScanData.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) +import Foundation +#endif +import JavaKit +import AndroidOS +import Bluetooth +import GATT + +internal extension ScanData where Peripheral == AndroidCentral.Peripheral, Advertisement == AndroidCentral.Advertisement { + + init(_ result: ScanResult) throws { + + let peripheral = Peripheral(result.getDevice()) + let record = result.getScanRecord()! + let advertisement = AndroidLowEnergyAdvertisementData(data: Data(record.bytes)) + let isConnectable: Bool + let sdkInt = try JavaClass().SDK_INT + let oVersion = try JavaClass().O + if sdkInt >= oVersion { + isConnectable = result.isConnectable() + } else { + isConnectable = true + } + self.init( + peripheral: peripheral, + date: Date(), + rssi: Double(result.getRssi()), + advertisementData: advertisement, + isConnectable: isConnectable + ) + } +} From 0a13e8135b6ea93904e82f3900af4d1bf61261f0 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:15:03 -0400 Subject: [PATCH 17/39] Add `Peripheral` extensions --- .../Extensions/Peripheral.swift | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Sources/AndroidBluetooth/Extensions/Peripheral.swift diff --git a/Sources/AndroidBluetooth/Extensions/Peripheral.swift b/Sources/AndroidBluetooth/Extensions/Peripheral.swift new file mode 100644 index 0000000..568dfd6 --- /dev/null +++ b/Sources/AndroidBluetooth/Extensions/Peripheral.swift @@ -0,0 +1,20 @@ +// +// Peripheral.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +import Bluetooth +import GATT + +internal extension Peripheral { + + init(_ device: AndroidBluetooth.BluetoothDevice) { + self.init(id: device.address) + } + + init(_ gatt: AndroidBluetooth.BluetoothGatt) { + self.init(gatt.getDevice()) + } +} From b0411627d8cde0c00e00ca9ec0463b60582dc6bc Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:15:14 -0400 Subject: [PATCH 18/39] Add `BluetoothUUID` extensions --- .../Extensions/BluetoothUUID.swift | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Sources/AndroidBluetooth/Extensions/BluetoothUUID.swift diff --git a/Sources/AndroidBluetooth/Extensions/BluetoothUUID.swift b/Sources/AndroidBluetooth/Extensions/BluetoothUUID.swift new file mode 100644 index 0000000..dfd3fba --- /dev/null +++ b/Sources/AndroidBluetooth/Extensions/BluetoothUUID.swift @@ -0,0 +1,27 @@ +// +// BluetoothUUID.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) +import Foundation +#endif +import JavaUtil +import Bluetooth + +internal extension BluetoothUUID { + + init(android javaUUID: JavaUtil.UUID) { + + let uuid = UUID(uuidString: javaUUID.toString())! + if let value = UInt16(bluetooth: uuid) { + self = .bit16(value) + } else { + self = .bit128(UInt128(uuid: uuid)) + } + } +} From f2762407a739668e7b870913c013166e61f54723 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:15:33 -0400 Subject: [PATCH 19/39] Add `ScanRecord.bytes` --- Sources/AndroidBluetooth/ScanRecord.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/AndroidBluetooth/ScanRecord.swift b/Sources/AndroidBluetooth/ScanRecord.swift index e7b49ec..eaa7002 100644 --- a/Sources/AndroidBluetooth/ScanRecord.swift +++ b/Sources/AndroidBluetooth/ScanRecord.swift @@ -42,7 +42,11 @@ open class ScanRecord: JavaObject { open override func toString() -> String @JavaMethod - open func getBytes() -> [Int8] + internal func getBytes() -> [Int8] + + public var bytes: [UInt8] { + unsafeBitCast(getBytes(), to: [UInt8].self) + } } extension JavaClass { @JavaStaticField(isFinal: true) From ea91eac4096090ab2894e10370620935e5ff9a9f Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:15:52 -0400 Subject: [PATCH 20/39] Add `BluetoothGattService.type` --- Sources/AndroidBluetooth/BluetoothGattService.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/AndroidBluetooth/BluetoothGattService.swift b/Sources/AndroidBluetooth/BluetoothGattService.swift index 5453979..c064aa4 100644 --- a/Sources/AndroidBluetooth/BluetoothGattService.swift +++ b/Sources/AndroidBluetooth/BluetoothGattService.swift @@ -38,7 +38,11 @@ open class BluetoothGattService: JavaObject { open func getIncludedServices() -> List! @JavaMethod - open func getType() -> Int32 + internal func getType() -> Int32 + + public var type: ServiceType { + .init(rawValue: getType())! + } } extension JavaClass { @JavaStaticField(isFinal: true) From 8d0804d636ecba7090abad33171c7181b56bc6b5 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:16:14 -0400 Subject: [PATCH 21/39] Add `BluetoothDevice.address` --- .../AndroidBluetooth/BluetoothDevice.swift | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Sources/AndroidBluetooth/BluetoothDevice.swift b/Sources/AndroidBluetooth/BluetoothDevice.swift index 588ff03..b2b3b31 100644 --- a/Sources/AndroidBluetooth/BluetoothDevice.swift +++ b/Sources/AndroidBluetooth/BluetoothDevice.swift @@ -4,6 +4,7 @@ import AndroidOS import JavaKit import JavaRuntime import JavaUtil +import Bluetooth @JavaClass("android.bluetooth.BluetoothDevice", implements: Parcelable.self) open class BluetoothDevice: JavaObject { @@ -13,6 +14,9 @@ open class BluetoothDevice: JavaObject { @JavaMethod open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32) + /** + Returns the address type of this BluetoothDevice, one of ADDRESS_TYPE_PUBLIC, ADDRESS_TYPE_RANDOM, ADDRESS_TYPE_ANONYMOUS, or ADDRESS_TYPE_UNKNOWN. + */ @JavaMethod open func getAddressType() -> Int32 @@ -129,6 +133,14 @@ open class BluetoothDevice: JavaObject { @JavaMethod open func createInsecureRfcommSocketToServiceRecord(_ arg0: UUID?) throws -> BluetoothSocket! + /** + Get the friendly Bluetooth name of the remote device. + + The local adapter will automatically retrieve remote names when performing a device scan, and will cache them. This method just returns the name for this device from the cache. + For apps targeting Build.VERSION_CODES.R or lower, this requires the Manifest.permission.BLUETOOTH permission which can be gained with a simple manifest tag. + For apps targeting Build.VERSION_CODES.S or or higher, this requires the Manifest.permission.BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int). + Requires Manifest.permission.BLUETOOTH_CONNECT + */ @JavaMethod open func getName() -> String @@ -141,12 +153,32 @@ open class BluetoothDevice: JavaObject { @JavaMethod open override func hashCode() -> Int32 + /** + Get the Bluetooth device type of the remote device. + For apps targeting Build.VERSION_CODES.R or lower, this requires the Manifest.permission.BLUETOOTH permission which can be gained with a simple manifest tag. + For apps targeting Build.VERSION_CODES.S or or higher, this requires the Manifest.permission.BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int). + Requires Manifest.permission.BLUETOOTH_CONNECT + + - Returns: The device type `DEVICE_TYPE_CLASSIC`, `DEVICE_TYPE_LE`, `DEVICE_TYPE_DUAL`, `DEVICE_TYPE_UNKNOWN` if it's not available + */ @JavaMethod open func getType() -> Int32 + /// Returns the hardware address of this BluetoothDevice. @JavaMethod - open func getAddress() -> String + internal func getAddress() -> String + + public var address: BluetoothAddress { + let string = getAddress() + guard let address = BluetoothAddress(string) else { + fatalError("Invalid address: \(string)") + } + return address + } } + + + extension JavaClass { @JavaStaticField(isFinal: true) public var ACTION_ACL_CONNECTED: String From 1e95934099f56dfe051e7efc4a19c6293b6a167d Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:16:23 -0400 Subject: [PATCH 22/39] Add `AndroidCentralError` --- .../AndroidCentralError.swift | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Sources/AndroidBluetooth/AndroidCentralError.swift diff --git a/Sources/AndroidBluetooth/AndroidCentralError.swift b/Sources/AndroidBluetooth/AndroidCentralError.swift new file mode 100644 index 0000000..a396ffc --- /dev/null +++ b/Sources/AndroidBluetooth/AndroidCentralError.swift @@ -0,0 +1,19 @@ +// +// AndroidCentralError.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +/// Android Central Error +public enum AndroidCentralError: Swift.Error { + + /// Bluetooth is disabled. + case bluetoothDisabled + + /// Binder IPC failure. + case binderFailure + + /// Unexpected null value. + case nullValue(AnyKeyPath) +} From 81264619a9aa174bcf9d555cfc037f4f660da05b Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:16:31 -0400 Subject: [PATCH 23/39] Add `AndroidCentralAttribute` --- .../AndroidCentralAttribute.swift | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 Sources/AndroidBluetooth/AndroidCentralAttribute.swift diff --git a/Sources/AndroidBluetooth/AndroidCentralAttribute.swift b/Sources/AndroidBluetooth/AndroidCentralAttribute.swift new file mode 100644 index 0000000..0b277e9 --- /dev/null +++ b/Sources/AndroidBluetooth/AndroidCentralAttribute.swift @@ -0,0 +1,42 @@ +// +// AndroidCentralAttribute.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) +import Foundation +#endif +import JavaKit +import JavaUtil +import Bluetooth +import GATT + +internal protocol AndroidCentralAttribute { + + static var attributeType: AndroidCentralAttributeType { get } + + func getInstanceId() -> Int32 + + func getUuid() -> JavaUtil.UUID! +} + +enum AndroidCentralAttributeType: String, Sendable, CaseIterable { + + case service = "Service" + + case characteristic = "Characteristic" +} + +extension BluetoothGattService: AndroidCentralAttribute { + + static var attributeType: AndroidCentralAttributeType { .service } +} + +extension BluetoothGattCharacteristic: AndroidCentralAttribute { + + static var attributeType: AndroidCentralAttributeType { .characteristic } +} From f638ca32973b7dd788ad2783dc682756a4808de8 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:22:14 -0400 Subject: [PATCH 24/39] Add `AndroidCentral.Storage` --- .../AndroidCentralState.swift | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 Sources/AndroidBluetooth/AndroidCentralState.swift diff --git a/Sources/AndroidBluetooth/AndroidCentralState.swift b/Sources/AndroidBluetooth/AndroidCentralState.swift new file mode 100644 index 0000000..8e794b1 --- /dev/null +++ b/Sources/AndroidBluetooth/AndroidCentralState.swift @@ -0,0 +1,208 @@ +// +// AndroidCentralState.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) +import Foundation +#endif +import JavaKit +import JavaUtil +import Bluetooth +import GATT + +internal extension AndroidCentral { + + actor Storage { + + var state = InternalState() + + func update(_ block: (inout InternalState) throws -> (T)) rethrows -> T { + return try block(&state) + } + } + + struct InternalState { + + init() { } + + var cache = [Peripheral: Cache]() + + var scan = Scan() + + struct Scan { + + var peripherals = [Peripheral: Device]() + + var continuation: AsyncIndefiniteStream>.Continuation? + + var callback: ScanCallback? + + struct Device { + + let scanData: ScanData + + let scanResult: AndroidBluetooth.ScanResult + } + } + } + + /// GATT cache for a connection or peripheral. + struct Cache { + + init( + gatt: BluetoothGatt, + callback: GattCallback + ) { + self.gatt = gatt + self.gattCallback = callback + } + + let gattCallback: GattCallback + + let gatt: BluetoothGatt + + fileprivate(set) var maximumTransmissionUnit: MaximumTransmissionUnit = .default + + var services = Services() + + var characteristics = Characteristics() + + var descriptors = Descriptors() + + var continuation = PeripheralContinuation() + + func identifier(for attribute: T) -> AndroidCentral.AttributeID where T: AndroidCentralAttribute { + let peripheral = Peripheral(gatt) + let instanceID = attribute.getInstanceId() + guard let uuid = attribute.getUuid()?.toString() else { + assertionFailure() + return instanceID.description + } + return "\(peripheral.id)/\(T.attributeType)/\(instanceID)/\(uuid)" + } + + func identifier( + for descriptor: BluetoothGattDescriptor, + characteristic: Characteristic + ) -> AndroidCentral.AttributeID { + guard let uuid = descriptor.getUuid()?.toString() else { + fatalError() + } + return characteristic.id + "/Descriptor/\(uuid)" + } + + mutating func update(_ newValues: [BluetoothGattService]) -> [Service] { + // reset caches + services.values.removeAll(keepingCapacity: true) + characteristics.values.removeAll(keepingCapacity: true) + descriptors.values.removeAll(keepingCapacity: true) + // return mapped values + return newValues.map { + let id = identifier(for: $0) + let peripheral = Peripheral(gatt) + let uuid = BluetoothUUID(android: $0.getUuid()) + let isPrimary = $0.type.isPrimary + // cache value + services.values[id] = $0 + // map value + return Service( + id: id, + uuid: uuid, + peripheral: peripheral, + isPrimary: isPrimary + ) + } + } + + mutating func update( + _ newValues: [BluetoothGattCharacteristic], + for service: Service + ) -> [Characteristic] { + return newValues.map { + let id = identifier(for: $0) + let peripheral = Peripheral(gatt) + let uuid = BluetoothUUID(android: $0.getUuid()) + let properties = CharacteristicProperties(rawValue: UInt8($0.getProperties())) + // cache + characteristics.values[id] = CharacteristicCache(object: $0) + // return Swift value + return Characteristic( + id: id, + uuid: uuid, + peripheral: peripheral, + properties: properties + ) + } + } + + mutating func update( + _ newValues: [BluetoothGattDescriptor], + for characteristic: Characteristic + ) -> [Descriptor] { + return newValues.map { + let id = identifier(for: $0, characteristic: characteristic) + let peripheral = Peripheral(gatt) + let uuid = BluetoothUUID(android: $0.getUuid()) + // cache object + descriptors.values[id] = $0 + // return swift value + return Descriptor( + id: id, + uuid: uuid, + peripheral: peripheral + ) + } + } + } + + struct PeripheralContinuation { + + var connect: CheckedContinuation? + + var exchangeMTU: CheckedContinuation? + + var discoverServices: CheckedContinuation<[Service], Error>? + + var discoverCharacteristics: CheckedContinuation<[Characteristic], Error>? + + var discoverDescriptors: CheckedContinuation<[Descriptor], Error>? + + var readCharacteristic: CheckedContinuation? + + var writeCharacteristic: CheckedContinuation? + + var readDescriptor: CheckedContinuation? + + var writeDescriptor: CheckedContinuation? + + var readRemoteRSSI: CheckedContinuation? + } + + struct Services { + + var values: [AndroidCentral.AttributeID: BluetoothGattService] = [:] + } + + struct Characteristics { + + var values: [AndroidCentral.AttributeID: CharacteristicCache] = [:] + } + + + struct Descriptors { + + var values: [AndroidCentral.AttributeID: BluetoothGattDescriptor] = [:] + } + + struct CharacteristicCache { + + let object: BluetoothGattCharacteristic + + var notification: AsyncIndefiniteStream.Continuation? + } +} From 52df1d867f12cda7eb29c65dd61a7b440307c71a Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:22:40 -0400 Subject: [PATCH 25/39] Add Central callbacks --- .../AndroidCentralCallback.swift | 374 ++++++++++++++++++ 1 file changed, 374 insertions(+) create mode 100644 Sources/AndroidBluetooth/AndroidCentralCallback.swift diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift new file mode 100644 index 0000000..0f35cf9 --- /dev/null +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -0,0 +1,374 @@ +// +// AndroidCentralCallback.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) +import Foundation +#endif +import JavaKit +import JavaUtil +import Bluetooth +import GATT + +extension AndroidCentral { + + @JavaClass("org.pureswift.bluetooth.le.ScanCallback") + internal class LowEnergyScanCallback: AndroidBluetooth.ScanCallback { + + weak var central: AndroidCentral? + + /* + public override func onScanResult( + callbackType: Android.Bluetooth.LE.ScanCallbackType, + result: Android.Bluetooth.LE.ScanResult + ) { + + central?.log?("\(type(of: self)) \(#function) name: \(result.device.getName() ?? "") address: \(result.device.address)") + + let scanData = ScanData(result) + + Task { + await central?.storage.update { state in + state.scan.continuation?.yield(scanData) + state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( + scanData: scanData, + scanResult: result + ) + } + } + } + + public override func onBatchScanResults(results: [Android.Bluetooth.LE.ScanResult]) { + + central?.log?("\(type(of: self)): \(#function)") + + for result in results { + + let scanData = ScanData(result) + + Task { + await central?.storage.update { state in + state.scan.continuation?.yield(scanData) + state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( + scanData: scanData, + scanResult: result + ) + } + } + } + } + + public override func onScanFailed(error: AndroidBluetoothLowEnergyScanCallback.Error) { + + central?.log?("\(type(of: self)): \(#function)") + + Task { + await central?.storage.update { state in + state.scan.continuation?.finish(throwing: error) + } + } + }*/ + } + + @JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") + internal class GattCallback: AndroidBluetooth.BluetoothGattCallback { + + private weak var central: AndroidCentral? + + /* + convenience init(central: AndroidCentral) { + self.init(javaObject: nil) + bindNewJavaObject() + + self.central = central + } + + public required init(javaObject: jobject?) { + super.init(javaObject: javaObject) + } + + public override func onConnectionStateChange( + gatt: Android.Bluetooth.Gatt, + status: Android.Bluetooth.Gatt.Status, + newState: Android.Bluetooth.Device.State + ) { + let log = central?.log + log?("\(type(of: self)): \(#function)") + log?("Status: \(status) - newState: \(newState)") + + let peripheral = Peripheral(gatt) + + Task { + await central?.storage.update { state in + switch (status, newState) { + case (.success, .connected): + log?("\(peripheral) Connected") + // if we are expecting a new connection + if state.cache[peripheral]?.continuation.connect != nil { + state.cache[peripheral]?.continuation.connect?.resume() + state.cache[peripheral]?.continuation.connect = nil + } + case (.success, .disconnected): + log?("\(peripheral) Disconnected") + state.cache[peripheral] = nil + default: + log?("\(peripheral) Status Error") + state.cache[peripheral]?.continuation.connect?.resume(throwing: status) // throw `status` error + state.cache[peripheral]?.continuation.connect = nil + } + } + } + } + + public override func onServicesDiscovered( + gatt: Android.Bluetooth.Gatt, + status: Android.Bluetooth.Gatt.Status + ) { + let log = central?.log + let peripheral = Peripheral(gatt) + log?("\(type(of: self)): \(#function) Status: \(status)") + + Task { + await central?.storage.update { state in + // success discovering + switch status { + case .success: + guard let services = state.cache[peripheral]?.update(gatt.services) else { + assertionFailure() + return + } + state.cache[peripheral]?.continuation.discoverServices?.resume(returning: services) + default: + state.cache[peripheral]?.continuation.discoverServices?.resume(throwing: status) + } + state.cache[peripheral]?.continuation.discoverServices = nil + } + } + } + + public override func onCharacteristicChanged( + gatt: Android.Bluetooth.Gatt, + characteristic: Android.Bluetooth.GattCharacteristic + ) { + let log = central?.log + log?("\(type(of: self)): \(#function)") + + let peripheral = Peripheral(gatt) + + Task { + await central?.storage.update { state in + + guard let uuid = characteristic.getUUID().toString() else { + assertionFailure() + return + } + + guard let cache = state.cache[peripheral] else { + assertionFailure("Invalid cache for \(uuid)") + return + } + + let id = cache.identifier(for: characteristic) + + let data = characteristic.getValue() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + + guard let characteristicCache = cache.characteristics.values[id] else { + assertionFailure("Invalid identifier for \(uuid)") + return + } + + guard let notification = characteristicCache.notification else { + assertionFailure("Unexpected notification for \(uuid)") + return + } + + notification.yield(data) + } + } + } + + public override func onCharacteristicRead( + gatt: Android.Bluetooth.Gatt, + characteristic: Android.Bluetooth.GattCharacteristic, + status: Android.Bluetooth.Gatt.Status + ) { + let log = central?.log + let peripheral = Peripheral(gatt) + log?("\(type(of: self)): \(#function) \(peripheral) Status: \(status)") + + Task { + await central?.storage.update { state in + + switch status { + case .success: + let data = characteristic.getValue() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + state.cache[peripheral]?.continuation.readCharacteristic?.resume(returning: data) + default: + state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: status) + } + state.cache[peripheral]?.continuation.readCharacteristic = nil + } + } + } + + public override func onCharacteristicWrite( + gatt: Android.Bluetooth.Gatt, + characteristic: Android.Bluetooth.GattCharacteristic, + status: Android.Bluetooth.Gatt.Status + ) { + central?.log?("\(type(of: self)): \(#function)") + + let peripheral = Peripheral(gatt) + + Task { + await central?.storage.update { state in + switch status { + case .success: + state.cache[peripheral]?.continuation.writeCharacteristic?.resume() + default: + state.cache[peripheral]?.continuation.writeCharacteristic?.resume(throwing: status) + } + state.cache[peripheral]?.continuation.writeCharacteristic = nil + } + } + } + + public override func onDescriptorRead( + gatt: Android.Bluetooth.Gatt, + descriptor: Android.Bluetooth.GattDescriptor, + status: Android.Bluetooth.Gatt.Status + ) { + let peripheral = Peripheral(gatt) + + guard let uuid = descriptor.getUUID().toString() else { + assertionFailure() + return + } + + central?.log?(" \(type(of: self)): \(#function) \(uuid)") + + Task { + await central?.storage.update { state in + + switch status { + case .success: + let data = descriptor.getValue() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + state.cache[peripheral]?.continuation.readDescriptor?.resume(returning: data) + default: + state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: status) + } + state.cache[peripheral]?.continuation.readDescriptor = nil + } + } + } + + public override func onDescriptorWrite( + gatt: Android.Bluetooth.Gatt, + descriptor: Android.Bluetooth.GattDescriptor, + status: AndroidBluetoothGatt.Status + ) { + + let peripheral = Peripheral(gatt) + + guard let uuid = descriptor.getUUID().toString() else { + assertionFailure() + return + } + + central?.log?(" \(type(of: self)): \(#function) \(uuid)") + + Task { + await central?.storage.update { state in + switch status { + case .success: + state.cache[peripheral]?.continuation.writeDescriptor?.resume() + default: + state.cache[peripheral]?.continuation.writeDescriptor?.resume(throwing: status) + } + state.cache[peripheral]?.continuation.writeDescriptor = nil + } + } + } + + public override func onMtuChanged( + gatt: Android.Bluetooth.Gatt, + mtu: Int, + status: Android.Bluetooth.Gatt.Status + ) { + central?.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") + + let peripheral = Peripheral(gatt) + + guard let central = self.central else { + assertionFailure() + return + } + + let oldMTU = central.options.maximumTransmissionUnit + + Task { + + await central.storage.update { state in + + // get new MTU value + guard let newMTU = MaximumTransmissionUnit(rawValue: UInt16(mtu)) else { + assertionFailure("Invalid MTU \(mtu)") + return + } + + assert(newMTU <= oldMTU, "Invalid MTU: \(newMTU) > \(oldMTU)") + + // cache new MTU value + state.cache[peripheral]?.maximumTransmissionUnit = newMTU + + // pending MTU exchange + state.cache[peripheral]?.continuation.exchangeMTU?.resume(returning: newMTU) + state.cache[peripheral]?.continuation.exchangeMTU = nil + return + } + } + } + + public override func onPhyRead(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: AndroidBluetoothGatt.Status) { + + central?.log?("\(type(of: self)): \(#function)") + } + + public override func onPhyUpdate(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: AndroidBluetoothGatt.Status) { + + central?.log?("\(type(of: self)): \(#function)") + } + + public override func onReadRemoteRssi(gatt: Android.Bluetooth.Gatt, rssi: Int, status: Android.Bluetooth.Gatt.Status) { + + central?.log?("\(type(of: self)): \(#function) \(rssi) \(status)") + + let peripheral = Peripheral(gatt) + + Task { + await central?.storage.update { state in + switch status { + case .success: + state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: rssi) + default: + state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: status) + } + state.cache[peripheral]?.continuation.readRemoteRSSI = nil + } + } + } + + public override func onReliableWriteCompleted(gatt: Android.Bluetooth.Gatt, status: AndroidBluetoothGatt.Status) { + + central?.log?("\(type(of: self)): \(#function)") + }*/ + } +} From 8a0b9d85c38c793892f6ecb0df3091e92ee7b12e Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:23:00 -0400 Subject: [PATCH 26/39] Update `AndroidCentral` for JavaKit --- Sources/AndroidBluetooth/AndroidCentral.swift | 681 +----------------- 1 file changed, 27 insertions(+), 654 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentral.swift b/Sources/AndroidBluetooth/AndroidCentral.swift index 10dd4b6..ca602f0 100644 --- a/Sources/AndroidBluetooth/AndroidCentral.swift +++ b/Sources/AndroidBluetooth/AndroidCentral.swift @@ -5,7 +5,11 @@ // Created by Marco Estrella on 7/24/18. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#elseif canImport(Foundation) import Foundation +#endif import GATT import Bluetooth import JavaKit @@ -14,7 +18,7 @@ import JavaUtil import AndroidOS import AndroidContent import AndroidLooper -/* + @AndroidMainActor public final class AndroidCentral: CentralManager { @@ -77,7 +81,8 @@ public final class AndroidCentral: CentralManager { $0.scan.continuation = continuation } let scanCallBack = ScanCallback() - scanCallBack.central = self + // TODO: Implement callbacks + //scanCallBack.central = self scanner.startScan(scanCallBack) } }) @@ -92,7 +97,7 @@ public final class AndroidCentral: CentralManager { public func connect( to peripheral: Peripheral, autoConnect: Bool, - transport: BluetoothDevice + transport: BluetoothTransport ) async throws { log?("\(type(of: self)) \(#function)") @@ -111,20 +116,20 @@ public final class AndroidCentral: CentralManager { await storage.update { [unowned self] state in // store continuation - let callback = GattCallback(central: self) + let callback = GattCallback() //GattCallback(self) let gatt: BluetoothGatt // call the correct method for connecting - let sdkInt = try JavaClass().SDK_INT - let lollipopMr1 = try JavaClass().LOLLIPOP_MR1 + let sdkInt = try! JavaClass().SDK_INT + let lollipopMr1 = try! JavaClass().LOLLIPOP_MR1 if sdkInt <= lollipopMr1 { - gatt = scanDevice.scanResult.device.connectGatt( + gatt = scanDevice.scanResult.getDevice().connectGatt( context: self.context, autoConnect: autoConnect, callback: callback ) } else { - gatt = scanDevice.scanResult.device.connectGatt( + gatt = scanDevice.scanResult.getDevice().connectGatt( context: self.context, autoConnect: autoConnect, callback: callback, @@ -237,7 +242,10 @@ public final class AndroidCentral: CentralManager { guard let gattService = cache.services.values[service.id] else { throw CentralError.invalidAttribute(service.uuid) } - let gattCharacteristics = gattService.getCharacteristics() + let gattCharacteristics = gattService + .getCharacteristics() + .toArray() + .map { $0!.as(BluetoothGattCharacteristic.self)! } guard let services = state.cache[service.peripheral]?.update(gattCharacteristics, for: service) else { assertionFailure("Missing connection cache") @@ -276,7 +284,7 @@ public final class AndroidCentral: CentralManager { guard let gattCharacteristic = cache.characteristics.values[characteristic.id]?.object else { throw CentralError.invalidAttribute(characteristic.uuid) } - guard cache.gatt.readCharacteristic(characteristic: gattCharacteristic) + guard cache.gatt.readCharacteristic(gattCharacteristic) else { throw AndroidCentralError.binderFailure } } } @@ -318,9 +326,9 @@ public final class AndroidCentral: CentralManager { else { throw CentralError.invalidAttribute(characteristic.uuid) } let dataArray = [UInt8](data) - let _ = gattCharacteristic.setValue(value: unsafeBitCast(dataArray, to: [Int8].self)) + let _ = gattCharacteristic.setValue(unsafeBitCast(dataArray, to: [Int8].self)) - guard cache.gatt.writeCharacteristic(characteristic: gattCharacteristic) + guard cache.gatt.writeCharacteristic(gattCharacteristic) else { throw AndroidCentralError.binderFailure } } } @@ -351,7 +359,10 @@ public final class AndroidCentral: CentralManager { guard let gattCharacteristic = cache.characteristics.values[characteristic.id]?.object else { throw CentralError.invalidAttribute(characteristic.uuid) } - let gattDescriptors = gattCharacteristic.getDescriptors() + let gattDescriptors = gattCharacteristic + .getDescriptors() + .toArray() + .map { BluetoothGattDescriptor(javaHolder: $0!.javaHolder) } return state.cache[peripheral]?.update(gattDescriptors, for: characteristic) ?? [] } @@ -385,7 +396,7 @@ public final class AndroidCentral: CentralManager { guard let gattDescriptor = state.cache[peripheral]?.descriptors.values[descriptor.id] else { throw CentralError.invalidAttribute(descriptor.uuid) } - guard gatt.readDescriptor(descriptor: gattDescriptor) + guard gatt.readDescriptor(gattDescriptor) else { throw AndroidCentralError.binderFailure } } } @@ -428,7 +439,7 @@ public final class AndroidCentral: CentralManager { let dataArray = [UInt8](data) let _ = gattDescriptor.setValue(unsafeBitCast(dataArray, to: [Int8].self)) - guard cache.gatt.writeDescriptor(descriptor: gattDescriptor) + guard cache.gatt.writeDescriptor(gattDescriptor) else { throw AndroidCentralError.binderFailure } } } @@ -528,7 +539,7 @@ public final class AndroidCentral: CentralManager { state.cache[peripheral]?.continuation.exchangeMTU = continuation } - guard cache.gatt.requestMtu(mtu: Int(mtu.rawValue)) + guard cache.gatt.requestMtu(Int32(mtu.rawValue)) else { throw AndroidCentralError.binderFailure } } catch { @@ -600,19 +611,6 @@ public final class AndroidCentral: CentralManager { // MARK: - Supporting Types -/// Android Central Error -public enum AndroidCentralError: Swift.Error { - - /// Bluetooth is disabled. - case bluetoothDisabled - - /// Binder IPC failure. - case binderFailure - - /// Unexpected null value. - case nullValue(AnyKeyPath) -} - public extension AndroidCentral { /// Android GATT Central options @@ -626,628 +624,3 @@ public extension AndroidCentral { } } -// MARK: Callbacks - -internal extension AndroidCentral { - - final class ScanCallback: AndroidBluetooth.ScanCallback { - - weak var central: AndroidCentral? - - public required init(javaObject: jobject?) { - super.init(javaObject: javaObject) - } - - convenience init() { - self.init(javaObject: nil) - bindNewJavaObject() - } - - public override func onScanResult( - callbackType: Android.Bluetooth.LE.ScanCallbackType, - result: Android.Bluetooth.LE.ScanResult - ) { - - central?.log?("\(type(of: self)) \(#function) name: \(result.device.getName() ?? "") address: \(result.device.address)") - - let scanData = ScanData(result) - - Task { - await central?.storage.update { state in - state.scan.continuation?.yield(scanData) - state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( - scanData: scanData, - scanResult: result - ) - } - } - } - - public override func onBatchScanResults(results: [Android.Bluetooth.LE.ScanResult]) { - - central?.log?("\(type(of: self)): \(#function)") - - for result in results { - - let scanData = ScanData(result) - - Task { - await central?.storage.update { state in - state.scan.continuation?.yield(scanData) - state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( - scanData: scanData, - scanResult: result - ) - } - } - } - } - - public override func onScanFailed(error: AndroidBluetoothLowEnergyScanCallback.Error) { - - central?.log?("\(type(of: self)): \(#function)") - - Task { - await central?.storage.update { state in - state.scan.continuation?.finish(throwing: error) - } - } - } - } - - final class GattCallback: Android.Bluetooth.GattCallback { - - private weak var central: AndroidCentral? - - convenience init(central: AndroidCentral) { - self.init(javaObject: nil) - bindNewJavaObject() - - self.central = central - } - - public required init(javaObject: jobject?) { - super.init(javaObject: javaObject) - } - - public override func onConnectionStateChange( - gatt: Android.Bluetooth.Gatt, - status: Android.Bluetooth.Gatt.Status, - newState: Android.Bluetooth.Device.State - ) { - let log = central?.log - log?("\(type(of: self)): \(#function)") - log?("Status: \(status) - newState: \(newState)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - switch (status, newState) { - case (.success, .connected): - log?("\(peripheral) Connected") - // if we are expecting a new connection - if state.cache[peripheral]?.continuation.connect != nil { - state.cache[peripheral]?.continuation.connect?.resume() - state.cache[peripheral]?.continuation.connect = nil - } - case (.success, .disconnected): - log?("\(peripheral) Disconnected") - state.cache[peripheral] = nil - default: - log?("\(peripheral) Status Error") - state.cache[peripheral]?.continuation.connect?.resume(throwing: status) // throw `status` error - state.cache[peripheral]?.continuation.connect = nil - } - } - } - } - - public override func onServicesDiscovered( - gatt: Android.Bluetooth.Gatt, - status: Android.Bluetooth.Gatt.Status - ) { - let log = central?.log - let peripheral = Peripheral(gatt) - log?("\(type(of: self)): \(#function) Status: \(status)") - - Task { - await central?.storage.update { state in - // success discovering - switch status { - case .success: - guard let services = state.cache[peripheral]?.update(gatt.services) else { - assertionFailure() - return - } - state.cache[peripheral]?.continuation.discoverServices?.resume(returning: services) - default: - state.cache[peripheral]?.continuation.discoverServices?.resume(throwing: status) - } - state.cache[peripheral]?.continuation.discoverServices = nil - } - } - } - - public override func onCharacteristicChanged( - gatt: Android.Bluetooth.Gatt, - characteristic: Android.Bluetooth.GattCharacteristic - ) { - let log = central?.log - log?("\(type(of: self)): \(#function)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - - guard let uuid = characteristic.getUUID().toString() else { - assertionFailure() - return - } - - guard let cache = state.cache[peripheral] else { - assertionFailure("Invalid cache for \(uuid)") - return - } - - let id = cache.identifier(for: characteristic) - - let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() - - guard let characteristicCache = cache.characteristics.values[id] else { - assertionFailure("Invalid identifier for \(uuid)") - return - } - - guard let notification = characteristicCache.notification else { - assertionFailure("Unexpected notification for \(uuid)") - return - } - - notification.yield(data) - } - } - } - - public override func onCharacteristicRead( - gatt: Android.Bluetooth.Gatt, - characteristic: Android.Bluetooth.GattCharacteristic, - status: Android.Bluetooth.Gatt.Status - ) { - let log = central?.log - let peripheral = Peripheral(gatt) - log?("\(type(of: self)): \(#function) \(peripheral) Status: \(status)") - - Task { - await central?.storage.update { state in - - switch status { - case .success: - let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() - state.cache[peripheral]?.continuation.readCharacteristic?.resume(returning: data) - default: - state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: status) - } - state.cache[peripheral]?.continuation.readCharacteristic = nil - } - } - } - - public override func onCharacteristicWrite( - gatt: Android.Bluetooth.Gatt, - characteristic: Android.Bluetooth.GattCharacteristic, - status: Android.Bluetooth.Gatt.Status - ) { - central?.log?("\(type(of: self)): \(#function)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - switch status { - case .success: - state.cache[peripheral]?.continuation.writeCharacteristic?.resume() - default: - state.cache[peripheral]?.continuation.writeCharacteristic?.resume(throwing: status) - } - state.cache[peripheral]?.continuation.writeCharacteristic = nil - } - } - } - - public override func onDescriptorRead( - gatt: Android.Bluetooth.Gatt, - descriptor: Android.Bluetooth.GattDescriptor, - status: Android.Bluetooth.Gatt.Status - ) { - let peripheral = Peripheral(gatt) - - guard let uuid = descriptor.getUUID().toString() else { - assertionFailure() - return - } - - central?.log?(" \(type(of: self)): \(#function) \(uuid)") - - Task { - await central?.storage.update { state in - - switch status { - case .success: - let data = descriptor.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() - state.cache[peripheral]?.continuation.readDescriptor?.resume(returning: data) - default: - state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: status) - } - state.cache[peripheral]?.continuation.readDescriptor = nil - } - } - } - - public override func onDescriptorWrite( - gatt: Android.Bluetooth.Gatt, - descriptor: Android.Bluetooth.GattDescriptor, - status: AndroidBluetoothGatt.Status - ) { - - let peripheral = Peripheral(gatt) - - guard let uuid = descriptor.getUUID().toString() else { - assertionFailure() - return - } - - central?.log?(" \(type(of: self)): \(#function) \(uuid)") - - Task { - await central?.storage.update { state in - switch status { - case .success: - state.cache[peripheral]?.continuation.writeDescriptor?.resume() - default: - state.cache[peripheral]?.continuation.writeDescriptor?.resume(throwing: status) - } - state.cache[peripheral]?.continuation.writeDescriptor = nil - } - } - } - - public override func onMtuChanged( - gatt: Android.Bluetooth.Gatt, - mtu: Int, - status: Android.Bluetooth.Gatt.Status - ) { - central?.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") - - let peripheral = Peripheral(gatt) - - guard let central = self.central else { - assertionFailure() - return - } - - let oldMTU = central.options.maximumTransmissionUnit - - Task { - - await central.storage.update { state in - - // get new MTU value - guard let newMTU = MaximumTransmissionUnit(rawValue: UInt16(mtu)) else { - assertionFailure("Invalid MTU \(mtu)") - return - } - - assert(newMTU <= oldMTU, "Invalid MTU: \(newMTU) > \(oldMTU)") - - // cache new MTU value - state.cache[peripheral]?.maximumTransmissionUnit = newMTU - - // pending MTU exchange - state.cache[peripheral]?.continuation.exchangeMTU?.resume(returning: newMTU) - state.cache[peripheral]?.continuation.exchangeMTU = nil - return - } - } - } - - public override func onPhyRead(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: AndroidBluetoothGatt.Status) { - - central?.log?("\(type(of: self)): \(#function)") - } - - public override func onPhyUpdate(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: AndroidBluetoothGatt.Status) { - - central?.log?("\(type(of: self)): \(#function)") - } - - public override func onReadRemoteRssi(gatt: Android.Bluetooth.Gatt, rssi: Int, status: Android.Bluetooth.Gatt.Status) { - - central?.log?("\(type(of: self)): \(#function) \(rssi) \(status)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - switch status { - case .success: - state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: rssi) - default: - state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: status) - } - state.cache[peripheral]?.continuation.readRemoteRSSI = nil - } - } - } - - public override func onReliableWriteCompleted(gatt: Android.Bluetooth.Gatt, status: AndroidBluetoothGatt.Status) { - - central?.log?("\(type(of: self)): \(#function)") - } - } -} - -internal extension AndroidCentral { - - actor Storage { - - var state = InternalState() - - func update(_ block: (inout InternalState) throws -> (T)) rethrows -> T { - return try block(&state) - } - } - - struct InternalState { - - fileprivate init() { } - - var cache = [Peripheral: Cache]() - - var scan = Scan() - - struct Scan { - - var peripherals = [Peripheral: Device]() - - var continuation: AsyncIndefiniteStream>.Continuation? - - fileprivate var callback: ScanCallback? - - struct Device { - - let scanData: ScanData - - let scanResult: Android.Bluetooth.LE.ScanResult - } - } - } - - /// GATT cache for a connection or peripheral. - struct Cache { - - fileprivate init( - gatt: Android.Bluetooth.Gatt, - callback: GattCallback - ) { - self.gatt = gatt - self.gattCallback = callback - } - - let gattCallback: GattCallback - - let gatt: Android.Bluetooth.Gatt - - fileprivate(set) var maximumTransmissionUnit: MaximumTransmissionUnit = .default - - var services = Services() - - var characteristics = Characteristics() - - var descriptors = Descriptors() - - var continuation = PeripheralContinuation() - - fileprivate func identifier(for attribute: T) -> AndroidCentral.AttributeID where T: AndroidCentralAttribute { - let peripheral = Peripheral(gatt) - let instanceID = attribute.getInstanceId() - guard let uuid = attribute.getUUID().toString() else { - assertionFailure() - return instanceID.description - } - return "\(peripheral.id)/\(T.attributeType)/\(instanceID)/\(uuid)" - } - - fileprivate func identifier( - for descriptor: Android.Bluetooth.GattDescriptor, - characteristic: Characteristic - ) -> AndroidCentral.AttributeID { - guard let uuid = descriptor.getUUID().toString() else { - fatalError() - } - return characteristic.id + "/Descriptor/\(uuid)" - } - - fileprivate mutating func update(_ newValues: [Android.Bluetooth.GattService]) -> [Service] { - // reset caches - services.values.removeAll(keepingCapacity: true) - characteristics.values.removeAll(keepingCapacity: true) - descriptors.values.removeAll(keepingCapacity: true) - // return mapped values - return newValues.map { - let id = identifier(for: $0) - let peripheral = Peripheral(gatt) - let uuid = BluetoothUUID(android: $0.getUUID()) - let isPrimary = $0.getType() == AndroidBluetoothGattService.ServiceType.primary - // cache value - services.values[id] = $0 - // map value - return Service( - id: id, - uuid: uuid, - peripheral: peripheral, - isPrimary: isPrimary - ) - } - } - - fileprivate mutating func update( - _ newValues: [Android.Bluetooth.GattCharacteristic], - for service: Service - ) -> [Characteristic] { - return newValues.map { - let id = identifier(for: $0) - let peripheral = Peripheral(gatt) - let uuid = BluetoothUUID(android: $0.getUUID()) - let properties = BitMaskOptionSet(rawValue: UInt8($0.getProperties())) - // cache - characteristics.values[id] = CharacteristicCache(object: $0) - // return Swift value - return Characteristic( - id: id, - uuid: uuid, - peripheral: peripheral, - properties: properties - ) - } - } - - fileprivate mutating func update( - _ newValues: [Android.Bluetooth.GattDescriptor], - for characteristic: Characteristic - ) -> [Descriptor] { - return newValues.map { - let id = identifier(for: $0, characteristic: characteristic) - let peripheral = Peripheral(gatt) - let uuid = BluetoothUUID(android: $0.getUUID()) - // cache object - descriptors.values[id] = $0 - // return swift value - return Descriptor( - id: id, - uuid: uuid, - peripheral: peripheral - ) - } - } - } - - struct PeripheralContinuation { - - var connect: CheckedContinuation? - - var exchangeMTU: CheckedContinuation? - - var discoverServices: CheckedContinuation<[Service], Error>? - - var discoverCharacteristics: CheckedContinuation<[Characteristic], Error>? - - var discoverDescriptors: CheckedContinuation<[Descriptor], Error>? - - var readCharacteristic: CheckedContinuation? - - var writeCharacteristic: CheckedContinuation? - - var readDescriptor: CheckedContinuation? - - var writeDescriptor: CheckedContinuation? - - var readRemoteRSSI: CheckedContinuation? - } - - struct Services { - - fileprivate(set) var values: [AndroidCentral.AttributeID: BluetoothGattService] = [:] - } - - struct Characteristics { - - fileprivate(set) var values: [AndroidCentral.AttributeID: CharacteristicCache] = [:] - } - - - struct Descriptors { - - fileprivate(set) var values: [AndroidCentral.AttributeID: BluetoothGattDescriptor] = [:] - } - - struct CharacteristicCache { - - let object: Android.Bluetooth.GattCharacteristic - - var notification: AsyncIndefiniteStream.Continuation? - } -} - -internal protocol AndroidCentralAttribute { - - static var attributeType: String { get } - - func getInstanceId() -> Int - - func getUUID() -> java_util.UUID -} - -extension Android.Bluetooth.GattService: AndroidCentralAttribute { - - static var attributeType: String { "Service" } -} - -extension Android.Bluetooth.GattCharacteristic: AndroidCentralAttribute { - - static var attributeType: String { "Characteristic" } -} - -// MARK: - Extensions - -fileprivate extension Peripheral { - - init(_ device: AndroidBluetoothDevice) { - self.init(id: device.address) - } - - init(_ gatt: AndroidBluetoothGatt) { - self.init(gatt.getDevice()) - } -} - -internal extension BluetoothUUID { - - init(android javaUUID: JavaUtil.UUID) { - - let uuid = UUID(uuidString: javaUUID.toString())! - if let value = UInt16(bluetooth: uuid) { - self = .bit16(value) - } else { - self = .bit128(UInt128(uuid: uuid)) - } - } -} - -internal extension ScanData where Peripheral == AndroidCentral.Peripheral, Advertisement == AndroidCentral.Advertisement { - - init(_ result: Android.Bluetooth.LE.ScanResult) { - - let peripheral = Peripheral(id: result.device.address) - let record = result.scanRecord - let advertisement = AndroidLowEnergyAdvertisementData(data: Data(record.bytes)) - let isConnectable: Bool - if AndroidBuild.Version.Sdk.sdkInt.rawValue >= AndroidBuild.VersionCodes.O { - isConnectable = result.isConnectable - } else { - isConnectable = true - } - self.init( - peripheral: peripheral, - date: Date(), - rssi: Double(result.rssi), - advertisementData: advertisement, - isConnectable: isConnectable - ) - } -} -*/ From b5266e9eae64a5b44638df5b2f285b81dadf2fd0 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:54:35 -0400 Subject: [PATCH 27/39] Add `AndroidCentralError.scanFailed` --- Sources/AndroidBluetooth/AndroidCentralError.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/AndroidBluetooth/AndroidCentralError.swift b/Sources/AndroidBluetooth/AndroidCentralError.swift index a396ffc..91875e3 100644 --- a/Sources/AndroidBluetooth/AndroidCentralError.swift +++ b/Sources/AndroidBluetooth/AndroidCentralError.swift @@ -16,4 +16,8 @@ public enum AndroidCentralError: Swift.Error { /// Unexpected null value. case nullValue(AnyKeyPath) + + case scanFailed(Int32) + + } From 83f9c27cc0e709b6e7900754a4c09a3c94c54c1e Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:55:02 -0400 Subject: [PATCH 28/39] Update `AndroidCentral.LowEnergyScanCallback` --- .../AndroidCentralCallback.swift | 105 +++++++++++------- .../AndroidCentralState.swift | 2 +- 2 files changed, 66 insertions(+), 41 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift index 0f35cf9..a9d6157 100644 --- a/Sources/AndroidBluetooth/AndroidCentralCallback.swift +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -22,58 +22,83 @@ extension AndroidCentral { weak var central: AndroidCentral? - /* - public override func onScanResult( - callbackType: Android.Bluetooth.LE.ScanCallbackType, - result: Android.Bluetooth.LE.ScanResult - ) { - - central?.log?("\(type(of: self)) \(#function) name: \(result.device.getName() ?? "") address: \(result.device.address)") - - let scanData = ScanData(result) - + init(central: AndroidCentral, environment: JNIEnvironment?) { + self.central = central + } + } +} + +@JavaImplementation("org.pureswift.bluetooth.le.ScanCallback") +extension AndroidCentral.LowEnergyScanCallback { + + @JavaMethod + func onScanResultSwift(_ error: Int32, _ result: AndroidBluetooth.ScanResult?) { + guard let central else { + return + } + central.log?("\(type(of: self)): \(#function) name: \(result.getDevice().getName() ?? "") address: \(result.getDevice().getAddress())") + guard let result, let scanData = try? ScanData(result) else { + assertionFailure() + return + } + Task { + await central.storage.update { state in + state.scan.continuation?.yield(scanData) + state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( + scanData: scanData, + scanResult: result + ) + } + } + } + + @JavaMethod + func onBatchScanResultsSwift(results: [AndroidBluetooth.ScanResult?]) { + guard let central else { + return + } + central.log?("\(type(of: self)): \(#function)") + for result in results { + guard let result, let scanData = try? ScanData(result) else { + assertionFailure() + return + } Task { - await central?.storage.update { state in + await central.storage.update { state in state.scan.continuation?.yield(scanData) - state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( + state.scan.peripherals[scanData.peripheral] = AndroidCentral.InternalState.Scan.Device( scanData: scanData, scanResult: result ) } } } + } + + @JavaMethod + func onScanFailedSwift(error: Int32) { - public override func onBatchScanResults(results: [Android.Bluetooth.LE.ScanResult]) { - - central?.log?("\(type(of: self)): \(#function)") - - for result in results { - - let scanData = ScanData(result) - - Task { - await central?.storage.update { state in - state.scan.continuation?.yield(scanData) - state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( - scanData: scanData, - scanResult: result - ) - } - } - } - } + central?.log?("\(type(of: self)): \(#function)") - public override func onScanFailed(error: AndroidBluetoothLowEnergyScanCallback.Error) { - - central?.log?("\(type(of: self)): \(#function)") - - Task { - await central?.storage.update { state in - state.scan.continuation?.finish(throwing: error) - } + // TODO: Map error codes + let error = AndroidCentralError.scanFailed(error) + + /* + static var SCAN_FAILED_ALREADY_STARTED + static var SCAN_FAILED_APPLICATION_REGISTRATION_FAILED + static var SCAN_FAILED_FEATURE_UNSUPPORTED + static var SCAN_FAILED_INTERNAL_ERROR + */ + + Task { + await central?.storage.update { state in + state.scan.continuation?.finish(throwing: error) } - }*/ + } } +} + +extension AndroidCentral { @JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") internal class GattCallback: AndroidBluetooth.BluetoothGattCallback { diff --git a/Sources/AndroidBluetooth/AndroidCentralState.swift b/Sources/AndroidBluetooth/AndroidCentralState.swift index 8e794b1..ea17982 100644 --- a/Sources/AndroidBluetooth/AndroidCentralState.swift +++ b/Sources/AndroidBluetooth/AndroidCentralState.swift @@ -66,7 +66,7 @@ internal extension AndroidCentral { let gatt: BluetoothGatt - fileprivate(set) var maximumTransmissionUnit: MaximumTransmissionUnit = .default + var maximumTransmissionUnit: MaximumTransmissionUnit = .default var services = Services() From 3723d7b25db6f53c199e8ea1ea0b317248f67c26 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 19:55:14 -0400 Subject: [PATCH 29/39] Update `AndroidCentral` --- Sources/AndroidBluetooth/AndroidCentral.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentral.swift b/Sources/AndroidBluetooth/AndroidCentral.swift index ca602f0..f71902e 100644 --- a/Sources/AndroidBluetooth/AndroidCentral.swift +++ b/Sources/AndroidBluetooth/AndroidCentral.swift @@ -17,9 +17,7 @@ import JavaLang import JavaUtil import AndroidOS import AndroidContent -import AndroidLooper -@AndroidMainActor public final class AndroidCentral: CentralManager { public typealias Advertisement = AndroidLowEnergyAdvertisementData @@ -42,7 +40,7 @@ public final class AndroidCentral: CentralManager { public let options: Options - private let storage = Storage() + internal let storage = Storage() // MARK: - Intialization From 7c55f32f2ed6fb3e006c9b173f72a62323ba4148 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 20:01:24 -0400 Subject: [PATCH 30/39] Update `AndroidCentral.LowEnergyScanCallback` --- Sources/AndroidBluetooth/AndroidCentralCallback.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift index a9d6157..386727d 100644 --- a/Sources/AndroidBluetooth/AndroidCentralCallback.swift +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -22,7 +22,11 @@ extension AndroidCentral { weak var central: AndroidCentral? - init(central: AndroidCentral, environment: JNIEnvironment?) { + @JavaMethod + @_nonoverride convenience init(environment: JNIEnvironment? = nil) + + convenience init(central: AndroidCentral, environment: JNIEnvironment? = nil) { + self.init(environment: environment) self.central = central } } @@ -36,15 +40,15 @@ extension AndroidCentral.LowEnergyScanCallback { guard let central else { return } - central.log?("\(type(of: self)): \(#function) name: \(result.getDevice().getName() ?? "") address: \(result.getDevice().getAddress())") guard let result, let scanData = try? ScanData(result) else { assertionFailure() return } + central.log?("\(type(of: self)): \(#function) name: \(result.getDevice().getName() ?? "") address: \(result.getDevice().getAddress())") Task { await central.storage.update { state in state.scan.continuation?.yield(scanData) - state.scan.peripherals[scanData.peripheral] = InternalState.Scan.Device( + state.scan.peripherals[scanData.peripheral] = AndroidCentral.InternalState.Scan.Device( scanData: scanData, scanResult: result ) From 9c40fd1aaa356e890618d7f3875fb2b4136e7c1d Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 20:19:11 -0400 Subject: [PATCH 31/39] Add `AndroidCentralError.gattStatus` --- Sources/AndroidBluetooth/AndroidCentralError.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralError.swift b/Sources/AndroidBluetooth/AndroidCentralError.swift index 91875e3..2b27809 100644 --- a/Sources/AndroidBluetooth/AndroidCentralError.swift +++ b/Sources/AndroidBluetooth/AndroidCentralError.swift @@ -19,5 +19,5 @@ public enum AndroidCentralError: Swift.Error { case scanFailed(Int32) - + case gattStatus(Int32) } From f19e5b5de29d7a7c3aaa009fa4c111f1d0c7266d Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 20:19:29 -0400 Subject: [PATCH 32/39] Fix `AndroidCentral.scan()` --- Sources/AndroidBluetooth/AndroidCentral.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentral.swift b/Sources/AndroidBluetooth/AndroidCentral.swift index f71902e..0fd1e21 100644 --- a/Sources/AndroidBluetooth/AndroidCentral.swift +++ b/Sources/AndroidBluetooth/AndroidCentral.swift @@ -78,9 +78,7 @@ public final class AndroidCentral: CentralManager { $0.scan.peripherals.removeAll() $0.scan.continuation = continuation } - let scanCallBack = ScanCallback() - // TODO: Implement callbacks - //scanCallBack.central = self + let scanCallBack = LowEnergyScanCallback(central: self) scanner.startScan(scanCallBack) } }) From 501a04d4263ebe46c60f0a7d1a558a7f67517a39 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 20:20:36 -0400 Subject: [PATCH 33/39] Update Central callbacks --- .../AndroidCentralCallback.swift | 128 ++++++++++-------- 1 file changed, 70 insertions(+), 58 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift index 386727d..040a609 100644 --- a/Sources/AndroidBluetooth/AndroidCentralCallback.swift +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -36,7 +36,7 @@ extension AndroidCentral { extension AndroidCentral.LowEnergyScanCallback { @JavaMethod - func onScanResultSwift(_ error: Int32, _ result: AndroidBluetooth.ScanResult?) { + func onScanResult(error: Int32, result: AndroidBluetooth.ScanResult?) { guard let central else { return } @@ -57,7 +57,7 @@ extension AndroidCentral.LowEnergyScanCallback { } @JavaMethod - func onBatchScanResultsSwift(results: [AndroidBluetooth.ScanResult?]) { + func onBatchScanResults(results: [AndroidBluetooth.ScanResult?]) { guard let central else { return } @@ -107,24 +107,26 @@ extension AndroidCentral { @JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") internal class GattCallback: AndroidBluetooth.BluetoothGattCallback { - private weak var central: AndroidCentral? + weak var central: AndroidCentral? - /* - convenience init(central: AndroidCentral) { - self.init(javaObject: nil) - bindNewJavaObject() - - self.central = central - } + @JavaMethod + @_nonoverride convenience init(environment: JNIEnvironment? = nil) - public required init(javaObject: jobject?) { - super.init(javaObject: javaObject) + convenience init(central: AndroidCentral, environment: JNIEnvironment? = nil) { + self.init(environment: environment) + self.central = central } - public override func onConnectionStateChange( - gatt: Android.Bluetooth.Gatt, - status: Android.Bluetooth.Gatt.Status, - newState: Android.Bluetooth.Device.State + } +} +@JavaImplementation("org.pureswift.bluetooth.BluetoothGattCallback") +extension AndroidCentral.GattCallback { + + @JavaMethod + public func onConnectionStateChange( + gatt: BluetoothGatt?, + status: Int32, + newState: Int32 //Android.Bluetooth.Device.State ) { let log = central?.log log?("\(type(of: self)): \(#function)") @@ -147,16 +149,17 @@ extension AndroidCentral { state.cache[peripheral] = nil default: log?("\(peripheral) Status Error") - state.cache[peripheral]?.continuation.connect?.resume(throwing: status) // throw `status` error + state.cache[peripheral]?.continuation.connect?.resume(throwing: AndroidCentralError.gattStatus(status)) state.cache[peripheral]?.continuation.connect = nil } } } } - public override func onServicesDiscovered( - gatt: Android.Bluetooth.Gatt, - status: Android.Bluetooth.Gatt.Status + @JavaMethod + public func onServicesDiscovered( + gatt: BluetoothGatt?, + status: Int32 ) { let log = central?.log let peripheral = Peripheral(gatt) @@ -173,16 +176,17 @@ extension AndroidCentral { } state.cache[peripheral]?.continuation.discoverServices?.resume(returning: services) default: - state.cache[peripheral]?.continuation.discoverServices?.resume(throwing: status) + state.cache[peripheral]?.continuation.discoverServices?.resume(throwing: AndroidCentralError.gattStatus(status)) } state.cache[peripheral]?.continuation.discoverServices = nil } } } - public override func onCharacteristicChanged( - gatt: Android.Bluetooth.Gatt, - characteristic: Android.Bluetooth.GattCharacteristic + @JavaMethod + public func onCharacteristicChanged( + gatt: BluetoothGatt?, + characteristic: BluetoothGattCharacteristic? ) { let log = central?.log log?("\(type(of: self)): \(#function)") @@ -192,7 +196,7 @@ extension AndroidCentral { Task { await central?.storage.update { state in - guard let uuid = characteristic.getUUID().toString() else { + guard let uuid = characteristic.getUuid().toString() else { assertionFailure() return } @@ -205,7 +209,7 @@ extension AndroidCentral { let id = cache.identifier(for: characteristic) let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? .init() guard let characteristicCache = cache.characteristics.values[id] else { assertionFailure("Invalid identifier for \(uuid)") @@ -222,10 +226,11 @@ extension AndroidCentral { } } - public override func onCharacteristicRead( - gatt: Android.Bluetooth.Gatt, - characteristic: Android.Bluetooth.GattCharacteristic, - status: Android.Bluetooth.Gatt.Status + @JavaMethod + public func onCharacteristicRead( + gatt: BluetoothGatt!, + characteristic: BluetoothGattCharacteristic!, + status: Int32 ) { let log = central?.log let peripheral = Peripheral(gatt) @@ -240,17 +245,18 @@ extension AndroidCentral { .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() state.cache[peripheral]?.continuation.readCharacteristic?.resume(returning: data) default: - state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: status) + state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) } state.cache[peripheral]?.continuation.readCharacteristic = nil } } } - public override func onCharacteristicWrite( - gatt: Android.Bluetooth.Gatt, - characteristic: Android.Bluetooth.GattCharacteristic, - status: Android.Bluetooth.Gatt.Status + @JavaMethod + public func onCharacteristicWrite( + gatt: BluetoothGatt!, + characteristic: BluetoothGattCharacteristic!, + status: Int32 ) { central?.log?("\(type(of: self)): \(#function)") @@ -262,21 +268,22 @@ extension AndroidCentral { case .success: state.cache[peripheral]?.continuation.writeCharacteristic?.resume() default: - state.cache[peripheral]?.continuation.writeCharacteristic?.resume(throwing: status) + state.cache[peripheral]?.continuation.writeCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) } state.cache[peripheral]?.continuation.writeCharacteristic = nil } } } - public override func onDescriptorRead( - gatt: Android.Bluetooth.Gatt, - descriptor: Android.Bluetooth.GattDescriptor, - status: Android.Bluetooth.Gatt.Status + @JavaMethod + public func onDescriptorRead( + gatt: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int32 ) { let peripheral = Peripheral(gatt) - guard let uuid = descriptor.getUUID().toString() else { + guard let uuid = descriptor.getUuid().toString() else { assertionFailure() return } @@ -292,22 +299,23 @@ extension AndroidCentral { .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() state.cache[peripheral]?.continuation.readDescriptor?.resume(returning: data) default: - state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: status) + state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) } state.cache[peripheral]?.continuation.readDescriptor = nil } } } - public override func onDescriptorWrite( - gatt: Android.Bluetooth.Gatt, - descriptor: Android.Bluetooth.GattDescriptor, - status: AndroidBluetoothGatt.Status + @JavaMethod + public func onDescriptorWrite( + gatt: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int32 ) { let peripheral = Peripheral(gatt) - guard let uuid = descriptor.getUUID().toString() else { + guard let uuid = descriptor.getUuid().toString() else { assertionFailure() return } @@ -320,17 +328,18 @@ extension AndroidCentral { case .success: state.cache[peripheral]?.continuation.writeDescriptor?.resume() default: - state.cache[peripheral]?.continuation.writeDescriptor?.resume(throwing: status) + state.cache[peripheral]?.continuation.writeDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) } state.cache[peripheral]?.continuation.writeDescriptor = nil } } } - public override func onMtuChanged( - gatt: Android.Bluetooth.Gatt, + @JavaMethod + public func onMtuChanged( + gatt: BluetoothGatt, mtu: Int, - status: Android.Bluetooth.Gatt.Status + status: Int32 ) { central?.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") @@ -366,17 +375,20 @@ extension AndroidCentral { } } - public override func onPhyRead(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: AndroidBluetoothGatt.Status) { + @JavaMethod + public func onPhyRead(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { central?.log?("\(type(of: self)): \(#function)") } - public override func onPhyUpdate(gatt: Android.Bluetooth.Gatt, txPhy: Android.Bluetooth.Gatt.TxPhy, rxPhy: Android.Bluetooth.Gatt.RxPhy, status: AndroidBluetoothGatt.Status) { + @JavaMethod + public func onPhyUpdate(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { central?.log?("\(type(of: self)): \(#function)") } - public override func onReadRemoteRssi(gatt: Android.Bluetooth.Gatt, rssi: Int, status: Android.Bluetooth.Gatt.Status) { + @JavaMethod + public func onReadRemoteRssi(gatt: BluetoothGatt, rssi: Int32, status: Int32) { central?.log?("\(type(of: self)): \(#function) \(rssi) \(status)") @@ -388,16 +400,16 @@ extension AndroidCentral { case .success: state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: rssi) default: - state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: status) + state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: AndroidCentralError.gattStatus(status)) } state.cache[peripheral]?.continuation.readRemoteRSSI = nil } } } - public override func onReliableWriteCompleted(gatt: Android.Bluetooth.Gatt, status: AndroidBluetoothGatt.Status) { + @JavaMethod + public override func onReliableWriteCompleted(gatt: BluetoothGatt, status: Int32) { central?.log?("\(type(of: self)): \(#function)") - }*/ - } + } } From 48b765667faff44845b3c695d7daac4a5ed4db6d Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 20:55:57 -0400 Subject: [PATCH 34/39] Add `BluetoothGatt.Status` --- .../AndroidCentralError.swift | 2 +- .../BluetoothGattStatus.swift | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 Sources/AndroidBluetooth/BluetoothGattStatus.swift diff --git a/Sources/AndroidBluetooth/AndroidCentralError.swift b/Sources/AndroidBluetooth/AndroidCentralError.swift index 2b27809..abde769 100644 --- a/Sources/AndroidBluetooth/AndroidCentralError.swift +++ b/Sources/AndroidBluetooth/AndroidCentralError.swift @@ -19,5 +19,5 @@ public enum AndroidCentralError: Swift.Error { case scanFailed(Int32) - case gattStatus(Int32) + case gattStatus(BluetoothGatt.Status) } diff --git a/Sources/AndroidBluetooth/BluetoothGattStatus.swift b/Sources/AndroidBluetooth/BluetoothGattStatus.swift new file mode 100644 index 0000000..a01fc43 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothGattStatus.swift @@ -0,0 +1,83 @@ +// +// BluetoothGattStatus.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +import JavaKit + +public extension BluetoothGatt { + + /// Bluetooth Gatt Status + struct Status: RawRepresentable, Equatable, Hashable, Sendable { + + public let rawValue: Int32 + + public init(rawValue: Int32) { + self.rawValue = rawValue + } + + private init(_ raw: Int32) { + self.init(rawValue: raw) + } + } +} + +internal extension BluetoothGatt.Status { + + static let javaClass = try! JavaClass() +} + +public extension BluetoothGatt.Status { + + /** + * A remote device connection is congested. + */ + static let connectionCongested = BluetoothGatt.Status(javaClass.GATT_CONNECTION_CONGESTED) + + /** + * A GATT operation failed, errors other than the above + */ + static let failure = BluetoothGatt.Status(javaClass.GATT_FAILURE) + + /** + * Insufficient authentication for a given operation + */ + static let insufficientAuthentication = BluetoothGatt.Status(javaClass.GATT_INSUFFICIENT_AUTHENTICATION) + + /** + * Insufficient encryption for a given operation + */ + static let insufficientEncryption = BluetoothGatt.Status(javaClass.GATT_INSUFFICIENT_ENCRYPTION) + + /** + * A write operation exceeds the maximum length of the attribute + */ + static let invalidAttibuteLength = BluetoothGatt.Status(javaClass.GATT_INVALID_ATTRIBUTE_LENGTH) + + /** + * A read or write operation was requested with an invalid offset + */ + static let invalidOffset = BluetoothGatt.Status(javaClass.GATT_INVALID_OFFSET) + + /** + * GATT read operation is not permitted + */ + static let readNotPermitted = BluetoothGatt.Status(javaClass.GATT_READ_NOT_PERMITTED) + + /** + * The given request is not supported + */ + static let requestNotSupported = BluetoothGatt.Status(javaClass.GATT_REQUEST_NOT_SUPPORTED) + + /** + * A GATT operation completed successfully + */ + static let success = BluetoothGatt.Status(javaClass.GATT_SUCCESS) + + /** + * GATT write operation is not permitted + */ + static let writeNotPermitted = BluetoothGatt.Status(javaClass.GATT_WRITE_NOT_PERMITTED) +} From f7d86ee148b989febca7e7916c46a033d4f20142 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 20:56:06 -0400 Subject: [PATCH 35/39] Rename file --- ...droidBluetoothServiceType.swift => BluetoothServiceType.swift} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Sources/AndroidBluetooth/{AndroidBluetoothServiceType.swift => BluetoothServiceType.swift} (100%) diff --git a/Sources/AndroidBluetooth/AndroidBluetoothServiceType.swift b/Sources/AndroidBluetooth/BluetoothServiceType.swift similarity index 100% rename from Sources/AndroidBluetooth/AndroidBluetoothServiceType.swift rename to Sources/AndroidBluetooth/BluetoothServiceType.swift From bb46879fbefe3c4cc375f94cdbb1f3fbbfd14d8a Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 21:08:23 -0400 Subject: [PATCH 36/39] Add `BluetoothConnectionState` --- .../BluetoothConnectionState.swift | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Sources/AndroidBluetooth/BluetoothConnectionState.swift diff --git a/Sources/AndroidBluetooth/BluetoothConnectionState.swift b/Sources/AndroidBluetooth/BluetoothConnectionState.swift new file mode 100644 index 0000000..ee9fb40 --- /dev/null +++ b/Sources/AndroidBluetooth/BluetoothConnectionState.swift @@ -0,0 +1,51 @@ +// +// BluetoothConnectionState.swift +// AndroidBluetooth +// +// Created by Alsey Coleman Miller on 7/13/25. +// + +import JavaKit + +/// Connection State +public enum BluetoothConnectionState: Equatable, Hashable, Sendable, CaseIterable { + + /// The profile is in connected state + case connected + + case connecting + + case disconnecting + + case disconnected +} + +internal extension BluetoothConnectionState { + + static let javaClass = try! JavaClass() +} + +// MARK: - RawRepresentable + +extension BluetoothConnectionState: RawRepresentable { + + public init?(rawValue: Int32) { + guard let value = Self.allCases.first(where: { $0.rawValue == rawValue }) else { + return nil + } + self = value + } + + public var rawValue: Int32 { + switch self { + case .connected: + Self.javaClass.STATE_CONNECTED + case .connecting: + Self.javaClass.STATE_CONNECTING + case .disconnecting: + Self.javaClass.STATE_DISCONNECTING + case .disconnected: + Self.javaClass.STATE_DISCONNECTED + } + } +} From 8610df4ca7dfa5bcbd737bee36fb1c5100f4b878 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 21:09:06 -0400 Subject: [PATCH 37/39] Fix `AndroidCentral.GattCallback.onConnectionStateChange()` --- .../AndroidCentralCallback.swift | 529 +++++++++--------- 1 file changed, 269 insertions(+), 260 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift index 040a609..1e34bae 100644 --- a/Sources/AndroidBluetooth/AndroidCentralCallback.swift +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -102,314 +102,323 @@ extension AndroidCentral.LowEnergyScanCallback { } } -extension AndroidCentral { +@JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") +class GattCallback: AndroidBluetooth.BluetoothGattCallback { - @JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") - internal class GattCallback: AndroidBluetooth.BluetoothGattCallback { - - weak var central: AndroidCentral? - - @JavaMethod - @_nonoverride convenience init(environment: JNIEnvironment? = nil) - - convenience init(central: AndroidCentral, environment: JNIEnvironment? = nil) { - self.init(environment: environment) - self.central = central - } - + weak var central: AndroidCentral? + + @JavaMethod + @_nonoverride convenience init(environment: JNIEnvironment? = nil) + + convenience init(central: AndroidCentral, environment: JNIEnvironment? = nil) { + self.init(environment: environment) + self.central = central } } + @JavaImplementation("org.pureswift.bluetooth.BluetoothGattCallback") -extension AndroidCentral.GattCallback { +extension GattCallback { - @JavaMethod - public func onConnectionStateChange( - gatt: BluetoothGatt?, - status: Int32, - newState: Int32 //Android.Bluetooth.Device.State - ) { - let log = central?.log - log?("\(type(of: self)): \(#function)") - log?("Status: \(status) - newState: \(newState)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - switch (status, newState) { - case (.success, .connected): - log?("\(peripheral) Connected") - // if we are expecting a new connection - if state.cache[peripheral]?.continuation.connect != nil { - state.cache[peripheral]?.continuation.connect?.resume() - state.cache[peripheral]?.continuation.connect = nil - } - case (.success, .disconnected): - log?("\(peripheral) Disconnected") - state.cache[peripheral] = nil - default: - log?("\(peripheral) Status Error") - state.cache[peripheral]?.continuation.connect?.resume(throwing: AndroidCentralError.gattStatus(status)) + /** + Callback indicating when GATT client has connected/disconnected to/from a remote GATT server. + + Parameters + - gatt BluetoothGatt: GATT client + - status int: Status of the connect or disconnect operation. BluetoothGatt.GATT_SUCCESS if the operation succeeds. + - newState int: Returns the new connection state. Can be one of BluetoothProfile.STATE_DISCONNECTED or BluetoothProfile.STATE_CONNECTED + */ + @JavaMethod + func onConnectionStateChange( + gatt: BluetoothGatt?, + status: Int32, + newState: Int32 + ) { + let log = central?.log + let status = BluetoothGatt.Status(rawValue: status) + guard let central, + let gatt, + let newState = BluetoothConnectionState(rawValue: newState) else { + assertionFailure() + return + } + log?("\(type(of: self)): \(#function) \(status) \(newState)") + let peripheral = Peripheral(gatt) + Task { + await central.storage.update { state in + switch (status, newState) { + case (.success, .connected): + log?("\(peripheral) Connected") + // if we are expecting a new connection + if state.cache[peripheral]?.continuation.connect != nil { + state.cache[peripheral]?.continuation.connect?.resume() state.cache[peripheral]?.continuation.connect = nil } + case (.success, .disconnected): + log?("\(peripheral) Disconnected") + state.cache[peripheral] = nil + default: + log?("\(peripheral) Status Error") + state.cache[peripheral]?.continuation.connect?.resume(throwing: AndroidCentralError.gattStatus(status)) + state.cache[peripheral]?.continuation.connect = nil } } } + } + /* + @JavaMethod + public func onServicesDiscovered( + gatt: BluetoothGatt?, + status: Int32 + ) { + let log = central?.log + let peripheral = Peripheral(gatt) + log?("\(type(of: self)): \(#function) Status: \(status)") - @JavaMethod - public func onServicesDiscovered( - gatt: BluetoothGatt?, - status: Int32 - ) { - let log = central?.log - let peripheral = Peripheral(gatt) - log?("\(type(of: self)): \(#function) Status: \(status)") - - Task { - await central?.storage.update { state in - // success discovering - switch status { - case .success: - guard let services = state.cache[peripheral]?.update(gatt.services) else { - assertionFailure() - return - } - state.cache[peripheral]?.continuation.discoverServices?.resume(returning: services) - default: - state.cache[peripheral]?.continuation.discoverServices?.resume(throwing: AndroidCentralError.gattStatus(status)) + Task { + await central?.storage.update { state in + // success discovering + switch status { + case .success: + guard let services = state.cache[peripheral]?.update(gatt.services) else { + assertionFailure() + return } - state.cache[peripheral]?.continuation.discoverServices = nil + state.cache[peripheral]?.continuation.discoverServices?.resume(returning: services) + default: + state.cache[peripheral]?.continuation.discoverServices?.resume(throwing: AndroidCentralError.gattStatus(status)) } + state.cache[peripheral]?.continuation.discoverServices = nil } } + } + + @JavaMethod + public func onCharacteristicChanged( + gatt: BluetoothGatt?, + characteristic: BluetoothGattCharacteristic? + ) { + let log = central?.log + log?("\(type(of: self)): \(#function)") - @JavaMethod - public func onCharacteristicChanged( - gatt: BluetoothGatt?, - characteristic: BluetoothGattCharacteristic? - ) { - let log = central?.log - log?("\(type(of: self)): \(#function)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - - guard let uuid = characteristic.getUuid().toString() else { - assertionFailure() - return - } - - guard let cache = state.cache[peripheral] else { - assertionFailure("Invalid cache for \(uuid)") - return - } - - let id = cache.identifier(for: characteristic) + let peripheral = Peripheral(gatt) - let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? .init() - - guard let characteristicCache = cache.characteristics.values[id] else { - assertionFailure("Invalid identifier for \(uuid)") - return - } - - guard let notification = characteristicCache.notification else { - assertionFailure("Unexpected notification for \(uuid)") - return - } - - notification.yield(data) + Task { + await central?.storage.update { state in + + guard let uuid = characteristic.getUuid().toString() else { + assertionFailure() + return } + + guard let cache = state.cache[peripheral] else { + assertionFailure("Invalid cache for \(uuid)") + return + } + + let id = cache.identifier(for: characteristic) + + let data = characteristic.getValue() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? .init() + + guard let characteristicCache = cache.characteristics.values[id] else { + assertionFailure("Invalid identifier for \(uuid)") + return + } + + guard let notification = characteristicCache.notification else { + assertionFailure("Unexpected notification for \(uuid)") + return + } + + notification.yield(data) } } + } + + @JavaMethod + public func onCharacteristicRead( + gatt: BluetoothGatt!, + characteristic: BluetoothGattCharacteristic!, + status: Int32 + ) { + let log = central?.log + let peripheral = Peripheral(gatt) + log?("\(type(of: self)): \(#function) \(peripheral) Status: \(status)") - @JavaMethod - public func onCharacteristicRead( - gatt: BluetoothGatt!, - characteristic: BluetoothGattCharacteristic!, - status: Int32 - ) { - let log = central?.log - let peripheral = Peripheral(gatt) - log?("\(type(of: self)): \(#function) \(peripheral) Status: \(status)") - - Task { - await central?.storage.update { state in - - switch status { - case .success: - let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() - state.cache[peripheral]?.continuation.readCharacteristic?.resume(returning: data) - default: - state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) - } - state.cache[peripheral]?.continuation.readCharacteristic = nil + Task { + await central?.storage.update { state in + + switch status { + case .success: + let data = characteristic.getValue() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + state.cache[peripheral]?.continuation.readCharacteristic?.resume(returning: data) + default: + state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) } + state.cache[peripheral]?.continuation.readCharacteristic = nil } } + } + + @JavaMethod + public func onCharacteristicWrite( + gatt: BluetoothGatt!, + characteristic: BluetoothGattCharacteristic!, + status: Int32 + ) { + central?.log?("\(type(of: self)): \(#function)") - @JavaMethod - public func onCharacteristicWrite( - gatt: BluetoothGatt!, - characteristic: BluetoothGattCharacteristic!, - status: Int32 - ) { - central?.log?("\(type(of: self)): \(#function)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - switch status { - case .success: - state.cache[peripheral]?.continuation.writeCharacteristic?.resume() - default: - state.cache[peripheral]?.continuation.writeCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) - } - state.cache[peripheral]?.continuation.writeCharacteristic = nil + let peripheral = Peripheral(gatt) + + Task { + await central?.storage.update { state in + switch status { + case .success: + state.cache[peripheral]?.continuation.writeCharacteristic?.resume() + default: + state.cache[peripheral]?.continuation.writeCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) } + state.cache[peripheral]?.continuation.writeCharacteristic = nil } } + } + + @JavaMethod + public func onDescriptorRead( + gatt: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int32 + ) { + let peripheral = Peripheral(gatt) - @JavaMethod - public func onDescriptorRead( - gatt: BluetoothGatt, - descriptor: BluetoothGattDescriptor, - status: Int32 - ) { - let peripheral = Peripheral(gatt) - - guard let uuid = descriptor.getUuid().toString() else { - assertionFailure() - return - } - - central?.log?(" \(type(of: self)): \(#function) \(uuid)") - - Task { - await central?.storage.update { state in - - switch status { - case .success: - let data = descriptor.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() - state.cache[peripheral]?.continuation.readDescriptor?.resume(returning: data) - default: - state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) - } - state.cache[peripheral]?.continuation.readDescriptor = nil + guard let uuid = descriptor.getUuid().toString() else { + assertionFailure() + return + } + + central?.log?(" \(type(of: self)): \(#function) \(uuid)") + + Task { + await central?.storage.update { state in + + switch status { + case .success: + let data = descriptor.getValue() + .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + state.cache[peripheral]?.continuation.readDescriptor?.resume(returning: data) + default: + state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) } + state.cache[peripheral]?.continuation.readDescriptor = nil } } + } + + @JavaMethod + public func onDescriptorWrite( + gatt: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int32 + ) { - @JavaMethod - public func onDescriptorWrite( - gatt: BluetoothGatt, - descriptor: BluetoothGattDescriptor, - status: Int32 - ) { - - let peripheral = Peripheral(gatt) - - guard let uuid = descriptor.getUuid().toString() else { - assertionFailure() - return - } - - central?.log?(" \(type(of: self)): \(#function) \(uuid)") - - Task { - await central?.storage.update { state in - switch status { - case .success: - state.cache[peripheral]?.continuation.writeDescriptor?.resume() - default: - state.cache[peripheral]?.continuation.writeDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) - } - state.cache[peripheral]?.continuation.writeDescriptor = nil + let peripheral = Peripheral(gatt) + + guard let uuid = descriptor.getUuid().toString() else { + assertionFailure() + return + } + + central?.log?(" \(type(of: self)): \(#function) \(uuid)") + + Task { + await central?.storage.update { state in + switch status { + case .success: + state.cache[peripheral]?.continuation.writeDescriptor?.resume() + default: + state.cache[peripheral]?.continuation.writeDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) } + state.cache[peripheral]?.continuation.writeDescriptor = nil } } + } + + @JavaMethod + public func onMtuChanged( + gatt: BluetoothGatt, + mtu: Int, + status: Int32 + ) { + central?.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") - @JavaMethod - public func onMtuChanged( - gatt: BluetoothGatt, - mtu: Int, - status: Int32 - ) { - central?.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") - - let peripheral = Peripheral(gatt) - - guard let central = self.central else { - assertionFailure() - return - } - - let oldMTU = central.options.maximumTransmissionUnit + let peripheral = Peripheral(gatt) + + guard let central = self.central else { + assertionFailure() + return + } + + let oldMTU = central.options.maximumTransmissionUnit + + Task { - Task { + await central.storage.update { state in - await central.storage.update { state in - - // get new MTU value - guard let newMTU = MaximumTransmissionUnit(rawValue: UInt16(mtu)) else { - assertionFailure("Invalid MTU \(mtu)") - return - } - - assert(newMTU <= oldMTU, "Invalid MTU: \(newMTU) > \(oldMTU)") - - // cache new MTU value - state.cache[peripheral]?.maximumTransmissionUnit = newMTU - - // pending MTU exchange - state.cache[peripheral]?.continuation.exchangeMTU?.resume(returning: newMTU) - state.cache[peripheral]?.continuation.exchangeMTU = nil + // get new MTU value + guard let newMTU = MaximumTransmissionUnit(rawValue: UInt16(mtu)) else { + assertionFailure("Invalid MTU \(mtu)") return } + + assert(newMTU <= oldMTU, "Invalid MTU: \(newMTU) > \(oldMTU)") + + // cache new MTU value + state.cache[peripheral]?.maximumTransmissionUnit = newMTU + + // pending MTU exchange + state.cache[peripheral]?.continuation.exchangeMTU?.resume(returning: newMTU) + state.cache[peripheral]?.continuation.exchangeMTU = nil + return } } + } + + @JavaMethod + public func onPhyRead(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { - @JavaMethod - public func onPhyRead(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { - - central?.log?("\(type(of: self)): \(#function)") - } + central?.log?("\(type(of: self)): \(#function)") + } + + @JavaMethod + public func onPhyUpdate(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { - @JavaMethod - public func onPhyUpdate(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { - - central?.log?("\(type(of: self)): \(#function)") - } + central?.log?("\(type(of: self)): \(#function)") + } + + @JavaMethod + public func onReadRemoteRssi(gatt: BluetoothGatt, rssi: Int32, status: Int32) { - @JavaMethod - public func onReadRemoteRssi(gatt: BluetoothGatt, rssi: Int32, status: Int32) { - - central?.log?("\(type(of: self)): \(#function) \(rssi) \(status)") - - let peripheral = Peripheral(gatt) - - Task { - await central?.storage.update { state in - switch status { - case .success: - state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: rssi) - default: - state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: AndroidCentralError.gattStatus(status)) - } - state.cache[peripheral]?.continuation.readRemoteRSSI = nil + central?.log?("\(type(of: self)): \(#function) \(rssi) \(status)") + + let peripheral = Peripheral(gatt) + + Task { + await central?.storage.update { state in + switch status { + case .success: + state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: rssi) + default: + state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: AndroidCentralError.gattStatus(status)) } + state.cache[peripheral]?.continuation.readRemoteRSSI = nil } } + } + + @JavaMethod + public override func onReliableWriteCompleted(gatt: BluetoothGatt, status: Int32) { - @JavaMethod - public override func onReliableWriteCompleted(gatt: BluetoothGatt, status: Int32) { - - central?.log?("\(type(of: self)): \(#function)") - } + central?.log?("\(type(of: self)): \(#function)") + }*/ } From 8ad2a2bed3f1d155e5eaa6c86f59feab0df9b193 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 21:15:13 -0400 Subject: [PATCH 38/39] Fix `AndroidCentral.GattCallback.onServicesDiscovered()` --- .../AndroidCentralCallback.swift | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift index 1e34bae..b8e3871 100644 --- a/Sources/AndroidBluetooth/AndroidCentralCallback.swift +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -102,22 +102,25 @@ extension AndroidCentral.LowEnergyScanCallback { } } -@JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") -class GattCallback: AndroidBluetooth.BluetoothGattCallback { - - weak var central: AndroidCentral? - - @JavaMethod - @_nonoverride convenience init(environment: JNIEnvironment? = nil) +extension AndroidCentral { - convenience init(central: AndroidCentral, environment: JNIEnvironment? = nil) { - self.init(environment: environment) - self.central = central + @JavaClass("org.pureswift.bluetooth.BluetoothGattCallback") + class GattCallback: AndroidBluetooth.BluetoothGattCallback { + + weak var central: AndroidCentral? + + @JavaMethod + @_nonoverride convenience init(environment: JNIEnvironment? = nil) + + convenience init(central: AndroidCentral, environment: JNIEnvironment? = nil) { + self.init(environment: environment) + self.central = central + } } } @JavaImplementation("org.pureswift.bluetooth.BluetoothGattCallback") -extension GattCallback { +extension AndroidCentral.GattCallback { /** Callback indicating when GATT client has connected/disconnected to/from a remote GATT server. @@ -164,22 +167,28 @@ extension GattCallback { } } } - /* + @JavaMethod public func onServicesDiscovered( gatt: BluetoothGatt?, status: Int32 ) { - let log = central?.log + guard let central, let gatt else { + assertionFailure() + return + } + let log = central.log let peripheral = Peripheral(gatt) + let status = BluetoothGatt.Status(rawValue: status) log?("\(type(of: self)): \(#function) Status: \(status)") Task { - await central?.storage.update { state in + await central.storage.update { state in // success discovering switch status { case .success: - guard let services = state.cache[peripheral]?.update(gatt.services) else { + guard let javaServices = gatt.getServices()?.toArray().map({ $0!.as(BluetoothGattService.self)! }), + let services = state.cache[peripheral]?.update(javaServices) else { assertionFailure() return } @@ -191,7 +200,7 @@ extension GattCallback { } } } - + /* @JavaMethod public func onCharacteristicChanged( gatt: BluetoothGatt?, From c562eadcea36c383193396e6b11623888dac0951 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Sun, 13 Jul 2025 21:33:03 -0400 Subject: [PATCH 39/39] Fix `AndroidCentral.GattCallback` --- .../AndroidCentralCallback.swift | 146 +++++++++++------- 1 file changed, 87 insertions(+), 59 deletions(-) diff --git a/Sources/AndroidBluetooth/AndroidCentralCallback.swift b/Sources/AndroidBluetooth/AndroidCentralCallback.swift index b8e3871..a9e6e40 100644 --- a/Sources/AndroidBluetooth/AndroidCentralCallback.swift +++ b/Sources/AndroidBluetooth/AndroidCentralCallback.swift @@ -169,7 +169,7 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onServicesDiscovered( + func onServicesDiscovered( gatt: BluetoothGatt?, status: Int32 ) { @@ -200,21 +200,25 @@ extension AndroidCentral.GattCallback { } } } - /* + @JavaMethod - public func onCharacteristicChanged( + func onCharacteristicChanged( gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic? ) { - let log = central?.log + guard let central, let gatt, let characteristic else { + assertionFailure() + return + } + let log = central.log log?("\(type(of: self)): \(#function)") let peripheral = Peripheral(gatt) Task { - await central?.storage.update { state in + await central.storage.update { state in - guard let uuid = characteristic.getUuid().toString() else { + guard let uuid = characteristic.getUuid()?.toString() else { assertionFailure() return } @@ -226,8 +230,10 @@ extension AndroidCentral.GattCallback { let id = cache.identifier(for: characteristic) - let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? .init() + let bytes = characteristic.getValue() + + // TODO: Replace usage of Foundation.Data with byte array to prevent copying + let data = Data(unsafeBitCast(bytes, to: [UInt8].self)) guard let characteristicCache = cache.characteristics.values[id] else { assertionFailure("Invalid identifier for \(uuid)") @@ -245,22 +251,27 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onCharacteristicRead( - gatt: BluetoothGatt!, - characteristic: BluetoothGattCharacteristic!, + func onCharacteristicRead( + gatt: BluetoothGatt?, + characteristic: BluetoothGattCharacteristic?, status: Int32 ) { - let log = central?.log + guard let central, let gatt, let characteristic else { + assertionFailure() + return + } + let log = central.log let peripheral = Peripheral(gatt) + let status = BluetoothGatt.Status(rawValue: status) log?("\(type(of: self)): \(#function) \(peripheral) Status: \(status)") Task { - await central?.storage.update { state in + await central.storage.update { state in switch status { case .success: - let data = characteristic.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + let bytes = characteristic.getValue() + let data = Data(unsafeBitCast(bytes, to: [UInt8].self)) state.cache[peripheral]?.continuation.readCharacteristic?.resume(returning: data) default: state.cache[peripheral]?.continuation.readCharacteristic?.resume(throwing: AndroidCentralError.gattStatus(status)) @@ -271,17 +282,21 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onCharacteristicWrite( - gatt: BluetoothGatt!, - characteristic: BluetoothGattCharacteristic!, + func onCharacteristicWrite( + gatt: BluetoothGatt?, + characteristic: BluetoothGattCharacteristic?, status: Int32 ) { - central?.log?("\(type(of: self)): \(#function)") - + guard let central, let gatt else { + assertionFailure() + return + } + let status = BluetoothGatt.Status(rawValue: status) + central.log?("\(type(of: self)): \(#function)") let peripheral = Peripheral(gatt) Task { - await central?.storage.update { state in + await central.storage.update { state in switch status { case .success: state.cache[peripheral]?.continuation.writeCharacteristic?.resume() @@ -294,27 +309,32 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onDescriptorRead( - gatt: BluetoothGatt, - descriptor: BluetoothGattDescriptor, + func onDescriptorRead( + gatt: BluetoothGatt?, + descriptor: BluetoothGattDescriptor?, status: Int32 ) { + guard let central, let gatt, let descriptor else { + assertionFailure() + return + } + let status = BluetoothGatt.Status(rawValue: status) let peripheral = Peripheral(gatt) - guard let uuid = descriptor.getUuid().toString() else { + guard let uuid = descriptor.getUuid()?.toString() else { assertionFailure() return } - central?.log?(" \(type(of: self)): \(#function) \(uuid)") + central.log?(" \(type(of: self)): \(#function) \(uuid)") Task { - await central?.storage.update { state in + await central.storage.update { state in switch status { case .success: - let data = descriptor.getValue() - .map { Data(unsafeBitCast($0, to: [UInt8].self)) } ?? Data() + let bytes = descriptor.getValue() + let data = Data(unsafeBitCast(bytes, to: [UInt8].self)) state.cache[peripheral]?.continuation.readDescriptor?.resume(returning: data) default: state.cache[peripheral]?.continuation.readDescriptor?.resume(throwing: AndroidCentralError.gattStatus(status)) @@ -325,23 +345,27 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onDescriptorWrite( - gatt: BluetoothGatt, - descriptor: BluetoothGattDescriptor, + func onDescriptorWrite( + gatt: BluetoothGatt?, + descriptor: BluetoothGattDescriptor?, status: Int32 ) { - + guard let central, let gatt, let descriptor else { + assertionFailure() + return + } + let status = BluetoothGatt.Status(rawValue: status) let peripheral = Peripheral(gatt) - guard let uuid = descriptor.getUuid().toString() else { + guard let uuid = descriptor.getUuid()?.toString() else { assertionFailure() return } - central?.log?(" \(type(of: self)): \(#function) \(uuid)") + central.log?(" \(type(of: self)): \(#function) \(uuid)") Task { - await central?.storage.update { state in + await central.storage.update { state in switch status { case .success: state.cache[peripheral]?.continuation.writeDescriptor?.resume() @@ -354,19 +378,19 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onMtuChanged( - gatt: BluetoothGatt, - mtu: Int, + func onMtuChanged( + gatt: BluetoothGatt?, + mtu: Int32, status: Int32 ) { - central?.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") - - let peripheral = Peripheral(gatt) - - guard let central = self.central else { + guard let central, let gatt else { assertionFailure() return } + let status = BluetoothGatt.Status(rawValue: status) + central.log?("\(type(of: self)): \(#function) Peripheral \(Peripheral(gatt)) MTU \(mtu) Status \(status)") + + let peripheral = Peripheral(gatt) let oldMTU = central.options.maximumTransmissionUnit @@ -394,29 +418,33 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public func onPhyRead(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { - - central?.log?("\(type(of: self)): \(#function)") + func onPhyRead(gatt: BluetoothGatt?, txPhy: Int32, rxPhy: Int32, status: Int32) { + let status = BluetoothGatt.Status(rawValue: status) + central?.log?("\(type(of: self)): \(#function) \(status)") } @JavaMethod - public func onPhyUpdate(gatt: BluetoothGatt, txPhy: Int32, rxPhy: Int32, status: Int32) { - - central?.log?("\(type(of: self)): \(#function)") + func onPhyUpdate(gatt: BluetoothGatt?, txPhy: Int32, rxPhy: Int32, status: Int32) { + let status = BluetoothGatt.Status(rawValue: status) + central?.log?("\(type(of: self)): \(#function) \(status)") } @JavaMethod - public func onReadRemoteRssi(gatt: BluetoothGatt, rssi: Int32, status: Int32) { - - central?.log?("\(type(of: self)): \(#function) \(rssi) \(status)") + func onReadRemoteRssi(gatt: BluetoothGatt?, rssi: Int32, status: Int32) { + guard let central, let gatt else { + assertionFailure() + return + } + let status = BluetoothGatt.Status(rawValue: status) + central.log?("\(type(of: self)): \(#function) \(rssi) \(status)") let peripheral = Peripheral(gatt) Task { - await central?.storage.update { state in + await central.storage.update { state in switch status { case .success: - state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: rssi) + state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(returning: Int(rssi)) default: state.cache[peripheral]?.continuation.readRemoteRSSI?.resume(throwing: AndroidCentralError.gattStatus(status)) } @@ -426,8 +454,8 @@ extension AndroidCentral.GattCallback { } @JavaMethod - public override func onReliableWriteCompleted(gatt: BluetoothGatt, status: Int32) { - - central?.log?("\(type(of: self)): \(#function)") - }*/ + func onReliableWriteCompleted(gatt: BluetoothGatt?, status: Int32) { + let status = BluetoothGatt.Status(rawValue: status) + central?.log?("\(type(of: self)): \(#function) \(status)") + } }