diff --git a/app/src/main/java/eu/darken/capod/common/bluetooth/BleScanner.kt b/app/src/main/java/eu/darken/capod/common/bluetooth/BleScanner.kt index 34091cdb..5507748e 100644 --- a/app/src/main/java/eu/darken/capod/common/bluetooth/BleScanner.kt +++ b/app/src/main/java/eu/darken/capod/common/bluetooth/BleScanner.kt @@ -6,8 +6,6 @@ import android.bluetooth.le.ScanResult import android.bluetooth.le.ScanSettings import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext -import eu.darken.capod.common.SystemClockWrap -import eu.darken.capod.common.debug.autoreport.DebugSettings import eu.darken.capod.common.debug.logging.Logging.Priority.* import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag @@ -27,7 +25,7 @@ import javax.inject.Singleton class BleScanner @Inject constructor( @ApplicationContext private val context: Context, private val bluetoothManager: BluetoothManager2, - private val debugSettings: DebugSettings, + private val fakeBleData: FakeBleData, ) { fun scan( @@ -108,58 +106,7 @@ class BleScanner @Inject constructor( log(TAG, INFO) { "BleScanner stopped" } } } - .map { origs -> - val fakeDevices = mutableListOf() - if (debugSettings.showFakeData.value) { - // AirPods Pro - BleScanResult( - address = "78:73:AF:B4:85:5E", - rssi = -48, - generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 100, - manufacturerSpecificData = mapOf(76 to "07 19 01 0E 20 75 AA B6 31 00 05 9C 5A A4 5D C0 2C A0 B4 6F B9 ED 8E CE 03 97 CA".hexToByteArray()) - ).run { fakeDevices.add(this) } - // AirPods Gen1 - BleScanResult( - address = "4E:9E:D1:49:D2:6D", - rssi = -55, - generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 200, - manufacturerSpecificData = mapOf(76 to "07 19 01 02 20 55 AF 56 31 00 06 6F E4 DF 10 AF 10 60 81 03 3B 76 D9 C7 11 22 88".hexToByteArray()) - ).run { fakeDevices.add(this) } - // AirPods Max - BleScanResult( - address = "7E:E5:C7:65:D2:B5", - rssi = -30, - generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 300, - manufacturerSpecificData = mapOf(76 to "07 19 01 0A 20 02 05 80 04 0F 44 A7 60 9B F8 3C FD B1 D8 1C 61 EA 82 60 A3 2C 4E".hexToByteArray()) - ).run { fakeDevices.add(this) } - // BeatsFlex - BleScanResult( - address = "5E:9E:D1:49:D2:6D", - rssi = -59, - generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 400, - manufacturerSpecificData = mapOf(76 to "07 19 01 10 20 0A F4 8F 00 01 00 C4 71 9F 9C EF A2 E3 BA 66 FE 1D 45 9F C9 2F A0".hexToByteArray()) - ).run { fakeDevices.add(this) } - // Unknown Device - BleScanResult( - address = "6E:9E:D1:49:D2:6D", - rssi = -60, - generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 500, - manufacturerSpecificData = mapOf(76 to "07 19 01 FF 20 0A F4 8F 00 01 00 C4 71 9F 9C EF A2 E3 BA 66 FE 1D 45 9F C9 2F A0".hexToByteArray()) - ).run { fakeDevices.add(this) } - } - - origs + fakeDevices - } - - - fun String.hexToByteArray(): ByteArray { - val trimmed = this - .replace(" ", "") - .replace(">", "") - .replace("<", "") - require(trimmed.length % 2 == 0) { "Not a HEX string" } - return trimmed.chunked(2).map { it.toInt(16).toByte() }.toByteArray() - } + .map { fakeBleData.maybeAddfakeData(it) } companion object { private val TAG = logTag("Bluetooth", "BleScanner") diff --git a/app/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt b/app/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt new file mode 100644 index 00000000..a07f4c7b --- /dev/null +++ b/app/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt @@ -0,0 +1,70 @@ +package eu.darken.capod.common.bluetooth + +import dagger.Reusable +import eu.darken.capod.common.SystemClockWrap +import eu.darken.capod.common.debug.autoreport.DebugSettings +import javax.inject.Inject +import kotlin.random.Random + +@Reusable +class FakeBleData @Inject constructor( + private val debugSettings: DebugSettings, +) { + + fun maybeAddfakeData(originals: List): List { + if (!debugSettings.showFakeData.value) return originals + return originals + getFakeData() + } + + fun getFakeData(): Collection { + val fakeDevices = mutableListOf() + // AirPods Pro + BleScanResult( + address = "78:73:AF:B4:85:5E", + rssi = Random.nextInt(100) * -1, + generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 100, + manufacturerSpecificData = mapOf(76 to "07 19 01 0E 20 75 AA B6 31 00 05 9C 5A A4 5D C0 2C A0 B4 6F B9 ED 8E CE 03 97 CA".hexToByteArray()) + ).run { fakeDevices.add(this) } + // AirPods Gen1 + BleScanResult( + address = "4E:9E:D1:49:D2:6D", + rssi = Random.nextInt(100) * -1, + generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 200, + manufacturerSpecificData = mapOf(76 to "07 19 01 02 20 55 AF 56 31 00 06 6F E4 DF 10 AF 10 60 81 03 3B 76 D9 C7 11 22 88".hexToByteArray()) + ).run { fakeDevices.add(this) } + // AirPods Max + BleScanResult( + address = "7E:E5:C7:65:D2:B5", + rssi = Random.nextInt(100) * -1, + generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 300, + manufacturerSpecificData = mapOf(76 to "07 19 01 0A 20 02 05 80 04 0F 44 A7 60 9B F8 3C FD B1 D8 1C 61 EA 82 60 A3 2C 4E".hexToByteArray()) + ).run { fakeDevices.add(this) } + // BeatsFlex + BleScanResult( + address = "5E:9E:D1:49:D2:6D", + rssi = Random.nextInt(100) * -1, + generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 400, + manufacturerSpecificData = mapOf(76 to "07 19 01 10 20 0A F4 8F 00 01 00 C4 71 9F 9C EF A2 E3 BA 66 FE 1D 45 9F C9 2F A0".hexToByteArray()) + ).run { fakeDevices.add(this) } + // Unknown Device + BleScanResult( + address = "6E:9E:D1:49:D2:6D", + rssi = Random.nextInt(100) * -1, + generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 500, + manufacturerSpecificData = mapOf(76 to "07 19 01 FF 20 0A F4 8F 00 01 00 C4 71 9F 9C EF A2 E3 BA 66 FE 1D 45 9F C9 2F A0".hexToByteArray()) + ).run { fakeDevices.add(this) } + + return fakeDevices + } + + + private fun String.hexToByteArray(): ByteArray { + val trimmed = this + .replace(" ", "") + .replace(">", "") + .replace("<", "") + require(trimmed.length % 2 == 0) { "Not a HEX string" } + return trimmed.chunked(2).map { it.toInt(16).toByte() }.toByteArray() + } + +} \ No newline at end of file