From 5b308f044b085e2eccb9c9196bcd8cd8ca5629c1 Mon Sep 17 00:00:00 2001 From: iAMD Date: Wed, 17 Jan 2024 17:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20setUp=20=E5=92=8C=20clearS?= =?UTF-8?q?ervices=20=E9=94=99=E8=AF=AF=20(#39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bluetooth_low_energy/CHANGELOG.md | 9 +- bluetooth_low_energy/example/pubspec.lock | 6 +- bluetooth_low_energy/pubspec.yaml | 4 +- bluetooth_low_energy_android/CHANGELOG.md | 9 ++ .../bluetooth_low_energy_android/MyApi.g.kt | 38 +++--- .../bluetooth_low_energy_android/MyApi.kt | 7 +- .../MyBluetoothLowEnergyManager.kt | 58 +++------ .../MyCentralManager.kt | 48 +++++-- .../MyPeripheralManager.kt | 119 +++++++++++------- .../example/pubspec.lock | 2 +- .../lib/src/my_api.dart | 15 ++- .../lib/src/my_api.g.dart | 6 +- bluetooth_low_energy_android/my_api.dart | 8 +- bluetooth_low_energy_android/pubspec.yaml | 2 +- 14 files changed, 205 insertions(+), 126 deletions(-) diff --git a/bluetooth_low_energy/CHANGELOG.md b/bluetooth_low_energy/CHANGELOG.md index e13010d..b3f6ffe 100644 --- a/bluetooth_low_energy/CHANGELOG.md +++ b/bluetooth_low_energy/CHANGELOG.md @@ -1,10 +1,15 @@ +## 5.0.3 + +* `Android` Fix the wrong blutooth low energy state caused by multi permission requests at the same time. +* `Android` Fix the ConcurrentModificationException when `PeripheralManager#clearServices` is called. + ## 5.0.2 -* Fix the issue that [discoverGATT failed caused by CoW](https://github.com/yanshouwang/bluetooth_low_energy/issues/36). +* `iOS` Fix the issue that [discoverGATT failed](https://github.com/yanshouwang/bluetooth_low_energy/issues/36) caused by CoW. ## 5.0.1 -* Fix the issue that [completion was called duplicately caused by CoW](https://github.com/yanshouwang/bluetooth_low_energy/issues/36). +* `iOS` Fix the issue that [completion was called duplicately](https://github.com/yanshouwang/bluetooth_low_energy/issues/36) caused by CoW. ## 5.0.0 diff --git a/bluetooth_low_energy/example/pubspec.lock b/bluetooth_low_energy/example/pubspec.lock index 3852912..5539692 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: "5.0.2" + version: "5.0.3" bluetooth_low_energy_android: dependency: transitive description: name: bluetooth_low_energy_android - sha256: "502382b2bc6d0bf9e7aa635bafa28057cb8538d6f2dd9c2eceb6d0111bcee94a" + sha256: "703faeeecce61887af4fa34bce5e0f5c25019d585f2e05723948332512c4eedc" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.0.2" bluetooth_low_energy_darwin: dependency: transitive description: diff --git a/bluetooth_low_energy/pubspec.yaml b/bluetooth_low_energy/pubspec.yaml index 63b6e36..a7f0184 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 apis. -version: 5.0.2 +version: 5.0.3 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter bluetooth_low_energy_platform_interface: ^5.0.0 - bluetooth_low_energy_android: ^5.0.0 + bluetooth_low_energy_android: ^5.0.2 bluetooth_low_energy_darwin: ^5.0.2 bluetooth_low_energy_windows: ^5.0.0 bluetooth_low_energy_linux: ^5.0.0 diff --git a/bluetooth_low_energy_android/CHANGELOG.md b/bluetooth_low_energy_android/CHANGELOG.md index ff4ec05..adc1d3c 100644 --- a/bluetooth_low_energy_android/CHANGELOG.md +++ b/bluetooth_low_energy_android/CHANGELOG.md @@ -1,3 +1,12 @@ +## 5.0.2 + +* Fix the ConcurrentModificationException when `PeripheralManager#clearServices` is called. +* Fix the `CentralManager#setUp` and `PeripheralManager#setUp` were blocked. + +## 5.0.1 + +* Fix the wrong blutooth low energy state caused by multi permission requests at the same time. + ## 5.0.0 * Now `CentralManager#writeCharacteristic` and `PeripheralManager#writeCharacteristic` will fragment the value automatically, the maximum write length is 512 bytes. diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt index 1ed89c2..0f0bb8d 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt @@ -50,8 +50,10 @@ enum class MyBluetoothLowEnergyStateArgs(val raw: Int) { UNKNOWN(0), UNSUPPORTED(1), UNAUTHORIZED(2), - POWEREDOFF(3), - POWEREDON(4); + OFF(3), + TURNINGON(4), + ON(5), + TURNINGOFF(6); companion object { fun ofRaw(raw: Int): MyBluetoothLowEnergyStateArgs? { @@ -327,7 +329,7 @@ private object MyCentralManagerHostApiCodec : StandardMessageCodec() { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ interface MyCentralManagerHostApi { - fun setUp() + fun setUp(callback: (Result) -> Unit) fun startDiscovery(callback: (Result) -> Unit) fun stopDiscovery() fun connect(addressArgs: String, callback: (Result) -> Unit) @@ -353,14 +355,14 @@ interface MyCentralManagerHostApi { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerHostApi.setUp", codec) if (api != null) { channel.setMessageHandler { _, reply -> - var wrapped: List - try { - api.setUp() - wrapped = listOf(null) - } catch (exception: Throwable) { - wrapped = wrapError(exception) + api.setUp() { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } } - reply.reply(wrapped) } } else { channel.setMessageHandler(null) @@ -795,7 +797,7 @@ private object MyPeripheralManagerHostApiCodec : StandardMessageCodec() { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ interface MyPeripheralManagerHostApi { - fun setUp() + fun setUp(callback: (Result) -> Unit) fun addService(serviceArgs: MyGattServiceArgs, callback: (Result) -> Unit) fun removeService(hashCodeArgs: Long) fun clearServices() @@ -816,14 +818,14 @@ interface MyPeripheralManagerHostApi { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostApi.setUp", codec) if (api != null) { channel.setMessageHandler { _, reply -> - var wrapped: List - try { - api.setUp() - wrapped = listOf(null) - } catch (exception: Throwable) { - wrapped = wrapError(exception) + api.setUp() { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } } - reply.reply(wrapped) } } else { channel.setMessageHandler(null) diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt index fdfe12a..4341f2e 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt @@ -131,8 +131,11 @@ fun MyGattServiceArgs.toService(): BluetoothGattService { //region ToArgs fun Int.toBluetoothLowEnergyStateArgs(): MyBluetoothLowEnergyStateArgs { return when (this) { - BluetoothAdapter.STATE_ON -> MyBluetoothLowEnergyStateArgs.POWEREDON - else -> MyBluetoothLowEnergyStateArgs.POWEREDOFF + BluetoothAdapter.STATE_OFF -> MyBluetoothLowEnergyStateArgs.OFF + BluetoothAdapter.STATE_TURNING_ON -> MyBluetoothLowEnergyStateArgs.TURNINGON + BluetoothAdapter.STATE_ON -> MyBluetoothLowEnergyStateArgs.ON + BluetoothAdapter.STATE_TURNING_OFF -> MyBluetoothLowEnergyStateArgs.TURNINGOFF + else -> MyBluetoothLowEnergyStateArgs.UNKNOWN } } diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt index b0a986c..f46ecc2 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyBluetoothLowEnergyManager.kt @@ -14,8 +14,6 @@ import io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener import java.util.UUID import java.util.concurrent.Executor -typealias MyBluetoothLowEnergyState = MyBluetoothLowEnergyStateArgs - abstract class MyBluetoothLowEnergyManager(context: Context) { companion object { val CLIENT_CHARACTERISTIC_CONFIG_UUID = @@ -40,33 +38,26 @@ abstract class MyBluetoothLowEnergyManager(context: Context) { } protected val executor get() = ContextCompat.getMainExecutor(mContext) as Executor + protected val hasFeature get() = mContext.packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) protected val manager get() = ContextCompat.getSystemService( mContext, BluetoothManager::class.java ) as BluetoothManager protected val adapter get() = manager.adapter as BluetoothAdapter - protected fun initialize() { - val hasFeature = - mContext.packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) - if (hasFeature) { - val authorized = permissions.all { permission -> - ActivityCompat.checkSelfPermission( - mContext, permission - ) == PackageManager.PERMISSION_GRANTED - } - if (authorized) { - mOnAuthorizationStateChanged(true) - } else { - val activity = mBinding.activity - ActivityCompat.requestPermissions(activity, permissions, requestCode) - } - } else { - val state = MyBluetoothLowEnergyState.UNSUPPORTED - onStateChanged(state) + protected fun checkPermissions(): Boolean { + return permissions.all { permission -> + ActivityCompat.checkSelfPermission( + mContext, permission + ) == PackageManager.PERMISSION_GRANTED } } + protected fun requestPermissions() { + val activity = mBinding.activity + ActivityCompat.requestPermissions(activity, permissions, requestCode) + } + fun onAttachedToActivity(binding: ActivityPluginBinding) { binding.addRequestPermissionsResultListener(mRequestPermissionsResultListener) mBinding = binding @@ -82,8 +73,9 @@ abstract class MyBluetoothLowEnergyManager(context: Context) { if (this.requestCode != requestCode) { return false } - val authorized = results.all { r -> r == PackageManager.PERMISSION_GRANTED } - mOnAuthorizationStateChanged(authorized) + val granted = + permissions.contentEquals(this.permissions) && results.all { r -> r == PackageManager.PERMISSION_GRANTED } + onPermissionsRequested(granted) return true } @@ -92,23 +84,11 @@ abstract class MyBluetoothLowEnergyManager(context: Context) { if (action != BluetoothAdapter.ACTION_STATE_CHANGED) { return } - val extra = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF) - val state = extra.toBluetoothLowEnergyStateArgs() - onStateChanged(state) + val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF) + onAdapterStateChanged(state) } - private fun mOnAuthorizationStateChanged(authorized: Boolean) { - val state = if (authorized) { - mRegisterReceiver() - if (adapter.state == BluetoothAdapter.STATE_ON) MyBluetoothLowEnergyState.POWEREDON - else MyBluetoothLowEnergyState.POWEREDOFF - } else { - MyBluetoothLowEnergyState.UNAUTHORIZED - } - onStateChanged(state) - } - - private fun mRegisterReceiver() { + protected fun registerReceiver() { if (mRegistered) { return } @@ -119,6 +99,8 @@ abstract class MyBluetoothLowEnergyManager(context: Context) { abstract val permissions: Array abstract val requestCode: Int - abstract fun onStateChanged(state: MyBluetoothLowEnergyState) + + abstract fun onPermissionsRequested(granted: Boolean) + abstract fun onAdapterStateChanged(state: Int) } diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt index 4c5cbbb..0f6fc95 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt @@ -39,6 +39,7 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : private val mCharacteristics: MutableMap> private val mDescriptors: MutableMap> + private var mSetUpCallback: ((Result) -> Unit)? private var mStartDiscoveryCallback: ((Result) -> Unit)? private val mConnectCallbacks: MutableMap) -> Unit> private val mDisconnectCallbacks: MutableMap) -> Unit> @@ -61,6 +62,7 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : mCharacteristics = mutableMapOf() mDescriptors = mutableMapOf() + mSetUpCallback = null mStartDiscoveryCallback = null mConnectCallbacks = mutableMapOf() mDisconnectCallbacks = mutableMapOf() @@ -93,9 +95,25 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : override val requestCode: Int get() = REQUEST_CODE - override fun setUp() { - mClearState() - initialize() + override fun setUp(callback: (Result) -> Unit) { + try { + mClearState() + val stateArgs = if (hasFeature) { + val granted = checkPermissions() + if (granted) { + registerReceiver() + adapter.state.toBluetoothLowEnergyStateArgs() + } else { + requestPermissions() + mSetUpCallback = callback + return + } + } else MyBluetoothLowEnergyStateArgs.UNSUPPORTED + mOnStateChanged(stateArgs) + callback(Result.success(Unit)) + } catch (e: Throwable) { + callback(Result.failure(e)) + } } override fun startDiscovery(callback: (Result) -> Unit) { @@ -104,10 +122,10 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : val settings = ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build() mScanner.startScan(filters, settings, mScanCallback) - mStartDiscoveryCallback = callback executor.execute { onScanSucceed() } + mStartDiscoveryCallback = callback } catch (e: Throwable) { callback(Result.failure(e)) } @@ -319,9 +337,19 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : } } - override fun onStateChanged(state: MyBluetoothLowEnergyState) { - val stateNumberArgs = state.raw.toLong() - mApi.onStateChanged(stateNumberArgs) {} + override fun onPermissionsRequested(granted: Boolean) { + val callback = mSetUpCallback ?: return + val stateArgs = if (granted) { + registerReceiver() + adapter.state.toBluetoothLowEnergyStateArgs() + } else MyBluetoothLowEnergyStateArgs.UNAUTHORIZED + mOnStateChanged(stateArgs) + callback(Result.success(Unit)) + } + + override fun onAdapterStateChanged(state: Int) { + val stateArgs = state.toBluetoothLowEnergyStateArgs() + mOnStateChanged(stateArgs) } private fun onScanSucceed() { @@ -554,6 +582,7 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : mCharacteristics.clear() mDescriptors.clear() + mSetUpCallback = null mStartDiscoveryCallback = null mConnectCallbacks.clear() mDisconnectCallbacks.clear() @@ -566,6 +595,11 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : mWriteDescriptorCallbacks.clear() } + private fun mOnStateChanged(stateArgs: MyBluetoothLowEnergyStateArgs) { + val stateNumberArgs = stateArgs.raw.toLong() + mApi.onStateChanged(stateNumberArgs) {} + } + private fun mRetrieveCharacteristic( addressArgs: String, hashCodeArgs: Long ): BluetoothGattCharacteristic? { diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt index 45a63c9..68d531d 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt @@ -19,7 +19,7 @@ import io.flutter.plugin.common.BinaryMessenger class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : MyBluetoothLowEnergyManager(context), MyPeripheralManagerHostApi { companion object { - const val REQUEST_CODE = 444 + const val REQUEST_CODE = 445 } private val advertiser get() = adapter.bluetoothLeAdvertiser @@ -89,9 +89,25 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : override val requestCode: Int get() = REQUEST_CODE - override fun setUp() { - mClearState() - initialize() + override fun setUp(callback: (Result) -> Unit) { + try { + mClearState() + val stateArgs = if (hasFeature) { + val granted = checkPermissions() + if (granted) { + registerReceiver() + adapter.state.toBluetoothLowEnergyStateArgs() + } else { + requestPermissions() + mSetUpCallback = callback + return + } + } else MyBluetoothLowEnergyStateArgs.UNSUPPORTED + mOnStateChanged(stateArgs) + callback(Result.success(Unit)) + } catch (e: Throwable) { + callback(Result.failure(e)) + } } override fun addService(serviceArgs: MyGattServiceArgs, callback: (Result) -> Unit) { @@ -143,28 +159,45 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : } mAddServiceCallback = callback } catch (e: Throwable) { - mClearService(serviceArgs) callback(Result.failure(e)) } } override fun removeService(hashCodeArgs: Long) { - val service = mServices[hashCodeArgs] as BluetoothGattService - val hashCode = service.hashCode() - val serviceArgs = mServicesArgs[hashCode] as MyGattServiceArgs + val service = mServices.remove(hashCodeArgs) as BluetoothGattService val removed = mServer.removeService(service) if (!removed) { throw IllegalStateException() } - mClearService(serviceArgs) + val hashCode = service.hashCode() + val serviceArgs = mServicesArgs.remove(hashCode) as MyGattServiceArgs + val characteristicsArgs = serviceArgs.characteristicsArgs.filterNotNull() + for (characteristicArgs in characteristicsArgs) { + val characteristicHashCodeArgs = characteristicArgs.hashCodeArgs + val characteristic = + mCharacteristics.remove(characteristicHashCodeArgs) as BluetoothGattCharacteristic + val characteristicHashCode = characteristic.hashCode() + mCharacteristicsArgs.remove(characteristicHashCode) + val descriptorsArgs = characteristicArgs.descriptorsArgs.filterNotNull() + for (descriptorArgs in descriptorsArgs) { + val descriptorHashCodeArgs = descriptorArgs.hashCodeArgs + val descriptor = + mDescriptors.remove(descriptorHashCodeArgs) as BluetoothGattDescriptor + val descriptorHashCode = descriptor.hashCode() + mDescriptorsArgs.remove(descriptorHashCode) + } + } } override fun clearServices() { mServer.clearServices() - val servicesArgs = this.mServicesArgs.values - for (serviceArgs in servicesArgs) { - mClearService(serviceArgs) - } + mServices.clear() + mCharacteristics.clear() + mDescriptors.clear() + + mServicesArgs.clear() + mCharacteristicsArgs.clear() + mDescriptorsArgs.clear() } override fun startAdvertising( @@ -235,14 +268,19 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : } } - override fun onStateChanged(state: MyBluetoothLowEnergyState) { - when (state) { - MyBluetoothLowEnergyStateArgs.POWEREDOFF -> mCloseGattServer() - MyBluetoothLowEnergyStateArgs.POWEREDON -> mOpenGattServer() - else -> {} - } - val stateNumberArgs = state.raw.toLong() - mApi.onStateChanged(stateNumberArgs) {} + override fun onPermissionsRequested(granted: Boolean) { + val callback = mSetUpCallback ?: return + val stateArgs = if (granted) { + registerReceiver() + adapter.state.toBluetoothLowEnergyStateArgs() + } else MyBluetoothLowEnergyStateArgs.UNAUTHORIZED + mOnStateChanged(stateArgs) + callback(Result.success(Unit)) + } + + override fun onAdapterStateChanged(state: Int) { + val stateArgs = state.toBluetoothLowEnergyStateArgs() + mOnStateChanged(stateArgs) } fun onServiceAdded(status: Int, service: BluetoothGattService) { @@ -253,9 +291,6 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : } else { val error = IllegalStateException("Read rssi failed with status: $status") callback(Result.failure(error)) - val hashCode = service.hashCode() - val serviceArgs = mServicesArgs[hashCode] ?: return - mClearService(serviceArgs) } } @@ -403,7 +438,18 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : mNotifyCharacteristicValueChangedCallbacks.clear() } - private fun mOpenGattServer() { + private fun mOnStateChanged(stateArgs: MyBluetoothLowEnergyStateArgs) { + val stateNumberArgs = stateArgs.raw.toLong() + mApi.onStateChanged(stateNumberArgs) {} + // Renew GATT server when bluetooth adapter state changed. + when (stateArgs) { + MyBluetoothLowEnergyStateArgs.OFF -> mCloseServer() + MyBluetoothLowEnergyStateArgs.ON -> mOpenServer() + else -> {} + } + } + + private fun mOpenServer() { if (mOpening) { return } @@ -411,32 +457,11 @@ class MyPeripheralManager(context: Context, binaryMessenger: BinaryMessenger) : mOpening = true } - private fun mCloseGattServer() { + private fun mCloseServer() { if (!mOpening) { return } mServer.close() mOpening = false } - - private fun mClearService(serviceArgs: MyGattServiceArgs) { - val characteristicsArgs = serviceArgs.characteristicsArgs.filterNotNull() - for (characteristicArgs in characteristicsArgs) { - val descriptorsArgs = characteristicArgs.descriptorsArgs.filterNotNull() - for (descriptorArgs in descriptorsArgs) { - val descriptorHashCodeArgs = descriptorArgs.hashCodeArgs - val descriptor = mDescriptors.remove(descriptorHashCodeArgs) ?: continue - val descriptorHashCode = descriptor.hashCode() - mDescriptorsArgs.remove(descriptorHashCode) - } - val characteristicHashCodeArgs = characteristicArgs.hashCodeArgs - val characteristic = mCharacteristics.remove(characteristicHashCodeArgs) ?: continue - val characteristicHashCode = characteristic.hashCode() - mCharacteristicsArgs.remove(characteristicHashCode) - } - val serviceHashCodeArgs = serviceArgs.hashCodeArgs - val service = mServices.remove(serviceHashCodeArgs) ?: return - val serviceHashCode = service.hashCode() - mServicesArgs.remove(serviceHashCode) - } } \ No newline at end of file diff --git a/bluetooth_low_energy_android/example/pubspec.lock b/bluetooth_low_energy_android/example/pubspec.lock index 1eb50d2..c93eb73 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: "5.0.0" + version: "5.0.1" 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 1dc16d2..dc4882c 100644 --- a/bluetooth_low_energy_android/lib/src/my_api.dart +++ b/bluetooth_low_energy_android/lib/src/my_api.dart @@ -14,7 +14,20 @@ export 'my_api.g.dart'; // ToObject extension MyBluetoothLowEnergyStateArgsX on MyBluetoothLowEnergyStateArgs { BluetoothLowEnergyState toState() { - return BluetoothLowEnergyState.values[index]; + switch (this) { + case MyBluetoothLowEnergyStateArgs.unknown: + return BluetoothLowEnergyState.unknown; + case MyBluetoothLowEnergyStateArgs.unsupported: + return BluetoothLowEnergyState.unsupported; + case MyBluetoothLowEnergyStateArgs.unauthorized: + return BluetoothLowEnergyState.unauthorized; + case MyBluetoothLowEnergyStateArgs.off: + case MyBluetoothLowEnergyStateArgs.turningOn: + return BluetoothLowEnergyState.poweredOff; + case MyBluetoothLowEnergyStateArgs.on: + case MyBluetoothLowEnergyStateArgs.turningOff: + return BluetoothLowEnergyState.poweredOn; + } } } 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 cffc72a..d9a27be 100644 --- a/bluetooth_low_energy_android/lib/src/my_api.g.dart +++ b/bluetooth_low_energy_android/lib/src/my_api.g.dart @@ -29,8 +29,10 @@ enum MyBluetoothLowEnergyStateArgs { unknown, unsupported, unauthorized, - poweredOff, - poweredOn, + off, + turningOn, + on, + turningOff, } enum MyGattCharacteristicPropertyArgs { diff --git a/bluetooth_low_energy_android/my_api.dart b/bluetooth_low_energy_android/my_api.dart index 773b111..5d1c84f 100644 --- a/bluetooth_low_energy_android/my_api.dart +++ b/bluetooth_low_energy_android/my_api.dart @@ -15,8 +15,10 @@ enum MyBluetoothLowEnergyStateArgs { unknown, unsupported, unauthorized, - poweredOff, - poweredOn, + off, + turningOn, + on, + turningOff, } enum MyGattCharacteristicPropertyArgs { @@ -124,6 +126,7 @@ class MyGattServiceArgs { @HostApi() abstract class MyCentralManagerHostApi { + @async void setUp(); @async void startDiscovery(); @@ -182,6 +185,7 @@ abstract class MyCentralManagerFlutterApi { @HostApi() abstract class MyPeripheralManagerHostApi { + @async void setUp(); @async void addService(MyGattServiceArgs serviceArgs); diff --git a/bluetooth_low_energy_android/pubspec.yaml b/bluetooth_low_energy_android/pubspec.yaml index ddd178d..0069f82 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: 5.0.0 +version: 5.0.2 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: