From 7ebd935eba944a3e21039022bd36710133730bb2 Mon Sep 17 00:00:00 2001 From: 18401019693 Date: Wed, 7 Dec 2022 17:59:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E4=BA=BAPk=E5=BC=80=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 - common/src/main/res/values/strings.xml | 6 + config.gradle | 6 +- .../live/activity/LiveRyAnchorActivity.java | 51 +- .../yunbao/live/event/LiveAudienceEvent.java | 34 +- .../presenter/LiveRyLinkMicPkPresenter.java | 623 ++++++++++++++---- .../yunbao/live/socket/SocketRyClient.java | 46 +- .../live/views/AbsRyLivePushViewHolder.java | 17 +- .../live/views/LivePushRyViewHolder.java | 12 +- .../live/views/LiveRyAnchorViewHolder.java | 5 +- .../main/res/drawable/background_pk_time.xml | 5 + .../main/res/layout/view_live_pk_details.xml | 222 +++++++ .../src/main/res/layout/view_live_push_ry.xml | 125 ++-- .../main/res/layout/view_ry_live_anchor.xml | 10 +- .../res/mipmap-xxxhdpi/icon_livepk_no1.png | Bin 0 -> 1420 bytes .../res/mipmap-xxxhdpi/icon_livepk_no2.png | Bin 0 -> 1595 bytes .../res/mipmap-xxxhdpi/icon_livepk_no3.png | Bin 0 -> 1746 bytes .../res/mipmap-xxxhdpi/icon_livepk_no4.png | Bin 0 -> 1526 bytes .../res/mipmap-xxxhdpi/live_pk_time_bg.png | Bin 0 -> 1306 bytes 19 files changed, 926 insertions(+), 237 deletions(-) create mode 100644 live/src/main/res/drawable/background_pk_time.xml create mode 100644 live/src/main/res/layout/view_live_pk_details.xml create mode 100644 live/src/main/res/mipmap-xxxhdpi/icon_livepk_no1.png create mode 100644 live/src/main/res/mipmap-xxxhdpi/icon_livepk_no2.png create mode 100644 live/src/main/res/mipmap-xxxhdpi/icon_livepk_no3.png create mode 100644 live/src/main/res/mipmap-xxxhdpi/icon_livepk_no4.png create mode 100644 live/src/main/res/mipmap-xxxhdpi/live_pk_time_bg.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1de4e7c45..210add6e1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,7 +78,6 @@ - diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 800292db6..b2b9d3a5c 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -965,4 +965,10 @@ 更多設置 查看更多 礼物正在获取中... + 開始PK + 剩餘次數:%s + 是否確認進行多人PK(確認後扣除1點次數)當日剩餘次數: %s + 邀請\n主播 + 結束\nPK + 時間 %s diff --git a/config.gradle b/config.gradle index 0993db55d..e4e02bc72 100644 --- a/config.gradle +++ b/config.gradle @@ -4,8 +4,8 @@ ext { buildToolsVersion: "28.0.3", minSdkVersion : 21, targetSdkVersion : 31, - versionCode : 310, - versionName : "6.4.5" + versionCode : 311, + versionName : "6.4.6" ] manifestPlaceholders = [ //正式 @@ -27,6 +27,6 @@ ext { // true表示谷歌支付 false isGooglePlay : false, //是否上报异常日志 - isUploadLog : true + isUploadLog : false ] } \ No newline at end of file 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 f9b61a9a4..590052024 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -4,8 +4,6 @@ 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.live.views.AbsRyLivePushViewHolder.mPreView; -import static com.yunbao.live.views.LivePushRyViewHolder.dr_pk_view; import static com.yunbao.live.views.LivePushRyViewHolder.rtcRoom; import static com.yunbao.live.views.LiveRyAnchorViewHolder.btn_dr_pk_nub; import static com.yunbao.live.views.LiveRyAnchorViewHolder.btn_start_dr_pk; @@ -22,7 +20,6 @@ import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -41,6 +38,8 @@ import com.yunbao.common.Constants; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LinkMicUserBean; import com.yunbao.common.bean.LiveBean; +import com.yunbao.common.bean.LiveUserGiftBean; +import com.yunbao.common.bean.MicUserBean; import com.yunbao.common.bean.UserBean; import com.yunbao.common.dialog.NotCancelableDialog; import com.yunbao.common.event.LoginInvalidEvent; @@ -48,16 +47,14 @@ import com.yunbao.common.http.CommonHttpConsts; import com.yunbao.common.http.CommonHttpUtil; 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.utils.BitmapUtil; import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DateFormatUtil; import com.yunbao.common.utils.DialogUitl; -import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; import com.yunbao.common.utils.LogUtil; -import com.yunbao.common.utils.ScreenDimenUtil; +import com.yunbao.common.utils.MicStatusManager; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; @@ -66,10 +63,7 @@ import com.yunbao.live.R; import com.yunbao.live.bean.LiveGuardInfo; import com.yunbao.live.bean.LiveKsyConfigBean; import com.yunbao.live.bean.LiveReceiveGiftBean; -import com.yunbao.common.bean.LiveUserGiftBean; -import com.yunbao.common.bean.MicUserBean; import com.yunbao.live.dialog.LiveLinkMicListDialogFragment; -import com.yunbao.live.dialog.LiveMicAnchorDialogFragment; import com.yunbao.live.dialog.LiveNewFunctionDialogFragment; import com.yunbao.live.dialog.LiveNewWishListDialogFragment; import com.yunbao.live.dialog.LiveWishListDialogFragment4Audience; @@ -86,7 +80,6 @@ import com.yunbao.live.presenter.LiveRyLinkMicPkPresenter; 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.views.LiveEndViewHolder; import com.yunbao.live.views.LiveMusicViewHolder; import com.yunbao.live.views.LiveNewReadyRyViewHolder; @@ -98,9 +91,7 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.File; -import java.util.ArrayList; import java.util.List; -import java.util.TreeMap; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; @@ -260,8 +251,9 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (code == 0) { JSONObject obj = JSONObject.parseObject(info[0]); pk_nub = Integer.valueOf(obj.getString("pk_num_day")); - btn_dr_pk_nub.setText("剩餘次數:" + pk_nub); - DialogUitl.showSimpleDialog(mContext, "是否確認進行多人PK(確認後扣除1點次數)當日剩餘次數:" + pk_nub, + + btn_dr_pk_nub.setText(String.format(getString(R.string.number_of_remaining_times), String.valueOf(pk_nub))); + DialogUitl.showSimpleDialog(mContext, String.format(getString(R.string.confirmed_to_proceed), String.valueOf(pk_nub)), false, new DialogUitl.SimpleCallback2() { @Override @@ -275,7 +267,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (code == 0) { btn_start_dr_pk.setVisibility(View.VISIBLE); - dr_pk_view.setVisibility(View.VISIBLE); +// dr_pk_view.setVisibility(View.VISIBLE); final SocketSendBean msg1 = new SocketSendBean() .param("_method_", SOCKET_LIVE_DRPK) .param("action", 9) @@ -295,18 +287,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl @Override public void onSuccess(Message message) { isDRPK = 1; - btn_start_dr_pk_view.setVisibility(View.VISIBLE); - dr_pk_view.setVisibility(View.VISIBLE); - - ScreenDimenUtil util = ScreenDimenUtil.getInstance(); - int mScreenWdith = util.getScreenWdith(); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); - params.weight = 1; - params.topMargin = DpUtil.dp2px(123); - dr_pk_view.setLayoutParams(params); - mPreView.setLayoutParams(params); - } @Override @@ -651,7 +632,6 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (mLiveRyLinkMicPkPresenter != null) { mLiveRyLinkMicPkPresenter.setSelfStream(mStream); } -// } //开始推流 if (mLivePushViewHolder != null) { @@ -1352,9 +1332,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; @@ -1365,12 +1345,23 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } break; case LINK_MIC_CLOSE: - if(mLiveRoomViewHolder!=null){ + if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.updataCleanMic(); } break; + case LEAVE_DR_ROOM: + if (mLiveRyLinkMicPkPresenter != null) { + mLiveRyLinkMicPkPresenter.leaveDRRoom(); + } + break; + case LEAVE_PK_SCORE: + if (mLiveRyLinkMicPkPresenter != null) { + mLiveRyLinkMicPkPresenter.upDataPkScore(event.getPkScores(), event.getUid(), event.getTime()); + } + break; } } + /** * 检查指定直播间连麦人数 * diff --git a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java index 9f4fdec6a..ebc8a7017 100644 --- a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java +++ b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java @@ -1,5 +1,6 @@ package com.yunbao.live.event; +import com.alibaba.fastjson.JSONArray; import com.yunbao.common.bean.ActiveModel; import com.yunbao.common.bean.AiAutomaticSpeechModel; import com.yunbao.common.bean.AnchorRecommendItemModel; @@ -23,6 +24,36 @@ public class LiveAudienceEvent extends BaseModel { private AiAutomaticSpeechModel aiAutomaticSpeechModel;//机器人消息 private boolean voicePress = false; private boolean isActivity = false;//是否展示趣味活动和增值权益 + private JSONArray pkScores; + private String uid; + private int time; + + public JSONArray getPkScores() { + return pkScores; + } + + public LiveAudienceEvent setPkScores(JSONArray pkScores) { + this.pkScores = pkScores; + return this; + } + + public String getUid() { + return uid; + } + + public LiveAudienceEvent setUid(String uid) { + this.uid = uid; + return this; + } + + public int getTime() { + return time; + } + + public LiveAudienceEvent setTime(int time) { + this.time = time; + return this; + } public boolean isActivity() { return isActivity; @@ -196,7 +227,8 @@ public class LiveAudienceEvent extends BaseModel { LINK_MIC_CLOSE(43, "主播关闭连麦房"), SOCKET_LIVE_DRPK_SET_PK_VIEW(44, "setPkview"), SOCKET_LIVE_DRPK_SET_PK_END_VIEW(45, "setPkEndview"), - ; + LEAVE_DR_ROOM(44, "结束多人PK"), + LEAVE_PK_SCORE(45, "PK排名"); private int type; private String name; 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..4a6b49f57 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java @@ -1,5 +1,14 @@ package com.yunbao.live.presenter; +import static com.lzy.okgo.utils.HttpUtils.runOnUiThread; +import static com.yunbao.common.Constants.SOCKET_LINK_MIC_PK; +import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK; +import static com.yunbao.live.activity.LiveRyAnchorActivity.isDRPK; +import static com.yunbao.live.views.LivePushRyViewHolder.contexts; +import static com.yunbao.live.views.LivePushRyViewHolder.rcrtcLiveInfo; +import static com.yunbao.live.views.LivePushRyViewHolder.rtcRoom; +import static cn.rongcloud.rtc.core.RendererCommon.ScalingType.SCALE_ASPECT_FILL; + import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -16,16 +25,23 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.tencent.trtc.TRTCCloud; import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.UserBean; +import com.yunbao.common.glide.ImgLoader; 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.utils.Bus; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.ScreenDimenUtil; @@ -38,12 +54,14 @@ import com.yunbao.live.activity.LiveRyAnchorActivity; import com.yunbao.live.bean.LivePKUserListBean; import com.yunbao.live.custom.ProgressTextView; import com.yunbao.live.event.LiveAudienceEvent; -import com.yunbao.live.interfaces.ILiveLinkMicViewHolder; import com.yunbao.live.socket.SocketRyClient; import com.yunbao.live.socket.SocketRyLinkMicPkUtil; import com.yunbao.live.socket.SocketSendBean; import com.yunbao.live.views.LiveLinkMicPkViewHolder; import com.yunbao.live.views.LivePushRyViewHolder; +import com.yunbao.live.views.LiveRoomPlayViewHolder; + +import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; import java.util.Arrays; @@ -69,21 +87,6 @@ import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.message.TextMessage; -import static cn.rongcloud.rtc.core.RendererCommon.ScalingType.SCALE_ASPECT_FILL; -import static com.lzy.okgo.utils.HttpUtils.runOnUiThread; -import static com.yunbao.common.Constants.SOCKET_LINK_MIC_PK; -import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK; -import static com.yunbao.live.activity.LiveRyAnchorActivity.isDRPK; -import static com.yunbao.live.views.AbsRyLivePushViewHolder.leave; -import static com.yunbao.live.views.AbsRyLivePushViewHolder.mPreView; -import static com.yunbao.live.views.AbsRyLivePushViewHolder.mPreView1; -import static com.yunbao.live.views.LivePushRyViewHolder.contexts; -import static com.yunbao.live.views.LivePushRyViewHolder.dr_pk_view; -import static com.yunbao.live.views.LivePushRyViewHolder.rcrtcLiveInfo; -import static com.yunbao.live.views.LivePushRyViewHolder.rtcRoom; - -import org.greenrobot.eventbus.EventBus; - //import cn.rongcloud.rtc.jni.video.RCRect; /** @@ -129,7 +132,14 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { private String mSelfStream; private int mPkTimeFromServer; public static TRTCCloud mTRTCCloud1; + private View detailsView1, detailsView2, detailsView3, detailsView4; + private LinearLayout detailsLinearLayout1, detailsLinearLayout2, detailsLinearLayout3, detailsLinearLayout4; + private LinearLayout linearGrade1, linearGrade2, linearGrade3, linearGrade4; + private TextView textPkName1, textPkName2, textPkName3, textPkName4; + private TextView textGrade1, textGrade2, textGrade3, textGrade4; + private ImageView imageGrade1, imageGrade2, imageGrade3, imageGrade4; + public LivePushRyViewHolder livePushRyViewHolder; public static List inputStreamList = new ArrayList<>(); public static List inputStreamList1 = new ArrayList<>(); @@ -179,7 +189,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { } }; - public LiveRyLinkMicPkPresenter(Context context, ILiveLinkMicViewHolder linkMicViewHolder, boolean isAnchor, View root) { + public LiveRyLinkMicPkPresenter(Context context, LiveRoomPlayViewHolder linkMicViewHolder, boolean isAnchor, View root) { mContext = context; mIsAnchor = isAnchor; mRoot = root; @@ -218,6 +228,46 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { } + public LiveRyLinkMicPkPresenter(Context context, LivePushRyViewHolder linkMicViewHolder, boolean isAnchor, View root) { + mContext = context; + mIsAnchor = isAnchor; + mRoot = root; + mPkContainer = linkMicViewHolder.getPkContainer(); + livePushRyViewHolder = linkMicViewHolder; + mPkTimeString1 = ""; + mPkTimeString2 = WordUtil.getString(R.string.live_pk_time_2); + //从本地取数据 + String pkTime = CommonAppConfig.getInstance().getAnchorPkTime(); + if (!pkTime.isEmpty()) { + try { + int time = Integer.parseInt(pkTime) * 60; + if (time > 0) { + PK_TIME_MAX = time; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + Log.d("PK_TIME_MAX", "" + PK_TIME_MAX); + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case WHAT_PK_WAIT_RECEIVE: + onApplyPkWait(); + break; + case WHAT_PK_WAIT_SEND: + onSendPkWait(); + break; + case WHAT_PK_TIME: + changePkTime(); + break; + } + } + }; + + } + public void setSocketRyClient(SocketRyClient SocketRyClient) { mSocketRyClient = SocketRyClient; } @@ -310,8 +360,8 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); params.weight = 1; params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); - LivePushRyViewHolder.mPreView.setLayoutParams(params); - LivePushRyViewHolder.mPreView1.setLayoutParams(params); + livePushRyViewHolder.mPreView.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setLayoutParams(params); } Log.i("tts", s1); @@ -463,35 +513,36 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 RCRTCVideoView remoteView = new RCRTCVideoView(mContext); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); + livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr1_preview.removeAllViews(); + livePushRyViewHolder.mPreView1.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr1_preview.addView(remoteView); + livePushRyViewHolder.mPreView1.addView(remoteView); } else if (i == 2) { //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(mContext); - ((RCRTCVideoInputStream) stream).setVideoView(remoteView); - //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr2_preview.removeAllViews(); - remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr2_preview.addView(remoteView); +// RCRTCVideoView remoteView = new RCRTCVideoView(mContext); +// ((RCRTCVideoInputStream) stream).setVideoView(remoteView); +// //todo 本demo只演示添加1个远端用户的视图 +// LivePushRyViewHolder.dr2_preview.removeAllViews(); +// remoteView.setScalingType(SCALE_ASPECT_FILL); +// LivePushRyViewHolder.dr2_preview.addView(remoteView); } else if (i == 3) { //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(mContext); - ((RCRTCVideoInputStream) stream).setVideoView(remoteView); - //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr3_preview.removeAllViews(); - remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr3_preview.addView(remoteView); +// RCRTCVideoView remoteView = new RCRTCVideoView(mContext); +// ((RCRTCVideoInputStream) stream).setVideoView(remoteView); +// //todo 本demo只演示添加1个远端用户的视图 +// LivePushRyViewHolder.dr3_preview.removeAllViews(); +// remoteView.setScalingType(SCALE_ASPECT_FILL); +// LivePushRyViewHolder.dr3_preview.addView(remoteView); } else if (i == 4) { //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(mContext); - ((RCRTCVideoInputStream) stream).setVideoView(remoteView); - //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr4_preview.removeAllViews(); - remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr4_preview.addView(remoteView); +// RCRTCVideoView remoteView = new RCRTCVideoView(mContext); +// ((RCRTCVideoInputStream) stream).setVideoView(remoteView); +// //todo 本demo只演示添加1个远端用户的视图 +// LivePushRyViewHolder.dr4_preview.removeAllViews(); +// remoteView.setScalingType(SCALE_ASPECT_FILL); +// LivePushRyViewHolder.dr4_preview.addView(remoteView); } //如果要订阅所有远端用户的流。保存所有流信息,方便后面统一订阅 inputStreamList.add(stream); @@ -615,9 +666,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { RCRTCVideoView remoteView = new RCRTCVideoView(contexts); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 -// LivePushRyViewHolder.mPreView1.removeAllViews(); + livePushRyViewHolder.mPreView1.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.mPreView1.addView(remoteView); + livePushRyViewHolder.mPreView1.addView(remoteView); } //如果要订阅所有远端用户的流。保存所有流信息,方便后面统一订阅 inputStreamList.add(stream); @@ -695,9 +746,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); params.weight = 1; params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); - LivePushRyViewHolder.mPreView.setLayoutParams(params); - LivePushRyViewHolder.mPreView1.setLayoutParams(params); - LivePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); + livePushRyViewHolder.mPreView.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); final SocketSendBean msg1 = new SocketSendBean() .param("_method_", SOCKET_LINK_MIC_PK) @@ -739,9 +790,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); params.weight = 1; params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); - LivePushRyViewHolder.mPreView.setLayoutParams(params); - LivePushRyViewHolder.mPreView1.setLayoutParams(params); - mPreView1.setVisibility(View.VISIBLE); + livePushRyViewHolder.mPreView.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); LivePushRyViewHolder.btn_close.setVisibility(View.VISIBLE); JSONObject msg1 = new JSONObject(); @@ -768,9 +819,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { RCRTCVideoView remoteView = new RCRTCVideoView(contexts); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 -// LivePushRyViewHolder.mPreView1.removeAllViews(); + livePushRyViewHolder.mPreView1.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.mPreView1.addView(remoteView); + livePushRyViewHolder.mPreView1.addView(remoteView); } //如果要订阅所有远端用户的流。保存所有流信息,方便后面统一订阅 inputStreamList.add(stream); @@ -1070,7 +1121,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { /** * 退出多人PK */ - public static void leaveDRRoom() { + public void leaveDRRoom() { Log.e("ry", "退出多人OKKK" + inputStreamList.size()); isDRPK = 0; for (int i = 0; i < inputStreamList.size(); i++) { @@ -1139,25 +1190,31 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { }); } } - new Handler(Looper.getMainLooper()).post(new Runnable() { - public void run() { - //恢复全屏画面 - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - params.topMargin = 0; - mPreView.setLayoutParams(params); - dr_pk_view.setVisibility(View.GONE); - inputStreamList.clear(); - inputStreamList1.clear(); - //删除之前其他主播的画面 - LivePushRyViewHolder.dr1_preview.removeAllViews(); - LivePushRyViewHolder.dr2_preview.removeAllViews(); - LivePushRyViewHolder.dr3_preview.removeAllViews(); - LivePushRyViewHolder.dr4_preview.removeAllViews(); - } - }); + + leaveHandler.post(leaveRunnable); } + private Handler leaveHandler = new Handler(Looper.getMainLooper()); + private Runnable leaveRunnable = new Runnable() { + @Override + public void run() { + //恢复全屏画面 + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + params.topMargin = 0; + livePushRyViewHolder.camera.setLayoutParams(params); + livePushRyViewHolder.dr_pk_view.setVisibility(View.GONE); + inputStreamList.clear(); + inputStreamList1.clear(); + //删除之前其他主播的画面 + livePushRyViewHolder.dr1_preview.removeAllViews(); + livePushRyViewHolder.dr3_preview.removeAllViews(); + livePushRyViewHolder.cameraPreview3.removeAllViews(); + leaveHandler.removeCallbacks(leaveRunnable); + + } + }; + /** * 显示申请多人PK的弹窗 */ @@ -1215,7 +1272,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { @Override public void onSuccess(int code, String msg, String[] info) { - Log.i("多人PK","code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); + Log.i("多人PK", "code = " + code + ", msg = " + msg + ", info = " + Arrays.deepToString(info)); final SocketSendBean msg1 = new SocketSendBean() .param("_method_", SOCKET_LIVE_DRPK) @@ -1246,17 +1303,12 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { Log.e("ry", "发送失敗"); } }); - if(info.length==0){ + 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); - for (int i = 0; i < users.size(); i++) { JSONObject user = users.getJSONObject(i); Log.e("ry", mApplyUid + "VS" + user.getString("id") + "列表"); @@ -1417,15 +1469,28 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { //把多人PK的View显示出来 - if (dr_pk_view.getVisibility() == View.GONE) { + if (livePushRyViewHolder.dr_pk_view.getVisibility() == View.GONE) { ScreenDimenUtil util = ScreenDimenUtil.getInstance(); int mScreenWdith = util.getScreenWdith(); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); params.weight = 1; params.topMargin = DpUtil.dp2px(123); - dr_pk_view.setLayoutParams(params); - mPreView.setLayoutParams(params); - dr_pk_view.setVisibility(View.VISIBLE); + livePushRyViewHolder.dr_pk_view.setLayoutParams(params); + livePushRyViewHolder.camera.setLayoutParams(params); + livePushRyViewHolder.dr_pk_view.setVisibility(View.VISIBLE); + livePushRyViewHolder.dr1_preview.setVisibility(View.GONE); + livePushRyViewHolder.dr2_preview.setVisibility(View.GONE); + livePushRyViewHolder.dr3_preview.setVisibility(View.GONE); + livePushRyViewHolder.dr4_preview.setVisibility(View.GONE); + detailsView1 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout1 = detailsView1.findViewById(R.id.lin_pk1); + linearGrade1 = detailsView1.findViewById(R.id.linear_grade1); + imageGrade1 = detailsView1.findViewById(R.id.image_grade1); + textGrade1 = detailsView1.findViewById(R.id.text_grade1); + imageGrade1.setTag(String.valueOf(IMLoginManager.get(mContext).getUserInfo().getId())); + livePushRyViewHolder.mPreView.addView(detailsView1); + detailsLinearLayout1.setVisibility(View.VISIBLE); + linearGrade1.setVisibility(View.GONE); } Log.e("ry", "多人接受成功" + mApplyUid); @@ -1438,37 +1503,99 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { Log.e("ry", i + "收到" + stream.getMediaType() + "实打实打算" + rcrtcOtherRoom.getRemoteUsers().get(i).getUserId()); if (stream.getMediaType() == RCRTCMediaType.VIDEO) { if (inputStreamList.size() == 0) { + livePushRyViewHolder.dr1_preview.setVisibility(View.VISIBLE); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(contexts); + RCRTCVideoView remoteView = new RCRTCVideoView(mContext); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr1_preview.removeAllViews(); + livePushRyViewHolder.dr1_preview.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr1_preview.addView(remoteView); + livePushRyViewHolder.dr1_preview.addView(remoteView); + + + LiveNetManager.get(mContext).getLiveInfo(uid, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveInfoModel data) { + detailsView2 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout2 = detailsView2.findViewById(R.id.lin_pk2); + linearGrade2 = detailsView2.findViewById(R.id.linear_grade2); + textPkName2 = detailsView2.findViewById(R.id.text_pk_name2); + imageGrade2 = detailsView2.findViewById(R.id.image_grade2); + textGrade2 = detailsView2.findViewById(R.id.text_grade2); + imageGrade2.setTag(String.valueOf(uid)); + textPkName2.setText(data.getUserNicename()); + livePushRyViewHolder.dr1_preview.addView(detailsView2); + detailsLinearLayout2.setVisibility(View.VISIBLE); + linearGrade2.setVisibility(View.GONE); + } + + @Override + public void onError(String error) { + + } + }); + } else if (inputStreamList.size() == 1) { + livePushRyViewHolder.dr3_preview.setVisibility(View.VISIBLE); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(contexts); + RCRTCVideoView remoteView = new RCRTCVideoView(mContext); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr2_preview.removeAllViews(); + livePushRyViewHolder.dr3_preview.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr2_preview.addView(remoteView); + livePushRyViewHolder.dr3_preview.addView(remoteView); + LiveNetManager.get(mContext).getLiveInfo(uid, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveInfoModel data) { + detailsView4 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout4 = detailsView4.findViewById(R.id.lin_pk4); + linearGrade4 = detailsView4.findViewById(R.id.linear_grade4); + textPkName4 = detailsView4.findViewById(R.id.text_pk_name4); + imageGrade4 = detailsView4.findViewById(R.id.image_grade4); + textGrade4 = detailsView4.findViewById(R.id.text_grade4); + imageGrade4.setTag(uid); + textPkName4.setText(data.getUserNicename()); + livePushRyViewHolder.dr3_preview.addView(detailsView4); + detailsLinearLayout4.setVisibility(View.VISIBLE); + linearGrade4.setVisibility(View.GONE); + } + + @Override + public void onError(String error) { + + } + }); } else if (inputStreamList.size() == 2) { + livePushRyViewHolder.cameraPreview3.setVisibility(View.VISIBLE); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(contexts); + RCRTCVideoView remoteView = new RCRTCVideoView(mContext); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr3_preview.removeAllViews(); + livePushRyViewHolder.cameraPreview3.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr3_preview.addView(remoteView); - } else if (inputStreamList.size() == 3) { - //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(contexts); - ((RCRTCVideoInputStream) stream).setVideoView(remoteView); - //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr4_preview.removeAllViews(); - remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr4_preview.addView(remoteView); + livePushRyViewHolder.cameraPreview3.addView(remoteView); + + LiveNetManager.get(mContext).getLiveInfo(uid, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveInfoModel data) { + detailsView3 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout3 = detailsView3.findViewById(R.id.lin_pk3); + linearGrade3 = detailsView3.findViewById(R.id.linear_grade3); + textPkName3 = detailsView3.findViewById(R.id.text_pk_name3); + imageGrade3 = detailsView3.findViewById(R.id.image_grade3); + textGrade3 = detailsView3.findViewById(R.id.text_grade3); + imageGrade3.setTag(uid); + textPkName3.setText(data.getUserNicename()); + livePushRyViewHolder.cameraPreview3.addView(detailsView3); + detailsLinearLayout3.setVisibility(View.VISIBLE); + linearGrade3.setVisibility(View.GONE); + } + + @Override + public void onError(String error) { + + } + }); } inputStreamList.add(stream); } @@ -1534,6 +1661,31 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { rcrtcOtherRoom.registerOtherRoomEventsListener(otherRoomEventsListener); new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { + + if (livePushRyViewHolder.dr_pk_view.getVisibility() == View.GONE) { + ScreenDimenUtil util = ScreenDimenUtil.getInstance(); + int mScreenWdith = util.getScreenWdith(); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); + params.weight = 1; + params.topMargin = DpUtil.dp2px(123); + livePushRyViewHolder.dr_pk_view.setLayoutParams(params); + livePushRyViewHolder.camera.setLayoutParams(params); + livePushRyViewHolder.dr_pk_view.setVisibility(View.VISIBLE); + livePushRyViewHolder.dr1_preview.setVisibility(View.GONE); + livePushRyViewHolder.dr2_preview.setVisibility(View.GONE); + livePushRyViewHolder.dr3_preview.setVisibility(View.GONE); + livePushRyViewHolder.dr4_preview.setVisibility(View.GONE); + detailsView1 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout1 = detailsView1.findViewById(R.id.lin_pk1); + linearGrade1 = detailsView1.findViewById(R.id.linear_grade1); + imageGrade1 = detailsView1.findViewById(R.id.image_grade1); + textGrade1 = detailsView1.findViewById(R.id.text_grade1); + imageGrade1.setTag(String.valueOf(IMLoginManager.get(mContext).getUserInfo().getId())); + livePushRyViewHolder.mPreView.addView(detailsView1); + detailsLinearLayout1.setVisibility(View.VISIBLE); + linearGrade1.setVisibility(View.GONE); + } + //遍历远端用户列表 for (int i = 0; i < rcrtcOtherRoom.getRemoteUsers().size(); i++) { //遍历远端用户发布的资源列表 @@ -1541,37 +1693,96 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { Log.e("ry111", stream.getMediaType() + ""); if (stream.getMediaType() == RCRTCMediaType.VIDEO) { if (inputStreamList.size() == 0) { + livePushRyViewHolder.dr1_preview.setVisibility(View.VISIBLE); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 RCRTCVideoView remoteView = new RCRTCVideoView(contexts); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr1_preview.removeAllViews(); + livePushRyViewHolder.dr1_preview.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr1_preview.addView(remoteView); + livePushRyViewHolder.dr1_preview.addView(remoteView); + LiveNetManager.get(mContext).getLiveInfo(u, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveInfoModel data) { + detailsView2 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout2 = detailsView2.findViewById(R.id.lin_pk2); + linearGrade2 = detailsView2.findViewById(R.id.linear_grade2); + textPkName2 = detailsView2.findViewById(R.id.text_pk_name2); + imageGrade2 = detailsView2.findViewById(R.id.image_grade2); + textGrade2 = detailsView2.findViewById(R.id.text_grade2); + imageGrade2.setTag(String.valueOf(u)); + textPkName2.setText(data.getUserNicename()); + livePushRyViewHolder.dr1_preview.addView(detailsView2); + detailsLinearLayout2.setVisibility(View.VISIBLE); + linearGrade2.setVisibility(View.GONE); + } + + @Override + public void onError(String error) { + + } + }); } else if (inputStreamList.size() == 1) { + livePushRyViewHolder.dr3_preview.setVisibility(View.VISIBLE); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 RCRTCVideoView remoteView = new RCRTCVideoView(contexts); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr2_preview.removeAllViews(); + livePushRyViewHolder.dr3_preview.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr2_preview.addView(remoteView); + livePushRyViewHolder.dr3_preview.addView(remoteView); + LiveNetManager.get(mContext).getLiveInfo(u, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveInfoModel data) { + detailsView4 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout4 = detailsView4.findViewById(R.id.lin_pk4); + linearGrade4 = detailsView4.findViewById(R.id.linear_grade4); + textPkName4 = detailsView4.findViewById(R.id.text_pk_name4); + imageGrade4 = detailsView4.findViewById(R.id.image_grade4); + textGrade4 = detailsView4.findViewById(R.id.text_grade4); + imageGrade4.setTag(u); + textPkName4.setText(data.getUserNicename()); + livePushRyViewHolder.dr3_preview.addView(detailsView4); + detailsLinearLayout4.setVisibility(View.VISIBLE); + linearGrade4.setVisibility(View.GONE); + } + + @Override + public void onError(String error) { + + } + }); } else if (inputStreamList.size() == 2) { + livePushRyViewHolder.cameraPreview3.setVisibility(View.VISIBLE); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 RCRTCVideoView remoteView = new RCRTCVideoView(contexts); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr3_preview.removeAllViews(); + livePushRyViewHolder.cameraPreview3.removeAllViews(); remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr3_preview.addView(remoteView); - } else if (inputStreamList.size() == 3) { - //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 - RCRTCVideoView remoteView = new RCRTCVideoView(contexts); - ((RCRTCVideoInputStream) stream).setVideoView(remoteView); - //todo 本demo只演示添加1个远端用户的视图 - LivePushRyViewHolder.dr4_preview.removeAllViews(); - remoteView.setScalingType(SCALE_ASPECT_FILL); - LivePushRyViewHolder.dr4_preview.addView(remoteView); + livePushRyViewHolder.cameraPreview3.addView(remoteView); + + LiveNetManager.get(mContext).getLiveInfo(u, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveInfoModel data) { + detailsView3 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + detailsLinearLayout3 = detailsView3.findViewById(R.id.lin_pk3); + linearGrade3 = detailsView3.findViewById(R.id.linear_grade3); + textPkName3 = detailsView3.findViewById(R.id.text_pk_name3); + imageGrade3 = detailsView3.findViewById(R.id.image_grade3); + textGrade3 = detailsView3.findViewById(R.id.text_grade3); + imageGrade3.setTag(u); + textPkName3.setText(data.getUserNicename()); + livePushRyViewHolder.cameraPreview3.addView(detailsView3); + detailsLinearLayout3.setVisibility(View.VISIBLE); + linearGrade3.setVisibility(View.GONE); + } + + @Override + public void onError(String error) { + + } + }); } inputStreamList.add(stream); @@ -1679,8 +1890,8 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { videoLayout2.setVideoStream(streams.get(i)); // RCRTCStream#MediaType 必须是Video videoLayout2.setX(480); //X 坐标 videoLayout2.setY(0); //Y 坐标 - videoLayout2.setWidth(240); // 视频窗口的宽 - videoLayout2.setHeight(360); // 视频窗口的高 + videoLayout2.setWidth(480); // 视频窗口的宽 + videoLayout2.setHeight(720); // 视频窗口的高 Log.e("ttt1112", "0" + "VS" + streams.get(i).getUserId()); } else if (i == 1) { //user3的视频流 @@ -2061,4 +2272,196 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { public void setSelfStream(String selfStream) { mSelfStream = selfStream; } + + /** + * 更新Pk分数 + */ + public void upDataPkScore(JSONArray pkScores, String uid, int time) { + String userID1 = (String) imageGrade1.getTag(); + String userID2 = (String) imageGrade2.getTag(); + String userID4 = (String) imageGrade4.getTag(); + if (livePushRyViewHolder.timeTitle.getVisibility() == View.GONE) { + RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) livePushRyViewHolder.timeTitle.getLayoutParams(); + layoutParams.topMargin = DpUtil.dp2px(123); + livePushRyViewHolder.timeTitle.setLayoutParams(layoutParams); + livePushRyViewHolder.timeTitle.setVisibility(View.VISIBLE); + } + int pkScoreSize = pkScores.size(); + if (pkScoreSize == 3) { + linearGrade1.setVisibility(View.VISIBLE); + linearGrade2.setVisibility(View.VISIBLE); + linearGrade4.setVisibility(View.VISIBLE); + //拿到原始数据 + for (int i = 0; i < pkScores.size(); i++) { + JSONObject score = pkScores.getJSONObject(i); + String userID = score.getString("id"); + long userScore = score.getLong("score"); + if (TextUtils.equals(userID, userID1)) { + textGrade1.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade1); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade1); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade1); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade1); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade1); + break; + } + } + } else if (TextUtils.equals(userID, userID2)) { + textGrade2.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade2); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade2); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade2); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade2); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade2); + break; + } + } + } else if (TextUtils.equals(userID, userID4)) { + textGrade4.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade4); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade4); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade4); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade4); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade4); + break; + } + } + } + } + } else { + String userID3 = (String) imageGrade3.getTag(); + linearGrade1.setVisibility(View.VISIBLE); + linearGrade2.setVisibility(View.VISIBLE); + linearGrade3.setVisibility(View.VISIBLE); + linearGrade4.setVisibility(View.VISIBLE); + //拿到原始数据 + for (int i = 0; i < pkScores.size(); i++) { + JSONObject score = pkScores.getJSONObject(i); + String userID = score.getString("id"); + long userScore = score.getLong("score"); + if (TextUtils.equals(userID, userID1)) { + textGrade1.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade1); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade1); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade1); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade1); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade1); + break; + } + } + } else if (TextUtils.equals(userID, userID2)) { + textGrade2.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade2); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade2); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade2); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade2); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade2); + break; + } + } + } else if (TextUtils.equals(userID, userID4)) { + textGrade4.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade4); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade4); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade4); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade4); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade4); + break; + } + } + } else if (TextUtils.equals(userID, userID3)) { + textGrade3.setText(String.valueOf(userScore)); + if (!score.containsKey("paiming")) { + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade3); + } else { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no1, imageGrade3); + break; + case 2: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no2, imageGrade3); + break; + case 3: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no3, imageGrade3); + break; + case 4: + ImgLoader.display(mContext, R.mipmap.icon_livepk_no4, imageGrade3); + break; + } + } + } + + } + } + + } + + } 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..2a5eb60ee 100644 --- a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java +++ b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java @@ -3,8 +3,6 @@ package com.yunbao.live.socket; import static com.blankj.utilcode.util.SnackbarUtils.dismiss; import static com.blankj.utilcode.util.ViewUtils.runOnUiThread; import static com.yunbao.live.activity.LiveRyAnchorActivity.isDRPK; -import static com.yunbao.live.presenter.LiveRyLinkMicPkPresenter.leaveDRRoom; -import static com.yunbao.live.views.LivePushRyViewHolder.dr_pk_view; import static com.yunbao.live.views.LivePushRyViewHolder.rtcRoom; import static com.yunbao.live.views.LiveRoomViewHolder.getIsHot; @@ -19,7 +17,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.GsonUtils; -import com.google.gson.reflect.TypeToken; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; import com.yunbao.common.Constants; @@ -278,15 +275,20 @@ public class SocketRyClient { } //收到对方同意多人PK邀请 else if (action3 == 2) { - UserBean u = new UserBean(); -// u.setUserNiceName(map.getString("uname")); - u.setId(map.getString("uid")); - mListener.onLinkDRMicPkApplyOk(u); - } else if (action3 == 6) { +// UserBean u = new UserBean(); +//// u.setUserNiceName(map.getString("uname")); +// u.setId(map.getString("uid")); +// mListener.onLinkDRMicPkApplyOk(u); + } else if (action3 == 6) {//开始Pk if (LiveRoomViewHolder.mHandler != null) { LiveRoomViewHolder.mHandler.removeCallbacksAndMessages(null); } - LiveRoomViewHolder.UpPkBar(map.getJSONArray("userlist"), mLiveUid, map.getIntValue("drpk_time")); +// LiveRoomViewHolder.UpPkBar(map.getJSONArray("userlist"), mLiveUid, map.getIntValue("drpk_time")); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.LEAVE_PK_SCORE) + .setPkScores(map.getJSONArray("userlist")) + .setUid(mLiveUid) + .setTime(map.getIntValue("drpk_time"))); if (livePushRyViewHolder == null) { // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); Bus.get().post(new LiveAudienceEvent() @@ -298,11 +300,10 @@ public class SocketRyClient { // endDRGif(); LiveRoomViewHolder.d_pk_view.setVisibility(View.GONE); if (LiveRyAnchorActivity.mLiveAnchorViewHolder != null) { - dr_pk_view.setVisibility(View.GONE); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); params.topMargin = 0; - LivePushRyViewHolder.mPreView.setLayoutParams(params); - leaveDRRoom(); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.LEAVE_DR_ROOM)); isDRPK = 0; } else { // LiveAudienceActivity.getmLivePlayViewHolder().setPkEndview(); @@ -912,7 +913,12 @@ public class SocketRyClient { mListener.onSendGift(receiveGiftBean); } if (map.getIntValue("drpk_status") == 1) { - LiveRoomViewHolder.UpPkBar(map.getJSONArray("userlist"), mLiveUid, 0); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.LEAVE_PK_SCORE) + .setPkScores(map.getJSONArray("userlist")) + .setUid(mLiveUid) + .setTime(0)); +// LiveRoomViewHolder.UpPkBar(map.getJSONArray("userlist"), mLiveUid, 0); } } @@ -1058,16 +1064,16 @@ public class SocketRyClient { break; case 5://PK时候断开连麦的回调 if (rtcRoom != null) { - if (LivePushRyViewHolder.mPreView1 != null) { - LivePushRyViewHolder.mPreView1.removeAllViews(); - LivePushRyViewHolder.mPreView1.setVisibility(View.GONE); - isDRPK = 0; - leaveDRRoom(); - } +// if (LivePushRyViewHolder.mPreView1 != null) { +// LivePushRyViewHolder.mPreView1.removeAllViews(); +// LivePushRyViewHolder.mPreView1.setVisibility(View.GONE); +// isDRPK = 0; +// leaveDRRoom(); +// } LivePushRyViewHolder.btn_close.setVisibility(View.GONE); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); params.topMargin = 0; - LivePushRyViewHolder.mPreView.setLayoutParams(params); +// LivePushRyViewHolder.mPreView.setLayoutParams(params); //断开连麦 HttpClient.getInstance().post("livepk.setliveuserout", "livepk.setliveuserout") .execute(new HttpCallback() { diff --git a/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java b/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java index b0e368932..2b1c7e4f2 100644 --- a/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java @@ -8,22 +8,16 @@ import android.view.animation.Animation; import android.view.animation.ScaleAnimation; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.RelativeLayout; +import android.widget.LinearLayout; import android.widget.TextView; - import com.yunbao.common.CommonAppConfig; -import com.yunbao.common.bean.ConfigBean; -import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; -import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.AbsViewHolder; import com.yunbao.live.R; import com.yunbao.live.interfaces.ILivePushViewHolder; import com.yunbao.live.interfaces.LivePushListener; -import cn.qqtheme.framework.util.ScreenUtils; - public class AbsRyLivePushViewHolder extends AbsViewHolder implements ILivePushViewHolder { @@ -38,9 +32,10 @@ public class AbsRyLivePushViewHolder extends AbsViewHolder implements ILivePushV protected ViewGroup mLeftContainer; protected ViewGroup mRightContainer; protected ViewGroup mPkContainer; - public static FrameLayout mPreView,mPreView1,dr1_preview,dr2_preview,dr3_preview,dr4_preview; - public static ImageView leave; + public FrameLayout mPreView, mPreView1, cameraPreview3, dr1_preview, dr2_preview, dr3_preview, dr4_preview; + public ImageView leave; protected boolean mOpenCamera;//是否选择了相机 + public LinearLayout camera; //倒计时 protected TextView mCountDownText; @@ -67,7 +62,7 @@ public class AbsRyLivePushViewHolder extends AbsViewHolder implements ILivePushV mRightContainer = (ViewGroup) findViewById(R.id.right_container); mPkContainer = (ViewGroup) findViewById(R.id.pk_container); mCameraFront = true; - String mBeautySdkType= CommonAppConfig.getInstance().getBeautySdkType(); + String mBeautySdkType = CommonAppConfig.getInstance().getBeautySdkType(); } @@ -208,7 +203,7 @@ public class AbsRyLivePushViewHolder extends AbsViewHolder implements ILivePushV } - public boolean isFlashOpen(){ + public boolean isFlashOpen() { return mFlashOpen; } 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..79bbe9d18 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -5,7 +5,6 @@ import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK; import static com.yunbao.live.activity.LiveActivity.mLiveRyLinkMicPkPresenter; import static com.yunbao.live.presenter.LiveRyLinkMicPkPresenter.inputStreamList; import static com.yunbao.live.presenter.LiveRyLinkMicPkPresenter.inputStreamList1; -import static com.yunbao.live.presenter.LiveRyLinkMicPkPresenter.leaveDRRoom; import static cn.rongcloud.rtc.base.RCRTCLiveRole.BROADCASTER; import android.app.Dialog; @@ -89,11 +88,12 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX public TencentTRTCBeautyManager tencentTRTCBeautyManager; public static Context contexts; public static TextView btn_close; - public static LinearLayout dr_pk_view; + public LinearLayout dr_pk_view; public static RCRTCRoom rtcRoom; public static RCRTCLiveInfo rcrtcLiveInfo; private ViewGroup liveActivityContainer; + public FrameLayout timeTitle; public LivePushRyViewHolder(Context context, ViewGroup parentView) { super(context, parentView); @@ -315,7 +315,9 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX @Override public void onFinishOtherRoom(String roomId, String userId) { super.onFinishOtherRoom(roomId, userId); - leaveDRRoom(); + if (mLiveRyLinkMicPkPresenter != null) { + mLiveRyLinkMicPkPresenter.leaveDRRoom(); + } } /** @@ -332,14 +334,18 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX public void init() { super.init(); mPreView = (FrameLayout) findViewById(R.id.camera_preview); + camera = (LinearLayout) findViewById(R.id.camera); mPreView1 = (FrameLayout) findViewById(R.id.camera_preview1); + cameraPreview3 = (FrameLayout) findViewById(R.id.camera_preview3); dr1_preview = (FrameLayout) findViewById(R.id.dr1_preview); dr2_preview = (FrameLayout) findViewById(R.id.dr2_preview); dr3_preview = (FrameLayout) findViewById(R.id.dr3_preview); dr4_preview = (FrameLayout) findViewById(R.id.dr4_preview); leave = (ImageView) findViewById(R.id.leave); dr_pk_view = (LinearLayout) findViewById(R.id.dr_pk_view); + timeTitle = (FrameLayout) findViewById(R.id.time_title); dr_pk_view.setVisibility(View.GONE); + cameraPreview3.setVisibility(View.GONE); btn_close = (TextView) findViewById(R.id.btn_close); mMainHandler = new Handler(Looper.getMainLooper()); btn_close.setOnClickListener(new View.OnClickListener() { diff --git a/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java index bff0273c6..72777ff11 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java @@ -4,9 +4,7 @@ import static com.yunbao.live.activity.LiveActivity.mLiveUid; import static com.yunbao.live.activity.LiveRyAnchorActivity.PKing; import static com.yunbao.live.activity.LiveRyAnchorActivity.pk_nub; import static com.yunbao.live.event.LiveAudienceEvent.LiveAudienceType.START_MESSAGE; -import static com.yunbao.live.event.LiveAudienceEvent.LiveAudienceType.WISH_LIST; import static com.yunbao.live.event.LiveAudienceEvent.LiveAudienceType.WISH_LIST_UPDATE; -import static com.yunbao.live.presenter.LiveRyLinkMicPkPresenter.leaveDRRoom; import android.content.Context; import android.graphics.drawable.Drawable; @@ -143,7 +141,8 @@ public class LiveRyAnchorViewHolder extends AbsLiveViewHolder { .execute(new HttpCallback() { @Override public void onSuccess(int code, String msg, String[] info) { - leaveDRRoom(); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.LEAVE_DR_ROOM)); PKing = false; } diff --git a/live/src/main/res/drawable/background_pk_time.xml b/live/src/main/res/drawable/background_pk_time.xml new file mode 100644 index 000000000..b76d2f6c9 --- /dev/null +++ b/live/src/main/res/drawable/background_pk_time.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/view_live_pk_details.xml b/live/src/main/res/layout/view_live_pk_details.xml new file mode 100644 index 000000000..7ba5e065e --- /dev/null +++ b/live/src/main/res/layout/view_live_pk_details.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/view_live_push_ry.xml b/live/src/main/res/layout/view_live_push_ry.xml index dd8c03d43..a430d9b42 100644 --- a/live/src/main/res/layout/view_live_push_ry.xml +++ b/live/src/main/res/layout/view_live_push_ry.xml @@ -1,33 +1,49 @@ - + android:layout_height="match_parent"> + - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + + + android:visibility="gone" /> - + android:orientation="vertical" + android:visibility="gone"> + android:layout_weight="1" + android:background="@mipmap/live_icon_vacancy" /> + android:layout_weight="1" + android:background="@mipmap/live_icon_vacancy" /> @@ -59,24 +75,23 @@ + android:background="@mipmap/live_icon_vacancy" /> + android:background="@mipmap/live_icon_vacancy" /> - - - - + android:orientation="vertical" + android:visibility="gone"> + android:layout_height="match_parent" /> + + android:layout_marginTop="130dp"> + android:layout_marginBottom="20dp" /> + android:layout_marginBottom="20dp" /> @@ -133,27 +142,27 @@ android:id="@+id/small_container" android:layout_width="0dp" android:layout_height="0dp" - android:layout_alignParentBottom="true" android:layout_alignParentRight="true" + android:layout_alignParentBottom="true" android:layout_marginBottom="120dp" - app:mfl3_ratio="0.25" - /> + app:mfl3_ratio="0.25" /> - + android:textSize="13sp" + android:visibility="gone" /> + android:visibility="gone" /> + + + + + + diff --git a/live/src/main/res/layout/view_ry_live_anchor.xml b/live/src/main/res/layout/view_ry_live_anchor.xml index 796bfaad5..e7db29e4a 100644 --- a/live/src/main/res/layout/view_ry_live_anchor.xml +++ b/live/src/main/res/layout/view_ry_live_anchor.xml @@ -36,7 +36,7 @@ @@ -44,7 +44,7 @@ android:id="@+id/btn_dr_pk_nub" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="剩餘次數:0" + android:text="@string/number_of_remaining_times" android:textColor="#ffe1e1e1" android:textSize="8sp" /> @@ -67,8 +67,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:text="邀請 - 主播" + android:text="@string/invite_anchor" android:textColor="#ffffffff" android:textSize="10sp" /> @@ -87,8 +86,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:text="結束 -PK" + android:text="@string/end_pk" android:textColor="#ffb1b1b1" android:textSize="10sp" /> diff --git a/live/src/main/res/mipmap-xxxhdpi/icon_livepk_no1.png b/live/src/main/res/mipmap-xxxhdpi/icon_livepk_no1.png new file mode 100644 index 0000000000000000000000000000000000000000..03984ca3bf9528a4d339d6e90028e557089762e0 GIT binary patch literal 1420 zcmV;71#|j|P)Px)MoC0LR9Hu)muqZPMHI*XXYSqY?$)i9QeH&_sijyEs}zaB7%4_RC;`oy7{CV< zu)IXf-P=Zk~XaK1^B_RTph+?UgK6dv$W{$acOS_MD z_imhTn>~-;{O8;`X9yk^bEClT@jD@m5|CaAjUEA0Ily-S#DMAmX&1qK0?^x_cXpt3 zTQ3nfS9r>0z}MG}gOu|iXf{C8!8~$EAA$tqDnQ4;>L7Z>0jhkzJ6nz+0r-5QAH_Wj zpzsa|V*nK7f=&A0*?BL(m!QyqyEh*ta+Jzkg97l?hS3oEdJvWZ@a2(sFw;(@xJd+K zJ88tWo^*o@0KWQ0HHbDdFzbINPIk8l*aeo2H2#A>lmAEo;A^j!v7)_T%mk3LKJo;V zM7$F{##*WxP@+ExUtbnd@z4$;T97TUvJA**CyZ_z(uljJny&zXk}&kb;_OV!juLAz zVawLrHQ@pxgI*7$Q9ivx3#t4x^(D2vk8Us)WDn8HiA+YihM$fNX0*sH`ft zD1=V3F^?*mk2uCIfO%;8uIalCdrr@v#U@s)H674$=bvY5jKQjk7Q=tVH3s z>f8YCj?pS);0fmwB|f>#r^10I5WkfYH7S(Ua}%~!gTg6m0Ll;uF2K3G0D2jy*D5~T zO?+|H7{xdM!ox%1+tE&#T!ldSO8^ms9)t+qm8yUPFm|dZ1)K|kfZal>da};1n5hZ+ zju``*riEc;BYyJ=jDP-c_0vbqN70OpE{uDGjsj;^cm{Bt2$uz9Em`O4Hxki$Pv`(- z>=q0;5#gG~G=O@9%DgGimrH6yv&cSMe+b~&o&n-rFl0Hx)6)P>*CRA$iq|l%9YefH z_UYx<0F3qODIEa5FB9OG*AN<=9{?CT$!=X11vuyxz&5&Iq5|RRO({nZZ(WYUQ4e?x zldvOdA?wtVIM{oqlMaBW%mg^K6rqv%0^oD9PQ2O`NXCL{c4ngTyBMQFtR zUc)46fcayxj=ypoK#f;V+vtX+I{+I}kKklo-T(lL8n`*j+U<0Z`=*aZ(FJR?}V?EA>Iap5aCN*sYS%cB0ElH`cRVhGi2hHu!!oM+6^z^%h|2>Rk6 zZK!dQt|%K%25a}UB?gl75x>>0ZD+>f!7{|-G598}f?hPv1AvL>$wmYN1nN7oG$)G` zFZb7evddMoU&bSmQqvL#fy}lnr3uTnz`5TUZaBZtq4@@mC>el3+Y35m1HG`{OaX9y zn1`OPW}&r!F+S&3^EO~665slST1Zds|Es?kQ|R_ZG_x3UnXm=GJ$dKI>cB^(R1Jl5 zT23XKWxfmcMKr5KPE}HT1ct{UFH2^IV!~e5Xc3HX`_pZcC| zY0dUZ_OvVB7YWA0)<{7#l^IVl(=-s56H^$@EhNwh#;-*5qayi@68u|e*r;}zw!_L* aNB;o>5HDn)%1c-P0000Px)^+`lQR9Hu)muqZP*A<1oeeOIw;~7k9Ok%sTO@soni;TgfrE-cwh!h1u6D0a4 zjVkq_D&Y@Rlu|01hPJ8tQYs{>NL5j)Ds3tnqE@7lNvK0Zz-gdB+CW<)-hqP0kFm!y zp7EV~b~R(L2ix;VbN-&a*Isv@wb!{vsAN5>rfJjV8ta%^V`VAES!vP50ucmN7!;L% zBYMmSm&VjL7;CLdBBJHsrCdP6>1$0s%Oi-a1HBixvuKWphjJ0&sG!}+;nDpAT}uqA#GtXXXt^02w?rj9_ zId!EmOWRfx>?pvCeB%msbPu|#u$aA8z zAxvU|E}!A?rYOr7gs7?VO;s7sTFwt=c;)g4`w}kcn$lWTkzvv7BWG7MyqyEd6Igt# zzrz?_0~%)X_u^?b_+dw9J+-0f!ZYJ?M7H%_qub{o!Qyc@^G-^&tohHVH6MqZ4kdH9`c*t?>o6qNhw zq*Z;QuXEu`vgAapL9)7EkQH;Co}I|D&RDj8Y5`%N;ki>WddEEm6qY;i?Y3Il>q1kh zUpaV@BjFInUrL-gQOQe^)FhQH80Vo8_Uf$9FsGsJ`ij zubqpttuIL+8ms#hcrSuJ@*?Me{eqR`qo0N)|{y;u`aCkRjwv@}Up2v7P$@f~LJlql` zc(c&ukql418{>wAaeQShc)E-#R?J5E%p0Q{5&dJS>o@o1ZYIf3mqmD>rDh7``q%{D zcyEBdv>(5J(wuT@(wWQs?a2-Cv`g+i5MSho`3taUt}a;X5%H32SrXy%ch?m95O05& z;K0=}yn@7>$(|WC4A?5f6h97uKbw$!Tvi{|kc=jFiO5&c*|bMeah~spa(~l2d<8C; zpZl!E@0i<2Wv%ke-}>o^2l1IAMgpbQ2(`ZhxnpJ*2FC{Iez2aV zGWYzgyjuj`8VcfbifKYFSnJ$>bbaVjozPRa^LG(XKbr)d`h_QLEI)kC{ zji5hQrTL@bmyQDZS*;sv|Fml$g=1Ekg+C}A8K*z@>p=uF%Sqj`fdvFC;w!?C}2id*go{|8FXR>mXrQPltd002ovPDHLkV1f+i9RL6T literal 0 HcmV?d00001 diff --git a/live/src/main/res/mipmap-xxxhdpi/icon_livepk_no3.png b/live/src/main/res/mipmap-xxxhdpi/icon_livepk_no3.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a148addde5dbf3d5d8a4f169e32703e50d7757 GIT binary patch literal 1746 zcmV;@1}*uCP)Px*j7da6R9Hu)mwSv<^%ciI=g!>Oncdl!%Pj5+2o_r?X()oUG+=qGshUD4N+qSV z39U31f!z`zHWED#CQe?TJ|(}v=Us#K~=uz>ie)(0y!uZgP{4;OFqD6YxxKx<)4d4oeGmth7Kkpf}_e;z`LmXY9eLsTOIjR zcP<-)5{POvP}Ut=i0Y#PwLnomvRC%S^IYk1(a#M->Q{s}9ukoOqcI?XP3`qHj_F%t zpbr3Mp@s*-DRM!T$3tmr*V5{3vA&po1fIO`y9q9`5!IRhkKtajLRwXyF&&LIL^iiv zyVr}rx^oRTnIg}jI#rQDk0)(A#H=)apFuceB7;M-wgh!hc3GNS8NDVFStHRiON#ww zc!$8kzMiWp$)rsx<|El{QmU1VEFMnGj?)}Jg%L~jABTH0gOI-{top2asSMpGHA$a?LlLt9Tf$2(5&X7}q9S2~!v zNQhi;9Og!ApM2Z1lOgcv>17iP!}m8-yln5a;)xWsUE_FQ+%G9HiwE`2RhRe99;NZ? zM!qq;Drfo#ay(@Ef9RE{Ecw?Gv${I`IEJo5=@-AAM2cIi@3466FDUkhNZ3hE_q5QN z>Y_4G&aiMT0bd|%aP>Qn;of+jU{Q|Z5qi|o2cH7tWTx19O4_c66*N>=orrw{Yzww(;ED$7?yyMwXhgR=U|!Xx&Yn{*QdAkh^!p1@=V4xw#UIos3Y~OT!s5rJ{Rw!QdeS`{Yx{uBpFU05ka7&8 zUq9Uc&wmeU`B%D{9 zqI+cF(G^F4+w-FP0BqYPl}b`W6`Q8~A=`|SPKx@&Yv?LUzKBQk&5uFd-Q8+kwV1-@LlprE*OWM0#XIU@Y!%3K(T zh|fy#-Qrt0-2D*}EW+nEGuiJEvwAw&Ie9&`r8i~?Y&fxxW6Z0b&Z05*bGrKsFEsDtWc&gRx~|E zn_(f6BN0XR+fHhc%zw8bWI65@&|jmMi~6!URfnNYfTyOerNk`B{F`)=w8hVncGCom z07FY6n8ww?v;X7)wl+VHFK`Jz;1ZIe^2o$#m0L1hRe4sbEqO>4Z3rnY13Z)u{_O(RB*MkJ&Sm*2cL>#1ivTiGkw zw6~W<%rvi}{l~J`>2Pf-i~!|+lOn^1FZ1e9lIjw3Y&z@&uHnzN<{aVQUe!@m|H4nB zsa^!UA9oyBHbGQg0v&n1eW3unck_GGFzufooU!ff6@0Io@BF>hZSU*a=Ly9t#6v6<37k)bX!wn!V|CU(BF){|PTI ziv-}0C_e$b`I`3~*+;p9(2CEzr8maC@DEV({Od3tIR~WrEjn3 z=aKh7MNa^)`BYy#JbUZ$T(9JUyqdDNA!LV!Z07*qoM6N<$g7*w)GXMYp literal 0 HcmV?d00001 diff --git a/live/src/main/res/mipmap-xxxhdpi/icon_livepk_no4.png b/live/src/main/res/mipmap-xxxhdpi/icon_livepk_no4.png new file mode 100644 index 0000000000000000000000000000000000000000..a9879e4f93c8a803fba4baccc29e518abb0fff90 GIT binary patch literal 1526 zcmVPx)ut`KgR9Hu?mwRkebri?H=l0%P+V0V{-Ed$~3^AyGkRg(o49Et8K%77zJ`fW@ zLJ&!qfCMvR5m^XK0iBTH25NxGLL@^E7+*8BrudM(vx5s!h{rwm;tH>(|KZXT84bZ zAJ*zK7vu#9U^Dk*rqJ?5%^*!vroe)6V2lLN-@rx(<1!I`WEKZCQuk%f$@Lq>=n;Uc zs#JfYdnS|gE`R|5tY)ws?}-@90e~(@phYQjMxUbCe@P@MKwa6vY=z_^iKMvE5Z>=Mb?76=B_H;0DR>&IV7kA%=!N_aHoV&gc(~Es9wjs(KkE$O#ryF>BvBZ zqLmEf0x+$QJ_70hDl}bP+&L2+L2i`ov)iKbW+Ix|8^__syNJrsggTeV0;@FzlHB92 zMF?VX+Wd*7?KKexU}kFEcwiZrR{+sj!LiW;^Av@C&bp7Z4f`8X3IQkoPYHY_%G<*NhEM+7?lw^Qobv zDp!)|I5V5BK5)AhX)ojz znS~YzLVq9)+4H7%sQOO)0{f6bunufZc`O4>Umblo<_^DUqKnEaJ@P?5nx+2>=}ve*^_S~>?YsJ@(_cPpLEP~3ai})l8k2>G4G{@6=ih*Jjo~{Aq~=qq3}$*S0d3y zKO(-SxVoe&@eUwGjz8;xmUw4`E?tLq;tW)aF@Rv+PQLdx{>;Er$pEyF26@bIxF?S4 z-JZ5-1^&2%=Bh(bO)f+Xd_Z@KN=u2bpeFz&Z^VBB@b9dK%EADgK_nGWUD5giiD^%= zvf&oo)^$CXZY^0mSWzrT z01Qrs8-oz-Be#n})a8VG_SA$TY}~R3{rV}8V&mE1MnO#9OR&x&F8s*Wpz;PVzuwnN zNZ6SU_nc{o02RAox2c9TLqM1r%UzD<4ROZ$rE8uAcn5&qjj%TN;S5)Ifbwr(x3zYK zf&3#0OJ2r@ORltDNW4{Qec<9I2%c?b+4;Se=0xiA`H*8LBY@!f%LsjU1Xi`@y(drv z#Pi%G?`&-yhHc_sSezM_#X*2gkL7k7oh;C8c5vIkp-2QuC-`*yz-|T}?n@?mrORMQI4WfEO4eHMt#+FPR-Q4#QlI@;0U)gdaqH~8PeM$m zgoH(z>%C_>yX=;%7{r}{PYfenF9##%KExLws)VdB^Q>ESy{o?-ckAZD<(Z0*R|8@y z0B7tD)i)T{0lEz#N;O^GFkrJcn9SbLDSN$YLv1u4;Au>p59UXDF)MT?I!8b?1G_w* z7N0fxO77LFt`!#AQd+G2bqfy@LVAY4BbYFR1X7ux6W{~$pG4A60ysn#{h~*^TSuEW cN6fPJFAFVAekm6>FaQ7m07*qoM6N<$f=@TWcK`qY literal 0 HcmV?d00001 diff --git a/live/src/main/res/mipmap-xxxhdpi/live_pk_time_bg.png b/live/src/main/res/mipmap-xxxhdpi/live_pk_time_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b07adf791622d5461b9d89b4ddc1f1427376169b GIT binary patch literal 1306 zcmV+#1?BpQP)Px()Ja4^RCr$PnoVp}RTzff_s+D?A4`l)X~0B;gaRdEBbcZmaifX4Wgyrp0jEuD zOJ~{{T!4l_V;53rpg$p{3m5Ln!XFeN;t$k9q_L6ELPx2A4YVc2R1AQjjT&eTf;|Q_(Du|) zNdT~J;}`nKp;55L0P8kspslHo$L>JG5rO8Uw7` zd`tsvO*s{W!Phm=8UuR_Fj)Gv?$Gws)Ab|_mLAtYyFLc?2w<@6ga+E4db*y3!Ln~O z(5{bxJpwe)_S8~I5`F04nQ3~c>D18q$? z6@-DUr_KW6RTXN$1_KOiJ9QF*1vbDagS!m~IKsfT&d)$BcDD+px5U68Yy6!b16XYd zkYc#mfUu7>{;u}{yy|8T%5IH;uUJ$5;~Rhzum(v%Tx@^`xc#lJ5_+7&F1DcPmKcz@ zDQ9){&x<%V-bSF%5-!DXp#cE~Br~Ie+e^>pA=lXhV!aDJD6%aE1gCM!?52pYrs|v@ zhUI`bw(u#3n+(vvk;4aD*0nQ%U0M0lI*)kj0eRF-8kE%*1H9odzVkrqv*#uPU0d6g z6&s!3Y=AYkAS#D@3{ZGJV}7)%vGMunM4%H_RaMVRq|}RG>NEE!QPOlZKtd3ccbgAA zb3DN?72b-9?u<;Y(=KFjy29zY-DiLzy<;)sZ);mSen+5h@6zX=1LPwBS?*J##A#?C z3h&VZ}87l4_tQ z##iq6wUDvVgCba>J9Rph-=?+Fkhmt^c{QzjpB%UsSyHEhwYB|=M`1z)Ul4)ECRNJv za2p^I2ich^*x%S#^vC^Hn^d3^lT?KI^Sv;Bh_m5-lj`?sV9pHC9ErhcZ`)Ti<1_Pr z?~`<(Cx7^M`0{HsQVk$~`qBBE0q8_(;P&(Jbpy5>+Q0m0Dne2YbR;6q;En#(j@R)C zE1V%d%%) Q&;S4c07*qoM6N<$g46wLa{vGU literal 0 HcmV?d00001