signalingListener method

V2TimSignalingListener signalingListener()

Implementation

V2TimSignalingListener signalingListener() {
  TRTCCallingDelegate type;
  return V2TimSignalingListener(
    onInvitationCancelled: (inviteID, inviter, data) {
      if (!_isCallingData(data)) {
        return;
      }
      if (inviteID == mCurCallID) {
        _stopCall();
        emitEvent(TRTCCallingDelegate.onCallingCancel, {});
      }
    },
    onInvitationTimeout: (inviteID, inviteeList) {
      //邀请者
      String curGroupCallId = _getGroupCallId(mCurUserId);
      if (!_isEmpty(mCurCallID) && inviteID != mCurCallID) {
        return;
      } else if (_isEmpty(mCurCallID) && inviteID != curGroupCallId) {
        return;
      }
      isOnInvitation = false;
      if (mCurSponsorForMe.isEmpty) {
        for (var i = 0; i < inviteeList.length; i++) {
          emitEvent(TRTCCallingDelegate.onNoResp, inviteeList[i]);
          mCurInvitedList.remove(inviteeList[i]);
        }
      } else {

        //被邀请者
        if (inviteeList.contains(mCurUserId)) {
          _stopCall();
          emitEvent(TRTCCallingDelegate.onCallingTimeout, []);
        } else {
          emitEvent(TRTCCallingDelegate.onCallingTimeout, inviteeList);
        }
        // ignore: list_remove_unrelated_type
        mCurInvitedList.remove(inviteeList);
      }
      // 每次超时都需要判断当前是否需要结束通话
      _preExitRoom(null);
    },
    onInviteeAccepted: (inviteID, invitee, data) {
      if (!_isCallingData(data)) {
        return;
      }
      mCurInvitedList.remove(invitee);
      emitEvent(TRTCCallingDelegate.onAccept,invitee);
    },
    onInviteeRejected: (inviteID, invitee, data) {
      if (!_isCallingData(data)) {
        return;
      }
      String curGroupCallId = _getGroupCallId(invitee);
      if (mCurCallID == inviteID || curGroupCallId == inviteID) {
        try {
          Map<String, dynamic>? customMap = _callingDataAdapt(data);
          mCurInvitedList.remove(invitee);
          if (customMap != null &&
              (customMap.containsKey('message') ||
                  customMap.containsKey("line_busy"))) {
            final message = customMap["line_busy"] ?? customMap["message"];
            if (message == "lineBusy") {
              emitEvent(TRTCCallingDelegate.onLineBusy, invitee);
            }
          } else {
            emitEvent(TRTCCallingDelegate.onReject, invitee);
          }
          _preExitRoom(null);
        } catch (e) {
          print(logTag +
              "=onInviteeRejected JsonSyntaxException:" +
              e.toString());
        }
      }
    },
    onReceiveNewInvitation:
        (inviteID, inviter, groupID, inviteeList, data) async {
      if (!_isCallingData(data)) {
        return;
      }
      try {
        Map<String, dynamic>? customMap = _callingDataAdapt(data);
        if (customMap == null) {
          print(logTag + "onReceiveNewInvitation extraMap is null, ignore");
          return;
        }
        if (customMap.containsKey('cmd') ||
            customMap.containsKey("call_type")) {
          if (customMap.containsKey('cmd')) {
            mCurCallType = customMap['cmd'];
          } else {
            mCurCallType = customMap["call_type"] == 1
                ? TRTCCalling.typeAudioCall
                : TRTCCalling.typeVideoCall;
          }
        }
        if (customMap.containsKey('call_end')) {
          _preExitRoom(null);
          return;
        }
        if (customMap.containsKey('room_id')) {
          mCurRoomID = customMap['room_id'];
        }
      } catch (e) {
        print(logTag +
            "=onReceiveNewInvitation JsonSyntaxException:" +
            e.toString());
      }
      if (isOnInvitation || (isOnCalling && inviteeList.contains(mCurUserId))) {
        // 正在通话时,收到了一个邀请我的通话请求,需要告诉对方忙线
        Map<String, dynamic> busyMap = getCustomMap();
        // message为native那边的额外业务字段
        busyMap["data"]['message'] = 'lineBusy';
        busyMap["line_busy"] = 'lineBusy';
        await timManager
            .getSignalingManager()
            .reject(inviteID: inviteID, data: jsonEncode(busyMap));
        return;
      }
      // 与对方处在同一个群中,此时收到了邀请群中其他人通话的请求,界面上展示连接动画
      if (!_isEmpty(groupID) && !_isEmpty(mCurGroupId)) {
        mCurInvitedList.addAll(inviteeList);
        TRTCCallingDelegate type =
            TRTCCallingDelegate.onGroupCallInviteeListUpdate;
        emitEvent(type, mCurInvitedList);
      }
      if (!inviteeList.contains(mCurUserId)) {
        return;
      }

      isOnInvitation = true;
      mCurSponsorForMe = inviter;
      mCurCallID = inviteID;
      mCurGroupId = groupID;
      type = TRTCCallingDelegate.onInvited;
      inviteeList.remove(mCurUserId);
      emitEvent(type, {
        'sponsor': inviter,
        'userIds': inviteeList,
        'isFromGroup': !_isEmpty(groupID),
        'type': mCurCallType,
        'groupID': groupID
      });
    },
  );
}