From 94e2d40554f23d34ef3754983b133516ef7c18ec Mon Sep 17 00:00:00 2001 From: Matthias Urhahn Date: Fri, 10 Mar 2023 11:30:40 +0100 Subject: [PATCH] Fix AirPods Max wear detection. (#108) Closes #106 --- .../pods/core/apple/airpods/AirPodsMax.kt | 10 ++++---- .../pods/core/apple/SingleApplePodsTest.kt | 2 +- .../pods/core/apple/airpods/AirPodsMaxTest.kt | 23 +++++++++++++++---- 3 files changed, 23 insertions(+), 12 deletions(-) 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 76fcfc83..54e7188a 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 @@ -3,6 +3,7 @@ package eu.darken.capod.pods.core.apple.airpods import eu.darken.capod.common.bluetooth.BleScanResult import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.common.isBitSet +import eu.darken.capod.pods.core.HasChargeDetection import eu.darken.capod.pods.core.HasEarDetection import eu.darken.capod.pods.core.PodDevice import eu.darken.capod.pods.core.apple.ApplePods @@ -22,21 +23,18 @@ data class AirPodsMax( override val proximityMessage: ProximityPairing.Message, override val reliability: Float = PodDevice.BASE_CONFIDENCE, private val rssiAverage: Int? = null, -) : SingleApplePods, HasEarDetection, HasAppleColor { +) : SingleApplePods, HasEarDetection, HasChargeDetection, HasAppleColor { override val model: PodDevice.Model = PodDevice.Model.AIRPODS_MAX override val rssi: Int get() = rssiAverage ?: super.rssi - val isHeadphonesBeingWorn: Boolean - get() = rawStatus.isBitSet(1) - - val isHeadsetBeingCharged: Boolean + override val isHeadsetBeingCharged: Boolean get() = rawFlags.isBitSet(0) override val isBeingWorn: Boolean - get() = isHeadphonesBeingWorn + get() = !rawStatus.isBitSet(5) class Factory @Inject constructor() : SingleApplePodsFactory(TAG) { diff --git a/app-common/src/test/java/eu/darken/capod/pods/core/apple/SingleApplePodsTest.kt b/app-common/src/test/java/eu/darken/capod/pods/core/apple/SingleApplePodsTest.kt index 25c24f38..9fc619f5 100644 --- a/app-common/src/test/java/eu/darken/capod/pods/core/apple/SingleApplePodsTest.kt +++ b/app-common/src/test/java/eu/darken/capod/pods/core/apple/SingleApplePodsTest.kt @@ -29,7 +29,7 @@ class SingleApplePodsTest : BaseAirPodsTest() { isHeadsetBeingCharged shouldBe false - isHeadphonesBeingWorn shouldBe true + isBeingWorn shouldBe true } } } \ No newline at end of file diff --git a/app-common/src/test/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxTest.kt b/app-common/src/test/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxTest.kt index dafa73d1..d864973f 100644 --- a/app-common/src/test/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxTest.kt +++ b/app-common/src/test/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxTest.kt @@ -1,5 +1,6 @@ package eu.darken.capod.pods.core.apple.airpods +import eu.darken.capod.common.isBitSet import eu.darken.capod.pods.core.PodDevice import eu.darken.capod.pods.core.apple.BaseAirPodsTest import eu.darken.capod.pods.core.apple.HasAppleColor @@ -27,8 +28,6 @@ class AirPodsMaxTest : BaseAirPodsTest() { isHeadsetBeingCharged shouldBe false - isHeadphonesBeingWorn shouldBe true - model shouldBe PodDevice.Model.AIRPODS_MAX } } @@ -50,8 +49,6 @@ class AirPodsMaxTest : BaseAirPodsTest() { batteryHeadsetPercent shouldBe 0.5f isHeadsetBeingCharged shouldBe false - - isHeadphonesBeingWorn shouldBe true } } @@ -72,9 +69,25 @@ class AirPodsMaxTest : BaseAirPodsTest() { isHeadsetBeingCharged shouldBe false - isHeadphonesBeingWorn shouldBe true + rawStatus.isBitSet(5) shouldBe true podStyle shouldBe HasAppleColor.DeviceColor.BLUE } } + + @Test + fun `wear status`() = runTest { + create("07 19 01 0A 20 03 07 80 03 03 65 1F 28 32 D0 D9 71 43 00 9A 40 E7 6B EA 6C 2C FB") { + rawStatus shouldBe 0x03.toUByte() + + rawStatus.isBitSet(5) shouldBe false + isBeingWorn shouldBe true + } + create("07 19 01 0A 20 23 07 80 03 03 65 1F 28 32 D0 D9 71 43 00 9A 40 E7 6B EA 6C 2C FB") { + rawStatus shouldBe 0x23.toUByte() + + rawStatus.isBitSet(5) shouldBe true + isBeingWorn shouldBe false + } + } } \ No newline at end of file