From e3286f11975a505daedaa2649ca5b0bbc1c69c5f Mon Sep 17 00:00:00 2001 From: Edison Jwa Date: Sun, 7 Jun 2026 19:15:20 +0900 Subject: [PATCH] fix(audio,flutter): parse Android UsbHeadset and Hdmi route strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit apps/chanora_flutter/lib/services/audio_lifecycle_service.dart: extend parseBridgeAudioRoute to handle 'UsbHeadset' (maps to wiredHeadset — USB audio is functionally a wired-class device, matching AndroidAudioLifecycleController.classifyCurrentRoute's own preference ordering at line 176) and 'Hdmi' (maps to unknown — HDMI is a display-out transport, not a voice-call audio path; no existing BridgeAudioRoute variant fits; safer to leave as unknown than to misclassify as Speaker). Previously these Android-emitted strings hit the default branch and silently became BridgeAudioRoute.unknown. apps/chanora_flutter/test/services/audio_lifecycle_service_test.dart: split the existing single test into three — iOS-classified strings (preserved), Android UsbHeadset (new), Android Hdmi (new). flutter test: 3 passed, 0 failed. --- .../lib/services/audio_lifecycle_service.dart | 4 ++++ .../audio_lifecycle_service_test.dart | 20 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) 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); + }); } +