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 <yanshouwang@outlook.com>
This commit is contained in:
渐渐被你吸引
2024-06-09 23:30:38 +08:00
committed by GitHub
parent 87dfbc8ec6
commit c9f0e7e5ee
16 changed files with 478 additions and 147 deletions

View File

@ -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 ## 6.0.0
* [Add `CentralManager#retrieveConnectedPeripherals` method.](https://github.com/yanshouwang/bluetooth_low_energy/issues/61) * [Add `CentralManager#retrieveConnectedPeripherals` method.](https://github.com/yanshouwang/bluetooth_low_energy/issues/61)

View File

@ -23,15 +23,15 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "6.0.0" version: "6.0.1"
bluetooth_low_energy_android: bluetooth_low_energy_android:
dependency: transitive dependency: transitive
description: description:
name: bluetooth_low_energy_android name: bluetooth_low_energy_android
sha256: "39284bb33a10cc3bc126e18968865f47fc0155495a7473afc705eb4be8b07728" sha256: "97cac5169a392f3872cbb416cc11cf0b2287567c0ceca4d975f2fc5bdd2b1e6f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.0" version: "6.0.2"
bluetooth_low_energy_darwin: bluetooth_low_energy_darwin:
dependency: transitive dependency: transitive
description: description:

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy name: bluetooth_low_energy
description: "A Flutter plugin for controlling the bluetooth low energy, supports central and peripheral roles." 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 homepage: https://github.com/yanshouwang/bluetooth_low_energy
repository: 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 issue_tracker: https://github.com/yanshouwang/bluetooth_low_energy/issues
@ -20,7 +20,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^6.0.0 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_darwin: ^6.0.0
bluetooth_low_energy_windows: ^6.0.0 bluetooth_low_energy_windows: ^6.0.0
bluetooth_low_energy_linux: ^6.0.0 bluetooth_low_energy_linux: ^6.0.0

View File

@ -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 ## 6.0.0
* Add `serviceUUIDs` argument to `CentralManager#startDiscovery` method. * Add `serviceUUIDs` argument to `CentralManager#startDiscovery` method.

View File

@ -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 // See also: https://pub.dev/packages/pigeon
@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") @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) { enum class MyConnectionStateArgs(val raw: Int) {
DISCONNECTED(0), DISCONNECTED(0),
CONNECTING(1), 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<Any?>): 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<Any?> {
return listOf<Any?>(
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<String?>,
val serviceDataArgs: Map<String?, ByteArray?>,
val manufacturerSpecificDataArgs: List<MyManufacturerSpecificDataArgs?>
) {
companion object {
@Suppress("LocalVariableName")
fun fromList(__pigeon_list: List<Any?>): MyAdvertiseDataArgs {
val includeDeviceNameArgs = __pigeon_list[0] as Boolean?
val includeTXPowerLevelArgs = __pigeon_list[1] as Boolean?
val serviceUUIDsArgs = __pigeon_list[2] as List<String?>
val serviceDataArgs = __pigeon_list[3] as Map<String?, ByteArray?>
val manufacturerSpecificDataArgs = __pigeon_list[4] as List<MyManufacturerSpecificDataArgs?>
return MyAdvertiseDataArgs(includeDeviceNameArgs, includeTXPowerLevelArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
}
}
fun toList(): List<Any?> {
return listOf<Any?>(
includeDeviceNameArgs,
includeTXPowerLevelArgs,
serviceUUIDsArgs,
serviceDataArgs,
manufacturerSpecificDataArgs,
)
}
}
/** Generated class from Pigeon that represents data sent in messages. */ /** Generated class from Pigeon that represents data sent in messages. */
data class MyCentralArgs ( data class MyCentralArgs (
val addressArgs: String val addressArgs: String
@ -503,7 +591,7 @@ interface MyCentralManagerHostAPI {
fun initialize(): MyCentralManagerArgs fun initialize(): MyCentralManagerArgs
fun getState(): MyBluetoothLowEnergyStateArgs fun getState(): MyBluetoothLowEnergyStateArgs
fun authorize(callback: (Result<Boolean>) -> Unit) fun authorize(callback: (Result<Boolean>) -> Unit)
fun showAppSettings(callback: (Result<Unit>) -> Unit) fun showAppSettings()
fun startDiscovery(serviceUUIDsArgs: List<String>, callback: (Result<Unit>) -> Unit) fun startDiscovery(serviceUUIDsArgs: List<String>, callback: (Result<Unit>) -> Unit)
fun stopDiscovery() fun stopDiscovery()
fun connect(addressArgs: String, callback: (Result<Unit>) -> Unit) fun connect(addressArgs: String, callback: (Result<Unit>) -> Unit)
@ -524,6 +612,7 @@ interface MyCentralManagerHostAPI {
MyCentralManagerHostAPICodec MyCentralManagerHostAPICodec
} }
/** Sets up an instance of `MyCentralManagerHostAPI` to handle messages through the `binaryMessenger`. */ /** Sets up an instance of `MyCentralManagerHostAPI` to handle messages through the `binaryMessenger`. */
@JvmOverloads
fun setUp(binaryMessenger: BinaryMessenger, api: MyCentralManagerHostAPI?, messageChannelSuffix: String = "") { fun setUp(binaryMessenger: BinaryMessenger, api: MyCentralManagerHostAPI?, messageChannelSuffix: String = "") {
val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
run { run {
@ -578,14 +667,13 @@ interface MyCentralManagerHostAPI {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec)
if (api != null) { if (api != null) {
channel.setMessageHandler { _, reply -> channel.setMessageHandler { _, reply ->
api.showAppSettings() { result: Result<Unit> -> val wrapped: List<Any?> = try {
val error = result.exceptionOrNull() api.showAppSettings()
if (error != null) { listOf<Any?>(null)
reply.reply(wrapError(error)) } catch (exception: Throwable) {
} else { wrapError(exception)
reply.reply(wrapResult(null))
}
} }
reply.reply(wrapped)
} }
} else { } else {
channel.setMessageHandler(null) channel.setMessageHandler(null)
@ -1005,30 +1093,35 @@ private object MyPeripheralManagerHostAPICodec : StandardMessageCodec() {
return when (type) { return when (type) {
128.toByte() -> { 128.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyAdvertisementArgs.fromList(it) MyAdvertiseDataArgs.fromList(it)
} }
} }
129.toByte() -> { 129.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyManufacturerSpecificDataArgs.fromList(it) MyAdvertiseSettingsArgs.fromList(it)
} }
} }
130.toByte() -> { 130.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyMutableGATTCharacteristicArgs.fromList(it) MyManufacturerSpecificDataArgs.fromList(it)
} }
} }
131.toByte() -> { 131.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyMutableGATTDescriptorArgs.fromList(it) MyMutableGATTCharacteristicArgs.fromList(it)
} }
} }
132.toByte() -> { 132.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyMutableGATTServiceArgs.fromList(it) MyMutableGATTDescriptorArgs.fromList(it)
} }
} }
133.toByte() -> { 133.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let {
MyMutableGATTServiceArgs.fromList(it)
}
}
134.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyPeripheralManagerArgs.fromList(it) MyPeripheralManagerArgs.fromList(it)
} }
@ -1038,30 +1131,34 @@ private object MyPeripheralManagerHostAPICodec : StandardMessageCodec() {
} }
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
when (value) { when (value) {
is MyAdvertisementArgs -> { is MyAdvertiseDataArgs -> {
stream.write(128) stream.write(128)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
is MyManufacturerSpecificDataArgs -> { is MyAdvertiseSettingsArgs -> {
stream.write(129) stream.write(129)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
is MyMutableGATTCharacteristicArgs -> { is MyManufacturerSpecificDataArgs -> {
stream.write(130) stream.write(130)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
is MyMutableGATTDescriptorArgs -> { is MyMutableGATTCharacteristicArgs -> {
stream.write(131) stream.write(131)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
is MyMutableGATTServiceArgs -> { is MyMutableGATTDescriptorArgs -> {
stream.write(132) stream.write(132)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
is MyPeripheralManagerArgs -> { is MyMutableGATTServiceArgs -> {
stream.write(133) stream.write(133)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
is MyPeripheralManagerArgs -> {
stream.write(134)
writeValue(stream, value.toList())
}
else -> super.writeValue(stream, value) else -> super.writeValue(stream, value)
} }
} }
@ -1072,13 +1169,14 @@ interface MyPeripheralManagerHostAPI {
fun initialize(): MyPeripheralManagerArgs fun initialize(): MyPeripheralManagerArgs
fun getState(): MyBluetoothLowEnergyStateArgs fun getState(): MyBluetoothLowEnergyStateArgs
fun authorize(callback: (Result<Boolean>) -> Unit) fun authorize(callback: (Result<Boolean>) -> Unit)
fun showAppSettings(callback: (Result<Unit>) -> Unit) fun showAppSettings()
fun setName(nameArgs: String, callback: (Result<String?>) -> Unit)
fun openGATTServer() fun openGATTServer()
fun closeGATTServer() fun closeGATTServer()
fun addService(serviceArgs: MyMutableGATTServiceArgs, callback: (Result<Unit>) -> Unit) fun addService(serviceArgs: MyMutableGATTServiceArgs, callback: (Result<Unit>) -> Unit)
fun removeService(hashCodeArgs: Long) fun removeService(hashCodeArgs: Long)
fun removeAllServices() fun removeAllServices()
fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result<Unit>) -> Unit) fun startAdvertising(settingsArgs: MyAdvertiseSettingsArgs, advertiseDataArgs: MyAdvertiseDataArgs, scanResponseArgs: MyAdvertiseDataArgs, callback: (Result<Unit>) -> Unit)
fun stopAdvertising() fun stopAdvertising()
fun sendResponse(addressArgs: String, idArgs: Long, statusArgs: MyGATTStatusArgs, offsetArgs: Long, valueArgs: ByteArray?) 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>) -> Unit) fun notifyCharacteristicChanged(addressArgs: String, hashCodeArgs: Long, confirmArgs: Boolean, valueArgs: ByteArray, callback: (Result<Unit>) -> Unit)
@ -1089,6 +1187,7 @@ interface MyPeripheralManagerHostAPI {
MyPeripheralManagerHostAPICodec MyPeripheralManagerHostAPICodec
} }
/** Sets up an instance of `MyPeripheralManagerHostAPI` to handle messages through the `binaryMessenger`. */ /** Sets up an instance of `MyPeripheralManagerHostAPI` to handle messages through the `binaryMessenger`. */
@JvmOverloads
fun setUp(binaryMessenger: BinaryMessenger, api: MyPeripheralManagerHostAPI?, messageChannelSuffix: String = "") { fun setUp(binaryMessenger: BinaryMessenger, api: MyPeripheralManagerHostAPI?, messageChannelSuffix: String = "") {
val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
run { run {
@ -1143,12 +1242,31 @@ interface MyPeripheralManagerHostAPI {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec)
if (api != null) { if (api != null) {
channel.setMessageHandler { _, reply -> channel.setMessageHandler { _, reply ->
api.showAppSettings() { result: Result<Unit> -> val wrapped: List<Any?> = try {
api.showAppSettings()
listOf<Any?>(null)
} catch (exception: Throwable) {
wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.setName$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val nameArgsArg = args[0] as String
api.setName(nameArgsArg) { result: Result<String?> ->
val error = result.exceptionOrNull() val error = result.exceptionOrNull()
if (error != null) { if (error != null) {
reply.reply(wrapError(error)) reply.reply(wrapError(error))
} else { } else {
reply.reply(wrapResult(null)) val data = result.getOrNull()
reply.reply(wrapResult(data))
} }
} }
} }
@ -1246,8 +1364,10 @@ interface MyPeripheralManagerHostAPI {
if (api != null) { if (api != null) {
channel.setMessageHandler { message, reply -> channel.setMessageHandler { message, reply ->
val args = message as List<Any?> val args = message as List<Any?>
val advertisementArgsArg = args[0] as MyAdvertisementArgs val settingsArgsArg = args[0] as MyAdvertiseSettingsArgs
api.startAdvertising(advertisementArgsArg) { result: Result<Unit> -> val advertiseDataArgsArg = args[1] as MyAdvertiseDataArgs
val scanResponseArgsArg = args[2] as MyAdvertiseDataArgs
api.startAdvertising(settingsArgsArg, advertiseDataArgsArg, scanResponseArgsArg) { result: Result<Unit> ->
val error = result.exceptionOrNull() val error = result.exceptionOrNull()
if (error != null) { if (error != null) {
reply.reply(wrapError(error)) reply.reply(wrapError(error))

View File

@ -8,6 +8,7 @@ import android.bluetooth.BluetoothGattDescriptor
import android.bluetooth.BluetoothGattService import android.bluetooth.BluetoothGattService
import android.bluetooth.BluetoothProfile import android.bluetooth.BluetoothProfile
import android.bluetooth.le.AdvertiseData import android.bluetooth.le.AdvertiseData
import android.bluetooth.le.AdvertiseSettings
import android.bluetooth.le.ScanResult import android.bluetooth.le.ScanResult
import android.os.Build import android.os.Build
import android.os.ParcelUuid import android.os.ParcelUuid
@ -15,6 +16,23 @@ import android.util.SparseArray
import java.util.UUID import java.util.UUID
//region ToObject //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 { fun MyGATTCharacteristicWriteTypeArgs.toType(): Int {
return when (this) { return when (this) {
MyGATTCharacteristicWriteTypeArgs.WITH_RESPONSE -> BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT MyGATTCharacteristicWriteTypeArgs.WITH_RESPONSE -> BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT
@ -39,31 +57,56 @@ fun MyGATTStatusArgs.toStatus(): Int {
} }
} }
fun MyAdvertisementArgs.toAdvertiseData(): AdvertiseData { fun MyAdvertiseSettingsArgs.toAdvertiseSettings(): AdvertiseSettings {
val advertiseDataBuilder = AdvertiseData.Builder() 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) { for (serviceUuidArgs in serviceUUIDsArgs) {
val serviceUUID = ParcelUuid.fromString(serviceUuidArgs) val serviceUUID = ParcelUuid.fromString(serviceUuidArgs)
advertiseDataBuilder.addServiceUuid(serviceUUID) builder.addServiceUuid(serviceUUID)
} }
for (entry in serviceDataArgs) { for (entry in serviceDataArgs) {
val serviceDataUUID = ParcelUuid.fromString(entry.key as String) val serviceDataUUID = ParcelUuid.fromString(entry.key as String)
val serviceData = entry.value as ByteArray val serviceData = entry.value as ByteArray
advertiseDataBuilder.addServiceData(serviceDataUUID, serviceData) builder.addServiceData(serviceDataUUID, serviceData)
} }
for (args in manufacturerSpecificDataArgs) { for (args in manufacturerSpecificDataArgs) {
val itemArgs = args as MyManufacturerSpecificDataArgs val itemArgs = args as MyManufacturerSpecificDataArgs
val manufacturerId = itemArgs.idArgs.toInt() val manufacturerId = itemArgs.idArgs.toInt()
val manufacturerSpecificData = itemArgs.dataArgs val manufacturerSpecificData = itemArgs.dataArgs
advertiseDataBuilder.addManufacturerData(manufacturerId, manufacturerSpecificData) builder.addManufacturerData(manufacturerId, manufacturerSpecificData)
} }
return advertiseDataBuilder.build() return builder.build()
}
fun MyAdvertisementArgs.toScanResponse(): AdvertiseData {
val advertiseDataBuilder = AdvertiseData.Builder()
val includeDeviceName = nameArgs != null
advertiseDataBuilder.setIncludeDeviceName(includeDeviceName)
return advertiseDataBuilder.build()
} }
fun MyMutableGATTDescriptorArgs.toDescriptor(): BluetoothGattDescriptor { fun MyMutableGATTDescriptorArgs.toDescriptor(): BluetoothGattDescriptor {

View File

@ -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)
}
}

View File

@ -12,17 +12,16 @@ import io.flutter.plugin.common.PluginRegistry
abstract class MyBluetoothLowEnergyManager(val context: Context) { abstract class MyBluetoothLowEnergyManager(val context: Context) {
companion object { companion object {
const val AUTHORIZE_CODE = 0x00 const val AUTHORIZE_CODE = 0x00
const val SHOW_APP_SETTINGS_CODE = 0x01
} }
private val mBroadcastReceiver: BroadcastReceiver by lazy { MyBroadcastReceiver(this) } private val mBroadcastReceiver: BroadcastReceiver by lazy { MyBroadcastReceiver(this) }
private val mRequestPermissionsResultListener: PluginRegistry.RequestPermissionsResultListener by lazy { MyRequestPermissionResultListener(this) } private val mRequestPermissionsResultListener: PluginRegistry.RequestPermissionsResultListener by lazy { MyRequestPermissionResultListener(this) }
private val mActivityResultListener: PluginRegistry.ActivityResultListener by lazy { MyActivityResultListener(this) }
private lateinit var mBinding: ActivityPluginBinding private lateinit var mBinding: ActivityPluginBinding
init { init {
val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED) val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED)
context.registerReceiver(mBroadcastReceiver, filter) context.registerReceiver(mBroadcastReceiver, filter)
} }
@ -30,17 +29,14 @@ abstract class MyBluetoothLowEnergyManager(val context: Context) {
fun onAttachedToActivity(binding: ActivityPluginBinding) { fun onAttachedToActivity(binding: ActivityPluginBinding) {
binding.addRequestPermissionsResultListener(mRequestPermissionsResultListener) binding.addRequestPermissionsResultListener(mRequestPermissionsResultListener)
binding.addActivityResultListener(mActivityResultListener)
mBinding = binding mBinding = binding
} }
fun onDetachedFromActivity() { fun onDetachedFromActivity() {
mBinding.removeRequestPermissionsResultListener(mRequestPermissionsResultListener) mBinding.removeRequestPermissionsResultListener(mRequestPermissionsResultListener)
mBinding.removeActivityResultListener(mActivityResultListener)
} }
abstract fun onReceive(context: Context, intent: Intent) abstract fun onReceive(context: Context, intent: Intent)
abstract fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, results: IntArray): Boolean abstract fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, results: IntArray): Boolean
abstract fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean
} }

View File

@ -42,7 +42,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
private val mDescriptors: MutableMap<String, MutableMap<Long, BluetoothGattDescriptor>> private val mDescriptors: MutableMap<String, MutableMap<Long, BluetoothGattDescriptor>>
private var mAuthorizeCallback: ((Result<Boolean>) -> Unit)? private var mAuthorizeCallback: ((Result<Boolean>) -> Unit)?
private var mShowAppSettingsCallback: ((Result<Unit>) -> Unit)?
private var mStartDiscoveryCallback: ((Result<Unit>) -> Unit)? private var mStartDiscoveryCallback: ((Result<Unit>) -> Unit)?
private val mConnectCallbacks: MutableMap<String, (Result<Unit>) -> Unit> private val mConnectCallbacks: MutableMap<String, (Result<Unit>) -> Unit>
private val mDisconnectCallbacks: MutableMap<String, (Result<Unit>) -> Unit> private val mDisconnectCallbacks: MutableMap<String, (Result<Unit>) -> Unit>
@ -65,7 +64,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
mDescriptors = mutableMapOf() mDescriptors = mutableMapOf()
mAuthorizeCallback = null mAuthorizeCallback = null
mShowAppSettingsCallback = null
mStartDiscoveryCallback = null mStartDiscoveryCallback = null
mConnectCallbacks = mutableMapOf() mConnectCallbacks = mutableMapOf()
mDisconnectCallbacks = mutableMapOf() mDisconnectCallbacks = mutableMapOf()
@ -104,7 +102,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
mDescriptors.clear() mDescriptors.clear()
mAuthorizeCallback = null mAuthorizeCallback = null
mShowAppSettingsCallback = null
mStartDiscoveryCallback = null mStartDiscoveryCallback = null
mConnectCallbacks.clear() mConnectCallbacks.clear()
mDisconnectCallbacks.clear() mDisconnectCallbacks.clear()
@ -140,16 +137,11 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
} }
} }
override fun showAppSettings(callback: (Result<Unit>) -> Unit) { override fun showAppSettings() {
try { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) intent.data = Uri.fromParts("package", activity.packageName, null)
intent.data = Uri.fromParts("package", activity.packageName, null) val options = ActivityOptionsCompat.makeBasic().toBundle()
val options = ActivityOptionsCompat.makeBasic().toBundle() ActivityCompat.startActivity(activity, intent, options)
ActivityCompat.startActivityForResult(activity, intent, SHOW_APP_SETTINGS_CODE, options)
mShowAppSettingsCallback = callback
} catch (e: Throwable) {
callback(Result.failure(e))
}
} }
override fun startDiscovery(serviceUUIDsArgs: List<String>, callback: (Result<Unit>) -> Unit) { override fun startDiscovery(serviceUUIDsArgs: List<String>, callback: (Result<Unit>) -> Unit) {
@ -355,16 +347,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
return true 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() { private fun onScanSucceeded() {
mDiscovering = true mDiscovering = true
val callback = mStartDiscoveryCallback ?: return val callback = mStartDiscoveryCallback ?: return

View File

@ -43,7 +43,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
private val mDescriptors: MutableMap<Long, BluetoothGattDescriptor> private val mDescriptors: MutableMap<Long, BluetoothGattDescriptor>
private var mAuthorizeCallback: ((Result<Boolean>) -> Unit)? private var mAuthorizeCallback: ((Result<Boolean>) -> Unit)?
private var mShowAppSettingsCallback: ((Result<Unit>) -> Unit)? private var mSetNameCallback: ((Result<String?>) -> Unit)?
private var mAddServiceCallback: ((Result<Unit>) -> Unit)? private var mAddServiceCallback: ((Result<Unit>) -> Unit)?
private var mStartAdvertisingCallback: ((Result<Unit>) -> Unit)? private var mStartAdvertisingCallback: ((Result<Unit>) -> Unit)?
private val mNotifyCharacteristicValueChangedCallbacks: MutableMap<String, (Result<Unit>) -> Unit> private val mNotifyCharacteristicValueChangedCallbacks: MutableMap<String, (Result<Unit>) -> Unit>
@ -64,7 +64,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
mDescriptors = mutableMapOf() mDescriptors = mutableMapOf()
mAuthorizeCallback = null mAuthorizeCallback = null
mShowAppSettingsCallback = null mSetNameCallback = null
mAddServiceCallback = null mAddServiceCallback = null
mStartAdvertisingCallback = null mStartAdvertisingCallback = null
mNotifyCharacteristicValueChangedCallbacks = mutableMapOf() mNotifyCharacteristicValueChangedCallbacks = mutableMapOf()
@ -99,7 +99,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
mDescriptors.clear() mDescriptors.clear()
mAuthorizeCallback = null mAuthorizeCallback = null
mShowAppSettingsCallback = null mSetNameCallback = null
mAddServiceCallback = null mAddServiceCallback = null
mStartAdvertisingCallback = null mStartAdvertisingCallback = null
mNotifyCharacteristicValueChangedCallbacks.clear() mNotifyCharacteristicValueChangedCallbacks.clear()
@ -128,13 +128,20 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
} }
} }
override fun showAppSettings(callback: (Result<Unit>) -> 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<String?>) -> Unit) {
try { try {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) val setting = adapter.setName(nameArgs)
intent.data = Uri.fromParts("package", activity.packageName, null) if (!setting) {
val options = ActivityOptionsCompat.makeBasic().toBundle() throw IllegalStateException()
ActivityCompat.startActivityForResult(activity, intent, SHOW_APP_SETTINGS_CODE, options) }
mShowAppSettingsCallback = callback mSetNameCallback = callback
} catch (e: Throwable) { } catch (e: Throwable) {
callback(Result.failure(e)) callback(Result.failure(e))
} }
@ -183,17 +190,11 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
mDescriptorsArgs.clear() mDescriptorsArgs.clear()
} }
override fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result<Unit>) -> Unit) { override fun startAdvertising(settingsArgs: MyAdvertiseSettingsArgs, advertiseDataArgs: MyAdvertiseDataArgs, scanResponseArgs: MyAdvertiseDataArgs, callback: (Result<Unit>) -> Unit) {
try { try {
val settings = AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setConnectable(true).build() val settings = settingsArgs.toAdvertiseSettings()
// TODO: There is an issue that Android will use the cached name before setName takes effect. val advertiseData = advertiseDataArgs.toAdvertiseData()
// see https://stackoverflow.com/questions/8377558/change-the-android-bluetooth-device-name val scanResponse = scanResponseArgs.toAdvertiseData()
val nameArgs = advertisementArgs.nameArgs
if (nameArgs != null) {
adapter.name = nameArgs
}
val advertiseData = advertisementArgs.toAdvertiseData()
val scanResponse = advertisementArgs.toScanResponse()
advertiser.startAdvertising(settings, advertiseData, scanResponse, mAdvertiseCallback) advertiser.startAdvertising(settings, advertiseData, scanResponse, mAdvertiseCallback)
mStartAdvertisingCallback = callback mStartAdvertisingCallback = callback
} catch (e: Throwable) { } catch (e: Throwable) {
@ -238,12 +239,20 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
} }
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
if (intent.action != BluetoothAdapter.ACTION_STATE_CHANGED) { when (intent.action) {
return 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<out String>, results: IntArray): Boolean { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, results: IntArray): Boolean {
@ -257,16 +266,6 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
return true 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) { fun onServiceAdded(status: Int, service: BluetoothGattService) {
val callback = mAddServiceCallback ?: return val callback = mAddServiceCallback ?: return
mAddServiceCallback = null mAddServiceCallback = null

View File

@ -15,7 +15,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "6.0.0" version: "6.0.2"
bluetooth_low_energy_platform_interface: bluetooth_low_energy_platform_interface:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -198,9 +198,8 @@ extension ManufacturerSpecificDataX on ManufacturerSpecificData {
} }
extension AdvertisementX on Advertisement { extension AdvertisementX on Advertisement {
MyAdvertisementArgs toArgs() { MyAdvertiseDataArgs toAdvertiseDataArgs() {
return MyAdvertisementArgs( return MyAdvertiseDataArgs(
nameArgs: name,
serviceUUIDsArgs: serviceUUIDs.map((uuid) => uuid.toArgs()).toList(), serviceUUIDsArgs: serviceUUIDs.map((uuid) => uuid.toArgs()).toList(),
serviceDataArgs: serviceData.map((uuid, data) { serviceDataArgs: serviceData.map((uuid, data) {
final uuidArgs = uuid.toArgs(); final uuidArgs = uuid.toArgs();
@ -211,6 +210,15 @@ extension AdvertisementX on Advertisement {
manufacturerSpecificData.map((data) => data.toArgs()).toList(), manufacturerSpecificData.map((data) => data.toArgs()).toList(),
); );
} }
MyAdvertiseDataArgs toScanResponseArgs() {
return MyAdvertiseDataArgs(
includeDeviceNameArgs: name != null,
serviceUUIDsArgs: [],
serviceDataArgs: {},
manufacturerSpecificDataArgs: [],
);
}
} }
extension MutableGATTDescriptorX on MutableGATTDescriptor { extension MutableGATTDescriptorX on MutableGATTDescriptor {

View File

@ -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 // 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 // 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, turningOff,
} }
enum MyAdvertiseModeArgs {
lowPower,
balanced,
lowLatency,
}
enum MyTXPowerLevelArgs {
ultraLow,
low,
medium,
high,
}
enum MyConnectionStateArgs { enum MyConnectionStateArgs {
disconnected, disconnected,
connecting, 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 <Object?>[
modeArgs?.index,
connectableArgs,
timeoutArgs,
txPowerLevelArgs?.index,
];
}
static MyAdvertiseSettingsArgs decode(Object result) {
result as List<Object?>;
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<String?> serviceUUIDsArgs;
Map<String?, Uint8List?> serviceDataArgs;
List<MyManufacturerSpecificDataArgs?> manufacturerSpecificDataArgs;
Object encode() {
return <Object?>[
includeDeviceNameArgs,
includeTXPowerLevelArgs,
serviceUUIDsArgs,
serviceDataArgs,
manufacturerSpecificDataArgs,
];
}
static MyAdvertiseDataArgs decode(Object result) {
result as List<Object?>;
return MyAdvertiseDataArgs(
includeDeviceNameArgs: result[0] as bool?,
includeTXPowerLevelArgs: result[1] as bool?,
serviceUUIDsArgs: (result[2] as List<Object?>?)!.cast<String?>(),
serviceDataArgs: (result[3] as Map<Object?, Object?>?)!.cast<String?, Uint8List?>(),
manufacturerSpecificDataArgs: (result[4] as List<Object?>?)!.cast<MyManufacturerSpecificDataArgs?>(),
);
}
}
class MyCentralArgs { class MyCentralArgs {
MyCentralArgs({ MyCentralArgs({
required this.addressArgs, required this.addressArgs,
@ -1142,24 +1236,27 @@ class _MyPeripheralManagerHostAPICodec extends StandardMessageCodec {
const _MyPeripheralManagerHostAPICodec(); const _MyPeripheralManagerHostAPICodec();
@override @override
void writeValue(WriteBuffer buffer, Object? value) { void writeValue(WriteBuffer buffer, Object? value) {
if (value is MyAdvertisementArgs) { if (value is MyAdvertiseDataArgs) {
buffer.putUint8(128); buffer.putUint8(128);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyManufacturerSpecificDataArgs) { } else if (value is MyAdvertiseSettingsArgs) {
buffer.putUint8(129); buffer.putUint8(129);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyMutableGATTCharacteristicArgs) { } else if (value is MyManufacturerSpecificDataArgs) {
buffer.putUint8(130); buffer.putUint8(130);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyMutableGATTDescriptorArgs) { } else if (value is MyMutableGATTCharacteristicArgs) {
buffer.putUint8(131); buffer.putUint8(131);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyMutableGATTServiceArgs) { } else if (value is MyMutableGATTDescriptorArgs) {
buffer.putUint8(132); buffer.putUint8(132);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyPeripheralManagerArgs) { } else if (value is MyMutableGATTServiceArgs) {
buffer.putUint8(133); buffer.putUint8(133);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyPeripheralManagerArgs) {
buffer.putUint8(134);
writeValue(buffer, value.encode());
} else { } else {
super.writeValue(buffer, value); super.writeValue(buffer, value);
} }
@ -1169,16 +1266,18 @@ class _MyPeripheralManagerHostAPICodec extends StandardMessageCodec {
Object? readValueOfType(int type, ReadBuffer buffer) { Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) { switch (type) {
case 128: case 128:
return MyAdvertisementArgs.decode(readValue(buffer)!); return MyAdvertiseDataArgs.decode(readValue(buffer)!);
case 129: case 129:
return MyManufacturerSpecificDataArgs.decode(readValue(buffer)!); return MyAdvertiseSettingsArgs.decode(readValue(buffer)!);
case 130: case 130:
return MyMutableGATTCharacteristicArgs.decode(readValue(buffer)!); return MyManufacturerSpecificDataArgs.decode(readValue(buffer)!);
case 131: case 131:
return MyMutableGATTDescriptorArgs.decode(readValue(buffer)!); return MyMutableGATTCharacteristicArgs.decode(readValue(buffer)!);
case 132: case 132:
return MyMutableGATTServiceArgs.decode(readValue(buffer)!); return MyMutableGATTDescriptorArgs.decode(readValue(buffer)!);
case 133: case 133:
return MyMutableGATTServiceArgs.decode(readValue(buffer)!);
case 134:
return MyPeripheralManagerArgs.decode(readValue(buffer)!); return MyPeripheralManagerArgs.decode(readValue(buffer)!);
default: default:
return super.readValueOfType(type, buffer); return super.readValueOfType(type, buffer);
@ -1302,6 +1401,28 @@ class MyPeripheralManagerHostAPI {
} }
} }
Future<String?> setName(String nameArgs) async {
final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.setName$__pigeon_messageChannelSuffix';
final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>(
__pigeon_channelName,
pigeonChannelCodec,
binaryMessenger: __pigeon_binaryMessenger,
);
final List<Object?>? __pigeon_replyList =
await __pigeon_channel.send(<Object?>[nameArgs]) as List<Object?>?;
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<void> openGATTServer() async { Future<void> openGATTServer() async {
final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.openGATTServer$__pigeon_messageChannelSuffix'; final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.openGATTServer$__pigeon_messageChannelSuffix';
final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>( final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>(
@ -1412,7 +1533,7 @@ class MyPeripheralManagerHostAPI {
} }
} }
Future<void> startAdvertising(MyAdvertisementArgs advertisementArgs) async { Future<void> startAdvertising(MyAdvertiseSettingsArgs settingsArgs, MyAdvertiseDataArgs advertiseDataArgs, MyAdvertiseDataArgs scanResponseArgs) async {
final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.startAdvertising$__pigeon_messageChannelSuffix'; final String __pigeon_channelName = 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.startAdvertising$__pigeon_messageChannelSuffix';
final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>( final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>(
__pigeon_channelName, __pigeon_channelName,
@ -1420,7 +1541,7 @@ class MyPeripheralManagerHostAPI {
binaryMessenger: __pigeon_binaryMessenger, binaryMessenger: __pigeon_binaryMessenger,
); );
final List<Object?>? __pigeon_replyList = final List<Object?>? __pigeon_replyList =
await __pigeon_channel.send(<Object?>[advertisementArgs]) as List<Object?>?; await __pigeon_channel.send(<Object?>[settingsArgs, advertiseDataArgs, scanResponseArgs]) as List<Object?>?;
if (__pigeon_replyList == null) { if (__pigeon_replyList == null) {
throw _createConnectionError(__pigeon_channelName); throw _createConnectionError(__pigeon_channelName);
} else if (__pigeon_replyList.length > 1) { } else if (__pigeon_replyList.length > 1) {

View File

@ -156,9 +156,28 @@ final class MyPeripheralManager extends PlatformPeripheralManager
@override @override
Future<void> startAdvertising(Advertisement advertisement) async { Future<void> startAdvertising(Advertisement advertisement) async {
final advertisementArgs = advertisement.toArgs(); final nameArgs = advertisement.name;
logger.info('startAdvertising: $advertisementArgs'); if (nameArgs != null) {
await _api.startAdvertising(advertisementArgs); 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 @override

View File

@ -24,6 +24,19 @@ enum MyBluetoothLowEnergyStateArgs {
turningOff, turningOff,
} }
enum MyAdvertiseModeArgs {
lowPower,
balanced,
lowLatency,
}
enum MyTXPowerLevelArgs {
ultraLow,
low,
medium,
high,
}
enum MyConnectionStateArgs { enum MyConnectionStateArgs {
disconnected, disconnected,
connecting, 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<String?> serviceUUIDsArgs;
final Map<String?, Uint8List?> serviceDataArgs;
final List<MyManufacturerSpecificDataArgs?> manufacturerSpecificDataArgs;
MyAdvertiseDataArgs(
this.includeDeviceNameArgs,
this.includeTXPowerLevelArgs,
this.serviceUUIDsArgs,
this.serviceDataArgs,
this.manufacturerSpecificDataArgs,
);
}
class MyCentralArgs { class MyCentralArgs {
final String addressArgs; final String addressArgs;
@ -212,7 +255,6 @@ abstract class MyCentralManagerHostAPI {
MyBluetoothLowEnergyStateArgs getState(); MyBluetoothLowEnergyStateArgs getState();
@async @async
bool authorize(); bool authorize();
@async
void showAppSettings(); void showAppSettings();
@async @async
void startDiscovery(List<String> serviceUUIDsArgs); void startDiscovery(List<String> serviceUUIDsArgs);
@ -278,8 +320,9 @@ abstract class MyPeripheralManagerHostAPI {
MyBluetoothLowEnergyStateArgs getState(); MyBluetoothLowEnergyStateArgs getState();
@async @async
bool authorize(); bool authorize();
@async
void showAppSettings(); void showAppSettings();
@async
String? setName(String nameArgs);
void openGATTServer(); void openGATTServer();
void closeGATTServer(); void closeGATTServer();
@async @async
@ -287,7 +330,11 @@ abstract class MyPeripheralManagerHostAPI {
void removeService(int hashCodeArgs); void removeService(int hashCodeArgs);
void removeAllServices(); void removeAllServices();
@async @async
void startAdvertising(MyAdvertisementArgs advertisementArgs); void startAdvertising(
MyAdvertiseSettingsArgs settingsArgs,
MyAdvertiseDataArgs advertiseDataArgs,
MyAdvertiseDataArgs scanResponseArgs,
);
void stopAdvertising(); void stopAdvertising();
void sendResponse( void sendResponse(
String addressArgs, String addressArgs,

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy_android name: bluetooth_low_energy_android
description: "Android implementation of the bluetooth_low_energy plugin." 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 homepage: https://github.com/yanshouwang/bluetooth_low_energy
repository: 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 issue_tracker: https://github.com/yanshouwang/bluetooth_low_energy/issues