Skip to content

Commit

Permalink
Fix crash when trying to parse unsupported device
Browse files Browse the repository at this point in the history
  • Loading branch information
pembem22 committed Jan 22, 2024
1 parent d31db0d commit 8d07d06
Showing 1 changed file with 33 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,46 @@ object BluetoothProtocol {
val scanRecord = scanResult.scanRecord ?: return
if (SpeakerManager.speakers.containsKey(scanResult.device.address)) return

val scanRecordBytes = scanRecord.bytes

val manufacturerData = SparseArray<ByteArray>()
var currentPos = 0
while (currentPos < scanRecordBytes.size) {
val currentPos2 = currentPos + 1
val length = scanRecordBytes[currentPos].toInt() and 0xFF
if (length == 0) {
break
}
val dataLength = length - 1
currentPos = currentPos2 + 1
try {
val scanRecordBytes = scanRecord.bytes

val manufacturerData = SparseArray<ByteArray>()
var currentPos = 0
while (currentPos < scanRecordBytes.size) {
val currentPos2 = currentPos + 1
val length = scanRecordBytes[currentPos].toInt() and 0xFF
if (length == 0) {
break
}
val dataLength = length - 1
currentPos = currentPos2 + 1

if (scanRecordBytes[currentPos2].toInt() and 0xFF == 0xFF) {
manufacturerData.put(
(scanRecordBytes[currentPos + 1].toInt() and 0xFF shl 8) + (scanRecordBytes[currentPos].toInt() and 0xFF),
scanRecordBytes.copyOfRange(currentPos + 2, currentPos + 2 + dataLength)
)
}

if (scanRecordBytes[currentPos2].toInt() and 0xFF == 0xFF) {
manufacturerData.put((scanRecordBytes[currentPos + 1].toInt() and 0xFF shl 8) + (scanRecordBytes[currentPos].toInt() and 0xFF),
scanRecordBytes.copyOfRange(currentPos + 2, currentPos + 2 + dataLength))
currentPos += dataLength
}

currentPos += dataLength
}

val speakerData = manufacturerData[87] ?: return
val speakerData = manufacturerData[87] ?: return

Timber.d("connect parsed ${speakerData.toHexString()}")
Timber.d("connect parsed ${speakerData.toHexString()}")

val speaker = SpeakerModel(scanResult.device, speakerData.toHexString())
val speaker = SpeakerModel(scanResult.device, speakerData.toHexString())

val modelId = (speakerData[1].toInt() and 0xFF shl 8) + (speakerData[0].toInt() and 0xFF)
val colorId = speakerData[2].toInt() and 0xFF
speaker.hardware = SpeakerHardware.from(modelId, colorId)
val modelId =
(speakerData[1].toInt() and 0xFF shl 8) + (speakerData[0].toInt() and 0xFF)
val colorId = speakerData[2].toInt() and 0xFF
speaker.hardware = SpeakerHardware.from(modelId, colorId)

SpeakerManager.speakerFound(speaker)
SpeakerManager.speakerFound(speaker)
} catch (e: Exception) {
Timber.e(e, "failed to parse scan record")
App.analytics.logEvent("bluetooth_parse_failed")
}
}

fun onPacket(speaker: SpeakerModel, packet: Packet) {
Expand Down

0 comments on commit 8d07d06

Please sign in to comment.