From 3747f214b10b8b1de0aac0b88cd48c1111edd57a Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:47:37 +0800 Subject: [PATCH 01/11] =?UTF-8?q?*=E6=96=B0=E5=A2=9E=E9=95=BF=E6=8C=89?= =?UTF-8?q?=E9=9A=8F=E6=9C=BAPK=E3=80=90=E5=BC=80=E5=A7=8B=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E3=80=91=E6=8C=89=E9=92=AE=E5=8F=AF=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=8C=87=E5=AE=9AUIDPk=E7=9A=84=E6=B5=8B=E8=AF=95=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunbao/common/http/live/LiveNetManager.java | 7 +------ .../com/yunbao/common/manager/RandomPkManager.java | 8 +++++++- .../yunbao/live/activity/LiveRyAnchorActivity.java | 4 ++-- .../yunbao/live/dialog/RandomPkDialogFragment.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 9 deletions(-) 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 ce73964ab..d1613154e 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 @@ -600,12 +600,7 @@ public class LiveNetManager { @Override public void accept(ResponseModel responseModel) throws Exception { if (callback != null) { - if(CommonAppConfig.getInstance().getUid().equals("98196")) { - callback.onSuccess("98274"); - }else{ - callback.onSuccess("98196"); - } - // callback.onSuccess(responseModel.getData().getInfo()); + callback.onSuccess(responseModel.getData().getInfo()); } } }, new Consumer() { diff --git a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java index 032445ad7..2a0d75816 100644 --- a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java +++ b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java @@ -34,6 +34,7 @@ public class RandomPkManager { private TimerTask task; private final List randomPkTimer = new ArrayList<>();//监听器集合 private String pkUid;//对方房间ID + public static String debugUid; private RankPkInfoBean rankPkInfoBean;//排位赛信息 Handler handler = new Handler(Looper.getMainLooper()); @@ -123,6 +124,9 @@ public class RandomPkManager { @Override public void onSuccess(String data) { pkUid = data; + if (debugUid != null) { + pkUid = data = debugUid; + } for (OnRandomPkTimer pkTimer : randomPkTimer) { pkTimer.onStartPK(data); } @@ -163,7 +167,8 @@ public class RandomPkManager { timer.schedule(task, 0, 1000); return true; } - private void getRankInfo(){ + + private void getRankInfo() { LiveNetManager.get(CommonAppContext.getTopActivity()) .getRankPkInfoBean(new HttpCallback() { @Override @@ -358,6 +363,7 @@ public class RandomPkManager { /** * 匹配到对方 + * * @param pkUid 对方uid */ public void onStartPK(String pkUid) { 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 770feab05..c7653605b 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -402,8 +402,8 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl break; case Constants.LIVE_FUNC_LINK_MIC://连麦 if (isDRPK != 1) { - //openLinkMicAnchorWindow(false); - openFreePkWindow(); + openLinkMicAnchorWindow(false); + //openFreePkWindow(); } else { ToastUtil.show("您已在PK中"); } 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 72ab30e93..032f61be7 100644 --- a/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java @@ -117,6 +117,7 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On super.onActivityCreated(savedInstanceState); initView(); initData(); + RandomPkManager.debugUid = null; } private void initView() { @@ -127,6 +128,17 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On mRandomPkSwitch.setTag(true); mRandomPkSwitch.setOnClickListener(this); mPkBtn.setOnClickListener(this); + mPkBtn.setOnLongClickListener(v -> { + DialogUitl.showSimpleInputDialog(mContext, "输入指定UID", new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + RandomPkManager.debugUid = content; + ToastUtil.show("随机PK指定id = " + content); + dialog.dismiss(); + } + }); + return false; + }); } private void initData() { From 7c4c22d69e0b1ca763c8970c455364ef6db0c183 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:48:35 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=9A=8F=E6=9C=BAPK?= =?UTF-8?q?=E5=89=8D=E5=85=88=E6=A3=80=E6=B5=8B=E6=98=AF=E5=90=A6=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E4=BA=86=E8=BF=9E=E9=BA=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/dialog/RandomPkDialogFragment.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) 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 032f61be7..3925c7375 100644 --- a/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java @@ -15,12 +15,18 @@ import androidx.annotation.Nullable; import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.dialog.AbsDialogFragment; import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.utils.MicStatusManager; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.live.R; import com.yunbao.common.manager.RandomPkManager; +import com.yunbao.live.activity.LiveRyAnchorActivity; +import com.yunbao.live.http.LiveHttpUtil; + +import java.util.Arrays; /** * 随机PK @@ -237,12 +243,23 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On RandomPkManager.getInstance().exitPk(); return; } + LiveHttpUtil.getMicList(LiveRyAnchorActivity.mLiveUid, 0, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + System.out.println("code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); + //非0认为未开通连麦权限 + if (code != 0) { + if (RandomPkManager.getInstance().start()) { + mPkBtnDesc.setVisibility(View.VISIBLE); + mPkBtnDesc.setText(R.string.random_pk_info_btn_ing_desc); + mPkBtn.setTag(true); + } + } else { + ToastUtil.show("請先關閉語言連麥"); + } + } + }); - if (RandomPkManager.getInstance().start()) { - mPkBtnDesc.setVisibility(View.VISIBLE); - mPkBtnDesc.setText(R.string.random_pk_info_btn_ing_desc); - mPkBtn.setTag(true); - } } private void resetPkBtn() { From a7cf09de1e2a5401ce3c3941b9e5ef7b2cad1b12 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:51:49 +0800 Subject: [PATCH 03/11] =?UTF-8?q?update=20=E8=87=AA=E7=94=B1PK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/activity/LiveRyAnchorActivity.java | 4 +- .../live/adapter/RandomPkRecyclerAdapter.java | 38 ++++++++-- .../java/com/yunbao/live/bean/LivePkBean.java | 20 +++++- .../live/dialog/FreePkDialogFragment.java | 66 +++++++++++++----- .../com/yunbao/live/http/LiveHttpUtil.java | 9 +++ .../layout/view_live_search_list_empty.xml | 27 +++++++ .../img_live_search_list_empty.png | Bin 0 -> 30277 bytes 7 files changed, 137 insertions(+), 27 deletions(-) create mode 100644 live/src/main/res/layout/view_live_search_list_empty.xml create mode 100644 live/src/main/res/mipmap-xxxhdpi/img_live_search_list_empty.png 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 c7653605b..770feab05 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -402,8 +402,8 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl break; case Constants.LIVE_FUNC_LINK_MIC://连麦 if (isDRPK != 1) { - openLinkMicAnchorWindow(false); - //openFreePkWindow(); + //openLinkMicAnchorWindow(false); + openFreePkWindow(); } else { ToastUtil.show("您已在PK中"); } 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 ffacaeae0..6dbcd5701 100644 --- a/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java @@ -13,7 +13,10 @@ 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.bean.SetAttentsModel; import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.utils.ToastUtil; import com.yunbao.live.R; @@ -43,9 +46,9 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == ITEM) { - ((ItemViewHolder) holder).setData(mList.get(position-1)); - }else{ - ((HeadViewHolder) holder).setData(mList.get(position)); + ((ItemViewHolder) holder).setData(mList.get(position ), position ); + } else { + ((HeadViewHolder) holder).setData(mList.get(position), position); } } @@ -69,7 +72,7 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { super(itemView); } - public void setData(RandomPkUserBean bean) { + public void setData(RandomPkUserBean bean, int position) { } } @@ -103,12 +106,33 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { ((LiveRyAnchorActivity) mContext).buildLinkMicJSON().toString() ); }); + mFollow.setOnClickListener(v -> { + RandomPkUserBean bean = (RandomPkUserBean) itemView.getTag(); + LiveNetManager.get(mContext).setAttents(bean.getId(), new HttpCallback() { + @Override + public void onSuccess(SetAttentsModel data) { + bean.setAttention(data.getIsattent()); + if ("1" .equals(data.getIsattent())) { + ToastUtil.show(R.string.following); + mOnItemClickListener.onItemClick(bean, 1); + } else { + ToastUtil.show(R.string.unfollow_cancel); + mOnItemClickListener.onItemClick(bean, 0); + } + + } + + @Override + public void onError(String error) { + + } + }); + }); } @Override - public void setData(RandomPkUserBean bean) { - super.setData(bean); - int position = getAbsoluteAdapterPosition(); + public void setData(RandomPkUserBean bean, int position) { + super.setData(bean, position); if (bean == null) { return; } diff --git a/live/src/main/java/com/yunbao/live/bean/LivePkBean.java b/live/src/main/java/com/yunbao/live/bean/LivePkBean.java index 509f66921..14dde6181 100644 --- a/live/src/main/java/com/yunbao/live/bean/LivePkBean.java +++ b/live/src/main/java/com/yunbao/live/bean/LivePkBean.java @@ -3,6 +3,7 @@ package com.yunbao.live.bean; import android.text.TextUtils; import com.alibaba.fastjson.annotation.JSONField; +import com.yunbao.common.utils.StringUtil; /** * Created by cxf on 2018/11/15. @@ -19,6 +20,20 @@ public class LivePkBean { private int level; private int levelAnchor; private int sex; + private String attention; + + @JSONField(name = "isattention") + public String getAttention() { + if(StringUtil.isEmpty(attention)){ + attention="0"; + } + return attention; + } + + @JSONField(name = "isattention") + public void setAttention(String attention) { + this.attention = attention; + } public String getUid() { return uid; @@ -56,6 +71,9 @@ public class LivePkBean { @JSONField(name = "pkuid") public String getPkUid() { + if (pkUid == null) { + pkUid = "0"; + } return pkUid; } @@ -94,7 +112,7 @@ public class LivePkBean { * 是否在连麦中 */ public boolean isLinkMic() { - return !TextUtils.isEmpty(pkUid) && !"0".equals(pkUid); + return !TextUtils.isEmpty(pkUid) && !"0" .equals(pkUid); } } diff --git a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java index bb82dda15..5fbec0e06 100644 --- a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java @@ -1,9 +1,6 @@ package com.yunbao.live.dialog; -import android.app.Dialog; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; @@ -13,7 +10,6 @@ import android.view.Window; import android.view.WindowManager; import android.widget.EditText; import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; @@ -21,18 +17,14 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.alibaba.fastjson.JSON; import com.google.android.material.tabs.TabLayout; 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.http.live.LiveNetManager; -import com.yunbao.common.manager.RandomPkManager; -import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; -import com.yunbao.common.utils.ToastUtil; -import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.WordsTypeUtil; import com.yunbao.live.R; import com.yunbao.live.adapter.RandomPkRecyclerAdapter; @@ -42,8 +34,6 @@ import com.yunbao.live.http.LiveHttpUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; /** * 自由PK @@ -137,10 +127,18 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl private void initRecycler() { helper = new DataHelper(); + helper.setStatus(DataHelper.LIST_MODEL_LIST); adapter = new RandomPkRecyclerAdapter(mContext); mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); mRecyclerView.setDataHelper(helper); mRecyclerView.initData(); + mRecyclerView.setEmptyLayoutId(R.layout.view_live_search_list_empty); + adapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(RandomPkUserBean bean, int position) { + mRecyclerView.initData(); + } + }); } @@ -166,13 +164,19 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl mSearchLayout.setVisibility(View.GONE); switch (tabStatus) { case TAB_STATUS_SEARCH: + helper.setStatus(DataHelper.LIST_MODEL_LIST); mSearchLayout.setVisibility(View.VISIBLE); mRecyclerView.setVisibility(View.VISIBLE); mRecyclerView.initData(); + mRecyclerView.setRefreshEnable(false); + mRecyclerView.showEmpty(); break; case TAB_STATUS_FOLLOW: + mSearch.setText(""); + helper.setStatus(DataHelper.LIST_MODEL_FOLLOW); mRecyclerView.setVisibility(View.VISIBLE); mRecyclerView.initData(); + mRecyclerView.setRefreshEnable(true); break; } } @@ -202,12 +206,31 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl } public class DataHelper implements CommonRefreshView.DataHelper { + private final static int LIST_MODEL_LIST = 0; + private final static int LIST_MODEL_FOLLOW = 1; + private int status; + private String searchKey; + + public void setStatus(int status) { + this.status = status; + } public void search(String key) { + if (StringUtil.isEmpty(key)) { + adapter.getList().clear(); + adapter.notifyDataSetChanged(); + mRecyclerView.showEmpty(); + searchKey = null; + return; + } + searchKey = key; LiveNetManager.get(mContext) .randomPkSearchUser(key, WordsTypeUtil.changeTraditional(key), new com.yunbao.common.http.base.HttpCallback>() { @Override public void onSuccess(List data) { + if (!data.isEmpty()) { + mRecyclerView.hideEmpty(); + } List list = new ArrayList<>(); list.add(null); list.addAll(data); @@ -228,7 +251,16 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void loadData(int p, HttpCallback callback) { - LiveHttpUtil.getLivePkList(p, callback); + if (status == LIST_MODEL_LIST) { + if (searchKey == null) { + callback.onSuccess(0, "", new String[]{}); + mRecyclerView.showEmpty(); + return; + } + search(searchKey); + } else { + LiveHttpUtil.getHomeFollow(p, callback); + } } @Override @@ -236,14 +268,14 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl Log.i(TAG, "processData: 获取数据成功"); List beans = JSON.parseArray(Arrays.toString(info), LivePkBean.class); List list = new ArrayList<>(); + list.add(null); 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"); + userBean.setAttention("1"); list.add(userBean); } return list; @@ -256,7 +288,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void onRefreshFailure() { - + mRecyclerView.showEmpty(); } @Override @@ -266,7 +298,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void onLoadMoreFailure() { - + mRecyclerView.showEmpty(); } } } diff --git a/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java b/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java index f200f9881..864ec1fe6 100644 --- a/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java +++ b/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java @@ -917,4 +917,13 @@ public class LiveHttpUtil { .execute(callback); } + /** + * 首页关注直播 + */ + public static void getHomeFollow(int p, HttpCallback callback) { + HttpClient.getInstance().get("Home.getFollow", "Home.getFollow") + .params("p", p) + .execute(callback); + } + } diff --git a/live/src/main/res/layout/view_live_search_list_empty.xml b/live/src/main/res/layout/view_live_search_list_empty.xml new file mode 100644 index 000000000..6c4319be8 --- /dev/null +++ b/live/src/main/res/layout/view_live_search_list_empty.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/mipmap-xxxhdpi/img_live_search_list_empty.png b/live/src/main/res/mipmap-xxxhdpi/img_live_search_list_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..696d55a5258f0359a43870579ec54f07ae8695ec GIT binary patch literal 30277 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 Date: Sat, 10 Dec 2022 14:55:03 +0800 Subject: [PATCH 04/11] =?UTF-8?q?update=20=E8=87=AA=E7=94=B1PK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunbao/common/http/PDLiveApi.java | 9 ++- .../common/http/live/LiveNetManager.java | 11 ++- .../live/adapter/RandomPkRecyclerAdapter.java | 27 ++++++-- .../live/dialog/FreePkDialogFragment.java | 40 +++++++++-- .../live/views/LivePushRyViewHolder.java | 14 ++++ .../layout/dialog_live_free_pk_function.xml | 64 +++++++++++++++++- .../res/mipmap-xhdpi/icon_free_pk_waring.png | Bin 0 -> 717 bytes 7 files changed, 138 insertions(+), 27 deletions(-) create mode 100644 live/src/main/res/mipmap-xhdpi/icon_free_pk_waring.png 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 090ee0e81..22c397473 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -9,7 +9,6 @@ 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; @@ -358,10 +357,10 @@ public interface PDLiveApi { @GET("/api/public/?service=Livepk.setRandomPKType") Observable>> changeRandomPkSwitch(@Query("random_pk") int pk); /** - * 获取随机PK次数 + * 获取自由PK次数 */ - @GET("/api/public/?service=Livepk.getRandomPKType") - Observable> getRandomPkNumber(); + @GET("/api/public/?service=Livepk.getActivePkNum") + Observable> getFreePkNumber(); /** * 发起随机PK */ @@ -376,7 +375,7 @@ public interface PDLiveApi { * 自由PK开始后调用接口扣掉次数 */ @GET("/api/public/?service=Livepk.setActivePkNum") - Observable> setRandomPkNum(); + Observable> setFreePkNum(); /** * 随机PK搜索用户 * @param cs 简体关键字/uid 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 d1613154e..184dd7cdd 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 @@ -4,7 +4,6 @@ import android.content.Context; import android.text.TextUtils; import android.util.Log; -import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.R; import com.yunbao.common.bean.ActiveModel; @@ -564,11 +563,11 @@ public class LiveNetManager { } /** - * 获取随机PK次数 + * 获取自由PK次数 */ - public void getRandomPkNumber(HttpCallback callback) { + public void getFreePkNumber(HttpCallback callback) { API.get().pdLiveApi(mContext) - .getRandomPkNumber() + .getFreePkNumber() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer>() { @@ -616,9 +615,9 @@ public class LiveNetManager { /** * 自由PK开始后调用接口扣掉次数 */ - public void setRandomPkNum(HttpCallback callback) { + public void setFreePkNum(HttpCallback callback) { API.get().pdLiveApi(mContext) - .setRandomPkNum() + .setFreePkNum() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer>() { 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 6dbcd5701..acf66fc1e 100644 --- a/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java @@ -17,13 +17,12 @@ import com.yunbao.common.bean.SetAttentsModel; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; -import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.utils.ToastUtil; import com.yunbao.live.R; import com.yunbao.live.activity.LiveRyAnchorActivity; +import com.yunbao.live.http.LiveHttpUtil; -import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; -import cn.rongcloud.rtc.base.RTCErrorCode; +import java.util.Arrays; public class RandomPkRecyclerAdapter extends RefreshAdapter { private static final int HEAD = 0; @@ -46,7 +45,7 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == ITEM) { - ((ItemViewHolder) holder).setData(mList.get(position ), position ); + ((ItemViewHolder) holder).setData(mList.get(position), position); } else { ((HeadViewHolder) holder).setData(mList.get(position), position); } @@ -102,9 +101,23 @@ public class RandomPkRecyclerAdapter extends RefreshAdapter { ToastUtil.show(R.string.free_pk_user_pking); return; } - ((LiveRyAnchorActivity) mContext).linkMicAnchorApply(bean.getId(), bean.getId(), - ((LiveRyAnchorActivity) mContext).buildLinkMicJSON().toString() - ); + LiveHttpUtil.getMicList(LiveRyAnchorActivity.mLiveUid, 0, new com.yunbao.common.http.HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + System.out.println("code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); + //非0认为未开通连麦权限 + if (code != 0) { + ToastUtil.show("邀请 " + bean.getUserNiceName() + " 发送成功"); + mOnItemClickListener.onItemClick(bean, -1); + ((LiveRyAnchorActivity) mContext).linkMicAnchorApply(bean.getId(), bean.getId(), + ((LiveRyAnchorActivity) mContext).buildLinkMicJSON().toString() + ); + } else { + ToastUtil.show("請先關閉語言連麥"); + } + } + }); + }); mFollow.setOnClickListener(v -> { RandomPkUserBean bean = (RandomPkUserBean) itemView.getTag(); diff --git a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java index 5fbec0e06..fa3866a2a 100644 --- a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java @@ -10,6 +10,7 @@ import android.view.Window; import android.view.WindowManager; import android.widget.EditText; import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; @@ -25,6 +26,7 @@ import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordsTypeUtil; import com.yunbao.live.R; import com.yunbao.live.adapter.RandomPkRecyclerAdapter; @@ -49,6 +51,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl private CommonRefreshView mRecyclerView; private View mSearchLayout; private EditText mSearch; + private TextView freePkNum; private ImageView mClear; private RandomPkRecyclerAdapter adapter; private DataHelper helper; @@ -75,7 +78,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl WindowManager.LayoutParams params = window.getAttributes(); window.setWindowAnimations(R.style.bottomToTopAnim); params.width = WindowManager.LayoutParams.MATCH_PARENT; - params.height = DpUtil.dp2px(330); + params.height = DpUtil.dp2px(400); params.gravity = Gravity.BOTTOM; window.setAttributes(params); } @@ -104,7 +107,9 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl mSearchLayout = findViewById(R.id.random_pk_search_layout); mSearch = (EditText) findViewById(R.id.search_edit); mClear = (ImageView) findViewById(R.id.search_clear); + freePkNum = (TextView) findViewById(R.id.free_pk_num); mClear.setOnClickListener(this); + reset.setOnClickListener(this); mSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -132,10 +137,15 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); mRecyclerView.setDataHelper(helper); mRecyclerView.initData(); + mRecyclerView.setRefreshEnable(false); mRecyclerView.setEmptyLayoutId(R.layout.view_live_search_list_empty); adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(RandomPkUserBean bean, int position) { + if (position == -1) { + dismiss(); + return; + } mRecyclerView.initData(); } }); @@ -143,6 +153,17 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl private void initData() { + LiveNetManager.get(mContext).getFreePkNumber(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(Integer data) { + freePkNum.setText("" + data); + } + + @Override + public void onError(String error) { + + } + }); } private void initTab() { @@ -198,8 +219,14 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void onClick(View v) { int id = v.getId(); - if (id == R.id.live_random_pk_switch) { - + if (id == R.id.menu_reset) { + if (helper.status == DataHelper.LIST_MODEL_LIST) { + mSearch.setText(""); + mRecyclerView.initData(); + mRecyclerView.showEmpty(); + } else { + mRecyclerView.initData(); + } } else if (id == R.id.search_clear) { mSearch.setText(""); } @@ -266,8 +293,11 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public List processData(String[] info) { Log.i(TAG, "processData: 获取数据成功"); - List beans = JSON.parseArray(Arrays.toString(info), LivePkBean.class); List list = new ArrayList<>(); + if (info == null || info.length == 0) { + return list; + } + List beans = JSON.parseArray(Arrays.toString(info), LivePkBean.class); list.add(null); for (LivePkBean bean : beans) { RandomPkUserBean userBean = new RandomPkUserBean(); @@ -283,7 +313,6 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void onRefreshSuccess(List list, int listCount) { - } @Override @@ -298,7 +327,6 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void onLoadMoreFailure() { - mRecyclerView.showEmpty(); } } } 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 b9bf5440a..2d8f67e12 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -32,9 +32,11 @@ import com.tencent.rtmp.TXLiveConstants; import com.tencent.trtc.TRTCCloudDef; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; +import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.UserBean; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; +import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.manager.RandomPkManager; import com.yunbao.common.utils.DialogUitl; @@ -311,6 +313,18 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX } mLiveRyLinkMicPkPresenter.onLinkMicToPk(userBean1); mLiveRyLinkMicPkPresenter.onLinkMicPkStart(inviteeRoomId, 3); + //单人PK,减掉次数 + LiveNetManager.get(mContext).setFreePkNum(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + + } + + @Override + public void onError(String error) { + + } + }); } } }); diff --git a/live/src/main/res/layout/dialog_live_free_pk_function.xml b/live/src/main/res/layout/dialog_live_free_pk_function.xml index 1c5b0422b..11421eed6 100644 --- a/live/src/main/res/layout/dialog_live_free_pk_function.xml +++ b/live/src/main/res/layout/dialog_live_free_pk_function.xml @@ -1,17 +1,18 @@ @@ -105,4 +106,61 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/mipmap-xhdpi/icon_free_pk_waring.png b/live/src/main/res/mipmap-xhdpi/icon_free_pk_waring.png new file mode 100644 index 0000000000000000000000000000000000000000..c415f9dcedde5b0c4704f05114bf847b35ab3d1c GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^xqn z-`%(2sfn0<**l{(4}VYg5t_Jf=fAY+)1EK0oc=QJv3|;-IU1HGTdv7Wy6{u9?nZc9 ziGGCDSHEw z4R$r(6;F=4!*`wSk=}XJIos|&{k=cnPWiuYEMNWa&9%M2f8l?N|9*L`4gc3=g*3in zw^-(yx#CdwsUrdGMy}og$&*?;I_ewl%wD!vhHqcTiDd_mWX%fOxbS92$D1hM{g;Kp zHV6xPKHRa(b$#E2u8t`ICv>B@G+bTI-QT|KrN}uYCEh)Em)&15)Bk+1k-nF8^J)Gc z65rm c?#FL?ch&^ETOX?z0ppy()78&qol`;+0Fo1vApigX literal 0 HcmV?d00001 From bfe8034b24e3ba6d813e7ddf9e1fa3df394445c6 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:55:21 +0800 Subject: [PATCH 05/11] =?UTF-8?q?update=20=E8=87=AA=E7=94=B1PK=20=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...dapter.java => FreePkRecyclerAdapter.java} | 4 ++-- .../live/dialog/FreePkDialogFragment.java | 24 +++++++++---------- .../live/dialog/RandomPkDialogFragment.java | 7 +++++- 3 files changed, 19 insertions(+), 16 deletions(-) rename live/src/main/java/com/yunbao/live/adapter/{RandomPkRecyclerAdapter.java => FreePkRecyclerAdapter.java} (98%) diff --git a/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java similarity index 98% rename from live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java rename to live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java index acf66fc1e..9b0b19aa6 100644 --- a/live/src/main/java/com/yunbao/live/adapter/RandomPkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java @@ -24,11 +24,11 @@ import com.yunbao.live.http.LiveHttpUtil; import java.util.Arrays; -public class RandomPkRecyclerAdapter extends RefreshAdapter { +public class FreePkRecyclerAdapter extends RefreshAdapter { private static final int HEAD = 0; private static final int ITEM = 2; - public RandomPkRecyclerAdapter(Context context) { + public FreePkRecyclerAdapter(Context context) { super(context); } diff --git a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java index fa3866a2a..3b75255e0 100644 --- a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java @@ -26,10 +26,9 @@ import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.StringUtil; -import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordsTypeUtil; import com.yunbao.live.R; -import com.yunbao.live.adapter.RandomPkRecyclerAdapter; +import com.yunbao.live.adapter.FreePkRecyclerAdapter; import com.yunbao.live.bean.LivePkBean; import com.yunbao.live.http.LiveHttpUtil; @@ -45,7 +44,6 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl private static final int TAB_STATUS_FOLLOW = 2; private static final String TAG = "自由PK"; - private int mLiveUid; private TabLayout tabLayout; private View reset; private CommonRefreshView mRecyclerView; @@ -53,7 +51,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl private EditText mSearch; private TextView freePkNum; private ImageView mClear; - private RandomPkRecyclerAdapter adapter; + private FreePkRecyclerAdapter adapter; private DataHelper helper; private int tabStatus; @@ -83,10 +81,6 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl window.setAttributes(params); } - public void setLiveUid(int mLiveUid) { - this.mLiveUid = mLiveUid; - } - @Override public void onDestroy() { super.onDestroy(); @@ -133,7 +127,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl private void initRecycler() { helper = new DataHelper(); helper.setStatus(DataHelper.LIST_MODEL_LIST); - adapter = new RandomPkRecyclerAdapter(mContext); + adapter = new FreePkRecyclerAdapter(mContext); mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); mRecyclerView.setDataHelper(helper); mRecyclerView.initData(); @@ -142,7 +136,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(RandomPkUserBean bean, int position) { - if (position == -1) { + if (position == -1) {//-1是退出对话框,其他重刷数据 dismiss(); return; } @@ -233,8 +227,8 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl } public class DataHelper implements CommonRefreshView.DataHelper { - private final static int LIST_MODEL_LIST = 0; - private final static int LIST_MODEL_FOLLOW = 1; + private final static int LIST_MODEL_LIST = 0;//搜索列表 + private final static int LIST_MODEL_FOLLOW = 1;//关注列表 private int status; private String searchKey; @@ -242,6 +236,10 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl this.status = status; } + /** + * 搜索 + * @param key + */ public void search(String key) { if (StringUtil.isEmpty(key)) { adapter.getList().clear(); @@ -298,7 +296,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl return list; } List beans = JSON.parseArray(Arrays.toString(info), LivePkBean.class); - list.add(null); + list.add(null);//因为有个Head头部,所以数据全部下移一位 for (LivePkBean bean : beans) { RandomPkUserBean userBean = new RandomPkUserBean(); userBean.setId(bean.getUid()); 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 3925c7375..01a45d438 100644 --- a/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java @@ -233,7 +233,9 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On }); } - + /** + * 开始匹配 + */ private void randomPk() { if (mRandomPkSwitch.getTag() == null || !(boolean) mRandomPkSwitch.getTag()) { ToastUtil.show("未开启随机PK开关"); @@ -262,6 +264,9 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On } + /** + * 恢复按钮状态 + */ private void resetPkBtn() { mPkBtnDesc.setVisibility(View.GONE); mPkBtnTitle.setText(R.string.random_pk_info_btn_start); From e28c393f88603aacc6b4c49e6e2614c76d410c43 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:55:38 +0800 Subject: [PATCH 06/11] =?UTF-8?q?update=20=E9=9A=8F=E6=9C=BAPK=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=B5=8B=E8=AF=95=E5=BB=B6=E8=BF=9F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yunbao/common/manager/RandomPkManager.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java index 2a0d75816..653e05343 100644 --- a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java +++ b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java @@ -97,9 +97,7 @@ public class RandomPkManager { for (OnRandomPkTimer onRandomPkTimer : randomPkTimer) { onRandomPkTimer.onTimer(String.format(Locale.CHINA, "%02d:%02d", min, sec)); } - if (sec == 2) { - nextPk(); - } + nextPk(); }); } }; From 3a75e24601d90be1f97eee10b128029b20435155 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:58:50 +0800 Subject: [PATCH 07/11] =?UTF-8?q?update=20=E9=9A=8F=E6=9C=BAPK=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=8B=92=E7=BB=9DPK=E5=90=8E=E7=9A=84=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yunbao/common/manager/RandomPkManager.java | 4 ++-- .../com/yunbao/live/dialog/RandomPkDialogFragment.java | 9 ++++++++- .../yunbao/live/presenter/LiveRyLinkMicPkPresenter.java | 3 +-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java index 653e05343..32fccb6c4 100644 --- a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java +++ b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java @@ -87,7 +87,6 @@ public class RandomPkManager { @Override public void run() { - status = PK_STATUS_REQUEST; sec++; if (sec % 60 == 0) { min++; @@ -114,9 +113,10 @@ public class RandomPkManager { * 对方拒绝,开始下一轮匹配 */ private void nextPk() { - if (status != PK_STATUS_REQUEST && status != PK_STATUS_REFUSE) { + if (status != PK_STATUS_DEFAULT && status != PK_STATUS_REFUSE) { return; } + status = PK_STATUS_REQUEST; LiveNetManager.get(CommonAppContext.getTopActivity()) .randomPK(new HttpCallback() { @Override 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 01a45d438..244984618 100644 --- a/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/RandomPkDialogFragment.java @@ -219,6 +219,13 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On loadDialog = null; if (data.getCode() == 0) { setSwitchBtn(!(boolean) mRandomPkSwitch.getTag()); + } else if (data.getCode() == 500) { + DialogUitl.showSimpleDialog(mContext, "您因拒绝随机PK,被限制关闭中", "随机PK可打开时间:" + data.getMsg(), false, new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + dialog.dismiss(); + } + }); } else { ToastUtil.show(data.getMsg()); } @@ -257,7 +264,7 @@ public class RandomPkDialogFragment extends AbsDialogFragment implements View.On mPkBtn.setTag(true); } } else { - ToastUtil.show("請先關閉語言連麥"); + ToastUtil.show("請先關閉語言連麥"); } } }); 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 163952706..79a163d09 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java @@ -1200,10 +1200,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { ((TextView) context).setText("隨機PK可打開時間:" + new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()).format(new Date(System.currentTimeMillis() + 7200000)));//7200000ms=120m=2h ((TextView) context).setTextSize(12); ((TextView) context).setTextColor(Color.parseColor("#999999")); - + refusePk(u); cancelBtn.setVisibility(View.GONE); confirmBtn.setOnClickListener(v -> { - refusePk(u); dialog.dismiss(); }); } From 01c657fdcb0ab243792c50f442de4f76370b9cc5 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:59:21 +0800 Subject: [PATCH 08/11] =?UTF-8?q?update=20=E9=9A=8F=E6=9C=BAPK=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=AF=B9=E6=96=B9=E4=B8=BB=E6=92=AD=E6=AD=A3=E5=9C=A8?= =?UTF-8?q?PK=E6=97=B6=E4=B8=8D=E4=BC=9A=E7=BB=A7=E7=BB=AD=E8=B0=83?= =?UTF-8?q?=E7=94=A8next=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunbao/live/activity/LiveRyAnchorActivity.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 770feab05..6d8b5f321 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -164,8 +164,8 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl ToastUtil.show("发起随机PK:" + pkUid); JSONObject msg1 = buildLinkMicJSON(); msg1.put("random_pk", "1"); - if(RandomPkManager.getInstance().isRankModel()){ - msg1.put("is_ladders","https://downs.yaoulive.com/rank_top_box.png"); + if (RandomPkManager.getInstance().isRankModel()) { + msg1.put("is_ladders", "https://downs.yaoulive.com/rank_top_box.png"); } linkMicAnchorApply(pkUid, pkUid, msg1.toString()); } @@ -604,7 +604,8 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl fragment.setArguments(bundle); fragment.show(getSupportFragmentManager(), "LiveLinkMicListDialogFragment"); } - public void openFreePkWindow(){ + + public void openFreePkWindow() { FreePkDialogFragment fragment = new FreePkDialogFragment(); Bundle bundle = new Bundle(); fragment.setArguments(bundle); @@ -1075,7 +1076,8 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl JSONObject msg1 = buildLinkMicJSON(); linkMicAnchorApply(pkUid, stream, msg1.toString()); } - public JSONObject buildLinkMicJSON(){ + + public JSONObject buildLinkMicJSON() { JSONObject msg1 = new JSONObject(); msg1.put("uid", CommonAppConfig.getInstance().getUid()); msg1.put("pkuid", CommonAppConfig.getInstance().getUid()); @@ -1122,6 +1124,9 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } else { ToastUtil.show("主播正在PK,稍後再試"); + if (RandomPkManager.getInstance().isRankModel()) { + RandomPkManager.getInstance().setPkStatus(RandomPkManager.PK_STATUS_REFUSE); + } } } } From 62c3cdcb300a161aa586a1b2177369e15158800c Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 14:59:51 +0800 Subject: [PATCH 09/11] =?UTF-8?q?update=20=E9=9A=8F=E6=9C=BAPK=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=AF=B9=E6=96=B9=E4=B8=BB=E6=92=AD=E6=AD=A3=E5=9C=A8?= =?UTF-8?q?PK=E6=97=B6=E4=B8=8D=E4=BC=9A=E7=BB=A7=E7=BB=AD=E8=B0=83?= =?UTF-8?q?=E7=94=A8next=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunbao/live/adapter/FreePkRecyclerAdapter.java | 9 +++++++++ .../com/yunbao/live/dialog/FreePkDialogFragment.java | 2 ++ .../src/main/res/layout/dialog_live_free_pk_function.xml | 4 ++-- live/src/main/res/values/strings.xml | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java index 9b0b19aa6..e520f6c9c 100644 --- a/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java @@ -27,6 +27,11 @@ import java.util.Arrays; public class FreePkRecyclerAdapter extends RefreshAdapter { private static final int HEAD = 0; private static final int ITEM = 2; + private int freePkNum;//PK次数 + + public void setFreePkNum(int freePkNum) { + this.freePkNum = freePkNum; + } public FreePkRecyclerAdapter(Context context) { super(context); @@ -101,6 +106,10 @@ public class FreePkRecyclerAdapter extends RefreshAdapter { ToastUtil.show(R.string.free_pk_user_pking); return; } + if (freePkNum == 0) { + ToastUtil.show(R.string.free_pk_num_null); + return; + } LiveHttpUtil.getMicList(LiveRyAnchorActivity.mLiveUid, 0, new com.yunbao.common.http.HttpCallback() { @Override public void onSuccess(int code, String msg, String[] info) { diff --git a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java index 3b75255e0..bcf1f15d2 100644 --- a/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/FreePkDialogFragment.java @@ -151,6 +151,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl @Override public void onSuccess(Integer data) { freePkNum.setText("" + data); + adapter.setFreePkNum(data); } @Override @@ -238,6 +239,7 @@ public class FreePkDialogFragment extends AbsDialogFragment implements View.OnCl /** * 搜索 + * * @param key */ public void search(String key) { diff --git a/live/src/main/res/layout/dialog_live_free_pk_function.xml b/live/src/main/res/layout/dialog_live_free_pk_function.xml index 11421eed6..1a46603f2 100644 --- a/live/src/main/res/layout/dialog_live_free_pk_function.xml +++ b/live/src/main/res/layout/dialog_live_free_pk_function.xml @@ -155,8 +155,8 @@ 退出過程中也有可能匹配到對手 請輸入您要pk的主播昵稱或id 對方正在PK中 + PK次數已用完 From ae020b105a9874d07dd543094800ad740194d311 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 15:00:48 +0800 Subject: [PATCH 10/11] =?UTF-8?q?update=20=E9=9A=8F=E6=9C=BAPK=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=BF=94=E5=9B=9Euid=E4=B8=BA=E7=A9=BA=E6=97=B6?= =?UTF-8?q?=E6=9C=AA=E8=BF=9B=E8=A1=8C=E4=B8=8B=E4=B8=80=E8=BD=AEPK?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yunbao/common/manager/RandomPkManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java index 32fccb6c4..1fe11f400 100644 --- a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java +++ b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java @@ -121,6 +121,14 @@ public class RandomPkManager { .randomPK(new HttpCallback() { @Override public void onSuccess(String data) { + try { + Integer.parseInt(data);//检测返回的data是否为数字uid,不是的话开始下一轮 + } catch (Exception e) { + e.printStackTrace(); + status = PK_STATUS_DEFAULT; + nextPk(); + return; + } pkUid = data; if (debugUid != null) { pkUid = data = debugUid; From e0287899f89c491f6a8cd4678c2d9557e614c04d Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 10 Dec 2022 15:01:24 +0800 Subject: [PATCH 11/11] =?UTF-8?q?update=20=E9=9A=8F=E6=9C=BAPK=20RTC?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E6=96=B0=E5=A2=9E=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunbao/common/manager/IMRTCManager.java | 152 ++++++++++++++++-- 1 file changed, 141 insertions(+), 11 deletions(-) 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); + } }