mirror of
https://github.com/kavishdevar/librepods.git
synced 2026-04-28 09:07:14 +00:00
commit before letting the llm edit the code
This commit is contained in:
@@ -15,7 +15,9 @@
|
|||||||
android:name="android.permission.BLUETOOTH_ADMIN"
|
android:name="android.permission.BLUETOOTH_ADMIN"
|
||||||
tools:ignore="ProtectedPermissions" />
|
tools:ignore="ProtectedPermissions" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
|
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
|
||||||
|
android:usesPermissionFlags="neverForLocation"
|
||||||
|
tools:ignore="UnusedAttribute" />
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||||
|
|||||||
@@ -74,10 +74,10 @@ class CustomDevice : ComponentActivity() {
|
|||||||
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||||
val manager = getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
|
val manager = getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
|
||||||
// val device: BluetoothDevice = manager.adapter.getRemoteDevice("EC:D6:F4:3D:89:B8")
|
// val device: BluetoothDevice = manager.adapter.getRemoteDevice("EC:D6:F4:3D:89:B8")
|
||||||
val device: BluetoothDevice = manager.adapter.getRemoteDevice("DE:F4:C6:A3:CD:7A")
|
val device: BluetoothDevice = manager.adapter.getRemoteDevice("E7:48:92:3B:7D:A5")
|
||||||
// val socket = device.createInsecureL2capChannel(31)
|
// val socket = device.createInsecureL2capChannel(31)
|
||||||
|
|
||||||
val batteryLevel = remember { mutableStateOf("") }
|
// val batteryLevel = remember { mutableStateOf("") }
|
||||||
// socket.outputStream.write(byteArrayOf(0x12,0x3B,0x00,0x02, 0x00))
|
// socket.outputStream.write(byteArrayOf(0x12,0x3B,0x00,0x02, 0x00))
|
||||||
// socket.outputStream.write(byteArrayOf(0x12, 0x3A, 0x00, 0x01, 0x00, 0x08,0x01))
|
// socket.outputStream.write(byteArrayOf(0x12, 0x3A, 0x00, 0x01, 0x00, 0x08,0x01))
|
||||||
|
|
||||||
@@ -140,10 +140,9 @@ class CustomDevice : ComponentActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Button(onClick = {
|
Button(onClick = {
|
||||||
// val characteristicUuid = "4f860002-943b-49ef-bed4-2f730304427a"
|
val characteristicUuid = "94110001-6D9B-4225-A4F1-6A4A7F01B0DE"
|
||||||
// val value = byteArrayOf(0x01, 0x00, 0x02)
|
val value = byteArrayOf(0x01, 0x00, 0x00, 0x00, 0x00 ,0x00 ,0x01)
|
||||||
|
sendWriteRequest(gatt, characteristicUuid, value)
|
||||||
// sendWriteRequest(gatt, characteristicUuid, value)
|
|
||||||
|
|
||||||
}) {
|
}) {
|
||||||
Text("batteryLevel.value")
|
Text("batteryLevel.value")
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ import me.kavishdevar.aln.screens.RenameScreen
|
|||||||
import me.kavishdevar.aln.services.AirPodsService
|
import me.kavishdevar.aln.services.AirPodsService
|
||||||
import me.kavishdevar.aln.ui.theme.ALNTheme
|
import me.kavishdevar.aln.ui.theme.ALNTheme
|
||||||
import me.kavishdevar.aln.utils.AirPodsNotifications
|
import me.kavishdevar.aln.utils.AirPodsNotifications
|
||||||
|
import me.kavishdevar.aln.utils.CrossDevice
|
||||||
|
|
||||||
lateinit var serviceConnection: ServiceConnection
|
lateinit var serviceConnection: ServiceConnection
|
||||||
lateinit var connectionStatusReceiver: BroadcastReceiver
|
lateinit var connectionStatusReceiver: BroadcastReceiver
|
||||||
@@ -119,13 +120,14 @@ class MainActivity : ComponentActivity() {
|
|||||||
@Composable
|
@Composable
|
||||||
fun Main() {
|
fun Main() {
|
||||||
val isConnected = remember { mutableStateOf(false) }
|
val isConnected = remember { mutableStateOf(false) }
|
||||||
|
val isRemotelyConnected = remember { mutableStateOf(false) }
|
||||||
val permissionState = rememberMultiplePermissionsState(
|
val permissionState = rememberMultiplePermissionsState(
|
||||||
permissions = listOf(
|
permissions = listOf(
|
||||||
"android.permission.BLUETOOTH_CONNECT",
|
"android.permission.BLUETOOTH_CONNECT",
|
||||||
|
"android.permission.BLUETOOTH_SCAN",
|
||||||
"android.permission.POST_NOTIFICATIONS"
|
"android.permission.POST_NOTIFICATIONS"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
val airPodsService = remember { mutableStateOf<AirPodsService?>(null) }
|
val airPodsService = remember { mutableStateOf<AirPodsService?>(null) }
|
||||||
if (permissionState.allPermissionsGranted) {
|
if (permissionState.allPermissionsGranted) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
@@ -139,6 +141,7 @@ fun Main() {
|
|||||||
}
|
}
|
||||||
else if (intent.action == AirPodsNotifications.AIRPODS_DISCONNECTED) {
|
else if (intent.action == AirPodsNotifications.AIRPODS_DISCONNECTED) {
|
||||||
Log.d("MainActivity", "AirPods Disconnected intent received")
|
Log.d("MainActivity", "AirPods Disconnected intent received")
|
||||||
|
isRemotelyConnected.value = CrossDevice.isAvailable
|
||||||
isConnected.value = false
|
isConnected.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -172,7 +175,8 @@ fun Main() {
|
|||||||
dev = airPodsService.value?.device,
|
dev = airPodsService.value?.device,
|
||||||
service = airPodsService.value!!,
|
service = airPodsService.value!!,
|
||||||
navController = navController,
|
navController = navController,
|
||||||
isConnected = isConnected.value
|
isConnected = isConnected.value,
|
||||||
|
isRemotelyConnected = isRemotelyConnected.value
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -208,7 +212,7 @@ fun Main() {
|
|||||||
|
|
||||||
context.bindService(Intent(context, AirPodsService::class.java), serviceConnection, Context.BIND_AUTO_CREATE)
|
context.bindService(Intent(context, AirPodsService::class.java), serviceConnection, Context.BIND_AUTO_CREATE)
|
||||||
|
|
||||||
if (airPodsService.value?.isConnected == true) {
|
if (airPodsService.value?.isConnectedLocally == true) {
|
||||||
isConnected.value = true
|
isConnected.value = true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ import me.kavishdevar.aln.utils.AirPodsNotifications
|
|||||||
@SuppressLint("MissingPermission")
|
@SuppressLint("MissingPermission")
|
||||||
@Composable
|
@Composable
|
||||||
fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
||||||
navController: NavController, isConnected: Boolean) {
|
navController: NavController, isConnected: Boolean, isRemotelyConnected: Boolean) {
|
||||||
val sharedPreferences = LocalContext.current.getSharedPreferences("settings", MODE_PRIVATE)
|
val sharedPreferences = LocalContext.current.getSharedPreferences("settings", MODE_PRIVATE)
|
||||||
var device by remember { mutableStateOf(dev) }
|
var device by remember { mutableStateOf(dev) }
|
||||||
var deviceName by remember {
|
var deviceName by remember {
|
||||||
@@ -187,7 +187,7 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
) { paddingValues ->
|
) { paddingValues ->
|
||||||
if (isConnected == true) {
|
if (isConnected == true || isRemotelyConnected == true) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.haze(hazeState)
|
.haze(hazeState)
|
||||||
@@ -308,7 +308,7 @@ fun AirPodsSettingsScreenPreview() {
|
|||||||
ALNTheme (
|
ALNTheme (
|
||||||
darkTheme = true
|
darkTheme = true
|
||||||
) {
|
) {
|
||||||
AirPodsSettingsScreen(dev = null, service = AirPodsService(), navController = rememberNavController(), isConnected = true)
|
AirPodsSettingsScreen(dev = null, service = AirPodsService(), navController = rememberNavController(), isConnected = true, isRemotelyConnected = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ class AirPodsQSService: TileService() {
|
|||||||
qsTile.state = Tile.STATE_UNAVAILABLE
|
qsTile.state = Tile.STATE_UNAVAILABLE
|
||||||
qsTile.updateTile()
|
qsTile.updateTile()
|
||||||
}
|
}
|
||||||
if (ServiceManager.getService()?.isConnected == true) {
|
if (ServiceManager.getService()?.isConnectedLocally == true) {
|
||||||
qsTile.state = Tile.STATE_ACTIVE
|
qsTile.state = Tile.STATE_ACTIVE
|
||||||
qsTile.updateTile()
|
qsTile.updateTile()
|
||||||
}
|
}
|
||||||
@@ -89,7 +89,7 @@ class AirPodsQSService: TileService() {
|
|||||||
IntentFilter(AirPodsNotifications.Companion.ANC_DATA)
|
IntentFilter(AirPodsNotifications.Companion.ANC_DATA)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
qsTile.state = if (ServiceManager.getService()?.isConnected == true) Tile.STATE_ACTIVE else Tile.STATE_UNAVAILABLE
|
qsTile.state = if (ServiceManager.getService()?.isConnectedLocally == true) Tile.STATE_ACTIVE else Tile.STATE_UNAVAILABLE
|
||||||
val ancIndex = ServiceManager.getService()?.getANC()
|
val ancIndex = ServiceManager.getService()?.getANC()
|
||||||
currentModeIndex = if (ancIndex != null) { if (ancIndex == 2) 0 else if (ancIndex == 3) 1 else if (ancIndex == 4) 2 else 2 } else 0
|
currentModeIndex = if (ancIndex != null) { if (ancIndex == 2) 0 else if (ancIndex == 3) 1 else if (ancIndex == 4) 2 else 2 } else 0
|
||||||
updateTile()
|
updateTile()
|
||||||
|
|||||||
@@ -24,10 +24,15 @@ import android.app.NotificationChannel
|
|||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.Service
|
import android.app.Service
|
||||||
import android.appwidget.AppWidgetManager
|
import android.appwidget.AppWidgetManager
|
||||||
|
import android.bluetooth.BluetoothAdapter
|
||||||
import android.bluetooth.BluetoothDevice
|
import android.bluetooth.BluetoothDevice
|
||||||
import android.bluetooth.BluetoothManager
|
import android.bluetooth.BluetoothManager
|
||||||
import android.bluetooth.BluetoothProfile
|
import android.bluetooth.BluetoothProfile
|
||||||
import android.bluetooth.BluetoothSocket
|
import android.bluetooth.BluetoothSocket
|
||||||
|
import android.bluetooth.le.ScanCallback
|
||||||
|
import android.bluetooth.le.ScanFilter
|
||||||
|
import android.bluetooth.le.ScanResult
|
||||||
|
import android.bluetooth.le.ScanSettings
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
@@ -46,7 +51,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api
|
|||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.channels.awaitClose
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import me.kavishdevar.aln.BatteryWidget
|
import me.kavishdevar.aln.BatteryWidget
|
||||||
import me.kavishdevar.aln.MainActivity
|
import me.kavishdevar.aln.MainActivity
|
||||||
@@ -55,11 +63,13 @@ import me.kavishdevar.aln.utils.AirPodsNotifications
|
|||||||
import me.kavishdevar.aln.utils.Battery
|
import me.kavishdevar.aln.utils.Battery
|
||||||
import me.kavishdevar.aln.utils.BatteryComponent
|
import me.kavishdevar.aln.utils.BatteryComponent
|
||||||
import me.kavishdevar.aln.utils.BatteryStatus
|
import me.kavishdevar.aln.utils.BatteryStatus
|
||||||
|
import me.kavishdevar.aln.utils.CrossDevice
|
||||||
import me.kavishdevar.aln.utils.Enums
|
import me.kavishdevar.aln.utils.Enums
|
||||||
import me.kavishdevar.aln.utils.LongPressPackets
|
import me.kavishdevar.aln.utils.LongPressPackets
|
||||||
import me.kavishdevar.aln.utils.MediaController
|
import me.kavishdevar.aln.utils.MediaController
|
||||||
import me.kavishdevar.aln.utils.Window
|
import me.kavishdevar.aln.utils.Window
|
||||||
import org.lsposed.hiddenapibypass.HiddenApiBypass
|
import org.lsposed.hiddenapibypass.HiddenApiBypass
|
||||||
|
import java.io.OutputStream
|
||||||
|
|
||||||
object ServiceManager {
|
object ServiceManager {
|
||||||
private var service: AirPodsService? = null
|
private var service: AirPodsService? = null
|
||||||
@@ -88,6 +98,7 @@ object ServiceManager {
|
|||||||
|
|
||||||
//@Suppress("unused")
|
//@Suppress("unused")
|
||||||
class AirPodsService: Service() {
|
class AirPodsService: Service() {
|
||||||
|
private var macAddress = ""
|
||||||
inner class LocalBinder : Binder() {
|
inner class LocalBinder : Binder() {
|
||||||
fun getService(): AirPodsService = this@AirPodsService
|
fun getService(): AirPodsService = this@AirPodsService
|
||||||
}
|
}
|
||||||
@@ -107,6 +118,30 @@ class AirPodsService: Service() {
|
|||||||
popupShown = true
|
popupShown = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleMessage(message: String, outputStream: OutputStream) {
|
||||||
|
when (message) {
|
||||||
|
"PAUSE_MEDIA" -> MediaController.sendPause()
|
||||||
|
"PLAY_MEDIA" -> MediaController.sendPlay()
|
||||||
|
"CONNECT_AIRPODS" -> connectToAirPods()
|
||||||
|
"DISCONNECT_AIRPODS" -> disconnectFromAirPods()
|
||||||
|
else -> {
|
||||||
|
forwardPacket(message, outputStream)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private fun forwardPacket(packet: String, outputStream: OutputStream) {
|
||||||
|
outputStream.write(packet.toByteArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun connectToAirPods() {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Should connect to AirPods now.")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun disconnectFromAirPods() {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Should disconnect from AirPods now.")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Suppress("ClassName")
|
@Suppress("ClassName")
|
||||||
private object bluetoothReceiver: BroadcastReceiver() {
|
private object bluetoothReceiver: BroadcastReceiver() {
|
||||||
@SuppressLint("MissingPermission")
|
@SuppressLint("MissingPermission")
|
||||||
@@ -123,7 +158,7 @@ class AirPodsService: Service() {
|
|||||||
if (bluetoothDevice != null && action != null && !action.isEmpty()) {
|
if (bluetoothDevice != null && action != null && !action.isEmpty()) {
|
||||||
Log.d("AirPodsService", "Received bluetooth connection broadcast")
|
Log.d("AirPodsService", "Received bluetooth connection broadcast")
|
||||||
if (BluetoothDevice.ACTION_ACL_CONNECTED == action) {
|
if (BluetoothDevice.ACTION_ACL_CONNECTED == action) {
|
||||||
if (ServiceManager.getService()?.isConnected == true) {
|
if (ServiceManager.getService()?.isConnectedLocally == true) {
|
||||||
ServiceManager.getService()?.manuallyCheckForAudioSource()
|
ServiceManager.getService()?.manuallyCheckForAudioSource()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -139,11 +174,47 @@ class AirPodsService: Service() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var isConnected = false
|
var isConnectedLocally = false
|
||||||
var device: BluetoothDevice? = null
|
var device: BluetoothDevice? = null
|
||||||
|
|
||||||
private lateinit var earReceiver: BroadcastReceiver
|
private lateinit var earReceiver: BroadcastReceiver
|
||||||
|
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
|
fun scanForAirPods(bluetoothAdapter: BluetoothAdapter): Flow<List<ScanResult>> = callbackFlow {
|
||||||
|
val bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner
|
||||||
|
?: throw IllegalStateException("Bluetooth adapter unavailable")
|
||||||
|
|
||||||
|
val scanCallback = object : ScanCallback() {
|
||||||
|
override fun onScanResult(callbackType: Int, result: ScanResult) {
|
||||||
|
if (result.device != null) {
|
||||||
|
trySend(listOf(result))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBatchScanResults(results: List<ScanResult>) {
|
||||||
|
trySend(results)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onScanFailed(errorCode: Int) {
|
||||||
|
close(Exception("Scan failed with error: $errorCode"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val scanSettings = ScanSettings.Builder()
|
||||||
|
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val scanFilters = listOf<ScanFilter>(
|
||||||
|
ScanFilter.Builder()
|
||||||
|
.setManufacturerData(0x004C, byteArrayOf())
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
|
||||||
|
bluetoothLeScanner.startScan(scanFilters, scanSettings, scanCallback)
|
||||||
|
awaitClose { bluetoothLeScanner.stopScan(scanCallback) }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fun startForegroundNotification() {
|
fun startForegroundNotification() {
|
||||||
val notificationChannel = NotificationChannel(
|
val notificationChannel = NotificationChannel(
|
||||||
"background_service_status",
|
"background_service_status",
|
||||||
@@ -261,6 +332,11 @@ class AirPodsService: Service() {
|
|||||||
Log.d("AirPodsService", "Service started")
|
Log.d("AirPodsService", "Service started")
|
||||||
ServiceManager.setService(this)
|
ServiceManager.setService(this)
|
||||||
startForegroundNotification()
|
startForegroundNotification()
|
||||||
|
|
||||||
|
Log.d("AirPodsService", "Initializing CrossDevice")
|
||||||
|
CrossDevice.init(this)
|
||||||
|
Log.d("AirPodsService", "CrossDevice initialized")
|
||||||
|
|
||||||
val serviceIntentFilter = IntentFilter().apply {
|
val serviceIntentFilter = IntentFilter().apply {
|
||||||
addAction("android.bluetooth.device.action.ACL_CONNECTED")
|
addAction("android.bluetooth.device.action.ACL_CONNECTED")
|
||||||
addAction("android.bluetooth.device.action.ACL_DISCONNECTED")
|
addAction("android.bluetooth.device.action.ACL_DISCONNECTED")
|
||||||
@@ -294,14 +370,19 @@ class AirPodsService: Service() {
|
|||||||
this@AirPodsService.getSharedPreferences("settings", MODE_PRIVATE).edit()
|
this@AirPodsService.getSharedPreferences("settings", MODE_PRIVATE).edit()
|
||||||
.putString("name", name).apply()
|
.putString("name", name).apply()
|
||||||
}
|
}
|
||||||
Log.d("AirPodsService", "$name connected")
|
Log.d("AirPodsQuickSwitchServices", CrossDevice.isAvailable.toString())
|
||||||
showPopup(this@AirPodsService, name.toString())
|
if (!CrossDevice.isAvailable) {
|
||||||
connectToSocket(device!!)
|
Log.d("AirPodsService", "$name connected")
|
||||||
updateNotificationContent(true, name.toString(), batteryNotification.getBattery())
|
showPopup(this@AirPodsService, name.toString())
|
||||||
|
connectToSocket(device!!)
|
||||||
|
isConnectedLocally = true
|
||||||
|
macAddress = device!!.address
|
||||||
|
updateNotificationContent(true, name.toString(), batteryNotification.getBattery())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (intent?.action == AirPodsNotifications.Companion.AIRPODS_DISCONNECTED) {
|
else if (intent?.action == AirPodsNotifications.Companion.AIRPODS_DISCONNECTED) {
|
||||||
device = null
|
device = null
|
||||||
isConnected = false
|
isConnectedLocally = false
|
||||||
popupShown = false
|
popupShown = false
|
||||||
updateNotificationContent(false)
|
updateNotificationContent(false)
|
||||||
}
|
}
|
||||||
@@ -319,6 +400,28 @@ class AirPodsService: Service() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val bluetoothAdapter = getSystemService(BluetoothManager::class.java).adapter
|
val bluetoothAdapter = getSystemService(BluetoothManager::class.java).adapter
|
||||||
|
if (bluetoothAdapter.isEnabled) {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
var lastData = byteArrayOf()
|
||||||
|
scanForAirPods(bluetoothAdapter).collect { scanResults ->
|
||||||
|
scanResults.forEach { scanResult ->
|
||||||
|
val device = scanResult.device
|
||||||
|
device.fetchUuidsWithSdp()
|
||||||
|
val manufacturerData = scanResult.scanRecord?.manufacturerSpecificData?.get(0x004C)
|
||||||
|
if (manufacturerData != null && manufacturerData != lastData) {
|
||||||
|
lastData = manufacturerData
|
||||||
|
val formattedHex = manufacturerData.joinToString(" ") { "%02X".format(it) }
|
||||||
|
val rssi = scanResult.rssi
|
||||||
|
Log.d(
|
||||||
|
"AirPodsBLEService",
|
||||||
|
"Received broadcast of size ${manufacturerData.size} from ${device.address} | $rssi | $formattedHex"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bluetoothAdapter.bondedDevices.forEach { device ->
|
bluetoothAdapter.bondedDevices.forEach { device ->
|
||||||
device.fetchUuidsWithSdp()
|
device.fetchUuidsWithSdp()
|
||||||
if (device.uuids != null)
|
if (device.uuids != null)
|
||||||
@@ -331,7 +434,9 @@ class AirPodsService: Service() {
|
|||||||
if (profile == BluetoothProfile.A2DP) {
|
if (profile == BluetoothProfile.A2DP) {
|
||||||
val connectedDevices = proxy.connectedDevices
|
val connectedDevices = proxy.connectedDevices
|
||||||
if (connectedDevices.isNotEmpty()) {
|
if (connectedDevices.isNotEmpty()) {
|
||||||
connectToSocket(device)
|
if (!CrossDevice.isAvailable) {
|
||||||
|
connectToSocket(device)
|
||||||
|
}
|
||||||
this@AirPodsService.sendBroadcast(
|
this@AirPodsService.sendBroadcast(
|
||||||
Intent(AirPodsNotifications.Companion.AIRPODS_CONNECTED)
|
Intent(AirPodsNotifications.Companion.AIRPODS_CONNECTED)
|
||||||
)
|
)
|
||||||
@@ -365,7 +470,7 @@ class AirPodsService: Service() {
|
|||||||
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||||
val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
||||||
|
|
||||||
if (isConnected != true) {
|
if (isConnectedLocally != true) {
|
||||||
try {
|
try {
|
||||||
socket = HiddenApiBypass.newInstance(
|
socket = HiddenApiBypass.newInstance(
|
||||||
BluetoothSocket::class.java,
|
BluetoothSocket::class.java,
|
||||||
@@ -401,7 +506,7 @@ class AirPodsService: Service() {
|
|||||||
try {
|
try {
|
||||||
socket.connect()
|
socket.connect()
|
||||||
this@AirPodsService.device = device
|
this@AirPodsService.device = device
|
||||||
isConnected = true
|
isConnectedLocally = true
|
||||||
socket.let { it ->
|
socket.let { it ->
|
||||||
// sometimes doesn't work ;-;
|
// sometimes doesn't work ;-;
|
||||||
// i though i move it to the coroutine
|
// i though i move it to the coroutine
|
||||||
@@ -437,7 +542,6 @@ class AirPodsService: Service() {
|
|||||||
Intent(AirPodsNotifications.Companion.AIRPODS_CONNECTED)
|
Intent(AirPodsNotifications.Companion.AIRPODS_CONNECTED)
|
||||||
.putExtra("device", device)
|
.putExtra("device", device)
|
||||||
)
|
)
|
||||||
|
|
||||||
while (socket.isConnected == true) {
|
while (socket.isConnected == true) {
|
||||||
socket.let {
|
socket.let {
|
||||||
val audioManager =
|
val audioManager =
|
||||||
@@ -453,6 +557,7 @@ class AirPodsService: Service() {
|
|||||||
})
|
})
|
||||||
val bytes = buffer.copyOfRange(0, bytesRead)
|
val bytes = buffer.copyOfRange(0, bytesRead)
|
||||||
val formattedHex = bytes.joinToString(" ") { "%02X".format(it) }
|
val formattedHex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||||
|
CrossDevice.sendReceivedPacket(bytes)
|
||||||
Log.d("AirPods Data", "Data received: $formattedHex")
|
Log.d("AirPods Data", "Data received: $formattedHex")
|
||||||
} else if (bytesRead == -1) {
|
} else if (bytesRead == -1) {
|
||||||
Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
|
Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
|
||||||
@@ -565,15 +670,11 @@ class AirPodsService: Service() {
|
|||||||
if (inEar == true) {
|
if (inEar == true) {
|
||||||
if (!justEnabledA2dp) {
|
if (!justEnabledA2dp) {
|
||||||
justEnabledA2dp = false
|
justEnabledA2dp = false
|
||||||
// if (audioManager.activePlaybackConfigurations.any { it.audioDeviceInfo?.address == device.address }) {
|
|
||||||
MediaController.sendPlay()
|
MediaController.sendPlay()
|
||||||
MediaController.iPausedTheMedia = false
|
MediaController.iPausedTheMedia = false
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if (audioManager.activePlaybackConfigurations.any { it.audioDeviceInfo?.address == device.address }) {
|
|
||||||
MediaController.sendPause()
|
MediaController.sendPause()
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -593,12 +694,16 @@ class AirPodsService: Service() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else if (ancNotification.isANCData(data)) {
|
} else if (ancNotification.isANCData(data)) {
|
||||||
|
CrossDevice.sendRemotePacket(data)
|
||||||
|
CrossDevice.ancBytes = data
|
||||||
ancNotification.setStatus(data)
|
ancNotification.setStatus(data)
|
||||||
sendBroadcast(Intent(AirPodsNotifications.Companion.ANC_DATA).apply {
|
sendBroadcast(Intent(AirPodsNotifications.Companion.ANC_DATA).apply {
|
||||||
putExtra("data", ancNotification.status)
|
putExtra("data", ancNotification.status)
|
||||||
})
|
})
|
||||||
Log.d("AirPods Parser", "ANC: ${ancNotification.status}")
|
Log.d("AirPods Parser", "ANC: ${ancNotification.status}")
|
||||||
} else if (batteryNotification.isBatteryData(data)) {
|
} else if (batteryNotification.isBatteryData(data)) {
|
||||||
|
CrossDevice.sendRemotePacket(data)
|
||||||
|
CrossDevice.batteryBytes = data
|
||||||
batteryNotification.setBattery(data)
|
batteryNotification.setBattery(data)
|
||||||
sendBroadcast(Intent(AirPodsNotifications.Companion.BATTERY_DATA).apply {
|
sendBroadcast(Intent(AirPodsNotifications.Companion.BATTERY_DATA).apply {
|
||||||
putParcelableArrayListExtra(
|
putParcelableArrayListExtra(
|
||||||
@@ -651,7 +756,7 @@ class AirPodsService: Service() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.d("AirPods Service", "Socket closed")
|
Log.d("AirPods Service", "Socket closed")
|
||||||
isConnected = false
|
isConnectedLocally = false
|
||||||
socket.close()
|
socket.close()
|
||||||
sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DISCONNECTED))
|
sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DISCONNECTED))
|
||||||
}
|
}
|
||||||
@@ -663,59 +768,91 @@ class AirPodsService: Service() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun disconnect() {
|
||||||
|
socket.close()
|
||||||
|
val bluetoothAdapter = getSystemService(BluetoothManager::class.java).adapter
|
||||||
|
bluetoothAdapter.getProfileProxy(this, object : BluetoothProfile.ServiceListener {
|
||||||
|
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||||
|
if (profile == BluetoothProfile.A2DP) {
|
||||||
|
val connectedDevices = proxy.connectedDevices
|
||||||
|
if (connectedDevices.isNotEmpty()) {
|
||||||
|
MediaController.sendPause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bluetoothAdapter.closeProfileProxy(profile, proxy)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onServiceDisconnected(profile: Int) {}
|
||||||
|
}, BluetoothProfile.A2DP)
|
||||||
|
HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "disconnect")
|
||||||
|
isConnectedLocally = false
|
||||||
|
}
|
||||||
|
|
||||||
fun sendPacket(packet: String) {
|
fun sendPacket(packet: String) {
|
||||||
val fromHex = packet.split(" ").map { it.toInt(16).toByte() }
|
val fromHex = packet.split(" ").map { it.toInt(16).toByte() }
|
||||||
|
if (!isConnectedLocally && CrossDevice.isAvailable) {
|
||||||
|
CrossDevice.sendRemotePacket(fromHex.toByteArray())
|
||||||
|
return
|
||||||
|
}
|
||||||
socket.outputStream?.write(fromHex.toByteArray())
|
socket.outputStream?.write(fromHex.toByteArray())
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun sendPacket(packet: ByteArray) {
|
||||||
|
if (!isConnectedLocally && CrossDevice.isAvailable) {
|
||||||
|
CrossDevice.sendRemotePacket(packet)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
socket.outputStream?.write(packet)
|
||||||
|
socket.outputStream?.flush()
|
||||||
|
}
|
||||||
|
|
||||||
fun setANCMode(mode: Int) {
|
fun setANCMode(mode: Int) {
|
||||||
Log.d("AirPodsService", "setANCMode: $mode")
|
Log.d("AirPodsService", "setANCMode: $mode")
|
||||||
when (mode) {
|
when (mode) {
|
||||||
1 -> {
|
1 -> {
|
||||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_OFF.value)
|
sendPacket(Enums.NOISE_CANCELLATION_OFF.value)
|
||||||
}
|
}
|
||||||
2 -> {
|
2 -> {
|
||||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_ON.value)
|
sendPacket(Enums.NOISE_CANCELLATION_ON.value)
|
||||||
}
|
}
|
||||||
3 -> {
|
3 -> {
|
||||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_TRANSPARENCY.value)
|
sendPacket(Enums.NOISE_CANCELLATION_TRANSPARENCY.value)
|
||||||
}
|
}
|
||||||
4 -> {
|
4 -> {
|
||||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_ADAPTIVE.value)
|
sendPacket(Enums.NOISE_CANCELLATION_ADAPTIVE.value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setCAEnabled(enabled: Boolean) {
|
fun setCAEnabled(enabled: Boolean) {
|
||||||
socket.outputStream?.write(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value)
|
sendPacket(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setOffListeningMode(enabled: Boolean) {
|
fun setOffListeningMode(enabled: Boolean) {
|
||||||
socket.outputStream?.write(byteArrayOf(0x04, 0x00 ,0x04, 0x00, 0x09, 0x00, 0x34, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00))
|
sendPacket(byteArrayOf(0x04, 0x00 ,0x04, 0x00, 0x09, 0x00, 0x34, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00))
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setAdaptiveStrength(strength: Int) {
|
fun setAdaptiveStrength(strength: Int) {
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x2E, strength.toByte(), 0x00, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x2E, strength.toByte(), 0x00, 0x00, 0x00)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setPressSpeed(speed: Int) {
|
fun setPressSpeed(speed: Int) {
|
||||||
// 0x00 = default, 0x01 = slower, 0x02 = slowest
|
// 0x00 = default, 0x01 = slower, 0x02 = slowest
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x17, speed.toByte(), 0x00, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x17, speed.toByte(), 0x00, 0x00, 0x00)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setPressAndHoldDuration(speed: Int) {
|
fun setPressAndHoldDuration(speed: Int) {
|
||||||
// 0 - default, 1 - slower, 2 - slowest
|
// 0 - default, 1 - slower, 2 - slowest
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x18, speed.toByte(), 0x00, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x18, speed.toByte(), 0x00, 0x00, 0x00)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,25 +860,25 @@ class AirPodsService: Service() {
|
|||||||
// 0 - default, 1 - longer, 2 - longest
|
// 0 - default, 1 - longer, 2 - longest
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x23, speed.toByte(), 0x00, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x23, speed.toByte(), 0x00, 0x00, 0x00)
|
||||||
Log.d("AirPodsService", "Setting volume swipe speed to $speed by packet ${bytes.joinToString(" ") { "%02X".format(it) }}")
|
Log.d("AirPodsService", "Setting volume swipe speed to $speed by packet ${bytes.joinToString(" ") { "%02X".format(it) }}")
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setNoiseCancellationWithOnePod(enabled: Boolean) {
|
fun setNoiseCancellationWithOnePod(enabled: Boolean) {
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1B, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1B, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setVolumeControl(enabled: Boolean) {
|
fun setVolumeControl(enabled: Boolean) {
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x25, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x25, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setToneVolume(volume: Int) {
|
fun setToneVolume(volume: Int) {
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1F, volume.toByte(), 0x50, 0x00, 0x00)
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1F, volume.toByte(), 0x50, 0x00, 0x00)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -754,7 +891,7 @@ class AirPodsService: Service() {
|
|||||||
|
|
||||||
fun setCaseChargingSounds(enabled: Boolean) {
|
fun setCaseChargingSounds(enabled: Boolean) {
|
||||||
val bytes = byteArrayOf(0x12, 0x3a, 0x00, 0x01, 0x00, 0x08, if (enabled) 0x00 else 0x01)
|
val bytes = byteArrayOf(0x12, 0x3a, 0x00, 0x01, 0x00, 0x08, if (enabled) 0x00 else 0x01)
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -763,16 +900,21 @@ class AirPodsService: Service() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getBattery(): List<Battery> {
|
fun getBattery(): List<Battery> {
|
||||||
|
if (!isConnectedLocally && CrossDevice.isAvailable) {
|
||||||
|
batteryNotification.setBattery(CrossDevice.batteryBytes)
|
||||||
|
}
|
||||||
return batteryNotification.getBattery()
|
return batteryNotification.getBattery()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getANC(): Int {
|
fun getANC(): Int {
|
||||||
|
if (!isConnectedLocally && CrossDevice.isAvailable) {
|
||||||
|
ancNotification.setStatus(CrossDevice.ancBytes)
|
||||||
|
}
|
||||||
return ancNotification.status
|
return ancNotification.status
|
||||||
}
|
}
|
||||||
|
|
||||||
fun disconnectAudio(context: Context, device: BluetoothDevice?) {
|
fun disconnectAudio(context: Context, device: BluetoothDevice?) {
|
||||||
val bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter
|
val bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter
|
||||||
|
|
||||||
bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
||||||
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||||
if (profile == BluetoothProfile.A2DP) {
|
if (profile == BluetoothProfile.A2DP) {
|
||||||
@@ -850,7 +992,7 @@ class AirPodsService: Service() {
|
|||||||
val nameBytes = name.toByteArray()
|
val nameBytes = name.toByteArray()
|
||||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x01,
|
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x01,
|
||||||
nameBytes.size.toByte(), 0x00) + nameBytes
|
nameBytes.size.toByte(), 0x00) + nameBytes
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
val hex = bytes.joinToString(" ") { "%02X".format(it) }
|
val hex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||||
updateNotificationContent(true, name, batteryNotification.getBattery())
|
updateNotificationContent(true, name, batteryNotification.getBattery())
|
||||||
@@ -860,18 +1002,18 @@ class AirPodsService: Service() {
|
|||||||
fun setPVEnabled(enabled: Boolean) {
|
fun setPVEnabled(enabled: Boolean) {
|
||||||
var hex = "04 00 04 00 09 00 26 ${if (enabled) "01" else "02"} 00 00 00"
|
var hex = "04 00 04 00 09 00 26 ${if (enabled) "01" else "02"} 00 00 00"
|
||||||
var bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
var bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
hex = "04 00 04 00 17 00 00 00 10 00 12 00 08 E${if (enabled) "6" else "5"} 05 10 02 42 0B 08 50 10 02 1A 05 02 ${if (enabled) "32" else "00"} 00 00 00"
|
hex = "04 00 04 00 17 00 00 00 10 00 12 00 08 E${if (enabled) "6" else "5"} 05 10 02 42 0B 08 50 10 02 1A 05 02 ${if (enabled) "32" else "00"} 00 00 00"
|
||||||
bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setLoudSoundReduction(enabled: Boolean) {
|
fun setLoudSoundReduction(enabled: Boolean) {
|
||||||
val hex = "52 1B 00 0${if (enabled) "1" else "0"}"
|
val hex = "52 1B 00 0${if (enabled) "1" else "0"}"
|
||||||
val bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
val bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||||
socket.outputStream?.write(bytes)
|
sendPacket(bytes)
|
||||||
socket.outputStream?.flush()
|
socket.outputStream?.flush()
|
||||||
}
|
}
|
||||||
fun findChangedIndex(oldArray: BooleanArray, newArray: BooleanArray): Int {
|
fun findChangedIndex(oldArray: BooleanArray, newArray: BooleanArray): Int {
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
package me.kavishdevar.aln.utils
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.bluetooth.BluetoothAdapter
|
||||||
|
import android.bluetooth.BluetoothManager
|
||||||
|
import android.bluetooth.BluetoothServerSocket
|
||||||
|
import android.bluetooth.BluetoothSocket
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.Log
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import me.kavishdevar.aln.services.ServiceManager
|
||||||
|
import java.io.IOException
|
||||||
|
import java.util.UUID
|
||||||
|
|
||||||
|
enum class CrossDevicePackets(val packet: ByteArray) {
|
||||||
|
AIRPODS_CONNECTED(byteArrayOf(0x00, 0x01, 0x00, 0x01)),
|
||||||
|
AIRPODS_DISCONNECTED(byteArrayOf(0x00, 0x01, 0x00, 0x00)),
|
||||||
|
REQUEST_DISCONNECT(byteArrayOf(0x00, 0x02, 0x00, 0x00)),
|
||||||
|
REQUEST_BATTERY_BYTES(byteArrayOf(0x00, 0x02, 0x00, 0x01)),
|
||||||
|
REQUEST_ANC_BYTES(byteArrayOf(0x00, 0x02, 0x00, 0x02)),
|
||||||
|
AIRPODS_DATA_HEADER(byteArrayOf(0x00, 0x04, 0x00, 0x01)),
|
||||||
|
}
|
||||||
|
|
||||||
|
object CrossDevice {
|
||||||
|
private val uuid = UUID.fromString("1abbb9a4-10e4-4000-a75c-8953c5471342")
|
||||||
|
private var serverSocket: BluetoothServerSocket? = null
|
||||||
|
private var clientSocket: BluetoothSocket? = null
|
||||||
|
private lateinit var bluetoothAdapter: BluetoothAdapter
|
||||||
|
var isAvailable: Boolean = false // set to true when airpods are connected to another device
|
||||||
|
var batteryBytes: ByteArray = byteArrayOf()
|
||||||
|
var ancBytes: ByteArray = byteArrayOf()
|
||||||
|
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
|
fun init(context: Context) {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Initializing CrossDevice")
|
||||||
|
this.bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter
|
||||||
|
startServer()
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
|
fun startServer() {
|
||||||
|
serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("AirPodsSwitch", uuid)
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Server started")
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
while (serverSocket != null) {
|
||||||
|
try {
|
||||||
|
val socket = serverSocket!!.accept()
|
||||||
|
handleClientConnection(socket)
|
||||||
|
} catch (e: IOException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setAirPodsConnected(connected: Boolean) {
|
||||||
|
if (connected) {
|
||||||
|
isAvailable = true
|
||||||
|
clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_CONNECTED.packet)
|
||||||
|
} else {
|
||||||
|
clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_DISCONNECTED.packet)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendReceivedPacket(packet: ByteArray) {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Sending packet to remote device")
|
||||||
|
clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_DATA_HEADER.packet + packet)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleClientConnection(socket: BluetoothSocket) {
|
||||||
|
clientSocket = socket
|
||||||
|
val inputStream = socket.inputStream
|
||||||
|
val buffer = ByteArray(1024)
|
||||||
|
var bytes: Int
|
||||||
|
setAirPodsConnected(ServiceManager.getService()?.isConnectedLocally == true)
|
||||||
|
while (true) {
|
||||||
|
bytes = inputStream.read(buffer)
|
||||||
|
val packet = buffer.copyOf(bytes)
|
||||||
|
if (bytes == -1) {
|
||||||
|
break
|
||||||
|
} else if (packet.contentEquals(CrossDevicePackets.REQUEST_DISCONNECT.packet)) {
|
||||||
|
ServiceManager.getService()?.disconnect()
|
||||||
|
} else if (packet.contentEquals(CrossDevicePackets.AIRPODS_CONNECTED.packet)) {
|
||||||
|
isAvailable = true
|
||||||
|
} else if (packet.contentEquals(CrossDevicePackets.AIRPODS_DISCONNECTED.packet)) {
|
||||||
|
isAvailable = false
|
||||||
|
} else if (packet.contentEquals(CrossDevicePackets.REQUEST_BATTERY_BYTES.packet)) {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Received battery request, battery data: ${batteryBytes.joinToString("") { "%02x".format(it) }}")
|
||||||
|
sendRemotePacket(batteryBytes)
|
||||||
|
} else if (packet.contentEquals(CrossDevicePackets.REQUEST_ANC_BYTES.packet)) {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Received ANC request")
|
||||||
|
sendRemotePacket(ancBytes)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (ServiceManager.getService()?.isConnectedLocally == true) {
|
||||||
|
val packetInHex = packet.joinToString("") { "%02x".format(it) }
|
||||||
|
ServiceManager.getService()?.sendPacket(packetInHex)
|
||||||
|
} else if (ServiceManager.getService()?.batteryNotification?.isBatteryData(packet) == true) {
|
||||||
|
batteryBytes = packet
|
||||||
|
ServiceManager.getService()?.batteryNotification?.setBattery(packet)
|
||||||
|
ServiceManager.getService()?.updateBatteryWidget()
|
||||||
|
} else if (ServiceManager.getService()?.ancNotification?.isANCData(packet) == true) {
|
||||||
|
ServiceManager.getService()?.ancNotification?.setStatus(packet)
|
||||||
|
ancBytes = packet
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendRemotePacket(byteArray: ByteArray) {
|
||||||
|
if (clientSocket == null) {
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Client socket is null")
|
||||||
|
}
|
||||||
|
clientSocket?.outputStream?.write(byteArray)
|
||||||
|
clientSocket?.outputStream?.flush()
|
||||||
|
Log.d("AirPodsQuickSwitchService", "Sent packet to remote device")
|
||||||
|
}
|
||||||
|
}
|
||||||
74
linux/crossdevice.py
Normal file
74
linux/crossdevice.py
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import bluetooth
|
||||||
|
import time
|
||||||
|
import threading
|
||||||
|
|
||||||
|
# Bluetooth MAC address of the target device
|
||||||
|
TARGET_MAC = "22:22:F5:BB:1C:A0" # Replace with the actual MAC address
|
||||||
|
UUID = "1abbb9a4-10e4-4000-a75c-8953c5471342"
|
||||||
|
|
||||||
|
# Define packets
|
||||||
|
PACKETS = {
|
||||||
|
"AIRPODS_CONNECTED": b"\x00\x01\x00\x01",
|
||||||
|
"AIRPODS_DISCONNECTED": b"\x00\x01\x00\x00",
|
||||||
|
"REQUEST_BATTERY_BYTES": b"\x00\x02\x00\x01",
|
||||||
|
"REQUEST_ANC_BYTES": b"\x00\x02\x00\x02",
|
||||||
|
"REQUEST_DISCONNECT": b"\x00\x02\x00\x00"
|
||||||
|
}
|
||||||
|
|
||||||
|
def send_packet(sock, packet_name):
|
||||||
|
if packet_name in PACKETS:
|
||||||
|
packet = PACKETS[packet_name]
|
||||||
|
sock.send(packet)
|
||||||
|
print(f"Sent packet: {packet_name}")
|
||||||
|
else:
|
||||||
|
print(f"Packet {packet_name} not defined.")
|
||||||
|
|
||||||
|
def listen_for_packets(sock):
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
data = sock.recv(1024)
|
||||||
|
if data:
|
||||||
|
print(f"Received packet: {data}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error receiving data: {e}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Discover services to find the channel using the UUID
|
||||||
|
services = bluetooth.find_service(address=TARGET_MAC, uuid=UUID)
|
||||||
|
if len(services) == 0:
|
||||||
|
print(f"Could not find services for UUID {UUID}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Use the first service found
|
||||||
|
service = services[0]
|
||||||
|
port = service["port"]
|
||||||
|
name = service["name"]
|
||||||
|
host = service["host"]
|
||||||
|
|
||||||
|
print(f"Connecting to \"{name}\" on {host}, port {port}")
|
||||||
|
|
||||||
|
# Create a Bluetooth socket
|
||||||
|
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
|
||||||
|
sock.connect((host, port))
|
||||||
|
print(f"Connected to {TARGET_MAC} on port {port}")
|
||||||
|
|
||||||
|
# Start listening for packets in a background thread
|
||||||
|
listener_thread = threading.Thread(target=listen_for_packets, args=(sock,))
|
||||||
|
listener_thread.daemon = True
|
||||||
|
listener_thread.start()
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
packet_name = input("Enter packet name to send (or 'exit' to quit): ")
|
||||||
|
if packet_name.lower() == "exit":
|
||||||
|
break
|
||||||
|
send_packet(sock, packet_name)
|
||||||
|
time.sleep(1)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
finally:
|
||||||
|
sock.close()
|
||||||
|
print("Connection closed.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -24,6 +24,11 @@
|
|||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
#include <QBluetoothServer>
|
||||||
|
#include <QBluetoothSocket>
|
||||||
|
#include <QBluetoothDeviceDiscoveryAgent>
|
||||||
|
#include <QBluetoothLocalDevice>
|
||||||
|
#include <QBluetoothUuid>
|
||||||
|
|
||||||
Q_LOGGING_CATEGORY(airpodsApp, "airpodsApp")
|
Q_LOGGING_CATEGORY(airpodsApp, "airpodsApp")
|
||||||
|
|
||||||
@@ -266,8 +271,7 @@ public slots:
|
|||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private slots:
|
||||||
private slots:
|
|
||||||
void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason) {
|
void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason) {
|
||||||
if (reason == QSystemTrayIcon::Trigger) {
|
if (reason == QSystemTrayIcon::Trigger) {
|
||||||
LOG_INFO("Tray icon activated");
|
LOG_INFO("Tray icon activated");
|
||||||
@@ -550,4 +554,5 @@ int main(int argc, char *argv[]) {
|
|||||||
return app.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "main.moc"
|
#include "main.moc"
|
||||||
|
|||||||
313
log.txt
Normal file
313
log.txt
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
--------- beginning of main
|
||||||
|
01-18 01:36:57.299 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:36:57.299 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:36:57.331 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:57.331 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:57.608 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -67 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:57.608 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -67 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:57.761 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:36:57.761 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:36:57.882 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:57.882 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.158 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.158 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.391 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -98 | 12 02 00 03
|
||||||
|
01-18 01:36:58.391 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -98 | 12 02 00 03
|
||||||
|
01-18 01:36:58.428 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:36:58.428 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:36:58.437 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.438 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.720 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.720 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.992 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:58.992 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:59.271 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:59.271 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:59.301 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:36:59.301 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:36:59.551 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:59.552 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:59.763 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03
|
||||||
|
01-18 01:36:59.764 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03
|
||||||
|
01-18 01:36:59.829 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:36:59.829 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:00.112 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:00.112 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:00.378 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:00.379 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:00.395 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:00.396 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:00.653 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:00.654 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:01.311 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:01.311 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:01.744 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:01.744 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:01.762 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03
|
||||||
|
01-18 01:37:01.762 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03
|
||||||
|
01-18 01:37:02.018 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.018 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.290 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.290 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.440 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:02.440 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:02.560 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.560 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.833 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:02.833 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.105 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.105 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.409 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.409 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.661 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.662 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.769 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:37:03.769 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:37:03.941 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:03.941 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:04.433 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:04.433 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:04.447 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:04.448 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:04.758 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:04.758 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.039 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.039 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.299 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.299 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.319 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -50 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:05.320 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -50 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:05.572 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.573 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.763 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03
|
||||||
|
01-18 01:37:05.763 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03
|
||||||
|
01-18 01:37:05.853 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:05.853 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.121 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.121 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.404 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.405 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.434 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:06.434 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:06.446 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:06.447 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:06.676 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.676 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.949 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:06.949 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:07.224 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:07.225 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:07.771 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03
|
||||||
|
01-18 01:37:07.772 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03
|
||||||
|
01-18 01:37:07.777 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:07.777 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.057 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.057 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.333 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.334 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.442 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:08.444 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:08.450 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:37:08.451 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:37:08.612 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.612 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.886 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:08.887 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:09.161 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:09.161 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:09.322 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:09.323 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:09.767 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03
|
||||||
|
01-18 01:37:09.767 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03
|
||||||
|
01-18 01:37:09.985 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:09.985 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:10.260 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:10.260 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:10.450 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:10.450 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:10.455 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:10.455 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:11.093 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.093 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.330 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:11.330 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:11.369 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.369 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.644 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.644 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.769 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03
|
||||||
|
01-18 01:37:11.769 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03
|
||||||
|
01-18 01:37:11.912 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:11.913 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:12.195 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:12.195 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:12.456 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:37:12.457 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:37:12.482 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:12.483 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:13.777 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03
|
||||||
|
01-18 01:37:13.777 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03
|
||||||
|
01-18 01:37:14.399 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:14.399 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:14.460 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -87 | 12 02 00 03
|
||||||
|
01-18 01:37:14.461 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -87 | 12 02 00 03
|
||||||
|
01-18 01:37:14.462 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:14.462 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:14.678 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:14.678 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:14.949 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:14.949 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:15.493 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:15.493 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:15.772 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:15.772 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:16.463 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:16.464 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:16.470 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:16.470 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:16.878 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:16.878 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.155 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.155 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.427 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.427 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.700 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.700 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:17.775 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03
|
||||||
|
01-18 01:37:17.775 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03
|
||||||
|
01-18 01:37:18.250 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:18.251 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:18.473 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -94 | 12 02 00 03
|
||||||
|
01-18 01:37:18.473 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -94 | 12 02 00 03
|
||||||
|
01-18 01:37:18.480 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:18.481 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:18.517 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:18.517 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:18.790 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:18.790 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:19.065 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:19.065 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:20.165 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:20.166 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:20.447 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:20.448 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:20.473 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -97 | 12 02 00 03
|
||||||
|
01-18 01:37:20.473 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -97 | 12 02 00 03
|
||||||
|
01-18 01:37:20.477 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:20.478 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:20.726 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:20.726 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:21.283 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:21.283 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:21.353 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:21.353 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:21.781 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03
|
||||||
|
01-18 01:37:21.781 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03
|
||||||
|
01-18 01:37:22.103 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:22.103 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:22.376 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:22.376 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:22.483 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:22.484 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03
|
||||||
|
01-18 01:37:22.486 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:37:22.486 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02
|
||||||
|
01-18 01:37:22.656 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:22.656 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.209 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.210 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.363 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:23.363 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:23.483 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.483 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.759 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.759 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:23.783 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03
|
||||||
|
01-18 01:37:23.783 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03
|
||||||
|
01-18 01:37:24.038 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:24.038 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:24.324 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:24.324 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:24.486 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -65 | 12 02 00 02
|
||||||
|
01-18 01:37:24.486 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -65 | 12 02 00 02
|
||||||
|
01-18 01:37:24.861 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:24.862 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:25.365 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:25.366 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:25.411 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:25.412 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:25.783 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:37:25.783 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:37:26.782 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:26.782 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:27.053 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:27.054 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:27.328 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:27.328 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:27.376 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:27.376 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:27.803 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:37:27.804 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03
|
||||||
|
01-18 01:37:27.887 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:27.890 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.147 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.147 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.435 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.436 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.498 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:28.498 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03
|
||||||
|
01-18 01:37:28.508 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:28.508 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:28.697 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.697 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.967 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:28.967 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:29.382 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:29.383 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:29.793 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03
|
||||||
|
01-18 01:37:29.793 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03
|
||||||
|
01-18 01:37:30.070 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:30.070 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:30.514 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:30.514 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:30.527 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -96 | 12 02 00 03
|
||||||
|
01-18 01:37:30.527 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -96 | 12 02 00 03
|
||||||
|
01-18 01:37:30.621 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:30.621 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:30.899 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:30.899 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:31.162 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:31.162 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:31.389 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:31.390 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:31.442 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:31.442 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:31.787 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03
|
||||||
|
01-18 01:37:31.787 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03
|
||||||
|
01-18 01:37:31.991 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:31.991 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:32.269 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:32.269 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:33.392 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:33.393 13709 13777 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:33.642 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:33.642 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:33.791 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03
|
||||||
|
01-18 01:37:33.791 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03
|
||||||
|
01-18 01:37:33.915 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:33.916 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:34.189 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:34.189 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:34.470 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:34.470 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:34.525 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:34.525 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02
|
||||||
|
01-18 01:37:34.539 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -90 | 12 02 00 03
|
||||||
|
01-18 01:37:34.539 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -90 | 12 02 00 03
|
||||||
|
01-18 01:37:34.752 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:34.753 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:35.296 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:35.296 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
|
||||||
|
01-18 01:37:35.400 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:35.400 13709 13777 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03
|
||||||
|
01-18 01:37:35.800 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -63 | 12 02 00 03
|
||||||
|
01-18 01:37:35.801 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -63 | 12 02 00 03
|
||||||
33
root-module-manual/META-INF/com/google/android/update-binary
Normal file
33
root-module-manual/META-INF/com/google/android/update-binary
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/sbin/sh
|
||||||
|
|
||||||
|
#################
|
||||||
|
# Initialization
|
||||||
|
#################
|
||||||
|
|
||||||
|
umask 022
|
||||||
|
|
||||||
|
# echo before loading util_functions
|
||||||
|
ui_print() { echo "$1"; }
|
||||||
|
|
||||||
|
require_new_magisk() {
|
||||||
|
ui_print "*******************************"
|
||||||
|
ui_print " Please install Magisk v20.4+! "
|
||||||
|
ui_print "*******************************"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#########################
|
||||||
|
# Load util_functions.sh
|
||||||
|
#########################
|
||||||
|
|
||||||
|
OUTFD=$2
|
||||||
|
ZIPFILE=$3
|
||||||
|
|
||||||
|
mount /data 2>/dev/null
|
||||||
|
|
||||||
|
[ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk
|
||||||
|
. /data/adb/magisk/util_functions.sh
|
||||||
|
[ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk
|
||||||
|
|
||||||
|
install_module
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
#MAGISK
|
||||||
BIN
root-module-manual/btl2capfix.zip
Normal file
BIN
root-module-manual/btl2capfix.zip
Normal file
Binary file not shown.
6
root-module-manual/module.prop
Normal file
6
root-module-manual/module.prop
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
id=btl2capfix
|
||||||
|
name=Bluetooth L2CAP workaround for AirPods
|
||||||
|
version=v1
|
||||||
|
versionCode=1
|
||||||
|
author=kavishdevar
|
||||||
|
description=Fixes the Bluetooth L2CAP connection issue with AirPods
|
||||||
15
wak.toml
Normal file
15
wak.toml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# https://github.com/iamawatermelo/wakapi-anyide v0.6.8
|
||||||
|
|
||||||
|
[meta]
|
||||||
|
version = 1
|
||||||
|
watchers = ['files']
|
||||||
|
|
||||||
|
[files]
|
||||||
|
include = ["*"] # files to include in tracking
|
||||||
|
exclude = [] # files to exclude in tracking
|
||||||
|
exclude_files = [".gitignore"] # files whose contents will be used to exclude other files from tracking
|
||||||
|
exclude_binary_files = true # whether to ignore binary files
|
||||||
|
# language_mapping = {".kicad_sch" = "Kicad Schematic"} # custom language mapping
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "AirPodsLikeNormal" # your project name
|
||||||
Reference in New Issue
Block a user