addAgoraEventHandlers method

void addAgoraEventHandlers()

Implementation

void addAgoraEventHandlers() {
  RtcEngineEventHandler handler = RtcEngineEventHandler();
  handler.tokenPrivilegeWillExpire = (String token) async {
    printLog('tokenPrivilegeWillExpire: $token');
    String? rtcToken = await widget.delegate?.getRtcToken(channelId!);
    if (rtcToken?.isEmpty == false) {
      rtcEngine?.renewToken(rtcToken!);
    }
  };
  handler.lastmileQuality = (NetworkQuality quality) {
    printLog('lastmileQuality: ${quality.index}');
    rtcEngine?.disableLastmileTest();
    if (quality == NetworkQuality.Down) {
      widget.delegate?.onShowToast(6);
    }
    if (call && callStatus != 0) {
      callStatus = 0;
      willSendVideo(0);
    } else {
      callStatus = -1;
    }
  };
  handler.joinChannelSuccess = (String channel, int uid, int elapsed) {
    printLog('onJoinChannelSuccess: $channel, uid: $uid, elapsed: $elapsed');
  };
  handler.userJoined = (int uid, int elapsed) {
    printLog('onUserJoined: uid: $uid, elapsed: $elapsed');
    userJoinedRate = DateTime.now().millisecondsSinceEpoch;
  };
  handler.localVideoStateChanged =
      (LocalVideoStreamState state, LocalVideoStreamError error) async {
    printLog('onLocalVideoStateChanged: $state $error');
    if (state == LocalVideoStreamState.Encoding) {
      localVideoStatus = true;
    } else {
      widget.delegate?.onShowLocalVideo(true);
    }
  };
  handler.firstRemoteVideoFrame =
      (int uid, int width, int height, int elapsed) {
    printLog('firstRemoteVideoFrame: $uid $elapsed');
    if (callStatus == 0) {
      callStatus = 1;
      widget.delegate?.onCallStatus(callStatus);
      if (type == 1) {
        matchSuccess();
      } else {
        callStart();
      }
    }
  };
  handler.remoteVideoStateChanged = (int uid, VideoRemoteState state,
      VideoRemoteStateReason reason, int elapsed) {
    printLog('onRemoteVideoStateChanged: $uid $state $reason $elapsed');
    if (state == VideoRemoteState.Decoding) {
      remoteVideoStatus = true;
      if (userUid == null) {
        userUid = uid;
        if (!mounted) {
          return;
        }
        setState(() {});
      }
    } else {
      widget.delegate?.onShowLocalVideo(false);
    }
  };
  handler.networkTypeChanged = (NetworkType type) {
    printLog('networkTypeChanged: $type');
  };
  handler.networkQuality =
      (int uid, NetworkQuality txQuality, NetworkQuality rxQuality) {
    printLog('onNetworkQuality: $uid $txQuality $rxQuality');
    if (callStatus != 1 || currentRate < 30) return;
    //下行网络
    if (rxQuality == NetworkQuality.Excellent ||
        rxQuality == NetworkQuality.Good ||
        rxQuality == NetworkQuality.Poor) {
      quality++;
      if (quality >= 3) {
        quality = 0;
        widget.delegate?.onShowNetText(null);
      }
    } else if (rxQuality == NetworkQuality.Unknown ||
        rxQuality == NetworkQuality.Bad ||
        rxQuality == NetworkQuality.VBad) {
      quality = 0;
      widget.delegate?.onShowNetText(uid == 0);
    }
  };
  handler.userOffline = (int uid, UserOfflineReason reason) {
    printLog('onUserOffline: $uid, reason: $reason');
    if (currentRate ~/ 60 > 0 &&
        isSoonMoney &&
        (currentRate % 60 >= 55 || currentRate % 60 < 5)) {
      return;
    }
    if (offline) {
      return;
    }
    offline = true;
    widget.delegate
        ?.onRemoteUserLeft(reason == UserOfflineReason.Dropped ? 3 : 1);
  };
  handler.leaveChannel = (RtcStats stats) {
    printLog('onLeaveChannel');
    if (callStatus != 1) {
      return;
    }
    if (!offline) {
      widget.delegate?.onRemoteUserLeft(0);
    }
  };
  handler.error = (ErrorCode err) {
    printLog('onError: $err, index: ${err.index}');
    if (!err.toString().contains('ErrorCode.Adm')) {
      if (callStatus == 0) {
        if (err == ErrorCode.ClientIsBannedByServer) {
          widget.delegate?.onShowToast(1);
        } else {
          widget.delegate?.onShowToast(2);
        }
        willSendVideo(1);
        widget.delegate?.onNormalPop();
      } else if (callStatus == 1) {
        widget.delegate?.onRemoteUserLeft(4);
      } else {
        widget.delegate?.onNormalPop(hangup: false);
      }
    }
  };
  handler.rtcStats = (RtcStats stats) {
    if (!mounted) {
      return;
    }
    // printLog('onRtcStats:${stats.totalDuration}');
    if (showTime && callStatus == 1) {
      currentCall();
      Future.delayed(const Duration(seconds: 1), () {
        if (!mounted) {
          return;
        }
        currentCall();
      });
    }
  };
  rtcEngine?.setEventHandler(handler);
}