Compare commits

...

166 Commits

Author SHA1 Message Date
18401019693
3d5ac05d36 去除非必要提示影响用户体验感 2023-02-13 15:09:54 +08:00
18401019693
d3268e57bc 修改,关闭直播间滑动以后为你推荐无法切换直播间问题 2023-02-09 16:21:19 +08:00
18401019693
3549c25cca 修改登录空指针问题
Fatal Exception: java.lang.RuntimeException
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
2023-02-09 14:15:05 +08:00
18401019693
859f54b1e1 修改登录空指针问题 2023-02-09 14:14:02 +08:00
a808cd13c0 修复直播间PK时滑动到下一个PK直播间,会残留pk条观众头像问题 2023-02-07 17:04:51 +08:00
18401019693
cd0067d77b 修改多人PK结束PK送礼仍然展示PK结束画面问题 2023-02-07 14:19:10 +08:00
18401019693
894e264fb3 修改多人PK结束PK送礼仍然展示PK结束画面问题 2023-02-06 18:12:16 +08:00
5dd5b2e0ea 修复直播间PK时通过右上角角标-对方首页(web)-跳转直播间,会残留pk条观众头像问题 2023-02-06 16:28:39 +08:00
18401019693
8f58c485c8 用户端多人PK 修改结束后PK问题不结束问题 2023-02-04 16:53:29 +08:00
18401019693
11e809a978 用户端多人PK 2023-02-03 17:42:19 +08:00
18401019693
20aa6002f8 主播端多人PK 代码补提交 2023-02-03 16:40:41 +08:00
18401019693
ffcb0e8790 主播端多人PK 代码补提交 2023-02-03 16:23:31 +08:00
18401019693
3de7160538 主播端多人PK 2023-02-03 16:22:48 +08:00
18401019693
1e595ec526 主播强制关播功能添加 2023-02-02 15:27:41 +08:00
344bbcdfc8 修复与PC端连麦画面会拉升放大的问题 2023-01-29 16:48:29 +08:00
c1aeaa0e1b 修复LiveGiftDialogFragment一处空指针异常问题 2023-01-29 10:55:54 +08:00
e108494bd5 修复获取系统未读消息时userInfo为空导致的获取不到uid导致的闪退问题 2023-01-29 10:43:36 +08:00
bc0e698a77 修复【我的】UserBean.getSlide可能为空导致的闪退问题 2023-01-29 10:41:48 +08:00
b82c87d5d6 修复用户名片渲染用户等级时所使用的Activity被销毁导致的闪退问题 2023-01-29 10:12:05 +08:00
80fe5271f6 修复UserBean的is_bind为空导致【编辑资料】时闪退问题 2023-01-29 09:52:01 +08:00
944d703e36 修复UserBean的is_bind为空导致【编辑资料】时闪退问题 2023-01-29 09:49:04 +08:00
911869ed9f 修复通过【为你推荐】方式进入直播间会有上个直播间残留画面的问题 2023-01-15 09:56:51 +08:00
543336af99 直播间loading动画从10秒改成15秒 2023-01-14 14:51:59 +08:00
5d7cff6707 新增播放定时器,播放后10秒未播放就重新加载播放 2023-01-14 14:30:34 +08:00
1bbab7ac9e 修复滑动直播间到同一个主播时,会黑屏的问题 2023-01-14 13:19:23 +08:00
18142669586
16592aaecb Merge remote-tracking branch 'origin/master' 2023-01-13 17:36:30 +08:00
18142669586
3de9ff57c3 客服页面打不开问题 2023-01-13 17:36:06 +08:00
e932238fc2 修复GoogleFragment.java的url为空导致在输出日志时导致的空指针闪退问题 2023-01-13 09:46:06 +08:00
18401019693
df436bbe1e Merge remote-tracking branch 'origin/master' 2023-01-12 15:09:57 +08:00
18401019693
49bd97f646 上传分支 2023-01-12 15:09:48 +08:00
731f941298 修复幸运百分百活动在英文系统下会闪退问题呢(字符串转义问题) 2023-01-12 13:39:18 +08:00
18401019693
c21df55c06 修复:全服礼物通知,点围观无反应问题 2023-01-12 11:15:47 +08:00
9acbc60db2 随机PK文案调整【120分钟】→【10分钟】 2023-01-12 11:05:24 +08:00
5f2dda021a 新增直播播放缓冲超过2秒就刷新播放流 2023-01-11 18:06:51 +08:00
1244010c3d 修复整蛊设置金币总是为默认值1000 2023-01-11 17:19:37 +08:00
7226d54277 修复连麦用户端默认用小流导致画面模糊的问题 2023-01-11 15:02:19 +08:00
eaafcdd444 修复连麦下麦时会画面卡住的问题 2023-01-11 11:34:15 +08:00
9f9c02b7e7 修复重复切换分辨率会同时播放问题 2023-01-10 17:59:53 +08:00
18401019693
7bffdda6b9 修复:直播结束滚动问题 2023-01-10 17:50:03 +08:00
50d01ccd92 移除调试代码 2023-01-10 17:47:42 +08:00
18401019693
420573736d 修复:直播结束滚动问题 2023-01-10 17:22:15 +08:00
18401019693
aca98cb7e6 修复:直播结束滚动问题 2023-01-10 17:05:21 +08:00
18401019693
f26fb83fec 修复:送礼全服通知展示多个礼物名字问题 2023-01-10 17:04:56 +08:00
1ad9effe91 修复授权相册权限后打开发布动态会闪退问题 2023-01-10 16:57:25 +08:00
418d306d72 修复点系统通知时弹出了画质选项框 2023-01-10 16:33:41 +08:00
3606815a41 优化播放抛错时重新播放
优化滑动直播间时可能出现上一个直播间画面的问题
2023-01-10 16:12:17 +08:00
518e57ee44 优化已经在多人PK时不再切换默认流分辨率 2023-01-10 15:35:15 +08:00
872245c9c9 兼容幸运百分百活动 2023-01-10 15:34:40 +08:00
749f756d58 兼容幸运百分百活动 2023-01-10 13:32:08 +08:00
18142669586
a22dfb6214 單人PK卡0分 優化計算中 2023-01-10 13:27:13 +08:00
18401019693
652e569e2b 修改主播端发布远端流分辨率问题 2023-01-10 11:02:22 +08:00
d480986485 调整延迟200毫秒隐藏loading 2023-01-10 10:34:55 +08:00
2e6efc69e8 调整播放器3 2023-01-09 22:36:51 +08:00
e2761049e5 修复美颜失效问题 2023-01-09 21:29:46 +08:00
ee6a4288b0 调整播放器 2023-01-09 20:30:34 +08:00
7070f5c1b4 调整播放器拉升问题5 2023-01-09 18:30:53 +08:00
cc4cc2f746 调整播放器拉升问题5 2023-01-09 16:20:54 +08:00
93e2a8af02 调整播放器拉升问题4 2023-01-09 15:26:43 +08:00
207811c41d 修復在手机直播的直播间PK时切换分辨率会拉升问题 2023-01-09 14:47:23 +08:00
18401019693
8730a6396f 料体消息添加动画效果 2023-01-09 14:38:32 +08:00
05ff51bd48 Merge remote-tracking branch 'origin/master' 2023-01-09 13:54:18 +08:00
1904eeb3ba 移除Toast提示分辨率信息 2023-01-09 13:54:05 +08:00
18401019693
70126171c6 料体消息添加动画效果 2023-01-09 13:52:34 +08:00
18401019693
ee084d6f33 pk倒计时修复 2023-01-09 13:41:51 +08:00
bacf4fd32f 调整视频播放器3 2023-01-09 13:26:32 +08:00
18401019693
eaae58db31 pk倒计时修复 2023-01-09 10:56:49 +08:00
18401019693
13146595bf 修改直播间聊天删除问题 2023-01-09 10:23:21 +08:00
b3083cdd18 新增保存用户选择分辨率的设置 2023-01-08 21:49:07 +08:00
cf85870810 调整播放器默认流不拼接参数 2023-01-08 18:08:00 +08:00
182e46799a 修复PK时画面异常问题(分辨率未切到4:3)
优化播放器加载速度2
2023-01-08 17:17:31 +08:00
27bd65d3da 调整进直播间loading界面与播放器绑定,播放器准备完成后再隐藏。
优化播放器加载速度1
2023-01-08 15:50:40 +08:00
18401019693
9fcc04cef2 修改直播间聊天记录重叠问题 2023-01-08 14:42:01 +08:00
a1f07b8c20 调整观众端选择分辨率 2023-01-08 14:21:52 +08:00
18401019693
65efa88d4a 软件更新进度问题 2023-01-08 14:09:01 +08:00
01a2d66585 调整聊天室滑动动画效果速度 2023-01-07 17:13:27 +08:00
098e9bf6ba Merge remote-tracking branch 'origin/master' 2023-01-07 16:54:16 +08:00
ddf56963bb 调整PK天梯图标大小 2023-01-07 16:54:05 +08:00
18401019693
eadcaf826b xiu改直播间聊天列表滚动问题,修改热度加成列表等级问题 2023-01-07 16:46:11 +08:00
18401019693
36248eaeef 修改直播间聊天列表 2023-01-07 15:39:26 +08:00
04496c3888 Merge remote-tracking branch 'origin/master' 2023-01-07 15:36:03 +08:00
494aa6b52d 修复直播间画面变形问题 2023-01-07 15:35:53 +08:00
18401019693
4bb51506e3 修改直播间聊天列表 2023-01-07 15:19:33 +08:00
18401019693
112bec58df 修改热度加成问题 2023-01-07 14:53:12 +08:00
0b7a3cc50e 修复直播聊天室抽搐问题 2023-01-07 14:43:35 +08:00
9f517199fe 优化天梯PK连胜标识大小 2023-01-07 14:24:57 +08:00
2393a53466 修复因为更换渲染层导致在切换分辨率时会黑屏的问题 2023-01-07 10:13:34 +08:00
80993c7d2d 更换直播间视频渲染层以修复部分机型和模拟器滑动视频时白屏问题 2023-01-07 09:54:37 +08:00
8c0a23d39a Merge remote-tracking branch 'origin/master' 2023-01-06 15:53:27 +08:00
a0949f0903 暂时取消观众端监测卡顿自动切换分辨率问题 2023-01-06 15:53:09 +08:00
18401019693
42052b7465 软件更新问题更改 2023-01-06 15:49:00 +08:00
a37a92e211 优化PK时点击礼物弹窗隐藏【开通贵族】按钮 2023-01-06 15:04:27 +08:00
18401019693
c3ddc62b95 修改主播端选择分辨率的方法,接口新增参数 2023-01-06 10:03:37 +08:00
18401019693
0a3409f98a 修改主播端选择分辨率的方法,接口新增参数 2023-01-06 09:58:24 +08:00
18401019693
d26a687385 修改主播端选择分辨率的方法,接口新增参数 2023-01-05 18:13:43 +08:00
2f413e260e 调整修改清晰度提示弹窗改回Toast 2023-01-05 17:55:58 +08:00
6fcb194995 调整修改清晰度提示弹窗为黑底白字的而不是Toast 2023-01-05 17:48:10 +08:00
7cea6b4f8d 新增观众端点击未启用清晰度时的提示 2023-01-05 17:28:21 +08:00
16d02c6936 修复直播间观众端视频变形问题 2023-01-05 14:13:56 +08:00
289c93d824 修复直播间滑动未清空靓号标识和靓号背景问题 2023-01-04 17:22:39 +08:00
8f99d68b6f Merge remote-tracking branch 'origin/master' 2023-01-03 16:22:32 +08:00
e0d7137727 修复主播端开播设置clarityType失效问题 2023-01-03 16:22:20 +08:00
18401019693
7a9ed22ec9 新增主页面APk更新功能,区分强制非强制 2023-01-03 16:17:48 +08:00
18401019693
af58ec755d 新增APk内置更新功能 2023-01-03 15:11:20 +08:00
4ad2020b57 修复观众端选择分辨率时会显示主播端相关的提示语 2023-01-03 14:35:13 +08:00
1db24dae4b 优化观众端选择分辨率弹框的代码可读性 2023-01-03 14:26:52 +08:00
76055543c3 调整画质选择UI逻辑 2023-01-03 11:35:34 +08:00
a1d95d6a94 Merge remote-tracking branch 'origin/master' 2023-01-03 10:16:36 +08:00
2143e3eb77 修复魅力榜返回icon不见的问题 2023-01-03 09:42:33 +08:00
18401019693
4a0901ea93 修複踢人邏輯,增加翻譯 2022-12-30 17:24:46 +08:00
18142669586
488bee514d 單人PK卡0分 優化計算中 2022-12-30 16:36:40 +08:00
18142669586
bafea09e44 Merge remote-tracking branch 'origin/master' 2022-12-30 14:58:12 +08:00
18142669586
54923304dc 單人PK卡0分 優化計算中 2022-12-30 14:57:47 +08:00
18401019693
8b357233c2 開播設置,修改開播接口新增分辨率設置參數,網絡內存檢測和提示信息 2022-12-30 14:47:25 +08:00
06b5f99930 调整分辨率参数
移除调试用代码
2022-12-29 18:27:24 +08:00
0b5598346e 新增获取上传网速的方法 2022-12-29 17:55:41 +08:00
18401019693
d81e6b9f04 開播設置,修改開播接口新增分辨率設置參數 2022-12-29 17:04:23 +08:00
87e3dddac5 修复下播后随即PK没有自动取消匹配 2022-12-29 16:34:35 +08:00
55f3ac577b Merge branch 'dev_play_model_exo' 2022-12-29 16:20:51 +08:00
0c053a028e update 清晰度切换 2022-12-29 16:20:39 +08:00
df36529619 Merge remote-tracking branch 'origin/master' 2022-12-29 16:17:14 +08:00
7555510d94 update 清晰度切换 2022-12-29 16:16:08 +08:00
18142669586
2e986db686 單人PK卡0分 優化計算中 2022-12-29 16:12:41 +08:00
660853d5be update 清晰度切换 2022-12-29 15:59:32 +08:00
956bef4b90 update 清晰度切换 2022-12-29 15:59:03 +08:00
18142669586
43c22fca7c 主播PK名字头像新增 2022-12-29 15:17:34 +08:00
5db84c1e61 update 清晰度切换 2022-12-29 13:13:05 +08:00
00c3e0cb77 Merge branch 'master' into dev_play_model_exo 2022-12-29 11:02:12 +08:00
f4b6c46075 Merge remote-tracking branch 'origin/master' 2022-12-29 11:01:44 +08:00
181bb5b445 update 清晰度切换 2022-12-29 11:01:23 +08:00
18401019693
90f58054fa 机器人自动发消息设置页面修改,机器人求关注新增发送消息类型,直播间开播清晰度设置 2022-12-28 18:21:00 +08:00
137dbc72d8 update 2022-12-28 17:51:35 +08:00
18401019693
a7cef3c6f8 机器人自动打招呼 2022-12-27 14:41:17 +08:00
339d460c0f 修复直播聊天室还是会卡不会自动滚动问题 2022-12-27 13:52:01 +08:00
c8ba78f39b 修复直播聊天室还是会卡不会自动滚动问题 2022-12-27 10:17:47 +08:00
18401019693
d31af73479 PK结束消失PK条 2022-12-27 10:03:05 +08:00
18401019693
874800c19d 机器人自动发言 2022-12-24 14:45:20 +08:00
18401019693
404d45893f 机器人自动发言 2022-12-24 14:23:40 +08:00
ed6e95f380 update 2022-12-24 13:41:54 +08:00
c4cfa0becd 调整直播间聊天室动画效果 2022-12-24 11:08:09 +08:00
18401019693
a069562bbe 机器人自动发言 2022-12-24 10:20:51 +08:00
18401019693
9158424a25 机器人自动发言 2022-12-23 18:28:39 +08:00
7488143037 修复聊天室消息大于99消息会混乱的问题 2022-12-23 14:59:05 +08:00
99938f6ed6 修复聊天室消息大于99消息会混乱的问题 2022-12-23 14:57:59 +08:00
18401019693
1bde99f6c9 机器人自动发言 2022-12-23 14:39:24 +08:00
18401019693
e3a9a037ba 直播间机器人 2022-12-23 11:16:02 +08:00
b1d342f791 Merge branch 'dev_robot' 2022-12-22 09:59:20 +08:00
7639a70887 update 机器人 2022-12-22 09:58:43 +08:00
f690cf0b62 修复APP刚启动还没用创建Activity时受到推送通知并试图弹出权限申请对话框时,context为空导致的闪退问题 2022-12-21 16:01:59 +08:00
4dcb12eb4f 更新机器人API 2022-12-21 14:50:58 +08:00
18401019693
af5d8dbf19 修复:直播间内遮盖问题 2022-12-20 15:45:24 +08:00
9cd1638d55 修复GoogleFragment缺少默认构造方法导致在恢复数据的时候闪退问题 2022-12-20 10:59:58 +08:00
dd1570c10e 修复登录时getRandJoinAnchor接口返回info为空导致的空指针闪退问题 2022-12-20 10:55:12 +08:00
3af7ca5d94 修复登录时getRandJoinAnchor接口返回info为空导致的空指针闪退问题 2022-12-20 10:06:48 +08:00
2d2cc21e15 预设机器人设置UI 2022-12-19 17:32:42 +08:00
f872029c9d 新增机器人设置的API 2022-12-19 17:06:59 +08:00
6198489dd4 修复一处可能的空指针错误 2022-12-19 16:05:35 +08:00
cce8e43c24 修复一处可能的空指针错误 2022-12-19 16:05:29 +08:00
cae0599307 优化直播间聊天消息动画效果 2022-12-19 15:32:09 +08:00
18401019693
2c6e88500a 修复:修改关播接口上传参数 2022-12-16 16:22:15 +08:00
efc20c644a 修复直播间长期不动会自动停止滚动的问题 2022-12-16 15:40:37 +08:00
bdc43baaa8 修复直播间长期不动会自动停止滚动的问题 2022-12-16 15:40:03 +08:00
dc529b6640 修复直播间长期不动会自动停止滚动的问题 2022-12-16 13:57:00 +08:00
18401019693
488cc192b2 修复:修改更新Apk逻辑,(雷电模拟器卡死问题) 2022-12-16 13:54:07 +08:00
18401019693
269f6c64a9 修复:修改进入PK房退出以后闪退问题 2022-12-15 16:23:33 +08:00
18401019693
51186169ca 需求:修改空指针问题 2022-12-15 16:07:43 +08:00
18401019693
325e57d1d5 需求:修改登录页面 2022-12-15 15:47:39 +08:00
160 changed files with 7991 additions and 919 deletions

View File

@@ -299,7 +299,7 @@
<string name="beautify_hip_slim">Hip</string>
<string name="beautify_head_slim">Head shrink</string>
<string name="beautify_leg_thin_slim">Thin leg</string>
<string name="toast_not_detect_body">No body tracking</string>
<string name="toast_not_detect_body">No message tracking</string>
<string name="pta_human_full_body">Body driver</string>
<string name="pta_human_half_body">Bust driver</string>

View File

@@ -89,20 +89,23 @@ public class CustomMessageReceiver extends PushMessageReceiver {
public boolean onNotificationMessageArrived(Context context, PushType pushType, PushNotificationMessage notificationMessage) {
Log.i("gmc", notificationMessage.getPushContent() + "VVV" + notificationMessage.getPushTitle() + "gmc11112222" + notificationMessage.getExtra());
if (!SpUtil.getInstance().getBooleanValue("NOTIFICATION")) {
Activity activity = AppContext.activityWeakReference.get();
if (activity != null) {
DialogUitl.showSimpleDialog(activity, "应用需要通知权限", new DialogUitl.SimpleCallback() {
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent intent = new Intent();
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("app_package", context.getPackageName());
intent.putExtra("app_uid", context.getApplicationInfo().uid);
// for Android 8 and above
intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
activity.startActivity(intent);
}
});
if (AppContext.activityWeakReference != null) {
Activity activity = AppContext.activityWeakReference.get();
if (activity != null) {
DialogUitl.showSimpleDialog(activity, "应用需要通知权限", new DialogUitl.SimpleCallback() {
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent intent = new Intent();
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("app_package", context.getPackageName());
intent.putExtra("app_uid", context.getApplicationInfo().uid);
// for Android 8 and above
intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
activity.startActivity(intent);
}
});
}
}
}
if (notificationMessage.getExtra() == null) {

View File

@@ -189,8 +189,5 @@ dependencies {
api files('libs/Msc.jar')
api 'com.github.li-xiaojun:XPopup:2.9.1'
//app-updater
api 'com.github.jenly1314.AppUpdater:app-updater:1.1.3'
//app-dialog
api 'com.github.jenly1314.AppUpdater:app-dialog:1.1.3'
}

View File

@@ -133,6 +133,7 @@ public class Constants {
public static final int LIVE_FUNC_WKS = 2014;//語音
public static final int LIVE_FUNC_ZSLK = 2015;//語音
public static final int LIVE_FUNC_RANDOM_PK = 2016;//随机PK
public static final int LIVE_ROBOT= 2017;//机器人
//socket
public static final String SOCKET_CONN = "conn";
@@ -171,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排位赛更新数据
@@ -189,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;

View File

@@ -0,0 +1,51 @@
package com.yunbao.common.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.yunbao.common.R;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.views.RobotMessageViewHolder;
import java.util.ArrayList;
import java.util.List;
public class RobotMessageAdapter extends RecyclerView.Adapter {
private List<LiveAiRobotBean.Message> messageList = new ArrayList<>();
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View robotMessageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_robot_message, parent, false);
return new RobotMessageViewHolder(robotMessageView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
RobotMessageViewHolder messageViewHolder = (RobotMessageViewHolder) holder;
messageViewHolder.setData(messageList.get(position), position + 1);
}
@Override
public int getItemCount() {
return messageList.size();
}
public void setDataAll(List<LiveAiRobotBean.Message> messages) {
messageList.clear();
messageList.addAll(messages);
notifyDataSetChanged();
}
// 删除数据
public void removeData(int position) {
messageList.remove(position);
//删除动画
notifyItemRemoved(position);
}
}

View File

@@ -0,0 +1,51 @@
package com.yunbao.common.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.yunbao.common.R;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.views.RobotSayHelloViewHoler;
import java.util.ArrayList;
import java.util.List;
public class RobotSayHelloAdapter extends RecyclerView.Adapter {
private List<LiveAiRobotBean.Message> messageList = new ArrayList<>();
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View robotSayHelloView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_robot_message, parent, false);
return new RobotSayHelloViewHoler(robotSayHelloView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
RobotSayHelloViewHoler robotSayHelloViewHoler = (RobotSayHelloViewHoler) holder;
robotSayHelloViewHoler.setData(messageList.get(position), position + 1);
}
@Override
public int getItemCount() {
return messageList.size();
}
public void setDataAll(List<LiveAiRobotBean.Message> messages) {
messageList.clear();
messageList.addAll(messages);
notifyDataSetChanged();
}
// 删除数据
public void removeData(int position) {
messageList.remove(position);
//删除动画
notifyItemRemoved(position);
}
}

View File

@@ -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;
}

View File

@@ -28,6 +28,8 @@ public class EnterRoomNewModel extends BaseModel {
private String isUseHotCard = "";//是否使用热度卡
@SerializedName("liveRoomActivity")
private List<LiveRoomActivityModel> liveRoomActivityModels = new ArrayList<>();//活动列表
@SerializedName("clarityType")
private int clarityType;
public List<LiveRoomActivityModel> 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 +
'}';
}
}

View File

@@ -1,10 +1,18 @@
package com.yunbao.common.bean;
public class HttpCallbackModel extends BaseModel{
public class HttpCallbackModel extends BaseModel {
private int code;
private String msg;
public HttpCallbackModel() {
}
public HttpCallbackModel(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}

View File

@@ -0,0 +1,138 @@
package com.yunbao.common.bean;
import androidx.annotation.NonNull;
import com.google.gson.annotations.SerializedName;
/**
* 机器人bean
*/
public class LiveAiRobotBean extends BaseModel {
@SerializedName("ai_name")
private String name;
@SerializedName("ai_state")
private int status;//1=开 0=关
@SerializedName("ai_time")
private int time;
@SerializedName("ai_sayhi")
private int autoSeyHiNumber;// 自动打招呼已配置数量
@SerializedName("ai_gz")
private int autoRequestFollowNumber;//自动求关注已配置数量
public LiveAiRobotBean() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public int getAutoSeyHiNumber() {
return autoSeyHiNumber;
}
public void setAutoSeyHiNumber(int autoSeyHiNumber) {
this.autoSeyHiNumber = autoSeyHiNumber;
}
public int getAutoRequestFollowNumber() {
return autoRequestFollowNumber;
}
public void setAutoRequestFollowNumber(int autoRequestFollowNumber) {
this.autoRequestFollowNumber = autoRequestFollowNumber;
}
@NonNull
@Override
public String toString() {
return "LiveAiRobotBean{" +
"name='" + name + '\'' +
", status=" + status +
", time=" + time +
", autoSeyHiNumber=" + autoSeyHiNumber +
", autoRequestFollowNumber=" + autoRequestFollowNumber +
'}';
}
/**
* 机器人消息
*/
public static class Message {
public static final int TYPE_SAY_HI=1;//自动打招呼
public static final int TYPE_FOLLOW=3;//自动求关注
@SerializedName("id")
private int id;
@SerializedName("uid")
private int uid;
@SerializedName("type")
private int type;
@SerializedName("content")
private String content;
public Message() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@NonNull
@Override
public String toString() {
return "Message{" +
"id=" + id +
", uid=" + uid +
", type=" + type +
", content='" + content + '\'' +
'}';
}
}
}

View File

@@ -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 +
'}';
}
}

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
public class LivePushRyEvent extends BaseModel {
}

View File

@@ -0,0 +1,16 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
public class LiveRobotMessageEvent extends BaseModel {
private int index = -1;
public int getIndex() {
return index;
}
public LiveRobotMessageEvent setIndex(int index) {
this.index = index;
return this;
}
}

View File

@@ -0,0 +1,16 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
public class LiveRobotSayHelloEvent extends BaseModel {
private int index = -1;
public int getIndex() {
return index;
}
public LiveRobotSayHelloEvent setIndex(int index) {
this.index = index;
return this;
}
}

View File

@@ -239,6 +239,7 @@ public class ImgLoader {
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
if (callback != null) {
callback.onLoadSuccess(resource);
}
}

View File

@@ -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);

View File

@@ -9,19 +9,22 @@ import com.yunbao.common.bean.CustomSidebarInfoModel;
import com.yunbao.common.bean.EnterRoomNewModel;
import com.yunbao.common.bean.FaceBookUpModel;
import com.yunbao.common.bean.HourRank;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.LinkMicUserBeanV2;
import com.yunbao.common.bean.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;
import com.yunbao.common.bean.NobleTrumpetModel;
import com.yunbao.common.bean.PkRankBean;
import com.yunbao.common.bean.RandomPkUserBean;
import com.yunbao.common.bean.RankPkInfoBean;
import com.yunbao.common.bean.PrankGiftBean;
import com.yunbao.common.bean.PrankHttpTurntableBean;
import com.yunbao.common.bean.RandomPkUserBean;
import com.yunbao.common.bean.RankPkInfoBean;
import com.yunbao.common.bean.SearchModel;
import com.yunbao.common.bean.SetAttentsModel;
import com.yunbao.common.bean.SlideInBannerModel;
@@ -29,6 +32,7 @@ import com.yunbao.common.bean.StarChallengeStatusModel;
import com.yunbao.common.bean.VipModel;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.Field;
@@ -36,6 +40,7 @@ import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
/**
* PDLive网络接口访问
@@ -354,42 +359,51 @@ public interface PDLiveApi {
/**
* 设置随机PK开关
*
* @param pk 1=开0=关
*/
@GET("/api/public/?service=Livepk.setRandomPKType")
Observable<ResponseModel<List<BaseModel>>> changeRandomPkSwitch(@Query("random_pk") int pk);
/**
* 获取自由PK次数
*/
@GET("/api/public/?service=Livepk.getActivePkNum")
Observable<ResponseModel<Integer>> getFreePkNumber();
/**
* 发起随机PK
*/
@GET("/api/public/?service=Livepk.setRandomPK")
Observable<ResponseModel<String>> randomPK();
/**
* 随机PK后调用接口给后台记录
*/
@GET("/api/public/?service=Livepk.startRandomPK")
Observable<ResponseModel<BaseModel>> startRandomPK(@Query("pkuid")String pkuid);
Observable<ResponseModel<BaseModel>> startRandomPK(@Query("pkuid") String pkuid);
/**
* 自由PK开始后调用接口扣掉次数
*/
@GET("/api/public/?service=Livepk.setActivePkNum")
Observable<ResponseModel<BaseModel>> setFreePkNum();
/**
* 随机PK搜索用户
*
* @param cs 简体关键字/uid
* @param ct 繁体关键字/uid
*/
@GET("/api/public/?service=Livepk.searchUser")
Observable<ResponseModel<List<RandomPkUserBean>>> randomPkSearchUser(@Query("jian_key")String cs,@Query("fan_key")String ct);
Observable<ResponseModel<List<RandomPkUserBean>>> randomPkSearchUser(@Query("jian_key") String cs, @Query("fan_key") String ct);
/**
* 拒绝随机PK
*/
@GET("/api/public/?service=Livepk.setBanRandomPK")
Observable<ResponseModel<BaseModel>> setBanRandomPK();
/**
* 拒绝随机PK
*/
@@ -403,6 +417,7 @@ public interface PDLiveApi {
Observable<ResponseModel<PrankHttpTurntableBean>> getAnchorPrankTurntable(
@Query("anchor_id") String anchor_id
);
/**
* 提交整蛊
*/
@@ -418,6 +433,7 @@ public interface PDLiveApi {
@Query("turntable_six") String turntable_six,
@Query("status") String status
);
/**
* 转盘整蛊结束后调用的接口
*/
@@ -431,7 +447,7 @@ public interface PDLiveApi {
* 获取整蛊列表
*/
@GET("/api/public/?service=Prank.prankList")
Observable<ResponseModel<List<PrankGiftBean>>> prankList( @Query("anchor_id") String anchor_id);
Observable<ResponseModel<List<PrankGiftBean>>> prankList(@Query("anchor_id") String anchor_id);
/**
* 设置礼物整蛊
@@ -443,6 +459,7 @@ public interface PDLiveApi {
@Query("gift_num") String gift_num,
@Query("prank_content") String prank_content
);
/**
* 删除礼物整蛊
*/
@@ -452,4 +469,77 @@ public interface PDLiveApi {
@Query("prank_index") String prank_index
);
/**
* 设置机器人开关
*/
@GET("/api/public/?service=Live.setAnchorAiState")
Observable<ResponseModel<HttpCallbackModel>> setAnchorAiState(
@Query("ai_state") String ai_state
);
/**
* 获取机器人信息
*/
@GET("/api/public/?service=Live.getAnchorAiState")
Observable<ResponseModel<LiveAiRobotBean>> getAnchorAiState(
);
/**
* 修改机器人信息
*/
@GET("/api/public/?service=Live.setAnchorAiState")
Observable<ResponseModel<Integer>> setAnchorAiState(
@QueryMap Map<String, Object> map
);
/**
* 获取机器人自定义话术
*
* @param type 1(自定义打招呼) 3(自定义求关注)
*/
@GET("/api/public/?service=Live.getAiAutomaticSpeech")
Observable<ResponseModel<List<LiveAiRobotBean.Message>>> getAiAutomaticSpeech(
@Query("type") String type
);
/**
* 机器人添加话术
*/
@GET("/api/public/?service=Live.addAiAutomaticSpeech")
Observable<ResponseModel<List<String>>> addAiAutomaticSpeech(
@Query("type") String type,
@Query("content") String content
);
/**
* 机器人删除话术
*/
@GET("/api/public/?service=Live.delAiAutomaticSpeech ")
Observable<ResponseModel<List<String>>> delAiAutomaticSpeech(
@Query("type") String type,
@Query("id") String id
);
/**
* 机器人修改话术
*/
@GET("/api/public/?service=Live.updateAiAutomaticSpeech")
Observable<ResponseModel<List<String>>> updateAiAutomaticSpeech(
@Query("type") String type,
@Query("id") String id,
@Query("content") String content
);
/**
* 开播获取机器人状态和心愿单状态
*/
@GET("/api/public/?service=Live.getLiveStetUpStatus")
Observable<ResponseModel<LiveStetUpStatusModel>> getLiveStetUpStatus(
@Query("liveuid") String liveUid
);
@GET("/api/public/?service=live.jieshuDRPK")
Observable<ResponseModel<BaseModel>> jieshuDRPK(
@Query("roomid") String roomId,
@Query("uid") String uid);
}

View File

@@ -14,14 +14,15 @@ import com.yunbao.common.bean.EnterRoomNewModel;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.LinkMicUserBean;
import com.yunbao.common.bean.LinkMicUserBeanV2;
import com.yunbao.common.bean.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;
import com.yunbao.common.bean.PrankGiftBean;
import com.yunbao.common.bean.PrankHttpTurntableBean;
import com.yunbao.common.bean.PrankTurntableBean;
import com.yunbao.common.bean.RandomPkUserBean;
import com.yunbao.common.bean.RankPkInfoBean;
import com.yunbao.common.bean.SetAttentsModel;
@@ -33,13 +34,14 @@ import com.yunbao.common.http.base.CheckLiveCallBack;
import com.yunbao.common.http.base.HttpCallback;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import retrofit2.http.Query;
/**
@@ -879,7 +881,7 @@ public class LiveNetManager {
/**
* 整蛊结束
*/
public void endPrankTurntable(String mLiveUid,HttpCallback<BaseModel> callback){
public void endPrankTurntable(String mLiveUid, HttpCallback<BaseModel> callback) {
API.get().pdLiveApi(mContext)
.endPrankTurntable(mLiveUid)
.subscribeOn(Schedulers.io())
@@ -898,6 +900,181 @@ public class LiveNetManager {
}
public void getAiRobotStatus(HttpCallback<LiveAiRobotBean> callback) {
API.get().pdLiveApi(mContext)
.getAnchorAiState()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(responseModel.getData().getInfo());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
public void setAiRobotStatus(String status, HttpCallback<HttpCallbackModel> callback) {
API.get().pdLiveApi(mContext)
.setAnchorAiState(status)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(null);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
public void setAiRobotDate(String name, String value, HttpCallback<HttpCallbackModel> callback) {
Map<String, Object> map = new HashMap<>();
map.put(name, value);
API.get().pdLiveApi(mContext)
.setAnchorAiState(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(null);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
public void getAiRobotBody(int type, HttpCallback<List<LiveAiRobotBean.Message>> callback) {
API.get().pdLiveApi(mContext)
.getAiAutomaticSpeech(type + "")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(responseModel.getData().getInfo());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
public void addAiRobotBody(int type, String content, HttpCallback<HttpCallbackModel> callback) {
API.get().pdLiveApi(mContext)
.addAiAutomaticSpeech(type + "", content)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(new HttpCallbackModel(responseModel.getData().getCode(), responseModel.getData().getMsg()));
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
public void updateAiRobotBody(int type, int id, String content, HttpCallback<HttpCallbackModel> callback) {
API.get().pdLiveApi(mContext)
.updateAiAutomaticSpeech(type + "", id + "", content)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(new HttpCallbackModel(responseModel.getData().getCode(), responseModel.getData().getMsg()));
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
public void delAiRobotBody(int type, int id, HttpCallback<HttpCallbackModel> callback) {
API.get().pdLiveApi(mContext)
.delAiAutomaticSpeech(type + "", id + "")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseModel -> {
if (callback != null) {
callback.onSuccess(new HttpCallbackModel(responseModel.getData().getCode(), responseModel.getData().getMsg()));
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(throwable.getMessage());
}
}
}).isDisposed();
}
/**
* 开播设置数据获取
*
* @param liveUid
* @param callback
*/
public void getLiveStetUpStatus(String liveUid, HttpCallback<LiveStetUpStatusModel> callback) {
API.get().pdLiveApi(mContext)
.getLiveStetUpStatus(liveUid)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<LiveStetUpStatusModel>>() {
@Override
public void accept(ResponseModel<LiveStetUpStatusModel> liveStetUpStatusModelResponseModel) throws Exception {
if (callback != null) {
callback.onSuccess(liveStetUpStatusModelResponseModel.getData().getInfo());
}
}
}, new Consumer<Throwable>() {
@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();
}
/**
* 直播间取消网络请求
*/

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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 {
/**

View File

@@ -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())

View File

@@ -0,0 +1,184 @@
package com.yunbao.common.utils;
import android.app.Activity;
import android.app.Dialog;
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.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.core.content.FileProvider;
import com.yunbao.common.R;
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;
public class APKDownloadUtil {
/**
* APK文件下载
*
* @param url
*/
public void downloadAPK(Activity context, String url, 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();
}
showDialod(context);
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());
progressDialog.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() {
tvProgress.setText(progress + "%");
progressBar.setProgress(progress);
}
});
}
outputStream.flush();
//启动安装app
installApk(context, downloadFile, context.getPackageName() + ".fileprovider");
handler.post(() -> progressDialog.dismiss());
} catch (Exception e) {
e.printStackTrace();
new Handler().post(() -> {
listener.updateFailure(-1, e.getMessage());
progressDialog.dismiss();
});
}
}
});
}
/**
* 更新监听
*/
public interface OnUpdateListener {
void updateFailure(int code, String error);
}
//
// /**
// * 启动app安装
// *
// * @param context
// * @param filePath
// */
// private static void startInstall(Context context, File filePath) {
//
// Intent install = new Intent(Intent.ACTION_VIEW);
// install.setDataAndType(Uri.parse("file://" + filePath.getAbsolutePath()),
// "application/vnd.android.package-archive");
// install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(install);
// }
/**
* 安装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;
}
public TextView tvProgress;
public ProgressBar progressBar;
public Dialog progressDialog;
private void showDialod(Activity context) {
if (progressDialog == null) {
progressDialog = new Dialog(context, R.style.dialog);
View view = LayoutInflater.from(context).inflate(R.layout.dialog_progress, null);
tvProgress = view.findViewById(R.id.tvProgress);
progressBar = view.findViewById(R.id.progressBar);
progressDialog.setContentView(view);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int width = display.getWidth();
Window window = progressDialog.getWindow();// 这部分是设置dialog宽高的宽高是我从sharedpreferences里面获取到的。之前程序启动的时候有获取
window.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = width / 4 * 3;
window.setAttributes(lp);
}
progressDialog.setCancelable(false);
progressDialog.show();
}
}

View File

@@ -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;
}
}

View File

@@ -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) {

View File

@@ -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;

View File

@@ -2,37 +2,26 @@ package com.yunbao.common.utils;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.king.app.dialog.AppDialog;
import com.king.app.updater.AppUpdater;
import com.king.app.updater.UpdateConfig;
import com.king.app.updater.callback.UpdateCallback;
import com.king.app.updater.http.OkHttpManager;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.R;
import com.yunbao.common.bean.ConfigBean;
import java.io.File;
public class VersionUtil {
private static String sVersion;
public TextView tvProgress;
public ProgressBar progressBar;
/**
* 是否是最新版本
*/
@@ -49,176 +38,122 @@ public class VersionUtil {
else return false;
// return curVersion.equal(version);
}
public void updateProgress(long progress, long total){
if(tvProgress == null || progressBar == null){
return;
}
if(progress > 0){
int currProgress = (int)(progress * 1.0f / total * 100.0f);
tvProgress.setText(currProgress + "%");
progressBar.setProgress(currProgress);
}else{
tvProgress.setText("稍等");
}
}
public void upd( Activity context, ConfigBean configBean, String downloadUrl){
UpdateConfig config = new UpdateConfig();
config.setUrl(downloadUrl);
config.addHeader("token","xxxxxx");
AppUpdater mAppUpdater = new AppUpdater(context,config)
.setHttpManager(OkHttpManager.getInstance())
.setUpdateCallback(new UpdateCallback() {
@Override
public void onDownloading(boolean isDownloading) {
if(isDownloading){
ToastUtil.show("已经在下载中,请勿重复下载。");
}else{
// showToast("开始下载…");
View view = LayoutInflater.from(context).inflate(R.layout.dialog_progress,null);
tvProgress = view.findViewById(R.id.tvProgress);
progressBar = view.findViewById(R.id.progressBar);
AppDialog.INSTANCE.showDialog(context,view,false);
}
}
@Override
public void onStart(String url) {
updateProgress(0,100);
}
@Override
public void onProgress(long progress, long total, boolean isChange) {
if(isChange){
updateProgress(progress,total);
}
}
@Override
public void onFinish(File file) {
AppDialog.INSTANCE.dismissDialog();
ToastUtil.show("下载完成");
}
@Override
public void onError(Exception e) {
AppDialog.INSTANCE.dismissDialog();
ToastUtil.show("下载失败");
}
@Override
public void onCancel() {
AppDialog.INSTANCE.dismissDialog();
ToastUtil.show("取消下载");
}
});
mAppUpdater.start();
}
//是否是谷歌版本
public void showDialog( Activity context, ConfigBean configBean, String downloadUrl) {
//不是谷歌
if (CommonAppConfig.IS_GOOGLE_PLAY == false) {
//不强更
if(configBean.getForceUpdate()!=1){
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
public void showDialog(Activity context, ConfigBean configBean, String downloadUrl) {
//不是谷歌
if (CommonAppConfig.IS_GOOGLE_PLAY == false) {
//不强更
if (configBean.getForceUpdate() != 1) {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
}
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
upd(context,configBean,downloadUrl);
}
});
@Override
public void onConfirmClick(Dialog dialog, String content) {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
// upd(context,configBean,downloadUrl);
new APKDownloadUtil().downloadAPK(context, configBean.getDownloadApkUrl(), new APKDownloadUtil.OnUpdateListener() {
@Override
public void updateFailure(int code, String error) {
}
})
.build()
.show();
}else{
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
context.finish();
}
}
});
}
});
@Override
public void onConfirmClick(Dialog dialog, String content) {
upd(context,configBean,downloadUrl);
}
})
.build()
.show();
}
}
})
.build()
.show();
} else {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
context.finish();
}
//谷歌版本
} else if (CommonAppConfig.IS_GOOGLE_PLAY == true) {
//谷歌强制更新
if(configBean.getGoogle_isup().equals("1")) {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
context.finish();
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
// upd(context,configBean,downloadUrl);
new APKDownloadUtil().downloadAPK(context, configBean.getDownloadApkUrl(), new APKDownloadUtil.OnUpdateListener() {
@Override
public void updateFailure(int code, String error) {
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
//谷歌不强制
}else {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
}
}
});
}
})
.build()
.show();
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
}
//谷歌版本
} else if (CommonAppConfig.IS_GOOGLE_PLAY == true) {
//谷歌强制更新
if (configBean.getGoogle_isup().equals("1")) {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
context.finish();
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
//谷歌不强制
} else {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(WordUtil.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfrimString(WordUtil.getString(R.string.version_immediate_use))
.setCancelString(WordUtil.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
}
}
}
/**

View File

@@ -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;
}
}

View File

@@ -128,6 +128,9 @@ public class CustomDrawerPopupView extends DrawerPopupView {
@Override
public void onViewClicks() {
dismiss();
if (callBack != null) {
callBack.changeVideo();
}
}
@@ -195,6 +198,8 @@ public class CustomDrawerPopupView extends DrawerPopupView {
void systemNotice();
void changeVideo();
void online();
void reportLayout();

View File

@@ -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();
}
}

View File

@@ -0,0 +1,98 @@
package com.yunbao.common.views;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.lxj.xpopup.animator.PopupAnimator;
import com.lxj.xpopup.core.CenterPopupView;
import com.yunbao.common.R;
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, int title) {
super(context);
this.message = message;
this.title = title;
}
public InputCustomPopup(@NonNull Context context,int title) {
super(context);
this.title = title;
}
// 返回自定义弹窗的布局
@Override
protected int getImplLayoutId() {
return R.layout.input_custom_popup;
}
// 执行初始化操作比如findView设置点击或者任何你弹窗内的业务逻辑
@Override
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) {
dismiss(); // 关闭弹窗
}
});
findViewById(R.id.btn_confirm).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String textContent = content.getText().toString();
if (TextUtils.isEmpty(textContent)) {
ToastUtil.show("输入内容不可为空");
return;
}
if (listener != null) {
listener.onConfirm(textContent);
}
dismiss(); // 关闭弹窗
}
});
}
// 设置最大宽度,看需要而定,
@Override
protected int getMaxWidth() {
return super.getMaxWidth();
}
// 设置最大高度,看需要而定
@Override
protected int getMaxHeight() {
return super.getMaxHeight();
}
// 设置自定义动画器,看需要而定
@Override
protected PopupAnimator getPopupAnimator() {
return super.getPopupAnimator();
}
public interface InputCustomListener {
void onConfirm(String text);
}
private InputCustomListener listener;
public InputCustomPopup setListener(InputCustomListener listener) {
this.listener = listener;
return this;
}
}

View File

@@ -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<Long> netSpeeds = new ArrayList<>();
private double netAverage = 0;
private void initDate() {
netHandler.postDelayed(netRunnable, 100);
}
}

View File

@@ -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<LiveStetUpStatusModel>() {
@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();
}
}

View File

@@ -0,0 +1,188 @@
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;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.core.BottomPopupView;
import com.yunbao.common.R;
import com.yunbao.common.adapter.RobotMessageAdapter;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.event.LiveRobotMessageEvent;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.Bus;
import com.yunbao.common.utils.ToastUtil;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
public class LiveRobotMessageCustomPopup extends BottomPopupView {
private static String TAG = "AI机器人";
private RecyclerView robotMessages;
private RobotMessageAdapter robotMessageAdapter;
private EditText robotNameSetting;
private TextView robotTime;
private String robotTimeString = "";
public LiveRobotMessageCustomPopup(@NonNull Context context, String robotTime) {
super(context);
this.robotTimeString = robotTime;
}
public LiveRobotMessageCustomPopup(@NonNull Context context) {
super(context);
}
// 返回自定义弹窗的布局
@Override
protected int getImplLayoutId() {
return R.layout.dialog_live_robot_message;
}
// 执行初始化操作比如findView设置点击或者任何你弹窗内的业务逻辑
@Override
protected void onCreate() {
super.onCreate();
Bus.getOn(this);
initView();
initDate();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLiveRobotMessageEvent(LiveRobotMessageEvent event) {
if (event.getIndex() > 0) {
robotMessageAdapter.removeData(event.getIndex());
} else {
initDate();
}
}
@Override
public void onDestroy() {
super.onDestroy();
Bus.getOff(this);
}
private void initView() {
robotMessages = (RecyclerView) findViewById(R.id.robot_messages);
robotNameSetting = findViewById(R.id.robot_name_setting);
robotTime = findViewById(R.id.robot_time);
robotMessageAdapter = new RobotMessageAdapter();
robotMessages.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
robotMessages.setAdapter(robotMessageAdapter);
robotTime.setText(robotTimeString);
findViewById(R.id.bt_cancel).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
robotTime.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
robotTime.setVisibility(GONE);
robotNameSetting.setVisibility(VISIBLE);
robotNameSetting.setText(robotTime.getText().toString());
//输入框,获取焦点 不然无法弹出键盘
robotNameSetting.requestFocus();
//键盘输入法管理器
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(robotNameSetting, 0);
}
});
robotNameSetting.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
String time = robotNameSetting.getText().toString();
int timeInt = Integer.parseInt(time);
if (timeInt > 5) {
// 修改助手名字
LiveNetManager.get(getContext())
.setAiRobotDate("ai_time", time, new HttpCallback<HttpCallbackModel>() {
@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);
}
}
return false;
}
});
//添加消息语
findViewById(R.id.robot_add_content).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new XPopup.Builder(getContext())
.asCustom(new InputCustomPopup(getContext(), R.string.automatic_message_sending).setListener(new InputCustomPopup.InputCustomListener() {
@Override
public void onConfirm(String text) {
//添加消息语
LiveNetManager.get(getContext())
.addAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, text, new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
initDate();
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
}))
.show();
}
});
}
private void initDate() {
LiveNetManager.get(getContext())
.getAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, new HttpCallback<List<LiveAiRobotBean.Message>>() {
@Override
public void onSuccess(List<LiveAiRobotBean.Message> data) {
Log.i(TAG, "onSuccess: " + data.size());
for (LiveAiRobotBean.Message message : data) {
Log.i(TAG, "onSuccess: message=" + message.toString());
}
robotMessageAdapter.setDataAll(data);
}
@Override
public void onError(String error) {
}
});
}
}

View File

@@ -0,0 +1,128 @@
package com.yunbao.common.views;
import android.content.Context;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.core.BottomPopupView;
import com.yunbao.common.R;
import com.yunbao.common.adapter.RobotSayHelloAdapter;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.event.LiveRobotSayHelloEvent;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.Bus;
import com.yunbao.common.utils.ToastUtil;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
public class LiveRobotSayHelloCustomPopup extends BottomPopupView {
private RecyclerView robotMessages;
private RobotSayHelloAdapter robotMessageAdapter;
private static String TAG = "AI机器人";
public LiveRobotSayHelloCustomPopup(@NonNull Context context) {
super(context);
}
// 返回自定义弹窗的布局
@Override
protected int getImplLayoutId() {
return R.layout.dialog_live_robot_say_hello;
}
// 执行初始化操作比如findView设置点击或者任何你弹窗内的业务逻辑
@Override
protected void onCreate() {
super.onCreate();
Bus.getOn(this);
initView();
initDate();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLiveRobotSayHelloEvent(LiveRobotSayHelloEvent event) {
if (event.getIndex() > 0) {
robotMessageAdapter.removeData(event.getIndex());
} else {
initDate();
}
}
@Override
public void onDestroy() {
super.onDestroy();
Bus.getOff(this);
}
private void initView() {
robotMessages = (RecyclerView) findViewById(R.id.robot_messages);
robotMessageAdapter = new RobotSayHelloAdapter();
robotMessages.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
robotMessages.setAdapter(robotMessageAdapter);
findViewById(R.id.bt_cancel).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
//添加消息语
findViewById(R.id.robot_add_content).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new XPopup.Builder(getContext())
.asCustom(new InputCustomPopup(getContext(), R.string.automatic_greeting_setting).setListener(new InputCustomPopup.InputCustomListener() {
@Override
public void onConfirm(String text) {
//添加消息语
LiveNetManager.get(getContext())
.addAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, text, new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
initDate();
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
}))
.show();
}
});
}
private void initDate() {
LiveNetManager.get(getContext())
.getAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, new HttpCallback<List<LiveAiRobotBean.Message>>() {
@Override
public void onSuccess(List<LiveAiRobotBean.Message> data) {
Log.i(TAG, "onSuccess 自动打招呼 : " + data.size());
for (LiveAiRobotBean.Message message : data) {
Log.i(TAG, "onSuccess: message=" + message.toString());
}
robotMessageAdapter.setDataAll(data);
}
@Override
public void onError(String error) {
}
});
}
}

View File

@@ -0,0 +1,270 @@
package com.yunbao.common.views;
import android.content.Context;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatTextView;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.core.BasePopupView;
import com.lxj.xpopup.core.BottomPopupView;
import com.lxj.xpopup.interfaces.XPopupCallback;
import com.yunbao.common.R;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.ToastUtil;
public class LiveRobotSettingCustomPopup extends BottomPopupView implements View.OnClickListener {
private static String TAG = "AI机器人";
private EditText robotNameSetting;
private AppCompatTextView automaticGreetingNumber, automaticMessageNumber;
private TextView robotNameText;
private String time = "";
private ImageView robotState;
private int robotStateInt = 1;
public int getRobotStateInt() {
return robotStateInt;
}
public LiveRobotSettingCustomPopup(@NonNull Context context) {
super(context);
}
// 返回自定义弹窗的布局
@Override
protected int getImplLayoutId() {
return R.layout.dialog_live_robot_setting;
}
// 执行初始化操作比如findView设置点击或者任何你弹窗内的业务逻辑
@Override
protected void onCreate() {
super.onCreate();
intiView();
initDate();
}
private void intiView() {
robotNameSetting = findViewById(R.id.robot_name_setting);
robotNameText = findViewById(R.id.robot_name_text);
robotState = findViewById(R.id.robot_state);
automaticGreetingNumber = findViewById(R.id.automatic_greeting_number);
automaticMessageNumber = findViewById(R.id.automatic_message_number);
findViewById(R.id.automatic_message_sending).setOnClickListener(this);
findViewById(R.id.automatic_greeting_setting).setOnClickListener(this);
robotNameText.setOnClickListener(this);
robotState.setOnClickListener(this);
robotNameSetting.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// 修改助手名字
LiveNetManager.get(getContext())
.setAiRobotDate("ai_name", robotNameSetting.getText().toString(), new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
robotNameSetting.setVisibility(GONE);
robotNameText.setVisibility(VISIBLE);
robotNameText.setText(robotNameSetting.getText().toString());
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
return false;
}
});
}
@Override
public void onClick(View v) {
int viewID = v.getId();
if (viewID == R.id.automatic_message_sending) {
new XPopup.Builder(getContext())
.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) {
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(new LiveRobotMessageCustomPopup(getContext(), time))
.show();
} else if (viewID == R.id.robot_name_text) {
robotNameText.setVisibility(GONE);
robotNameSetting.setVisibility(VISIBLE);
robotNameSetting.setText(robotNameText.getText().toString());
//输入框,获取焦点 不然无法弹出键盘
robotNameSetting.requestFocus();
//键盘输入法管理器
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(robotNameSetting, 0);
} else if (viewID == R.id.robot_state) {
int state = 0;
if (robotStateInt == 1) {
state = 0;
} else {
state = 1;
}
// 修改助手名字
int finalState = state;
LiveNetManager.get(getContext())
.setAiRobotDate("ai_state", String.valueOf(state), new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
if (finalState == 1) {
robotState.setImageResource(R.mipmap.special_icon_on);
robotStateInt = 1;
} else {
robotState.setImageResource(R.mipmap.special_icon_off);
robotStateInt = 0;
}
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
} else if (viewID == R.id.automatic_greeting_setting) {
new XPopup.Builder(getContext())
.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) {
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(new LiveRobotSayHelloCustomPopup(getContext()))
.show();
}
}
private void initDate() {
LiveNetManager.get(getContext())
.getAiRobotStatus(new com.yunbao.common.http.base.HttpCallback<LiveAiRobotBean>() {
@Override
public void onSuccess(LiveAiRobotBean data) {
robotNameText.setText(data.getName());
automaticGreetingNumber.setText(String.valueOf(data.getAutoSeyHiNumber()));
automaticMessageNumber.setText(String.valueOf(data.getAutoRequestFollowNumber()));
time = String.valueOf(data.getTime());
robotStateInt = data.getStatus();
if (data.getStatus() == 1) {
robotState.setImageResource(R.mipmap.special_icon_on);
}
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
initListType1();
initListType2();
}
private void initListType1() {
}
private void initListType2() {
}
}

View File

@@ -0,0 +1,77 @@
package com.yunbao.common.views;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.lxj.xpopup.XPopup;
import com.yunbao.common.R;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.event.LiveRobotMessageEvent;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.Bus;
import com.yunbao.common.utils.ToastUtil;
public class RobotMessageViewHolder extends RecyclerView.ViewHolder {
private TextView serialNumber, messageText;
private ImageView btnDelete;
public RobotMessageViewHolder(@NonNull View itemView) {
super(itemView);
serialNumber = itemView.findViewById(R.id.serial_number);
messageText = itemView.findViewById(R.id.message_text);
btnDelete = itemView.findViewById(R.id.btn_delete);
}
public void setData(LiveAiRobotBean.Message message, int index) {
serialNumber.setText(String.valueOf(index));
messageText.setText(message.getContent());
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LiveNetManager.get(itemView.getContext())
.delAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, message.getId(), new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
Bus.get().post(new LiveRobotMessageEvent().setIndex(index - 1));
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
});
messageText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new XPopup.Builder(itemView.getContext())
.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())
.updateAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, message.getId(), text, new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
Bus.get().post(new LiveRobotMessageEvent());
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
}))
.show();
}
});
}
}

View File

@@ -0,0 +1,77 @@
package com.yunbao.common.views;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.lxj.xpopup.XPopup;
import com.yunbao.common.R;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.event.LiveRobotSayHelloEvent;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.Bus;
import com.yunbao.common.utils.ToastUtil;
public class RobotSayHelloViewHoler extends RecyclerView.ViewHolder {
private TextView serialNumber, messageText;
private ImageView btnDelete;
public RobotSayHelloViewHoler(@NonNull View itemView) {
super(itemView);
serialNumber = itemView.findViewById(R.id.serial_number);
messageText = itemView.findViewById(R.id.message_text);
btnDelete = itemView.findViewById(R.id.btn_delete);
}
public void setData(LiveAiRobotBean.Message message, int index) {
serialNumber.setText(String.valueOf(index));
messageText.setText(message.getContent());
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LiveNetManager.get(itemView.getContext())
.delAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, message.getId(), new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
Bus.get().post(new LiveRobotSayHelloEvent().setIndex(index - 1));
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
});
messageText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new XPopup.Builder(itemView.getContext())
.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())
.updateAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, message.getId(), text, new HttpCallback<HttpCallbackModel>() {
@Override
public void onSuccess(HttpCallbackModel data) {
Bus.get().post(new LiveRobotSayHelloEvent());
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
}))
.show();
}
});
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@android:color/white" />
<corners
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp" />
</shape>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<stroke
android:width="1.2dp"
android:color="#FFAE05" />
<corners android:radius="21dp" />
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFC621" />
<corners android:radius="21dp" />
</shape>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="11.67dp" />
<solid android:color="#81C16D" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="13.33dp" />
<solid android:color="#0D0D0D" />
</shape>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape>
<corners android:radius="8dp" />
<solid android:color="#20FFB2B2" />
</shape>
</item>
<item android:state_selected="false">
<shape>
<corners android:radius="8dp" />
<solid android:color="#407792D0" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item >
<shape>
<corners android:radius="13.33dp"/>
<solid android:color="#00B8EB"/>
</shape>
</item>
</selector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--设置ProgressBar背景色-->
<item android:id="@android:id/background">
<shape>
<!--设置ProgressBar进度条圆角半径-->
<corners android:radius="5dp" />
<solid android:color="#E6E6E6" />
</shape>
</item>
<!--设置ProgressBar进度条颜色-->
<item android:id="@android:id/progress">
<clip android:clipOrientation="horizontal">
<shape>
<corners android:radius="5dp" />
<solid android:color="#0D0D0D" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -67,5 +67,5 @@
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="250dp"
android:layout_height="310dp"
android:orientation="vertical">
<ImageView
android:layout_width="250dp"
android:layout_height="310dp"
android:src="@mipmap/update_tip_box" />
<ScrollView
android:layout_width="200dp"
android:layout_height="110dp"
android:layout_marginStart="28dp"
android:layout_marginTop="135dp"
android:scrollbars="none">
<TextView
android:id="@+id/update_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新內容:
1、內容內容內容內容內容內容
2、內容內容內容內容內容內容
3、內容內容內容內容內容
4、內容內容內容內容內容"
android:textColor="#1B1B1B"
android:textSize="12sp" />
</ScrollView>
<TextView
android:id="@+id/version_immediate_use"
android:layout_width="153.33dp"
android:layout_height="26.67dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="15dp"
android:background="@drawable/bg_apk_update_btn"
android:gravity="center"
android:text="@string/version_immediate_use"
android:textColor="@color/white"
android:textSize="10sp"
android:visibility="gone" />
<LinearLayout
android:id="@+id/update_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="15dp"
android:gravity="center_horizontal"
android:orientation="vertical">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dp"
android:layout_height="9dp"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/progress_bg" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:text="@string/updating"
android:textColor="#8C8C8C"
android:textSize="11sp" />
</LinearLayout>
<ImageView
android:id="@+id/dialog_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginTop="60dp"
android:layout_marginEnd="10dp"
android:src="@mipmap/icon_close_tip" />
</RelativeLayout>

View File

@@ -108,7 +108,7 @@
</LinearLayout>
<LinearLayout
android:visibility="gone"
android:visibility="visible"
android:id="@+id/system_notice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="249dp"
android:background="@drawable/bg_live_tota"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical">
<RelativeLayout
android:id="@+id/line_sd"
android:layout_width="0dp"
android:layout_height="137dp"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:background="@drawable/bg_btn_definition"
android:orientation="vertical">
<ImageView
android:id="@+id/icon_sd"
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_alignParentEnd="true"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:src="@mipmap/icon_selected" />
<ImageView
android:id="@+id/sd"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="39dp"
android:src="@mipmap/icon_sd" />
<TextView
android:id="@+id/sd_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/sd"
android:layout_centerInParent="true"
android:layout_marginTop="4dp"
android:text="@string/standard_clear"
android:textColor="#F6F7FB"
android:textSize="16sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/line_hd"
android:layout_width="0dp"
android:layout_height="137dp"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:background="@drawable/bg_btn_definition"
android:orientation="vertical">
<ImageView
android:id="@+id/icon_hd"
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_alignParentEnd="true"
android:layout_margin="10dp"
android:src="@mipmap/icon_selected" />
<ImageView
android:id="@+id/hd"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="39dp"
android:src="@mipmap/icon_hd" />
<TextView
android:id="@+id/hd_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/hd"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:text="@string/high_definition"
android:textColor="#F6F7FB"
android:textSize="16sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/line_fhd"
android:layout_width="0dp"
android:layout_height="137dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_weight="1"
android:background="@drawable/bg_btn_definition"
android:orientation="vertical">
<ImageView
android:id="@+id/icon_fhd"
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_alignParentEnd="true"
android:layout_margin="10dp"
android:src="@mipmap/icon_selected" />
<ImageView
android:id="@+id/fhd"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="39dp"
android:src="@mipmap/icon_fhd" />
<TextView
android:id="@+id/fhd_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/fhd"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:text="@string/ultra_hd"
android:textColor="#F6F7FB"
android:textSize="16sp" />
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="30dp"
android:text="@string/clarity_hint"
android:textColor="#FFFFFF"
android:textSize="12sp" />
</LinearLayout>

View File

@@ -95,6 +95,28 @@
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/live_tool_robot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="28dp"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/live_more_icon_robot" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/robot_setup"
android:textColor="#FF9A9A9A"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</HorizontalScrollView>

View File

@@ -0,0 +1,174 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="#000002">
<LinearLayout
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/bt_cancel"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="5.33dp"
android:layout_marginTop="7.76dp"
android:layout_marginBottom="6.33dp"
android:src="@mipmap/icon_back" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="6.67dp"
android:text="@string/automatic_message_sending"
android:textColor="#CCCCCC"
android:textSize="15sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/robot_add_content"
android:layout_width="67.67dp"
android:layout_height="23.33dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="11dp"
android:background="@drawable/background_81c16d"
android:gravity="center"
android:text="@string/robot_add_content"
android:textColor="#FFFFFF"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/line2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/line1"
android:layout_marginStart="10.33dp"
android:layout_marginEnd="10.67dp"
android:background="@drawable/bg_prank_coin"
android:orientation="horizontal"
android:paddingTop="8.67dp"
android:paddingBottom="7.67dp">
<ImageView
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="13.67dp"
android:src="@mipmap/icon_tip" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8.33dp"
android:text="@string/robot_add_content_hint1"
android:textColor="#CCCCCC"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8.33dp"
android:layout_marginTop="6dp"
android:text="@string/robot_add_content_hint2"
android:textColor="#CCCCCC"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/robot_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/line2"
android:layout_marginTop="11dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="@string/robot_automatic_speech_interval"
android:textColor="#FFF"
android:textSize="13sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="3.67dp"
android:text="@string/robot_minimum_interval"
android:textColor="#B3B3B3"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/robot_time"
android:layout_width="96dp"
android:layout_height="27dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_prank_coin"
android:gravity="center"
android:maxLines="1"
android:textColor="#FFF"
android:textSize="12sp" />
<EditText
android:id="@+id/robot_name_setting"
android:layout_width="96dp"
android:layout_height="27dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_prank_coin"
android:gravity="center"
android:imeOptions="actionDone"
android:inputType="number"
android:maxLines="1"
android:textColor="#FFF"
android:textSize="12sp"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/robot_messages"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/robot_name" />
</RelativeLayout>

View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="#000002">
<LinearLayout
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/bt_cancel"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="5.33dp"
android:layout_marginTop="7.76dp"
android:layout_marginBottom="6.33dp"
android:src="@mipmap/icon_back" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="6.67dp"
android:text="@string/automatic_greeting_setting"
android:textColor="#CCCCCC"
android:textSize="15sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/robot_add_content"
android:layout_width="67.67dp"
android:layout_height="23.33dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="11dp"
android:background="@drawable/background_81c16d"
android:gravity="center"
android:text="@string/robot_add_content"
android:textColor="#FFFFFF"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/line2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/line1"
android:layout_marginStart="10.33dp"
android:layout_marginEnd="10.67dp"
android:background="@drawable/bg_prank_coin"
android:orientation="horizontal"
android:paddingTop="8.67dp"
android:paddingBottom="7.67dp">
<ImageView
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="13.67dp"
android:src="@mipmap/icon_tip" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8.33dp"
android:text="@string/robot_add_content_hint3"
android:textColor="#CCCCCC"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8.33dp"
android:layout_marginTop="6dp"
android:text="@string/robot_add_content_hint4"
android:textColor="#CCCCCC"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/robot_messages"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/line2" />
</RelativeLayout>

View File

@@ -0,0 +1,266 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000"
android:paddingBottom="23dp">
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="14dp"
android:text="@string/speech_robot_setup"
android:textColor="#CCCCCC"
android:textSize="15sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/robot_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/textView6"
android:layout_marginTop="18dp"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:text="@string/robot_switch"
android:textColor="#FFF"
android:textSize="15sp" />
<ImageView
android:id="@+id/robot_state"
android:layout_width="46dp"
android:layout_height="23dp"
android:layout_marginEnd="10dp"
app:srcCompat="@mipmap/special_icon_off" />
</LinearLayout>
<LinearLayout
android:id="@+id/robot_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/robot_status"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="@string/robot_name_setting"
android:textColor="#FFF"
android:textSize="13sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="3.67dp"
android:text="@string/word_limit"
android:textColor="#B3B3B3"
android:textSize="10sp" />
</LinearLayout>
<EditText
android:id="@+id/robot_name_setting"
android:layout_width="96dp"
android:layout_height="27dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_prank_coin"
android:gravity="center"
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="1"
android:textColor="#FFF"
android:textSize="12sp"
android:visibility="gone" />
<TextView
android:id="@+id/robot_name_text"
android:layout_width="96dp"
android:layout_height="27dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_prank_coin"
android:gravity="center"
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="1"
android:textColor="#FFF"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/robot_say_hello"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/robot_name"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="@string/automatic_greeting_setting"
android:textColor="#FFF"
android:textSize="13sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="3.67dp"
android:text="@string/configured_items"
android:textColor="#B3B3B3"
android:textSize="10sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/automatic_greeting_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4.67dp"
android:layout_marginTop="3.67dp"
android:textColor="#00B8EB"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/automatic_greeting_setting"
android:layout_width="96dp"
android:layout_height="27dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_robot_shape"
android:gravity="center"
android:text="@string/robot_go_setting"
android:textColor="#FFF"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/robot_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/robot_say_hello"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="@string/automatic_message_sending"
android:textColor="#FFF"
android:textSize="13sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="3.67dp"
android:text="@string/configured_items"
android:textColor="#B3B3B3"
android:textSize="10sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/automatic_message_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4.67dp"
android:layout_marginTop="3.67dp"
android:textColor="#00B8EB"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/automatic_message_sending"
android:layout_width="96dp"
android:layout_height="27dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_robot_shape"
android:gravity="center"
android:text="@string/robot_go_setting"
android:textColor="#FFF"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/robot_message"
android:layout_marginStart="10.33dp"
android:layout_marginTop="29dp"
android:layout_marginEnd="10.67dp"
android:background="@drawable/bg_prank_coin"
android:orientation="horizontal"
android:paddingTop="8.67dp"
android:paddingBottom="7.67dp">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="13.67dp"
android:src="@mipmap/icon_tip" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8.33dp"
android:text="@string/robot_hint"
android:textColor="#CCCCCC"
android:textSize="12sp" />
</LinearLayout>
</RelativeLayout>

View File

@@ -19,7 +19,7 @@
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ivIcon"
android:textSize="14sp"
android:textColor="@color/app_dialog_title_color"
android:textColor="#333333"
android:text="更新中"/>
<TextView
@@ -30,7 +30,7 @@
android:layout_marginTop="10dp"
android:lineSpacingMultiplier="1.2"
android:text="正在下載中......"
android:textColor="@color/app_dialog_content_color"
android:textColor="#333333"
android:textSize="14sp" />
<ProgressBar

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_loading_dialog"
android:orientation="vertical">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/loading"
android:textColor="@color/white"
android:layout_margin="15dp"
android:textSize="14sp" />
</LinearLayout>

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="270dp"
android:layout_height="180dp"
android:orientation="vertical"
app:cardCornerRadius="18dp"
app:cardElevation="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="@string/ultra_hd_hint"
android:textColor="#161616"
android:textSize="16sp" />
<TextView
android:id="@+id/contest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="14dp"
android:layout_marginEnd="10dp"
android:text="@string/ultra_hd_hint2"
android:textColor="#999999"
android:textSize="12sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/live_open_cancel"
android:layout_width="100dp"
android:layout_height="36dp"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:background="@drawable/backgroud_live_open_lfet"
android:gravity="center"
android:text="@string/back"
android:textColor="#FFC621"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/live_open_ok"
android:layout_width="100dp"
android:layout_height="36dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="16dp"
android:background="@drawable/backgroud_live_open_right"
android:gravity="center"
android:text="@string/stick_to_choice"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_dialog"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:gravity="center_horizontal"
android:text="@string/dialog_tip"
android:textColor="#161616"
android:textSize="15sp" />
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:background="@drawable/bg_dialog_input"
android:gravity="center"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:textColor="@color/textColor"
android:textSize="14sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginBottom="23dp"
android:gravity="center">
<TextView
android:id="@+id/btn_cancel"
android:layout_width="87dp"
android:layout_height="33dp"
android:layout_marginRight="7dp"
android:background="@drawable/backgroud_live_open_lfet"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#FFC621"
android:textSize="14sp" />
<TextView
android:id="@+id/btn_confirm"
android:layout_width="87dp"
android:layout_height="33dp"
android:layout_marginLeft="7dp"
android:background="@mipmap/tipbox_btn_orange"
android:gravity="center"
android:text="@string/confirm"
android:textColor="#FFFFFF"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,245 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="280dp"
android:layout_height="340dp"
android:orientation="vertical"
app:cardCornerRadius="12dp"
app:cardElevation="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="@string/confirmation_of_broadcast"
android:textColor="#161616"
android:textSize="16sp" />
<LinearLayout
android:id="@+id/line_clarity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:layout_marginTop="14dp"
android:layout_marginEnd="29dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clarity"
android:textColor="#999999"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/text_clarity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clarity"
android:textColor="#FFC621"
android:textSize="14sp" />
<ImageView
android:layout_width="5dp"
android:layout_height="10dp"
android:layout_marginStart="6dp"
android:src="@mipmap/icon_more_open" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_live_room_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="29dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/live_room_type"
android:textColor="#999999"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/text_live_room_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clarity"
android:textColor="#FFC621"
android:textSize="14sp" />
<ImageView
android:layout_width="5dp"
android:layout_height="10dp"
android:layout_marginStart="6dp"
android:src="@mipmap/icon_more_open" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_live_class"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="29dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/live_class1"
android:textColor="#999999"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/text_live_class"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/live_class1"
android:textColor="#FFC621"
android:textSize="14sp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="10dp"
android:layout_marginStart="6dp"
android:src="@mipmap/icon_more_open" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_live_wishlist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="29dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/live_wishlist"
android:textColor="#999999"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/text_live_wishlist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clarity"
android:textColor="#FFC621"
android:textSize="14sp" />
<ImageView
android:layout_width="5dp"
android:layout_height="10dp"
android:layout_marginStart="6dp"
android:src="@mipmap/icon_more_open" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_robot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="29dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/robot"
android:textColor="#999999"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/text_robot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clarity"
android:textColor="#FFC621"
android:textSize="14sp" />
<ImageView
android:layout_width="5dp"
android:layout_height="10dp"
android:layout_marginStart="6dp"
android:src="@mipmap/icon_more_open" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/live_open_cancel"
android:layout_width="100dp"
android:layout_height="36dp"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:background="@drawable/backgroud_live_open_lfet"
android:gravity="center"
android:text="@string/back"
android:textColor="#FFC621"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/live_open_ok"
android:layout_width="100dp"
android:layout_height="36dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="16dp"
android:background="@drawable/backgroud_live_open_right"
android:gravity="center"
android:text="@string/broadcast"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="@drawable/bg_prank_coin">
<TextView
android:id="@+id/serial_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="13dp"
android:text="1"
android:textColor="@color/white"
android:textSize="20sp" />
<TextView
android:id="@+id/message_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="19dp"
android:text="测试文字"
android:textColor="#80CEF2"
android:textSize="13sp" />
</LinearLayout>
<ImageView
android:id="@+id/btn_delete"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="9dp"
android:layout_marginEnd="10.67dp"
android:src="@mipmap/icon_close" />
</LinearLayout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 883 B

After

Width:  |  Height:  |  Size: 883 B

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 955 B

After

Width:  |  Height:  |  Size: 955 B

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

View File

@@ -801,6 +801,7 @@
<string name="user_task_but">Predecessors</string>
<string name="user_login_facebook">Sign in with Facebook</string>
<string name="user_login_twitter">Sign in with Twitter</string>
<string name="user_login_google">Sign in with Google</string>
<string name="user_login_outtime">Request timed out, please try again later.</string>
@@ -933,4 +934,72 @@ Limited ride And limited avatar frame</string>
<string name="studio_gift_effects">Blocking gift effects</string>
<string name="studio_ride_effects">Blocking seat effects</string>
<string name="want_pre">If you want to Minimize Play,\nYou can go to set the license.</string>
<string name="in_batch">In a batch</string>
<string name="chat_chat">Chat</string>
<string name="lucky_angel" >Congratulations %s have won %s in the Lucky Angel! The next lucky angel will be you!</string>
<string name="lucky_100" >Congratulations on %s winning %s in Luck 100 %%! Go pass on the good luck!</string>
<string name="user_card_guard" >Guardian group %s people</string>
<string name="to_receive" >receive</string>
<string name="to_complete" >To complete</string>
<string name="already_collected" >Already collected</string>
<string name="image_quality_selection" >Image quality selection</string>
<string name="more_settings" >More Settings</string>
<string name="moer">view more</string>
<string name="gift_way">The gift is on the way...</string>
<string name="start_pk">The gift is on the way</string>
<string name="number_of_remaining_times">Remaining count :%s</string>
<string name="confirmed_to_proceed">Whether to confirm multiple PK (deduct 1 point after confirmation) remaining times on the day: %s</string>
<string name="invite_anchor">Invite \n anchor</string>
<string name="end_pk">End \nPK</string>
<string name="pk_time">Time %s</string>
<string name="random_pk_dialog_apply" >accept</string>
<string name="random_pk_dialog_refuse" >refuse</string>
<string name="random_pk_dialog_refuse_again" >Persist in refusing</string>
<string name="random_pk_dialog_title" >Random PK hint</string>
<string name="speech_robot_setup" >Automatic speech robot setup</string>
<string name="robot_switch" >Robot switch</string>
<string name="robot_name_setting" >Robot name setting</string>
<string name="word_limit" >The word limit is 2 to 8 word</string>
<string name="automatic_greeting_setting" >Automatic greeting setting</string>
<string name="configured_items" >Number of configured items</string>
<string name="automatic_message_sending" >Set automatic message sending</string>
<string name="robot_go_setting" >Go to set</string>
<string name="robot_hint" >Thank you for sending gifts, PK start, PK end automatic robot message, \n does not support customization.</string>
<string name="robot_add_content" >Add content</string>
<string name="robot_add_content_hint1" >At regular intervals, the robot automatically says the following sentence at random。</string>
<string name="robot_add_content_hint2" >Fill in the content recommendation, such as: send wish list, add fan group, etc</string>
<string name="robot_automatic_speech_interval" >Automatic speech interval (minutes)</string>
<string name="robot_minimum_interval" >At least once every 5 minutes</string>
<string name="robot_add_content_hint3" >When a user enters the studio, the robot will @the user and automatically</string>
<string name="robot_add_content_hint4" >The following sentence is random. Set a minimum of 1 to a maximum of 20.</string>
<string name="robot_setup" >Robot setup</string>
<string name="high_definition" >High definition</string>
<string name="standard_clear" >fluency</string>
<string name="ultra_hd" >Ultra hd</string>
<string name="clarity_hint" >After determining the definition of the broadcast, you need to restart the broadcast to change</string>
<string name="confirmation_of_broadcast" >Confirmation of broadcast Settings</string>
<string name="clarity" >clarity</string>
<string name="live_class1" >Live channel</string>
<string name="broadcast" >broadcast</string>
<string name="robot" >robot</string>
<string name="do_set" >set</string>
<string name="not_set" >Not set</string>
<string name="robot_no" >no</string>
<string name="robot_yes" >yes</string>
<string name="ultra_hd_hint" >Ultra HD hint</string>
<string name="ultra_hd_hint2" >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?</string>
<string name="stick_to_choice" >Stick to choice</string>
<string name="net_hint" >Network prompt</string>
<string name="net_hint2" >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.</string>
<string name="check_the_new_version" >check version</string>
<string name="discover_a_new_version" >Update</string>
<string name="latest_version" >Latest Version</string>
<string name="updating" >updating</string>
<string name="live_user_ban_fhd" >There is no choice, the anchor is not turned on FHD live.</string>
<string name="live_user_ban_hd" >There is no choice, the anchor is not turned on HD live.</string>
<string name="function_is_suspended" >Sorry, this feature is on hold.</string>
</resources>

View File

@@ -723,7 +723,7 @@
<string name="live_wishlist">心願單</string>
<string name="live_zg">娛樂整蠱</string>
<string name="live_dr">多人PK</string>
<string name="live_random" translatable="false">随机PK</string>
<string name="live_random" >随机PK</string>
<string name="live_mic">語音連麥</string>
<string name="live_wks">周星榜</string>
<string name="live_zslk">暫時離開</string>
@@ -826,6 +826,7 @@
<string name="user_login_facebook">使用Facebook登录</string>
<string name="user_login_twitter">使用Twitter登录</string>
<string name="user_login_google">使用Google登录</string>
<string name="user_login_outtime">請求超時,請稍後再試。</string>
@@ -957,13 +958,14 @@
<string name="in_batch">換一批</string>
<string name="chat_chat">聊聊天</string>
<string name="want_pre">想在其他APP上方也顯示小窗\n可前往設置進行授權。</string>
<string name="lucky_angel" translatable="false">恭喜 %s 在幸運天使中抽中 %s下一個幸運天使就是你哦</string>
<string name="user_card_guard" translatable="false">守護團%s人</string>
<string name="to_receive" translatable="false">領取</string>
<string name="to_complete" translatable="false">去完成</string>
<string name="already_collected" translatable="false">已領取</string>
<string name="image_quality_selection" translatable="false">畫質選擇</string>
<string name="more_settings" translatable="false">更多設置</string>
<string name="lucky_angel" >恭喜 %s 在幸運天使中抽中 %s下一個幸運天使就是你哦</string>
<string name="lucky_100" >恭喜 %s 在好運百分百中抽中 %s快去接力好運吧~</string>
<string name="user_card_guard" >守護團%s人</string>
<string name="to_receive" >領取</string>
<string name="to_complete" >去完成</string>
<string name="already_collected" >已領取</string>
<string name="image_quality_selection" >畫質選擇</string>
<string name="more_settings" >更多設置</string>
<string name="moer">查看更多</string>
<string name="gift_way">礼物正在获取中...</string>
<string name="start_pk">開始PK</string>
@@ -973,8 +975,51 @@
<string name="end_pk">結束\nPK</string>
<string name="pk_time">時間 %s</string>
<string name="random_pk_dialog_apply" translatable="false">接受</string>
<string name="random_pk_dialog_refuse" translatable="false">拒绝</string>
<string name="random_pk_dialog_refuse_again" translatable="false">坚持拒绝</string>
<string name="random_pk_dialog_title" translatable="false">随机PK提示</string>
<string name="random_pk_dialog_apply" >接受</string>
<string name="random_pk_dialog_refuse" >拒绝</string>
<string name="random_pk_dialog_refuse_again" >坚持拒绝</string>
<string name="random_pk_dialog_title" >随机PK提示</string>
<string name="speech_robot_setup" >自動發言機器人設置</string>
<string name="robot_switch" >機器人開關</string>
<string name="robot_name_setting" >機器人名字設置</string>
<string name="word_limit" >字數限制2-8個字</string>
<string name="automatic_greeting_setting" >自動打招呼設置</string>
<string name="configured_items" >已配置條數</string>
<string name="automatic_message_sending" >自動發消息設置</string>
<string name="robot_go_setting" >前往設置</string>
<string name="robot_hint" >感謝送禮、PK開始、PK結束的自動機器人消息\n暫不支持自定義。</string>
<string name="robot_add_content" >添加內容</string>
<string name="robot_add_content_hint1" >每隔一段時間,機器人自動隨機以下一句話發出。</string>
<string name="robot_add_content_hint2" >填寫內容推薦,如:求送心願單、加粉絲團等</string>
<string name="robot_automatic_speech_interval" >自動發言間隔時間(分鐘)</string>
<string name="robot_minimum_interval" >最少間隔5分鐘1次</string>
<string name="robot_add_content_hint3" >當有用戶進入直播間時,機器人會@該用戶並自動</string>
<string name="robot_add_content_hint4" >隨機以下一句話。最少設置1條最多20條。</string>
<string name="robot_setup" >機器人設置</string>
<string name="high_definition" >高清</string>
<string name="standard_clear" >流暢</string>
<string name="ultra_hd" >超高清</string>
<string name="clarity_hint" >確定清晰度開播後,需要重新開播才能更改</string>
<string name="confirmation_of_broadcast" >開播設置確認</string>
<string name="clarity" >清晰度</string>
<string name="live_class1" >直播頻道</string>
<string name="broadcast" >開播</string>
<string name="robot" >機器人</string>
<string name="do_set" >已設置</string>
<string name="not_set" >未設置</string>
<string name="robot_no" ></string>
<string name="robot_yes" ></string>
<string name="ultra_hd_hint" >超高清提示</string>
<string name="ultra_hd_hint2" >在網速不穩定的情況下,選擇超高清將會有可能導致直播間畫面卡頓,是否確認選擇?</string>
<string name="stick_to_choice" >堅持選擇</string>
<string name="net_hint" >網絡提示</string>
<string name="net_hint2" >系統監測到您的網絡不穩定,設備內存不足將會影響到您的直播流暢度,因此建議您選擇流暢清晰度。</string>
<string name="check_the_new_version" >检查新版本</string>
<string name="discover_a_new_version" >發現新版本,點此更新</string>
<string name="latest_version" >已是最新版本</string>
<string name="updating" >更新中</string>
<string name="live_user_ban_fhd" >無法選擇,該主播未開啟超高清直播。</string>
<string name="live_user_ban_hd" >無法選擇,該主播未開啟高清直播。</string>
<string name="function_is_suspended" >抱歉,該功能暫停使用中。</string>
</resources>

View File

@@ -1,18 +1,18 @@
ext {
android = [
compileSdkVersion: 31,
buildToolsVersion: "28.0.3",
buildToolsVersion: "29.0.2",
minSdkVersion : 21,
targetSdkVersion : 31,
versionCode : 310,
versionName : "6.4.6"
versionCode : 405,
versionName : "6.4.8"
]
manifestPlaceholders = [
//正式
//serverHost : "https://napi.yaoulive.com",
// 測試
serverHost : "https://ceshi.yaoulive.com",
serverHost : "https://napi.yaoulive.com",
//
// serverHost : "https://ceshi.yaoulive.com",
//腾讯地图
txMapAppKey : "EOZBZ-ASLCU-4XPV3-BDCHZ-4E3Q7-H4BWB",
@@ -27,6 +27,6 @@ ext {
// true表示谷歌支付 false
isGooglePlay : false,
//是否上报异常日志
isUploadLog : false
isUploadLog : true
]
}

View File

@@ -1 +1 @@
apply plugin: 'com.android.library'
apply plugin: 'com.android.library'

View File

@@ -150,6 +150,7 @@ public class LiveAudienceActivity extends LiveActivity {
private ImageView voicePress;
private View titleLine;
private boolean liveIndex = true;
private boolean isPk = false;
@Override
public <T extends View> T findViewById(@IdRes int id) {
@@ -411,6 +412,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);
@@ -425,6 +427,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);
@@ -440,6 +443,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);
@@ -673,9 +677,20 @@ 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()) {
LiveBean liveBean = e.getLiveBean();
if (e.isLiveEnd()) {
manager.removeLiveEnd();
@@ -694,9 +709,7 @@ public class LiveAudienceActivity extends LiveActivity {
mAncherIcon = liveBean.getAvatar();
manager.onAdd(liveBean, mLiveType, mLiveTypeVal, mLiveSDK);
}
} else {
verticalViewPager.setEnableScroll(IMLoginManager.get(mContext).isSlide());
}
}
@Override
@@ -867,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() {
@@ -945,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);
@@ -1165,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());
@@ -1220,19 +1244,21 @@ public class LiveAudienceActivity extends LiveActivity {
}
break;
case SOCKET_LIVE_DRPK_SET_PK_VIEW:
ToastUtil.show("setPkView");
if (manager.getmLivePlayViewHolder() != null) {
manager.getmLivePlayViewHolder().setPkview();
}
break;
case SOCKET_LIVE_DRPK_SET_PK_END_VIEW:
ToastUtil.show("setPkEndview");
if (manager.getmLivePlayViewHolder() != null) {
manager.getmLivePlayViewHolder().setPkEndview();
}
break;
case LEAVE_PK_SCORE:
if (manager != null) {
manager.upDataPkScore(event.getPkScores(), event.getTime());
}
break;
case PK_TIME_COUNT:
if (manager != null) {
manager.endDRGif();

View File

@@ -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,16 +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;
@@ -51,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;
@@ -58,21 +63,19 @@ 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;
import com.yunbao.common.views.LiveRobotSettingCustomPopup;
import com.yunbao.faceunity.FaceManager;
import com.yunbao.live.R;
import com.yunbao.live.bean.LiveGuardInfo;
import com.yunbao.live.bean.LiveKsyConfigBean;
import com.yunbao.live.bean.LiveReceiveGiftBean;
import com.yunbao.live.dialog.FreePkDialogFragment;
import com.yunbao.live.dialog.LiveLinkMicListDialogFragment;
import com.yunbao.live.dialog.LiveNewFunctionDialogFragment;
import com.yunbao.live.dialog.LiveNewWishListDialogFragment;
import com.yunbao.live.dialog.LivePrankDialogFragment;
@@ -98,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;
@@ -154,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) {
@@ -198,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<String, StatusBean> 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);
@@ -281,6 +312,57 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl
@Override
public void onClick(int functionID) {
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;
case Constants.LIVE_FUNC_ZG://zg
// ToastUtil.show("開發中,敬請期待");
LivePrankDialogFragment fragment = new LivePrankDialogFragment();
@@ -320,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)
@@ -340,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
@@ -668,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返回的数据
@@ -768,6 +841,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl
if (CommonAppConfig.GAME_ENABLE) {
mGameList = JSON.parseArray(obj.getString("game_switch"), Integer.class);
}
getAiRobotStatus();
}
/**
@@ -780,6 +854,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl
PKing = false;
isDRPK = 0;
endLive();
RandomPkManager.getInstance().release();
}
});
}
@@ -855,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");
@@ -1484,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();
@@ -1495,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;
}
}
@@ -1521,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<LiveAiRobotBean>() {
@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<List<LiveAiRobotBean.Message>>() {
@Override
public void onSuccess(List<LiveAiRobotBean.Message> 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);
}
}

View File

@@ -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) {

View File

@@ -115,7 +115,7 @@ public class FreePkRecyclerAdapter extends RefreshAdapter<RandomPkUserBean> {
}
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() {

View File

@@ -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;
@@ -12,9 +13,12 @@ import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
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;
@@ -63,8 +67,10 @@ public class LiveChatAdapter extends RecyclerView.Adapter {
private LinearLayoutManager mLayoutManager;
private IMLoginModel model;
private int mRecyclerViewScrolledDy;
private int mPosition;
private boolean isBottom = false;
public LiveChatAdapter(Context context) {
mContext = context;
@@ -121,6 +127,30 @@ public class LiveChatAdapter extends RecyclerView.Adapter {
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
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;
}
}
});
}
class RedPackVh extends RecyclerView.ViewHolder {
@@ -349,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);
@@ -364,24 +402,33 @@ 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()+" size = "+(mList.size()+1));
int size = mList.size();
//设置最大展示99条消息
if (size == 100) {
mList.remove(0);
if (size >= 100 && (isBottom || mRecyclerViewScrolledDy == 0)) {
mList.subList(0, 50).clear();
notifyItemRangeRemoved(0, 50);
}
mList.add(bean);
if (isSlideToBottom(mRecyclerView)) {
scrollToBottom(mRecyclerView);
if (getItemCount() == 1) {
notifyDataSetChanged();
} else {
notifyItemInserted(getItemCount());
}
// size = mList.size();
if (isBottom || mRecyclerViewScrolledDy == 0) {
scrollToBottom();
} else {
Bus.get().post(new LiveAudienceEvent()
.setType(LiveAudienceEvent.LiveAudienceType.NEW_MESSAGE_REMINDER));
@@ -392,10 +439,11 @@ public class LiveChatAdapter extends RecyclerView.Adapter {
mPosition = size;
}
}
notifyDataSetChanged();
}
private void scrollToBottom(final RecyclerView recyclerView) {
// scroll to last item to get the view of last item
final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
@@ -409,6 +457,8 @@ public class LiveChatAdapter extends RecyclerView.Adapter {
});
}
String TAG = "聊天测试";
/**
* 判断是否滚到底部
*
@@ -426,15 +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() {
if (mList.size() > 0) {
mRecyclerView.smoothScrollToPosition(getItemCount() - 1);
}
mRecyclerViewScrolledDy = 0;
}
public void scrollToAt() {

View File

@@ -0,0 +1,40 @@
package com.yunbao.live.adapter;
import android.content.Context;
import android.graphics.PointF;
import android.util.DisplayMetrics;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSmoothScroller;
import androidx.recyclerview.widget.RecyclerView;
public class LiveChatRecyclerViewLayoutManager extends LinearLayoutManager {
private static final float MILLISECONDS_PER_INCH = 150f;
public LiveChatRecyclerViewLayoutManager(Context context) {
super(context);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
// super.smoothScrollToPosition(recyclerView, state, position);
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext())
{
@Nullable
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return LiveChatRecyclerViewLayoutManager.this.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
// System.out.println("----->自定义滑动 = "+MILLISECONDS_PER_INCH+" > "+( MILLISECONDS_PER_INCH / displayMetrics.densityDpi));
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
}

View File

@@ -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;

View File

@@ -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;//幸运天使

View File

@@ -124,7 +124,7 @@ public class LiveFansFragment extends AbsDialogFragment {
ToastUtil.show("退出成功");
dismiss();
} else if (TextUtils.equals(event.getMethod(), "sendFansCard")) {
if (LiveRoomViewHolder.mBtnFollow.getVisibility() == View.VISIBLE) {
if (LiveRoomViewHolder.mBtnFollow != null && LiveRoomViewHolder.mBtnFollow.getVisibility() == View.VISIBLE) {
LiveRoomViewHolder.follow();
}
//点击 开通粉丝勋章,打开礼物列表送礼物

View File

@@ -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);
}
}
/**

Some files were not shown because too many files have changed in this diff Show More