Browse Source

feat(call): 添加通话超时计时器功能

- 实现30秒超时计时器,自动取消未接听的通话
- 在发起通话时启动超时计时器
- 在对方接听、拒绝或挂断时停止超时计时器
- 添加_startCallTimeoutTimer和_stopCallTimeoutTimer方法
- 在通话结束和控制器关闭时清理超时计时器
- 优化通话流程中的计时器管理逻辑
master
Jolie 3 months ago
parent
commit
520f9ab8f1
1 changed files with 41 additions and 1 deletions
  1. 42
      lib/controller/message/call_controller.dart

42
lib/controller/message/call_controller.dart

@ -84,6 +84,9 @@ class CallController extends GetxController {
int _callDurationSeconds = 0;
final RxInt callDurationSeconds = RxInt(0);
// 30
Timer? _callTimeoutTimer;
// UID
final Rxn<int> remoteUid = Rxn<int>();
@ -155,6 +158,8 @@ class CallController extends GetxController {
'📞 [CallController] 收到 accept 消息,设置 remoteUid: ${remoteUid.value}',
);
}
//
_stopCallTimeoutTimer();
// accept
_startCallTimer();
print('📞 [CallController] 收到 accept 消息,已启动通话计时器');
@ -170,6 +175,8 @@ class CallController extends GetxController {
} else if (event == 'reject') {
// reject 退
print('📞 [CallController] 收到 reject 消息,执行退出逻辑');
//
_stopCallTimeoutTimer();
final channelId = messageData['channelId'] as String?;
if (channelId != null && channelId.isNotEmpty) {
RTMManager.instance.unsubscribe(channelId);
@ -323,6 +330,9 @@ class CallController extends GetxController {
await RTMManager.instance.subscribe(channelData.channelId);
print('✅ [CallController] 已订阅 RTM 频道: ${channelData.channelId}');
// 3030
_startCallTimeoutTimer();
return true;
}
@ -472,8 +482,9 @@ class CallController extends GetxController {
//
stopCallAudio();
//
//
_stopCallTimer();
_stopCallTimeoutTimer();
// UID
currentCall.value = null;
@ -508,6 +519,28 @@ class CallController extends GetxController {
callDurationSeconds.value = 0;
}
/// 30
void _startCallTimeoutTimer() {
_callTimeoutTimer?.cancel();
_callTimeoutTimer = Timer(Duration(seconds: 30), () {
final callSession = currentCall.value;
// 0remoteUid为null
if (callSession != null &&
callSession.isInitiator &&
callDurationSeconds.value == 0 &&
remoteUid.value == null) {
print('⏰ [CallController] 30秒超时,对方未接听,自动取消通话');
hangUpCall();
}
});
}
///
void _stopCallTimeoutTimer() {
_callTimeoutTimer?.cancel();
_callTimeoutTimer = null;
}
///
Future<bool> _sendCallMessage({
required String targetUserId,
@ -685,6 +718,9 @@ class CallController extends GetxController {
Future<void> hangUpCall() async {
final callSession = currentCall.value;
//
_stopCallTimeoutTimer();
//
if (callSession != null &&
callSession.isInitiator &&
@ -744,6 +780,9 @@ class CallController extends GetxController {
SmartDialog.dismiss();
print('✅ [CallController] 已关闭视频通话邀请弹框');
//
_stopCallTimeoutTimer();
//
stopCallAudio();
@ -777,6 +816,7 @@ class CallController extends GetxController {
void onClose() {
stopCallAudio();
_stopCallTimer();
_stopCallTimeoutTimer();
currentCall.value = null;
rtcChannel.value = null;
remoteUid.value = null;

Loading…
Cancel
Save