From c9f0e7e5ee4cd27a8c459cc24a577d7d4834b068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=90=E6=B8=90=E8=A2=AB=E4=BD=A0=E5=90=B8=E5=BC=95?= Date: Sun, 9 Jun 2024 23:30:38 +0800 Subject: [PATCH] Fix the issue that advertisement name is wrong when advertising. (#78) * Fix the issue that advertisement name is wrong when advertising. * Update CHANGELOG.md * Fix the warning issue. * 6.0.1 --------- Co-authored-by: yanshouwang --- bluetooth_low_energy/CHANGELOG.md | 4 + bluetooth_low_energy/example/pubspec.lock | 6 +- bluetooth_low_energy/pubspec.yaml | 4 +- bluetooth_low_energy_android/CHANGELOG.md | 8 + .../bluetooth_low_energy_android/MyAPI.g.kt | 172 +++++++++++++++--- .../bluetooth_low_energy_android/MyAPI.kt | 69 +++++-- .../MyActivityResultListener.kt | 16 -- .../MyBluetoothLowEnergyManager.kt | 6 +- .../MyCentralManager.kt | 28 +-- .../MyPeripheralManager.kt | 67 ++++--- .../example/pubspec.lock | 2 +- .../lib/src/my_api.dart | 14 +- .../lib/src/my_api.g.dart | 149 +++++++++++++-- .../lib/src/my_peripheral_manager.dart | 25 ++- bluetooth_low_energy_android/my_api.dart | 53 +++++- bluetooth_low_energy_android/pubspec.yaml | 2 +- 16 files changed, 478 insertions(+), 147 deletions(-) delete mode 100644 bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyActivityResultListener.kt diff --git a/bluetooth_low_energy/CHANGELOG.md b/bluetooth_low_energy/CHANGELOG.md index 06268a6..bb10cf3 100644 --- a/bluetooth_low_energy/CHANGELOG.md +++ b/bluetooth_low_energy/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.0.1 + +* `Android` Fix the issue that [advertisement name is wrong when advertising](https://github.com/yanshouwang/bluetooth_low_energy/issues/62). + ## 6.0.0 * [Add `CentralManager#retrieveConnectedPeripherals` method.](https://github.com/yanshouwang/bluetooth_low_energy/issues/61) diff --git a/bluetooth_low_energy/example/pubspec.lock b/bluetooth_low_energy/example/pubspec.lock index 3521f09..f13bf6b 100644 --- a/bluetooth_low_energy/example/pubspec.lock +++ b/bluetooth_low_energy/example/pubspec.lock @@ -23,15 +23,15 @@ packages: path: ".." relative: true source: path - version: "6.0.0" + version: "6.0.1" bluetooth_low_energy_android: dependency: transitive description: name: bluetooth_low_energy_android - sha256: "39284bb33a10cc3bc126e18968865f47fc0155495a7473afc705eb4be8b07728" + sha256: "97cac5169a392f3872cbb416cc11cf0b2287567c0ceca4d975f2fc5bdd2b1e6f" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.0.2" bluetooth_low_energy_darwin: dependency: transitive description: diff --git a/bluetooth_low_energy/pubspec.yaml b/bluetooth_low_energy/pubspec.yaml index 20807a4..0acdec6 100644 --- a/bluetooth_low_energy/pubspec.yaml +++ b/bluetooth_low_energy/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy description: "A Flutter plugin for controlling the bluetooth low energy, supports central and peripheral roles." -version: 6.0.0 +version: 6.0.1 homepage: https://github.com/yanshouwang/bluetooth_low_energy repository: https://github.com/yanshouwang/bluetooth_low_energy issue_tracker: https://github.com/yanshouwang/bluetooth_low_energy/issues @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter bluetooth_low_energy_platform_interface: ^6.0.0 - bluetooth_low_energy_android: ^6.0.0 + bluetooth_low_energy_android: ^6.0.2 bluetooth_low_energy_darwin: ^6.0.0 bluetooth_low_energy_windows: ^6.0.0 bluetooth_low_energy_linux: ^6.0.0 diff --git a/bluetooth_low_energy_android/CHANGELOG.md b/bluetooth_low_energy_android/CHANGELOG.md index 21f9f97..f900fc5 100644 --- a/bluetooth_low_energy_android/CHANGELOG.md +++ b/bluetooth_low_energy_android/CHANGELOG.md @@ -1,3 +1,11 @@ +## 6.0.2 + +* Fix the warning issue. + +## 6.0.1 + +* Fix the issue that [advertisement name is wrong when advertising](https://github.com/yanshouwang/bluetooth_low_energy/issues/62). + ## 6.0.0 * Add `serviceUUIDs` argument to `CentralManager#startDiscovery` method. diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.g.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.g.kt index eaf01e3..1f6be36 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.g.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.g.kt @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v19.0.0), do not edit directly. +// Autogenerated from Pigeon (v19.0.2), do not edit directly. // See also: https://pub.dev/packages/pigeon @file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") @@ -63,6 +63,31 @@ enum class MyBluetoothLowEnergyStateArgs(val raw: Int) { } } +enum class MyAdvertiseModeArgs(val raw: Int) { + LOW_POWER(0), + BALANCED(1), + LOW_LATENCY(2); + + companion object { + fun ofRaw(raw: Int): MyAdvertiseModeArgs? { + return values().firstOrNull { it.raw == raw } + } + } +} + +enum class MyTXPowerLevelArgs(val raw: Int) { + ULTRA_LOW(0), + LOW(1), + MEDIUM(2), + HIGH(3); + + companion object { + fun ofRaw(raw: Int): MyTXPowerLevelArgs? { + return values().firstOrNull { it.raw == raw } + } + } +} + enum class MyConnectionStateArgs(val raw: Int) { DISCONNECTED(0), CONNECTING(1), @@ -234,6 +259,69 @@ data class MyAdvertisementArgs ( } } +/** Generated class from Pigeon that represents data sent in messages. */ +data class MyAdvertiseSettingsArgs ( + val modeArgs: MyAdvertiseModeArgs? = null, + val connectableArgs: Boolean? = null, + val timeoutArgs: Long? = null, + val txPowerLevelArgs: MyTXPowerLevelArgs? = null + +) { + companion object { + @Suppress("LocalVariableName") + fun fromList(__pigeon_list: List): MyAdvertiseSettingsArgs { + val modeArgs: MyAdvertiseModeArgs? = (__pigeon_list[0] as Int?)?.let { num -> + MyAdvertiseModeArgs.ofRaw(num) + } + val connectableArgs = __pigeon_list[1] as Boolean? + val timeoutArgs = __pigeon_list[2].let { num -> if (num is Int) num.toLong() else num as Long? } + val txPowerLevelArgs: MyTXPowerLevelArgs? = (__pigeon_list[3] as Int?)?.let { num -> + MyTXPowerLevelArgs.ofRaw(num) + } + return MyAdvertiseSettingsArgs(modeArgs, connectableArgs, timeoutArgs, txPowerLevelArgs) + } + } + fun toList(): List { + return listOf( + modeArgs?.raw, + connectableArgs, + timeoutArgs, + txPowerLevelArgs?.raw, + ) + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class MyAdvertiseDataArgs ( + val includeDeviceNameArgs: Boolean? = null, + val includeTXPowerLevelArgs: Boolean? = null, + val serviceUUIDsArgs: List, + val serviceDataArgs: Map, + val manufacturerSpecificDataArgs: List + +) { + companion object { + @Suppress("LocalVariableName") + fun fromList(__pigeon_list: List): MyAdvertiseDataArgs { + val includeDeviceNameArgs = __pigeon_list[0] as Boolean? + val includeTXPowerLevelArgs = __pigeon_list[1] as Boolean? + val serviceUUIDsArgs = __pigeon_list[2] as List + val serviceDataArgs = __pigeon_list[3] as Map + val manufacturerSpecificDataArgs = __pigeon_list[4] as List + return MyAdvertiseDataArgs(includeDeviceNameArgs, includeTXPowerLevelArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) + } + } + fun toList(): List { + return listOf( + includeDeviceNameArgs, + includeTXPowerLevelArgs, + serviceUUIDsArgs, + serviceDataArgs, + manufacturerSpecificDataArgs, + ) + } +} + /** Generated class from Pigeon that represents data sent in messages. */ data class MyCentralArgs ( val addressArgs: String @@ -503,7 +591,7 @@ interface MyCentralManagerHostAPI { fun initialize(): MyCentralManagerArgs fun getState(): MyBluetoothLowEnergyStateArgs fun authorize(callback: (Result) -> Unit) - fun showAppSettings(callback: (Result) -> Unit) + fun showAppSettings() fun startDiscovery(serviceUUIDsArgs: List, callback: (Result) -> Unit) fun stopDiscovery() fun connect(addressArgs: String, callback: (Result) -> Unit) @@ -524,6 +612,7 @@ interface MyCentralManagerHostAPI { MyCentralManagerHostAPICodec } /** Sets up an instance of `MyCentralManagerHostAPI` to handle messages through the `binaryMessenger`. */ + @JvmOverloads fun setUp(binaryMessenger: BinaryMessenger, api: MyCentralManagerHostAPI?, messageChannelSuffix: String = "") { val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" run { @@ -578,14 +667,13 @@ interface MyCentralManagerHostAPI { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { _, reply -> - api.showAppSettings() { result: Result -> - val error = result.exceptionOrNull() - if (error != null) { - reply.reply(wrapError(error)) - } else { - reply.reply(wrapResult(null)) - } + val wrapped: List = try { + api.showAppSettings() + listOf(null) + } catch (exception: Throwable) { + wrapError(exception) } + reply.reply(wrapped) } } else { channel.setMessageHandler(null) @@ -1005,30 +1093,35 @@ private object MyPeripheralManagerHostAPICodec : StandardMessageCodec() { return when (type) { 128.toByte() -> { return (readValue(buffer) as? List)?.let { - MyAdvertisementArgs.fromList(it) + MyAdvertiseDataArgs.fromList(it) } } 129.toByte() -> { return (readValue(buffer) as? List)?.let { - MyManufacturerSpecificDataArgs.fromList(it) + MyAdvertiseSettingsArgs.fromList(it) } } 130.toByte() -> { return (readValue(buffer) as? List)?.let { - MyMutableGATTCharacteristicArgs.fromList(it) + MyManufacturerSpecificDataArgs.fromList(it) } } 131.toByte() -> { return (readValue(buffer) as? List)?.let { - MyMutableGATTDescriptorArgs.fromList(it) + MyMutableGATTCharacteristicArgs.fromList(it) } } 132.toByte() -> { return (readValue(buffer) as? List)?.let { - MyMutableGATTServiceArgs.fromList(it) + MyMutableGATTDescriptorArgs.fromList(it) } } 133.toByte() -> { + return (readValue(buffer) as? List)?.let { + MyMutableGATTServiceArgs.fromList(it) + } + } + 134.toByte() -> { return (readValue(buffer) as? List)?.let { MyPeripheralManagerArgs.fromList(it) } @@ -1038,30 +1131,34 @@ private object MyPeripheralManagerHostAPICodec : StandardMessageCodec() { } override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { when (value) { - is MyAdvertisementArgs -> { + is MyAdvertiseDataArgs -> { stream.write(128) writeValue(stream, value.toList()) } - is MyManufacturerSpecificDataArgs -> { + is MyAdvertiseSettingsArgs -> { stream.write(129) writeValue(stream, value.toList()) } - is MyMutableGATTCharacteristicArgs -> { + is MyManufacturerSpecificDataArgs -> { stream.write(130) writeValue(stream, value.toList()) } - is MyMutableGATTDescriptorArgs -> { + is MyMutableGATTCharacteristicArgs -> { stream.write(131) writeValue(stream, value.toList()) } - is MyMutableGATTServiceArgs -> { + is MyMutableGATTDescriptorArgs -> { stream.write(132) writeValue(stream, value.toList()) } - is MyPeripheralManagerArgs -> { + is MyMutableGATTServiceArgs -> { stream.write(133) writeValue(stream, value.toList()) } + is MyPeripheralManagerArgs -> { + stream.write(134) + writeValue(stream, value.toList()) + } else -> super.writeValue(stream, value) } } @@ -1072,13 +1169,14 @@ interface MyPeripheralManagerHostAPI { fun initialize(): MyPeripheralManagerArgs fun getState(): MyBluetoothLowEnergyStateArgs fun authorize(callback: (Result) -> Unit) - fun showAppSettings(callback: (Result) -> Unit) + fun showAppSettings() + fun setName(nameArgs: String, callback: (Result) -> Unit) fun openGATTServer() fun closeGATTServer() fun addService(serviceArgs: MyMutableGATTServiceArgs, callback: (Result) -> Unit) fun removeService(hashCodeArgs: Long) fun removeAllServices() - fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result) -> Unit) + fun startAdvertising(settingsArgs: MyAdvertiseSettingsArgs, advertiseDataArgs: MyAdvertiseDataArgs, scanResponseArgs: MyAdvertiseDataArgs, callback: (Result) -> Unit) fun stopAdvertising() fun sendResponse(addressArgs: String, idArgs: Long, statusArgs: MyGATTStatusArgs, offsetArgs: Long, valueArgs: ByteArray?) fun notifyCharacteristicChanged(addressArgs: String, hashCodeArgs: Long, confirmArgs: Boolean, valueArgs: ByteArray, callback: (Result) -> Unit) @@ -1089,6 +1187,7 @@ interface MyPeripheralManagerHostAPI { MyPeripheralManagerHostAPICodec } /** Sets up an instance of `MyPeripheralManagerHostAPI` to handle messages through the `binaryMessenger`. */ + @JvmOverloads fun setUp(binaryMessenger: BinaryMessenger, api: MyPeripheralManagerHostAPI?, messageChannelSuffix: String = "") { val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" run { @@ -1143,12 +1242,31 @@ interface MyPeripheralManagerHostAPI { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { _, reply -> - api.showAppSettings() { result: Result -> + val wrapped: List = try { + api.showAppSettings() + listOf(null) + } catch (exception: Throwable) { + wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.setName$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val nameArgsArg = args[0] as String + api.setName(nameArgsArg) { result: Result -> val error = result.exceptionOrNull() if (error != null) { reply.reply(wrapError(error)) } else { - reply.reply(wrapResult(null)) + val data = result.getOrNull() + reply.reply(wrapResult(data)) } } } @@ -1246,8 +1364,10 @@ interface MyPeripheralManagerHostAPI { if (api != null) { channel.setMessageHandler { message, reply -> val args = message as List - val advertisementArgsArg = args[0] as MyAdvertisementArgs - api.startAdvertising(advertisementArgsArg) { result: Result -> + val settingsArgsArg = args[0] as MyAdvertiseSettingsArgs + val advertiseDataArgsArg = args[1] as MyAdvertiseDataArgs + val scanResponseArgsArg = args[2] as MyAdvertiseDataArgs + api.startAdvertising(settingsArgsArg, advertiseDataArgsArg, scanResponseArgsArg) { result: Result -> val error = result.exceptionOrNull() if (error != null) { reply.reply(wrapError(error)) diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.kt index 2eb0d55..6286241 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyAPI.kt @@ -8,6 +8,7 @@ import android.bluetooth.BluetoothGattDescriptor import android.bluetooth.BluetoothGattService import android.bluetooth.BluetoothProfile import android.bluetooth.le.AdvertiseData +import android.bluetooth.le.AdvertiseSettings import android.bluetooth.le.ScanResult import android.os.Build import android.os.ParcelUuid @@ -15,6 +16,23 @@ import android.util.SparseArray import java.util.UUID //region ToObject +fun MyAdvertiseModeArgs.toAdvertiseMode(): Int { + return when (this) { + MyAdvertiseModeArgs.LOW_POWER -> AdvertiseSettings.ADVERTISE_MODE_LOW_POWER + MyAdvertiseModeArgs.BALANCED -> AdvertiseSettings.ADVERTISE_MODE_BALANCED + MyAdvertiseModeArgs.LOW_LATENCY -> AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY + } +} + +fun MyTXPowerLevelArgs.toTXPowerLevel(): Int { + return when (this) { + MyTXPowerLevelArgs.ULTRA_LOW -> AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW + MyTXPowerLevelArgs.LOW -> AdvertiseSettings.ADVERTISE_TX_POWER_LOW + MyTXPowerLevelArgs.MEDIUM -> AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM + MyTXPowerLevelArgs.HIGH -> AdvertiseSettings.ADVERTISE_TX_POWER_HIGH + } +} + fun MyGATTCharacteristicWriteTypeArgs.toType(): Int { return when (this) { MyGATTCharacteristicWriteTypeArgs.WITH_RESPONSE -> BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT @@ -39,31 +57,56 @@ fun MyGATTStatusArgs.toStatus(): Int { } } -fun MyAdvertisementArgs.toAdvertiseData(): AdvertiseData { - val advertiseDataBuilder = AdvertiseData.Builder() +fun MyAdvertiseSettingsArgs.toAdvertiseSettings(): AdvertiseSettings { + val builder = AdvertiseSettings.Builder() + val modeArgs = this.modeArgs + if (modeArgs != null) { + val mode = modeArgs.toAdvertiseMode() + builder.setAdvertiseMode(mode) + } + val connectableArgs = this.connectableArgs + if (connectableArgs != null) { + builder.setConnectable(connectableArgs) + } + val timeoutArgs = this.timeoutArgs + if (timeoutArgs != null) { + val timeout = timeoutArgs.toInt() + builder.setTimeout(timeout) + } + val txPowerLevelArgs = this.txPowerLevelArgs + if (txPowerLevelArgs != null) { + val txPowerLevel = txPowerLevelArgs.toTXPowerLevel() + builder.setTxPowerLevel(txPowerLevel) + } + return builder.build() +} + +fun MyAdvertiseDataArgs.toAdvertiseData(): AdvertiseData { + val builder = AdvertiseData.Builder() + val includeDeviceNameArgs = this.includeDeviceNameArgs + if (includeDeviceNameArgs != null) { + builder.setIncludeDeviceName(includeDeviceNameArgs) + } + val includeTXPowerLevelArgs = this.includeTXPowerLevelArgs + if (includeTXPowerLevelArgs != null) { + builder.setIncludeTxPowerLevel(includeTXPowerLevelArgs) + } for (serviceUuidArgs in serviceUUIDsArgs) { val serviceUUID = ParcelUuid.fromString(serviceUuidArgs) - advertiseDataBuilder.addServiceUuid(serviceUUID) + builder.addServiceUuid(serviceUUID) } for (entry in serviceDataArgs) { val serviceDataUUID = ParcelUuid.fromString(entry.key as String) val serviceData = entry.value as ByteArray - advertiseDataBuilder.addServiceData(serviceDataUUID, serviceData) + builder.addServiceData(serviceDataUUID, serviceData) } for (args in manufacturerSpecificDataArgs) { val itemArgs = args as MyManufacturerSpecificDataArgs val manufacturerId = itemArgs.idArgs.toInt() val manufacturerSpecificData = itemArgs.dataArgs - advertiseDataBuilder.addManufacturerData(manufacturerId, manufacturerSpecificData) + builder.addManufacturerData(manufacturerId, manufacturerSpecificData) } - return advertiseDataBuilder.build() -} - -fun MyAdvertisementArgs.toScanResponse(): AdvertiseData { - val advertiseDataBuilder = AdvertiseData.Builder() - val includeDeviceName = nameArgs != null - advertiseDataBuilder.setIncludeDeviceName(includeDeviceName) - return advertiseDataBuilder.build() + return builder.build() } fun MyMutableGATTDescriptorArgs.toDescriptor(): BluetoothGattDescriptor { diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyActivityResultListener.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyActivityResultListener.kt deleted file mode 100644 index d172073..0000000 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyActivityResultListener.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.hebei.bluetooth_low_energy_android - -import android.content.Intent -import io.flutter.plugin.common.PluginRegistry - -class MyActivityResultListener(manager: MyBluetoothLowEnergyManager) : PluginRegistry.ActivityResultListener { - private val mManager: MyBluetoothLowEnergyManager - - init { - mManager = manager - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { - return mManager.onActivityResult(requestCode, resultCode, data) - } -} \ No newline at end of file diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt index 6d3296b..52d413a 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt @@ -12,17 +12,16 @@ import io.flutter.plugin.common.PluginRegistry abstract class MyBluetoothLowEnergyManager(val context: Context) { companion object { const val AUTHORIZE_CODE = 0x00 - const val SHOW_APP_SETTINGS_CODE = 0x01 } private val mBroadcastReceiver: BroadcastReceiver by lazy { MyBroadcastReceiver(this) } private val mRequestPermissionsResultListener: PluginRegistry.RequestPermissionsResultListener by lazy { MyRequestPermissionResultListener(this) } - private val mActivityResultListener: PluginRegistry.ActivityResultListener by lazy { MyActivityResultListener(this) } private lateinit var mBinding: ActivityPluginBinding init { val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED) + filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED) context.registerReceiver(mBroadcastReceiver, filter) } @@ -30,17 +29,14 @@ abstract class MyBluetoothLowEnergyManager(val context: Context) { fun onAttachedToActivity(binding: ActivityPluginBinding) { binding.addRequestPermissionsResultListener(mRequestPermissionsResultListener) - binding.addActivityResultListener(mActivityResultListener) mBinding = binding } fun onDetachedFromActivity() { mBinding.removeRequestPermissionsResultListener(mRequestPermissionsResultListener) - mBinding.removeActivityResultListener(mActivityResultListener) } abstract fun onReceive(context: Context, intent: Intent) abstract fun onRequestPermissionsResult(requestCode: Int, permissions: Array, results: IntArray): Boolean - abstract fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean } diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyCentralManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyCentralManager.kt index e30c44d..7afa156 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyCentralManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyCentralManager.kt @@ -42,7 +42,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB private val mDescriptors: MutableMap> private var mAuthorizeCallback: ((Result) -> Unit)? - private var mShowAppSettingsCallback: ((Result) -> Unit)? private var mStartDiscoveryCallback: ((Result) -> Unit)? private val mConnectCallbacks: MutableMap) -> Unit> private val mDisconnectCallbacks: MutableMap) -> Unit> @@ -65,7 +64,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB mDescriptors = mutableMapOf() mAuthorizeCallback = null - mShowAppSettingsCallback = null mStartDiscoveryCallback = null mConnectCallbacks = mutableMapOf() mDisconnectCallbacks = mutableMapOf() @@ -104,7 +102,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB mDescriptors.clear() mAuthorizeCallback = null - mShowAppSettingsCallback = null mStartDiscoveryCallback = null mConnectCallbacks.clear() mDisconnectCallbacks.clear() @@ -140,16 +137,11 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB } } - override fun showAppSettings(callback: (Result) -> Unit) { - try { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.fromParts("package", activity.packageName, null) - val options = ActivityOptionsCompat.makeBasic().toBundle() - ActivityCompat.startActivityForResult(activity, intent, SHOW_APP_SETTINGS_CODE, options) - mShowAppSettingsCallback = callback - } catch (e: Throwable) { - callback(Result.failure(e)) - } + override fun showAppSettings() { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.fromParts("package", activity.packageName, null) + val options = ActivityOptionsCompat.makeBasic().toBundle() + ActivityCompat.startActivity(activity, intent, options) } override fun startDiscovery(serviceUUIDsArgs: List, callback: (Result) -> Unit) { @@ -355,16 +347,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB return true } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { - if (requestCode != SHOW_APP_SETTINGS_CODE) { - return false - } - val callback = mShowAppSettingsCallback ?: return false - mShowAppSettingsCallback = null - callback(Result.success(Unit)) - return true - } - private fun onScanSucceeded() { mDiscovering = true val callback = mStartDiscoveryCallback ?: return diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyPeripheralManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyPeripheralManager.kt index 1e67f6a..3244d4b 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyPeripheralManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/hebei/bluetooth_low_energy_android/MyPeripheralManager.kt @@ -43,7 +43,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : private val mDescriptors: MutableMap private var mAuthorizeCallback: ((Result) -> Unit)? - private var mShowAppSettingsCallback: ((Result) -> Unit)? + private var mSetNameCallback: ((Result) -> Unit)? private var mAddServiceCallback: ((Result) -> Unit)? private var mStartAdvertisingCallback: ((Result) -> Unit)? private val mNotifyCharacteristicValueChangedCallbacks: MutableMap) -> Unit> @@ -64,7 +64,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : mDescriptors = mutableMapOf() mAuthorizeCallback = null - mShowAppSettingsCallback = null + mSetNameCallback = null mAddServiceCallback = null mStartAdvertisingCallback = null mNotifyCharacteristicValueChangedCallbacks = mutableMapOf() @@ -99,7 +99,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : mDescriptors.clear() mAuthorizeCallback = null - mShowAppSettingsCallback = null + mSetNameCallback = null mAddServiceCallback = null mStartAdvertisingCallback = null mNotifyCharacteristicValueChangedCallbacks.clear() @@ -128,13 +128,20 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : } } - override fun showAppSettings(callback: (Result) -> Unit) { + override fun showAppSettings() { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.fromParts("package", activity.packageName, null) + val options = ActivityOptionsCompat.makeBasic().toBundle() + ActivityCompat.startActivity(activity, intent, options) + } + + override fun setName(nameArgs: String, callback: (Result) -> Unit) { try { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.fromParts("package", activity.packageName, null) - val options = ActivityOptionsCompat.makeBasic().toBundle() - ActivityCompat.startActivityForResult(activity, intent, SHOW_APP_SETTINGS_CODE, options) - mShowAppSettingsCallback = callback + val setting = adapter.setName(nameArgs) + if (!setting) { + throw IllegalStateException() + } + mSetNameCallback = callback } catch (e: Throwable) { callback(Result.failure(e)) } @@ -183,17 +190,11 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : mDescriptorsArgs.clear() } - override fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result) -> Unit) { + override fun startAdvertising(settingsArgs: MyAdvertiseSettingsArgs, advertiseDataArgs: MyAdvertiseDataArgs, scanResponseArgs: MyAdvertiseDataArgs, callback: (Result) -> Unit) { try { - val settings = AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setConnectable(true).build() - // TODO: There is an issue that Android will use the cached name before setName takes effect. - // see https://stackoverflow.com/questions/8377558/change-the-android-bluetooth-device-name - val nameArgs = advertisementArgs.nameArgs - if (nameArgs != null) { - adapter.name = nameArgs - } - val advertiseData = advertisementArgs.toAdvertiseData() - val scanResponse = advertisementArgs.toScanResponse() + val settings = settingsArgs.toAdvertiseSettings() + val advertiseData = advertiseDataArgs.toAdvertiseData() + val scanResponse = scanResponseArgs.toAdvertiseData() advertiser.startAdvertising(settings, advertiseData, scanResponse, mAdvertiseCallback) mStartAdvertisingCallback = callback } catch (e: Throwable) { @@ -238,12 +239,20 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : } override fun onReceive(context: Context, intent: Intent) { - if (intent.action != BluetoothAdapter.ACTION_STATE_CHANGED) { - return + when (intent.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF) + val stateArgs = state.toBluetoothLowEnergyStateArgs() + mAPI.onStateChanged(stateArgs) {} + } + BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED -> { + val callback = mSetNameCallback ?: return + mSetNameCallback = null + val nameArgs = intent.getStringExtra(BluetoothAdapter.EXTRA_LOCAL_NAME) + callback(Result.success(nameArgs)) + } + else -> {} } - val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF) - val stateArgs = state.toBluetoothLowEnergyStateArgs() - mAPI.onStateChanged(stateArgs) {} } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, results: IntArray): Boolean { @@ -257,16 +266,6 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : return true } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { - if (requestCode != SHOW_APP_SETTINGS_CODE) { - return false - } - val callback = mShowAppSettingsCallback ?: return false - mShowAppSettingsCallback = null - callback(Result.success(Unit)) - return true - } - fun onServiceAdded(status: Int, service: BluetoothGattService) { val callback = mAddServiceCallback ?: return mAddServiceCallback = null diff --git a/bluetooth_low_energy_android/example/pubspec.lock b/bluetooth_low_energy_android/example/pubspec.lock index a0a49ea..0d0140c 100644 --- a/bluetooth_low_energy_android/example/pubspec.lock +++ b/bluetooth_low_energy_android/example/pubspec.lock @@ -15,7 +15,7 @@ packages: path: ".." relative: true source: path - version: "6.0.0" + version: "6.0.2" bluetooth_low_energy_platform_interface: dependency: "direct main" description: diff --git a/bluetooth_low_energy_android/lib/src/my_api.dart b/bluetooth_low_energy_android/lib/src/my_api.dart index c9ec874..493d06e 100644 --- a/bluetooth_low_energy_android/lib/src/my_api.dart +++ b/bluetooth_low_energy_android/lib/src/my_api.dart @@ -198,9 +198,8 @@ extension ManufacturerSpecificDataX on ManufacturerSpecificData { } extension AdvertisementX on Advertisement { - MyAdvertisementArgs toArgs() { - return MyAdvertisementArgs( - nameArgs: name, + MyAdvertiseDataArgs toAdvertiseDataArgs() { + return MyAdvertiseDataArgs( serviceUUIDsArgs: serviceUUIDs.map((uuid) => uuid.toArgs()).toList(), serviceDataArgs: serviceData.map((uuid, data) { final uuidArgs = uuid.toArgs(); @@ -211,6 +210,15 @@ extension AdvertisementX on Advertisement { manufacturerSpecificData.map((data) => data.toArgs()).toList(), ); } + + MyAdvertiseDataArgs toScanResponseArgs() { + return MyAdvertiseDataArgs( + includeDeviceNameArgs: name != null, + serviceUUIDsArgs: [], + serviceDataArgs: {}, + manufacturerSpecificDataArgs: [], + ); + } } extension MutableGATTDescriptorX on MutableGATTDescriptor { diff --git a/bluetooth_low_energy_android/lib/src/my_api.g.dart b/bluetooth_low_energy_android/lib/src/my_api.g.dart index a497ffd..81533e5 100644 --- a/bluetooth_low_energy_android/lib/src/my_api.g.dart +++ b/bluetooth_low_energy_android/lib/src/my_api.g.dart @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v19.0.0), do not edit directly. +// Autogenerated from Pigeon (v19.0.2), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers @@ -35,6 +35,19 @@ enum MyBluetoothLowEnergyStateArgs { turningOff, } +enum MyAdvertiseModeArgs { + lowPower, + balanced, + lowLatency, +} + +enum MyTXPowerLevelArgs { + ultraLow, + low, + medium, + high, +} + enum MyConnectionStateArgs { disconnected, connecting, @@ -200,6 +213,87 @@ class MyAdvertisementArgs { } } +class MyAdvertiseSettingsArgs { + MyAdvertiseSettingsArgs({ + this.modeArgs, + this.connectableArgs, + this.timeoutArgs, + this.txPowerLevelArgs, + }); + + MyAdvertiseModeArgs? modeArgs; + + bool? connectableArgs; + + int? timeoutArgs; + + MyTXPowerLevelArgs? txPowerLevelArgs; + + Object encode() { + return [ + modeArgs?.index, + connectableArgs, + timeoutArgs, + txPowerLevelArgs?.index, + ]; + } + + static MyAdvertiseSettingsArgs decode(Object result) { + result as List; + return MyAdvertiseSettingsArgs( + modeArgs: result[0] != null + ? MyAdvertiseModeArgs.values[result[0]! as int] + : null, + connectableArgs: result[1] as bool?, + timeoutArgs: result[2] as int?, + txPowerLevelArgs: result[3] != null + ? MyTXPowerLevelArgs.values[result[3]! as int] + : null, + ); + } +} + +class MyAdvertiseDataArgs { + MyAdvertiseDataArgs({ + this.includeDeviceNameArgs, + this.includeTXPowerLevelArgs, + required this.serviceUUIDsArgs, + required this.serviceDataArgs, + required this.manufacturerSpecificDataArgs, + }); + + bool? includeDeviceNameArgs; + + bool? includeTXPowerLevelArgs; + + List serviceUUIDsArgs; + + Map serviceDataArgs; + + List manufacturerSpecificDataArgs; + + Object encode() { + return [ + includeDeviceNameArgs, + includeTXPowerLevelArgs, + serviceUUIDsArgs, + serviceDataArgs, + manufacturerSpecificDataArgs, + ]; + } + + static MyAdvertiseDataArgs decode(Object result) { + result as List; + return MyAdvertiseDataArgs( + includeDeviceNameArgs: result[0] as bool?, + includeTXPowerLevelArgs: result[1] as bool?, + serviceUUIDsArgs: (result[2] as List?)!.cast(), + serviceDataArgs: (result[3] as Map?)!.cast(), + manufacturerSpecificDataArgs: (result[4] as List?)!.cast(), + ); + } +} + class MyCentralArgs { MyCentralArgs({ required this.addressArgs, @@ -1142,24 +1236,27 @@ class _MyPeripheralManagerHostAPICodec extends StandardMessageCodec { const _MyPeripheralManagerHostAPICodec(); @override void writeValue(WriteBuffer buffer, Object? value) { - if (value is MyAdvertisementArgs) { + if (value is MyAdvertiseDataArgs) { buffer.putUint8(128); writeValue(buffer, value.encode()); - } else if (value is MyManufacturerSpecificDataArgs) { + } else if (value is MyAdvertiseSettingsArgs) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is MyMutableGATTCharacteristicArgs) { + } else if (value is MyManufacturerSpecificDataArgs) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is MyMutableGATTDescriptorArgs) { + } else if (value is MyMutableGATTCharacteristicArgs) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is MyMutableGATTServiceArgs) { + } else if (value is MyMutableGATTDescriptorArgs) { buffer.putUint8(132); writeValue(buffer, value.encode()); - } else if (value is MyPeripheralManagerArgs) { + } else if (value is MyMutableGATTServiceArgs) { buffer.putUint8(133); writeValue(buffer, value.encode()); + } else if (value is MyPeripheralManagerArgs) { + buffer.putUint8(134); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1169,16 +1266,18 @@ class _MyPeripheralManagerHostAPICodec extends StandardMessageCodec { Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { case 128: - return MyAdvertisementArgs.decode(readValue(buffer)!); + return MyAdvertiseDataArgs.decode(readValue(buffer)!); case 129: - return MyManufacturerSpecificDataArgs.decode(readValue(buffer)!); + return MyAdvertiseSettingsArgs.decode(readValue(buffer)!); case 130: - return MyMutableGATTCharacteristicArgs.decode(readValue(buffer)!); + return MyManufacturerSpecificDataArgs.decode(readValue(buffer)!); case 131: - return MyMutableGATTDescriptorArgs.decode(readValue(buffer)!); + return MyMutableGATTCharacteristicArgs.decode(readValue(buffer)!); case 132: - return MyMutableGATTServiceArgs.decode(readValue(buffer)!); + return MyMutableGATTDescriptorArgs.decode(readValue(buffer)!); case 133: + return MyMutableGATTServiceArgs.decode(readValue(buffer)!); + case 134: return MyPeripheralManagerArgs.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -1302,6 +1401,28 @@ class MyPeripheralManagerHostAPI { } } + Future setName(String nameArgs) async { + final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.setName$__pigeon_messageChannelSuffix'; + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = + await __pigeon_channel.send([nameArgs]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { + throw PlatformException( + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], + ); + } else { + return (__pigeon_replyList[0] as String?); + } + } + Future openGATTServer() async { final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.openGATTServer$__pigeon_messageChannelSuffix'; final BasicMessageChannel __pigeon_channel = BasicMessageChannel( @@ -1412,7 +1533,7 @@ class MyPeripheralManagerHostAPI { } } - Future startAdvertising(MyAdvertisementArgs advertisementArgs) async { + Future startAdvertising(MyAdvertiseSettingsArgs settingsArgs, MyAdvertiseDataArgs advertiseDataArgs, MyAdvertiseDataArgs scanResponseArgs) async { final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.startAdvertising$__pigeon_messageChannelSuffix'; final BasicMessageChannel __pigeon_channel = BasicMessageChannel( __pigeon_channelName, @@ -1420,7 +1541,7 @@ class MyPeripheralManagerHostAPI { binaryMessenger: __pigeon_binaryMessenger, ); final List? __pigeon_replyList = - await __pigeon_channel.send([advertisementArgs]) as List?; + await __pigeon_channel.send([settingsArgs, advertiseDataArgs, scanResponseArgs]) as List?; if (__pigeon_replyList == null) { throw _createConnectionError(__pigeon_channelName); } else if (__pigeon_replyList.length > 1) { diff --git a/bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart b/bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart index 82f622e..2e09e4b 100644 --- a/bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart +++ b/bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart @@ -156,9 +156,28 @@ final class MyPeripheralManager extends PlatformPeripheralManager @override Future startAdvertising(Advertisement advertisement) async { - final advertisementArgs = advertisement.toArgs(); - logger.info('startAdvertising: $advertisementArgs'); - await _api.startAdvertising(advertisementArgs); + final nameArgs = advertisement.name; + if (nameArgs != null) { + logger.info('setName: $nameArgs'); + final newNameArgs = await _api.setName(nameArgs); + if (newNameArgs != nameArgs) { + throw ArgumentError( + 'Name changed, but $newNameArgs is different from $nameArgs'); + } + } + final settingsArgs = MyAdvertiseSettingsArgs( + modeArgs: MyAdvertiseModeArgs.balanced, + connectableArgs: true, + ); + final advertiseDataArgs = advertisement.toAdvertiseDataArgs(); + final scanResponseArgs = advertisement.toScanResponseArgs(); + logger.info( + 'startAdvertising: $settingsArgs, $advertiseDataArgs, $scanResponseArgs'); + await _api.startAdvertising( + settingsArgs, + advertiseDataArgs, + scanResponseArgs, + ); } @override diff --git a/bluetooth_low_energy_android/my_api.dart b/bluetooth_low_energy_android/my_api.dart index cb00b4b..3958773 100644 --- a/bluetooth_low_energy_android/my_api.dart +++ b/bluetooth_low_energy_android/my_api.dart @@ -24,6 +24,19 @@ enum MyBluetoothLowEnergyStateArgs { turningOff, } +enum MyAdvertiseModeArgs { + lowPower, + balanced, + lowLatency, +} + +enum MyTXPowerLevelArgs { + ultraLow, + low, + medium, + high, +} + enum MyConnectionStateArgs { disconnected, connecting, @@ -110,6 +123,36 @@ class MyAdvertisementArgs { ); } +class MyAdvertiseSettingsArgs { + final MyAdvertiseModeArgs? modeArgs; + final bool? connectableArgs; + final int? timeoutArgs; + final MyTXPowerLevelArgs? txPowerLevelArgs; + + MyAdvertiseSettingsArgs( + this.modeArgs, + this.connectableArgs, + this.timeoutArgs, + this.txPowerLevelArgs, + ); +} + +class MyAdvertiseDataArgs { + final bool? includeDeviceNameArgs; + final bool? includeTXPowerLevelArgs; + final List serviceUUIDsArgs; + final Map serviceDataArgs; + final List manufacturerSpecificDataArgs; + + MyAdvertiseDataArgs( + this.includeDeviceNameArgs, + this.includeTXPowerLevelArgs, + this.serviceUUIDsArgs, + this.serviceDataArgs, + this.manufacturerSpecificDataArgs, + ); +} + class MyCentralArgs { final String addressArgs; @@ -212,7 +255,6 @@ abstract class MyCentralManagerHostAPI { MyBluetoothLowEnergyStateArgs getState(); @async bool authorize(); - @async void showAppSettings(); @async void startDiscovery(List serviceUUIDsArgs); @@ -278,8 +320,9 @@ abstract class MyPeripheralManagerHostAPI { MyBluetoothLowEnergyStateArgs getState(); @async bool authorize(); - @async void showAppSettings(); + @async + String? setName(String nameArgs); void openGATTServer(); void closeGATTServer(); @async @@ -287,7 +330,11 @@ abstract class MyPeripheralManagerHostAPI { void removeService(int hashCodeArgs); void removeAllServices(); @async - void startAdvertising(MyAdvertisementArgs advertisementArgs); + void startAdvertising( + MyAdvertiseSettingsArgs settingsArgs, + MyAdvertiseDataArgs advertiseDataArgs, + MyAdvertiseDataArgs scanResponseArgs, + ); void stopAdvertising(); void sendResponse( String addressArgs, diff --git a/bluetooth_low_energy_android/pubspec.yaml b/bluetooth_low_energy_android/pubspec.yaml index 86c758f..e7984a9 100644 --- a/bluetooth_low_energy_android/pubspec.yaml +++ b/bluetooth_low_energy_android/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy_android description: "Android implementation of the bluetooth_low_energy plugin." -version: 6.0.0 +version: 6.0.2 homepage: https://github.com/yanshouwang/bluetooth_low_energy repository: https://github.com/yanshouwang/bluetooth_low_energy issue_tracker: https://github.com/yanshouwang/bluetooth_low_energy/issues