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:
@ -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<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. */
|
||||
data class MyCentralArgs (
|
||||
val addressArgs: String
|
||||
@ -503,7 +591,7 @@ interface MyCentralManagerHostAPI {
|
||||
fun initialize(): MyCentralManagerArgs
|
||||
fun getState(): MyBluetoothLowEnergyStateArgs
|
||||
fun authorize(callback: (Result<Boolean>) -> Unit)
|
||||
fun showAppSettings(callback: (Result<Unit>) -> Unit)
|
||||
fun showAppSettings()
|
||||
fun startDiscovery(serviceUUIDsArgs: List<String>, callback: (Result<Unit>) -> Unit)
|
||||
fun stopDiscovery()
|
||||
fun connect(addressArgs: String, callback: (Result<Unit>) -> 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<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec)
|
||||
if (api != null) {
|
||||
channel.setMessageHandler { _, reply ->
|
||||
api.showAppSettings() { result: Result<Unit> ->
|
||||
val error = result.exceptionOrNull()
|
||||
if (error != null) {
|
||||
reply.reply(wrapError(error))
|
||||
} else {
|
||||
reply.reply(wrapResult(null))
|
||||
}
|
||||
val wrapped: List<Any?> = try {
|
||||
api.showAppSettings()
|
||||
listOf<Any?>(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<Any?>)?.let {
|
||||
MyAdvertisementArgs.fromList(it)
|
||||
MyAdvertiseDataArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
129.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyManufacturerSpecificDataArgs.fromList(it)
|
||||
MyAdvertiseSettingsArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
130.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyMutableGATTCharacteristicArgs.fromList(it)
|
||||
MyManufacturerSpecificDataArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
131.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyMutableGATTDescriptorArgs.fromList(it)
|
||||
MyMutableGATTCharacteristicArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
132.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyMutableGATTServiceArgs.fromList(it)
|
||||
MyMutableGATTDescriptorArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
133.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyMutableGATTServiceArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
134.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.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<Boolean>) -> Unit)
|
||||
fun showAppSettings(callback: (Result<Unit>) -> Unit)
|
||||
fun showAppSettings()
|
||||
fun setName(nameArgs: String, callback: (Result<String?>) -> Unit)
|
||||
fun openGATTServer()
|
||||
fun closeGATTServer()
|
||||
fun addService(serviceArgs: MyMutableGATTServiceArgs, callback: (Result<Unit>) -> Unit)
|
||||
fun removeService(hashCodeArgs: Long)
|
||||
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 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)
|
||||
@ -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<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostAPI.showAppSettings$separatedMessageChannelSuffix", codec)
|
||||
if (api != null) {
|
||||
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()
|
||||
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<Any?>
|
||||
val advertisementArgsArg = args[0] as MyAdvertisementArgs
|
||||
api.startAdvertising(advertisementArgsArg) { result: Result<Unit> ->
|
||||
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<Unit> ->
|
||||
val error = result.exceptionOrNull()
|
||||
if (error != null) {
|
||||
reply.reply(wrapError(error))
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
@ -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<out String>, results: IntArray): Boolean
|
||||
abstract fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,6 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
|
||||
private val mDescriptors: MutableMap<String, MutableMap<Long, BluetoothGattDescriptor>>
|
||||
|
||||
private var mAuthorizeCallback: ((Result<Boolean>) -> Unit)?
|
||||
private var mShowAppSettingsCallback: ((Result<Unit>) -> Unit)?
|
||||
private var mStartDiscoveryCallback: ((Result<Unit>) -> Unit)?
|
||||
private val mConnectCallbacks: 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()
|
||||
|
||||
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>) -> 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<String>, callback: (Result<Unit>) -> 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
|
||||
|
@ -43,7 +43,7 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) :
|
||||
private val mDescriptors: MutableMap<Long, BluetoothGattDescriptor>
|
||||
|
||||
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 mStartAdvertisingCallback: ((Result<Unit>) -> Unit)?
|
||||
private val mNotifyCharacteristicValueChangedCallbacks: MutableMap<String, (Result<Unit>) -> 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>) -> 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 {
|
||||
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>) -> Unit) {
|
||||
override fun startAdvertising(settingsArgs: MyAdvertiseSettingsArgs, advertiseDataArgs: MyAdvertiseDataArgs, scanResponseArgs: MyAdvertiseDataArgs, callback: (Result<Unit>) -> 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<out String>, 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
|
||||
|
Reference in New Issue
Block a user