terminate method

Future<void> terminate(
  1. CallParty party,
  2. CallErrorCode reason,
  3. bool shouldEmit
)

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);
    }
  }
}