From e9b29a2a43ac45051a580814c4f5a967699c6f3c Mon Sep 17 00:00:00 2001 From: darken Date: Fri, 6 Jun 2025 02:53:15 +0200 Subject: [PATCH] Prioritize private payload for battery info in single headset devices This commit modifies `SingleApplePods`, `AirPodsMaxUsbc`, and `AirPodsMax` to prioritize battery information from the decrypted private payload when available. Specifically: - `SingleApplePods.batteryHeadsetPercent`: Now checks `payload.private?.asBatteryState(1)?.level` first. If the private payload is not available or doesn't contain battery information at position 1, it falls back to the existing logic using `pubPodsBattery`. - `AirPodsMaxUsbc.isHeadsetBeingCharged` and `AirPodsMax.isHeadsetBeingCharged`: Now check `payload.private?.asBatteryState(1)?.isCharging` first. If the private payload is not available or doesn't contain charging status at position 1, they fall back to the existing logic using `pubFlags.isBitSet(0)`. This change allows for more accurate battery level and charging status reporting when the private payload can be decrypted. --- .../capod/pods/core/apple/SingleApplePods.kt | 19 ++++++++++++------- .../pods/core/apple/airpods/AirPodsMax.kt | 7 ++++++- .../pods/core/apple/airpods/AirPodsMaxUsbc.kt | 7 ++++++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app-common/src/main/java/eu/darken/capod/pods/core/apple/SingleApplePods.kt b/app-common/src/main/java/eu/darken/capod/pods/core/apple/SingleApplePods.kt index 6d01d43f..d1f08dcb 100644 --- a/app-common/src/main/java/eu/darken/capod/pods/core/apple/SingleApplePods.kt +++ b/app-common/src/main/java/eu/darken/capod/pods/core/apple/SingleApplePods.kt @@ -10,13 +10,18 @@ import eu.darken.capod.pods.core.SinglePodDevice interface SingleApplePods : ApplePods, SinglePodDevice, HasAppleColor { override val batteryHeadsetPercent: Float? - get() = when (val value = pubPodsBattery.lowerNibble.toInt()) { - 15 -> null - else -> if (value > 10) { - log { "Headset above 100% battery: $value" } - 1.0f - } else { - (value / 10f) + get() { + payload.private?.asBatteryState(1)?.let { + return it.level + } + return when (val value = pubPodsBattery.lowerNibble.toInt()) { + 15 -> null + else -> if (value > 10) { + log { "Headset above 100% battery: $value" } + 1.0f + } else { + (value / 10f) + } } } } \ No newline at end of file diff --git a/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt b/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt index 122360d3..e37a18ca 100644 --- a/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt +++ b/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt @@ -35,7 +35,12 @@ data class AirPodsMax( get() = rssiAverage ?: super.rssi override val isHeadsetBeingCharged: Boolean - get() = pubFlags.isBitSet(0) + get() { + payload.private?.asBatteryState(1)?.let { + return it.isCharging + } + return pubFlags.isBitSet(0) + } override val isBeingWorn: Boolean get() = pubStatus.isBitSet(5) diff --git a/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt b/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt index e6ef5cbf..213e4573 100644 --- a/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt +++ b/app-common/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt @@ -35,7 +35,12 @@ data class AirPodsMaxUsbc( get() = rssiAverage ?: super.rssi override val isHeadsetBeingCharged: Boolean - get() = pubFlags.isBitSet(0) + get() { + payload.private?.asBatteryState(1)?.let { + return it.isCharging + } + return pubFlags.isBitSet(0) + } override val isBeingWorn: Boolean get() = pubStatus.isBitSet(5)