diff --git a/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java b/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java index bffa567cd..3664dc1cd 100644 --- a/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java +++ b/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java @@ -1,20 +1,32 @@ package com.yunbao.common.manager; +import static cn.rongcloud.rtc.base.RTCErrorCode.JOIN_CHAT_ROOM_TIMEOUT; + import com.yunbao.common.utils.ToastUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import cn.rongcloud.rtc.api.RCRTCRemoteUser; import cn.rongcloud.rtc.api.RCRTCRoom; import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; +import cn.rongcloud.rtc.api.callback.IRCRTCRoomEventsListener; +import cn.rongcloud.rtc.api.stream.RCRTCInputStream; import cn.rongcloud.rtc.base.RTCErrorCode; /** - * RTC管理类,负责管理申请、同意、拒绝PK + * RTC管理类,负责管理申请、同意、拒绝PK */ public class IMRTCManager { private static IMRTCManager manager; private RCRTCRoom rtcRoom; + private List requestUid; private IMRTCManager() { - + requestUid = new ArrayList<>(); } public static IMRTCManager getInstance() { @@ -30,9 +42,10 @@ public class IMRTCManager { /** * 响应PK请求 - * @param liveUid 对方房间号 - * @param agree 是否同意 - * @param extra 扩展参数 + * + * @param liveUid 对方房间号 + * @param agree 是否同意 + * @param extra 扩展参数 * @param callback 回调 */ public void responseJoinOtherRoom(String liveUid, boolean agree, String extra, IRCRTCResultCallback callback) { @@ -56,13 +69,18 @@ public class IMRTCManager { /** * 申请PK - * @param liveUid 对方房间号 + * + * @param liveUid 对方房间号 * @param inviterAutoMix 是否将邀请者音视频资源发送到被邀请人房间中合流 - * @param extra 扩展参数 - * @param callback 回调 + * @param extra 扩展参数 + * @param callback 回调 */ - public void requestJoinOtherRoom(String liveUid,boolean inviterAutoMix,String extra,IRCRTCResultCallback callback){ - if(rtcRoom!=null){ + public void requestJoinOtherRoom(String liveUid, boolean inviterAutoMix, String extra, IRCRTCResultCallback callback) { + if (requestUid.contains(liveUid)) { + callback.onFailed(RTCErrorCode.RongRTCCodeJoinRepeatedRoom); + return; + } + if (rtcRoom != null) { /* inviteeRoomId - 被邀请者所在房间 id inviteeUserId - 被邀请用户 id @@ -74,6 +92,86 @@ public class IMRTCManager { extra - 扩展字段,默认为空 */ rtcRoom.getLocalUser().requestJoinOtherRoom(liveUid, liveUid, inviterAutoMix, extra, new IRCRTCResultCallback() { + @Override + public void onSuccess() { + callback.onSuccess(); + ToastUtil.show("发起邀请成功"); + requestUid.add(liveUid); + startRequestTimeoutTask(liveUid); + } + + @Override + public void onFailed(RTCErrorCode errorCode) { + ToastUtil.show("邀请失败 " + errorCode.getValue()); + callback.onFailed(errorCode); + } + }); + } else { + callback.onFailed(RTCErrorCode.RongRTCCodeIMError); + } + } + + public void registerRoomListener(IRCRTCRoomEventsListener listener) { + if (rtcRoom != null) { + rtcRoom.registerRoomListener(new IRCRTCRoomEventsListener() { + @Override + public void onRemoteUserPublishResource(RCRTCRemoteUser remoteUser, List streams) { + listener.onRemoteUserPublishResource(remoteUser, streams); + } + + @Override + public void onRemoteUserMuteAudio(RCRTCRemoteUser remoteUser, RCRTCInputStream stream, boolean mute) { + listener.onRemoteUserMuteAudio(remoteUser, stream, mute); + } + + @Override + public void onRemoteUserMuteVideo(RCRTCRemoteUser remoteUser, RCRTCInputStream stream, boolean mute) { + listener.onRemoteUserMuteVideo(remoteUser, stream, mute); + } + + @Override + public void onRemoteUserUnpublishResource(RCRTCRemoteUser remoteUser, List streams) { + listener.onRemoteUserUnpublishResource(remoteUser, streams); + } + + @Override + public void onUserJoined(RCRTCRemoteUser remoteUser) { + listener.onUserJoined(remoteUser); + } + + @Override + public void onUserLeft(RCRTCRemoteUser remoteUser) { + listener.onUserLeft(remoteUser); + } + + @Override + public void onUserOffline(RCRTCRemoteUser remoteUser) { + listener.onUserOffline(remoteUser); + } + + @Override + public void onPublishLiveStreams(List streams) { + listener.onPublishLiveStreams(streams); + } + + @Override + public void onUnpublishLiveStreams(List streams) { + listener.onUnpublishLiveStreams(streams); + } + }); + } + } + + /** + * 取消邀请 + * + * @param liveUid 房间号 + * @param extra 扩展参数 + * @param callback 回调 + */ + public void cancelRequestJoinOtherRoom(String liveUid, String extra, IRCRTCResultCallback callback) { + if (rtcRoom != null) { + rtcRoom.getLocalUser().cancelRequestJoinOtherRoom(liveUid, liveUid, extra, new IRCRTCResultCallback() { @Override public void onSuccess() { callback.onSuccess(); @@ -84,8 +182,40 @@ public class IMRTCManager { callback.onFailed(errorCode); } }); - }else{ + } else { callback.onFailed(RTCErrorCode.RongRTCCodeIMError); } } + + public void callPkSuccess(String liveUid) { + requestUid.remove(liveUid); + } + + private void startRequestTimeoutTask(String liveUid) { + new Timer().schedule(new TimerTask() { + int waitTime = 15; + + @Override + public void run() { + if (!requestUid.contains(liveUid)) { + cancel(); + } + if (waitTime-- == 0) { + //callback.onFailed(JOIN_CHAT_ROOM_TIMEOUT); + cancelRequestJoinOtherRoom(liveUid, "extra", new IRCRTCResultCallback() { + @Override + public void onSuccess() { + requestUid.remove(liveUid); + } + + @Override + public void onFailed(RTCErrorCode errorCode) { + + } + }); + cancel(); + } + } + }, 1000, 1000); + } }