feat(device-settings): Enable speculative feature flags for older models

Based on Apple's official documentation, enable features for models

that support them per iOS but were previously excluded in CAPod:

- Gen 1/2: microphone mode (auto/left/right)

- Gen 3: press speed, press hold duration, tone volume, microphone mode

- Gen 4 non-ANC: press speed, press hold duration, tone volume

- Max original/USB-C: listening mode cycle, allow off option
This commit is contained in:
darken
2026-04-16 10:32:21 +02:00
committed by Matthias Urhahn
parent 90af17bf7d
commit c5d9bed5f0
2 changed files with 22 additions and 4 deletions
@@ -22,6 +22,7 @@ enum class PodModel(
Features(
hasDualPods = true,
hasCase = true,
hasMicrophoneMode = true,
),
modelNumbers = setOf("A1523", "A1722"), // L/R earphones
leftPodIconRes = R.drawable.device_airpods_gen1_left,
@@ -36,6 +37,7 @@ enum class PodModel(
Features(
hasDualPods = true,
hasCase = true,
hasMicrophoneMode = true,
),
modelNumbers = setOf("A2031", "A2032"), // L/R earphones
leftPodIconRes = R.drawable.device_airpods_gen1_left,
@@ -50,6 +52,10 @@ enum class PodModel(
Features(
hasDualPods = true,
hasCase = true,
hasPressSpeed = true,
hasPressHoldDuration = true,
hasToneVolume = true,
hasMicrophoneMode = true,
),
modelNumbers = setOf("A2564", "A2565"), // L/R earphones
leftPodIconRes = R.drawable.device_airpods_gen3_left,
@@ -65,6 +71,9 @@ enum class PodModel(
hasDualPods = true,
hasCase = true,
hasEarDetection = true,
hasPressSpeed = true,
hasPressHoldDuration = true,
hasToneVolume = true,
hasMicrophoneMode = true,
hasEarDetectionToggle = true,
hasSleepDetection = true,
@@ -241,6 +250,8 @@ enum class PodModel(
hasPressHoldDuration = true,
hasToneVolume = true,
hasEarDetectionToggle = true,
hasListeningModeCycle = true,
hasAllowOffOption = true,
),
modelNumbers = setOf("A2096"), // headphones
),
@@ -256,6 +267,8 @@ enum class PodModel(
hasPressHoldDuration = true,
hasToneVolume = true,
hasEarDetectionToggle = true,
hasListeningModeCycle = true,
hasAllowOffOption = true,
),
modelNumbers = setOf("A3184"), // headphones
),
@@ -316,25 +316,30 @@ class DefaultAapDeviceProfileNewSettingsTest : BaseAapSessionTest() {
f.hasSleepDetection shouldBe false
}
@Test fun `Gen 4 has mic, ear detection, sleep but no stem config`() {
@Test fun `Gen 4 has mic, ear detection, sleep, press and tone but no stem config`() {
val f = PodModel.AIRPODS_GEN4.features
f.hasMicrophoneMode shouldBe true
f.hasEarDetectionToggle shouldBe true
f.hasPressSpeed shouldBe true
f.hasPressHoldDuration shouldBe true
f.hasToneVolume shouldBe true
f.hasListeningModeCycle shouldBe false
f.hasStemConfig shouldBe false
f.hasSleepDetection shouldBe true
}
@Test fun `Max has ear detection toggle only`() {
@Test fun `Max has ear detection toggle and listening mode cycle`() {
val f = PodModel.AIRPODS_MAX.features
f.hasMicrophoneMode shouldBe false
f.hasEarDetectionToggle shouldBe true
f.hasListeningModeCycle shouldBe true
f.hasAllowOffOption shouldBe true
f.hasStemConfig shouldBe false
}
@Test fun `Gen 1 has no new flags`() {
@Test fun `Gen 1 has mic mode only`() {
val f = PodModel.AIRPODS_GEN1.features
f.hasMicrophoneMode shouldBe false
f.hasMicrophoneMode shouldBe true
f.hasEarDetectionToggle shouldBe false
f.hasListeningModeCycle shouldBe false
f.hasStemConfig shouldBe false