Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
9ae5ba1
Add generated sources
colemancda Jul 13, 2025
b79b69e
Update for Swift 6.1
colemancda Jul 13, 2025
aa92b7d
Remove deprecated code
colemancda Jul 13, 2025
5f8bb8e
Add Swift Java configuration
colemancda Jul 13, 2025
4b6d1a5
Add generated sources
colemancda Jul 13, 2025
5f693f8
Update `BluetoothStatusCodes`
colemancda Jul 13, 2025
136ccf2
Add `BluetoothTransport`
colemancda Jul 13, 2025
db674fc
Disable legacy code
colemancda Jul 13, 2025
03f1698
Update `BluetoothDevice`
colemancda Jul 13, 2025
25db770
Add GitHub CI
colemancda Jul 13, 2025
4a7ceb7
Add Funding
colemancda Jul 13, 2025
34dda66
Add PR template
colemancda Jul 13, 2025
399e1a7
Update `AndroidLowEnergyAdvertisementData`
colemancda Jul 13, 2025
38a2a95
Update `AndroidCentral`
colemancda Jul 13, 2025
9b4293f
Add `AndroidBluetoothServiceType`
colemancda Jul 13, 2025
c7df32a
Add `ScanData` extensions
colemancda Jul 13, 2025
0a13e81
Add `Peripheral` extensions
colemancda Jul 13, 2025
b041162
Add `BluetoothUUID` extensions
colemancda Jul 13, 2025
f276240
Add `ScanRecord.bytes`
colemancda Jul 13, 2025
ea91eac
Add `BluetoothGattService.type`
colemancda Jul 13, 2025
8d0804d
Add `BluetoothDevice.address`
colemancda Jul 13, 2025
1e95934
Add `AndroidCentralError`
colemancda Jul 13, 2025
8126461
Add `AndroidCentralAttribute`
colemancda Jul 13, 2025
f638ca3
Add `AndroidCentral.Storage`
colemancda Jul 13, 2025
52df1d8
Add Central callbacks
colemancda Jul 13, 2025
8a0b9d8
Update `AndroidCentral` for JavaKit
colemancda Jul 13, 2025
b5266e9
Add `AndroidCentralError.scanFailed`
colemancda Jul 13, 2025
83f9c27
Update `AndroidCentral.LowEnergyScanCallback`
colemancda Jul 13, 2025
3723d7b
Update `AndroidCentral`
colemancda Jul 13, 2025
7c55f32
Update `AndroidCentral.LowEnergyScanCallback`
colemancda Jul 14, 2025
9c40fd1
Add `AndroidCentralError.gattStatus`
colemancda Jul 14, 2025
f19e5b5
Fix `AndroidCentral.scan()`
colemancda Jul 14, 2025
501a04d
Update Central callbacks
colemancda Jul 14, 2025
48b7656
Add `BluetoothGatt.Status`
colemancda Jul 14, 2025
f7d86ee
Rename file
colemancda Jul 14, 2025
bb46879
Add `BluetoothConnectionState`
colemancda Jul 14, 2025
8610df4
Fix `AndroidCentral.GattCallback.onConnectionStateChange()`
colemancda Jul 14, 2025
8ad2a2b
Fix `AndroidCentral.GattCallback.onServicesDiscovered()`
colemancda Jul 14, 2025
c562ead
Fix `AndroidCentral.GattCallback`
colemancda Jul 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# These are supported funding model platforms
ko_fi: colemancda
15 changes: 15 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -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)
21 changes: 21 additions & 0 deletions .github/workflows/swift.yml
Original file line number Diff line number Diff line change
@@ -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 }}
51 changes: 38 additions & 13 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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")
]
)
]
)
31 changes: 31 additions & 0 deletions Sources/AndroidBluetooth/AdvertiseCallback.swift
Original file line number Diff line number Diff line change
@@ -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<AdvertiseCallback> {
@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
}
36 changes: 36 additions & 0 deletions Sources/AndroidBluetooth/AdvertiseData+Builder.swift
Original file line number Diff line number Diff line change
@@ -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!
}
}
68 changes: 68 additions & 0 deletions Sources/AndroidBluetooth/AdvertiseData.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Auto-generated by Java-to-Swift wrapper generator.
import AndroidOS
import AndroidUtil
import JavaKit
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
open func describeContents() -> Int32

@JavaMethod
open func writeToParcel(_ arg0: Parcel?, _ arg1: Int32)

@JavaMethod
open func getServiceUuids() -> List<ParcelUuid>!

@JavaMethod
open func getServiceData() -> Map<ParcelUuid, JavaArray>!

@JavaMethod
open func getServiceSolicitationUuids() -> List<ParcelUuid>!

@JavaMethod
open func getManufacturerSpecificData() -> SparseArray<JavaArray>!

@JavaMethod
open func getTransportDiscoveryData() -> List<TransportDiscoveryData>!

@JavaMethod
open func getIncludeTxPowerLevel() -> Bool

@JavaMethod
open func getIncludeDeviceName() -> Bool

@JavaMethod
open func equals(_ arg0: AdvertiseData?) -> Bool

@JavaMethod
open override func toString() -> String

@JavaMethod
open override func hashCode() -> Int32
}
extension JavaClass<AdvertiseData> {
@JavaStaticField(isFinal: true)
public var CREATOR: Parcelable.Creator<AdvertiseData>!

@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()
}
}
29 changes: 29 additions & 0 deletions Sources/AndroidBluetooth/AdvertiseSettings+Builder.swift
Original file line number Diff line number Diff line change
@@ -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!
}
}
62 changes: 62 additions & 0 deletions Sources/AndroidBluetooth/AdvertiseSettings.swift
Original file line number Diff line number Diff line change
@@ -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<AdvertiseSettings> {
@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<AdvertiseSettings>!

@JavaStaticField(isFinal: true)
public var CONTENTS_FILE_DESCRIPTOR: Int32

@JavaStaticField(isFinal: true)
public var PARCELABLE_WRITE_RETURN_VALUE: Int32
}
27 changes: 27 additions & 0 deletions Sources/AndroidBluetooth/AdvertisingSet.swift
Original file line number Diff line number Diff line change
@@ -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)
}
Loading