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

Loading…
Cancel
Save