terminate method
Implementation
Future<void> terminate(
CallParty party,
CallErrorCode reason,
bool shouldEmit,
) async {
if (state == CallState.kConnected) {
await hangup(
reason: CallErrorCode.userHangup,
shouldEmit: true,
);
return;
}
Logs().d('[VOIP] terminating call');
_inviteTimer?.cancel();
_inviteTimer = null;
_ringingTimer?.cancel();
_ringingTimer = null;
try {
await voip.delegate.stopRingtone();
} catch (e) {
// maybe rigntone never started (group calls) or has been stopped already
Logs().d('stopping ringtone failed ', e);
}
hangupReason = reason;
// don't see any reason to wrap this with shouldEmit atm,
// looks like a local state change only
setCallState(CallState.kEnded);
if (!isGroupCall) {
// when a call crash and this call is already terminated the currentCId is null.
// So don't return bc the hangup or reject will not proceed anymore.
if (voip.currentCID != null &&
voip.currentCID != VoipId(roomId: room.id, callId: callId)) return;
voip.currentCID = null;
voip.incomingCallRoomId.removeWhere((key, value) => value == callId);
}
voip.calls.removeWhere((key, value) => key.callId == callId);
await cleanUp();
if (shouldEmit) {
onCallHangupNotifierForGroupCalls.add(this);
await voip.delegate.handleCallEnded(this);
fireCallEvent(CallStateChange.kHangup);
if ((party == CallParty.kRemote &&
_missedCall &&
reason != CallErrorCode.answeredElsewhere)) {
await voip.delegate.handleMissedCall(this);
}
}
}