diff --git a/apps/chanora_flutter/lib/services/audio_lifecycle_service.dart b/apps/chanora_flutter/lib/services/audio_lifecycle_service.dart index 7e28f7e..f141d73 100644 --- a/apps/chanora_flutter/lib/services/audio_lifecycle_service.dart +++ b/apps/chanora_flutter/lib/services/audio_lifecycle_service.dart @@ -14,11 +14,15 @@ rust.BridgeAudioRoute parseBridgeAudioRoute(String value) { case 'Speaker': return rust.BridgeAudioRoute.speaker; case 'WiredHeadset': + case 'UsbHeadset': return rust.BridgeAudioRoute.wiredHeadset; case 'BluetoothHfp': return rust.BridgeAudioRoute.bluetoothHfp; case 'BluetoothA2dp': return rust.BridgeAudioRoute.bluetoothA2Dp; + case 'Hdmi': + case 'Unknown': + return rust.BridgeAudioRoute.unknown; default: return rust.BridgeAudioRoute.unknown; } diff --git a/apps/chanora_flutter/test/services/audio_lifecycle_service_test.dart b/apps/chanora_flutter/test/services/audio_lifecycle_service_test.dart index d53b4f6..b34f735 100644 --- a/apps/chanora_flutter/test/services/audio_lifecycle_service_test.dart +++ b/apps/chanora_flutter/test/services/audio_lifecycle_service_test.dart @@ -4,7 +4,7 @@ import 'package:chanora_flutter/services/audio_lifecycle_service.dart'; import 'package:chanora_flutter/src/rust/api.dart' as rust; void main() { - test('parseBridgeAudioRoute maps platform route names', () { + test('parseBridgeAudioRoute maps iOS-classified route strings', () { expect(parseBridgeAudioRoute('Earpiece'), rust.BridgeAudioRoute.earpiece); expect(parseBridgeAudioRoute('Speaker'), rust.BridgeAudioRoute.speaker); expect( @@ -22,4 +22,22 @@ void main() { expect(parseBridgeAudioRoute('Unknown'), rust.BridgeAudioRoute.unknown); expect(parseBridgeAudioRoute('Other'), rust.BridgeAudioRoute.unknown); }); + + test('parseBridgeAudioRoute maps Android UsbHeadset to wiredHeadset', () { + // AndroidAudioLifecycleController.classifyDevice emits 'UsbHeadset' for + // AudioDeviceInfo.TYPE_USB_HEADSET. USB audio is functionally a + // wired-class device — the Kotlin classifier's own preference ordering + // (line 176 of AndroidAudioLifecycleController.kt) groups it with + // WiredHeadset/BluetoothHfp/BluetoothA2dp. + expect(parseBridgeAudioRoute('UsbHeadset'), + rust.BridgeAudioRoute.wiredHeadset); + }); + + test('parseBridgeAudioRoute maps Android Hdmi to unknown', () { + // HDMI is a display-out transport, not a voice-call audio path; no + // existing BridgeAudioRoute variant fits. Treat as unknown rather + // than misclassify as Speaker. + expect(parseBridgeAudioRoute('Hdmi'), rust.BridgeAudioRoute.unknown); + }); } +