Add manufacturer data filtering (#23)

* Add manufacturer data filtering

* Implement manufacturer data filter in windows

* Fix manufacturerData filtering on windows

* Fix linux

* Clean comments

---------

Co-authored-by: Foti Dim <fdimanidis@gmail.com>
This commit is contained in:
Rohit Sangwan
2024-03-18 23:14:44 +05:30
committed by GitHub
parent 580fca6e4a
commit 1a0e48ba1a
22 changed files with 770 additions and 356 deletions
@@ -127,21 +127,53 @@ data class UniversalBleCharacteristic (
}
}
/** Generated class from Pigeon that represents data sent in messages. */
/**
* Scan Filters
*
* Generated class from Pigeon that represents data sent in messages.
*/
data class UniversalScanFilter (
val withServices: List<String?>
val withServices: List<String?>,
val withManufacturerData: List<UniversalManufacturerDataFilter?>
) {
companion object {
@Suppress("UNCHECKED_CAST")
fun fromList(list: List<Any?>): UniversalScanFilter {
val withServices = list[0] as List<String?>
return UniversalScanFilter(withServices)
val withManufacturerData = list[1] as List<UniversalManufacturerDataFilter?>
return UniversalScanFilter(withServices, withManufacturerData)
}
}
fun toList(): List<Any?> {
return listOf<Any?>(
withServices,
withManufacturerData,
)
}
}
/** Generated class from Pigeon that represents data sent in messages. */
data class UniversalManufacturerDataFilter (
val companyIdentifier: Long? = null,
val data: ByteArray? = null,
val mask: ByteArray? = null
) {
companion object {
@Suppress("UNCHECKED_CAST")
fun fromList(list: List<Any?>): UniversalManufacturerDataFilter {
val companyIdentifier = list[0].let { if (it is Int) it.toLong() else it as Long? }
val data = list[1] as ByteArray?
val mask = list[2] as ByteArray?
return UniversalManufacturerDataFilter(companyIdentifier, data, mask)
}
}
fun toList(): List<Any?> {
return listOf<Any?>(
companyIdentifier,
data,
mask,
)
}
}
@@ -166,6 +198,11 @@ private object UniversalBlePlatformChannelCodec : StandardMessageCodec() {
}
}
131.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let {
UniversalManufacturerDataFilter.fromList(it)
}
}
132.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let {
UniversalScanFilter.fromList(it)
}
@@ -187,10 +224,14 @@ private object UniversalBlePlatformChannelCodec : StandardMessageCodec() {
stream.write(130)
writeValue(stream, value.toList())
}
is UniversalScanFilter -> {
is UniversalManufacturerDataFilter -> {
stream.write(131)
writeValue(stream, value.toList())
}
is UniversalScanFilter -> {
stream.write(132)
writeValue(stream, value.toList())
}
else -> super.writeValue(stream, value)
}
}
@@ -144,7 +144,7 @@ fun Int.parseGattErrorCode(): String? {
}
fun UniversalScanFilter.toScanFilters(): List<ScanFilter> {
var scanFilters: List<ScanFilter> = emptyList()
var scanFilters: ArrayList<ScanFilter> = arrayListOf()
// Add withServices Filter
for (service in this.withServices) {
@@ -152,7 +152,7 @@ fun UniversalScanFilter.toScanFilters(): List<ScanFilter> {
val serviceUUID = service?.validFullUUID()
serviceUUID?.let {
val parcelUUId = ParcelUuid.fromString(it)
scanFilters = scanFilters.plus(
scanFilters.add(
ScanFilter.Builder().setServiceUuid(parcelUUId).build()
)
Log.e(TAG, "scanFilters: $parcelUUId")
@@ -167,7 +167,37 @@ fun UniversalScanFilter.toScanFilters(): List<ScanFilter> {
}
}
return scanFilters
// Add ManufacturerData Filter
for (manufacturerData in this.withManufacturerData) {
try {
manufacturerData?.companyIdentifier?.let {
val data: ByteArray = manufacturerData.data ?: ByteArray(0)
val mask: ByteArray? = manufacturerData.mask
if (mask == null) {
scanFilters.add(
ScanFilter.Builder().setManufacturerData(
it.toInt(), data
).build()
)
} else {
scanFilters.add(
ScanFilter.Builder().setManufacturerData(
it.toInt(), data, mask
).build()
)
}
}
} catch (e: Exception) {
Log.e(TAG, e.toString())
throw FlutterError(
"illegalIllegalArgument",
"Invalid manufacturerData: ${manufacturerData?.companyIdentifier} ${manufacturerData?.data} ${manufacturerData?.mask}",
e.toString()
)
}
}
return scanFilters.toList()
}
val ScanResult.manufacturerDataHead: ByteArray?