Implement isScanning api (#188)

* Implement isScanning api

* Improve IOS scanning api

* Update Readme and Changelog
This commit is contained in:
Rohit Sangwan
2025-11-12 19:27:44 +05:30
committed by GitHub
parent c3b97e414f
commit 34b39597fd
23 changed files with 193 additions and 12 deletions
@@ -36,6 +36,7 @@ class SafeScanner(private val bluetoothManager: BluetoothManager) {
private val handler = Handler(Looper.myLooper()!!)
private val startTimes = LinkedList<Long>()
private var awaitingScan = false
private var isScanning = false
fun startScan(filters: List<ScanFilter>, settings: ScanSettings, callback: ScanCallback) {
val now = System.currentTimeMillis()
@@ -52,7 +53,7 @@ class SafeScanner(private val bluetoothManager: BluetoothManager) {
}
awaitingScan = true
val delay = startTimes.first + EXCESSIVE_SCANNING_PERIOD_MS - now + 2_000
val delay = startTimes.first() + EXCESSIVE_SCANNING_PERIOD_MS - now + 2_000
Log.e(TAG, "startScan: too frequent, schedule auto-start after $delay ms $startTimes")
handler.postDelayed({
@@ -65,8 +66,10 @@ class SafeScanner(private val bluetoothManager: BluetoothManager) {
startTimes.addLast(now)
try {
bluetoothManager.adapter.bluetoothLeScanner?.startScan(filters, settings, callback)
isScanning = true
} catch (e: Exception) {
Log.e(TAG, "Failed to start Scan : $e")
isScanning = false
}
}
}
@@ -75,5 +78,10 @@ class SafeScanner(private val bluetoothManager: BluetoothManager) {
awaitingScan = false
handler.removeCallbacksAndMessages(null)
bluetoothManager.adapter.bluetoothLeScanner?.stopScan(callback)
isScanning = false
}
fun isScanning(): Boolean {
return isScanning || awaitingScan
}
}
@@ -1,4 +1,4 @@
// Autogenerated from Pigeon (v26.0.5), do not edit directly.
// Autogenerated from Pigeon (v26.1.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass")
@@ -447,6 +447,7 @@ interface UniversalBlePlatformChannel {
fun disableBluetooth(callback: (Result<Boolean>) -> Unit)
fun startScan(filter: UniversalScanFilter?)
fun stopScan()
fun isScanning(): Boolean
fun connect(deviceId: String)
fun disconnect(deviceId: String)
fun setNotifiable(deviceId: String, service: String, characteristic: String, bleInputProperty: Long, callback: (Result<Unit>) -> Unit)
@@ -557,6 +558,21 @@ interface UniversalBlePlatformChannel {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.isScanning$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
listOf(api.isScanning())
} catch (exception: Throwable) {
UniversalBlePigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.connect$separatedMessageChannelSuffix", codec)
if (api != null) {
@@ -187,6 +187,10 @@ class UniversalBlePlugin : UniversalBlePlatformChannel, BluetoothGattCallback(),
safeScanner.stopScan(scanCallback)
}
override fun isScanning(): Boolean {
return safeScanner.isScanning()
}
override fun connect(deviceId: String) {
// If already connected, send connected message,
// if connecting, do nothing