diff --git a/common/src/main/java/com/yunbao/common/CommonAppContext.java b/common/src/main/java/com/yunbao/common/CommonAppContext.java index f511106fc..61be02d65 100644 --- a/common/src/main/java/com/yunbao/common/CommonAppContext.java +++ b/common/src/main/java/com/yunbao/common/CommonAppContext.java @@ -83,6 +83,9 @@ public class CommonAppContext extends MultiDexApplication { } + public static Activity getTopActivity() { + return activityWeakReference.get(); + } @Override protected void attachBaseContext(Context base) { @@ -100,7 +103,7 @@ public class CommonAppContext extends MultiDexApplication { @Override public void onActivityStarted(Activity activity) { mCount++; - activityWeakReference=new WeakReference<>(activity); + activityWeakReference = new WeakReference<>(activity); if (!mFront) { mFront = true; L.e("AppContext------->处于前台"); diff --git a/common/src/main/java/com/yunbao/common/Constants.java b/common/src/main/java/com/yunbao/common/Constants.java index 6e215977b..30b3562e6 100644 --- a/common/src/main/java/com/yunbao/common/Constants.java +++ b/common/src/main/java/com/yunbao/common/Constants.java @@ -146,6 +146,7 @@ public class Constants { public static final String SOCKET_ALL_SERVER_NOTIFY = "AllServerNotify";//全服通知 public static final String SOCKET_SEND_BARRAGE = "SendBarrage";//发弹幕 public static final String SOCKET_LIVE_DRPK = "LiveDRPK";//多人PK + public static final String SOCKET_LIVE_DRPK_RANDOM = "LiveRandomPK";//多人PK public static final String SOCKET_LEAVE_ROOM = "disconnect";//用户离开房间 public static final String SOCKET_LIVE_END = "StartEndLive";//主播关闭直播 public static final String SOCKET_SYSTEM = "SystemNot";//系统消息 diff --git a/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java b/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java new file mode 100644 index 000000000..c2369455f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java @@ -0,0 +1,23 @@ +package com.yunbao.common.bean; + + +public class HttpCallbackModel extends BaseModel{ + private int code; + private String msg; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/RandomPkUserBean.java b/common/src/main/java/com/yunbao/common/bean/RandomPkUserBean.java new file mode 100644 index 000000000..d50d8b0c6 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/RandomPkUserBean.java @@ -0,0 +1,89 @@ +package com.yunbao.common.bean; + +import com.google.gson.annotations.SerializedName; + +/** + * 随机PK UserBean + */ +public class RandomPkUserBean extends UserBean { + @SerializedName("is_pk") + private int pk; + @SerializedName("isattention") + private String attention; + @SerializedName("user_nicename") + private String userNiceName; + + public RandomPkUserBean() { + } + + public boolean isPk() { + return pk==1; + } + + public boolean isAttention() { + return attention.equals("1"); + } + + public String getAttention() { + return attention; + } + + public void setAttention(String attention) { + this.attention = attention; + } + + public int getPk() { + return pk; + } + + public void setPk(int pk) { + this.pk = pk; + } + + @Override + public String getUserNiceName() { + return userNiceName; + } + + @Override + public void setUserNiceName(String userNiceName) { + this.userNiceName = userNiceName; + } + + @Override + public String toString() { + return "RandomPkUserBean{" + + "pk=" + pk + + ", attention='" + attention + '\'' + + ", userNiceName='" + userNiceName + '\'' + + ", id='" + id + '\'' + + ", userNiceName='" + userNiceName + '\'' + + ", avatar='" + avatar + '\'' + + ", avatarThumb='" + avatarThumb + '\'' + + ", sex=" + sex + + ", signature='" + signature + '\'' + + ", coin='" + coin + '\'' + + ", gold='" + gold + '\'' + + ", votes='" + votes + '\'' + + ", consumption='" + consumption + '\'' + + ", votestotal='" + votestotal + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", location='" + location + '\'' + + ", birthday='" + birthday + '\'' + + ", level=" + level + + ", levelAnchor=" + levelAnchor + + ", lives=" + lives + + ", follows=" + follows + + ", fans=" + fans + + ", vip=" + vip + + ", liang=" + liang + + ", car=" + car + + ", medal_level=" + medal_level + + ", medal_name='" + medal_name + '\'' + + ", Dress=" + Dress + + ", noble_id='" + noble_id + '\'' + + ", yuanbao='" + yuanbao + '\'' + + '}'; + } +} diff --git a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java index 255462408..9a6ec7d76 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -9,6 +9,7 @@ import com.yunbao.common.bean.CustomSidebarInfoModel; import com.yunbao.common.bean.EnterRoomNewModel; import com.yunbao.common.bean.FaceBookUpModel; import com.yunbao.common.bean.HourRank; +import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LinkMicUserBeanV2; import com.yunbao.common.bean.LiveInfoModel; @@ -18,6 +19,7 @@ import com.yunbao.common.bean.NewPeopleInfo; import com.yunbao.common.bean.NobleRankHideUserListModel; import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; +import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.bean.SearchModel; import com.yunbao.common.bean.SetAttentsModel; import com.yunbao.common.bean.SlideInBannerModel; @@ -177,7 +179,7 @@ public interface PDLiveApi { * 获取多人连麦列表 */ @GET("/api/public/?service=live.getDrLm") - Observable>> getDrLm(@Query("uid")String uid); + Observable>> getDrLm(@Query("uid") String uid); /** * 获取日榜、周榜数据 @@ -286,8 +288,9 @@ public interface PDLiveApi { Observable> delDrLm(); /** - * 多人连麦-踢出用户 - * @param uid 对方uid + * 多人连麦-踢出用户 + * + * @param uid 对方uid * @param roomId 当前房间号 */ @GET("/api/public/?service=Live.killDrLm") @@ -338,4 +341,46 @@ public interface PDLiveApi { @Query("GroupId") String GroupId, @Query("stream") String stream ); + + /** + * 获取随机PK开关 + * + * @return 1=开,0=关 + */ + @GET("/api/public/?service=Livepk.getRandomPKType") + Observable>> getRandomPkSwitch(); + + /** + * 设置随机PK开关 + * @param pk 1=开,0=关 + */ + @GET("/api/public/?service=Livepk.setRandomPKType") + Observable>> changeRandomPkSwitch(@Query("random_pk") int pk); + /** + * 获取随机PK次数 + */ + @GET("/api/public/?service=Livepk.getRandomPKType") + Observable> getRandomPkNumber(); + /** + * 发起随机PK + */ + @GET("/api/public/?service=Livepk.setRandomPK") + Observable> randomPK(); + /** + * 随机PK后调用接口给后台记录 + */ + @GET("/api/public/?service=Livepk.startRandomPK") + Observable> startRandomPK(); + /** + * 自由PK开始后调用接口扣掉次数 + */ + @GET("/api/public/?service=Livepk.setActivePkNum") + Observable> setRandomPkNum(); + /** + * 随机PK搜索用户 + * @param cs 简体关键字/uid + * @param ct 繁体关键字/uid + */ + @GET("/api/public/?service=Livepk.searchUser") + Observable>> randomPkSearchUser(@Query("jian_key")String cs,@Query("fan_key")String ct); } diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java index e35962d1d..ec0257553 100644 --- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java +++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java @@ -11,6 +11,7 @@ import com.yunbao.common.bean.BaseModel; import com.yunbao.common.bean.CheckLiveModel; import com.yunbao.common.bean.CustomSidebarInfoModel; import com.yunbao.common.bean.EnterRoomNewModel; +import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.LinkMicUserBean; import com.yunbao.common.bean.LinkMicUserBeanV2; import com.yunbao.common.bean.LiveInfoModel; @@ -18,6 +19,7 @@ import com.yunbao.common.bean.LiveRoomActivityBanner; import com.yunbao.common.bean.NobleRankHideUserListModel; import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; +import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.bean.SetAttentsModel; import com.yunbao.common.bean.StarChallengeStatusModel; import com.yunbao.common.bean.VipModel; @@ -484,6 +486,9 @@ public class LiveNetManager { private Disposable randomPkApi; + /** + * PK排位赛接口 + */ public void getRandomPk(String mLiveUid, String pkUid, HttpCallback callback) { randomPkApi = API.get().pdLiveApi(mContext) .getPkRanksList(mLiveUid, pkUid) @@ -501,6 +506,192 @@ public class LiveNetManager { }); } + /** + * 获取随机PK开关 + * 1=开,0=关 + */ + public void getRandomPkSwitch(HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getRandomPkSwitch() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(listResponseModel -> { + if (callback != null) { + callback.onSuccess(listResponseModel.getData().getInfo().get(0)); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + + } + + /** + * 设置随机PK开关 + * + * @param pk 1=开,0=关 + * @param callback @{@link HttpCallbackModel#getCode()} 0=成功 + */ + public void changeRandomPkSwitch(int pk, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .changeRandomPkSwitch(pk) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Consumer>>() { + @Override + public void accept(ResponseModel> responseModel) throws Exception { + if (callback != null) { + HttpCallbackModel model = new HttpCallbackModel(); + model.setCode(responseModel.getData().getCode()); + model.setMsg(responseModel.getData().getMsg()); + callback.onSuccess(model); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + /** + * 获取随机PK次数 + */ + public void getRandomPkNumber(HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getRandomPkNumber() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel responseModel) throws Exception { + if (callback != null) { + callback.onSuccess(responseModel.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + /** + * 发起随机PK + */ + public void randomPK(HttpCallback callback) { + API.get().pdLiveApi(mContext) + .randomPK() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel responseModel) throws Exception { + if (callback != null) { + callback.onSuccess("36956"); + // callback.onSuccess(responseModel.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + /** + * 自由PK开始后调用接口扣掉次数 + */ + public void setRandomPkNum(HttpCallback callback) { + API.get().pdLiveApi(mContext) + .setRandomPkNum() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel responseModel) throws Exception { + + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + /** + * 随机PK后调用接口给后台记录 + */ + public void startRandomPK(HttpCallback callback) { + API.get().pdLiveApi(mContext) + .startRandomPK() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel responseModel) throws Exception { + if (responseModel.getData().getCode() == 0) { + if (callback != null) { + callback.onSuccess(true); + } + } else { + callback.onSuccess(false); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + /** + * 随机PK后调用接口给后台记录 + * @param cs 简体关键字/uid + * @param ct 繁体关键字/uid + */ + public void randomPkSearchUser(String cs, String ct, HttpCallback> callback) { + API.get().pdLiveApi(mContext) + .randomPkSearchUser(cs, ct) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Consumer>>() { + @Override + public void accept(ResponseModel> responseModel) throws Exception { + if (responseModel.getData().getCode() == 0) { + if (callback != null) { + callback.onSuccess(responseModel.getData().getInfo()); + } + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java b/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java new file mode 100644 index 000000000..42d76cbba --- /dev/null +++ b/common/src/main/java/com/yunbao/common/manager/IMRTCManager.java @@ -0,0 +1,79 @@ +package com.yunbao.common.manager; + +import cn.rongcloud.rtc.api.RCRTCRoom; +import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; +import cn.rongcloud.rtc.base.RTCErrorCode; + +/** + * RTC管理类,负责管理申请、同意、拒绝PK + */ +public class IMRTCManager { + private static IMRTCManager manager; + private RCRTCRoom rtcRoom; + + private IMRTCManager() { + + } + + public static IMRTCManager getInstance() { + if (manager == null) { + manager = new IMRTCManager(); + } + return manager; + } + + public void setRtcRoom(RCRTCRoom rtcRoom) { + this.rtcRoom = rtcRoom; + } + + /** + * 响应PK请求 + * @param liveUid 对方房间号 + * @param agree 是否同意 + * @param extra 扩展参数 + * @param callback 回调 + */ + public void responseJoinOtherRoom(String liveUid, boolean agree, String extra, IRCRTCResultCallback callback) { + if (rtcRoom != null) { + /* + inviterRoomId - 邀请者所在房间 id, + inviterUserId - 邀请者用户 id + agree - 被邀请者是否同意连麦邀请 + inviteeAutoMix - 是否将被邀请者音视频资源发送到邀请人房间中合流 + 1:inviteeAutoMix 为true时: + 1.1:如果邀请方在发送连麦请求之前发布了资源,当被邀请方加入邀请者房间成功后,服务器会把邀请方流资源合并到被邀请方视图(默认仅悬浮布局合流)上。 + 1.2:如果邀请方在发送连麦请求之前没有发布资源,将会在邀请方发布资源成功后,服务器才会把邀请方的资源合并到被邀请方视图(默认仅悬浮布局合流)上。 + 2: 无论为true或false,双方都可以使用RCRTCLiveInfo.setMixConfig(RCRTCMixConfig, IRCRTCResultCallback) 方法主动设置合流布局。一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。 + extra - 扩展字段,默认为空 + */ + rtcRoom.getLocalUser().responseJoinOtherRoom(liveUid, liveUid, agree, agree, extra, callback); + } else { + callback.onFailed(RTCErrorCode.RongRTCCodeIMError); + } + } + + /** + * 申请PK + * @param liveUid 对方房间号 + * @param inviterAutoMix 是否将邀请者音视频资源发送到被邀请人房间中合流 + * @param extra 扩展参数 + * @param callback 回调 + */ + public void requestJoinOtherRoom(String liveUid,boolean inviterAutoMix,String extra,IRCRTCResultCallback callback){ + if(rtcRoom!=null){ + /* + inviteeRoomId - 被邀请者所在房间 id + inviteeUserId - 被邀请用户 id + inviterAutoMix - 是否将邀请者音视频资源发送到被邀请人房间中合流 + 1: inviterAutoMix为true时: + 1.1:如果被邀请方在加入邀请方房间之前发布了资源,当被邀请方加入邀请者房间成功后,服务器会把被邀请方流资源合并到邀请方视图 ·(默认仅悬浮布局合流)上。 + 1.2:如果被邀请方在加入邀请方房间之前没有发布过资源,将会在被邀请方发布资源成功后,服务器会把被邀请方流资源合并到邀请方视图(默认仅悬浮布局合流)上。 + 2:无论为true或false,双方都可以使用RCRTCLiveInfo.setMixConfig(RCRTCMixConfig, IRCRTCResultCallback) 方法主动设置合流布局。一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。 + extra - 扩展字段,默认为空 + */ + rtcRoom.getLocalUser().requestJoinOtherRoom(liveUid,liveUid,inviterAutoMix,extra,callback); + }else{ + callback.onFailed(RTCErrorCode.RongRTCCodeIMError); + } + } +} diff --git a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java index e5052a6b7..d8d201b6d 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -4,6 +4,7 @@ import static com.blankj.utilcode.util.SnackbarUtils.dismiss; import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_DISABLE; import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK; +import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK_RANDOM; import static com.yunbao.live.views.AbsRyLivePushViewHolder.mPreView; import static com.yunbao.live.views.LivePushRyViewHolder.dr_pk_view; import static com.yunbao.live.views.LivePushRyViewHolder.rtcRoom; @@ -50,6 +51,7 @@ import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.utils.BitmapUtil; import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DateFormatUtil; @@ -88,6 +90,7 @@ import com.yunbao.live.socket.SocketRyChatUtil; import com.yunbao.live.socket.SocketRyClient; import com.yunbao.live.socket.SocketSendBean; import com.yunbao.common.utils.MicStatusManager; +import com.yunbao.live.utils.RandomPkManager; import com.yunbao.live.views.LiveEndViewHolder; import com.yunbao.live.views.LiveMusicViewHolder; import com.yunbao.live.views.LiveNewReadyRyViewHolder; @@ -152,6 +155,18 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl public static int pk_nub; public static int backIndex = 0;//0=未判断,1=已判断 private FaceManager manager; + private final RandomPkManager.OnRandomPkTimer onRandomPkTimer = new RandomPkManager.OnRandomPkTimer() { + @Override + public void onTimer(String time) { + + } + + @Override + public void onStartPK(String pkUid) { + ToastUtil.show("发起随机PK:"+pkUid); + linkDrMicAnchorApply(pkUid, pkUid, SOCKET_LIVE_DRPK_RANDOM); + } + }; @Override protected int getLayoutId() { @@ -190,6 +205,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl mContainer = (ViewGroup) findViewById(R.id.container); mLiveRyLinkMicPkPresenter = new LiveRyLinkMicPkPresenter(mContext, mLivePushViewHolder, true, mContainer); + RandomPkManager.getInstance().addOnRandomPkTimer(onRandomPkTimer); //添加开播前设置控件 mLiveReadyViewHolder = new LiveNewReadyRyViewHolder(mContext, mContainer, mLiveSDK); @@ -574,9 +590,9 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl /** * 随机PK */ - public void openRandomPkWindow(){ - RandomPkDialogFragment fragment=new RandomPkDialogFragment(); - Bundle bundle=new Bundle(); + public void openRandomPkWindow() { + RandomPkDialogFragment fragment = new RandomPkDialogFragment(); + Bundle bundle = new Bundle(); fragment.setArguments(bundle); fragment.show(getSupportFragmentManager(), "RandomPkDialogFragment"); } @@ -914,6 +930,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl MicStatusManager.getInstance().closeMic(mContext); } L.e("LiveAnchorActivity-------onDestroy------->"); + RandomPkManager.getInstance().unregisterOnRandomPkTimer(onRandomPkTimer); Bus.getOff(this); } @@ -1081,14 +1098,24 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } + /** + * 发起多人主播连麦PK申请 + * + * @param pkUid 对方主播的uid + * @param stream 对方主播的stream (无需steam) + */ + public void linkDrMicAnchorApply(String pkUid, String stream) { + linkDrMicAnchorApply(pkUid, stream, SOCKET_LIVE_DRPK); + } /** * 发起多人主播连麦PK申请 * * @param pkUid 对方主播的uid - * @param stream 对方主播的stream + * @param stream 对方主播的stream (无需steam) + * @param extra PK类型 */ - public void linkDrMicAnchorApply(final String pkUid, String stream) { + public void linkDrMicAnchorApply(final String pkUid, String stream, String extra) { LiveHttpUtil.livePkCheckLive(pkUid, stream, mStream, new HttpCallback() { @Override @@ -1098,10 +1125,12 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (obj != null) { if (obj.getString("ispk").equals("0")) { - rtcRoom.getLocalUser().requestJoinOtherRoom(pkUid, pkUid, true, SOCKET_LIVE_DRPK, new IRCRTCResultCallback() { + IMRTCManager.getInstance().requestJoinOtherRoom(pkUid, true, extra, new IRCRTCResultCallback() { @Override public void onSuccess() { - ToastUtil.show("邀请 " + pkUid + " 发送成功"); + if (!extra.equals(SOCKET_LIVE_DRPK_RANDOM)) { + ToastUtil.show("邀请 " + pkUid + " 发送成功"); + } runOnUiThread(new Runnable() { @Override public void run() { @@ -1365,9 +1394,9 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.updataMicList(list); - Log.i("多人连麦", "onOpenDrawer: "+list.size()); + Log.i("多人连麦", "onOpenDrawer: " + list.size()); for (LinkMicUserBean userBean : list) { - Log.i("多人连麦", "u list: "+userBean.toString()); + Log.i("多人连麦", "u list: " + userBean.toString()); } } break; @@ -1378,12 +1407,13 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } break; case LINK_MIC_CLOSE: - if(mLiveRoomViewHolder!=null){ + if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.updataCleanMic(); } break; } } + /** * 检查指定直播间连麦人数 * diff --git a/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java b/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java index 27c2a5d4e..f2e7467d7 100644 --- a/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java @@ -1,11 +1,9 @@ package com.yunbao.live.adapter; import android.content.Context; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; @@ -14,14 +12,11 @@ import androidx.recyclerview.widget.RecyclerView; import com.makeramen.roundedimageview.RoundedImageView; import com.yunbao.common.adapter.RefreshAdapter; +import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.glide.ImgLoader; import com.yunbao.live.R; -import com.yunbao.live.bean.RandomPkBean; -import java.util.ArrayList; -import java.util.List; - -public class RandomPkRecyclerAdapter extends RefreshAdapter { +public class RandomPkRecyclerAdapter extends RefreshAdapter { private static final int HEAD = 0; private static final int ITEM = 2; @@ -42,7 +37,7 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == ITEM) { - ((HeadViewHolder) holder).setData(mList.get(position-1)); + ((HeadViewHolder) holder).setData(mList.get(position)); } } @@ -66,7 +61,7 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { super(itemView); } - public void setData(RandomPkBean bean) { + public void setData(RandomPkUserBean bean) { } } @@ -93,9 +88,13 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { } @Override - public void setData(RandomPkBean bean) { + public void setData(RandomPkUserBean bean) { super.setData(bean); int position = getAbsoluteAdapterPosition(); + if (bean == null) { + return; + } + System.out.println("bean = " + bean); mNum.setText((position) + ""); if (position % 2 == 0) { itemView.setBackgroundResource(R.drawable.bg_item_random_pk_type_1); @@ -103,19 +102,20 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { itemView.setBackgroundResource(R.drawable.bg_item_random_pk_type_2); } ImgLoader.display(mContext, bean.getAvatar(), mAvatar); - if(bean.getUserNiceName().length()>4){ - mName.setText(bean.getUserNiceName().substring(0,4)+"..."); - }else { + if (bean.getUserNiceName().length() > 4) { + mName.setText(bean.getUserNiceName().substring(0, 4) + "..."); + } else { mName.setText(bean.getUserNiceName()); } mId.setText(bean.getId()); - mStatus.setText(bean.getStatus()); - if (bean.isPkIng()) { + if (bean.isPk()) { + mStatus.setText("PK中"); ImgLoader.display(mContext, R.mipmap.ic_random_pk_pk, mPkStatus); } else { + mStatus.setText("空闲"); ImgLoader.display(mContext, R.mipmap.ic_random_pk_pk_unselect, mPkStatus); } - if (bean.isFollow()) { + if (bean.isAttention()) { ImgLoader.display(mContext, R.mipmap.ic_random_pk_like, mFollow); } else { ImgLoader.display(mContext, R.mipmap.ic_random_pk_like_unselect, mFollow); diff --git a/live/src/main/java/com/yunbao/live/bean/RandomPkBean.java b/live/src/main/java/com/yunbao/live/bean/RandomPkBean.java deleted file mode 100644 index c68b735cd..000000000 --- a/live/src/main/java/com/yunbao/live/bean/RandomPkBean.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.yunbao.live.bean; - -import com.yunbao.common.bean.UserBean; - -public class RandomPkBean extends UserBean { - private String status; - private boolean pkIng; - private boolean follow; - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public boolean isPkIng() { - return pkIng; - } - - public void setPkIng(boolean pkIng) { - this.pkIng = pkIng; - } - - public boolean isFollow() { - return follow; - } - - public void setFollow(boolean follow) { - this.follow = follow; - } -} diff --git a/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java index 8230f7a39..1b0f03d5e 100644 --- a/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java @@ -1,6 +1,9 @@ package com.yunbao.live.dialog; +import android.app.Dialog; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; @@ -12,31 +15,39 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.Nullable; -import androidx.appcompat.widget.SwitchCompat; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.google.android.material.tabs.TabLayout; -import com.lzf.easyfloat.interfaces.OnPermissionResult; -import com.lzf.easyfloat.permission.PermissionUtils; import com.yunbao.common.adapter.RefreshAdapter; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.custom.CommonRefreshView; import com.yunbao.common.dialog.AbsDialogFragment; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; -import com.yunbao.common.views.weight.ViewClicksAntiShake; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.utils.WordsTypeUtil; import com.yunbao.live.R; import com.yunbao.live.adapter.RandomPkRecyclerAdapter; -import com.yunbao.live.bean.RandomPkBean; +import com.yunbao.live.bean.LivePkBean; +import com.yunbao.live.http.LiveHttpUtil; +import com.yunbao.live.utils.RandomPkManager; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** * 随机PK */ -public class RandomPkDialogFragment extends AbsDialogFragment { +public class RandomPkDialogFragment extends AbsDialogFragment implements View.OnClickListener { private static final String TAG = "随机PK"; + private int mLiveUid; private TabLayout tabLayout; private View reset; private CommonRefreshView mRecyclerView; @@ -49,6 +60,21 @@ public class RandomPkDialogFragment extends AbsDialogFragment { private EditText mSearch; private ImageView mClear; private RandomPkRecyclerAdapter adapter; + private DataHelper helper; + + + private final RandomPkManager.OnRandomPkTimer randomPkTimer = new RandomPkManager.OnRandomPkTimer() { + @Override + public void onTimer(String time) { + Log.i(TAG, "onTimer: "+time); + mPkBtnTitle.setText(String.format(WordUtil.getString(R.string.random_pk_info_btn_ing), time)); + } + + @Override + public void onStartPK(String pkUid) { + + } + }; @Override protected int getLayoutId() { @@ -75,6 +101,16 @@ public class RandomPkDialogFragment extends AbsDialogFragment { window.setAttributes(params); } + public void setLiveUid(int mLiveUid) { + this.mLiveUid = mLiveUid; + } + + @Override + public void onDestroy() { + super.onDestroy(); + RandomPkManager.getInstance().unregisterOnRandomPkTimer(randomPkTimer); + } + @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -95,23 +131,24 @@ public class RandomPkDialogFragment extends AbsDialogFragment { mRandomPkSwitch = (ImageView) findViewById(R.id.live_random_pk_switch); mSearch = (EditText) findViewById(R.id.search_edit); mClear = (ImageView) findViewById(R.id.search_clear); - mClear.setOnClickListener(v -> { - mSearch.setText(""); - }); + mClear.setOnClickListener(this); mRandomPkSwitch.setTag(true); - mRandomPkSwitch.setOnClickListener(v -> { - if (mRandomPkSwitch.getTag() != null && (boolean) mRandomPkSwitch.getTag()) { - ImgLoader.display(mContext, com.yunbao.common.R.mipmap.special_icon_off, mRandomPkSwitch); - mRandomPkSwitch.setTag(false); - } else { - ImgLoader.display(mContext, com.yunbao.common.R.mipmap.special_icon_on, mRandomPkSwitch); - mRandomPkSwitch.setTag(true); - } - }); - mSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { + mRandomPkSwitch.setOnClickListener(this); + mPkBtn.setOnClickListener(this); + mSearch.addTextChangedListener(new TextWatcher() { @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - return false; + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + helper.search(s.toString()); + } + + @Override + public void afterTextChanged(Editable s) { + } }); @@ -119,65 +156,17 @@ public class RandomPkDialogFragment extends AbsDialogFragment { } private void initRecycler() { + helper = new DataHelper(); adapter = new RandomPkRecyclerAdapter(mContext); mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); - mRecyclerView.setDataHelper(new CommonRefreshView.DataHelper() { - @Override - public RefreshAdapter getAdapter() { - return adapter; - } - - @Override - public void loadData(int p, HttpCallback callback) { - callback.onSuccess(0, "", new String[0]); - } - - @Override - public List processData(String[] info) { - Log.i(TAG, "processData: 获取数据成功"); - return createTmpData(); - } - - @Override - public void onRefreshSuccess(List list, int listCount) { - - } - - @Override - public void onRefreshFailure() { - - } - - @Override - public void onLoadMoreSuccess(List loadItemList, int loadItemCount) { - - } - - @Override - public void onLoadMoreFailure() { - - } - }); + mRecyclerView.setDataHelper(helper); mRecyclerView.initData(); } - private List createTmpData() { - List list = new ArrayList<>(); - for (int i = 1; i < 10; i++) { - RandomPkBean bean = new RandomPkBean(); - bean.setId(i + ""); - bean.setAvatar("https://ceshi.yaoulive.com/default.jpg"); - bean.setUserNiceName(i + "测试样本123456"); - bean.setStatus(i % 3 == 0 ? "PK中" : "空闲"); - bean.setPkIng(i % 3 == 0); - bean.setFollow(i % 2 == 0); - list.add(bean); - } - return list; - } private void initData() { - + RandomPkManager.getInstance().addOnRandomPkTimer(randomPkTimer); + initPkSwitch(); } private void initTab() { @@ -202,6 +191,7 @@ public class RandomPkDialogFragment extends AbsDialogFragment { mSearchLayout.setVisibility(View.INVISIBLE); switch ((int) tab.getTag()) { case 1: + mSearch.setText(""); mSearchLayout.setVisibility(View.GONE); mPkInfoLayout.setVisibility(View.VISIBLE); break; @@ -229,4 +219,174 @@ public class RandomPkDialogFragment extends AbsDialogFragment { } }); } + + /** + * 设置随机PK开关状态 + * + * @param open on/off + */ + private void setSwitchBtn(boolean open) { + if (open) { + ImgLoader.display(mContext, com.yunbao.common.R.mipmap.special_icon_on, mRandomPkSwitch); + mRandomPkSwitch.setTag(true); + } else { + ImgLoader.display(mContext, com.yunbao.common.R.mipmap.special_icon_off, mRandomPkSwitch); + mRandomPkSwitch.setTag(false); + } + } + + /** + * 获取随机PK状态 + */ + private void initPkSwitch() { + LiveNetManager.get(mContext) + .getRandomPkSwitch(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(Integer data) { + if (data != null) { + setSwitchBtn(data == 1); + } + } + + @Override + public void onError(String error) { + + } + }); + } + + private Dialog loadDialog; + + /** + * 设置随机PK状态 + * + * @param pk 1=on,0=off + */ + private void setPkSwitch(int pk) { + loadDialog = DialogUitl.loadingDialog(mContext); + loadDialog.show(); + LiveNetManager.get(mContext) + .changeRandomPkSwitch(pk, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + loadDialog.dismiss(); + loadDialog = null; + if (data.getCode() == 0) { + setSwitchBtn(!(boolean) mRandomPkSwitch.getTag()); + } else { + ToastUtil.show(data.getMsg()); + } + + } + + @Override + public void onError(String error) { + loadDialog.dismiss(); + loadDialog = null; + } + }); + } + + private void randomPk() { + if (mPkBtn.getTag() != null && (boolean) mPkBtn.getTag()) { + RandomPkManager.getInstance().end(); + resetPkBtn(); + mPkBtn.setTag(false); + return; + } + mPkBtnDesc.setVisibility(View.VISIBLE); + mPkBtnDesc.setText(R.string.random_pk_info_btn_ing_desc); + RandomPkManager.getInstance().start(); + mPkBtn.setTag(true); + } + + private void resetPkBtn() { + mPkBtnDesc.setVisibility(View.GONE); + mPkBtnTitle.setText(R.string.random_pk_info_btn_start); + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.live_random_pk_switch) { + if (mRandomPkSwitch.getTag() != null && (boolean) mRandomPkSwitch.getTag()) { + setPkSwitch(0); + } else { + setPkSwitch(1); + } + } else if (id == R.id.search_clear) { + mSearch.setText(""); + } else if (id == R.id.random_pk_info_btn) { + randomPk(); + } + } + + public class DataHelper implements CommonRefreshView.DataHelper { + + public void search(String key) { + LiveNetManager.get(mContext) + .randomPkSearchUser(key, WordsTypeUtil.changeTraditional(key), new com.yunbao.common.http.base.HttpCallback>() { + @Override + public void onSuccess(List data) { + List list = new ArrayList<>(); + list.add(null); + list.addAll(data); + adapter.setList(list); + adapter.notifyDataSetChanged(); + } + + @Override + public void onError(String error) { + } + }); + } + + @Override + public RefreshAdapter getAdapter() { + return adapter; + } + + @Override + public void loadData(int p, HttpCallback callback) { + LiveHttpUtil.getLivePkList(p, callback); + } + + @Override + public List processData(String[] info) { + Log.i(TAG, "processData: 获取数据成功"); + List beans = JSON.parseArray(Arrays.toString(info), LivePkBean.class); + List list = new ArrayList<>(); + for (LivePkBean bean : beans) { + RandomPkUserBean userBean = new RandomPkUserBean(); + userBean.setId(bean.getUid()); + userBean.setSex(bean.getSex()); + userBean.setUserNiceName(bean.getUserNiceName()); + userBean.setAvatar(bean.getAvatar()); + userBean.setPk(bean.getPkUid().equals("0") ? 0 : 1); + userBean.setAttention("0"); + list.add(userBean); + } + return list; + } + + @Override + public void onRefreshSuccess(List list, int listCount) { + + } + + @Override + public void onRefreshFailure() { + + } + + @Override + public void onLoadMoreSuccess(List loadItemList, int loadItemCount) { + + } + + @Override + public void onLoadMoreFailure() { + + } + } } diff --git a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java index 753250175..949ad09a8 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java @@ -26,6 +26,7 @@ import com.yunbao.common.CommonAppConfig; import com.yunbao.common.bean.UserBean; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; +import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.ScreenDimenUtil; @@ -1198,97 +1199,97 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { public void onSuccess(int code, String msg, String[] info) { Log.i(TAG, "code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); JSONObject datas = JSONObject.parseObject(info[0]); - boolean agree=true; + boolean agree = true; if (datas.getIntValue("pk_num_day") <= 0) { ToastUtil.show("多人PK次数已用完"); - agree=false; + agree = false; } boolean finalAgree = agree; - rtcRoom.getLocalUser().responseJoinOtherRoom(mApplyUid, mApplyUid, agree, true, SOCKET_LIVE_DRPK, new IRCRTCResultCallback() { + IMRTCManager.getInstance().responseJoinOtherRoom(mApplyUid, agree, SOCKET_LIVE_DRPK, new IRCRTCResultCallback() { @Override public void onSuccess() { - if(finalAgree == true){ - HttpClient.getInstance().get("live.joinDRPKroom", "live.joinDRPKroom") - .params("uid", CommonAppConfig.getInstance().getUid()) - .params("roomid", u.getId()) - .execute(new HttpCallback() { + if (finalAgree == true) { + HttpClient.getInstance().get("live.joinDRPKroom", "live.joinDRPKroom") + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("roomid", u.getId()) + .execute(new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - Log.i("多人PK","code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); + @Override + public void onSuccess(int code, String msg, String[] info) { + Log.i("多人PK", "code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); - final SocketSendBean msg1 = new SocketSendBean() - .param("_method_", SOCKET_LIVE_DRPK) - .param("action", 10) - .param("uid", CommonAppConfig.getInstance().getUid()); - msg1.create(); - String targetId = "g" + CommonAppConfig.getInstance().getUid(); - Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; - TextMessage messageContent = TextMessage.obtain(msg1.mResult.toString()); - io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(targetId, conversationType, messageContent); + final SocketSendBean msg1 = new SocketSendBean() + .param("_method_", SOCKET_LIVE_DRPK) + .param("action", 10) + .param("uid", CommonAppConfig.getInstance().getUid()); + msg1.create(); + String targetId = "g" + CommonAppConfig.getInstance().getUid(); + Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; + TextMessage messageContent = TextMessage.obtain(msg1.mResult.toString()); + io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(targetId, conversationType, messageContent); - RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { - @Override - public void onAttached(io.rong.imlib.model.Message message) { + RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { + @Override + public void onAttached(io.rong.imlib.model.Message message) { - } - - @Override - public void onSuccess(io.rong.imlib.model.Message message) { - Log.e("ry", "发送成功"); - if (SocketRyClient.mSocketHandler != null) { - SocketRyClient.mSocketHandler.processBroadcast(msg1.mResult.toString() + ""); } - } - @Override - public void onError(io.rong.imlib.model.Message message, RongIMClient.ErrorCode errorCode) { - Log.e("ry", "发送失敗"); - } - }); - if(info.length==0){ - return; - } - JSONObject obj = JSONObject.parseObject(info[0]); - JSONArray users = obj.getJSONArray("userlist"); + @Override + public void onSuccess(io.rong.imlib.model.Message message) { + Log.e("ry", "发送成功"); + if (SocketRyClient.mSocketHandler != null) { + SocketRyClient.mSocketHandler.processBroadcast(msg1.mResult.toString() + ""); + } + } - //添加水印 + @Override + public void onError(io.rong.imlib.model.Message message, RongIMClient.ErrorCode errorCode) { + Log.e("ry", "发送失敗"); + } + }); + if (info.length == 0) { + return; + } + JSONObject obj = JSONObject.parseObject(info[0]); + JSONArray users = obj.getJSONArray("userlist"); + + //添加水印 // RCRTCRect rect = new RCRTCRect(0.5f, 0.5f, 0.2f); // RCRTCEngine.getInstance().getDefaultVideoStream().setWatermark(fromText(50, mNameText), rect); - dRjoinOtherRoom(u.getId(), 1); + dRjoinOtherRoom(u.getId(), 1); - for (int i = 0; i < users.size(); i++) { - JSONObject user = users.getJSONObject(i); - Log.e("ry", mApplyUid + "VS" + user.getString("id") + "列表"); - if (!user.getString("id").equals(CommonAppConfig.getInstance().getUid())) { - if (!user.getString("id").equals(CommonAppConfig.getInstance().getUid()) && !user.getString("id").equals(u.getId())) { - /** - * 向指定用户发送跨房间连麦请求 - *

- * 1: inviterAutoMix为true时: - * - * 1.1:如果被邀请方在加入邀请方房间之前发布了资源,当被邀请方加入邀请者房间成功后,服务器会把被邀请方流资源合并到邀请方视图 ·(默认仅悬浮布局合流)上。 - * - * 1.2:如果被邀请方在加入邀请方房间之前没有发布过资源,将会在被邀请方发布资源成功后,服务器会把被邀请方流资源合并到邀请方视图(默认仅悬浮布局合流)上。 - * - * 2:无论为true或false,双方都可以使用{@link RCRTCLiveInfo#setMixConfig(RCRTCMixConfig, IRCRTCResultCallback)} 方法主动设置合流布局。一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。 - *

- */ - rtcRoom.getLocalUser().requestJoinOtherRoom(user.getString("id"), user.getString("id"), false, "LiveDRPK1", new IRCRTCResultCallback() { - @Override - public void onSuccess() { - } + for (int i = 0; i < users.size(); i++) { + JSONObject user = users.getJSONObject(i); + Log.e("ry", mApplyUid + "VS" + user.getString("id") + "列表"); + if (!user.getString("id").equals(CommonAppConfig.getInstance().getUid())) { + if (!user.getString("id").equals(CommonAppConfig.getInstance().getUid()) && !user.getString("id").equals(u.getId())) { + /** + * 向指定用户发送跨房间连麦请求 + *

+ * 1: inviterAutoMix为true时: + * + * 1.1:如果被邀请方在加入邀请方房间之前发布了资源,当被邀请方加入邀请者房间成功后,服务器会把被邀请方流资源合并到邀请方视图 ·(默认仅悬浮布局合流)上。 + * + * 1.2:如果被邀请方在加入邀请方房间之前没有发布过资源,将会在被邀请方发布资源成功后,服务器会把被邀请方流资源合并到邀请方视图(默认仅悬浮布局合流)上。 + * + * 2:无论为true或false,双方都可以使用{@link RCRTCLiveInfo#setMixConfig(RCRTCMixConfig, IRCRTCResultCallback)} 方法主动设置合流布局。一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。 + *

+ */ + IMRTCManager.getInstance().requestJoinOtherRoom(user.getString("id"), false, "LiveDRPK1", new IRCRTCResultCallback() { + @Override + public void onSuccess() { + } - @Override - public void onFailed(RTCErrorCode errorCode) { + @Override + public void onFailed(RTCErrorCode errorCode) { - } - }); + } + }); + } } } } - } - }); + }); } } @@ -1308,7 +1309,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { } else { if (mPkWaitCount < 0) { - rtcRoom.getLocalUser().responseJoinOtherRoom(u.getId(), u.getId(), false, false, "extra", new IRCRTCResultCallback() { + IMRTCManager.getInstance().responseJoinOtherRoom(u.getId(), false, "extra", new IRCRTCResultCallback() { @Override public void onFailed(RTCErrorCode errorCode) { @@ -1350,7 +1351,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { }); } else { - rtcRoom.getLocalUser().responseJoinOtherRoom(u.getId(), u.getId(), false, false, "extra", new IRCRTCResultCallback() { + IMRTCManager.getInstance().responseJoinOtherRoom(u.getId(),false, "extra", new IRCRTCResultCallback() { @Override public void onFailed(RTCErrorCode errorCode) { diff --git a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java index f1b4f4e0c..fc9d7ff9d 100644 --- a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java +++ b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java @@ -267,6 +267,7 @@ public class SocketRyClient { // case Constants.SOCKET_SEND_GIFT://送礼物 // ////////pk // break; + case Constants.SOCKET_LIVE_DRPK_RANDOM: case Constants.SOCKET_LIVE_DRPK://多人PK int action3 = map.getIntValue("action"); //收到多人PK邀请 @@ -288,7 +289,7 @@ public class SocketRyClient { } LiveRoomViewHolder.UpPkBar(map.getJSONArray("userlist"), mLiveUid, map.getIntValue("drpk_time")); if (livePushRyViewHolder == null) { - // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); + // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); Bus.get().post(new LiveAudienceEvent() .setType(LiveAudienceEvent.LiveAudienceType.SOCKET_LIVE_DRPK_SET_PK_VIEW) ); @@ -322,7 +323,7 @@ public class SocketRyClient { isDRPK = 1; } else if (action3 == 10) { if (!map.getString("uid").equals(CommonAppConfig.getInstance().getUid())) { - // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); + // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); Bus.get().post(new LiveAudienceEvent() .setType(LiveAudienceEvent.LiveAudienceType.SOCKET_LIVE_DRPK_SET_PK_VIEW) ); diff --git a/live/src/main/java/com/yunbao/live/utils/RandomPkManager.java b/live/src/main/java/com/yunbao/live/utils/RandomPkManager.java new file mode 100644 index 000000000..59dbc4249 --- /dev/null +++ b/live/src/main/java/com/yunbao/live/utils/RandomPkManager.java @@ -0,0 +1,103 @@ +package com.yunbao.live.utils; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; + +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Timer; +import java.util.TimerTask; + +public class RandomPkManager { + private static RandomPkManager manager; + private int min = -1; + private int sec = -1; + private Timer timer; + private TimerTask task; + private List randomPkTimer = new ArrayList<>(); + + private RandomPkManager() { + initTask(); + } + + public static RandomPkManager getInstance() { + if (manager == null) { + manager = new RandomPkManager(); + } + return manager; + } + + public void addOnRandomPkTimer(OnRandomPkTimer randomPkTimer) { + this.randomPkTimer.add(randomPkTimer); + } + + public void unregisterOnRandomPkTimer(OnRandomPkTimer randomPkTimer) { + this.randomPkTimer.remove(randomPkTimer); + } + + private void initVal() { + min = -1; + sec = -1; + } + + private void initTask() { + task = new TimerTask() { + Handler handler = new Handler(Looper.getMainLooper()); + + @Override + public void run() { + sec++; + if (sec % 60 == 0) { + min++; + sec = 0; + } + handler.post(() -> { + for (OnRandomPkTimer onRandomPkTimer : randomPkTimer) { + onRandomPkTimer.onTimer(String.format(Locale.CHINA, "%02d:%02d", min, sec)); + } + if (sec == 5) { + LiveNetManager.get(CommonAppContext.getTopActivity()) + .randomPK(new HttpCallback() { + @Override + public void onSuccess(String data) { + for (OnRandomPkTimer pkTimer : randomPkTimer) { + pkTimer.onStartPK(data); + } + } + + @Override + public void onError(String error) { + + } + }); + } + }); + } + }; + } + + public void start() { + task.cancel(); + initTask(); + initVal(); + timer = new Timer(); + timer.schedule(task, 0, 1000); + + } + + public void end() { + task.cancel(); + } + + public interface OnRandomPkTimer { + void onTimer(String time); + + void onStartPK(String pkUid); + } +} diff --git a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java index e25f4cca7..4e0b1595e 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -35,6 +35,7 @@ import com.yunbao.common.Constants; import com.yunbao.common.bean.UserBean; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; +import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; @@ -476,7 +477,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX // 保存房间对象 rtcRoom = room; - + IMRTCManager.getInstance().setRtcRoom(room); new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { @@ -536,6 +537,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX return; } rtcRoom = room; + IMRTCManager.getInstance().setRtcRoom(room); } rtcRoom.getLocalUser().publishDefaultLiveStreams(new IRCRTCResultDataCallback() { @Override diff --git a/live/src/main/res/layout/item_random_pk_rv.xml b/live/src/main/res/layout/item_random_pk_rv.xml index 753f1c570..54bd44ee6 100644 --- a/live/src/main/res/layout/item_random_pk_rv.xml +++ b/live/src/main/res/layout/item_random_pk_rv.xml @@ -68,8 +68,9 @@ android:id="@+id/item_status" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="1" android:layout_gravity="center" + android:layout_weight="1" + android:gravity="center" android:text="状态" android:textColor="#FFFFFF" android:textSize="14sp" /> @@ -78,19 +79,17 @@ android:id="@+id/item_pk" android:layout_width="0dp" android:layout_height="27dp" - android:layout_weight="1" android:layout_gravity="center" - android:src="@mipmap/ic_random_pk_pk" - /> + android:layout_weight="1" + android:src="@mipmap/ic_random_pk_pk" /> + android:layout_weight="1" + android:src="@mipmap/ic_random_pk_like" /> \ No newline at end of file diff --git a/live/src/main/res/values/strings.xml b/live/src/main/res/values/strings.xml index 4274792ee..bd1c7c127 100644 --- a/live/src/main/res/values/strings.xml +++ b/live/src/main/res/values/strings.xml @@ -39,8 +39,10 @@ 4、安全部門將會24小時巡查,請文明PK,嚴格遵守主播守則; 隨機PK開關: 開始匹配 - 匹配中 %s \n再次點擊可取消匹配 - 正在退出匹配 %s \n退出過程中也有可能匹配到對手 + 匹配中 %s + 再次點擊可取消匹配 + 正在退出匹配 %s + 退出過程中也有可能匹配到對手 請輸入您要pk的主播昵稱或id