From 46a2d06be3c415304cd575179b74b52bb828562a Mon Sep 17 00:00:00 2001 From: hailin Date: Sat, 28 Feb 2026 11:11:29 -0800 Subject: [PATCH] fix: implement speaker/earpiece toggle on voice call page Use Hardware.instance.setSpeakerphoneOn() to switch between speaker and earpiece modes. Default to speaker on. Co-Authored-By: Claude Opus 4.6 --- .../presentation/pages/agent_call_page.dart | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/it0_app/lib/features/agent_call/presentation/pages/agent_call_page.dart b/it0_app/lib/features/agent_call/presentation/pages/agent_call_page.dart index d9b637b..f242ffe 100644 --- a/it0_app/lib/features/agent_call/presentation/pages/agent_call_page.dart +++ b/it0_app/lib/features/agent_call/presentation/pages/agent_call_page.dart @@ -37,8 +37,9 @@ class _AgentCallPageState extends ConsumerState final List _waveHeights = List.generate(20, (_) => 0.3); Timer? _waveTimer; - // Mute state + // Mute & speaker state bool _isMuted = false; + bool _isSpeaker = true; // Prevent double-actions bool _userEndedCall = false; @@ -193,6 +194,13 @@ class _AgentCallPageState extends ConsumerState setState(() {}); } + /// Toggle speaker / earpiece. + void _toggleSpeaker() { + _isSpeaker = !_isSpeaker; + Hardware.instance.setSpeakerphoneOn(_isSpeaker); + setState(() {}); + } + // --------------------------------------------------------------------------- // Build // --------------------------------------------------------------------------- @@ -429,12 +437,10 @@ class _AgentCallPageState extends ConsumerState ), const SizedBox(width: 24), _CircleButton( - icon: Icons.volume_up, - label: '扬声器', - isActive: false, - onTap: () { - // WebRTC handles audio routing automatically - }, + icon: _isSpeaker ? Icons.volume_up : Icons.hearing, + label: _isSpeaker ? '扬声器' : '听筒', + isActive: _isSpeaker, + onTap: _toggleSpeaker, ), ], );