diff --git a/common/src/main/java/com/yunbao/common/Constants.java b/common/src/main/java/com/yunbao/common/Constants.java index fabbf6967..2e8a5c808 100644 --- a/common/src/main/java/com/yunbao/common/Constants.java +++ b/common/src/main/java/com/yunbao/common/Constants.java @@ -172,6 +172,7 @@ public class Constants { public static final String RECOMMEND_CARD_NOTIFY = "recommendCardNotify";//推荐卡通知消息 public static final String STAR_CHALLENGE_UPDATE = "starChallengeUpdate";//星级助力 public static final String AI_AUTOMATIC_SPEECH = "aiAutomaticSpeech";//机器人助手 + public static final String AI_AUTOMATIC_SPEECH_LIVE = "aiAutomaticSpeechNew";//机器人助手 public static final String STAR_CHALLENGE_UPGRADE_NOTIFY = "starChallengeUpgradeNotify";//星级挑战成功 public static final String SUPER_VISION = "supervision";//超级发言警告 public static final String PK_RANK_UPDATE = "RankingRankUpdate";//PK排位赛更新数据 @@ -190,6 +191,7 @@ public class Constants { public static final String LOVE_CHECK = "LoveCheck";//热度卡消息 public static final String TRUMPET_NOTIFY = "TrumpetNotify";//全栈喇叭 public static final String LuckyAngel = "LuckyCheck";//幸运天使 + public static final String Lucky100Check = "Lucky100Check";//幸运天使 public static final int SOCKET_WHAT_CONN = 0; public static final int SOCKET_WHAT_DISCONN = 2; diff --git a/common/src/main/java/com/yunbao/common/bean/EnterRoomInfoModel.java b/common/src/main/java/com/yunbao/common/bean/EnterRoomInfoModel.java index 87e6e14c4..1a6af9aa9 100644 --- a/common/src/main/java/com/yunbao/common/bean/EnterRoomInfoModel.java +++ b/common/src/main/java/com/yunbao/common/bean/EnterRoomInfoModel.java @@ -1,6 +1,7 @@ package com.yunbao.common.bean; import com.google.gson.annotations.SerializedName; +import com.yunbao.common.utils.StringUtil; import java.util.List; @@ -475,6 +476,9 @@ public class EnterRoomInfoModel extends BaseModel { } public String getIsconnection() { + if(StringUtil.isEmpty(isconnection)){ + isconnection="0"; + } return isconnection; } diff --git a/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java b/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java index b8245fe3f..e0228b8d0 100644 --- a/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java +++ b/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java @@ -28,6 +28,8 @@ public class EnterRoomNewModel extends BaseModel { private String isUseHotCard = "";//是否使用热度卡 @SerializedName("liveRoomActivity") private List liveRoomActivityModels = new ArrayList<>();//活动列表 + @SerializedName("clarityType") + private int clarityType; public List getLiveRoomActivityModels() { return liveRoomActivityModels; @@ -109,4 +111,28 @@ public class EnterRoomNewModel extends BaseModel { this.isUseHotCard = isUseHotCard; return this; } + + public int getClarityType() { + return clarityType; + } + + public void setClarityType(int clarityType) { + this.clarityType = clarityType; + } + + @Override + public String toString() { + return "EnterRoomNewModel{" + + "liveInfo=" + liveInfo + + ", enterRoomInfo=" + enterRoomInfo + + ", rankHour=" + rankHour + + ", newPeopleTask=" + newPeopleTask + + ", wishList=" + wishList + + ", guardUserAvatar=" + guardUserAvatar + + ", activeList=" + activeList + + ", isUseHotCard='" + isUseHotCard + '\'' + + ", liveRoomActivityModels=" + liveRoomActivityModels + + ", clarityType=" + clarityType + + '}'; + } } diff --git a/common/src/main/java/com/yunbao/common/bean/LiveBean.java b/common/src/main/java/com/yunbao/common/bean/LiveBean.java index b5567764b..7dbafa055 100644 --- a/common/src/main/java/com/yunbao/common/bean/LiveBean.java +++ b/common/src/main/java/com/yunbao/common/bean/LiveBean.java @@ -493,6 +493,44 @@ public class LiveBean implements Parcelable { @Override public String toString() { - return "uid: " + uid + " , userNiceName: " + userNiceName + " ,playUrl: " + pull; + return "LiveBean{" + + "uid='" + uid + '\'' + + ", avatar='" + avatar + '\'' + + ", avatarThumb='" + avatarThumb + '\'' + + ", userNiceName='" + userNiceName + '\'' + + ", title='" + title + '\'' + + ", city='" + city + '\'' + + ", stream='" + stream + '\'' + + ", pull='" + pull + '\'' + + ", thumb='" + thumb + '\'' + + ", nums='" + nums + '\'' + + ", sex=" + sex + + ", distance='" + distance + '\'' + + ", levelAnchor=" + levelAnchor + + ", type=" + type + + ", typeVal='" + typeVal + '\'' + + ", goodNum='" + goodNum + '\'' + + ", gameAction=" + gameAction + + ", game='" + game + '\'' + + ", islive='" + islive + '\'' + + ", isTop='" + isTop + '\'' + + ", pk_avatar_thumb='" + pk_avatar_thumb + '\'' + + ", landscape=" + landscape + + ", hot_num='" + hot_num + '\'' + + ", content_pic_size_one='" + content_pic_size_one + '\'' + + ", content_pic_size_two='" + content_pic_size_two + '\'' + + ", content_pic_size_three='" + content_pic_size_three + '\'' + + ", is_week='" + is_week + '\'' + + ", img='" + img + '\'' + + ", url='" + url + '\'' + + ", drpk_status='" + drpk_status + '\'' + + ", is_rong=" + is_rong + + ", isattention='" + isattention + '\'' + + ", recommendCardtype='" + recommendCardtype + '\'' + + ", recommendCardIconSizeTwo='" + recommendCardIconSizeTwo + '\'' + + ", recommendCardIconSizeThree='" + recommendCardIconSizeThree + '\'' + + ", params=" + params + + ", mWeekList=" + mWeekList + + '}'; } } diff --git a/live/src/main/java/com/yunbao/live/bean/LiveRoomTypeBean.java b/common/src/main/java/com/yunbao/common/bean/LiveRoomTypeBean.java similarity index 97% rename from live/src/main/java/com/yunbao/live/bean/LiveRoomTypeBean.java rename to common/src/main/java/com/yunbao/common/bean/LiveRoomTypeBean.java index ab4370e58..8151367e3 100644 --- a/live/src/main/java/com/yunbao/live/bean/LiveRoomTypeBean.java +++ b/common/src/main/java/com/yunbao/common/bean/LiveRoomTypeBean.java @@ -1,7 +1,7 @@ -package com.yunbao.live.bean; +package com.yunbao.common.bean; import com.yunbao.common.Constants; -import com.yunbao.live.R; +import com.yunbao.common.R; import java.util.ArrayList; import java.util.List; diff --git a/common/src/main/java/com/yunbao/common/bean/LiveStetUpStatusModel.java b/common/src/main/java/com/yunbao/common/bean/LiveStetUpStatusModel.java new file mode 100644 index 000000000..a4a98aa0d --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveStetUpStatusModel.java @@ -0,0 +1,49 @@ +package com.yunbao.common.bean; + +import android.text.TextUtils; + +import com.google.gson.annotations.SerializedName; + +public class LiveStetUpStatusModel extends BaseModel { + + @SerializedName("wishList") + private String wishList; + @SerializedName("ai_state") + private String aiState; + + /** + * wishList 1设置 0 未设置 + * + * @return + */ + public boolean getWishListState() { + return TextUtils.equals(wishList, "1"); + } + + /** + * aiState 1打开机器人 0 未设置 + * + * @return + */ + public boolean getAiStateState() { + return TextUtils.equals(aiState, "1"); + } + + public String getWishList() { + return wishList; + } + + public LiveStetUpStatusModel setWishList(String wishList) { + this.wishList = wishList; + return this; + } + + public String getAiState() { + return aiState; + } + + public LiveStetUpStatusModel setAiState(String aiState) { + this.aiState = aiState; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/UserBean.java b/common/src/main/java/com/yunbao/common/bean/UserBean.java index 0134c53a5..8294e97ff 100644 --- a/common/src/main/java/com/yunbao/common/bean/UserBean.java +++ b/common/src/main/java/com/yunbao/common/bean/UserBean.java @@ -6,6 +6,7 @@ import android.text.TextUtils; import com.alibaba.fastjson.annotation.JSONField; import com.google.gson.annotations.SerializedName; +import com.yunbao.common.utils.StringUtil; /** * Created by cxf on 2017/8/14. @@ -116,6 +117,9 @@ public class UserBean implements Parcelable { } public String getIs_bind() { + if(StringUtil.isEmpty(is_bind)){ + is_bind="0"; + } return is_bind; } diff --git a/common/src/main/java/com/yunbao/common/event/AnchorInfoEvent.java b/common/src/main/java/com/yunbao/common/event/AnchorInfoEvent.java new file mode 100644 index 000000000..e15712cc0 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/AnchorInfoEvent.java @@ -0,0 +1,47 @@ +package com.yunbao.common.event; + +public class AnchorInfoEvent { + protected boolean clear; + protected String id; + protected String userNiceName; + protected String avatar; + + public AnchorInfoEvent(boolean clears,String ids, String userNiceNames,String avatars) { + clear = clears; + id = ids; + userNiceName = userNiceNames; + avatar = avatars; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserNiceName() { + return userNiceName; + } + + public void setUserNiceName(String userNiceName) { + this.userNiceName = userNiceName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public boolean isClear() { + return clear; + } + + public void setClear(boolean clear) { + this.clear = clear; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/LivePushRyEvent.java b/common/src/main/java/com/yunbao/common/event/LivePushRyEvent.java new file mode 100644 index 000000000..7ead2123a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LivePushRyEvent.java @@ -0,0 +1,6 @@ +package com.yunbao.common.event; + +import com.yunbao.common.bean.BaseModel; + +public class LivePushRyEvent extends BaseModel { +} diff --git a/common/src/main/java/com/yunbao/common/glide/ImgLoader.java b/common/src/main/java/com/yunbao/common/glide/ImgLoader.java index 15ef5591a..4d7882868 100644 --- a/common/src/main/java/com/yunbao/common/glide/ImgLoader.java +++ b/common/src/main/java/com/yunbao/common/glide/ImgLoader.java @@ -239,6 +239,7 @@ public class ImgLoader { public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { if (callback != null) { callback.onLoadSuccess(resource); + } } diff --git a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java index ccc77a95f..88af69746 100644 --- a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java +++ b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java @@ -17,6 +17,7 @@ import com.yunbao.common.activity.ErrorActivity; import com.yunbao.common.bean.ConfigBean; import com.yunbao.common.event.FollowEvent; import com.yunbao.common.interfaces.CommonCallback; +import com.yunbao.common.manager.APKManager; import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.NewLevelManager; import com.yunbao.common.utils.L; @@ -199,6 +200,24 @@ public class CommonHttpUtil { JSONArray levelArray = obj.getJSONArray("levelanchor_new"); new NewLevelManager(context).UpAnchorDataLevel(levelArray.toJSONString()); } + if (obj.containsKey("apk_ver")) { + APKManager.get().setApkVer(obj.getString("apk_ver")); + } + if (obj.containsKey("apk_url")) { + APKManager.get().setAPKUrl(obj.getString("apk_url")); + } + if (obj.containsKey("apk_des")) { + APKManager.get().setAPKDes(obj.getString("apk_des")); + } + if (obj.containsKey("google_isup")) { + APKManager.get().setAPKGoogleIsUp(obj.getInteger("google_isup")); + } + if (obj.containsKey("isup")) { + APKManager.get().setAPKIsUp(obj.getInteger("isup")); + } + if (obj.containsKey("clarity")) { + IMLoginManager.get(context).setClarity(obj.getString("clarity")); + } } catch (Exception e) { String error = "info[0]:" + info[0] + "\n\n\n" + "Exception:" + e.getClass() + "---message--->" + e.getMessage(); ErrorActivity.forward("GetConfig接口返回数据异常", error); 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 1edb1f6ca..dee1a5e78 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -15,6 +15,7 @@ import com.yunbao.common.bean.LinkMicUserBeanV2; import com.yunbao.common.bean.LiveAiRobotBean; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; +import com.yunbao.common.bean.LiveStetUpStatusModel; import com.yunbao.common.bean.MsgSwitchDetailModel; import com.yunbao.common.bean.NewPeopleInfo; import com.yunbao.common.bean.NobleRankHideUserListModel; @@ -522,11 +523,23 @@ public interface PDLiveApi { /** * 机器人修改话术 */ - @GET("/api/public/?service=Live.updateAiAutomaticSpeech ") + @GET("/api/public/?service=Live.updateAiAutomaticSpeech") Observable>> updateAiAutomaticSpeech( @Query("type") String type, @Query("id") String id, @Query("content") String content ); + /** + * 开播获取机器人状态和心愿单状态 + */ + @GET("/api/public/?service=Live.getLiveStetUpStatus") + Observable> getLiveStetUpStatus( + @Query("liveuid") String liveUid + ); + + @GET("/api/public/?service=live.jieshuDRPK") + Observable> jieshuDRPK( + @Query("roomid") String roomId, + @Query("uid") String 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 d83668492..a1aa6c25d 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 @@ -17,6 +17,7 @@ import com.yunbao.common.bean.LinkMicUserBeanV2; import com.yunbao.common.bean.LiveAiRobotBean; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; +import com.yunbao.common.bean.LiveStetUpStatusModel; import com.yunbao.common.bean.NobleRankHideUserListModel; import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; @@ -1034,6 +1035,46 @@ public class LiveNetManager { }).isDisposed(); } + /** + * 开播设置数据获取 + * + * @param liveUid + * @param callback + */ + public void getLiveStetUpStatus(String liveUid, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getLiveStetUpStatus(liveUid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel liveStetUpStatusModelResponseModel) throws Exception { + if (callback != null) { + callback.onSuccess(liveStetUpStatusModelResponseModel.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void jieshuDRPK(String uID) { + API.get().pdLiveApi(mContext) + .jieshuDRPK(uID, uID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(baseModelResponseModel -> { + + }, throwable -> { + + }).isDisposed(); + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/manager/APKManager.java b/common/src/main/java/com/yunbao/common/manager/APKManager.java new file mode 100644 index 000000000..d32f8211d --- /dev/null +++ b/common/src/main/java/com/yunbao/common/manager/APKManager.java @@ -0,0 +1,73 @@ +package com.yunbao.common.manager; + +import android.content.Context; + +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.manager.base.BaseCacheManager; +import com.yunbao.common.utils.VersionUtil; + +public class APKManager extends BaseCacheManager { + private static APKManager manager; + private final String APK_VER = "apk_ver"; + private final String APK_URL = "apk_url"; + private final String APK_DES = "apk_des"; + private final String APK_IS_UP = "isup"; + private final String APK_GOOGLE_IS_UP = "google_isup"; + + public APKManager(Context context) { + super(context); + } + + /** + * 获取单利 + * + * @return + */ + public static APKManager get() { + if (null == manager) { + manager = new APKManager(CommonAppContext.sInstance.getBaseContext()); + } + return manager; + } + + public void setAPKUrl(String apkUrl) { + put(APK_URL, apkUrl); + } + + public void setAPKDes(String apkDes) { + put(APK_DES, apkDes); + } + + public String getAPKUrl() { + return getString(APK_URL); + } + + public String getAPKDes() { + return getString(APK_DES); + } + + public void setApkVer(String apkVer) { + put(APK_VER, apkVer); + } + + public boolean getApkVerNew() { + + return VersionUtil.isLatest(getString(APK_VER)); + } + + public void setAPKIsUp(int apkIsUp) { + put(APK_IS_UP, apkIsUp); + } + + public void setAPKGoogleIsUp(int apkGoogleIsUp) { + put(APK_GOOGLE_IS_UP, apkGoogleIsUp); + } + + public int getApkIsUp() { + return getInt(APK_IS_UP, 0); + } + + public int getAPKGoogleIsUp() { + return getInt(APK_GOOGLE_IS_UP, 0); + } +} diff --git a/common/src/main/java/com/yunbao/common/manager/IMLoginManager.java b/common/src/main/java/com/yunbao/common/manager/IMLoginManager.java index edd422440..301dc6302 100644 --- a/common/src/main/java/com/yunbao/common/manager/IMLoginManager.java +++ b/common/src/main/java/com/yunbao/common/manager/IMLoginManager.java @@ -7,7 +7,6 @@ import android.text.TextUtils; import androidx.annotation.NonNull; -import com.cosmos.baseutil.app.AppContext; import com.google.gson.Gson; import com.lzf.easyfloat.EasyFloat; import com.yunbao.common.CommonAppContext; @@ -39,8 +38,43 @@ public class IMLoginManager extends BaseCacheManager { private final String IS_FLOAT = "is_float"; private final String IS_HINT = "is_hint"; private final String IS_HINT2 = "is_hint2"; + private final String SELECT_CLARITY = "selectClarity"; + private final String CLARITY = "clarity"; + public void setClarity(String clarity) { + put(CLARITY, clarity); + } + + /** + * 1080p开播分辨率:clarity 0关闭 1开启 + * + * @return + */ + public boolean getClarity() { + return TextUtils.equals(getString(CLARITY), "1"); + } + + /** + * 设置清晰度 + * + * @param selectClarity + */ + public void setSelectClarity(int selectClarity) { + put(SELECT_CLARITY, selectClarity); + } + + /** + * 获取清晰度 + * + * @return + */ + public int getSelectClarity() { + + return getInt(SELECT_CLARITY, 0); + + } + public boolean isHint() { return 1 == getInt(IS_HINT, 0); } 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 a48203591..cd4a847b5 100644 --- a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java +++ b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java @@ -37,6 +37,8 @@ public class RandomPkManager { private String pkUid;//对方房间ID public static String debugUid; private RankPkInfoBean rankPkInfoBean;//排位赛信息 + private int exitTimer;//退出倒计时 + private TimerTask exitTask = null;//退出任务 Handler handler = new Handler(Looper.getMainLooper()); private RandomPkManager() { @@ -118,6 +120,8 @@ public class RandomPkManager { return String.format(Locale.CHINA, "%02d:%02d", min, sec); } + private Runnable pkRunnable = this::next; + /** * 对方拒绝,开始下一轮匹配 */ @@ -125,11 +129,11 @@ public class RandomPkManager { if (status != PK_STATUS_DEFAULT && status != PK_STATUS_REFUSE) { return; } - new Handler(Looper.getMainLooper()).postDelayed(this::next, 5000); + handler.postDelayed(pkRunnable, 5000); } private void next() { - if (task==null) { + if (task == null) { return; } status = PK_STATUS_REQUEST; @@ -243,19 +247,9 @@ public class RandomPkManager { } } - private int exitTimer; - /** - * 退出匹配 - */ - public void exitPk() { - if (status == PK_STATUS_EXIT_ING) { - return; - } - callEndPkStart(); - status = PK_STATUS_EXIT_ING; - exitTimer = 11; - new Timer().schedule(new TimerTask() { + private TimerTask createExitTask() { + return new TimerTask() { Handler handler = new Handler(Looper.getMainLooper()); @@ -269,10 +263,25 @@ public class RandomPkManager { end(); callEndPkSuccess(); cancel(); + exitTask = null; } }); } - }, 0, 1000); + }; + } + + /** + * 退出匹配 + */ + public void exitPk() { + if (status == PK_STATUS_EXIT_ING) { + return; + } + callEndPkStart(); + status = PK_STATUS_EXIT_ING; + exitTimer = 11; + exitTask = createExitTask(); + new Timer().schedule(exitTask, 0, 1000); } /** @@ -387,6 +396,23 @@ public class RandomPkManager { return exitTimer + ""; } + /** + * 清空状态,下播时调用 + */ + public void release() { + status = PK_STATUS_REQUEST; + if (task != null) { + task.cancel(); + } + if (exitTask != null) { + exitTask.cancel(); + } + randomPkTimer.clear(); + rankPkInfoBean = null; + pkUid = null; + handler.removeCallbacks(pkRunnable); + } + public static abstract class OnRandomPkTimer { /** diff --git a/common/src/main/java/com/yunbao/common/manager/imrongcloud/MessageIMManager.java b/common/src/main/java/com/yunbao/common/manager/imrongcloud/MessageIMManager.java index b95bb4e37..734cae4ce 100644 --- a/common/src/main/java/com/yunbao/common/manager/imrongcloud/MessageIMManager.java +++ b/common/src/main/java/com/yunbao/common/manager/imrongcloud/MessageIMManager.java @@ -98,6 +98,9 @@ public class MessageIMManager { public void getSystemMessages() { systemNumber = 0; IMLoginModel userInfo = IMLoginManager.get(mContext).getUserInfo(); + if (userInfo == null) { + return; + } HttpClient.getInstance().get("Message.getLists", "getImUserInfo") .params("uid", userInfo.getId()) .params("token", userInfo.getToken()) diff --git a/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java b/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java index 40f76b35d..d298abdac 100644 --- a/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java +++ b/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java @@ -6,10 +6,15 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Point; +import android.net.TrafficStats; import android.text.format.Formatter; import android.util.DisplayMetrics; import android.view.WindowManager; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; + /** * 设备通用类 */ @@ -97,10 +102,40 @@ public class DeviceUtils { return mi.lowMemory; } - public static String getMemory(Context context) { + /** + * 获取可用内存 格式化 + */ + public static String getMemoryToFormat(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); am.getMemoryInfo(mi); return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化 } + + /** + * 获取可用内存 + */ + public static String getMemory(Context context) { + ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); + am.getMemoryInfo(mi); + return mi.availMem + ""; + } + + private static long lastTotalRxBytes = 0; + private static long lastTimeStamp = 0; + + /** + * 获取上传网速 + */ + public static long getNetSpeed(Context context) { + long nowTotalRxBytes = TrafficStats.getUidTxBytes(context.getApplicationInfo().uid) == TrafficStats.UNSUPPORTED ? 0 : (TrafficStats.getTotalTxBytes() / 1024); + long nowTimeStamp = System.currentTimeMillis(); + long speed = ((nowTotalRxBytes - lastTotalRxBytes) * 1000 / (nowTimeStamp - lastTimeStamp));//毫秒转换 + lastTimeStamp = nowTimeStamp; + lastTotalRxBytes = nowTotalRxBytes; + return speed; + } + + } \ No newline at end of file diff --git a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java index 9ddea94c3..1ad1b3e7e 100644 --- a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java +++ b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java @@ -4,6 +4,8 @@ import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.os.Handler; +import android.os.Looper; import android.text.InputFilter; import android.text.InputType; import android.text.Spanned; @@ -68,6 +70,21 @@ public class DialogUitl { } return dialog; } + public static void showToast(Context context,String content,long delayMillis){ + Dialog dialog = new Dialog(context, R.style.dialog); + dialog.setContentView(R.layout.dialog_toast); + dialog.setCancelable(false); + dialog.setCanceledOnTouchOutside(false); + if (!TextUtils.isEmpty(content)) { + TextView titleView = (TextView) dialog.findViewById(R.id.text); + if (titleView != null) { + titleView.setGravity(Gravity.CENTER); + titleView.setText(content); + } + } + dialog.show(); + new Handler(Looper.getMainLooper()).postDelayed(dialog::dismiss,delayMillis); + } public static Dialog loadingDialog(Context context) { @@ -494,8 +511,12 @@ public class DialogUitl { } } }; - btnConfirm.setOnClickListener(listener); - btnCancel.setOnClickListener(listener); + if(btnConfirm!=null) { + btnConfirm.setOnClickListener(listener); + } + if(btnCancel!=null) { + btnCancel.setOnClickListener(listener); + } dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { diff --git a/common/src/main/java/com/yunbao/common/utils/ToastUtil.java b/common/src/main/java/com/yunbao/common/utils/ToastUtil.java index cb4fb343f..d8245a7ab 100644 --- a/common/src/main/java/com/yunbao/common/utils/ToastUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/ToastUtil.java @@ -1,10 +1,16 @@ package com.yunbao.common.utils; +import android.app.Dialog; +import android.content.Context; +import android.graphics.Color; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.widget.TextView; import android.widget.Toast; import com.yunbao.common.CommonAppContext; @@ -38,6 +44,39 @@ public class ToastUtil { show(WordUtil.getString(res)); } + /** + * 显示黑底白字的提示 + * + * @param res 内容 + * @param delayMillis 显示时间 毫秒 + */ + public static void showStyle(int res, long delayMillis) { + showStyle(WordUtil.getString(res), delayMillis); + } + + /** + * 显示黑底白字的提示 + * + * @param content 内容 + * @param delayMillis 显示时间 毫秒 + */ + public static void showStyle(String content, long delayMillis) { + Dialog dialog = new Dialog(CommonAppContext.getTopActivity(), R.style.dialog); + dialog.setContentView(R.layout.dialog_toast); + dialog.setCancelable(false); + dialog.setCanceledOnTouchOutside(false); + if (!TextUtils.isEmpty(content)) { + TextView titleView = (TextView) dialog.findViewById(R.id.text); + if (titleView != null) { + titleView.setTextColor(Color.WHITE); + titleView.setGravity(Gravity.CENTER); + titleView.setText(content); + } + } + dialog.show(); + new Handler(Looper.getMainLooper()).postDelayed(dialog::dismiss, delayMillis); + } + public static void show(String s) { if (TextUtils.isEmpty(s)) { return; diff --git a/common/src/main/java/com/yunbao/common/views/APKUpdateCustomPopup.java b/common/src/main/java/com/yunbao/common/views/APKUpdateCustomPopup.java new file mode 100644 index 000000000..c84312521 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/APKUpdateCustomPopup.java @@ -0,0 +1,221 @@ +package com.yunbao.common.views; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.FileProvider; + +import com.lxj.xpopup.core.CenterPopupView; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.R; +import com.yunbao.common.manager.APKManager; +import com.yunbao.common.utils.APKDownloadUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +/** + * apk更新弹窗 + */ +public class APKUpdateCustomPopup extends CenterPopupView { + private TextView updateText, versionImmediateUse; + private LinearLayout updateLine; + private ProgressBar progressBar; + private Activity mContext; + private boolean mInside; + + public APKUpdateCustomPopup(@NonNull Activity context, boolean inside) { + super(context); + mContext = context; + mInside = inside; + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.apk_update_custom_popup; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + initView(); + initData(); + } + + private void initData() { + + } + + private void initView() { + if (!mInside) { + if (!CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getAPKGoogleIsUp() == 1) { + findViewById(R.id.dialog_close).setVisibility(GONE); + } + if (!CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getAPKGoogleIsUp() == 1) { + findViewById(R.id.dialog_close).setVisibility(GONE); + } + } + updateText = findViewById(R.id.update_text); + versionImmediateUse = findViewById(R.id.version_immediate_use); + updateLine = findViewById(R.id.update_line); + progressBar = findViewById(R.id.progressBar); + versionImmediateUse.setVisibility(VISIBLE); + updateLine.setVisibility(GONE); + updateText.setText(APKManager.get().getAPKDes()); + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.dialog_close), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (mInside){ + dismiss(); + }else { + if (CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getAPKGoogleIsUp() != 1) { + dismiss(); + } + if (!CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getApkIsUp() != 1) { + dismiss(); + } + } + + } + } + ); + ViewClicksAntiShake.clicksAntiShake(versionImmediateUse, new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + //不是谷歌 + if (!CommonAppConfig.IS_GOOGLE_PLAY) { + versionImmediateUse.setVisibility(GONE); + updateLine.setVisibility(VISIBLE); + downloadAPK(mContext, APKManager.get().getAPKUrl(), new APKDownloadUtil.OnUpdateListener() { + @Override + public void updateFailure(int code, String error) { + ToastUtil.show(error); + } + }); + } else { + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); + mContext.startActivity(i); + mContext.finish(); + } + + } + }); + } + + public void downloadAPK(Activity context, String url, APKDownloadUtil.OnUpdateListener listener) { + Request request = new Request.Builder().url(url) + .addHeader("Accept-Encoding", "identity").build(); + File downloadFile = new File(context.getCacheDir(), "update_app.apk"); + try { + if (!downloadFile.exists() + && !downloadFile.createNewFile()) { + return; + } + } catch (IOException e) { + e.printStackTrace(); + } + new OkHttpClient().newCall(request).enqueue(new Callback() { + private Handler handler = new Handler(); + + @Override + public void onFailure(Call call, IOException e) { + // 下载失败 + handler.post(() -> { + listener.updateFailure(-1, e.getMessage()); + dismiss(); + }); + } + + @Override + public void onResponse(Call call, Response response) { + Looper.prepare(); + byte[] buf = new byte[2048]; + int len; + try (InputStream inputStream = response.body().byteStream(); + FileOutputStream outputStream = new FileOutputStream(downloadFile)) { + long total = response.body().contentLength(); + long sum = 0; + while ((len = inputStream.read(buf)) != -1) { + outputStream.write(buf, 0, len); + sum += len; + int progress = (int) (sum * 1.0f / total * 100); + // 下载中 + handler.post(new Runnable() { + @Override + public void run() { + progressBar.setProgress(progress); + } + }); + } + outputStream.flush(); + //启动安装app + installApk(context, downloadFile, context.getPackageName() + ".fileprovider"); + handler.post(() -> dismiss()); + } catch (Exception e) { + e.printStackTrace(); + new Handler().post(() -> { + listener.updateFailure(-1, e.getMessage()); + dismiss(); + }); + } + } + }); + } + + /** + * 安装apk + * + * @param context + * @param file + */ + public void installApk(Context context, File file, String authority) { + Intent intent = getInstallIntent(context, file, authority); + context.startActivity(intent); + } + + /** + * 获取安装Intent + * + * @param context + * @param file + * @param authority + * @return + */ + public Intent getInstallIntent(Context context, File file, String authority) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addCategory(Intent.CATEGORY_DEFAULT); + Uri uriData; + String type = "application/vnd.android.package-archive"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + uriData = FileProvider.getUriForFile(context, authority, file); + } else { + uriData = Uri.fromFile(file); + } + intent.setDataAndType(uriData, type); + return intent; + } +} diff --git a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java index ab2199dbd..9abff4007 100644 --- a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java +++ b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java @@ -127,8 +127,10 @@ public class CustomDrawerPopupView extends DrawerPopupView { ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.system_notice), new ViewClicksAntiShake.ViewClicksCallBack() { @Override public void onViewClicks() { -// dismiss(); - + dismiss(); + if (callBack != null) { + callBack.changeVideo(); + } } @@ -196,6 +198,8 @@ public class CustomDrawerPopupView extends DrawerPopupView { void systemNotice(); + void changeVideo(); + void online(); void reportLayout(); diff --git a/common/src/main/java/com/yunbao/common/views/HintCustomPopup.java b/common/src/main/java/com/yunbao/common/views/HintCustomPopup.java new file mode 100644 index 000000000..874c3d1db --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/HintCustomPopup.java @@ -0,0 +1,70 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.text.TextUtils; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.core.CenterPopupView; +import com.yunbao.common.R; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class HintCustomPopup extends CenterPopupView { + private String title, contest; + + public HintCustomPopup(@NonNull Context context, String title, String contest) { + super(context); + this.title = title; + this.contest = contest; + } + + public HintCustomPopup(@NonNull Context context) { + super(context); + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.hint_custom_popup; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + TextView titleText = findViewById(R.id.title); + TextView contestText = findViewById(R.id.contest); + if (!TextUtils.isEmpty(title)) { + titleText.setText(title); + } + if (!TextUtils.isEmpty(contest)) { + contestText.setText(contest); + } + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_ok), () -> { + if (callBack != null) { + callBack.onSure(); + } + dismiss(); + }); + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_cancel), () -> { + if (callBack != null) { + callBack.onCancel(); + } + dismiss(); + }); + } + + private HintCustomCallBack callBack; + + public HintCustomPopup setCallBack(HintCustomCallBack callBack) { + this.callBack = callBack; + return this; + } + + public interface HintCustomCallBack { + void onSure(); + + void onCancel(); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java b/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java index 8ad8f995a..25a8e22da 100644 --- a/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java @@ -4,6 +4,7 @@ import android.content.Context; import android.text.TextUtils; import android.view.View; import android.widget.EditText; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -17,14 +18,17 @@ import com.yunbao.common.utils.ToastUtil; */ public class InputCustomPopup extends CenterPopupView { private String message = ""; + private int title = R.string.dialog_tip; - public InputCustomPopup(@NonNull Context context, String message) { + public InputCustomPopup(@NonNull Context context, String message, int title) { super(context); this.message = message; + this.title = title; } - public InputCustomPopup(@NonNull Context context) { + public InputCustomPopup(@NonNull Context context,int title) { super(context); + this.title = title; } // 返回自定义弹窗的布局 @@ -38,7 +42,9 @@ public class InputCustomPopup extends CenterPopupView { protected void onCreate() { super.onCreate(); EditText content = findViewById(R.id.content); + TextView titleText = findViewById(R.id.title); content.setText(message); + titleText.setText(title); findViewById(R.id.btn_cancel).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { diff --git a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java new file mode 100644 index 000000000..f4ed86164 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java @@ -0,0 +1,256 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.os.Handler; +import android.text.format.Formatter; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.utils.DeviceUtils; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.DoubleSummaryStatistics; +import java.util.List; + +public class LiveClarityCustomPopup extends BottomPopupView implements View.OnClickListener { + public static final int BAN_720 = 1; + public static final int BAN_1080 = 2; + private int selectClarity = 1; + private RelativeLayout lineSd, lineHd, lineFhd; + private ImageView iconSd, iconHd, iconFhd; + private ImageView titleSDImg, titleHDImg, titleFHDImg; + private TextView titleSDText, titleHDText, titleFHDText, mTips; + private int banSelect; + private boolean isUser = false; + + public int getSelectClarity() { + return selectClarity; + } + + /** + * @param banSelect 禁止选项,{@link #BAN_720} 禁止高清和超高清。 {@link #BAN_1080} 禁止超高清 + * @param isUser 是否为观众,true 观众,false 主播 + */ + public LiveClarityCustomPopup(@NonNull Context context, int selectClarity, int banSelect, boolean isUser) { + super(context); + this.banSelect = banSelect; + if (selectClarity == -1) { + selectClarity = 0; + } + this.isUser = isUser; + if (banSelect == BAN_720) { + selectClarity = 0; + } else if (banSelect == BAN_1080 && selectClarity == 3) { + selectClarity = 2; + } + this.selectClarity = selectClarity; + } + + public LiveClarityCustomPopup(@NonNull Context context, int selectClarity) { + super(context); + if (selectClarity == -1) { + selectClarity = 0; + } + this.selectClarity = selectClarity; + } + + public LiveClarityCustomPopup(@NonNull Context context) { + super(context); + } + + @Override + public void onClick(View v) { + + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_clarity; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + initView(); + initDate(); + } + + private void initView() { + lineSd = findViewById(R.id.line_sd); + lineHd = findViewById(R.id.line_hd); + lineFhd = findViewById(R.id.line_fhd); + iconSd = findViewById(R.id.icon_sd); + iconHd = findViewById(R.id.icon_hd); + iconFhd = findViewById(R.id.icon_fhd); + titleSDImg = findViewById(R.id.sd); + titleHDImg = findViewById(R.id.hd); + titleFHDImg = findViewById(R.id.fhd); + titleSDText = findViewById(R.id.sd_text); + titleHDText = findViewById(R.id.hd_text); + titleFHDText = findViewById(R.id.fhd_text); + mTips = findViewById(R.id.tips); + if (isUser) { + mTips.setVisibility(INVISIBLE); + } + selectClarity(selectClarity); + //流畅 + ViewClicksAntiShake.clicksAntiShake(lineSd, () -> { + selectClarity = 0; + selectClarity(selectClarity); + dismiss(); + }); + //高清 + ViewClicksAntiShake.clicksAntiShake(lineHd, () -> { + if (lineHd.getTag() != null) { + if (isUser) {//用户端 + ToastUtil.show(R.string.live_user_ban_hd); + } else {//主播端 + ToastUtil.show(R.string.function_is_suspended); + } + return; + } + String memorg = formateFileSize(Long.parseLong(DeviceUtils.getMemory(getContext()))); + if ((Double.parseDouble(memorg) > 7 && netAverage > 100) || isUser) { + selectClarity = 1; + selectClarity(selectClarity); + dismiss(); + } else { + new XPopup.Builder(getContext()) + .asCustom(new HintCustomPopup(getContext(), getContext().getString(R.string.net_hint), getContext().getString(R.string.net_hint2)).setCallBack(new HintCustomPopup.HintCustomCallBack() { + @Override + public void onSure() { + selectClarity = 1; + selectClarity(selectClarity); + dismiss(); + } + + @Override + public void onCancel() { + + } + })) + .show(); + } + + + }); + //超高清 + ViewClicksAntiShake.clicksAntiShake(lineFhd, () -> { + if (lineFhd.getTag() != null) { + if (isUser) {//用户端 + ToastUtil.show(R.string.live_user_ban_fhd); + } else {//主播端 + ToastUtil.show(R.string.function_is_suspended); + } + return; + } + new XPopup.Builder(getContext()) + .asCustom(new HintCustomPopup(getContext()).setCallBack(new HintCustomPopup.HintCustomCallBack() { + @Override + public void onSure() { + selectClarity = 2; + selectClarity(selectClarity); + dismiss(); + } + + @Override + public void onCancel() { + + } + })) + .show(); + + + }); + if (banSelect == BAN_720) { + lineFhd.setTag(false); + lineHd.setTag(false); + titleHDImg.setImageAlpha(40); + titleFHDImg.setImageAlpha(40); + titleHDText.setAlpha(0.2f); + titleFHDText.setAlpha(0.2f); + } else if (banSelect == BAN_1080) { + lineFhd.setTag(false); + titleFHDText.setAlpha(0.2f); + titleFHDImg.setImageAlpha(20); + } + } + + //调用系统函数,字符串转换 long -String KB/MB + private String formateFileSize(long size) { + String fileSize = Formatter.formatFileSize(getContext(), size); + return fileSize.substring(0, fileSize.length() - 3); + } + + /** + * 状态选择 + * + * @param selectClarity + */ + private void selectClarity(int selectClarity) { + switch (selectClarity) { + case 0: + lineSd.setSelected(true); + lineHd.setSelected(false); + lineFhd.setSelected(false); + iconSd.setVisibility(VISIBLE); + iconHd.setVisibility(GONE); + iconFhd.setVisibility(GONE); + break; + case 1: + lineSd.setSelected(false); + lineHd.setSelected(true); + lineFhd.setSelected(false); + iconSd.setVisibility(GONE); + iconHd.setVisibility(VISIBLE); + iconFhd.setVisibility(GONE); + break; + case 2: + lineSd.setSelected(false); + lineHd.setSelected(false); + lineFhd.setSelected(true); + iconSd.setVisibility(GONE); + iconHd.setVisibility(GONE); + iconFhd.setVisibility(VISIBLE); + break; + } + } + + private Handler netHandler = new Handler(); + private Runnable netRunnable = new Runnable() { + @Override + public void run() { + if (netSpeeds.size() < 11) { + netSpeeds.add(DeviceUtils.getNetSpeed(getContext())); + netHandler.postDelayed(netRunnable, 100); + } else { + long min = Collections.min(netSpeeds); + long max = Collections.max(netSpeeds); + + DoubleSummaryStatistics statistics = netSpeeds.stream().mapToDouble(Number::doubleValue).summaryStatistics(); + netAverage = statistics.getAverage(); + Log.e("网络速度", "最大值:" + max + " 最小值:" + min + " 平均值:" + netAverage); + } + + } + }; + private List netSpeeds = new ArrayList<>(); + private double netAverage = 0; + + private void initDate() { + netHandler.postDelayed(netRunnable, 100); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java new file mode 100644 index 000000000..784fd7004 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java @@ -0,0 +1,178 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.core.CenterPopupView; +import com.yunbao.common.R; +import com.yunbao.common.bean.LiveClassBean; +import com.yunbao.common.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveStetUpStatusModel; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class LiveOpenCustomPopup extends CenterPopupView { + //清晰度 + private int selectClarity; + //直播类型 + private LiveClassBean classBean; + //房间类型 + private LiveRoomTypeBean liveRoomTypeBean; + + private TextView textClarity, textLiveRoomType, textLiveClass, textLiveWishlist, textRobot; + + public LiveOpenCustomPopup setClassBean(LiveClassBean classBean) { + this.classBean = classBean; + textLiveClass.setText(classBean.getName()); + return this; + } + + public LiveOpenCustomPopup setLiveRoomTypeBean(LiveRoomTypeBean liveRoomTypeBean) { + this.liveRoomTypeBean = liveRoomTypeBean; + textLiveRoomType.setText(liveRoomTypeBean.getName()); + return this; + } + + public LiveOpenCustomPopup(@NonNull Context context, int selectClarity, LiveClassBean classBean, LiveRoomTypeBean liveRoomTypeBean) { + super(context); + this.selectClarity = selectClarity; + this.classBean = classBean; + this.liveRoomTypeBean = liveRoomTypeBean; + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.view_live_open; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + initView(); + initDate(); + } + + private void initView() { + textClarity = findViewById(R.id.text_clarity); + textLiveRoomType = findViewById(R.id.text_live_room_type); + textLiveClass = findViewById(R.id.text_live_class); + textLiveWishlist = findViewById(R.id.text_live_wishlist); + textRobot = findViewById(R.id.text_robot); + if (classBean != null) { + textLiveClass.setText(classBean.getName()); + } + if (liveRoomTypeBean != null) { + textLiveRoomType.setText(liveRoomTypeBean.getName()); + } + setSelectClarity(selectClarity); + //關閉彈窗 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_cancel), () -> dismiss()); + //開播 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_ok), () -> { + if (callBack != null) { + callBack.startLive(liveRoomTypeBean, classBean); + } + dismiss(); + }); + //設置直播類型 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_live_class), () -> { + if (callBack != null) { + callBack.openLiveClass(classBean); + } + }); + //設置清晰度 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_clarity), () -> { + if (callBack != null) { + callBack.selectClarity(selectClarity); + } + }); + //設置房間類型 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_live_room_type), () -> { + if (callBack != null) { + callBack.openLiveRoomType(liveRoomTypeBean); + } + }); + //打開心願單 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_live_wishlist), () -> { + if (callBack != null) { + callBack.openWishlist(); + } + }); + //設置機器人 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_robot), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (callBack != null) { + callBack.openRobot(); + } + } + }); + } + + public void setSelectClarity(int selectClarity) { + switch (selectClarity) { + case 0: + textClarity.setText(R.string.standard_clear); + break; + case 1: + textClarity.setText(R.string.high_definition); + break; + case 2: + textClarity.setText(R.string.ultra_hd); + break; + } + } + + public void initDate() { + LiveNetManager.get(getContext()) + .getLiveStetUpStatus(String.valueOf(IMLoginManager.get(getContext()).getUserInfo().getId()), + new HttpCallback() { + @Override + public void onSuccess(LiveStetUpStatusModel data) { + textLiveWishlist.setText(data.getWishListState() ? R.string.do_set : R.string.not_set); + textRobot.setText(data.getAiStateState() ? R.string.robot_yes : R.string.robot_no); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + + + } + + private LiveOpenCallBack callBack; + + public LiveOpenCustomPopup setCallBack(LiveOpenCallBack callBack) { + this.callBack = callBack; + return this; + } + + public interface LiveOpenCallBack { + //開播 + void startLive(LiveRoomTypeBean liveRoomTypeBean, LiveClassBean classBean); + + //選擇清晰度 + void selectClarity(int selectClarity); + + //打開機器人 + void openRobot(); + + //打開直播間類型 + void openLiveRoomType(LiveRoomTypeBean liveRoomTypeBean); + + //打開直播類型 + void openLiveClass(LiveClassBean classBean); + + //打開心願單 + void openWishlist(); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java index 953e9c7fe..7a84549d7 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java @@ -111,21 +111,28 @@ public class LiveRobotMessageCustomPopup extends BottomPopupView { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { - // 修改助手名字 - LiveNetManager.get(getContext()) - .setAiRobotDate("ai_time", robotNameSetting.getText().toString(), new HttpCallback() { - @Override - public void onSuccess(HttpCallbackModel data) { - robotNameSetting.setVisibility(GONE); - robotTime.setVisibility(VISIBLE); - robotTime.setText(robotNameSetting.getText().toString()); - } + String time = robotNameSetting.getText().toString(); + int timeInt = Integer.parseInt(time); + if (timeInt > 5) { + // 修改助手名字 + LiveNetManager.get(getContext()) + .setAiRobotDate("ai_time", time, new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + robotNameSetting.setVisibility(GONE); + robotTime.setVisibility(VISIBLE); + robotTime.setText(robotNameSetting.getText().toString()); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } else { + ToastUtil.show(R.string.robot_minimum_interval); + } - @Override - public void onError(String error) { - ToastUtil.show(error); - } - }); } return false; @@ -136,7 +143,7 @@ public class LiveRobotMessageCustomPopup extends BottomPopupView { @Override public void onClick(View v) { new XPopup.Builder(getContext()) - .asCustom(new InputCustomPopup(getContext()).setListener(new InputCustomPopup.InputCustomListener() { + .asCustom(new InputCustomPopup(getContext(), R.string.automatic_message_sending).setListener(new InputCustomPopup.InputCustomListener() { @Override public void onConfirm(String text) { //添加消息语 diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java index 93e61f37c..a76fcadef 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java @@ -82,7 +82,7 @@ public class LiveRobotSayHelloCustomPopup extends BottomPopupView { @Override public void onClick(View v) { new XPopup.Builder(getContext()) - .asCustom(new InputCustomPopup(getContext()).setListener(new InputCustomPopup.InputCustomListener() { + .asCustom(new InputCustomPopup(getContext(), R.string.automatic_greeting_setting).setListener(new InputCustomPopup.InputCustomListener() { @Override public void onConfirm(String text) { //添加消息语 diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java index f954a8ce7..e8e195c49 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java @@ -1,7 +1,6 @@ package com.yunbao.common.views; import android.content.Context; -import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; @@ -24,8 +23,6 @@ import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.utils.ToastUtil; -import java.util.List; - public class LiveRobotSettingCustomPopup extends BottomPopupView implements View.OnClickListener { private static String TAG = "AI机器人"; private EditText robotNameSetting; @@ -36,6 +33,10 @@ public class LiveRobotSettingCustomPopup extends BottomPopupView implements View private int robotStateInt = 1; + public int getRobotStateInt() { + return robotStateInt; + } + public LiveRobotSettingCustomPopup(@NonNull Context context) { super(context); } diff --git a/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java b/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java index f182a0c12..c14de79f2 100644 --- a/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java +++ b/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java @@ -53,7 +53,7 @@ public class RobotMessageViewHolder extends RecyclerView.ViewHolder { @Override public void onClick(View v) { new XPopup.Builder(itemView.getContext()) - .asCustom(new InputCustomPopup(itemView.getContext(), message.getContent()).setListener(new InputCustomPopup.InputCustomListener() { + .asCustom(new InputCustomPopup(itemView.getContext(), message.getContent(), R.string.automatic_message_sending).setListener(new InputCustomPopup.InputCustomListener() { @Override public void onConfirm(String text) { LiveNetManager.get(itemView.getContext()) diff --git a/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java b/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java index 359f7ba1a..75ee2e293 100644 --- a/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java +++ b/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java @@ -53,7 +53,7 @@ public class RobotSayHelloViewHoler extends RecyclerView.ViewHolder { @Override public void onClick(View v) { new XPopup.Builder(itemView.getContext()) - .asCustom(new InputCustomPopup(itemView.getContext(), message.getContent()).setListener(new InputCustomPopup.InputCustomListener() { + .asCustom(new InputCustomPopup(itemView.getContext(), message.getContent(), R.string.automatic_greeting_setting).setListener(new InputCustomPopup.InputCustomListener() { @Override public void onConfirm(String text) { LiveNetManager.get(itemView.getContext()) diff --git a/common/src/main/res/drawable/backgroud_live_open_lfet.xml b/common/src/main/res/drawable/backgroud_live_open_lfet.xml new file mode 100644 index 000000000..d35f34c4c --- /dev/null +++ b/common/src/main/res/drawable/backgroud_live_open_lfet.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/backgroud_live_open_right.xml b/common/src/main/res/drawable/backgroud_live_open_right.xml new file mode 100644 index 000000000..314b5166d --- /dev/null +++ b/common/src/main/res/drawable/backgroud_live_open_right.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_apk_update_btn.xml b/common/src/main/res/drawable/bg_apk_update_btn.xml new file mode 100644 index 000000000..57831085d --- /dev/null +++ b/common/src/main/res/drawable/bg_apk_update_btn.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_btn_definition.xml b/common/src/main/res/drawable/bg_btn_definition.xml new file mode 100644 index 000000000..f4a1222ee --- /dev/null +++ b/common/src/main/res/drawable/bg_btn_definition.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/progress_bg.xml b/common/src/main/res/drawable/progress_bg.xml new file mode 100644 index 000000000..97b90eb75 --- /dev/null +++ b/common/src/main/res/drawable/progress_bg.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_webview.xml b/common/src/main/res/layout/activity_webview.xml index da9a6f211..0f10ea7e6 100644 --- a/common/src/main/res/layout/activity_webview.xml +++ b/common/src/main/res/layout/activity_webview.xml @@ -67,5 +67,5 @@ + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/common/src/main/res/layout/apk_update_custom_popup.xml b/common/src/main/res/layout/apk_update_custom_popup.xml new file mode 100644 index 000000000..4ce8bf49e --- /dev/null +++ b/common/src/main/res/layout/apk_update_custom_popup.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_live_clarity.xml b/common/src/main/res/layout/dialog_live_clarity.xml new file mode 100644 index 000000000..1a45a6d62 --- /dev/null +++ b/common/src/main/res/layout/dialog_live_clarity.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_toast.xml b/common/src/main/res/layout/dialog_toast.xml new file mode 100644 index 000000000..c69f03eda --- /dev/null +++ b/common/src/main/res/layout/dialog_toast.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/hint_custom_popup.xml b/common/src/main/res/layout/hint_custom_popup.xml new file mode 100644 index 000000000..8b7059e50 --- /dev/null +++ b/common/src/main/res/layout/hint_custom_popup.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/input_custom_popup.xml b/common/src/main/res/layout/input_custom_popup.xml index a7d7aeabb..82ed67cb9 100644 --- a/common/src/main/res/layout/input_custom_popup.xml +++ b/common/src/main/res/layout/input_custom_popup.xml @@ -46,10 +46,10 @@ android:layout_width="87dp" android:layout_height="33dp" android:layout_marginRight="7dp" - android:background="@mipmap/tipbox_btn_gray" + android:background="@drawable/backgroud_live_open_lfet" android:gravity="center" android:text="@string/cancel" - android:textColor="#B1B1B1" + android:textColor="#FFC621" android:textSize="14sp" /> diff --git a/common/src/main/res/layout/view_live_open.xml b/common/src/main/res/layout/view_live_open.xml new file mode 100644 index 000000000..d40b58280 --- /dev/null +++ b/common/src/main/res/layout/view_live_open.xml @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/mipmap-mdpi/icon_rank_top_box.png b/common/src/main/res/mipmap-mdpi/icon_rank_top_box.png index 25e96cfa4..47838ee75 100644 Binary files a/common/src/main/res/mipmap-mdpi/icon_rank_top_box.png and b/common/src/main/res/mipmap-mdpi/icon_rank_top_box.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_close_tip.png b/common/src/main/res/mipmap-xxhdpi/icon_close_tip.png new file mode 100644 index 000000000..f64e53e82 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_close_tip.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_fhd.png b/common/src/main/res/mipmap-xxhdpi/icon_fhd.png new file mode 100644 index 000000000..278b37842 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_fhd.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_hd.png b/common/src/main/res/mipmap-xxhdpi/icon_hd.png new file mode 100644 index 000000000..4bdd05b04 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_hd.png differ diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_normal_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_normal_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_normal_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_normal_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_2.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pay_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pay_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pay_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pay_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_2.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pwd_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pwd_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pwd_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pwd_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_2.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_time_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_time_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_time_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_time_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_time_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_time_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_time_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_time_2.png diff --git a/common/src/main/res/mipmap-xxhdpi/icon_more_open.png b/common/src/main/res/mipmap-xxhdpi/icon_more_open.png new file mode 100644 index 000000000..36f5f84f3 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_more_open.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_sd.png b/common/src/main/res/mipmap-xxhdpi/icon_sd.png new file mode 100644 index 000000000..d92be9bb6 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_sd.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_selected.png b/common/src/main/res/mipmap-xxhdpi/icon_selected.png new file mode 100644 index 000000000..5aeea828a Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_selected.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/update_tip_box.png b/common/src/main/res/mipmap-xxhdpi/update_tip_box.png new file mode 100644 index 000000000..7bcfaad41 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/update_tip_box.png differ diff --git a/common/src/main/res/values-en/strings.xml b/common/src/main/res/values-en/strings.xml index 6dda75eff..2bcde64f0 100644 --- a/common/src/main/res/values-en/strings.xml +++ b/common/src/main/res/values-en/strings.xml @@ -934,4 +934,72 @@ Limited ride And limited avatar frame Blocking gift effects Blocking seat effects If you want to Minimize Play,\nYou can go to set the license. + + + In a batch + Chat + Congratulations %s have won %s in the Lucky Angel! The next lucky angel will be you! + Congratulations on %s winning %s in Luck 100 %%! Go pass on the good luck! + Guardian group %s people + receive + To complete + Already collected + Image quality selection + More Settings + view more + The gift is on the way... + The gift is on the way + Remaining count :%s + Whether to confirm multiple PK (deduct 1 point after confirmation) remaining times on the day: %s + Invite \n anchor + End \nPK + Time %s + + accept + refuse + Persist in refusing + Random PK hint + + Automatic speech robot setup + Robot switch + Robot name setting + The word limit is 2 to 8 word + Automatic greeting setting + Number of configured items + Set automatic message sending + Go to set + Thank you for sending gifts, PK start, PK end automatic robot message, \n does not support customization. + Add content + At regular intervals, the robot automatically says the following sentence at random。 + Fill in the content recommendation, such as: send wish list, add fan group, etc + Automatic speech interval (minutes) + At least once every 5 minutes + When a user enters the studio, the robot will @the user and automatically + The following sentence is random. Set a minimum of 1 to a maximum of 20. + Robot setup + High definition + fluency + Ultra hd + After determining the definition of the broadcast, you need to restart the broadcast to change + Confirmation of broadcast Settings + clarity + Live channel + broadcast + robot + set + Not set + no + yes + Ultra HD hint + In the case of unstable network speed, the selection of ultra HD may lead to the delay of the picture in the broadcast room. Do you confirm the selection? + Stick to choice + Network prompt + The system detects that your network is unstable and insufficient device memory will affect the fluency of your live broadcast. Therefore, it is recommended that you choose fluency and clarity. + check version + Update + Latest Version + updating + There is no choice, the anchor is not turned on FHD live. + There is no choice, the anchor is not turned on HD live. + Sorry, this feature is on hold. diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index b0b723181..f3b7113f3 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -723,7 +723,7 @@ 心願單 娛樂整蠱 多人PK - 随机PK + 随机PK 語音連麥 周星榜 暫時離開 @@ -958,13 +958,14 @@ 換一批 聊聊天 想在其他APP上方也顯示小窗,\n可前往設置進行授權。 - 恭喜 %s 在幸運天使中抽中 %s!下一個幸運天使就是你哦! - 守護團%s人 - 領取 - 去完成 - 已領取 - 畫質選擇 - 更多設置 + 恭喜 %s 在幸運天使中抽中 %s!下一個幸運天使就是你哦! + 恭喜 %s 在好運百分百中抽中 %s!快去接力好運吧~ + 守護團%s人 + 領取 + 去完成 + 已領取 + 畫質選擇 + 更多設置 查看更多 礼物正在获取中... 開始PK @@ -974,26 +975,51 @@ 結束\nPK 時間 %s - 接受 - 拒绝 - 坚持拒绝 - 随机PK提示 + 接受 + 拒绝 + 坚持拒绝 + 随机PK提示 - 自動發言機器人設置 - 機器人開關 - 機器人名字設置 - 字數限制2-8個字 - 自動打招呼設置 - 已配置條數 - 自動發消息設置 - 前往設置 - 感謝送禮、PK開始、PK結束的自動機器人消息,\n暫不支持自定義。 - 添加內容 - 每隔一段時間,機器人自動隨機以下一句話發出。 - 填寫內容推薦,如:求送心願單、加粉絲團等 - 自動發言間隔時間(分鐘) - 最少間隔5分鐘1次 - 當有用戶進入直播間時,機器人會@該用戶並自動 - 隨機以下一句話。最少設置1條,最多20條。 - 機器人設置 + 自動發言機器人設置 + 機器人開關 + 機器人名字設置 + 字數限制2-8個字 + 自動打招呼設置 + 已配置條數 + 自動發消息設置 + 前往設置 + 感謝送禮、PK開始、PK結束的自動機器人消息,\n暫不支持自定義。 + 添加內容 + 每隔一段時間,機器人自動隨機以下一句話發出。 + 填寫內容推薦,如:求送心願單、加粉絲團等 + 自動發言間隔時間(分鐘) + 最少間隔5分鐘1次 + 當有用戶進入直播間時,機器人會@該用戶並自動 + 隨機以下一句話。最少設置1條,最多20條。 + 機器人設置 + 高清 + 流暢 + 超高清 + 確定清晰度開播後,需要重新開播才能更改 + 開播設置確認 + 清晰度 + 直播頻道 + 開播 + 機器人 + 已設置 + 未設置 + + + 超高清提示 + 在網速不穩定的情況下,選擇超高清將會有可能導致直播間畫面卡頓,是否確認選擇? + 堅持選擇 + 網絡提示 + 系統監測到您的網絡不穩定,設備內存不足將會影響到您的直播流暢度,因此建議您選擇流暢清晰度。 + 检查新版本 + 發現新版本,點此更新 + 已是最新版本 + 更新中 + 無法選擇,該主播未開啟超高清直播。 + 無法選擇,該主播未開啟高清直播。 + 抱歉,該功能暫停使用中。 diff --git a/config.gradle b/config.gradle index ac60b7e57..5628c118a 100644 --- a/config.gradle +++ b/config.gradle @@ -1,17 +1,17 @@ ext { android = [ compileSdkVersion: 31, - buildToolsVersion: "28.0.3", + buildToolsVersion: "29.0.2", minSdkVersion : 21, targetSdkVersion : 31, - versionCode : 402, - versionName : "6.4.7" + versionCode : 405, + versionName : "6.4.8" ] manifestPlaceholders = [ //正式 // serverHost : "https://napi.yaoulive.com", -// 測試 +// serverHost : "https://ceshi.yaoulive.com", //腾讯地图 @@ -25,8 +25,8 @@ ext { baiduAppSecretKey: "nEVSgmuGpU0pjPr6VleEGGAl0hzGW52S", // true表示谷歌支付 false - isGooglePlay : true, + isGooglePlay : false, //是否上报异常日志 - isUploadLog : false + isUploadLog : true ] } \ No newline at end of file diff --git a/live/build.gradle b/live/build.gradle index f8dddcdbd..0329c0beb 100644 --- a/live/build.gradle +++ b/live/build.gradle @@ -1 +1 @@ -apply plugin: 'com.android.library' apply plugin: 'img-optimizer' apply plugin: 'kotlin-android' android { compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" } defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders ndk { abiFilters "armeabi-v7a", "arm64-v8a" } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } aaptOptions { cruncherEnabled = false useNewCruncher = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { allWarningsAsErrors = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } repositories { flatDir { dirs 'libs', '../libs' } mavenCentral() } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation (name:'../libs/beautysdk-202202241203',ext:'aar') implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar') //socket.io implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } //common api project(path: ':common') api project(path:':FaceUnity')//新娱美颜 annotationProcessor rootProject.ext.dependencies["arouter-compiler"] //工具 api rootProject.ext.dependencies["blank-utilcode"] implementation 'com.eightbitlab:blurview:1.6.6' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.getkeepsafe.relinker:relinker:1.4.4" } \ No newline at end of file +apply plugin: 'com.android.library' apply plugin: 'img-optimizer' apply plugin: 'kotlin-android' android { compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" } defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders ndk { abiFilters "armeabi-v7a", "arm64-v8a" } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } aaptOptions { cruncherEnabled = false useNewCruncher = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { allWarningsAsErrors = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } repositories { flatDir { dirs 'libs', '../libs' } mavenCentral() } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation (name:'../libs/beautysdk-202202241203',ext:'aar') implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar') //socket.io implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } //common api project(path: ':common') api project(path:':FaceUnity')//新娱美颜 annotationProcessor rootProject.ext.dependencies["arouter-compiler"] //工具 api rootProject.ext.dependencies["blank-utilcode"] implementation 'com.eightbitlab:blurview:1.6.6' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.getkeepsafe.relinker:relinker:1.4.4" //ExoPlayer,腾讯的播放器不支持无缝切换 implementation 'com.google.android.exoplayer:exoplayer:2.18.2' implementation 'com.google.android.exoplayer:exoplayer-core:2.18.2@aar' } \ No newline at end of file diff --git a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java index 7a57c29dc..be7b362b8 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java @@ -149,6 +149,7 @@ public class LiveAudienceActivity extends LiveActivity { private ImageView voicePress; private View titleLine; private boolean liveIndex = true; + private boolean isPk = false; @Override public T findViewById(@IdRes int id) { @@ -409,6 +410,7 @@ public class LiveAudienceActivity extends LiveActivity { return; } LiveGiftDialogFragment fragment = new LiveGiftDialogFragment(); + fragment.setPkStatus(isPk); fragment.setLiveGuardInfo(mLiveGuardInfo); Bundle bundle = new Bundle(); bundle.putString(Constants.LIVE_UID, mLiveUid); @@ -423,6 +425,7 @@ public class LiveAudienceActivity extends LiveActivity { return; } LiveGiftDialogFragment fragment = new LiveGiftDialogFragment(); + fragment.setPkStatus(isPk); fragment.setLiveGuardInfo(mLiveGuardInfo); Bundle bundle = new Bundle(); bundle.putString(Constants.LIVE_UID, mLiveUid); @@ -438,6 +441,7 @@ public class LiveAudienceActivity extends LiveActivity { } new Handler(Looper.getMainLooper()).post(() -> { LiveGiftDialogFragment fragment = new LiveGiftDialogFragment(); + fragment.setPkStatus(isPk); fragment.setLiveGuardInfo(mLiveGuardInfo); Bundle bundle = new Bundle(); bundle.putString(Constants.LIVE_UID, mLiveUid); @@ -671,6 +675,17 @@ public class LiveAudienceActivity extends LiveActivity { verticalViewPager.setEnableScroll(IMLoginManager.get(mContext).isSlide()); } + public void setPkStatus(boolean isPk) { + this.isPk = isPk; + if (manager != null) { + manager.setPkStatus(isPk); + } + } + + public boolean isPkStatus() { + return isPk; + } + @Subscribe(threadMode = ThreadMode.MAIN) public void onLiveRoomChangeEvent(LiveRoomChangeEvent e) { if (verticalViewPager.ismEnableScroll()) { @@ -865,6 +880,13 @@ public class LiveAudienceActivity extends LiveActivity { .setType(LiveAudienceEvent.LiveAudienceType.NOTICE)); } + @Override + public void changeVideo() { + Bus.get().post(new LiveAudienceEvent() + .setBean(mLiveBean) + .setType(LiveAudienceEvent.LiveAudienceType.LIVE_VIDEO)); + } + @Override public void online() { @@ -943,6 +965,7 @@ public class LiveAudienceActivity extends LiveActivity { return; } LiveGiftDialogFragment liveGiftDialogFragment = new LiveGiftDialogFragment(); + liveGiftDialogFragment.setPkStatus(isPk); liveGiftDialogFragment.setLiveGuardInfo(mLiveGuardInfo); bundle.putString(Constants.LIVE_UID, mLiveUid); bundle.putString(Constants.LIVE_STREAM, mStream); @@ -1163,6 +1186,9 @@ public class LiveAudienceActivity extends LiveActivity { case LUCKY_ANGEL: manager.luckyAngel(event.getMsgModel()); break; + case LUCKY_100_CHECK: + manager.lucky100(event.getMsgModel()); + break; case LINK_MIC: if (!StringUtil.isEmpty(((LinkMicUserBean) event.getObject()).getUid())) { mMicQueueList.put(((LinkMicUserBean) event.getObject()).getUid(), (LinkMicUserBean) event.getObject()); @@ -1230,7 +1256,11 @@ public class LiveAudienceActivity extends LiveActivity { } break; - + case LEAVE_PK_SCORE: + if (manager != null) { + manager.upDataPkScore(event.getPkScores(), event.getTime()); + } + break; case PK_TIME_COUNT: if (manager != null) { manager.endDRGif(); 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 8a46d8030..a673b8630 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -5,8 +5,6 @@ import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_DISABLE; import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK; import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK_RANDOM; -import static com.yunbao.live.views.AbsRyLivePushViewHolder.mPreView; -import static com.yunbao.live.views.LivePushRyViewHolder.dr_pk_view; import static com.yunbao.live.views.LiveRyAnchorViewHolder.btn_dr_pk_nub; import static com.yunbao.live.views.LiveRyAnchorViewHolder.btn_start_dr_pk; import static com.yunbao.live.views.LiveRyAnchorViewHolder.btn_start_dr_pk_view; @@ -17,13 +15,13 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.Handler; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -31,17 +29,22 @@ import androidx.fragment.app.DialogFragment; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.blankj.utilcode.util.GsonUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BasePopupView; +import com.lxj.xpopup.interfaces.XPopupCallback; import com.opensource.svgaplayer.SVGAImageView; import com.tencent.trtc.TRTCCloudDef; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; import com.yunbao.common.Constants; +import com.yunbao.common.bean.AiAutomaticSpeechModel; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LinkMicUserBean; +import com.yunbao.common.bean.LiveAiRobotBean; import com.yunbao.common.bean.LiveBean; import com.yunbao.common.bean.LiveUserGiftBean; import com.yunbao.common.bean.MicUserBean; @@ -52,6 +55,7 @@ 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.manager.IMRTCManager; import com.yunbao.common.manager.RandomPkManager; @@ -59,11 +63,9 @@ 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.MicStatusManager; -import com.yunbao.common.utils.ScreenDimenUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; @@ -99,14 +101,20 @@ import com.yunbao.live.views.LivePushRyViewHolder; import com.yunbao.live.views.LiveRoomViewHolder; import com.yunbao.live.views.LiveRyAnchorViewHolder; +import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.List; +import java.util.Map; +import java.util.Random; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; +import cn.rongcloud.rtc.api.callback.IRCRTCStatusReportListener; +import cn.rongcloud.rtc.api.report.StatusBean; +import cn.rongcloud.rtc.api.report.StatusReport; import cn.rongcloud.rtc.base.RCRTCRect; import cn.rongcloud.rtc.base.RTCErrorCode; import io.rong.imlib.IRongCallback; @@ -155,6 +163,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl public static int backIndex = 0;//0=未判断,1=已判断 private FaceManager manager; private ImageView leave_img; + private final RandomPkManager.OnRandomPkTimer onRandomPkTimer = new RandomPkManager.OnRandomPkTimer() { @Override public void onTimer(String time) { @@ -199,6 +208,27 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl Bus.getOn(this); Intent intent = getIntent(); initFaceManager(); + RCRTCEngine.getInstance().registerStatusReportListener(new IRCRTCStatusReportListener() { + + @Override + public void onConnectionStats(StatusReport statusReport) { + //视频发送信息 + for (Map.Entry entry : statusReport.statusVideoSends.entrySet()) { + StatusBean statusBean = entry.getValue(); + //获取userID + String userId = statusBean.uid; + //获取视频 宽x高@帧率 + String resolution = statusBean.frameWidth + "x" + statusBean.frameHeight + "@" + statusBean.frameRate; + //获取码率 + long bitRate = statusBean.bitRate; + //丢包率 + long lossRate = statusBean.packetLostRate; + //带宽 + String googAvailableSendBandwidth = statusReport.googAvailableSendBandwidth; + Log.e("网速和内存", "获取视频:" + resolution + " 丢包率:" + lossRate + " 带宽:" + googAvailableSendBandwidth); + } + } + }); leave_img = findViewById(R.id.leave_img); mLiveSDK = intent.getIntExtra(Constants.LIVE_SDK, Constants.LIVE_SDK_KSY); mLiveKsyConfigBean = intent.getParcelableExtra(Constants.LIVE_KSY_CONFIG); @@ -284,6 +314,52 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl switch (functionID) { case Constants.LIVE_ROBOT: new XPopup.Builder(mContext) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + EventBus.getDefault().post(new LiveAudienceEvent().setType(LiveAudienceEvent.LiveAudienceType.UPDATA_ROBOT)); + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) .asCustom(new LiveRobotSettingCustomPopup(mContext)) .show(); break; @@ -326,7 +402,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) @@ -346,18 +422,8 @@ 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); - + mLiveRyLinkMicPkPresenter.setDRInitiator(true); } @Override @@ -674,6 +740,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl * @param data createRoom返回的数据 */ public void startLiveSuccess(String data, int liveType, int liveTypeVal) { + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((" + data); mLiveType = liveType; mLiveTypeVal = liveTypeVal; //处理createRoom返回的数据 @@ -774,6 +841,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (CommonAppConfig.GAME_ENABLE) { mGameList = JSON.parseArray(obj.getString("game_switch"), Integer.class); } + getAiRobotStatus(); } /** @@ -786,6 +854,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl PKing = false; isDRPK = 0; endLive(); + RandomPkManager.getInstance().release(); } }); } @@ -861,6 +930,10 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl LiveHttpUtil.stopLive(mStream, new HttpCallback() { @Override public void onSuccess(int code, String msg, String[] info) { + if (robotRunnable != null) { + robotHandler.removeCallbacks(robotRunnable); + robotRunnable = null; + } if (code == 0) { JSONObject obj = JSON.parseObject(info[0]); JSONObject datas = obj.getJSONObject("data"); @@ -1490,7 +1563,11 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl mLiveRyLinkMicPkPresenter.leaveDRRoom(); } break; - + case LEAVE_PK_SCORE: + if (mLiveRyLinkMicPkPresenter != null) { + mLiveRyLinkMicPkPresenter.upDataPkScore(event.getPkScores(), event.getUid(), event.getTime()); + } + break; case PK_TIME_COUNT: if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.endDRGif(); @@ -1501,6 +1578,18 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl mLivePushViewHolder.changeToBig(); } break; + case AI_AUTOMATIC_SPEECH: + if (mLiveRoomViewHolder != null) { + mLiveRoomViewHolder.aiAutomaticSpeech((event.getAiAutomaticSpeechModel())); + } + break; + case UPDATA_ROBOT: + getAiRobotStatus(); + break; + //主播强制下播 + case LIVE_END: + endLive(); + break; } } @@ -1527,4 +1616,118 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } }); } + + /** + * 获取机器人配置;取得求关注时间间隔 + */ + private long robotTime = 0; + + private void getAiRobotStatus() { + Log.e("随机打招呼", "((((((((((((((((((((((((((((((((((((((((((((((("); + LiveNetManager.get(mContext) + .getAiRobotStatus(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveAiRobotBean data) { + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((" + data.toString()); + if (data.getStatus() == 1) { + if (robotRunnable != null) { + robotHandler.removeCallbacks(robotRunnable); + robotRunnable = null; + } + robotRunnable = new Runnable() { + @Override + public void run() { + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((data.getName())" + data.getName()); + String robotName = data.getName(); + //发送消息 + LiveNetManager.get(mContext) + .getAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, + new com.yunbao.common.http.base.HttpCallback>() { + @Override + public void onSuccess(List messageList) { + Random random = new Random(); + int randNumber = random.nextInt(messageList.size()) - 1; + if (randNumber < 0) { + randNumber = 0; + } + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((data.randNumber())" + randNumber); + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((data)" + messageList.toString()); + sendRobotMessage(robotName, messageList.get(randNumber).getContent()); + } + + @Override + public void onError(String error) { + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((data.error())" + error); + } + }); + + } + }; + robotTime = data.getTime() * 60 * 1000; + Log.e("随机打招呼", "(((((((((((((((((((((((((((((((((((((((((((((((robotTime)" + robotTime); + robotHandler.postDelayed(robotRunnable, robotTime); + } + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + + //机器人求关注轮询器 + private Handler robotHandler = new Handler(); + private Runnable robotRunnable = null; + + /** + * '{"msg": + * [{"_method_":"aiAutomaticSpeech", + * "ct":{"name_color":"#f19ec2","ai_name":"'+_this.robotInfo.ai_name+'", + * "content":"'+content+'","user_name":"", + * "icon":"https://downs.yaoulive.com/xzs_tab.png", + * "system_bubble":"https://downs.yaoulive.com/xzs_qipao.9.png"}, + * "msgtype":"10"}],"retcode":"000000","retmsg":"OK"}' + */ + private void sendRobotMessage(String name, String content) { + Log.e("随机打招呼", name + "==========00000000000000++++" + content); + AiAutomaticSpeechModel aiAutomaticSpeechModel = new AiAutomaticSpeechModel(); + aiAutomaticSpeechModel.setAiName(name) + .setIcon("https://downs.yaoulive.com/xzs_tab.png") + .setNameColor("#f19ec2") + .setSystemBubble("https://downs.yaoulive.com/xzs_qipao.9.png") + .setUserName("") + .setContent(content); + SocketSendBean msg = + new SocketSendBean() + .param("_method_", "aiAutomaticSpeechNew") + .param("msgtype", "10") + .param("ct", GsonUtils.toJson(aiAutomaticSpeechModel, AiAutomaticSpeechModel.class)); + msg.create(); + String targetId = "g" + mLiveUid; + Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; + TextMessage messageContent = TextMessage.obtain(msg.mResult.toString()); + Message message = Message.obtain(targetId, conversationType, messageContent); + + RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { + @Override + public void onAttached(Message message) { + + } + + @Override + public void onSuccess(Message message) { + if (SocketRyClient.mSocketHandler != null) { + SocketRyClient.mSocketHandler.processBroadcast(msg.mResult.toString() + ""); + } + } + + @Override + public void onError(Message message, RongIMClient.ErrorCode errorCode) { + Log.e("tx", "aaa" + errorCode.toString()); + ToastUtil.show(errorCode.code + ":" + errorCode.msg); + } + }); + robotHandler.postDelayed(robotRunnable, robotTime); + } } diff --git a/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java index 4694aa2bc..205fd0032 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java @@ -31,7 +31,7 @@ import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.live.R; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveBeautyDialogFragment; import com.yunbao.live.dialog.LiveRoomTypeDialogFragment; import com.yunbao.live.http.LiveHttpUtil; @@ -213,7 +213,7 @@ public class LiveTRTCAnchorActivity extends TRTCBaseActivity { return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, null, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, null,0, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { 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 93a0c7762..57b0f377b 100644 --- a/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java @@ -115,7 +115,7 @@ public class FreePkRecyclerAdapter extends RefreshAdapter { } if (freePkNum == 0 && mDrPkNum == -1) { ToastUtil.show(R.string.free_pk_num_null); - return; + // return; } LiveHttpUtil.getMicList(LiveRyAnchorActivity.mLiveUid, 0, new com.yunbao.common.http.HttpCallback() { diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java index 27341f9d0..6e5cb5312 100644 --- a/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java @@ -1,6 +1,7 @@ package com.yunbao.live.adapter; import static com.yunbao.live.bean.LiveChatBean.AI_AUTOMATIC_SPEECH; +import static com.yunbao.live.bean.LiveChatBean.LUCKY_100_CHECK; import static com.yunbao.live.bean.LiveChatBean.LUCKY_ANGEL; import static com.yunbao.live.bean.LiveChatBean.RECOMMEND_CARD_NOTIFY; import static com.yunbao.live.bean.LiveChatBean.STAR_CHALLENGE_UPGRADE_NOTIFY; @@ -16,6 +17,8 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -47,7 +50,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Set; /** * Created by cxf on 2018/10/10. @@ -68,6 +70,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { private int mRecyclerViewScrolledDy; private int mPosition; + private boolean isBottom = false; public LiveChatAdapter(Context context) { mContext = context; @@ -128,8 +131,24 @@ public class LiveChatAdapter extends RecyclerView.Adapter { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); - if (isSlideToBottom(recyclerView) || dy == 0) return; + if (isBottom && dy >= 0) return; + Log.i(TAG, "onScrolled: " + dy); mRecyclerViewScrolledDy = dy; + isBottom = false; + } + + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == 0 && isSlideToBottom(recyclerView)) { + // Log.i(TAG, "onScrollStateChanged: 到底部了"); + mRecyclerViewScrolledDy = 0; + scrollToBottom(); + isBottom = true; + } else if (newState == 0) { + // Log.i(TAG, "onScrollStateChanged: 不是底部"); + isBottom = false; + } } }); } @@ -360,7 +379,15 @@ public class LiveChatAdapter extends RecyclerView.Adapter { new LiveTextRender().luckyAngel(mContext, mTextView, bean.getMsgModel()); } - } else { + }else if(bean.getType() == LUCKY_100_CHECK){ + if (!TextUtils.isEmpty(bean.getMsgModel().getSystem_bubble())) { + bean.setId(bean.getMsgModel().getUserId()); + itemView.setTag(bean); + LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getMsgModel().getSystem_bubble(), 1); + new LiveTextRender().lucky100(mContext, mTextView, bean.getMsgModel()); + } + } + else { if (bean.getBubble() != null && !bean.getBubble().equals("")) { //加载.9图聊天气泡 LoadDian9TuUtil.loadDian9Tu(mContext, mBg, bean.getBubble(), 1); @@ -375,18 +402,21 @@ public class LiveChatAdapter extends RecyclerView.Adapter { new LiveTextRender().render(mContext, mTextView, bean); } + Animation animation = AnimationUtils.loadAnimation(itemView.getContext(),R.anim.live_chat_msg_in); + itemView.startAnimation(animation); } } @SuppressLint("NotifyDataSetChanged") - public void insertItem(LiveChatBean bean) { + public synchronized void insertItem(LiveChatBean bean) { if (bean == null) { return; } - // Log.i(TAG, "insertItem: " + bean.getContent()); + // Log.i(TAG, "insertItem: " + bean.getContent()+" size = "+(mList.size()+1)); int size = mList.size(); //设置最大展示99条消息 - if (size == 100) { + if (size >= 100 && (isBottom || mRecyclerViewScrolledDy == 0)) { + mList.subList(0, 50).clear(); notifyItemRangeRemoved(0, 50); } @@ -396,8 +426,8 @@ public class LiveChatAdapter extends RecyclerView.Adapter { } else { notifyItemInserted(getItemCount()); } - size = mList.size(); - if (isSlideToBottom(mRecyclerView) || mRecyclerViewScrolledDy == 0) { +// size = mList.size(); + if (isBottom || mRecyclerViewScrolledDy == 0) { scrollToBottom(); } else { Bus.get().post(new LiveAudienceEvent() @@ -413,6 +443,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { } + private void scrollToBottom(final RecyclerView recyclerView) { // scroll to last item to get the view of last item final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); @@ -445,16 +476,19 @@ public class LiveChatAdapter extends RecyclerView.Adapter { if (bean == null) { return; } + + mList.remove(bean.getHeart()); notifyItemRemoved(bean.getHeart()); notifyItemRangeChanged(bean.getHeart(), getItemCount()); + } public void scrollToBottom() { - mRecyclerViewScrolledDy = 0; if (mList.size() > 0) { mRecyclerView.smoothScrollToPosition(getItemCount() - 1); } + mRecyclerViewScrolledDy = 0; } public void scrollToAt() { diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java b/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java index fdd546e65..0f4bcc4a6 100644 --- a/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java +++ b/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java @@ -10,7 +10,7 @@ import androidx.recyclerview.widget.LinearSmoothScroller; import androidx.recyclerview.widget.RecyclerView; public class LiveChatRecyclerViewLayoutManager extends LinearLayoutManager { - private static final float MILLISECONDS_PER_INCH = 200f; + private static final float MILLISECONDS_PER_INCH = 150f; public LiveChatRecyclerViewLayoutManager(Context context) { super(context); } diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java index 431ea0971..61dc2da23 100644 --- a/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java @@ -15,7 +15,7 @@ import com.yunbao.common.CommonAppConfig; import com.yunbao.common.bean.ConfigBean; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.live.R; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import java.util.ArrayList; import java.util.Arrays; diff --git a/live/src/main/java/com/yunbao/live/bean/LiveChatBean.java b/live/src/main/java/com/yunbao/live/bean/LiveChatBean.java index 5a492399f..8d876699b 100644 --- a/live/src/main/java/com/yunbao/live/bean/LiveChatBean.java +++ b/live/src/main/java/com/yunbao/live/bean/LiveChatBean.java @@ -22,6 +22,7 @@ public class LiveChatBean { public static final int AI_AUTOMATIC_SPEECH = 101; public static final int STAR_CHALLENGE_UPGRADE_NOTIFY = 105; public static final int LUCKY_ANGEL = 106;//幸运天使 + public static final int LUCKY_100_CHECK = 107;//幸运天使 diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveGiftDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveGiftDialogFragment.java index c814aebb1..4366e4bd6 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveGiftDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveGiftDialogFragment.java @@ -123,6 +123,7 @@ public class LiveGiftDialogFragment extends AbsDialogFragment implements View.On private TextView mVipGoldTitle; private TextView mVipGoldDesc; private TextView mGiftPackage; + private boolean isPk; @Override @@ -154,6 +155,10 @@ public class LiveGiftDialogFragment extends AbsDialogFragment implements View.On mLiveGuardInfo = liveGuardInfo; } + public void setPkStatus(boolean pk) { + isPk = pk; + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -203,7 +208,7 @@ public class LiveGiftDialogFragment extends AbsDialogFragment implements View.On @Override public void onPageSelected(int position) { - if (mRadioGroup != null) { + if (mRadioGroup != null && mRadioGroup.getChildAt(position)!=null) { ((RadioButton) mRadioGroup.getChildAt(position)).setChecked(true); } } @@ -276,6 +281,9 @@ public class LiveGiftDialogFragment extends AbsDialogFragment implements View.On } loadGiftListData(); loadUserVip(); + if (isPk) { + mVipGold.setVisibility(View.GONE); + } } /** diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java index b82f1e3c8..691a1c4d4 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java @@ -3,6 +3,7 @@ package com.yunbao.live.dialog; import android.annotation.SuppressLint; import android.app.ActionBar; import android.content.Context; +import android.graphics.drawable.Drawable; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; @@ -37,6 +38,7 @@ import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.bean.HotBean; import com.yunbao.live.custom.TopGradual; import com.yunbao.live.http.LiveHttpUtil; +import com.yunbao.live.utils.LiveTextRender; import java.net.MalformedURLException; import java.net.URL; @@ -205,7 +207,17 @@ public class LiveGiveHotDialogFragment extends AbsDialogFragment { viewHolder.sex.setImageResource(CommonIconUtil.getSexIcon(mDatas.get(position).getSex())); LevelBean levelBean = CommonAppConfig.getInstance().getLevel(mDatas.get(position).getLevel()); if (levelBean != null) { - ImgLoader.display(mContext, levelBean.getThumb(), viewHolder.level); + new LiveTextRender().getLevelImage(mContext, levelBean.getLevel(), new ImgLoader.DrawableCallback() { + @Override + public void onLoadSuccess(Drawable drawable) { + ImgLoader.display2(mContext, drawable, viewHolder.level); + } + + @Override + public void onLoadFailed() { + + } + }); } String hotStr = mDatas.get(position).getHot_score().substring(0, mDatas.get(position).getHot_score().length() - 3); viewHolder.tv_hot_number.setText(hotStr + "k"); diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java index 6bf49ae81..f2ba058b5 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java @@ -18,7 +18,6 @@ import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.live.R; import com.yunbao.live.adapter.LiveReadyClassAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; import java.util.ArrayList; import java.util.List; diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java index 7f853b10e..946af6304 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java @@ -19,7 +19,7 @@ import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.live.R; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import java.util.ArrayList; import java.util.Arrays; diff --git a/live/src/main/java/com/yunbao/live/dialog/LivePrankDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LivePrankDialogFragment.java index ee39ac0c3..d3e63b0d5 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LivePrankDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LivePrankDialogFragment.java @@ -217,6 +217,7 @@ public class LivePrankDialogFragment extends AbsDialogFragment implements View.O @Override public void onSuccess(PrankHttpTurntableBean data) { setDate(data); + mCoinTextView.setText(data.getCoin()+""); } @Override diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java index be42aaecf..933dd3339 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java @@ -14,7 +14,7 @@ import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; import com.yunbao.live.R; import com.yunbao.live.adapter.LiveRoomTypeAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; /** * Created by cxf on 2018/10/8. 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 c690ed6f2..49600b5f1 100644 --- a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java +++ b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java @@ -31,6 +31,46 @@ public class LiveAudienceEvent extends BaseModel { private int time; private CustomFullServiceNotifyEvent customFullServiceNotifyEvent; private LivePKUserListBean livePKUserListBean; + private String votes; + private String length; + private int nums; + private String uname; + + public String getVotes() { + return votes; + } + + public LiveAudienceEvent setVotes(String votes) { + this.votes = votes; + return this; + } + + public String getLength() { + return length; + } + + public LiveAudienceEvent setLength(String length) { + this.length = length; + return this; + } + + public int getNums() { + return nums; + } + + public LiveAudienceEvent setNums(int nums) { + this.nums = nums; + return this; + } + + public String getUname() { + return uname; + } + + public LiveAudienceEvent setUname(String uname) { + this.uname = uname; + return this; + } public LivePKUserListBean getLivePKUserListBean() { return livePKUserListBean; @@ -255,7 +295,11 @@ public class LiveAudienceEvent extends BaseModel { DISCONNEXT_PK_TIME(50, "单人Pk结束"), UP_PK_TWO(51, "PK头像信息"), CUSTOM_FULL_SERVICE_NOTIFY(51, "全服通知"), - CHANGE_VIEW(52, "更改连胜位置"); + CHANGE_VIEW(52, "更改连胜位置"), + UPDATA_ROBOT(53, "更新机器人消息"), + LIVE_VIDEO(54, "画质选择"), + LUCKY_100_CHECK(55, "幸运百分百"), + LIVE_END(56, "主播下播"); private int type; private String name; 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 864ec1fe6..be47f5942 100644 --- a/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java +++ b/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java @@ -47,10 +47,11 @@ public class LiveHttpUtil { /** * 获取直播用户日榜/周榜 - * @param liveUid 主播uid + * + * @param liveUid 主播uid * @param callback 回调 */ - public static void getUserRankList(String liveUid,HttpCallback callback){ + public static void getUserRankList(String liveUid, HttpCallback callback) { HttpClient.getInstance().get("Contribute.index", LiveHttpConsts.GET_USER_LIST) .params("uid", liveUid) .execute(callback); @@ -685,7 +686,7 @@ public class LiveHttpUtil { * @param file 封面图片文件 * @param callback */ - public static void newcreateRoom(String title, int liveClassId, int type, int typeVal, File file, HttpCallback callback) { + public static void newcreateRoom(String title, int liveClassId, int type, int typeVal, File file, int clarityType, HttpCallback callback) { PostRequest request = HttpClient.getInstance().post("Live.createRoom2", LiveHttpConsts.CREATE_ROOM) .params("title", title) @@ -693,7 +694,8 @@ public class LiveHttpUtil { .params("type", type) .params("landscape", "2") .params("class_type", "0") - .params("type_val", typeVal); + .params("type_val", typeVal) + .params("clarityType", clarityType); if (file != null) { request.params("file", file); } @@ -902,16 +904,17 @@ public class LiveHttpUtil { /** * 获取用户贵族喇叭的数量 */ - public static void nobleUseTrumpet(String trumpet_msg,String anchor_id,HttpCallback callback) { + public static void nobleUseTrumpet(String trumpet_msg, String anchor_id, HttpCallback callback) { HttpClient.getInstance().get("Noble.nobleUseTrumpet", "nobleUseTrumpet") .params("", trumpet_msg) .params("", anchor_id) .execute(callback); } + /** * 获取用户贵族喇叭的数量 */ - public static void getStarChallengeStatus(String liveUid,HttpCallback callback) { + public static void getStarChallengeStatus(String liveUid, HttpCallback callback) { HttpClient.getInstance().get("StarChallenge.getStarChallengeStatus", "StarChallengeStatus") .params("liveUid", liveUid) .execute(callback); diff --git a/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java b/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java index 9033417f5..bcf3c4ddc 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java @@ -47,6 +47,7 @@ import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.GiftCacheUtil; import com.yunbao.common.utils.HtmlTagHandler; import com.yunbao.common.utils.L; +import com.yunbao.common.utils.MicStatusManager; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; @@ -55,6 +56,7 @@ import com.yunbao.live.bean.LiveGiftPrizePoolWinBean; import com.yunbao.live.bean.LiveLuckGiftWinBean; import com.yunbao.live.bean.LiveReceiveGiftBean; import com.yunbao.live.custom.FrameImageView; +import com.yunbao.live.event.LiveRoomChangeEvent; import com.yunbao.live.http.LiveHttpUtil; import com.yunbao.live.utils.AllMsgTextRender; import com.yunbao.live.utils.LiveIconUtil; @@ -63,6 +65,8 @@ import com.yunbao.live.views.LiveGiftPrizePoolViewHolder; import com.yunbao.live.views.LiveGiftViewHolder; import com.yunbao.live.views.LiveTitleAnimViewHolder; +import org.greenrobot.eventbus.EventBus; + import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -378,7 +382,14 @@ public class LiveGiftAnimPresenter { new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { @Override public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk) { - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal)); + if (liveBean == null) { + return; + } + if (MicStatusManager.getInstance().isMic(liveUid)) { + MicStatusManager.getInstance().showDownMicDialog(mContext); + return; + } + EventBus.getDefault().post(new LiveRoomChangeEvent(liveBean, liveType, Integer.parseInt(liveTypeVal)).setLiveEnd(true)); } @Override 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 370ce2659..26205c2d8 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java @@ -4,9 +4,7 @@ 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.mPreView; 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 static cn.rongcloud.rtc.core.RendererCommon.ScalingType.SCALE_ASPECT_FILL; @@ -29,18 +27,24 @@ 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.event.AnchorInfoEvent; +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.manager.IMRTCManager; import com.yunbao.common.manager.RandomPkManager; import com.yunbao.common.utils.Bus; @@ -106,6 +110,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { private static final int WHAT_PK_WAIT_RECEIVE = 0;//收到pk申请等待 what private static final int WHAT_PK_WAIT_SEND = 1;//发送pk申请等待 what private static final int WHAT_PK_TIME = 2;//pk时间变化 what + private static final int WHAT_PK_TIME2 = 22;//pk时间变化 what private static final int LINK_MIC_COUNT_MAX = 10; private static int PK_TIME_MAX = 60 * 15;//pk时间 15分钟 private static final int PK_TIME_MAX_2 = 60;//惩罚时间 1分钟 @@ -139,10 +144,23 @@ 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<>(); + private boolean DRInitiator = false;//是否是duorenPK发起人 + + public LiveRyLinkMicPkPresenter setDRInitiator(boolean DRInitiator) { + this.DRInitiator = DRInitiator; + return this; + } private IRCRTCOtherRoomEventsListener otherRoomEventsListener = new IRCRTCOtherRoomEventsListener() { @@ -222,6 +240,50 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { case WHAT_PK_TIME: changePkTime(); break; + + } + } + }; + + } + + 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_TIME2: + pkCountdownTimer(); + break; + case WHAT_PK_TIME: + changePkTime(); + break; } } }; @@ -303,13 +365,15 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { */ int i = 0; - private void nextPkTimeCountDown() { + private void nextPkTimeCountDown(int is) { + if (mHandler != null) { mHandler.sendEmptyMessageAtTime(WHAT_PK_TIME, getNextSecondTime()); } if (mLiveLinkMicPkViewHolder != null) { String s = mIsPkEnd ? mPkTimeString2 : mPkTimeString1; String s1 = StringUtil.getDurationText(mPkTimeCount * 1000); + Log.i("tag23333", mPkTimeCount + "mPkTimeCount" + s1 + "is" + is); if (i == 1 && s1.equals("00:01")) { s1 = "00:00"; i = 0; @@ -320,14 +384,13 @@ 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.camera.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setLayoutParams(params); } Log.i("tts", s1); mLiveLinkMicPkViewHolder.setTime(s + " " + s1); - if (i == 0 && s1.equals("00:01") && mIsAnchor && !s.contains("懲罰")) { - i = 1; + if (s1.equals("00:01") && mIsAnchor && !s.contains("懲罰")) { HttpClient.getInstance().get("Livepk.endPK", "Livepk.endPK") .params("uid", CommonAppConfig.getInstance().getUid()) .params("addtime", "00:00") @@ -382,15 +445,29 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { * pk时间倒计时 */ private void changePkTime() { + if (mPkTimeCount < 0) return; mPkTimeCount--; - if (mPkTimeCount > 0) {// - nextPkTimeCountDown(); + Log.i("vvvs", "mPkTimeCount:" + mPkTimeCount); + if (mPkTimeCount >= 0) {// + nextPkTimeCountDown(1); + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).setPkStatus(true); + } } else { if (mIsPkEnd) { onLinkMicPkClose(0); if (mIsAnchor) { ((LiveRyAnchorActivity) mContext).setPkBtnVisible(true); } + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).setPkStatus(false); + } + //如果PK结束Im没有发送关闭PK的消息,倒计时结束自动关闭 +// if (mLiveLinkMicPkViewHolder != null) { +// mLiveLinkMicPkViewHolder.removeFromParent(); +// mLiveLinkMicPkViewHolder.release(); +// } +// mLiveLinkMicPkViewHolder = null; } } } @@ -473,35 +550,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); @@ -602,6 +680,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { * 主播与主播PK PK主播发过来的已经接受 */ public void onLinkMicToPk(UserBean u) { + EventBus.getDefault().post(new AnchorInfoEvent(false, u.getId(), u.getUserNiceName(), u.getAvatar())); Log.e("eve", u.getId() + ""); /** * 加入副房间 @@ -629,9 +708,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); @@ -703,15 +782,15 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { } }); LivePushRyViewHolder.btn_close.setVisibility(View.VISIBLE); - LiveRyAnchorActivity.isDRPK=1; + LiveRyAnchorActivity.isDRPK = 1; 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 = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); - LivePushRyViewHolder.mPreView.setLayoutParams(params); - LivePushRyViewHolder.mPreView1.setLayoutParams(params); - LivePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); + livePushRyViewHolder.camera.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); final SocketSendBean msg1 = new SocketSendBean() .param("_method_", SOCKET_LINK_MIC_PK) @@ -753,17 +832,19 @@ 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.camera.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setLayoutParams(params); + livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); LivePushRyViewHolder.btn_close.setVisibility(View.VISIBLE); - LiveRyAnchorActivity.isDRPK=1; + LiveRyAnchorActivity.isDRPK = 1; JSONObject msg1 = new JSONObject(); msg1.put("uid", CommonAppConfig.getInstance().getUid()); msg1.put("pkuid", CommonAppConfig.getInstance().getUid()); msg1.put("pkhead", CommonAppConfig.getInstance().getUserBean().getAvatarThumb()); msg1.put("pkname", CommonAppConfig.getInstance().getUserBean().getUserNiceName()); + EventBus.getDefault().post(new AnchorInfoEvent(false, bean.getId(), bean.getUserNiceName(), bean.getAvatar())); + if (bean != null && bean.isRandomPk()) { msg1.put("random_pk", bean.isRandomPk() ? 1 : 0); msg1.put("is_ladders", bean.getRankPkImgUrl()); @@ -787,9 +868,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); @@ -1050,7 +1131,10 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { /** * 退出多人PK */ - public static void leaveDRRoom() { + public void leaveDRRoom() { + //清理PK上面对方的头像 + EventBus.getDefault().post(new AnchorInfoEvent(true, "", "", "")); + Log.e("ry", "退出多人OKKK" + inputStreamList.size()); isDRPK = 0; for (int i = 0; i < inputStreamList.size(); i++) { @@ -1120,26 +1204,32 @@ 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); + livePushRyViewHolder.timeTitle.setVisibility(View.GONE); + livePushRyViewHolder.mPreView.removeView(detailsView1); + livePushRyViewHolder.cameraPreview3.setVisibility(View.GONE); + } + }; + /** * 随机PK拒绝对话框 */ @@ -1147,7 +1237,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { new DialogUitl.Builder(mContext) .setHtmlCode(Html.fromHtml( "有人向您发起PK请求。
" + - "若拒绝PK,将会120分钟内不会再收到任何随机PK请求。" + "若拒绝PK,将会10分钟内不会再收到任何随机PK请求。" )) .setConfrimString("接受") .setCancelString("拒絕") @@ -1191,7 +1281,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { titleVal = "拒絕PK提示"; ((TextView) context).setText(Html.fromHtml( "若拒絕PK,將會關閉你的隨機PK開關。
" + - "並且120分鍾不會收到任何隨機PK請求。
" + "並且10分鍾不會收到任何隨機PK請求。" )); ((TextView) cancelBtn).setText("堅持拒絕"); clickCancel = true; @@ -1533,15 +1623,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); @@ -1554,37 +1657,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); } @@ -1650,6 +1815,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++) { //遍历远端用户发布的资源列表 @@ -1657,37 +1847,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); @@ -1747,7 +1996,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { * @param streams 必须为视频流列表 * @return */ - public static RCRTCMixConfig create_Custom_MixConfig(boolean isCrop, List streams) { + private RCRTCMixConfig create_Custom_MixConfig(boolean isCrop, List streams) { + Log.e("视频合流", streams.toString()); + Log.e("视频合流", "视频长度:" + streams.size()); RCRTCMixConfig config = new RCRTCMixConfig(); //1. 设置自定义合流布局模式 config.setLayoutMode(RCRTCMixConfig.MixLayoutMode.CUSTOM); @@ -1775,62 +2026,92 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { //(请参照画布和声音配置示例代码) //3. 假设以画布设置的宽高为 300 * 300为例(应以真实设置的宽高为准),设置每个视频流小窗口的坐标及宽高 ArrayList list = new ArrayList<>(); - config.setCustomLayouts(list); - //user1的视频流 - RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout1 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); - list.add(videoLayout1); - videoLayout1.setVideoStream(RCRTCEngine.getInstance().getDefaultVideoStream()); // RCRTCStream#MediaType 必须是Video - videoLayout1.setX(0); //X 坐标 - videoLayout1.setY(0); //Y 坐标 - videoLayout1.setWidth(480); // 视频窗口的宽 - videoLayout1.setHeight(720); // 视频窗口的高 - for (int i = 0; i < streams.size(); i++) { - Log.e("tttts,", "a" + i + "cccc" + streams.size()); - Log.e("tttts", streams.get(i).getUserId() + ""); - if (i == 0) { - //user2的视频流 - RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout2 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); - list.add(videoLayout2); - videoLayout2.setVideoStream(streams.get(i)); // RCRTCStream#MediaType 必须是Video - videoLayout2.setX(480); //X 坐标 - videoLayout2.setY(0); //Y 坐标 - videoLayout2.setWidth(240); // 视频窗口的宽 - videoLayout2.setHeight(360); // 视频窗口的高 - Log.e("ttt1112", "0" + "VS" + streams.get(i).getUserId()); - } else if (i == 1) { - //user3的视频流 - RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout3 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); - list.add(videoLayout3); - videoLayout3.setVideoStream(streams.get(i)); // RCRTCStream#MediaType 必须是Video - videoLayout3.setX(720); //X 坐标 - videoLayout3.setY(0); //Y 坐标 - videoLayout3.setWidth(240); // 视频窗口的宽 - videoLayout3.setHeight(360); // 视频窗口的高 - Log.e("ttt1112", "1" + "VS" + streams.get(i).getUserId()); + if (streams.size() == 1) { + //user1的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout1 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout1.setVideoStream(RCRTCEngine.getInstance().getDefaultVideoStream()); // RCRTCStream#MediaType 必须是Video + videoLayout1.setX(0); //X 坐标 + videoLayout1.setY(0); //Y 坐标 + videoLayout1.setWidth(480); // 视频窗口的宽 + videoLayout1.setHeight(720); // 视频窗口的高 + list.add(videoLayout1); - } else if (i == 2) { - //user3的视频流 - RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout4 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); - list.add(videoLayout4); - videoLayout4.setVideoStream(streams.get(i)); // RCRTCStream#MediaType 必须是Video - videoLayout4.setX(480); //X 坐标 - videoLayout4.setY(360); //Y 坐标 - videoLayout4.setWidth(240); // 视频窗口的宽 - videoLayout4.setHeight(360); // 视频窗口的高 - Log.e("ttt1112", "2" + "VS" + streams.get(i).getUserId()); - } else if (i == 3) { - //user3的视频流 - RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout4 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); - list.add(videoLayout4); - videoLayout4.setVideoStream(streams.get(i)); // RCRTCStream#MediaType 必须是Video - videoLayout4.setX(720); //X 坐标 - videoLayout4.setY(360); //Y 坐标 - videoLayout4.setWidth(240); // 视频窗口的宽 - videoLayout4.setHeight(360); // 视频窗口的高 - Log.e("ttt1112", "3" + "VS" + streams.get(i).getUserId()); - } + //user2的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout2 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout2.setVideoStream(streams.get(0)); // RCRTCStream#MediaType 必须是Video + videoLayout2.setX(480); //X 坐标 + videoLayout2.setY(0); //Y 坐标 + videoLayout2.setWidth(480); // 视频窗口的宽 + videoLayout2.setHeight(720); // 视频窗口的高 + list.add(videoLayout2); + + } else if (streams.size() == 2) { + //user1的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout1 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + list.add(videoLayout1); + videoLayout1.setVideoStream(RCRTCEngine.getInstance().getDefaultVideoStream()); // RCRTCStream#MediaType 必须是Video + videoLayout1.setX(0); //X 坐标 + videoLayout1.setY(0); //Y 坐标 + videoLayout1.setWidth(480); // 视频窗口的宽 + videoLayout1.setHeight(720); // 视频窗口的高 + + //user2的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout2 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout2.setVideoStream(streams.get(0)); // RCRTCStream#MediaType 必须是Video + videoLayout2.setX(480); //X 坐标 + videoLayout2.setY(0); //Y 坐标 + videoLayout2.setWidth(480); // 视频窗口的宽 + videoLayout2.setHeight(360); // 视频窗口的高 + list.add(videoLayout2); + + //user3的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout3 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout3.setVideoStream(streams.get(1)); // RCRTCStream#MediaType 必须是Video + videoLayout3.setX(480); //X 坐标 + videoLayout3.setY(360); //Y 坐标 + videoLayout3.setWidth(480); // 视频窗口的宽 + videoLayout3.setHeight(360); // 视频窗口的高 + list.add(videoLayout3); + + } else if (streams.size() == 3) { + //user1的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout1 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout1.setVideoStream(RCRTCEngine.getInstance().getDefaultVideoStream()); // RCRTCStream#MediaType 必须是Video + videoLayout1.setX(0); //X 坐标 + videoLayout1.setY(0); //Y 坐标 + videoLayout1.setWidth(480); // 视频窗口的宽 + videoLayout1.setHeight(720); // 视频窗口的高 + list.add(videoLayout1); + + //user2的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout2 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout2.setVideoStream(streams.get(0)); // RCRTCStream#MediaType 必须是Video + videoLayout2.setX(480); //X 坐标 + videoLayout2.setY(0); //Y 坐标 + videoLayout2.setWidth(480); // 视频窗口的宽 + videoLayout2.setHeight(360); // 视频窗口的高 + list.add(videoLayout2); + + //user3的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout3 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout3.setVideoStream(streams.get(1)); // RCRTCStream#MediaType 必须是Video + videoLayout3.setX(480); //X 坐标 + videoLayout3.setY(360); //Y 坐标 + videoLayout3.setWidth(480); // 视频窗口的宽 + videoLayout3.setHeight(360); // 视频窗口的高 + list.add(videoLayout3); + + //user3的视频流 + RCRTCMixConfig.CustomLayoutList.CustomLayout videoLayout4 = new RCRTCMixConfig.CustomLayoutList.CustomLayout(); + videoLayout4.setVideoStream(streams.get(2)); // RCRTCStream#MediaType 必须是Video + videoLayout4.setX(0); //X 坐标 + videoLayout4.setY(360); //Y 坐标 + videoLayout4.setWidth(480); // 视频窗口的宽 + videoLayout4.setHeight(360); // 视频窗口的高 + list.add(videoLayout4); } + config.setCustomLayouts(list); return config; } @@ -1863,7 +2144,6 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { if (mPkPopWindow != null) { mPkPopWindow.dismiss(); } - } /** @@ -1899,7 +2179,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { mPkTimeCount = pkTime; Log.d("mPkTimeCount1", "" + mPkTimeCount + ";mPkTimeFromServer=" + mPkTimeFromServer); mPkTimeFromServer = pkTime; - nextPkTimeCountDown(); + nextPkTimeCountDown(2); } @@ -1935,7 +2215,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { Log.d("mPkTimeCount1", "" + mPkTimeCount + ";mPkTimeFromServer=" + mPkTimeFromServer); // mPkTimeFromServer=pkTime; //恢复播放画面 - nextPkTimeCountDown(); + nextPkTimeCountDown(3); } @@ -1955,14 +2235,15 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { mLiveLinkMicPkViewHolder = new LiveLinkMicPkViewHolder(mContext, mPkContainer); mLiveLinkMicPkViewHolder.addToParent(); mLiveLinkMicPkViewHolder.setIsAnchor(mIsAnchor); - if (LiveAudienceActivity.getmLivePlayViewHolder() != null) { - LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).getmLivePlayViewHolder().setPkview(); } } mLiveLinkMicPkViewHolder.startAnim(); + EventBus.getDefault().post(new LiveAudienceEvent().setType(LiveAudienceEvent.LiveAudienceType.PK_TWO_START).setObject(pkUid)); mLiveLinkMicPkViewHolder.showTime(); - nextPkTimeCountDown(); + nextPkTimeCountDown(2); if (mIsAnchor) { ((LiveRyAnchorActivity) mContext).setPkBtnVisible(false); mPkTimeCount = PK_TIME_MAX; @@ -2014,7 +2295,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { mLiveLinkMicPkViewHolder.end(-1); } mPkTimeCount = PK_TIME_MAX_2;//进入惩罚时间 - nextPkTimeCountDown(); + nextPkTimeCountDown(5); } } @@ -2177,4 +2458,227 @@ 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); + String pkTime = StringUtil.getDurationText(time * 1000); + livePushRyViewHolder.textTime.setText(String.format(mContext.getString(R.string.pk_time), pkTime)); + mPkTimeCount = time; + pkCountdownTimer(); + } + 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; + } + } + } + + } + } + + } + + + /** + * PK倒计时 + */ + private void pkCountdownTimer() { + + mPkTimeCount--; + if (mPkTimeCount > 0) {// + if (mHandler != null) { + String s1 = StringUtil.getDurationText(mPkTimeCount * 1000); + livePushRyViewHolder.textTime.setText(String.format(mContext.getString(R.string.pk_time), s1)); + mHandler.sendEmptyMessageAtTime(WHAT_PK_TIME2, getNextSecondTime()); + } + } else { + livePushRyViewHolder.timeTitle.setVisibility(View.GONE); + if (mHandler != null) { + mHandler.removeCallbacksAndMessages(null); + } + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.PK_TIME_COUNT)); +// endDRGif(); + if (DRInitiator) { + LiveNetManager.get(mContext).jieshuDRPK("" + IMLoginManager.get(mContext).getUserInfo().getId()); + } + } + } + + } 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 ce6ea69f5..e22306814 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; @@ -281,42 +279,58 @@ 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(); + // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.SOCKET_LIVE_DRPK_SET_PK_VIEW) + ); } } else if (action3 == 5) { -// EventBus.getDefault().post(new LiveAudienceEvent() -// .setType(LiveAudienceEvent.LiveAudienceType.PK_TIME_COUNT)); +// 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(); + // LiveAudienceActivity.getmLivePlayViewHolder().setPkEndview(); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.SOCKET_LIVE_DRPK_SET_PK_END_VIEW) + ); + } //創建了多人房間 } else if (action3 == 3) { - if (LiveAudienceActivity.getmLivePlayViewHolder() != null) { + /* if (LiveAudienceActivity.getmLivePlayViewHolder() != null) { LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); - } + }*/ + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.SOCKET_LIVE_DRPK_SET_PK_VIEW) + ); isDRPK = 1; } else if (action3 == 10) { if (!map.getString("uid").equals(CommonAppConfig.getInstance().getUid())) { - LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); + // LiveAudienceActivity.getmLivePlayViewHolder().setPkview(); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.SOCKET_LIVE_DRPK_SET_PK_VIEW) + ); } } @@ -363,6 +377,13 @@ public class SocketRyClient { } else if (action == 19) { mListener.onAnchorInvalid(); } + //主播强制下播 + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.LIVE_END) + .setVotes(map.getString("votes")) + .setLength(map.getString("length")) + .setNums(map.getIntValue("nums")) + .setUname(map.getString("uname"))); break; case Constants.SOCKET_CHANGE_LIVE://主播切换计时收费类型 mListener.onChangeTimeCharge(map.getIntValue("type_val")); @@ -529,6 +550,7 @@ public class SocketRyClient { } break; case Constants.AI_AUTOMATIC_SPEECH: + case Constants.AI_AUTOMATIC_SPEECH_LIVE: //{"name_color":"#f19ec2","ai_name":"助手小小P","content":"@1 ","user_name":"1","icon":"https://downs.yaoulive.com/xzs_tab.png","system_bubble":"https://downs.yaoulive.com/xzs_qipao.9.png"} AiAutomaticSpeechModel aiAutomaticSpeechModel = GsonUtils.fromJson(map.getString("ct"), AiAutomaticSpeechModel.class); Bus.get().post(new LiveAudienceEvent() @@ -550,6 +572,11 @@ public class SocketRyClient { .setType(LiveAudienceEvent.LiveAudienceType.LUCKY_ANGEL) .setMsgModel(GsonUtils.fromJson(map.getJSONObject("ct").toString(), MsgModel.class))); break; + case Constants.Lucky100Check: + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.LUCKY_100_CHECK) + .setMsgModel(GsonUtils.fromJson(map.getJSONObject("ct").toString(), MsgModel.class))); + break; case Constants.PK_RANK_UPDATE: Log.i("PK排位", map.toString()); JSONObject item = map.getJSONObject("ct"); @@ -911,7 +938,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); } } @@ -1061,16 +1093,8 @@ 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(); - } - 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); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.DISCONNEXT_PK_TIME)); //断开连麦 HttpClient.getInstance().post("livepk.setliveuserout", "livepk.setliveuserout") .execute(new HttpCallback() { diff --git a/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java b/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java index 53e515f8b..602dd7cd2 100644 --- a/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java +++ b/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java @@ -68,10 +68,13 @@ public class AllMsgTextRender { ImgLoader.displayDrawable(context, url, new ImgLoader.DrawableCallback() { @Override public void onLoadSuccess(Drawable drawable) { - builder = createPrefix(drawable, builder); - builder = renderMsg(color2, builder, text); - textView.setText(builder); - giftAnimPresenter.setCountDownTimerEnd(intoIndex); + if (builder!=null&&!builder.toString().contains(text)){ + builder = createPrefix(drawable, builder); + builder = renderMsg(color2, builder, text); + textView.setText(builder); + giftAnimPresenter.setCountDownTimerEnd(intoIndex); + } + } @Override diff --git a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java new file mode 100644 index 000000000..ae558dcdf --- /dev/null +++ b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java @@ -0,0 +1,408 @@ +package com.yunbao.live.utils; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.ViewGroup; +import android.widget.RelativeLayout; + +import androidx.annotation.NonNull; + +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.analytics.AnalyticsListener; +import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; +import com.google.android.exoplayer2.ui.StyledPlayerView; +import com.google.android.exoplayer2.video.VideoSize; + +/** + * 直播间播放器管理器 + * 通过预加载子播放器来实现无缝切换分辨率功能 + */ +public class LiveExoPlayerManager { + private final int MODEL_PLAY1 = 0;//当前主播放器 + private final int MODEL_PLAY2 = 1;//当前子播放器 + private ExoPlayer player1; + private ExoPlayer player2; + private StyledPlayerView mainView;//渲染视图 + private int status = MODEL_PLAY1; + private Player.Listener listener; + private boolean isSwitchUrl = false;//是否为主动切换播放器 + private final String TAG = "播放器"; + private int playBufferIndex = 0;//卡顿计数器 + private final Handler handler; + private static double log_buffer_time = 0, log_buffer_max_time; + private String url = ""; + + public LiveExoPlayerManager(Context mContext) { + DefaultLoadControl control = new DefaultLoadControl.Builder() + .setPrioritizeTimeOverSizeThresholds(false) + .setBackBuffer(10_000, true) + .setBufferDurationsMs(500, + 5_000, + 150, + 200) + .build(); + player1 = new ExoPlayer.Builder(mContext).setLoadControl(control).build(); + player2 = new ExoPlayer.Builder(mContext).setLoadControl(control).build(); + player1.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); + player2.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); + + handler = new Handler(Looper.getMainLooper()); + setListener(); + setAnalyticsListener(); + } + + + public void setListener(Player.Listener listener) { + this.listener = listener; + } + + public void setMainView(StyledPlayerView mainView) { + this.mainView = mainView; + this.mainView.setKeepContentOnPlayerReset(true); + } + + public void setViewResizeMode(boolean isPhone) { + Log.i(TAG, "setViewResizeMode: " + isPhone); + mainView.setResizeMode(isPhone ? AspectRatioFrameLayout.RESIZE_MODE_ZOOM : AspectRatioFrameLayout.RESIZE_MODE_FIT); + mainView.requestLayout(); + } + + public boolean isViewResizeModeToPhone() { + return mainView.getResizeMode() == AspectRatioFrameLayout.RESIZE_MODE_ZOOM; + } + + private void setAnalyticsListener() { + player1.addAnalyticsListener(new AnalyticsListener() { + @Override + public void onPlaybackStateChanged( + @NonNull EventTime eventTime, int state) { + Log.d(TAG, "onPlaybackStateChanged(1) called with: eventTime = [" + eventTime + "], state = [" + state + "]"); + } + + @Override + public void onDroppedVideoFrames( + @NonNull EventTime eventTime, int droppedFrames, long elapsedMs) { + Log.d(TAG, "onDroppedVideoFrames(1) called with: eventTime = [" + eventTime + "], droppedFrames = [" + droppedFrames + "], elapsedMs = [" + elapsedMs + "]"); + } + }); + + player2.addAnalyticsListener(new AnalyticsListener() { + @Override + public void onPlaybackStateChanged( + @NonNull EventTime eventTime, int state) { + Log.d(TAG, "onPlaybackStateChanged(2) called with: eventTime = [" + eventTime.totalBufferedDurationMs + "], state = [" + state + "]"); + } + + @Override + public void onDroppedVideoFrames( + @NonNull EventTime eventTime, int droppedFrames, long elapsedMs) { + Log.d(TAG, "onDroppedVideoFrames(2) called with: eventTime = [" + eventTime + "], droppedFrames = [" + droppedFrames + "], elapsedMs = [" + elapsedMs + "]"); + } + }); + + } + + /** + * 延迟1秒还未恢复播放则认为卡顿了,可以切分辨率了 + */ + private final Runnable buffRunnable = new Runnable() { + @Override + public void run() { + playBufferIndex = 0; + listener.onPlaybackStateChanged(Player.STATE_BUFFERING); + replay(); + } + }; + + private void setListener() { + player1.addListener(new Player.Listener() { + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + Log.i(TAG, "onPlaybackStateChanged 1: " + playbackState); + if (playbackState == Player.STATE_READY && !player1.isPlaying()) { + player2.stop(); + player2.clearVideoSurface(); + player1.play(); + Log.i(TAG, "切换播放器1"); + handler.removeCallbacks(buffRunnable); + playBufferIndex = 0; + } else if (playbackState == Player.STATE_BUFFERING && status == MODEL_PLAY1 && !isSwitchUrl) { + if (listener != null) { + if (playBufferIndex++ == 0) { + handler.postDelayed(buffRunnable, 2000); + } + } + } + } + + @Override + public void onIsPlayingChanged(boolean isPlaying) { + Player.Listener.super.onIsPlayingChanged(isPlaying); + if (isPlaying) { + Log.i(TAG, "onIsPlayingChanged1: 播放了"); + //player1.setVideoSurfaceView(mainView); + if (log_buffer_time != -1) { + double tmp = (System.currentTimeMillis() - log_buffer_time) / 1000; + if (tmp > log_buffer_max_time) { + log_buffer_max_time = tmp; + } + //ToastUtil.show(String.format(Locale.CHINA, "从加载到播放 = %.3f,最大耗时 = %.3f", tmp, log_buffer_max_time)); + log_buffer_time = -1; + } + mainView.setPlayer(player1); + status = MODEL_PLAY1; + isSwitchUrl = false; + handler.removeCallbacks(buffRunnable); + if (getNextPlayer().isPlaying()) { + getNextPlayer().stop(); + } + if (listener != null) { + listener.onIsPlayingChanged(true); + } + } + } + + @Override + public void onVideoSizeChanged(@NonNull VideoSize videoSize) { + Player.Listener.super.onVideoSizeChanged(videoSize); + setViewResizeMode(videoSize.height > videoSize.width); + Log.i(TAG, "onVideoSizeChanged: width = " + videoSize.width + " height = " + videoSize.height); + if (listener != null) { + listener.onVideoSizeChanged(videoSize); + } + } + + @Override + public void onIsLoadingChanged(boolean isLoading) { + Player.Listener.super.onIsLoadingChanged(isLoading); + Log.i(TAG, "onIsLoadingChanged: 1 " + isLoading); + } + + @Override + public void onPlayerError(@NonNull PlaybackException error) { + Player.Listener.super.onPlayerError(error); + error.printStackTrace(); + replay(); + } + }); + + player2.addListener(new Player.Listener() { + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + Log.i(TAG, "onPlaybackStateChanged 2: " + playbackState); + if (playbackState == Player.STATE_READY && !player2.isPlaying()) { + player1.stop(); + player1.clearVideoSurface(); + player2.play(); + Log.i(TAG, "切换播放器2 " + player2.isPlaying()); + handler.removeCallbacks(buffRunnable); + playBufferIndex = 0; + } else if (playbackState == Player.STATE_BUFFERING && status == MODEL_PLAY2 && !isSwitchUrl) { + if (listener != null) { + if (playBufferIndex++ == 0) { + handler.postDelayed(buffRunnable, 2000); + } + } + } + } + + @Override + public void onIsPlayingChanged(boolean isPlaying) { + Player.Listener.super.onIsPlayingChanged(isPlaying); + if (isPlaying) { + Log.i(TAG, "onIsPlayingChanged2: 播放了"); + //player2.setVideoSurfaceView(mainView); + mainView.setPlayer(player2); + double tmp = (System.currentTimeMillis() - log_buffer_time) / 1000; + if (tmp > log_buffer_max_time) { + log_buffer_max_time = tmp; + } + //ToastUtil.show(String.format(Locale.CHINA, "从加载到播放 = %.3f,最大耗时 = %.3f", tmp, log_buffer_max_time)); + log_buffer_time = -1; + status = MODEL_PLAY2; + if (getNextPlayer().isPlaying()) { + getNextPlayer().stop(); + } + handler.removeCallbacks(buffRunnable); + isSwitchUrl = false; + if (listener != null) { + listener.onIsPlayingChanged(true); + } + } + } + + @Override + public void onVideoSizeChanged(@NonNull VideoSize videoSize) { + Player.Listener.super.onVideoSizeChanged(videoSize); + setViewResizeMode(videoSize.height > videoSize.width); + if (listener != null) { + listener.onVideoSizeChanged(videoSize); + } + } + + @Override + public void onIsLoadingChanged(boolean isLoading) { + Player.Listener.super.onIsLoadingChanged(isLoading); + Log.i(TAG, "onIsLoadingChanged: 2 " + isLoading); + } + + @Override + public void onPlayerError(@NonNull PlaybackException error) { + Player.Listener.super.onPlayerError(error); + error.printStackTrace(); + replay(); + } + }); + } + + /** + * 开始播放 + * + * @param url 地址 + */ + public void startUrl(String url) { + if (url != null && url.equals(this.url)) return; + Log.i(TAG, "startUrl: " + url + " > " + mainView.getResizeMode()); + handler.removeCallbacks(buffRunnable); + this.url = url; + isSwitchUrl = true; + playBufferIndex = 0; + log_buffer_time = System.currentTimeMillis(); + //getNowPlayer().setVideoSurfaceView(mainView); + mainView.setKeepContentOnPlayerReset(false); + mainView.setPlayer(getNowPlayer()); + mainView.setKeepContentOnPlayerReset(true); + getNowPlayer().setMediaItem(createMediaItem(url)); + getNowPlayer().prepare(); + getNowPlayer().play(); + handler.postDelayed(buffRunnable, 10000); + } + + /** + * 无缝切换 + * + * @param url 地址 + */ + public void switchUrl(String url) { + if (url != null && url.equals(this.url)) return; + Log.i(TAG, "switchUrl: " + url + " src : " + this.url); + this.url = url; + playBufferIndex = 0; + isSwitchUrl = true; + log_buffer_time = System.currentTimeMillis(); + mainView.setKeepContentOnPlayerReset(true); + getNextPlayer().setMediaItem(createMediaItem(url)); + getNextPlayer().prepare(); + } + + private MediaItem createMediaItem(String url) { + return MediaItem.fromUri(url); + } + + /** + * 获取当前播放器 + */ + public ExoPlayer getNowPlayer() { + return status == MODEL_PLAY1 ? player1 : player2; + } + + /** + * 获取下一个播放器。 + */ + private ExoPlayer getNextPlayer() { + return status == MODEL_PLAY1 ? player2 : player1; + } + + /** + * 是否正在播放 + */ + public boolean isPlaying() { + if (getNowPlayer() != null) { + return getNowPlayer().isPlaying(); + } + return false; + } + + /** + * 停止播放 + */ + public void stop() { + if (getNowPlayer() != null) { + getNowPlayer().stop(); + } + clearUrl(); + } + + /** + * 开始播放 + */ + public void play() { + getNowPlayer().play(); + } + + public void replay() { + Log.i(TAG, "replay: 重载播放"); + if (getNowPlayer() != null) { + getNowPlayer().stop(); + } + if (getNextPlayer() != null) { + getNextPlayer().stop(); + } + String tmp = url; + url = null; + startUrl(tmp); + } + + public void clearFrame() { + mainView.setKeepContentOnPlayerReset(false); + if (mainView.getVideoSurfaceView() != null) { + mainView.setPlayer(null); + } + } + + /** + * 释放播放器 + */ + public void release() { + Log.i(TAG, "release: 释放播放器"); + if (player1 != null) { + player1.clearVideoSurface(); + player1.release(); + } + if (player2 != null) { + player2.clearVideoSurface(); + player2.release(); + } + player1 = null; + player2 = null; + mainView.setKeepContentOnPlayerReset(false); + mainView.setPlayer(null); + RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mainView.getLayoutParams(); + layoutParams.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + mainView.setLayoutParams(layoutParams); + mainView.removeAllViews(); + mainView.requestLayout(); + handler.removeCallbacks(buffRunnable); + } + + public void clearUrl() { + url = ""; + handler.removeCallbacks(buffRunnable); + } + + public String getUrl() { + if (url == null) { + url = ""; + } + return url; + } +} diff --git a/live/src/main/java/com/yunbao/live/utils/LiveTextRender.java b/live/src/main/java/com/yunbao/live/utils/LiveTextRender.java index 8699d194f..da83aca91 100644 --- a/live/src/main/java/com/yunbao/live/utils/LiveTextRender.java +++ b/live/src/main/java/com/yunbao/live/utils/LiveTextRender.java @@ -1,5 +1,6 @@ package com.yunbao.live.utils; +import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -157,6 +158,22 @@ public class LiveTextRender { builder.setSpan(new ForegroundColorSpan(Color.parseColor("#FFF86C")), giftIndexOf, giftIndexOf + giftSize, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mTextView.setText(builder); } + /** + * 幸运100%活动 + */ + public void lucky100(Context mContext, TextView mTextView, MsgModel msgModel){ + String msg = mContext.getString(R.string.lucky_100); + msg = String.format(msg, msgModel.getUserName(), msgModel.getGiftName()); + int unameIndexOf = msg.indexOf(msgModel.getUserName()); + int giftIndexOf = msg.indexOf(msgModel.getGiftName()); + int unameSize = msgModel.getUserName().length(); + int giftSize = msgModel.getGiftName().length(); + SpannableStringBuilder builder = new SpannableStringBuilder(); + builder.append(msg); + builder.setSpan(new ForegroundColorSpan(Color.parseColor("#78FEFF")), unameIndexOf, unameIndexOf + unameSize, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + builder.setSpan(new ForegroundColorSpan(Color.parseColor("#FFF86C")), giftIndexOf, giftIndexOf + giftSize, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + mTextView.setText(builder); + } public void aiAutomaticSpeech(Context activity, TextView textView, AiAutomaticSpeechModel model) { ImgLoader.displayDrawable(activity, model.getIcon(), new ImgLoader.DrawableCallback() { @@ -408,6 +425,11 @@ public class LiveTextRender { */ public void getLevelImage(Context mContext, int userLevel, ImgLoader.DrawableCallback callback) { mCallback = callback; + if(mContext instanceof Activity){ + if(((Activity)mContext).isDestroyed()){ + mContext=CommonAppContext.getTopActivity(); + } + } List models = new NewLevelManager(mContext).getNewLevelModels(); String imgUrl = "https://downs.yaoulive.com/level/user_lv1_bg.png"; for (NewLevelModel newLevelModel : models) { 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 cd95be954..2b1c7e4f2 100644 --- a/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java @@ -32,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; diff --git a/live/src/main/java/com/yunbao/live/views/LiveLinkMicPkViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveLinkMicPkViewHolder.java index 616b14366..0a83e1c49 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveLinkMicPkViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveLinkMicPkViewHolder.java @@ -190,8 +190,12 @@ public class LiveLinkMicPkViewHolder extends AbsViewHolder { public void setTime(String content) { if (mTime != null) { - - mTime.setText(content); + Log.i("vvvs",content); + if(content.trim().equals("00:00")){ + mTime.setText("結算中"); + }else { + mTime.setText(content); + } } } diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java index 57be40428..9312232bc 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -1,5 +1,7 @@ package com.yunbao.live.views; +import static com.yunbao.live.event.LiveAudienceEvent.LiveAudienceType.WISH_LIST_UPDATE; + import android.app.Dialog; import android.content.Context; import android.graphics.drawable.Drawable; @@ -7,24 +9,32 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BasePopupView; +import com.lxj.xpopup.interfaces.XPopupCallback; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.bean.LiveClassBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.common.bean.UserBean; +import com.yunbao.common.event.LivePushRyEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.ImageResultCallback; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.L; import com.yunbao.common.utils.ProcessImageUtil; @@ -32,24 +42,32 @@ import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.common.views.AbsViewHolder; +import com.yunbao.common.views.LiveClarityCustomPopup; +import com.yunbao.common.views.LiveOpenCustomPopup; import com.yunbao.common.views.LiveRobotSettingCustomPopup; +import com.yunbao.common.views.weight.ViewClicksAntiShake; import com.yunbao.faceunity.FaceManager; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveRyAnchorActivity; -import com.yunbao.live.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveFaceUnityDialogFragment; import com.yunbao.live.dialog.LiveNewRoomClassDialogFragment; import com.yunbao.live.dialog.LiveNewRoomTypeDialogFragment; import com.yunbao.live.dialog.LiveNewWishListDialogFragment; import com.yunbao.live.dialog.LiveTimeDialogFragment; +import com.yunbao.live.event.LiveAudienceEvent; import com.yunbao.live.http.LiveHttpConsts; import com.yunbao.live.http.LiveHttpUtil; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + import java.io.File; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.stream.RCRTCCameraOutputStream; +import cn.rongcloud.rtc.api.stream.RCRTCVideoStreamConfig; +import cn.rongcloud.rtc.base.RCRTCParamsType; public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnClickListener { @@ -59,7 +77,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl private ProcessImageUtil mImageUtil; private File mAvatarFile; private TextView mLiveClass; - private TextView mLiveTypeTextView;//房间类型TextView + private TextView mLiveTypeTextView, liveClarity;//房间类型TextView private TextView mLiveWishListTextView;//心愿单TextView private int mLiveClassID;//直播频道id private int mLiveType;//房间类型 @@ -70,6 +88,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl private LiveClassBean classBean; private FaceManager manager; private TextView faceTextView;//提示人脸未检测到的TextView + private ImageView imgClarity; + private int selectClarity = 1; + private LiveOpenCustomPopup liveOpenCustomPopup; public LiveNewReadyRyViewHolder(Context context, ViewGroup parentView, int liveSdk) { super(context, parentView, liveSdk); @@ -90,6 +111,8 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl @Override public void init() { mRootView = (ConstraintLayout) findViewById(R.id.traceroute_rootview); + imgClarity = (ImageView) findViewById(R.id.img_clarity); + liveClarity = (TextView) findViewById(R.id.live_clarity); mRootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -163,6 +186,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl findViewById(R.id.btn_start_live).setOnClickListener(this); findViewById(R.id.btn_wishlist).setOnClickListener(this); findViewById(R.id.btn_horizontally).setOnClickListener(this); + if (manager != null) { manager.setFaceStatusChanged(new FaceManager.FaceStatusChanged() { final Handler handler = new Handler(Looper.getMainLooper()); @@ -180,13 +204,135 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl }); //新美颜 setFaceUnity(true); + } + //设置清晰度 +// DeviceUtils.getMemory(mContext); //获取可用内存 +// DeviceUtils.getNetSpeed(mContext);//获取当前上传网速 +// Log.e("网速和内存", "内存:" + + " 网速:" + DeviceUtils.getNetSpeed(mContext)); + + IMLoginManager.get(mContext).setSelectClarity(selectClarity); + setSelectClarity(IMLoginManager.get(mContext).getSelectClarity()); + ViewClicksAntiShake + .clicksAntiShake( + findViewById(R.id.btn_live_clarity), () -> { + + LiveClarityCustomPopup liveClarityCustomPopup = + new LiveClarityCustomPopup(mContext, + IMLoginManager.get(mContext).getSelectClarity(), + IMLoginManager.get(mContext).getClarity() ? 0 : LiveClarityCustomPopup.BAN_1080, false); + new XPopup.Builder(mContext) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + setSelectClarity(liveClarityCustomPopup.getSelectClarity()); + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) + .asCustom(liveClarityCustomPopup) + .show(); + }); + } + + private void setSelectClarity(int selectClarity) { + + this.selectClarity = selectClarity; + IMLoginManager.get(mContext).setSelectClarity(selectClarity); + switch (selectClarity) { + case 0: + imgClarity.setImageResource(R.mipmap.icon_sd); + liveClarity.setText(R.string.standard_clear); + break; + case 1: + imgClarity.setImageResource(R.mipmap.icon_hd); + liveClarity.setText(R.string.high_definition); + break; + case 2: + imgClarity.setImageResource(R.mipmap.icon_fhd); + liveClarity.setText(R.string.ultra_hd); + break; + } + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.setSelectClarity(selectClarity); + } + //設置開播分辨率 + RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + int minRate = 200; + int maxRate = 900; + switch (selectClarity) { + case 0: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + minRate = 200; + maxRate = 900; + break; + case 1: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280; + minRate = 250; + maxRate = 2200; + break; + case 2: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_1080_1920; + minRate = 400; + maxRate = 4000; + break; + } + RCRTCVideoStreamConfig config = + RCRTCVideoStreamConfig.Builder.create() + .setMinRate(minRate) + .setMaxRate(maxRate) + .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_15) + .setVideoResolution(rcrtcVideoResolution) + .build(); + RCRTCEngine.getInstance().getDefaultVideoStream().setVideoConfig(config); + Log.e("切换分辨率", "时间戳" + System.currentTimeMillis()); + //重新发布一下流 + Bus.get().post(new LivePushRyEvent()); } public void setManager(FaceManager manager) { this.manager = manager; } + @Override public void onClick(View v) { if (!canClick()) { @@ -211,8 +357,164 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } else if (i == R.id.btn_room_type) { chooseLiveType(); } else if (i == R.id.btn_start_live) { - startLive(); + if (mLiveClassID == 0) { + ToastUtil.show(R.string.live_choose_live_class); + return; + } +// startLive(); + liveOpenCustomPopup = new LiveOpenCustomPopup(mContext, IMLoginManager.get(mContext).getSelectClarity(), classBean, liveRoomTypeBean) + .setCallBack(new LiveOpenCustomPopup.LiveOpenCallBack() { + @Override + public void startLive(LiveRoomTypeBean liveRoomTypeModel, LiveClassBean classModel) { + if (classModel != null) { + classBean = classModel; + mLiveClassID = classBean.getId(); + } + liveRoomTypeBean = liveRoomTypeModel; + mLiveType = liveRoomTypeModel.getId(); + startLiveInit(); + liveOpenCustomPopup = null; + } + + @Override + public void selectClarity(int selectClarity) { + LiveClarityCustomPopup liveClarityCustomPopup = + new LiveClarityCustomPopup(mContext, + IMLoginManager.get(mContext).getSelectClarity(), + IMLoginManager.get(mContext).getClarity() ? 0 : LiveClarityCustomPopup.BAN_1080, false); + new XPopup.Builder(mContext) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + setSelectClarity(liveClarityCustomPopup.getSelectClarity()); + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) + .asCustom(liveClarityCustomPopup) + .show(); + } + + @Override + public void openRobot() { + LiveRobotSettingCustomPopup liveRobotSettingCustomPopup = new LiveRobotSettingCustomPopup(mContext); + new XPopup.Builder(mContext) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.initDate(); + } + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) + .asCustom(liveRobotSettingCustomPopup) + .show(); + } + + @Override + public void openLiveRoomType(LiveRoomTypeBean liveRoomTypeModel) { + liveRoomTypeBean = liveRoomTypeModel; + mLiveType = liveRoomTypeModel.getId(); + chooseLiveType(); + } + + @Override + public void openLiveClass(LiveClassBean classModel) { + if (classModel != null) { + classBean = classModel; + mLiveClassID = classBean.getId(); + } + chooseLiveClass(); + } + + @Override + public void openWishlist() { + //点击心愿单 + openWishListWindow(); + } + }); + new XPopup.Builder(mContext) + .asCustom(liveOpenCustomPopup) + .show(); } else if (i == R.id.btn_locaiton) { switchLocation(); } else if (i == R.id.btn_horizontally) { @@ -249,6 +551,16 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl if (mContext instanceof LiveRyAnchorActivity) { fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "RY"); + + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void updateStart(LiveAudienceEvent event) { + if (event.getType() == WISH_LIST_UPDATE) { + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.initDate(); + } } } @@ -336,6 +648,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl classBean = bean; mLiveClassID = classBean.getId(); mLiveClass.setText(bean.getName()); + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.setClassBean(classBean); + } } }); fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "LiveRoomTypeDialogFragment"); @@ -355,6 +670,8 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl /** * 选择直播类型 */ + private LiveRoomTypeBean liveRoomTypeBean = new LiveRoomTypeBean(0, WordUtil.getString(R.string.live_room_public)); + private void chooseLiveType() { Bundle bundle = new Bundle(); bundle.putInt(Constants.CHECKED_ID, mLiveType); @@ -363,6 +680,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl fragment.setCallback(new CommonCallback() { @Override public void callback(LiveRoomTypeBean bean) { + liveRoomTypeBean = bean; switch (bean.getId()) { case Constants.LIVE_TYPE_NORMAL: onLiveTypeNormal(bean); @@ -377,6 +695,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl onLiveTypeTime(bean); break; } + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.setLiveRoomTypeBean(liveRoomTypeBean); + } } }); fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "LiveRoomTypeDialogFragment"); @@ -472,7 +793,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl /** * 点击开始直播按钮 */ - private void startLive() { + private void startLiveInit() { boolean startPreview = ((LiveRyAnchorActivity) mContext).isStartPreview(); // if (!startPreview) { // ToastUtil.show(R.string.please_wait); @@ -498,7 +819,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, IMLoginManager.get(mContext).getSelectClarity() + 1, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java index 374978a99..4dc373b50 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java @@ -128,7 +128,7 @@ public class LivePlayKsyViewHolder extends LiveRoomPlayViewHolder { * @param url 流地址 */ @Override - public void play(String url) { + public void play(String url,int playModel) { mPlayer = new V2TXLivePlayerImpl(mContext); if (TextUtils.isEmpty(url) || mVideoView == null) { @@ -142,6 +142,11 @@ public class LivePlayKsyViewHolder extends LiveRoomPlayViewHolder { } + @Override + public void switchStream(String url, int playModel) { + + } + @Override public void release() { diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index 1a790cac2..e4dedb4c0 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -6,46 +6,55 @@ import static cn.rongcloud.rtc.core.RendererCommon.ScalingType.SCALE_ASPECT_FILL import android.Manifest; import android.app.Dialog; import android.content.Context; -import android.graphics.Bitmap; import android.graphics.Color; import android.media.AudioManager; -import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.ui.StyledPlayerView; +import com.google.android.exoplayer2.video.VideoSize; +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BasePopupView; +import com.lxj.xpopup.interfaces.XPopupCallback; import com.lzf.easyfloat.EasyFloat; import com.lzy.okserver.OkDownload; -import com.lzy.okserver.download.DownloadTask; -import com.tencent.live2.V2TXLiveDef; -import com.tencent.live2.V2TXLivePlayer; -import com.tencent.live2.V2TXLivePlayerObserver; -import com.tencent.live2.impl.V2TXLivePlayerImpl; -import com.tencent.rtmp.ui.TXCloudVideoView; -import com.yunbao.common.bean.CrashSaveBean; +import com.yunbao.common.bean.EnterRoomNewModel; +import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; -import com.yunbao.common.utils.DeviceUtils; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; import com.yunbao.common.utils.MicStatusManager; import com.yunbao.common.utils.ScreenDimenUtil; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.LiveClarityCustomPopup; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveAudienceActivity; +import com.yunbao.live.event.LiveAudienceEvent; +import com.yunbao.live.utils.LiveExoPlayerManager; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -56,7 +65,6 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; -import java.util.Map; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.RCRTCRemoteUser; @@ -79,7 +87,10 @@ import cn.rongcloud.rtc.base.RCRTCMediaType; import cn.rongcloud.rtc.base.RCRTCParamsType; import cn.rongcloud.rtc.base.RCRTCRemoteVideoFrame; import cn.rongcloud.rtc.base.RCRTCRoomType; +import cn.rongcloud.rtc.base.RCRTCStreamType; import cn.rongcloud.rtc.base.RTCErrorCode; +import cn.rongcloud.rtc.center.stream.RCRTCAudioInputStreamImpl; +import cn.rongcloud.rtc.core.RendererCommon; public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @@ -89,7 +100,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { private ViewGroup mLeftContainer; private ViewGroup mRightContainer; private RelativeLayout mPkContainer; - public static TXCloudVideoView mVideoView; + public StyledPlayerView mVideoView; private View mLoading, mLoading2; private ImageView mCover; @@ -100,21 +111,21 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { private boolean mPausedPlay;//是否被动暂停了播放 public int landscape; //1h 2s - public static Context contexts; - public V2TXLivePlayer mPlayer; - public static FrameLayout ry_view; + public Context contexts; + public FrameLayout ry_view; - private static final int VIDEO_VERTICAL = 1; - private static final int VIDEO_HORIZONTAL = 2; - int videoLandscape; // 视频方向,1=竖屏,2=横屏 + private static final int VIDEO_VERTICAL = 2; + private static final int VIDEO_HORIZONTAL = 1; + int videoLandscape = -1; // 视频方向,2=竖屏,1=横屏 static int vHeight;//视频高 private TextView debugView; - + private LiveExoPlayerManager mPlayer; + private boolean isPk = false; //0未申请1申请中2连麦中 RCRTCRoom rcrtcRoom; - String purl; + String purl, srcUrl; public int getLandscape() { return landscape; @@ -135,13 +146,15 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Override public void init() { + Log.i(TAG, "init: 初始化播放器ViewHolder"); EventBus.getDefault().register(this); + Bus.getOn(this); mRoot = (ViewGroup) findViewById(R.id.root); mSmallContainer = (ViewGroup) findViewById(R.id.small_container); mLeftContainer = (ViewGroup) findViewById(R.id.left_container); mRightContainer = (ViewGroup) findViewById(R.id.right_container); mPkContainer = (RelativeLayout) findViewById(R.id.pk_container); - mVideoView = (TXCloudVideoView) findViewById(R.id.video_view); + mVideoView = (StyledPlayerView) findViewById(R.id.video_view); ry_view = (FrameLayout) findViewById(R.id.ry_view); leave = (ImageView) findViewById(R.id.leave); mLoading = findViewById(R.id.loading); @@ -154,9 +167,10 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mPkContainer.getLayoutParams(); params.height = vHeight; mPkContainer.requestLayout(); - mPlayer = new V2TXLivePlayerImpl(mContext); - mPlayer.setRenderView(mVideoView); + mPlayer = new LiveExoPlayerManager(mContext); + mPlayer.setMainView(mVideoView); + mPlayer.setListener(new ExoPlayerListener()); debugView = new TextView(mContext); debugView.setBackgroundColor(Color.WHITE); @@ -192,7 +206,11 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Override public synchronized void setLiveBeanLandscape(int landscape) { +// landscape=1; + Log.i(TAG, "setLiveBeanLandscape: " + landscape); this.landscape = landscape; + this.videoLandscape = landscape; + mPlayer.setViewResizeMode(landscape == VIDEO_VERTICAL); if (landscape == 2) { Log.i("收到socket--->", "还原9:16"); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); @@ -234,6 +252,12 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } } + @Override + public void setLiveEnterRoomNewModel(EnterRoomNewModel data) { + super.setLiveEnterRoomNewModel(data); + isPk = data.getEnterRoomInfo().getIsconnection().equals("1"); + } + /** * 暂停播放 */ @@ -247,13 +271,11 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { */ @Override public void resumePlay() { - if (mPlayer.isPlaying() != 1) { + if (!mPlayer.isPlaying()) { new Handler(Looper.getMainLooper()) .postDelayed(() -> { - mPlayer.stopPlay(); - int val = mPlayer.startPlay(purl); + mPlayer.replay(); // ToastUtil.show("强制播放" + val); - Log.i(TAG, "强制播放: " + val); }, 100); } } @@ -264,7 +286,53 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { * @param url 流地址 */ @Override - public void play(String url) { + public void play(String url, int playModel) { + srcUrl = url; + PLAY_MODEL = playModel; + Log.i(TAG, "play" + " url:" + url + " playModel: " + playModel + " landscape: " + landscape + " videoLandscape" + videoLandscape); + if (playModel != PLAY_MODEL_DEF && !url.contains(videoFps[0] + ".flv")) { + mPlayer.setViewResizeMode(landscape == VIDEO_VERTICAL); + if (landscape == VIDEO_VERTICAL && !isPk) { + url = url.replace(".flv", videoRatioVertical[playModel] + videoFps[0] + ".flv"); + } else if (landscape == VIDEO_HORIZONTAL || isPk) { + url = url.replace(".flv", videoRatioHorizontal[playModel] + videoFps[0] + ".flv"); + } + } else if (!url.contains(videoFps[0] + ".flv")) { + mPlayer.setViewResizeMode(false); + } + Log.e("purl121", url); + + if (TextUtils.isEmpty(url) || mVideoView == null) { + return; + } + + if (TextUtils.isEmpty(url) || mVideoView == null) { + return; + } + if (mPlayer.isPlaying()) { + mPlayer.stop(); + mPlayer.clearUrl(); + } + mPlayer.startUrl(url); + purl = url; + onPrepared(); + } + + @Override + public void switchStream(String url, int playModel) { + srcUrl = url; + PLAY_MODEL = playModel; + Log.i(TAG, "switchStream: " + " url:" + url + " playModel: " + playModel + " landscape: " + landscape + " videoLandscape = " + videoLandscape + " ispk = " + isPk + " bean = " + roomModel.getEnterRoomInfo().getIsconnection()); + if (playModel != PLAY_MODEL_DEF && !url.contains(videoFps[0] + ".flv")) { + mPlayer.setViewResizeMode(landscape == VIDEO_VERTICAL); + if (landscape == VIDEO_VERTICAL && !isPk) { + url = url.replace(".flv", videoRatioVertical[playModel] + videoFps[0] + ".flv"); + } else if (landscape == VIDEO_HORIZONTAL || isPk) { + url = url.replace(".flv", videoRatioHorizontal[playModel] + videoFps[0] + ".flv"); + } + } else if (!url.contains(videoFps[0] + ".flv")) { + mPlayer.setViewResizeMode(false); + } Log.e("purl121", url); if (TextUtils.isEmpty(url) || mVideoView == null) { @@ -275,150 +343,84 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { if (TextUtils.isEmpty(url) || mVideoView == null) { return; } - mVideoView.clearLastFrame(true); - mPlayer.setObserver(new V2TXLivePlayerObserver() { - String TAG = "播放流"; - - @Override - public void onError(V2TXLivePlayer player, int code, String msg, Bundle extraInfo) { - super.onError(player, code, msg, extraInfo); - Log.i(TAG, "onError: player = " + player + ", code = " + code + ", msg = " + msg + ", extraInfo = " + extraInfo); - debugView.setText("播放出错code=" + code + " msg=" + msg); - } - - @Override - public void onWarning(V2TXLivePlayer player, int code, String msg, Bundle extraInfo) { - super.onWarning(player, code, msg, extraInfo); - Log.i(TAG, "onWarning: " + "player = " + player + ", code = " + code + ", msg = " + msg + ", extraInfo = " + extraInfo); - if (code == 2105) { - // mPlayer.resumeVideo(); - // mPlayer.resumeAudio(); - mPlayer.stopPlay(); - mPlayer.startPlay(purl); - } - debugView.setText("播放警告code=" + code + " msg=" + msg); - } - - @Override - public void onVideoPlayStatusUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayStatus status, V2TXLiveDef.V2TXLiveStatusChangeReason reason, Bundle extraInfo) { - super.onVideoPlayStatusUpdate(player, status, reason, extraInfo); - //Log.i(TAG, "onVideoPlayStatusUpdate: " + "player = " + player + ", status = " + status + ", reason = " + reason + ", extraInfo = " + extraInfo); - } - - @Override - public void onAudioPlayStatusUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayStatus status, V2TXLiveDef.V2TXLiveStatusChangeReason reason, Bundle extraInfo) { - super.onAudioPlayStatusUpdate(player, status, reason, extraInfo); - //Log.i(TAG, "onAudioPlayStatusUpdate: " + "player = " + player + ", status = " + status + ", reason = " + reason + ", extraInfo = " + extraInfo); - } - - @Override - public void onPlayoutVolumeUpdate(V2TXLivePlayer player, int volume) { - super.onPlayoutVolumeUpdate(player, volume); - - } - - @Override - public void onStatisticsUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayerStatistics statistics) { - super.onStatisticsUpdate(player, statistics); - Map taskMap = OkDownload.getInstance().getTaskMap(); - StringBuilder buffer = new StringBuilder(); - buffer.append("|"); - for (String key : taskMap.keySet()) { - DownloadTask task = taskMap.get(key); - buffer.append(task.progress.fileName).append(":"); - int status = task.progress.status; - switch (status) { - case 0: - buffer.append("无状态"); - break; - case 1: - buffer.append("等待"); - break; - case 2: - buffer.append("下载中:").append(task.progress.fraction); - break; - case 3: - buffer.append("暂停"); - break; - case 4: - buffer.append("错误"); - break; - case 5: - buffer.append("完成"); - - break; - } - - buffer.append("|"); - } - hideCover(); - String debugText = "视频码率:" + statistics.videoBitrate + "\n" + - "音频码率:" + statistics.audioBitrate + "\n" + - "FPS:" + statistics.fps + "\n" + - "CPU:" + statistics.appCpu + "\n" + - "剩余内存:" + DeviceUtils.getMemory(mContext) + "\n" + - "分辨率:" + statistics.height + "x" + statistics.width + "\n" + - "播放状态:" + mPlayer.isPlaying() + "\n" + - "运行时间:" + (System.currentTimeMillis() - CrashSaveBean.getInstance().getStartTime()) / 1000 + "\n"; - debugView.setText(debugText); - Log.i(TAG, "onStatisticsUpdate: " + JSON.toJSONString(statistics) + " |当前下载数 : " + OkDownload.getInstance().getTaskMap().size() + buffer); - if (statistics.height > statistics.width) { - videoLandscape = VIDEO_VERTICAL; - } else { - videoLandscape = VIDEO_HORIZONTAL; - } - if (statistics.fps == 0) { - OkDownload.getInstance().pauseAll(); - } else { - OkDownload.getInstance().startAll(); - } - } - - @Override - public void onSnapshotComplete(V2TXLivePlayer player, Bitmap image) { - super.onSnapshotComplete(player, image); - } - - @Override - public void onRenderVideoFrame(V2TXLivePlayer player, V2TXLiveDef.V2TXLiveVideoFrame videoFrame) { - super.onRenderVideoFrame(player, videoFrame); - } - - @Override - public void onReceiveSeiMessage(V2TXLivePlayer player, int payloadType, byte[] data) { - super.onReceiveSeiMessage(player, payloadType, data); - } - }); - + mPlayer.switchUrl(url); purl = url; - int V2TXLiveCode = mPlayer.startPlay(url); - onPrepared(); - } + boolean tmpPk = false; + String waitNextUrl = null; + + @Override + public void switchStreamPk(boolean isPk) { + super.switchStreamPk(isPk); + Log.i(TAG, "switchStreamPk: isPk1" + isPk + " tmp = " + !tmpPk + " isPk2 = " + this.isPk); + if (this.isPk && tmpPk) return; + if (isPk && !tmpPk || this.isPk) { + mPlayer.setViewResizeMode(false); + String url; + if (PLAY_MODEL != -1) { + url = srcUrl.replace(".flv", videoRatioHorizontal[PLAY_MODEL] + videoFps[0] + ".flv"); + } else { + url = srcUrl.replace(".flv", videoRatioHorizontal[1] + videoFps[0] + ".flv"); + } + if (!tmpPk) { + waitNextUrl = url; + } + mPlayer.switchUrl(srcUrl); + tmpPk = true; + } else if (!isPk) { + tmpPk = false; + if (landscape == VIDEO_VERTICAL && PLAY_MODEL != -1) { + waitNextUrl = srcUrl.replace(".flv", videoRatioVertical[PLAY_MODEL] + videoFps[0] + ".flv"); + } else if (landscape == VIDEO_HORIZONTAL && PLAY_MODEL != -1) { + waitNextUrl = srcUrl.replace(".flv", videoRatioHorizontal[PLAY_MODEL] + videoFps[0] + ".flv"); + } else { + waitNextUrl = null; + } + mPlayer.switchUrl(srcUrl); + } + } + + @Override + public void clearFrame() { + super.clearFrame(); + mPlayer.clearFrame(); + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); + params.addRule(RelativeLayout.ALIGN_TOP); + mVideoView.setLayoutParams(params); + mVideoView.requestLayout(); + + RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams) ry_view.getLayoutParams(); + params1.height = ViewGroup.LayoutParams.WRAP_CONTENT; + params1.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); + params1.addRule(RelativeLayout.ALIGN_TOP); + ry_view.setLayoutParams(params1); + ry_view.requestLayout(); + RelativeLayout.LayoutParams params2 = (RelativeLayout.LayoutParams) mCover.getLayoutParams(); + params2.height = DpUtil.dp2px(270); + params2.topMargin = DpUtil.dp2px(120); + mCover.setLayoutParams(params2); + mCover.requestLayout(); + } @Override public void release() { mEnd = true; mStarted = false; if (mPlayer != null) { - mPlayer.stopPlay(); - mPlayer = null; - } - if (mVideoView != null) { - mVideoView.clearLastFrame(true); - mVideoView.removeVideoView(); - mVideoView = null; - } - if (leave != null) { - leave.setImageDrawable(null); - leave = null; + mPlayer.stop(); + mPlayer.release(); } + Bus.getOff(this); + EventBus.getDefault().unregister(this); L.e(TAG, "release------->"); } @Override public void stopPlay() { + Log.i(TAG, "stopPlay: "); if (mCover != null) { mCover.setAlpha(1f); if (mCover.getVisibility() != View.VISIBLE) { @@ -426,7 +428,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } } if (mPlayer != null) { - mPlayer.stopPlay(); + mPlayer.stop(); } stopPlay2(); } @@ -436,7 +438,8 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } - public static void setViewUP(int i) { + @Override + public void setViewUP(int i) { if (mVideoView == null) return; Log.e("收", "整理" + i); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); @@ -450,6 +453,11 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { params1.topMargin = contexts.getResources().getDimensionPixelOffset(R.dimen.live_top); params1.addRule(RelativeLayout.ALIGN_TOP); ry_view.requestLayout(); + isPk = true; + if (mPlayer.getUrl().contains("848_24.flv") || mPlayer.getUrl().contains("1280_24.flv")) { + tmpPk = false; + switchStreamPk(true); + } } /** @@ -464,8 +472,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { if (videoLandscape == VIDEO_VERTICAL) { height = ViewGroup.LayoutParams.MATCH_PARENT; } else { - height = DpUtil.dp2px(285); + height = ViewGroup.LayoutParams.WRAP_CONTENT; } + mPlayer.setViewResizeMode(landscape == VIDEO_VERTICAL); if (landscape == 2) { Log.i("收到socket--->", "还原9:16"); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); @@ -516,6 +525,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Override public void setPkview() { Log.i("收到socket--->", "变成16:9"); + String url = srcUrl; + isPk = true; + switchStreamPk(true); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); params.height = vHeight; params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); @@ -527,7 +539,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { public synchronized void setPkEndview() { Log.i("收收收", landscape + ""); - + isPk = false; + tmpPk = false; + switchStreamPk(false); if (landscape == 2) { Log.i("收到socket--->", "还原9:16"); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); @@ -542,8 +556,18 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { params.addRule(RelativeLayout.ALIGN_TOP); mVideoView.requestLayout(); } + if (detailsView != null) { + mVideoView.removeView(detailsView); + detailsView = null; + } } + public void removeDetailView(){ + if (detailsView != null) { + mVideoView.removeView(detailsView); + detailsView = null; + } + } @Override public ViewGroup getSmallContainer() { @@ -639,7 +663,6 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { params.height = RelativeLayout.LayoutParams.MATCH_PARENT; params.topMargin = 0; params.addRule(RelativeLayout.ALIGN_TOP); - mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation270); mVideoView.requestLayout(); } @@ -649,7 +672,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams(); params.height = vHeight; params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); - mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0); + // mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0); params.addRule(RelativeLayout.ALIGN_TOP); mVideoView.requestLayout(); } @@ -713,10 +736,10 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { Log.e("ry", "退出多人房间成功"); new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { - mPlayer.startPlay(purl); + mPlayer.play(); Log.e("ry", mPlayer.isPlaying() + "purl" + purl); - if (mPlayer.isPlaying() != 1) { - mPlayer.startPlay(purl); + if (!mPlayer.isPlaying()) { + mPlayer.switchUrl(purl); } ry_view.removeAllViews(); ry_view.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; @@ -765,6 +788,91 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onOpenDrawer(LiveAudienceEvent event) { + if (event.getType() == LiveAudienceEvent.LiveAudienceType.LIVE_VIDEO) { + int ban = 0;//全模式都可以选择 + switch (roomModel.getClarityType() - 1) { + case PLAY_MODEL_720://仅允许720(高清),ban掉1080(超高清)模式 + ban = LiveClarityCustomPopup.BAN_1080; + break; + case -1://没有该字段 + case PLAY_MODEL_480://仅允许480(流畅),ban掉1080(超高清)和720(高清)模式 + ban = LiveClarityCustomPopup.BAN_720; + break; + + } + LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, + IMLoginManager.get(mContext).getInt(PLAY_MODEL_KEY, PLAY_MODEL_ANCHOR), + ban, + true); + new XPopup.Builder(mContext) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + int selectClarity = liveClarityCustomPopup.getSelectClarity(); + if (selectClarity == PLAY_MODEL || selectClarity == IMLoginManager.get(mContext).getInt(LiveRoomPlayViewHolder.PLAY_MODEL_KEY, PLAY_MODEL_ANCHOR)) + return; + if (selectClarity == PLAY_MODEL_ANCHOR) { + switchStream(srcUrl, PLAY_MODEL_DEF); + setAudiencePlayModel(selectClarity); + } else { + switchStream(srcUrl, selectClarity); + } + IMLoginManager.get(mContext).put(LiveRoomPlayViewHolder.PLAY_MODEL_KEY, selectClarity); + showToast(); + } + + private void showToast() { + DialogUitl.showToast(mContext, "設置成功\n" + + "正在為你轉換中", 3000); + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) + .asCustom(liveClarityCustomPopup) + .show(); + } + } + /** * 把观众转换成主播 */ @@ -793,14 +901,15 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { for (RCRTCInputStream stream : data.getLiveStreams()) { if (stream.getMediaType() == RCRTCMediaType.VIDEO) { //暂停播放 - mPlayer.stopPlay(); + mPlayer.stop(); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 RCRTCVideoView remoteView = new RCRTCVideoView(contexts); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); //todo 本demo只演示添加1个远端用户的视图 - remoteView.setScalingType(SCALE_ASPECT_FILL); + remoteView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + remoteView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT); ry_view.addView(remoteView); Log.e("ry", stream.getMediaType() + "rcrtcOtherRoom成功 :" + data.getLiveStreams().size()); } @@ -962,6 +1071,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { if (userinputStreamList1.size() == 0) { //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 RCRTCVideoView remoteView = new RCRTCVideoView(contexts); + ((RCRTCVideoInputStream) stream).setStreamType(RCRTCStreamType.NORMAL); ((RCRTCVideoInputStream) stream).setVideoView(remoteView); ((RCRTCVideoInputStream) stream).setVideoFrameListener(new IRCRTCVideoInputFrameListener() { @Override @@ -971,6 +1081,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { "timestampNs:" + videoFrame.getTimestampNs() + "\n" + "分辨率:" + videoFrame.getBuffer().getHeight() + "x" + videoFrame.getBuffer().getWidth() + "\n" + "当前时间:" + new SimpleDateFormat("HH:mm:ss", Locale.CHINA).format(new Date()) + "\n"; + Log.d("ry", "onFrame: " + debugText); new Handler(Looper.getMainLooper()).post(() -> { debugView.setText(debugText); @@ -979,7 +1090,8 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { }); //todo 本demo只演示添加1个远端用户的视图 ry_view.removeAllViews(); - remoteView.setScalingType(SCALE_ASPECT_FILL); + remoteView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + remoteView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT); ry_view.addView(remoteView); } userinputStreamList1.add(stream); @@ -1030,4 +1142,208 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } }); } + + @Override + public void setLoadViewListener(LoadingListener listener) { + super.setLoadViewListener(listener); + } + + private void showLoadingDialog() { + if (PLAY_MODEL == PLAY_MODEL_480) return; + + new DialogUitl.Builder(mContext) + .setTitle("網絡提示") + .setContent("系統監測到您的網絡不穩定,對此將清晰度變成了流暢,您可以在側邊菜單中的「清晰度」選擇調回。") + .setView(R.layout.dialog_simple_tip) + .setClickCallback(new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + dialog.dismiss(); + } + }).build().show(); + PLAY_MODEL = PLAY_MODEL_480; + String url = srcUrl; + if (videoLandscape == VIDEO_VERTICAL) { + url = url.replace(".flv", videoRatioVertical[PLAY_MODEL_480] + videoFps[0] + ".flv"); + } else if (videoLandscape == VIDEO_HORIZONTAL) { + url = url.replace(".flv", videoRatioHorizontal[PLAY_MODEL_480] + videoFps[0] + ".flv"); + } + mPlayer.switchUrl(url); + } + + private class ExoPlayerListener implements Player.Listener { + String TAG = "播放流"; + + @Override + public void onPlayerError(PlaybackException error) { + Player.Listener.super.onPlayerError(error); + debugView.setText("播放出错code=" + error.errorCode + " msg=" + error.getErrorCodeName()); + } + + @Override + public void onVideoSizeChanged(VideoSize videoSize) { + Player.Listener.super.onVideoSizeChanged(videoSize); + Log.i(TAG, "onVideoSizeChanged: width = " + videoSize.width + " height = " + videoSize.height); + //ToastUtil.show("分辨率: 宽 = " + videoSize.width + " 高 = " + videoSize.height); + if (videoSize.height > videoSize.width) { + videoLandscape = VIDEO_VERTICAL; + } else { + videoLandscape = VIDEO_HORIZONTAL; + } + } + + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + if (playbackState == Player.STATE_BUFFERING) { + //showLoadingDialog(); + OkDownload.getInstance().pauseAll(); + Log.i(TAG, "onPlaybackStateChanged: 缓存中"); + } else { + Log.i(TAG, "onPlaybackStateChanged: 播放中"); + } + } + + @Override + public void onIsPlayingChanged(boolean isPlaying) { + Player.Listener.super.onIsPlayingChanged(isPlaying); + if (isPlaying) { + hideCover(); + Log.i(TAG, "onIsPlayingChanged: 开始播放 | waitNextUrl = " + waitNextUrl); + OkDownload.getInstance().startAll(); + if (loadingListener != null) { + loadingListener.onPlayer(); + } + if (waitNextUrl != null) { + mPlayer.switchUrl(waitNextUrl); + waitNextUrl = null; + } + } + } + } + private int mPkTimeCount = 0; + private Handler countdownHandler = new Handler(); + private View detailsView = null; + private FrameLayout timeTitle; + private TextView textTime; + private TextView textPkName1, textPkName2, textPkName3, textPkName4; + private TextView textGrade1, textGrade2, textGrade3, textGrade4; + private ImageView imageGrade1, imageGrade2, imageGrade3, imageGrade4; + private LinearLayout linearGrade1, linearGrade2, linearGrade3, linearGrade4; + + /** + * PK倒计时 + */ + public void upDataPkScore(JSONArray pkScores, int time) { + + if (detailsView == null) { + detailsView = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null); + timeTitle = detailsView.findViewById(R.id.time_title); + textTime = detailsView.findViewById(R.id.text_time); + linearGrade1 = detailsView.findViewById(R.id.lin_pk1); + linearGrade2 = detailsView.findViewById(R.id.lin_pk2); + linearGrade3 = detailsView.findViewById(R.id.lin_pk3); + linearGrade4 = detailsView.findViewById(R.id.lin_pk4); + textPkName1 = detailsView.findViewById(R.id.text_pk_name1); + textPkName2 = detailsView.findViewById(R.id.text_pk_name2); + textPkName3 = detailsView.findViewById(R.id.text_pk_name3); + textPkName4 = detailsView.findViewById(R.id.text_pk_name4); + textGrade1 = detailsView.findViewById(R.id.text_grade1); + textGrade2 = detailsView.findViewById(R.id.text_grade2); + textGrade3 = detailsView.findViewById(R.id.text_grade3); + textGrade4 = detailsView.findViewById(R.id.text_grade4); + imageGrade1 = detailsView.findViewById(R.id.image_grade1); + imageGrade2 = detailsView.findViewById(R.id.image_grade2); + imageGrade3 = detailsView.findViewById(R.id.image_grade3); + imageGrade4 = detailsView.findViewById(R.id.image_grade4); + linearGrade1.setVisibility(View.GONE); + linearGrade2.setVisibility(View.GONE); + linearGrade3.setVisibility(View.GONE); + linearGrade4.setVisibility(View.GONE); + mVideoView.addView(detailsView); + + } + + for (int i = 0; i < pkScores.size(); i++) { + JSONObject score = pkScores.getJSONObject(i); + String userNiceName = score.getString("user_nicename"); + long userScore = score.getLong("score"); + int resScore = R.mipmap.icon_livepk_no1; + if (userScore == 0 && !score.containsKey("paiming")) { + resScore = R.mipmap.icon_livepk_no1; + } else { + if (score.containsKey("paiming")) { + int ranking = score.getIntValue("paiming"); + switch (ranking) { + case 1: + resScore = R.mipmap.icon_livepk_no1; + break; + case 2: + resScore = R.mipmap.icon_livepk_no2; + break; + case 3: + resScore = R.mipmap.icon_livepk_no3; + break; + case 4: + resScore = R.mipmap.icon_livepk_no4; + break; + } + } + } + if (i == 0) { + linearGrade1.setVisibility(View.VISIBLE); + textPkName1.setText(userNiceName); + ImgLoader.display(mContext, resScore, imageGrade1); + textGrade1.setText(String.valueOf(userScore)); + } else if (i == 1) { + linearGrade2.setVisibility(View.VISIBLE); + textPkName2.setText(userNiceName); + ImgLoader.display(mContext, resScore, imageGrade2); + textGrade2.setText(String.valueOf(userScore)); + } else if (i == 2) { + linearGrade4.setVisibility(View.VISIBLE); + textPkName4.setText(userNiceName); + ImgLoader.display(mContext, resScore, imageGrade4); + textGrade4.setText(String.valueOf(userScore)); + } else if (i == 3) { + linearGrade3.setVisibility(View.VISIBLE); + textPkName3.setText(userNiceName); + ImgLoader.display(mContext, resScore, imageGrade3); + textGrade3.setText(String.valueOf(userScore)); + + } + } + + if (time > 0) { + mPkTimeCount = time; + timeTitle.setVisibility(View.VISIBLE); + countdownHandler.postAtTime(countdownRunnable, getNextSecondTime()); + } + + } + + private Runnable countdownRunnable = new Runnable() { + @Override + public void run() { + mPkTimeCount--; + if (mPkTimeCount > 0) {// + String s1 = StringUtil.getDurationText(mPkTimeCount * 1000); + textTime.setText(String.format(mContext.getString(R.string.pk_time), s1)); + countdownHandler.postAtTime(countdownRunnable, getNextSecondTime()); + } else { + timeTitle.setVisibility(View.GONE); + countdownHandler.removeCallbacks(countdownRunnable); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.PK_TIME_COUNT)); + } + } + }; + + /** + * 获取下一秒钟的时间 + */ + private long getNextSecondTime() { + long now = SystemClock.uptimeMillis(); + return now + (1000 - now % 1000); + } } diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java index 9aef30b33..5acc92c24 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java @@ -257,7 +257,7 @@ public class LivePlayTxViewHolder extends LiveRoomPlayViewHolder implements ITXL * @param url 流地址 */ @Override - public void play(String url) { + public void play(String url,int playModel) { url = "webrtc://5664.liveplay.myqcloud.com/live/5664_harchar1"; mPlayer = new V2TXLivePlayerImpl(mContext); @@ -318,6 +318,11 @@ public class LivePlayTxViewHolder extends LiveRoomPlayViewHolder implements ITXL L.e(TAG, "play----url--->" + url); } + @Override + public void switchStream(String url, int playModel) { + + } + @Override public void stopPlay() { mChangeToLeft = false; diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java index 2aaa2705e..1227a9324 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java @@ -251,7 +251,7 @@ public class LivePlayTxViewHolder_backup extends LiveRoomPlayViewHolder implemen * @param url 流地址 */ @Override - public void play(String url) { + public void play(String url,int playModel) { if (TextUtils.isEmpty(url)) { return; } @@ -280,6 +280,11 @@ public class LivePlayTxViewHolder_backup extends LiveRoomPlayViewHolder implemen L.e(TAG, "play----url--->" + url); } + @Override + public void switchStream(String url, int playModel) { + + } + @Override public void stopPlay() { mChangeToLeft = false; 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 b18d24825..ed02b4b79 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -33,11 +33,16 @@ 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.event.AnchorInfoEvent; +import com.yunbao.common.event.LivePushRyEvent; +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.manager.IMRTCManager; import com.yunbao.common.manager.RandomPkManager; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; @@ -53,6 +58,8 @@ import com.yunbao.live.presenter.LiveRyLinkMicPkPresenter; import com.yunbao.live.socket.SocketSendBean; import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.List; @@ -95,15 +102,37 @@ 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 TextView textTime; + private TextView tv_avatarOther_name; + private ImageView avatarOther; + private LinearLayout goto_room_view; + + //修改上面主播的头像 + @Subscribe(threadMode = ThreadMode.MAIN) + public void onUPAnchorInfo(AnchorInfoEvent e) { + if (e != null) { + if (e.isClear() == false) { + tv_avatarOther_name.setText(e.getUserNiceName()); + ImgLoader.displayAvatar(mContext, e.getAvatar(), avatarOther); + goto_room_view.setVisibility(View.VISIBLE); + } else { + goto_room_view.setVisibility(View.GONE); + + } + } + } + public LivePushRyViewHolder(Context context, ViewGroup parentView) { super(context, parentView); this.contexts = context; + EventBus.getDefault().register(this); } @Override @@ -314,6 +343,8 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX userBean1.setUserNiceName("null"); userBean1.setAvatar("null"); } + mLiveRyLinkMicPkPresenter.onLinkMicToPk(userBean1); + mLiveRyLinkMicPkPresenter.onLinkMicPkStart(inviteeRoomId, 3); //单人PK,减掉次数 if (!RandomPkManager.getInstance().isRandomModel()) { LiveNetManager.get(mContext).setFreePkNum(new com.yunbao.common.http.base.HttpCallback() { @@ -369,16 +400,26 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX @Override public void init() { super.init(); + Bus.getOn(this); 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); + textTime = (TextView) findViewById(R.id.text_time); dr_pk_view.setVisibility(View.GONE); + cameraPreview3.setVisibility(View.GONE); btn_close = (TextView) findViewById(R.id.btn_close); + tv_avatarOther_name = (TextView) findViewById(R.id.tv_avatarOther_name); + avatarOther = (ImageView) findViewById(R.id.avatarOther); + goto_room_view = (LinearLayout) findViewById(R.id.goto_room_view); + goto_room_view.setVisibility(View.GONE); mMainHandler = new Handler(Looper.getMainLooper()); btn_close.setOnClickListener(new View.OnClickListener() { @Override @@ -387,7 +428,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX @Override public void onConfirmClick(Dialog dialog, String content) { //断开连麦 - LiveRyAnchorActivity.isDRPK=0; + LiveRyAnchorActivity.isDRPK = 0; HttpClient.getInstance().post("livepk.setliveuserout", "livepk.setliveuserout") .execute(new HttpCallback() { @Override @@ -418,6 +459,10 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX mPreView1.setVisibility(View.GONE); inputStreamList.clear(); inputStreamList1.clear(); + changeToBig(); + //清理PK上面对方的头像 + EventBus.getDefault().post(new AnchorInfoEvent(true, "", "", "")); + closeButtonGone(); } }); } @@ -530,16 +575,37 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX RCRTCEngine.getInstance().init(contexts, config); RCRTCEngine.getInstance().getDefaultAudioStream().setAudioQuality(RCRTCParamsType.AudioQuality.MUSIC_HIGH, RCRTCParamsType.AudioScenario.MUSIC_CHATROOM); + //設置開播分辨率 + RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + int minRate = 200; + int maxRate = 900; + switch (IMLoginManager.get(mContext).getSelectClarity()) { + case 0: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + minRate = 200; + maxRate = 900; + break; + case 1: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280; + minRate = 250; + maxRate = 2200; + break; + case 2: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_1080_1920; + minRate = 400; + maxRate = 4000; + break; + } RCRTCVideoStreamConfig videoConfigBuilder = RCRTCVideoStreamConfig.Builder.create() //设置分辨率 - .setVideoResolution(RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_640) + .setVideoResolution(rcrtcVideoResolution) //设置帧率 - .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_30) + .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_24) //设置最小码率,480P下推荐200 - .setMinRate(250) + .setMinRate(minRate) //设置最大码率,480P下推荐900 - .setMaxRate(5000) + .setMaxRate(maxRate) .build(); // 创建本地视频显示视图 @@ -565,7 +631,6 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX mPreView.addView(rongRTCVideoView); tencentTRTCBeautyManager = new TencentTRTCBeautyManager(mContext); - //加入房间成功后可以通过 RCRTCLocalUser 对象发布本地默认音视频流,包括:麦克风采集的音频和摄像头采集的视频。 RCRTCEngine.getInstance().getDefaultVideoStream().setEncoderMirror(true); if (rtcRoom == null || rtcRoom.getLocalUser() == null) { @@ -585,20 +650,13 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX room.registerRoomListener(roomEventsListener); //美颜 - new Handler(Looper.getMainLooper()).post(new Runnable() { - public void run() { - //旧美颜不需要了 - /*RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(new IRCRTCVideoOutputFrameListener() { - @Override - public RCRTCVideoFrame processVideoFrame(RCRTCVideoFrame rtcVideoFrame) { - // 使用数据进行美颜/录像等处理后,需要把数据再返回给 SDK 做发送。 - rtcVideoFrame.setTextureId(tencentTRTCBeautyManager.renderWithTexture(rtcVideoFrame.getTextureId(), rtcVideoFrame.getWidth(), rtcVideoFrame.getHeight(), false)); - return rtcVideoFrame; - } - });*/ - - } - }); +// new Handler(Looper.getMainLooper()).post(new Runnable() { +// public void run() { +// //旧美颜不需要了 +// +// +// } +// }); } @Override @@ -623,19 +681,29 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX params.width = mPreView.getWidth() / 2; params.height = DpUtil.dp2px(250); params.topMargin = DpUtil.dp2px(130); - mPreView.setLayoutParams(params); + camera.setLayoutParams(params); } } @Override public void changeToBig() { - if (mPreView != null) { - FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mPreView.getLayoutParams(); + if (camera != null) { + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) camera.getLayoutParams(); params.width = ViewGroup.LayoutParams.MATCH_PARENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; params.topMargin = 0; - mPreView.setLayoutParams(params); + camera.setLayoutParams(params); } + if (mPreView1.getVisibility() == View.VISIBLE) { + mPreView1.removeAllViews(); + mPreView1.setVisibility(View.GONE); + inputStreamList.clear(); + inputStreamList1.clear(); + } + } + + public void closeButtonGone() { + btn_close.setVisibility(View.GONE); } @Override @@ -686,24 +754,38 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX RCRTCMixConfig config = new RCRTCMixConfig(); RCRTCMixConfig.MediaConfig mediaConfig = new RCRTCMixConfig.MediaConfig(); config.setMediaConfig(mediaConfig); -//视频输出配置 + //视频输出配置 RCRTCMixConfig.MediaConfig.VideoConfig videoConfig = new RCRTCMixConfig.MediaConfig.VideoConfig(); mediaConfig.setVideoConfig(videoConfig); -//大流视频的输出参数 + //大流视频的输出参数 RCRTCMixConfig.MediaConfig.VideoConfig.VideoLayout normal = new RCRTCMixConfig.MediaConfig.VideoConfig.VideoLayout(); - videoConfig.setVideoLayout(normal); -//推荐宽、高、帧率参数值可以通过默认视频流的配置获取,也可以根据实际需求来自定义设置 -//如不设置宽高值则服务端将使用默认宽高 360 * 640 -//例:发布的视频分辨率为720 * 1280,如果不设置则观众端看到的视频分辨率为 360 * 640, -//所以如果想让观众端看到的视频分辨率和发布视频分辨率一致,则应从发布的视频流中获取分辨率配置并设置到 mediaConfig 中 - RCRTCVideoStreamConfig defaultVideoConfig = RCRTCEngine.getInstance().getDefaultVideoStream().getVideoConfig(); - int fps = defaultVideoConfig.getVideoFps().getFps(); - int width = 720; - int height = 1280; + + //推荐宽、高、帧率参数值可以通过默认视频流的配置获取,也可以根据实际需求来自定义设置 + //如不设置宽高值则服务端将使用默认宽高 360 * 640 + //例:发布的视频分辨率为720 * 1280,如果不设置则观众端看到的视频分辨率为 360 * 640, + //所以如果想让观众端看到的视频分辨率和发布视频分辨率一致,则应从发布的视频流中获取分辨率配置并设置到 mediaConfig 中 + //設置開播分辨率 + //設置開播分辨率 + RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + int minRate = 200; + int maxRate = 900; + switch (IMLoginManager.get(mContext).getSelectClarity()) { + case 0: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + break; + case 1: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280; + break; + case 2: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_1080_1920; + break; + } + int width = rcrtcVideoResolution.getWidth(); + int height = rcrtcVideoResolution.getHeight(); normal.setWidth(width); //视频宽 normal.setHeight(height); //视频高 - normal.setFps(fps); //视频帧率 - + normal.setFps(15); //视频帧率 + videoConfig.setVideoLayout(normal); //2. 合流画布设置 //(请参照画布和声音配置示例代码) //3. 假设以画布设置的宽高为 300 * 300为例(应以真实设置的宽高为准),设置每个视频流小窗口的坐标及宽高 @@ -732,6 +814,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX }); } + } @Override @@ -788,6 +871,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX @Override public void release() { super.release(); + Bus.getOff(this); LiveHttpUtil.cancel(LiveHttpConsts.LINK_MIC_TX_MIX_STREAM); rtcRoom = null; } @@ -843,4 +927,19 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX return ((LiveActivity) mContext).getTxAppId(); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void setSelectClarity(LivePushRyEvent event) { + if (rtcRoom != null) + rtcRoom.getLocalUser().publishDefaultLiveStreams(new IRCRTCResultDataCallback() { + @Override + public void onSuccess(RCRTCLiveInfo rcrtcLiveInfo1) { + rcrtcLiveInfo = rcrtcLiveInfo1; + } + + @Override + public void onFailed(RTCErrorCode rtcErrorCode) { + Log.e("ry", "rtcErrorCode" + rtcErrorCode); + } + }); + } } diff --git a/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java index 33eb8b29c..6575c81cb 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java @@ -36,7 +36,7 @@ import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveChooseClassActivity; import com.yunbao.live.activity.LiveRyAnchorActivity; import com.yunbao.live.adapter.LiveReadyShareAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveRoomTypeDialogFragment; import com.yunbao.live.dialog.LiveTimeDialogFragment; import com.yunbao.live.dialog.LiveWishListDialogFragment; @@ -471,7 +471,7 @@ public class LiveReadyRyViewHolder extends AbsViewHolder implements View.OnClick return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile,0, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { diff --git a/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java index 1918953a4..4da9ea036 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java @@ -1,12 +1,13 @@ package com.yunbao.live.views; +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.live.views.LivePushTxViewHolder.mTRTCCloud; + import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -17,12 +18,17 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.lzy.okgo.model.Response; import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMSendCallback; import com.tencent.trtc.TRTCCloudDef; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.common.bean.UserBean; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; @@ -42,7 +48,6 @@ import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveAnchorActivity; import com.yunbao.live.activity.LiveChooseClassActivity; import com.yunbao.live.adapter.LiveReadyShareAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveRoomTypeDialogFragment; import com.yunbao.live.dialog.LiveTimeDialogFragment; import com.yunbao.live.dialog.LiveWishListDialogFragment; @@ -51,10 +56,6 @@ import com.yunbao.live.http.LiveHttpUtil; import java.io.File; -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.live.views.LivePushTxViewHolder.mTRTCCloud; - /** * Created by cxf on 2018/10/7. * 开播前准备 @@ -491,7 +492,7 @@ public class LiveReadyViewHolder extends AbsViewHolder implements View.OnClickLi return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, 0, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { @@ -535,7 +536,7 @@ public class LiveReadyViewHolder extends AbsViewHolder implements View.OnClickLi @Override public void onError(Response response) { super.onError(response); - System.out.println("tx 开播失败 = "+response); + System.out.println("tx 开播失败 = " + response); } }); } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java index 32ad18a89..440030882 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java @@ -3,7 +3,10 @@ package com.yunbao.live.views; import android.content.Context; import android.view.ViewGroup; +import com.alibaba.fastjson.JSONArray; +import com.yunbao.common.bean.EnterRoomNewModel; import com.yunbao.common.bean.LiveBean; +import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.AbsViewHolder; import com.yunbao.live.interfaces.ILiveLinkMicViewHolder; @@ -13,14 +16,37 @@ import com.yunbao.live.interfaces.ILiveLinkMicViewHolder; public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements ILiveLinkMicViewHolder { protected LiveBean mLiveBean; + public static final String PLAY_MODEL_KEY = "user_audience_play_model"; + public static final int PLAY_MODEL_DEF = -1; + public static final int PLAY_MODEL_480 = 0; + public static final int PLAY_MODEL_720 = 1; + public static final int PLAY_MODEL_1080 = 2; + public static int PLAY_MODEL_ANCHOR = -1;//主播设置的最高画质 + public static int PLAY_MODEL = PLAY_MODEL_DEF; + public static final String[] videoRatioHorizontal = new String[]{"_640_480", "_960_720", "_1440_1080"}; + public static final String[] videoRatioVertical = new String[]{"_480_848", "_720_1280", "_1080_1920"}; + public static final String[] videoFps = new String[]{"_24", "_30"}; OnMicCallback onMicCallback;//连麦回调 + public EnterRoomNewModel roomModel; + LoadingListener loadingListener; public LiveRoomPlayViewHolder(Context context, ViewGroup parentView) { super(context, parentView); } - public abstract void play(String url); + public void setAnchorPlayModel(int model) { + PLAY_MODEL_ANCHOR = model; + } + + public void setAudiencePlayModel(int model) { + PLAY_MODEL = model; + } + + + public abstract void play(String url, int playModel); + + public abstract void switchStream(String url, int playModel); public abstract void stopPlay(); @@ -50,6 +76,9 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL this.mLiveBean = data; } + public void setViewUP(int i) { + } + public OnMicCallback getOnMicCallback() { return onMicCallback; } @@ -58,9 +87,28 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL this.onMicCallback = onMicCallback; } + public void setLiveEnterRoomNewModel(EnterRoomNewModel data) { + this.roomModel = data; + } - public interface OnMicCallback{ + public void setLoadViewListener(LoadingListener listener) { + this.loadingListener = listener; + } + + public void switchStreamPk(boolean isPk) { + } + + public void clearFrame() { + } + + + + public interface OnMicCallback { void onMikUpdate(); } + + public interface LoadingListener { + void onPlayer(); + } } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java index 8ec1f59c2..9675a60b4 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java @@ -448,16 +448,26 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis String s1 = StringUtil.getDurationText(mPkTimeCount * 1000); time.setText("PK時間:" + s1); mHandler.sendEmptyMessageAtTime(WHAT_PK_TIME, getNextSecondTime()); + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).setPkStatus(true); + } } } else { time.setVisibility(View.GONE); if (mHandler != null) { mHandler.removeCallbacksAndMessages(null); } + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).setPkStatus(false); + } endDRGif(); } } + public void hotAddVisibility(boolean visibility) { + ft_hot_add.setVisibility(visibility ? View.GONE : View.VISIBLE); + } + public void endDRGif() { if (dr_pk_end_gif.getVisibility() == View.GONE) { dr_pk_end_gif.setImageResource(R.mipmap.drpkend); @@ -869,54 +879,56 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mChatRecyclerView.setLayoutParams(params1); mChatRecyclerView.setHasFixedSize(true); - LinearLayoutManager layoutManager = new LiveChatRecyclerViewLayoutManager(mContext); + LinearLayoutManager layoutManager = new LinearLayoutManager(mContext); + layoutManager.setOrientation(RecyclerView.VERTICAL); +// layoutManager.setReverseLayout(true); layoutManager.setStackFromEnd(true); mChatRecyclerView.setLayoutManager(layoutManager); mChatRecyclerView.addItemDecoration(new TopGradual()); mChatRecyclerView.setItemViewCacheSize(10); - mChatRecyclerView.setItemAnimator(new SimpleItemAnimator() { - @Override - public boolean animateRemove(RecyclerView.ViewHolder holder) { - return false; - } - - @Override - public boolean animateAdd(RecyclerView.ViewHolder holder) { - Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.live_chat_msg_in); - holder.itemView.startAnimation(animation); - return false; - } - - @Override - public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { - return false; - } - - @Override - public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) { - return false; - } - - @Override - public void runPendingAnimations() { - - } - - @Override - public void endAnimation(@NonNull RecyclerView.ViewHolder item) { - - } - - @Override - public void endAnimations() { - - } - - @Override - public boolean isRunning() { - return false; - } - }); +// mChatRecyclerView.setItemAnimator(new SimpleItemAnimator() { +// @Override +// public boolean animateRemove(RecyclerView.ViewHolder holder) { +// return false; +// } +// +// @Override +// public boolean animateAdd(RecyclerView.ViewHolder holder) { +// Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.live_chat_msg_in); +// holder.itemView.startAnimation(animation); +// return false; +// } +// +// @Override +// public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { +// return false; +// } +// +// @Override +// public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) { +// return false; +// } +// +// @Override +// public void runPendingAnimations() { +// +// } +// +// @Override +// public void endAnimation(@NonNull RecyclerView.ViewHolder item) { +// +// } +// +// @Override +// public void endAnimations() { +// +// } +// +// @Override +// public boolean isRunning() { +// return false; +// } +// }); mLiveChatAdapter = new LiveChatAdapter(mContext); mChatRecyclerView.setAdapter(mLiveChatAdapter); mLiveChatAdapter.setOnItemClickListener(new OnItemClickListener() { @@ -1199,6 +1211,8 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mRedVal.setVisibility(View.GONE); mBlueVal.setVisibility(View.GONE); mPkRankTopIcon.setVisibility(View.GONE); + mAnchorLayout.setBackgroundResource(R.drawable.bg_live_ico); + mGoodNumberIcon.setVisibility(View.GONE); } /** @@ -3893,6 +3907,17 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mLiveChatAdapter.insertItem(bean); } } + /** + * 幸运100%活动 + */ + public void lucky100(MsgModel model){ + if (mLiveChatAdapter != null) { + LiveChatBean bean = new LiveChatBean(); + bean.setType(LiveChatBean.LUCKY_100_CHECK); + bean.setMsgModel(model); + mLiveChatAdapter.insertItem(bean); + } + } @Subscribe(threadMode = ThreadMode.MAIN) public void updateSub(LiveAudienceEvent event) { @@ -3915,7 +3940,7 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis customFullServiceNotify(event.getCustomFullServiceNotifyEvent()); break; case PK_TIME_COUNT: - endDRGif(); +// endDRGif(); break; case UP_PK_TWO: pkUid = (String) event.getObject(); 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 19f774b6a..5a48591af 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java @@ -5,7 +5,6 @@ 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_UPDATE; -import static com.yunbao.live.presenter.LiveRyLinkMicPkPresenter.leaveDRRoom; import android.content.Context; import android.graphics.drawable.Drawable; @@ -149,7 +148,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/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index 5fd7b77ae..6f1dbd1c9 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -22,6 +22,7 @@ import androidx.drawerlayout.widget.DrawerLayout; import androidx.viewpager.widget.PagerAdapter; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.GsonUtils; import com.lzf.easyfloat.EasyFloat; @@ -129,7 +130,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe //侧滑布局 // private DrawerLayout drawerLayout; //直播间拆分布局 - private LiveRoomPlayViewHolder mLivePlayViewHolder; + private LivePlayRyViewHolder mLivePlayViewHolder; //头部布局 public LiveRoomViewHolder mLiveRoomViewHolder; //底部布局 @@ -186,6 +187,8 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe private int landscape; private String leaveStream = "", leaveGroupId = ""; + public static PortraitLiveManager portraitLiveManager; + public PortraitLiveManager setQuitF(boolean quitF) { isQuitF = quitF; @@ -196,6 +199,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe this.mContext = context; this.mIntent = intent; liveImDeletUtil = new LiveImDeletUtil(); + portraitLiveManager = this; ininView(); } @@ -241,12 +245,22 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mViewPager.setCanScroll(true); } }; + final Runnable loadRunnableGone = new Runnable() { + @Override + public void run() { + loading.setVisibility(View.GONE); + } + }; @Override public synchronized void onAdd(LiveBean data, int liveType, int liveTypeVal, int liveSdk) { isEnterRoom = false; openParametersModel = new OpenParametersModel(); + if(mLiveRoomViewHolder!=null){ + mLiveRoomViewHolder.UpPkTwo(); + } mContext.runOnUiThread(new Runnable() { + @Override public void run() { Log.e("ImgLoader1", data.getAvatar()); @@ -264,6 +278,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe ImgLoader.displayBlurLive(mContext, mLiveBean.getAvatar(), ivBg); AnimationDrawable frameAnimation = (AnimationDrawable) ivLoading.getBackground(); frameAnimation.start(); + liveHandler.removeCallbacks(loadRunnableGone); if (mLivePlayViewHolder == null) { mLivePlayViewHolder = new LivePlayRyViewHolder(mContext, playContainer, 1); mLiveRoomViewHolder = new LiveRoomViewHolder(false, 1, mContext, mContainer, mSecondPage.findViewById(R.id.gift_gif), mSecondPage.findViewById(R.id.gift_svga), mContainerWrap, mContext.getWindowManager()); @@ -273,6 +288,12 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveRyLinkMicPkPresenter = new LiveRyLinkMicPkPresenter(mContext, mLivePlayViewHolder, false, null); mLivePlayViewHolder.addToParent(); mLivePlayViewHolder.subscribeActivityLifeCycle(); + mLivePlayViewHolder.setLoadViewListener(new LiveRoomPlayViewHolder.LoadingListener() { + @Override + public void onPlayer() { + liveHandler.postDelayed(loadRunnableGone, 350); + } + }); mLiveRoomViewHolder.subscribeActivityLifeCycle(); mLiveAudienceViewHolder.addToParent(); mLiveRoomViewHolder.addToParent(); @@ -282,6 +303,9 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveLinkMicPresenter.setLiveSdk(mLiveSDK); mLiveLinkMicAnchorPresenter.setLiveSdk(mLiveSDK); } + if (mLiveRyLinkMicPkPresenter == null) { + mLiveRyLinkMicPkPresenter = new LiveRyLinkMicPkPresenter(mContext, mLivePlayViewHolder, false, null); + } //去除主播离开画面 if (LivePlayKsyViewHolder.leave != null) { LivePlayKsyViewHolder.leave.setVisibility(View.GONE); @@ -294,9 +318,12 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe ImgLoader.displayBlurLive(mContext, mLiveBean.getAvatar(), liveBack, 400, 600); mask.setVisibility(View.VISIBLE); + mLivePlayViewHolder.clearFrame(); mLivePlayViewHolder.setLiveBean(mLiveBean); + mLivePlayViewHolder.removeDetailView(); mLivePlayViewHolder.setCover(mLiveBean.getAvatar()); - mLivePlayViewHolder.play(mLiveBean.getPull()); + mLivePlayViewHolder.setLiveBeanLandscape(mLiveBean.getLandscape()); + //mLivePlayViewHolder.play(mLiveBean.getPull(), LiveRoomPlayViewHolder.PLAY_MODEL_DEF); mLivePlayViewHolder.setOnMicCallback(new LiveRoomPlayViewHolder.OnMicCallback() { @Override public void onMikUpdate() { @@ -327,6 +354,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe } + private Runnable sendFIm = new Runnable() { @Override public void run() { @@ -352,6 +380,16 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe } landscape = data.getLiveInfo().getLandscape(); mLivePlayViewHolder.setLiveBeanLandscape(landscape); + mLivePlayViewHolder.setLiveEnterRoomNewModel(data); + mLivePlayViewHolder.clearFrame(); + int userClarityType = IMLoginManager.get(mContext).getInt(LiveRoomPlayViewHolder.PLAY_MODEL_KEY, -1); + int anchorClarityType = data.getClarityType() - 1; + if (userClarityType != anchorClarityType) { + mLivePlayViewHolder.play(mLiveBean.getPull(), userClarityType); + } else { + mLivePlayViewHolder.play(mLiveBean.getPull(), LiveRoomPlayViewHolder.PLAY_MODEL_DEF); + } + mLivePlayViewHolder.setAnchorPlayModel(anchorClarityType); //是否热度卡加成 liveHandler.postDelayed(() -> mLiveRoomViewHolder.getIsHot(data.getIsUseHotCard()), 700); @@ -486,17 +524,17 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe } } - if (data.getEnterRoomInfo().getIsconnection() != null && data.getEnterRoomInfo().getIsconnection().equals("1")) { + if (mLivePlayViewHolder != null && data.getEnterRoomInfo().getIsconnection() != null && data.getEnterRoomInfo().getIsconnection().equals("1")) { - LivePlayRyViewHolder.setViewUP(1); + mLivePlayViewHolder.setViewUP(1); } if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.pkHandler = false; } - if (pkInfo.getIntValue("ifpk") == 1 && pkInfo.getString("end_pk_time").equals("0")) {//pk开始了 + if (mLivePlayViewHolder != null && pkInfo.getIntValue("ifpk") == 1 && pkInfo.getString("end_pk_time").equals("0")) {//pk开始了 - LivePlayRyViewHolder.setViewUP(2); + mLivePlayViewHolder.setViewUP(2); //pk排名数据 LivePKUserListBean livePKUserListBean = JSON.parseObject(pkInfo.getString("pk_top_users"), LivePKUserListBean.class); @@ -520,7 +558,9 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveRoomViewHolder.pkHandler = true; mLiveRoomViewHolder.initPkRank(null); } - LivePlayRyViewHolder.setViewUP(3); + if (mLivePlayViewHolder != null) { + mLivePlayViewHolder.setViewUP(3); + } //pk排名数据 LivePKUserListBean livePKUserListBean = JSON.parseObject(pkInfo.getString("pk_top_users"), LivePKUserListBean.class); @@ -535,9 +575,11 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.initPkRank(null); } - LivePlayRyViewHolder.setViewUP(4); + if (mLivePlayViewHolder != null) { + mLivePlayViewHolder.setViewUP(4); + } - mLiveRoomViewHolder.UpPkBar(pkInfo.getJSONArray("userlist"), mLiveBean.getUid(), pkInfo.getIntValue("drpk_time")); + upDataPkScore(pkInfo.getJSONArray("userlist"), pkInfo.getIntValue("drpk_time")); } //守护相关 mLiveGuardInfo = new LiveGuardInfo(); @@ -569,7 +611,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveRoomViewHolder.showPrizePoolLevel(String.valueOf(giftPrizePoolLevel)); } } - liveHandler.postDelayed(() -> loading.setVisibility(View.GONE), 700); + liveHandler.postDelayed(loadRunnableGone, 15_000); } @@ -587,8 +629,12 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe public void removeLiveEnd() { + if (mLiveEndViewHolder != null) { + mLiveEndViewHolder.removeFromParent(); + mLiveEndViewHolder.release(); + } + mLiveEndViewHolder = null; if (mLiveAudienceViewHolder != null) { - mLiveAudienceViewHolder.removeFromParent(); mLiveAudienceViewHolder.removeCallbacks(); mLiveAudienceViewHolder.release(); @@ -604,17 +650,12 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveRoomViewHolder.clearData(); mLiveRoomViewHolder.countDownTimerTrickery = null; } - if (mLiveEndViewHolder != null) { - mLiveEndViewHolder.removeFromParent(); - mLiveEndViewHolder.release(); - } - mLiveEndViewHolder = null; mLiveAudienceViewHolder = null; - mLivePlayViewHolder = null; mLiveRoomViewHolder = null; mLiveLinkMicPresenter = null; mLiveLinkMicAnchorPresenter = null; mLiveRyLinkMicPkPresenter = null; + mLivePlayViewHolder = null; } @Override @@ -633,19 +674,15 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe if (mLiveAudienceViewHolder != null) { mLiveAudienceViewHolder.removeCallbacks(); } - //断开socket - if (mSocketRyClient != null) { mSocketRyClient.disConnect(); mSocketRyClient = null; } - if (mSocketClient != null) { mSocketClient.disConnect(); mSocketClient = null; } - if (mLiveLinkMicPresenter != null) { mLiveLinkMicPresenter.clearData(); mLiveLinkMicPresenter.release(); @@ -657,7 +694,12 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe if (mLiveRyLinkMicPkPresenter != null) { mLiveRyLinkMicPkPresenter.clearData(); mLiveRyLinkMicPkPresenter.release(); + mLiveRyLinkMicPkPresenter = null; } + if (mLiveEndViewHolder != null) { + removeLiveEnd(); + } + if (isQuit) { isQuitF = true; if (mLiveAudienceViewHolder != null) { @@ -676,11 +718,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveRoomViewHolder.clearData(); mLiveRoomViewHolder.countDownTimerTrickery = null; } - if (mLiveEndViewHolder != null) { - mLiveEndViewHolder.removeFromParent(); - mLiveEndViewHolder.release(); - } - mLiveEndViewHolder = null; + mLiveAudienceViewHolder = null; mLivePlayViewHolder = null; mLiveRoomViewHolder = null; @@ -1088,8 +1126,8 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe public void onKick(String touid) { if (!TextUtils.isEmpty(touid) && touid.equals(CommonAppConfig.getInstance().getUid())) {//被踢的是自己 kick = true; - exitLiveRoom(true); ToastUtil.show(WordUtil.getString(R.string.live_kicked_2)); + onRemove(true); } } @@ -1263,6 +1301,21 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe if (mLivePlayViewHolder != null) { mLivePlayViewHolder.setLiveBeanLandscape(1); } + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).setPkStatus(true); + } + } + + /** + * pk状态 + * + * @param isPk + */ + public void setPkStatus(boolean isPk) { + if (mLiveRoomViewHolder != null) { + mLiveRoomViewHolder.hotAddVisibility(isPk); + } + } @Override @@ -1277,6 +1330,9 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe if (mLiveRoomViewHolder != null) { mLivePlayViewHolder.setLiveBeanLandscape(landscape); } + if (mContext instanceof LiveAudienceActivity) { + ((LiveAudienceActivity) mContext).setPkStatus(false); + } } @Override @@ -1748,6 +1804,15 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe } } + /** + * 幸运100%活动 + */ + public void lucky100(MsgModel model) { + if (mLiveRoomViewHolder != null) { + mLiveRoomViewHolder.lucky100(model); + } + } + public void messageBottom() { if (mLiveRoomViewHolder != null) { mLiveRoomViewHolder.chatScrollToBottom(); @@ -1758,6 +1823,31 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mViewPager.setCanScroll(enableScroll); } + /** + * 用户端多人Pk + * + * @param pkScores + * @param time + */ + public void upDataPkScore(JSONArray pkScores, int time) { + if (mLivePlayViewHolder != null) { + String liveId = mLiveBean.getUid(); + JSONObject liveModel = null; + //调整数据 + int index = 0; + for (int i = 0; i < pkScores.size(); i++) { + JSONObject score = pkScores.getJSONObject(i); + if (TextUtils.equals(score.getString("id"), liveId)) { + liveModel = score; + index = i; + } + } + pkScores.remove(index); + pkScores.add(0, liveModel); + mLivePlayViewHolder.upDataPkScore(pkScores, time); + + } + } public void endDRGif() { if (mLiveRoomViewHolder != null) { 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..3b856255d --- /dev/null +++ b/live/src/main/res/layout/view_live_pk_details.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/view_live_play_ksy.xml b/live/src/main/res/layout/view_live_play_ksy.xml index b136c4bc5..91b5d0346 100644 --- a/live/src/main/res/layout/view_live_play_ksy.xml +++ b/live/src/main/res/layout/view_live_play_ksy.xml @@ -7,9 +7,11 @@ android:layout_height="match_parent"> - - + 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" /> + + - - + app:mfl3_ratio="0.25" /> + android:visibility="gone" /> + + + + + + diff --git a/live/src/main/res/layout/view_live_room.xml b/live/src/main/res/layout/view_live_room.xml index d62a6cae1..4c22968b4 100644 --- a/live/src/main/res/layout/view_live_room.xml +++ b/live/src/main/res/layout/view_live_room.xml @@ -189,7 +189,7 @@ @@ -707,8 +707,8 @@ android:layout_height="27dp" android:layout_below="@id/live_time" android:layout_marginLeft="12dp" - android:layout_marginTop="12dp" - android:visibility="gone"> + android:layout_marginTop="-12dp" + android:visibility="visible"> @@ -1298,12 +1298,12 @@ android:layout_marginEnd="13dp" android:layout_marginBottom="10dp" android:background="@drawable/bg_live_item_pk_rank_blue" - android:paddingStart="17dp" - android:paddingTop="5dp" - android:paddingEnd="17dp" - android:paddingBottom="5dp" + android:paddingStart="10dp" + android:paddingTop="3dp" + android:paddingEnd="10dp" + android:paddingBottom="3dp" android:textColor="#FFFFFF" - android:textSize="15sp" + android:textSize="12sp" android:textStyle="bold" android:visibility="gone" /> @@ -2112,7 +2112,6 @@ android:layout_width="18dp" android:layout_height="18dp" android:layout_alignParentBottom="true" - android:layout_centerHorizontal="true" android:src="@mipmap/voice" /> diff --git a/live/src/main/res/layout/view_new_live_ready.xml b/live/src/main/res/layout/view_new_live_ready.xml index 98af6cebf..eadb2a80c 100644 --- a/live/src/main/res/layout/view_new_live_ready.xml +++ b/live/src/main/res/layout/view_new_live_ready.xml @@ -54,6 +54,43 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + () { @Override public void callback(UserBean u) { - if ("1".equals(u.getIs_bind())) { + if (u != null &&"1".equals(u.getIs_bind())) { tv_bind_phone.setText(""); isBind = "1"; mobile = u.getMobile(); diff --git a/main/src/main/java/com/yunbao/main/activity/GoogleFragment.java b/main/src/main/java/com/yunbao/main/activity/GoogleFragment.java index 7ca8599cc..62d937191 100644 --- a/main/src/main/java/com/yunbao/main/activity/GoogleFragment.java +++ b/main/src/main/java/com/yunbao/main/activity/GoogleFragment.java @@ -24,6 +24,7 @@ import com.yunbao.common.CommonAppConfig; import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.utils.GoogleBillingUtilNew; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.main.R; import com.yunbao.main.views.TestWebViewClient; @@ -55,6 +56,10 @@ public class GoogleFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //通过参数中的布局填充获取对应布局 view = inflater.inflate(R.layout.activity_recharge, container, false); + if(StringUtil.isEmpty(url)){ + Log.e(TAG, "URL为空" ); + return view; + } rlWebview = (WebView) view.findViewById(R.id.rlWebview); Log.e("ttt", url); rlWebview.loadUrl(url); diff --git a/main/src/main/java/com/yunbao/main/activity/MainActivity.java b/main/src/main/java/com/yunbao/main/activity/MainActivity.java index b69a1bab3..584273828 100644 --- a/main/src/main/java/com/yunbao/main/activity/MainActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/MainActivity.java @@ -17,7 +17,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.view.Display; @@ -41,6 +40,7 @@ import com.google.firebase.messaging.FirebaseMessaging; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.jakewharton.rxbinding3.view.RxView; +import com.lxj.xpopup.XPopup; import com.lzf.easyfloat.EasyFloat; import com.lzf.easyfloat.permission.PermissionUtils; import com.tencent.imsdk.v2.V2TIMCallback; @@ -75,6 +75,7 @@ import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.main.MainNetManager; import com.yunbao.common.interfaces.CommonCallback; +import com.yunbao.common.manager.APKManager; import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.NoviceInstructorManager; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; @@ -88,16 +89,14 @@ import com.yunbao.common.utils.SpUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.VersionUtil; import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.APKUpdateCustomPopup; import com.yunbao.common.views.AbsMainViewHolder; import com.yunbao.common.views.floatingview.APPEasyFloat; import com.yunbao.common.views.weight.LiveFloatView; import com.yunbao.live.activity.LiveAudienceActivity; -import com.yunbao.live.activity.LiveRyAnchorActivity; -import com.yunbao.live.dialog.RandomPkDialogFragment; import com.yunbao.live.http.LiveHttpConsts; import com.yunbao.live.http.LiveHttpUtil; import com.yunbao.live.presenter.LiveRoomCheckLivePresenter; -import com.yunbao.live.presenter.LiveRyLinkMicPkPresenter; import com.yunbao.live.utils.LiveStorge; import com.yunbao.live.views.ChatListViewHolder; import com.yunbao.main.R; @@ -682,8 +681,14 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene DialogUitl.showSimpleTipDialog(mContext, WordUtil.getString(R.string.main_maintain_notice), configBean.getMaintainTips()); } if (!VersionUtil.isLatest(configBean.getVersion())) { - VersionUtil versionUtil = new VersionUtil(); - versionUtil.showDialog(mContext, configBean, configBean.getDownloadApkUrl()); + if (!APKManager.get().getApkVerNew()) { + new XPopup.Builder(mContext) + .isDestroyOnDismiss(true) + .dismissOnBackPressed(false) // 按返回键是否关闭弹窗,默认为true + .dismissOnTouchOutside(false) // 点击外部是否关闭弹窗,默认为true + .asCustom(new APKUpdateCustomPopup(mContext, false)) + .show(); + } } else { requestBonus(); } diff --git a/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java b/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java index 8c8297b59..ce9cc40c5 100644 --- a/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java @@ -264,7 +264,7 @@ public class MyWebViewActivity extends AbsActivity { MicStatusManager.getInstance().showDownMicDialog(mContext); return; } - EventBus.getDefault().post(new LiveRoomChangeEvent(liveBean, liveType, Integer.parseInt(liveTypeVal))); + EventBus.getDefault().post(new LiveRoomChangeEvent(liveBean, liveType, Integer.parseInt(liveTypeVal)).setLiveEnd(true)); } else { RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveTypeVal), Integer.parseInt(liveSdk)); } diff --git a/main/src/main/java/com/yunbao/main/activity/SettingActivity.java b/main/src/main/java/com/yunbao/main/activity/SettingActivity.java index 7d1d599b6..1da67ee61 100644 --- a/main/src/main/java/com/yunbao/main/activity/SettingActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/SettingActivity.java @@ -19,20 +19,20 @@ import androidx.recyclerview.widget.RecyclerView; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.fastjson.JSON; +import com.lxj.xpopup.XPopup; import com.lzf.easyfloat.interfaces.OnPermissionResult; import com.lzf.easyfloat.permission.PermissionUtils; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.activity.AbsActivity; import com.yunbao.common.activity.WebViewActivity; -import com.yunbao.common.bean.ConfigBean; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.CommonHttpConsts; import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.HttpCallback; -import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.manager.APKManager; import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.GlideCatchUtil; @@ -40,6 +40,7 @@ import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.VersionUtil; import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.APKUpdateCustomPopup; import com.yunbao.common.views.floatingview.APPEasyFloat; import com.yunbao.common.views.weight.ViewClicksAntiShake; import com.yunbao.main.R; @@ -99,6 +100,11 @@ public class SettingActivity extends AbsActivity implements OnItemClickListener< data1.setName(WordUtil.getString(R.string.versions)); list.add(data1); + SettingBean data2 = new SettingBean(); + data2.setId(25); + data2.setName(WordUtil.getString(R.string.check_the_new_version)); + list.add(data2); + SettingBean bean = new SettingBean(); bean.setName(WordUtil.getString(R.string.setting_exit)); bean.setLast(true); @@ -280,6 +286,13 @@ public class SettingActivity extends AbsActivity implements OnItemClickListener< clearCache(position); } else if (bean.getId() == 21) {//清除缓存 startActivity(new Intent(SettingActivity.this, MsgSettActivity.class)); + } else if (bean.getId() == 25) {//版本更新 + if (!APKManager.get().getApkVerNew()) { + new XPopup.Builder(mContext) + .asCustom(new APKUpdateCustomPopup(mContext, true)) + .show(); + } + } } else { if (bean.getId() == 17) {//意见反馈要在url上加版本号和设备号 diff --git a/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java b/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java index 22e04c560..f59ae20c1 100644 --- a/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java +++ b/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java @@ -12,10 +12,10 @@ import androidx.recyclerview.widget.RecyclerView; import com.yunbao.common.Constants; import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.manager.APKManager; +import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.utils.DeviceUtils; import com.yunbao.common.utils.LogUtil; -import com.yunbao.common.views.weight.ViewClicksAntiShake; -import com.yunbao.main.BuildConfig; import com.yunbao.main.R; import com.yunbao.main.bean.SettingBean; @@ -47,17 +47,17 @@ public class SettingAdapter extends RecyclerView.Adapter { @Override public void onClick(View v) { - Object tag = v.getTag(); - if (tag != null) { - int position = (int) tag; - SettingBean bean = mList.get(position); - if(bean.getId()==19){ - LogUtil.shareFile(context); - } - if (mOnItemClickListener != null) { - mOnItemClickListener.onItemClick(bean, position); - } + Object tag = v.getTag(); + if (tag != null) { + int position = (int) tag; + SettingBean bean = mList.get(position); + if (bean.getId() == 19) { + LogUtil.shareFile(context); } + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(bean, position); + } + } } @@ -75,7 +75,7 @@ public class SettingAdapter extends RecyclerView.Adapter { @Override public int getItemViewType(int position) { SettingBean bean = mList.get(position); - if (bean.getId() == 19 || bean.getId() == Constants.SETTING_UPDATE_ID || bean.getId() == Constants.SETTING_CLEAR_CACHE) { + if (bean.getId() == 19 || bean.getId() == 25|| bean.getId() == Constants.SETTING_UPDATE_ID || bean.getId() == Constants.SETTING_CLEAR_CACHE) { return VERSION; } else if (bean.isLast()) { return LAST; @@ -147,6 +147,16 @@ public class SettingAdapter extends RecyclerView.Adapter { } else if (bean.getId() == 19) { mText.setText(DeviceUtils.getVersionName(itemView.getContext())); mText.setTextColor(Color.parseColor("#969696")); + } else if (bean.getId() == 25) { + if (APKManager.get().getApkVerNew()) { + mText.setText(itemView.getContext().getString(R.string.latest_version)); + mText.setTextColor(Color.parseColor("#969696")); + + } else { + mText.setText(itemView.getContext().getString(R.string.discover_a_new_version)); + mText.setTextColor(Color.parseColor("#b3d465")); + } + } else { mText.setText(mVersionString); } diff --git a/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java b/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java index e7b0d026a..9c3edaf42 100644 --- a/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java +++ b/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java @@ -17,6 +17,7 @@ import android.widget.LinearLayout; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.CommonAppContext; import com.yunbao.common.Constants; import com.yunbao.common.activity.AbsActivity; import com.yunbao.common.dialog.AbsDialogFragment; @@ -228,12 +229,12 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O Constants.myIntoIndex = 2; Intent intent = new Intent(mContext, MyWebViewActivity.class); intent.putExtra(Constants.URL, CommonAppConfig.HOST + "/h5/shequ/index.html#/h5/shequ/release" + "?token=" + CommonAppConfig.getInstance().getToken() + "&uid=" + CommonAppConfig.getInstance().getUid() + "&isRelease=1"); - startActivity(intent); + CommonAppContext.getTopActivity().startActivity(intent); } else { Constants.myIntoIndex = 2; Intent intent = new Intent(mContext, MyWebViewActivity.class); intent.putExtra(Constants.URL, CommonAppConfig.HOST + "/h5/shequ/index.html#/h5/shequ/release" + "?token=" + CommonAppConfig.getInstance().getToken() + "&uid=" + CommonAppConfig.getInstance().getUid() + "&isRelease=1"); - startActivity(intent); + CommonAppContext.getTopActivity().startActivity(intent); } } }; diff --git a/main/src/main/java/com/yunbao/main/views/MainMeViewHolder.java b/main/src/main/java/com/yunbao/main/views/MainMeViewHolder.java index 3e8df3710..fb8f59241 100644 --- a/main/src/main/java/com/yunbao/main/views/MainMeViewHolder.java +++ b/main/src/main/java/com/yunbao/main/views/MainMeViewHolder.java @@ -1,5 +1,6 @@ package com.yunbao.main.views; +import android.annotation.SuppressLint; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; @@ -38,8 +39,10 @@ import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.manager.APKManager; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SVGAViewUtils; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.AbsMainViewHolder; import com.yunbao.common.views.weight.ViewClicksAntiShake; @@ -99,6 +102,7 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi private boolean firstInto = true; private Banner banner_me; private LinearLayout lt_advertisement; + private View redPoint; public MainMeViewHolder(Context context, ViewGroup parentView) { super(context, parentView); @@ -109,9 +113,11 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi return R.layout.view_main_me; } + @SuppressLint("WrongViewCast") @Override public void init() { mAvatar = (ImageView) findViewById(R.id.avatar); + redPoint = findViewById(R.id.red_point); ViewClicksAntiShake.clicksAntiShake(mAvatar, new ViewClicksAntiShake.ViewClicksCallBack() { @Override public void onViewClicks() { @@ -175,6 +181,7 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 10); } }); + redPoint.setVisibility(APKManager.get().getApkVerNew() ? View.GONE : View.VISIBLE); } @Override @@ -276,10 +283,8 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi private void showData(UserBean u, List list) { mBannerList.clear(); mBannerListNew.clear(); - if (!u.getSlide().equals("") && u.getSlide() != null) { + if (!StringUtil.isEmpty(u.getSlide())) { mBannerListNew.addAll(JSON.parseArray(u.getSlide(), SlideBean.class)); - } - if (!u.getSlide().equals("") && null != u.getSlide()) { for (SlideBean bean : mBannerListNew) { if (bean.getSlide_status().equals("1")) { mBannerList.add(bean); @@ -312,7 +317,7 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi public void onComplete(SVGAVideoEntity videoItem) { SVGADrawable drawable = new SVGADrawable(videoItem); gift_svga.setImageDrawable(drawable); - SVGAViewUtils.playEndClear(gift_svga,false); + SVGAViewUtils.playEndClear(gift_svga, false); } @Override @@ -441,11 +446,11 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi } else if (bean.getId() == 4) { url = HtmlConfig.SHOP + "?t=" + Math.random() + "&uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken(); WebViewActivity.forward(mContext, url); - } else if(bean.getId() == 3) {//我的等级 - Constants.myIntoIndex=2; + } else if (bean.getId() == 3) {//我的等级 + Constants.myIntoIndex = 2; Constants.isTitle = false; ZhuangBanActivity.forward(mContext, url); - }else{ + } else { WebViewActivity.forward(mContext, url); } @@ -462,8 +467,7 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi mContext.startActivity(new Intent(mContext, EditProfileActivity.class)); } else if (i == R.id.signature) { mContext.startActivity(new Intent(mContext, EditProfileActivity.class)); - } - else if (i == R.id.lt_star_coin) { + } else if (i == R.id.lt_star_coin) { mContext.startActivity(new Intent(mContext, MyWalletActivity.class).putExtra("p", 1)); } else if (i == R.id.btn_coin) { mContext.startActivity(new Intent(mContext, MyWalletActivity.class).putExtra("p", 0)); @@ -483,8 +487,6 @@ public class MainMeViewHolder extends AbsMainViewHolder implements OnItemClickLi } - - } /** diff --git a/main/src/main/res/layout/view_main_list.xml b/main/src/main/res/layout/view_main_list.xml index 50267d721..6b8a4600e 100644 --- a/main/src/main/res/layout/view_main_list.xml +++ b/main/src/main/res/layout/view_main_list.xml @@ -29,10 +29,8 @@ android:id="@+id/btn_back" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginEnd="377dp" - app:layout_constraintBottom_toBottomOf="@+id/indicator" - app:layout_constraintEnd_toEndOf="parent" + android:layout_marginStart="24dp" + android:layout_marginTop="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/indicator" app:srcCompat="@mipmap/icon_back_white" /> diff --git a/main/src/main/res/layout/view_main_me.xml b/main/src/main/res/layout/view_main_me.xml index 6e54a3206..9a0ef092d 100644 --- a/main/src/main/res/layout/view_main_me.xml +++ b/main/src/main/res/layout/view_main_me.xml @@ -476,18 +476,18 @@ android:layout_marginTop="12dp" android:layout_marginRight="15dp" android:background="@drawable/bg_me_data" - android:gravity="center" android:clickable="true" - android:focusableInTouchMode="true" android:focusable="true" + android:focusableInTouchMode="true" + android:gravity="center" android:orientation="horizontal"> @@ -534,10 +534,10 @@ android:layout_width="18dp" android:layout_height="18dp" android:layout_marginRight="30dp" + android:background="@mipmap/icon_more_gray" android:clickable="false" - android:focusableInTouchMode="false" android:focusable="false" - android:background="@mipmap/icon_more_gray" /> + android:focusableInTouchMode="false" /> + +