Compare commits

...

1874 Commits

Author SHA1 Message Date
老皮
2113bf7ce1 同步何春辉代码,更改pay_type字段的来源接口 2024-10-14 14:18:34 +08:00
老皮
20b3c421e7 增加链接包显示支付判断 2024-10-14 13:56:23 +08:00
老皮
e50fbefdc1 替换融云IM key 2024-10-14 09:46:08 +08:00
老皮
d79dba045d 修复直播间点击三个点--更多设置--举报闪退的问题(网速慢一点的情况下) 2024-09-23 13:14:08 +08:00
老皮
0646c2c6a7 优化为只有从主播PK中跳转直播间失败(被踢过)才不再随机匹配直播间了 2024-09-20 13:22:46 +08:00
老皮
58ba80929b 修复:主播PK中,用户点击PK对手头像的方式进入直播间(被踢出过的),提示“已被踢出直播间”,之后会自动进入到别的主播直播间 2024-09-20 10:52:34 +08:00
d63cba7db1 修复开播图片后摄像头卡住问题 2024-09-13 14:26:32 +08:00
a454a97c58 同步主分支代码 2024-09-13 10:37:19 +08:00
18142669586
0937186c93 修改推特登录 2024-09-13 09:56:48 +08:00
11e0d62dde 版本 2024-09-13 09:53:27 +08:00
eb90ae9e03 Merge remote-tracking branch 'origin/v6.8.1' into v6.8.1 2024-09-11 15:34:58 +08:00
ec5f32cf1e 调整三星包支付无法唤起问题(R文件被覆盖) 2024-09-11 15:34:43 +08:00
ec5d4d77db 调整三星包支付无法唤起问题(R文件被覆盖) 2024-09-11 15:34:29 +08:00
0c74d81cc6 调整三星包支付无法唤起问题(R文件被覆盖) 2024-09-11 15:23:01 +08:00
18142669586
8e860b80d4 修改三星支付回调 2024-09-11 14:41:22 +08:00
61b1101c3f 681终版 2024-08-24 14:19:17 +08:00
daf881f6a7 调整代码中包名获取方式
681送审版本
2024-08-22 10:04:55 +08:00
38f3b721e0 v681内部提测版本 2024-08-21 17:04:50 +08:00
04ae7eeacc Merge branch 'refs/heads/v681小游戏' 2024-08-21 10:43:27 +08:00
d863c0af5a update 2024-08-21 10:33:25 +08:00
99c1037a15 修复测试反馈问题 2024-08-20 18:19:31 +08:00
18142669586
3440b71229 修改包名 2024-08-20 18:11:31 +08:00
50686957dc update 2024-08-20 16:12:02 +08:00
18142669586
214e6f5d89 修改包名 2024-08-20 16:10:24 +08:00
2d9e1cd685 update风格化打包 2024-08-20 15:18:54 +08:00
60485deed5 fix修复测试反馈问题 2024-08-20 15:01:19 +08:00
7196ebd16e update 更新flavorDimensions配置和风格化google-services.json 2024-08-20 13:18:26 +08:00
6eee7b9ede update 2024-08-20 10:02:38 +08:00
e0405e9c13 修复测试反馈内容 2024-08-19 14:56:12 +08:00
e8e0fc32f9 修复测试反馈内容 2024-08-19 11:22:04 +08:00
3d4ad99c99 Merge branch 'refs/heads/master' into v681小游戏
# Conflicts:
#	live/src/main/java/com/yunbao/live/activity/SystemMessageActivity.java
#	main/src/main/java/com/yunbao/main/activity/MainActivity.java
2024-08-16 14:36:44 +08:00
a25e22b142 update 临时隐藏处罚通知入口 2024-08-16 14:33:57 +08:00
3aeabfa32b 修改更新版本:1、改成以服务形式下载。2、新增断点续传功能。3、新增下载后检查apk完整性。
修改主播设置联系方式接口地址
2024-08-16 14:22:58 +08:00
47da21351e update 版本 2024-08-15 17:31:39 +08:00
451a875526 Merge branch 'refs/heads/master' into v681小游戏
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
2024-08-14 15:59:11 +08:00
dc7b987eda 小游戏提测版本 2024-08-13 10:15:11 +08:00
fe28d3508b 新增小游戏相关内容 2024-08-09 14:06:46 +08:00
gongduoxiang
cb87974320 处罚通知,修改网络请求和activity跳转代码 2024-08-07 10:46:21 +08:00
gongduoxiang
dbd684a6e2 增加处罚通知功能 2024-08-06 16:29:15 +08:00
abc37aa486 调整测试反馈内容:【从用户的个人信息界面进入全站展馆本期角逐页面,查看周星礼物应该调用 Gift.liveGiftHallDetail】
调整测试反馈内容:【从banner进周星榜 退出 一直显示加载中怎么回事】
调整测试反馈内容:【包裹冠名礼物送出id丢失】
2024-08-06 10:40:39 +08:00
3349b2d7df fix 图片资源中英文 2024-08-05 17:26:52 +08:00
97d636ddec 更新版本号 2024-08-05 13:13:55 +08:00
3b8aedaa17 调整SVGA播放工具 2024-08-02 16:23:42 +08:00
40ba4b8aa8 修复开播通知可能出现两天的情况
修复svga可能只播放一次的情况
2024-08-02 14:49:28 +08:00
f7db0b0768 修复打开直播间信件箱闪退问题 2024-08-02 09:44:05 +08:00
ed642f0137 Merge branch 'refs/heads/master' into dev_680_礼物展馆
# Conflicts:
#	gradle.properties
2024-07-31 15:55:39 +08:00
d1512bc256 调整三星包 2024-07-31 13:45:41 +08:00
9f90040168 修复测试反馈内容 2024-07-30 16:47:47 +08:00
9ae6fedd8d 修复测试反馈内容
新增临时需求:banner点进礼物墙
新增临时需求:主播下播后显示违规内容(未接入接口)
合并潘多拉修复问题
2024-07-30 10:29:34 +08:00
516a068c25 修复游戏SDK在Android14时无法加载的问题 2024-07-29 11:04:47 +08:00
63b7a18c0b 修复语言问题 2024-07-29 10:21:06 +08:00
余前卫
6af48002bb 6.8.0:天梯赛数据不显示bug修复 2024-07-27 15:15:37 +08:00
79c730c1b7 fix PK邀请问题:A邀请B,B邀请C,C同意B,B同意A,会都加入到PK中 2024-07-25 15:36:11 +08:00
c20a9804e9 修复测试反馈内容 2024-07-25 15:00:05 +08:00
Martin
96a6b05d03 修改佩戴勋章接口 2024-07-19 15:44:06 +08:00
ba8090eec7 Merge remote-tracking branch 'origin/dev_680_礼物展馆' into dev_680_礼物展馆 2024-07-19 09:27:12 +08:00
e1fd4949b5 update 2024-07-19 09:27:00 +08:00
Martin
08c46a7684 礼物墙-修复bug 2024-07-18 18:28:15 +08:00
gongduoxiang
3a12d848e1 Merge remote-tracking branch 'origin/master' 2024-07-18 18:20:53 +08:00
gongduoxiang
cf245b0df8 有些本地的东西不去提交 2024-07-18 18:19:08 +08:00
1cde41f2d0 fix 测试反馈内容 2024-07-18 18:16:34 +08:00
092d4cb914 调整礼物墙部分文案 2024-07-18 17:51:51 +08:00
余前卫
0ea92c00a2 6.8.0:小游戏结算界面,观众视角修改 2024-07-18 17:31:44 +08:00
21ae621343 fix 修复礼物墙测试问题 2024-07-18 16:55:36 +08:00
048c66736f fix 修复礼物墙测试问题 2024-07-18 16:39:06 +08:00
d3055d8fb2 fix 修复礼物墙测试问题 2024-07-18 13:25:42 +08:00
Martin
b9164b6a08 礼物墙
第三方登录-新增校验
2024-07-18 13:19:30 +08:00
Martin
67e5e4e02f 直播间礼物列表-冠名字段修改 2024-07-17 16:14:35 +08:00
Martin
2351618e5a 拒绝随机PK提示英化 2024-07-17 13:26:07 +08:00
Martin
b2e2ca7303 Merge remote-tracking branch 'origin/dev_680_礼物展馆' into dev_680_礼物展馆 2024-07-17 12:12:35 +08:00
714e51b621 update 2024-07-17 12:12:14 +08:00
efa4c25c4b update 2024-07-17 12:11:41 +08:00
Martin
854cad8ec6 Merge remote-tracking branch 'origin/dev_680_礼物展馆' into dev_680_礼物展馆 2024-07-17 11:07:20 +08:00
46fba9429d update 2024-07-17 11:06:52 +08:00
c67ed4b736 Merge branch 'refs/heads/master' into dev_680_礼物展馆 2024-07-17 10:55:38 +08:00
Martin
4a91aafb4b Merge branch 'master' into dev_680_礼物展馆 2024-07-17 10:54:41 +08:00
18142669586
a0f3f246a6 补充jar 2024-07-17 10:53:43 +08:00
Martin
2b20782def 修改配置文件 2024-07-17 10:18:41 +08:00
Martin
152848a04f Merge branch 'master' into dev_680_礼物展馆
# Conflicts:
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	gradle.properties
#	live/build.gradle
2024-07-17 09:53:22 +08:00
Martin
fe827482c9 游戏房上麦 2024-07-17 09:47:38 +08:00
7fc1c2e712 update 礼物墙 2024-07-16 17:24:42 +08:00
7a6dfe5a3d update 礼物墙 2024-07-16 16:39:30 +08:00
Martin
96c45820b0 荣誉成就 2024-07-16 16:11:27 +08:00
ac18150503 update 礼物墙 2024-07-16 11:15:12 +08:00
Martin
22b208bcd9 新增直播间冠名礼物特效 2024-07-16 10:31:18 +08:00
Martin
484069dac7 冠名礼物 2024-07-15 10:13:36 +08:00
ade837e85c update 礼物墙 调整间距 2024-07-15 10:06:06 +08:00
12a1f24101 update 礼物墙 布局 2024-07-15 09:47:12 +08:00
250d4832a3 update 礼物墙 布局文件 2024-07-13 21:45:10 +08:00
Martin
93db808f8b 佈局 2024-07-13 17:49:07 +08:00
Martin
59f0fa4acb 佈局 2024-07-13 17:02:59 +08:00
8fe6130c81 update 礼物墙 2024-07-13 16:51:37 +08:00
18142669586
a11d7f07e9 开播im未初始化 会在初始化一次。 2024-07-13 11:26:24 +08:00
18142669586
90bc70ebf7 Merge remote-tracking branch 'origin/master' 2024-07-13 10:38:03 +08:00
18142669586
4618c0a4f1 升级34 grd8.0 2024-07-13 10:37:37 +08:00
9292e6f5c5 Merge remote-tracking branch 'origin/dev_680_礼物展馆' into dev_680_礼物展馆
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
2024-07-13 09:29:11 +08:00
845b217c4d 新增礼物墙相关内容 2024-07-13 09:28:02 +08:00
Martin
7edd75e223 礼物墙功能 2024-07-13 09:27:11 +08:00
Martin
15a52aaa62 1、开通守护,im消息优化
2、游戏房安全区域优化
3、举报接口新增字段区分
2024-07-11 13:07:17 +08:00
余前卫
6d6010d023 Merge branch 'master' of https://gitee.com/xxkp/pdlivexp
# Conflicts:
#	app/build.gradle
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values/strings.xml
2024-07-10 10:53:01 +08:00
Martin
94156e2984 Merge branch '直播间提示优化'
# Conflicts:
#	config.gradle
2024-07-09 13:49:31 +08:00
Martin
769f527565 1、開通守護-使用優惠券
2、开通贵族,在当前直播间有围观按钮问题
2024-07-09 13:08:33 +08:00
Martin
eb9f615f70 将支付相关的异常抛出,改为异常输出 2024-07-09 11:11:05 +08:00
Martin
3dcc801331 1、開通守護-使用優惠券 2024-07-05 13:58:35 +08:00
Martin
963fe2c110 1、好友邀请守护内容修改 2024-07-04 17:59:56 +08:00
9c38f40098 调整礼物墙tab 2024-07-04 15:02:41 +08:00
8cae89e7cd 新增礼物墙弹窗主题 2024-07-04 13:41:37 +08:00
Martin
9dd3619049 1、全服通知,新增【围观】按钮显示判断逻辑 2024-07-04 13:16:48 +08:00
Martin
96b80a460b 1、游戏房,游戏操作区域距离顶部问题
2、直播间红包、神龙位置问题
2024-07-03 18:24:14 +08:00
Martin
a68bee94a9 直播间侧边栏美化 2024-07-03 15:21:32 +08:00
Martin
40a2843696 守护榜页面需美化 2024-07-03 11:21:25 +08:00
2cefd50ac3 配合H5调整部分webView页面 2024-07-02 18:06:56 +08:00
Martin
833b58d311 1、游戏房间界面需美化 2024-07-02 14:40:36 +08:00
Martin
f14fb4612b 1、直播间-互动游戏角标优化 2024-07-01 16:55:46 +08:00
3510a565f2 调整HTTP日志输出 2024-07-01 09:57:39 +08:00
e0669e98cf 新增上报日志功能 2024-06-29 10:11:42 +08:00
Martin
8f82c7c785 1.直播间游戏提示优化
2.战令经验值购买优化
2024-06-28 17:52:41 +08:00
余前卫
2eea1f1b75 6.8.0:谷歌内购版本升级,小游戏结算界面优化 2024-06-27 18:30:51 +08:00
f1a1aae787 优化打包脚本,兼容低版本AndroidStudio使用 2024-06-27 14:28:33 +08:00
Martin
b68c7f1c46 1.守护榜页面需美化
2.直播间功能栏美化
3.游戏房间界面需美化
2024-06-26 17:27:29 +08:00
Martin
dd7eb2326a [优化]:
1.直播间游戏提示优化
2.战令经验值购买优化
3.守护榜页面需美化
2024-06-25 16:52:09 +08:00
3f1fe93f3d Merge remote-tracking branch 'origin/master' 2024-06-20 17:03:38 +08:00
Martin
8c9cf4e3a8 [修复首页English分类下,下拉刷新没有数据问题] 2024-06-20 17:00:49 +08:00
0451f518d5 移除调试权限 2024-06-20 14:02:42 +08:00
a154f480f6 增强配置化打包程序,可有效防止手动打包配置错误 2024-06-20 14:02:15 +08:00
Martin
29badbf725 fix[修復小窗播放白屏問題] 2024-06-19 14:47:53 +08:00
Martin
e89f22329f Merge branch 'dev_6.7.0' 2024-06-19 11:13:16 +08:00
Martin
81e08d41af FIX[修复BUG] 2024-06-18 18:42:26 +08:00
d89b356395 修复PK时整蛊观众端联系方式会闪动问题 2024-06-18 18:22:06 +08:00
4d2985456d 修复整蛊设置连击数有xN的字符 2024-06-18 17:56:55 +08:00
48e3ff46ab 修复安卓用户主播关播后在关播顶面显示主播最后一真画面。
修复安卓主播关播后还在一直推流。
2024-06-18 17:39:05 +08:00
Martin
6dd3e02c1d add[新增添加整蠱禮物提示] 2024-06-18 16:31:13 +08:00
d8e9cc2189 调整进游戏房就关掉小窗 2024-06-18 15:09:18 +08:00
Martin
0310628ba3 Merge branch 'master' into dev_6.7.0 2024-06-18 14:48:28 +08:00
2f54fdab12 调整进游戏房就关掉小窗 2024-06-18 14:44:12 +08:00
Martin
a3228f48c2 add[修復BUG] 2024-06-18 13:50:21 +08:00
余前卫
35c83a255a 6.7.0用户端更新:列表和缩小图标同时出现bug 2024-06-18 10:15:34 +08:00
Martin
0aeb2d32c2 add[修復BUG] 2024-06-17 17:21:18 +08:00
Martin
313320473f add[修復BUG] 2024-06-17 15:35:58 +08:00
Martin
2b86927b5b Merge remote-tracking branch 'origin/dev_6.7.0' into dev_6.7.0 2024-06-17 11:02:17 +08:00
余前卫
bf3ebfedbd 6.7.0用户端更新: 2024-06-17 10:59:47 +08:00
Martin
1a2db91ceb Merge branch 'master' into dev_6.7.0 2024-06-17 10:55:47 +08:00
Martin
9fa4924278 add[修復BUG] 2024-06-16 16:26:01 +08:00
Martin
3318fa761c add[合併聲網] 2024-06-16 13:41:19 +08:00
a7421ba1a6 修复暂时离开功能无效问题
调整购买守护的动画效果
2024-06-16 11:09:10 +08:00
Martin
40a081caa6 Merge remote-tracking branch 'origin/dev_6.7.0' into dev_6.7.0 2024-06-16 10:48:45 +08:00
余前卫
1485173227 6.7.0用户端更新:整蛊图标闪烁 2024-06-16 10:45:44 +08:00
Martin
d5b60523a5 Merge remote-tracking branch 'origin/master' into dev_6.7.0
# Conflicts:
#	app/src/main/AndroidManifest.xml
#	app/src/main/java/com/shayu/phonelive/AppContext.java
#	common/src/main/java/com/yunbao/common/CommonAppConfig.java
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	common/src/main/java/com/yunbao/common/manager/OpenAdManager.java
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	live/src/main/java/com/yunbao/live/utils/LiveTextRender.java
#	live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java
#	live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java
2024-06-16 10:28:31 +08:00
余前卫
309d04653e 6.7.0用户端更新:整蛊图标闪烁 2024-06-14 18:15:22 +08:00
Martin
45ae3b1624 add[轮盘整蛊] 2024-06-14 17:39:42 +08:00
Martin
e874c2ee16 add[修復BUG,新增整蛊IM消息类型] 2024-06-14 15:40:51 +08:00
余前卫
002f0ad654 Merge remote-tracking branch 'origin/dev_6.7.0' into dev_6.7.0 2024-06-14 14:40:51 +08:00
余前卫
bb49472817 6.7.0用户端更新:修复包裹礼物送礼数量不同步问题 2024-06-14 11:33:07 +08:00
Martin
05e4ff89d7 add[修復BUG,新增開播整蠱IM消息] 2024-06-13 18:25:43 +08:00
020b5c1025 同步潘多拉修复代码 2024-06-13 16:06:21 +08:00
余前卫
2cf10cc35a 6.7.0用户端更新:限制举报描述字数 2024-06-13 16:04:58 +08:00
余前卫
4c53c990e9 6.7.0用户端更新:限制举报描述字数 2024-06-13 15:51:27 +08:00
余前卫
cd8b58a0ec 6.7.0用户端更新:更改数据类型 2024-06-13 09:55:15 +08:00
b41bd3b89b 修复:
1:开播闪屏问题
2:游戏房消息重复(或不显示)
3:模拟器或部分机型滑动声网直播间会白屏问题
4:PK条在平板模式下显示太高问题
5:PK没断开能收到其他人邀请的问题
2024-06-13 09:47:38 +08:00
余前卫
d66f098692 Merge remote-tracking branch 'origin/dev_6.7.0' into dev_6.7.0 2024-06-12 16:45:16 +08:00
Martin
f131fcf546 add[主播端,整蛊礼物,待完成项完成] 2024-06-12 16:44:46 +08:00
余前卫
eeb1cc008a 6.7.0用户端更新:修复空指针 2024-06-12 16:42:27 +08:00
6eba9558e1 修复userlist可能为空的问题 2024-06-11 17:03:13 +08:00
Martin
0425b56106 add[整蛊翻译] 2024-06-11 16:55:07 +08:00
余前卫
c5de062171 6.7.0用户端更新:屏蔽空数据 2024-06-11 14:23:39 +08:00
余前卫
f82dbccaa5 6.7.0用户端更新:更改数据类型 2024-06-11 14:18:55 +08:00
07d6b959d5 Merge branch 'master' into 声网升级
# Conflicts:
#	config.gradle
#	live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java
2024-06-11 14:16:00 +08:00
5ae55f87fa 修复声网直播间会白屏问题
调整模块间的引用
2024-06-11 14:08:45 +08:00
余前卫
f59e5e527a 6.7.0用户端更新 2024-06-11 09:40:24 +08:00
d70c3a8b27 修复游戏房发言重复/不显示问题
修复贵族不显示英文问题
2024-06-07 16:53:48 +08:00
余前卫
c20147bf8f Merge branch 'yuqianwei' into dev_6.7.0
# Conflicts:
#	live/src/main/res/values/strings.xml
2024-06-07 15:46:53 +08:00
余前卫
45743e3070 6.7.0用户端更新 2024-06-07 15:35:57 +08:00
余前卫
b8b43c1ef2 6.7.0用户端更新 2024-06-07 15:35:34 +08:00
73847c46a3 修复游戏房发言重复/不显示问题
修复贵族不显示英文问题
2024-06-07 14:50:39 +08:00
Martin
b7c53a3b21 add[整蛊礼物接口调用、整蛊说明] 2024-06-06 18:29:31 +08:00
c91947ce71 配置化声网AppId 2024-06-05 16:37:24 +08:00
Martin
62e50ae310 fix[声网APPId] 2024-06-05 16:06:04 +08:00
Martin
5baea0f156 fix[修复-游戏房消息问题] 2024-06-05 15:12:35 +08:00
Martin
419e3a7ab5 fix[修复BUG] 2024-06-05 13:27:22 +08:00
Martin
66822139ba fix[更新弹幕] 2024-06-05 09:52:37 +08:00
Martin
5a924d9fea fix[修复BUG] 2024-06-05 09:50:57 +08:00
cb0772c9e3 update 更新弹幕 2024-06-05 09:48:22 +08:00
Martin
9c9eb34756 fix[修复BUG-主播开麦按钮的字未显示全] 2024-06-04 09:50:46 +08:00
Martin
1b57d8bc8f fix[修复BUG] 2024-06-03 15:41:29 +08:00
edc738d80b 修复一堆图标+10字名字聊天框没有图标问题 2024-06-03 15:02:03 +08:00
b5417f90b4 调整弹窗 2024-06-03 09:41:51 +08:00
Martin
4bd1e4bc91 fix[修复融云直播间,多人PK主播信息问题] 2024-06-02 16:57:48 +08:00
18142669586
cb2729433e 修改上下滑动黑 2024-06-02 14:44:36 +08:00
Martin
985e626cb5 fix[修复融云直播间,上下滑动闪退问题] 2024-06-01 17:31:01 +08:00
Martin
efce2ad93c fix[声望升级-设置竖屏] 2024-06-01 15:21:23 +08:00
Martin
6132338c6c fix[声望升级-同步弹窗功能] 2024-06-01 14:33:27 +08:00
Martin
8c89fc1de1 Merge remote-tracking branch 'origin/声网升级' into 声网升级 2024-06-01 14:24:19 +08:00
Martin
a061637492 fix[声望升级-去掉多人PK,展示主播信息延迟代码] 2024-06-01 14:24:10 +08:00
98095e07ee 调整弹窗 2024-06-01 14:00:48 +08:00
9764b3370e 调整弹窗 2024-06-01 13:13:33 +08:00
18142669586
bbb5a12899 Merge remote-tracking branch 'origin/声网升级' into 声网升级 2024-06-01 12:08:08 +08:00
18142669586
680780145c 修改多人图标闪 2024-06-01 12:07:36 +08:00
Martin
19c270ad22 fix[声望升级-秒开] 2024-06-01 11:16:26 +08:00
18142669586
ce9336737f 新增声网正式服环境 2024-06-01 11:07:00 +08:00
0396e2d06d 调整弹窗 2024-06-01 11:06:40 +08:00
Martin
39cf76439f fix[声望升级-APPID 更换存储位置] 2024-06-01 10:32:32 +08:00
Martin
11c9a53028 fix[声望升级-修复BUG] 2024-06-01 10:16:31 +08:00
Martin
c4d378daba fix[声望升级-修复BUG] 2024-05-31 20:59:16 +08:00
18142669586
efa698ebfa 1 2024-05-31 20:55:09 +08:00
18142669586
6496440e5d 修改9发两次 2024-05-31 20:00:04 +08:00
18142669586
d3de01666c 修改上下滑动黑 2024-05-31 19:01:41 +08:00
9621d8a6d8 Merge remote-tracking branch 'origin/声网升级' into 声网升级 2024-05-31 18:01:36 +08:00
07f97fefdb 降低声网SDK版本,处理雷电模拟器闪退问题 2024-05-31 18:01:22 +08:00
186b9d61ee 調整主播端設置整蠱UI 2024-05-31 15:06:35 +08:00
b7c0f5d3ec 调整战令图标改为通过接口获取 2024-05-31 10:31:14 +08:00
949c0ab759 调整弹窗、签到弹窗、更新弹窗优先级 2024-05-31 10:31:14 +08:00
Martin
278801b77a fix[声望升级-修复BUG] 2024-05-30 18:25:01 +08:00
5f3ebb4235 修复直播间 用户等级+超皇+粉丝牌+图标+名字(10字)会丢失名字前面图标的问题 2024-05-30 15:52:34 +08:00
ab24348f72 调整弹窗展示逻辑 2024-05-30 15:14:52 +08:00
022806d9da 修复直播间 用户等级+超皇+粉丝牌+图标+名字(10字)会丢失名字前面图标的问题 2024-05-30 15:14:00 +08:00
Martin
b0c5d44d1c fix[声望升级-修复BUG] 2024-05-30 13:20:40 +08:00
Martin
d9b1149832 fix[声望升级-修复BUG] 2024-05-29 21:24:05 +08:00
Martin
9711b1f8d4 fix[声望升级-修复BUG] 2024-05-28 21:28:20 +08:00
Martin
0252963b2e Merge remote-tracking branch 'origin/声网升级' into 声网升级
# Conflicts:
#	live/src/main/java/com/yunbao/live/presenter/LiveSwLinkMicPkPresenter.java
2024-05-28 17:13:59 +08:00
Martin
ff8e75768e fix[声望升级-修复BUG] 2024-05-28 17:12:52 +08:00
c92e8dd8bc 调整弹窗逻辑 2024-05-28 17:12:38 +08:00
18142669586
01dfb81a46 点击【邀请】加上防抖的功能 2024-05-28 16:58:39 +08:00
18142669586
0afee3543e 邀请后不接受倒计时完了在邀请 不显示pk弹出框 2024-05-28 15:20:43 +08:00
8d5990c25b 调整弹窗逻辑 2024-05-28 15:02:15 +08:00
18142669586
d5f78cc83a 修改pk列表按钮错误 2024-05-28 14:26:29 +08:00
Martin
cf48be7d15 fix[声望升级-修复BUG] 2024-05-28 13:44:44 +08:00
225929c891 新增【全服公告优化】 2024-05-27 14:03:20 +08:00
bc63a3e601 新增【全服公告优化】 2024-05-27 13:48:52 +08:00
c33975fe67 优化首页右下角悬浮层隐藏显示问题
调整直播间购买推荐的UI显示不合设计问题
2024-05-24 15:45:06 +08:00
c033340aad 优化首页右下角悬浮层隐藏显示问题 2024-05-24 14:49:14 +08:00
24170d55e2 调整进入直播间等待时长15→4 2024-05-23 12:53:07 +08:00
Martin
26a71ff825 fix[声望升级-修复BUG] 2024-05-22 18:29:11 +08:00
e36fbdc6b8 调整【我的】个性签名中英文判断 2024-05-22 13:49:06 +08:00
Martin
b6d0ea1fba fix[声望升级-合并] 2024-05-22 13:46:52 +08:00
Martin
cbf517bed6 Merge branch 'master' into 声网升级
# Conflicts:
#	common/src/main/java/com/yunbao/common/event/SendBlindGiftEvent.java
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	common/src/main/java/com/yunbao/common/utils/DialogUitl.java
#	common/src/main/java/com/yunbao/common/utils/RouteUtil.java
#	live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java
#	live/src/main/java/com/yunbao/live/socket/SocketRyLinkMicPkUtil.java
#	main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java
2024-05-22 13:37:33 +08:00
Martin
dc0ae1124f add[声望升级-游戏房判断声网或者融云] 2024-05-22 13:32:05 +08:00
Martin
3167ab0be8 add[声望升级-游戏房判断声网或者融云] 2024-05-20 16:18:16 +08:00
Martin
0b218157d2 add[声望升级-AB面] 2024-05-18 18:27:38 +08:00
Martin
6a4ac35203 add[声望升级-AB面] 2024-05-18 14:36:35 +08:00
Martin
93dbee14b3 add[声望升级-修复BUG] 2024-05-15 15:55:31 +08:00
Martin
cb376aa83a add[声望升级-修复BUG] 2024-05-14 18:29:28 +08:00
92d1861d8f 调整回#1eb43fb8逻辑,不管单人还是多人PK都显示排位赛信息 2024-05-14 18:07:37 +08:00
0ff0cb52f6 修复主页战令悬浮问题
调整获取验证码接口设置语言
2024-05-14 17:16:28 +08:00
Martin
afef088555 add[声望升级-自動PK,直接PK] 2024-05-13 17:31:55 +08:00
Martin
73414f3349 add[声望升级-自動PK,直接PK] 2024-05-11 18:29:46 +08:00
Martin
abfd15f751 add[声望升级-小游戏多人连麦] 2024-05-09 16:01:39 +08:00
8d87dda691 修复33000问题 2024-05-09 14:07:37 +08:00
fcd13751c9 Merge remote-tracking branch 'origin/dev_6.6.8' into dev_6.6.8 2024-05-08 11:35:30 +08:00
e24805cf9b 移除友盟SDK 2024-05-08 11:34:56 +08:00
489a99e522 移除友盟SDK 2024-05-08 11:34:41 +08:00
6a51b39134 移除友盟SDK 2024-05-08 11:34:07 +08:00
86bbf6a7f3 更新小游戏混淆列表 2024-05-08 10:49:07 +08:00
Martin
95ded2f77c add[声望升级-多人PK] 2024-05-08 10:00:00 +08:00
599e88acc6 替换友盟为本地aar
调整小游戏为繁体中文
2024-05-08 09:52:35 +08:00
Martin
d78055cdd9 add[声望升级-多人PK] 2024-05-06 08:51:18 +08:00
2093306d36 修复测试反馈问题
调整小助手、机器人图标
调整PD一号的IM消息
调整PD一号的红包UI
调整翻译
2024-05-05 16:13:28 +08:00
Martin
b4adf4c77c add[声望升级-多人PK] 2024-04-30 18:29:09 +08:00
8e2acc3417 Merge branch 'master' into dev_6.6.8 2024-04-29 11:30:25 +08:00
d28d0dd3d7 修复测试反馈问题 2024-04-29 11:02:23 +08:00
Martin
7d46ab8520 add[声望升级-多人PK] 2024-04-29 09:30:04 +08:00
150bdba795 完成小游戏直播间半屏内容 2024-04-26 18:04:16 +08:00
651fe12edd 新增小助手中英文图标判定
新增消息页图标中英文判定
2024-04-26 14:47:58 +08:00
d0c0f8f82e 新增戰令一鍵領取按鈕 2024-04-26 11:11:48 +08:00
1f12187766 根据测试反馈修改帮助反馈问题
新增小游戏跳一跳回血和必中的回调
新增关闭发红包页面后自动打开礼物栏的功能
调整小游戏跳一跳回调防抖
2024-04-26 10:08:19 +08:00
18401019693
754f2a9294 修改问题全服跳转直播间问题 2024-04-25 15:32:38 +08:00
Martin
9320d6c209 add[声望升级-单人pk,进入直播间逻辑,单人PK逻辑] 2024-04-25 14:13:25 +08:00
1c9493d7c8 修改帮助反馈的UI 2024-04-24 18:00:46 +08:00
34e4765e13 修改帮助反馈的UI 2024-04-24 17:48:21 +08:00
d4d191fad6 新增帮助与反馈功能 2024-04-24 16:26:47 +08:00
Martin
8228c45a4d add[声望升级-多人PK] 2024-04-22 18:28:01 +08:00
Martin
4147e3c5f5 add[声望升级-多人PK] 2024-04-19 18:27:56 +08:00
Martin
583740e866 add[声望升级-接入美颜] 2024-04-18 09:47:38 +08:00
Martin
0db8eefbe6 add[声望升级] 2024-04-13 18:19:14 +08:00
Martin
3f68e2a3aa add[声望升级] 2024-04-12 18:29:26 +08:00
18401019693
11ba2c45f8 修改问题 2024-04-12 14:14:16 +08:00
18401019693
320584769d 修改问题 2024-04-11 16:32:21 +08:00
Martin
5922f4c08b add[声望升级] 2024-04-10 18:31:00 +08:00
18401019693
b29b0a1688 修改问题 2024-04-10 13:31:40 +08:00
18401019693
f88356cea2 修改问题 2024-04-10 10:31:21 +08:00
18401019693
2a67cf7228 修改问题 2024-04-10 09:51:28 +08:00
18401019693
a100ab1a4a 修改问题 2024-04-09 13:04:42 +08:00
18401019693
69b45f1d21 修改问题 2024-04-08 14:43:27 +08:00
18401019693
479a743d29 替换声网的RTC库 2024-04-08 14:04:15 +08:00
18401019693
382c53ab1f Merge remote-tracking branch 'origin/master' 2024-04-08 13:12:33 +08:00
18401019693
1c22f5fd48 修改守护购买页过期用户购买逻辑 2024-04-08 13:12:23 +08:00
hch
09bef7afa6 add [新增短剧埋点] 2024-04-08 13:08:56 +08:00
18401019693
88b96267ef 修改守护购买页过期用户购买逻辑 2024-04-08 10:01:42 +08:00
18401019693
7c006e8e03 修改守护榜位置信息 2024-04-07 17:21:17 +08:00
18401019693
f35b547c0d 自测修复,全服添加主播端 2024-04-07 15:32:42 +08:00
18401019693
490c558e03 自测修复,全服添加主播端 2024-04-07 14:39:48 +08:00
18401019693
bbf5d159b4 自测修复,全服添加主播端 2024-04-07 14:15:41 +08:00
hch
e982994ecd add [首页新增短剧入口] 2024-04-07 10:54:24 +08:00
hch
a0294a8405 Merge remote-tracking branch 'origin/master' 2024-04-07 10:05:51 +08:00
hch
756cbb1ce1 add [首页新增短剧入口] 2024-04-07 10:05:40 +08:00
9e5427bd35 update 登录接口加中英文标识 2024-04-07 09:54:45 +08:00
18401019693
f626ab03d4 添加短剧签到 2024-04-07 09:40:32 +08:00
18401019693
0d7bdce4f0 修改守护问题,添加全服通知功能 2024-04-03 16:05:53 +08:00
18401019693
cd3feebb94 修改问题 2024-04-01 14:32:46 +08:00
18401019693
3cca1a9e54 Merge remote-tracking branch 'origin/master' 2024-04-01 11:11:06 +08:00
18401019693
0b7b959151 修改问题 2024-04-01 11:10:54 +08:00
1f1ac71bb0 update 客服webview新增isZh判断 2024-04-01 10:56:44 +08:00
18401019693
ce7b6decc1 心愿单 2024-03-29 18:05:01 +08:00
18401019693
4a4a52aa61 修改守护列表页标签展示 2024-03-29 15:16:27 +08:00
18401019693
123b9dd74a Merge branch 'dev_6.6.6_开通守护' 2024-03-28 16:51:13 +08:00
18401019693
28dba93f17 修改守护列表页标签展示 2024-03-28 16:29:02 +08:00
18401019693
285515345b 修改守护列表页标签展示 2024-03-28 10:00:20 +08:00
18401019693
f24744afe8 修改测试问题 2024-03-28 09:50:29 +08:00
18401019693
1e466ac13d Merge branch 'dev_6.6.6_开通守护' 2024-03-27 16:19:31 +08:00
18401019693
d37b490088 修改测试问题,添加代理和vpn检测的开播检测 2024-03-27 16:19:08 +08:00
18401019693
a61bc8fbb8 Merge branch 'dev_6.6.6_开通守护' 2024-03-27 09:44:56 +08:00
9db23a32d1 fix [修复直播数量不足且战令关闭情况下,显示角标Banner白屏问题]
update [替换战令角标]
add [从首页Banner进入战令入口]
add [从弹窗进入战令入口]
2024-03-26 17:37:26 +08:00
18401019693
5f1eadc47b ui修改 2024-03-26 17:27:42 +08:00
18401019693
de11b5123d ui修改 2024-03-26 15:03:08 +08:00
18401019693
5b0f5f03ab 新增主播端 获取活动悬浮窗状态的接口:Live.getAnchorActiveImgStatus,替换原有的接口:Rank.isActivity, 2024-03-25 11:10:46 +08:00
18401019693
6095d2d04a 修改等级领取 2024-03-25 10:34:10 +08:00
18401019693
3953e146a5 修改问题 2024-03-23 17:33:09 +08:00
18401019693
f04a2865af 修改问题 2024-03-23 16:47:28 +08:00
18401019693
f94b3f27e3 守护团新增红点 2024-03-22 14:53:33 +08:00
18401019693
61a966ea41 修改直播间内红包和神龙送财的位置首页的位置 2024-03-22 11:23:30 +08:00
18401019693
d0f2ac2c60 修改测试问题, 2024-03-21 18:37:35 +08:00
18401019693
5dff64ec99 修改测试问题,对接H5页面 2024-03-21 18:13:24 +08:00
18401019693
cad8236e5c 修改测试问题 2024-03-21 17:36:07 +08:00
18401019693
faa401245f 修改测试问题 2024-03-21 15:48:50 +08:00
18401019693
4fc021e866 修改测试问题 2024-03-21 15:28:36 +08:00
18401019693
f9a21d0357 修改测试问题 2024-03-21 15:08:42 +08:00
18401019693
d72a9a39c6 修改测试问题 2024-03-20 16:29:37 +08:00
18401019693
0317b339f8 修改测试问题,新增直播列表页面的神龙送财的图标 2024-03-20 15:19:53 +08:00
18401019693
4fabf3aba3 修改测试问题 2024-03-20 13:40:30 +08:00
18401019693
4693954a72 神龙送财,逻辑修改,由开通接口触发 2024-03-20 10:02:14 +08:00
18401019693
859810f1f6 守护的全服通知,修改测试问题 2024-03-19 15:32:04 +08:00
18401019693
53f389ddc8 守護等級的檢查接口,領取接口。相關頁面的請求添加。h5方法新鄭 2024-03-18 14:52:24 +08:00
18401019693
ddc9bc344e 神龙送财结束Im结束调用接口,神龙列表倒计时修改 2024-03-18 10:24:05 +08:00
18401019693
cf34e73d32 神龙列表接口对接,神龙送财活动参加接口对接,ui更新 2024-03-14 18:21:55 +08:00
18401019693
1981fb553a 神龙列表接口对接,神龙送财活动参加接口对接,ui更新 2024-03-14 16:39:04 +08:00
18401019693
3b6d586b58 神龙送财开启接口。展示直播间神龙送财点击参与的图标 2024-03-14 10:44:40 +08:00
18401019693
50b6deaf01 對接開通接口神龍送財的im消息 2024-03-13 11:18:26 +08:00
18401019693
bc8d916445 神龍送財彈窗頁面。神龍送財規則頁面 2024-03-06 17:18:54 +08:00
18401019693
6870037683 新版守护,空页面,列表页面。守护类型开通页面。开通时间页面 2024-03-06 14:24:04 +08:00
hch
8af7f907eb 守护弹窗 2024-03-04 14:51:07 +08:00
4d96bcc667 Merge remote-tracking branch 'origin/dev_6.6.6_开通守护' into dev_6.6.6_开通守护 2024-02-27 17:38:30 +08:00
f7845dde6f 修复找回密码后无法登陆的问题 2024-02-26 16:04:47 +08:00
ae9ef1f8a1 新增守护测试页面 2024-02-26 14:41:01 +08:00
18401019693
1023c0ab4d 修改直播间发言报错提示 2024-02-23 09:47:49 +08:00
hch
8184cf6c7f 文字漸變色庫 2024-02-22 15:26:21 +08:00
df735af252 新增短剧页面的开播提醒浮窗 2024-02-17 13:43:30 +08:00
hch
6f71a825b5 Merge remote-tracking branch 'origin/master' 2024-02-16 10:34:23 +08:00
hch
08e009e5f9 修复bug上报问题 2024-02-16 10:34:10 +08:00
18401019693
1a4a0632ee Merge remote-tracking branch 'origin/master'
# Conflicts:
#	config.gradle
2024-02-16 10:31:56 +08:00
18401019693
b3a02f8c2c 短剧页面关闭直播小窗 2024-02-16 10:30:35 +08:00
aa9bc7326c 更新版本号 2024-01-31 16:08:30 +08:00
22769b981d 移除埋点空格 2024-01-31 10:25:54 +08:00
hch
85b4facfe8 调整UI 2024-01-26 17:04:11 +08:00
aef0435b93 战令相关UI调整 2024-01-26 16:18:23 +08:00
9cc30186cd 战令相关UI调整 2024-01-26 14:10:54 +08:00
f99641ed35 战令相关UI调整 2024-01-26 13:42:38 +08:00
hch
0552f56eb4 调整UI 2024-01-26 13:06:03 +08:00
18401019693
7ab4081f0b 優化頁面 2024-01-26 10:45:15 +08:00
hch
e7ef492015 调整UI 2024-01-26 10:18:58 +08:00
1aa6cb8f55 修复测试反馈问题 2024-01-25 16:38:44 +08:00
dc87fc7048 修复测试反馈问题 2024-01-25 14:15:46 +08:00
18401019693
04b70d910a 修复游戏房和ios不一样的数据 2024-01-25 13:07:17 +08:00
a4ce44d9ba 提交战令英文版入口图标
修复测试反馈问题
移除测试点
2024-01-25 11:40:13 +08:00
469e3e30ad 调整战令首页入口图片 2024-01-24 18:27:15 +08:00
18401019693
7e7616ef29 Merge remote-tracking branch 'origin/master' 2024-01-24 15:47:31 +08:00
18401019693
dd64568fdf 修复:连送重新选择礼物或者包裹按钮不消失问题 2024-01-24 15:47:19 +08:00
50fb801cf7 新增一个测试点 2024-01-24 14:52:44 +08:00
e0200a9c7f Merge remote-tracking branch 'origin/master' 2024-01-24 14:43:43 +08:00
5a32047c6d 调整客服WebView
新增客服url判断链接
2024-01-24 14:43:31 +08:00
18401019693
45fd56ba66 修复:手机开播邀请多人PK,多人PK一轮结束后,再次多人PK,在直播间的观众无法看到第二轮的PK倒计时 2024-01-24 14:39:00 +08:00
hch
30b2884c46 去掉短剧页面的顶部状态栏,修复闪退bug 2024-01-24 11:41:18 +08:00
0c07e8c2be Merge remote-tracking branch 'origin/master' 2024-01-24 11:30:26 +08:00
18401019693
508e9f1931 修复:手机开播邀请多人PK,多人PK一轮结束后,再次多人PK,在直播间的观众无法看到第二轮的PK倒计时 2024-01-24 11:29:00 +08:00
78d870ed89 update 2024-01-24 10:45:07 +08:00
18401019693
c00afb1db0 优化 2024-01-24 09:53:13 +08:00
18401019693
dfca615735 优化 2024-01-23 17:50:31 +08:00
hch
a920b61bc4 Merge remote-tracking branch 'origin/master' 2024-01-23 17:49:44 +08:00
hch
3effb630c5 去掉短剧页面的顶部状态栏,修复闪退bug 2024-01-23 17:49:37 +08:00
0e596e9be9 修复测试反馈BUG 2024-01-23 17:33:55 +08:00
hch
0a70cc027f 埋点-短剧 2024-01-23 16:09:51 +08:00
47077a465a 修复PK显示问题:【是用户先进 主播后挂断会显示对方信息角标】
调整直播间游戏半屏UI
调整战令UI
2024-01-23 15:28:13 +08:00
hch
aa62dda844 短剧优化 2024-01-23 14:05:33 +08:00
18401019693
004a5b2a53 优化 2024-01-23 11:14:58 +08:00
18401019693
64f9cee3af 优化 2024-01-23 09:50:34 +08:00
1eb43fb8cf 修复PK排位赛信息问题 2024-01-20 15:15:30 +08:00
18401019693
f770370be0 多人pk邀请人数限制 2024-01-20 13:59:27 +08:00
e185eb8612 调整webView
调整客服页面
2024-01-19 11:10:06 +08:00
299add0575 调整webView
调整客服页面
2024-01-19 11:06:35 +08:00
feb08e1759 调整webView
调整客服页面
2024-01-19 10:51:44 +08:00
16755a9c8c 调整webView
调整客服页面
2024-01-19 10:43:40 +08:00
hch
d6e6164549 新增谷歌服务判断 2024-01-19 10:28:46 +08:00
52c561fa08 修改战令入口颜色 2024-01-18 18:22:41 +08:00
c2979b4cf7 修改战令入口颜色 2024-01-18 18:04:07 +08:00
18401019693
0f70f10aed 多人PK结束以后横竖屏修改 2024-01-18 16:50:39 +08:00
45f471055e 調整戰令相關UI 2024-01-18 16:20:55 +08:00
18401019693
c49c9c2f81 Merge remote-tracking branch 'origin/master' 2024-01-18 16:09:45 +08:00
18401019693
74b19de11c 多人PK倒计时bug修改 2024-01-18 16:09:34 +08:00
hch
00b89aab69 合并 2024-01-18 15:15:04 +08:00
hch
6ff6cbbe6b Merge branch 'master' into pdlive_samsung
# Conflicts:
#	config.gradle
#	live/src/main/java/com/yunbao/live/views/SystemMessageViewHolder.java
2024-01-18 14:56:27 +08:00
hch
65d38de73c 修复 点击去支付无反应 问题 2024-01-18 14:48:49 +08:00
18401019693
ae6fdab7e8 多人PK倒计时bug修改 2024-01-18 14:48:29 +08:00
18401019693
3d1c4466e0 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	config.gradle
2024-01-18 13:38:34 +08:00
18401019693
9963b37b6f 多人PK倒计时bug修改 2024-01-18 13:37:49 +08:00
a8a1aa2e71 调整战令奖励列表的渲染
更改战令获取金币接口
2024-01-18 10:57:21 +08:00
2857127285 调整战令页面间距
修复【战令余额不足未跳转充值页面】问题
修复【战令开通等级时弹框金额偶尔不显示问题】
调整战令获取金额接口
调整战令item名字显示模式
调整战令购买经验弹框显示
2024-01-17 16:21:25 +08:00
hch
3a1268aac7 修改UI 2024-01-17 11:26:15 +08:00
hch
5b813aff88 修改UI 2024-01-17 11:12:53 +08:00
18401019693
d9951b5a35 添加了接口控制文字消息和语音的展示 2024-01-15 17:59:18 +08:00
18401019693
f928fce069 Merge remote-tracking branch 'origin/master' 2024-01-15 17:58:53 +08:00
18401019693
d365389ff8 添加了接口控制文字消息和语音的展示 2024-01-15 17:58:47 +08:00
a4e98f3703 调整弹幕统计接口字段 2024-01-15 17:52:53 +08:00
hch
a307e6f864 修复 点击去支付无反应 问题 2024-01-15 17:24:07 +08:00
hch
b5c8f14994 Merge remote-tracking branch 'origin/master' 2024-01-15 17:11:40 +08:00
hch
34323fd983 修复首页直播通行证展示问题 2024-01-15 17:11:24 +08:00
18401019693
1f7c6c8adc 添加了接口控制文字消息和语音的展示 2024-01-15 17:04:36 +08:00
18401019693
29c2334ee0 添加了接口控制文字消息和语音的展示 2024-01-15 16:22:29 +08:00
18401019693
2aa50ecfc7 添加了接口控制文字消息和语音的展示 2024-01-15 16:15:00 +08:00
18401019693
58b2d69601 添加了接口控制文字消息和语音的展示 2024-01-15 14:31:59 +08:00
18401019693
e061e61088 Merge remote-tracking branch 'origin/master' 2024-01-15 13:59:52 +08:00
18401019693
24788d7e21 添加了接口控制文字消息和语音的展示 2024-01-15 13:59:46 +08:00
54693c0d37 修复【升级战令未刷新钻石余额】的问题 2024-01-15 13:33:53 +08:00
hch
27f136d6ca 修复首页直播通行证展示问题 2024-01-15 10:49:23 +08:00
hch
92d271ff93 TopGradual 更改引用 2024-01-15 10:22:08 +08:00
18401019693
0b15df41b8 Merge remote-tracking branch 'origin/语音房_6.6.4_'
# Conflicts:
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
2024-01-15 10:03:00 +08:00
18401019693
f22f8fcb4b 语音房bug修改 2024-01-15 10:01:00 +08:00
hch
7627219e77 新增首页战令入口 2024-01-12 15:33:16 +08:00
18401019693
cf749d85c6 语音房bug修改 2024-01-12 15:16:40 +08:00
hch
ac6eb21e06 Merge remote-tracking branch 'origin/master' into 6.6.4_推送管理
# Conflicts:
#	common/src/main/java/com/yunbao/common/utils/RouteUtil.java
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	config.gradle
2024-01-12 13:52:03 +08:00
18401019693
5ca13b770c 语音房bug修改 2024-01-12 09:34:29 +08:00
7795317c14 修复【直播间信件往下滑,信件界面会显示为空】 2024-01-11 16:10:17 +08:00
18401019693
a036e5eff6 语音房接口添加 2024-01-11 15:15:21 +08:00
c6fb323c68 update 2024-01-11 13:23:20 +08:00
18401019693
926a1a3cb6 语音房添加 2024-01-10 15:48:10 +08:00
d629ee3f9f 修复切到其他页面后短剧不会暂停播放的问题
修复短剧购买卷重复弹出对话框问题
2024-01-09 17:31:13 +08:00
df0d9795ed 调整客服页面返回键交给h5处理(含系统按键/手势)
统一客服页面为同一个WebView
调整短剧与社区使用原生分开加载
调整送礼-包裹接口为新接口
调整粉丝团礼物送礼为新接口
修复战令-兑换-列表页面在名字过长晴空下高度不统一
2024-01-09 16:42:09 +08:00
1759757176 调整客服页面返回键交给h5处理(含系统按键/手势)
统一客服页面为同一个WebView
调整短剧与社区使用原生分开加载
调整送礼-包裹接口为新接口
调整粉丝团礼物送礼为新接口
修复战令-兑换-列表页面在名字过长晴空下高度不统一
2024-01-09 16:37:43 +08:00
hch
661c2fd334 推送管理 2024-01-09 14:52:27 +08:00
b175e42ee1 新增戰令入口
調整戰令UI顯示不全問題
2024-01-05 17:30:11 +08:00
6cdc648ea9 修复战令购买后未刷新UI问题 2024-01-05 16:37:04 +08:00
18401019693
85ccbcccae xiugai问题 2024-01-05 14:44:28 +08:00
0a6b210a76 修复合并重复问题 2024-01-05 14:09:08 +08:00
43d1abbae0 Merge branch 'dev_6.6.4_战令'
# Conflicts:
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	config.gradle
2024-01-05 14:00:39 +08:00
4a5e581978 新增战令购买经验对话框经验条上加入经验文本 2024-01-05 13:57:55 +08:00
8a7b65955c Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2024-01-05 13:57:16 +08:00
18401019693
3445ee2a56 修改信件未读消息请求方式 2024-01-05 13:29:01 +08:00
cf2274195f Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2024-01-04 18:19:23 +08:00
18401019693
aad607ace8 删除老的用户等级主播等级的图标 2024-01-04 15:07:12 +08:00
17506f6cbf Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2024-01-04 10:36:22 +08:00
18401019693
418073f07e Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2024-01-04 10:35:51 +08:00
18401019693
319295de57 接口 改造 2024-01-04 10:35:42 +08:00
hch
dcf3f5c308 推送管理 2024-01-03 18:28:49 +08:00
30bdf83724 调整PK天梯赛信息更新由接口转为IM推送 2024-01-02 15:42:55 +08:00
fbb801bf62 调整战令接口
调整战令购买等级最大值
新增战令统计直播间发送消息接口
2023-12-26 18:24:46 +08:00
18401019693
44601c74b4 隐藏测试按钮 2023-12-23 16:39:58 +08:00
2808e41288 修复测试反馈问题 2023-12-23 14:14:32 +08:00
05aea2448f 修复测试反馈问题 2023-12-23 11:01:28 +08:00
34986d6897 修复测试反馈问题 2023-12-23 09:59:30 +08:00
924afce81e Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-22 14:32:33 +08:00
48dcfd4a04 新增战令系统 2023-12-22 14:32:18 +08:00
18401019693
163ab1c80d 隐藏测试按钮 2023-12-22 13:36:09 +08:00
e06f944def Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-22 10:08:35 +08:00
18401019693
a5d546d1d1 兑换奖励接口 2023-12-22 10:07:47 +08:00
1304ec6cde Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-21 16:26:04 +08:00
18401019693
f46d14ce28 购买经验 2023-12-21 15:24:43 +08:00
e2005582fe 修复活动弹窗重影问题 2023-12-21 10:22:36 +08:00
a56a5849fe Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-20 17:49:30 +08:00
18401019693
1495bfee99 兌換詳情弹窗 2023-12-20 17:37:18 +08:00
19eecd7022 Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-20 17:16:31 +08:00
18401019693
d415efde35 战令等级添加参数 2023-12-20 16:36:13 +08:00
61ee585ae9 Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-20 16:27:44 +08:00
18401019693
7b103aaf7c 添加开通接口弹窗回调添加 2023-12-20 16:27:22 +08:00
18401019693
9eba98f709 添加开通接口弹窗回调添加 2023-12-20 16:26:24 +08:00
dea3264577 Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-20 16:17:37 +08:00
18401019693
42cfcce1dc 添加开通接口弹窗回调添加 2023-12-20 15:28:41 +08:00
hch
f697e650a8 更新 2023-12-19 18:29:48 +08:00
18401019693
ac78268a85 活动结束弹窗 2023-12-19 15:59:55 +08:00
hch
9d543f2211 Merge remote-tracking branch 'origin/master' into pdlive_samsung
# Conflicts:
#	config.gradle
#	main/src/main/java/com/yunbao/main/activity/GoogleFragment.java
2023-12-19 09:41:04 +08:00
d001712067 Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-18 16:54:05 +08:00
18401019693
dc28a3d81e zhanling dengji 2023-12-18 16:53:37 +08:00
728dec9d97 Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-18 16:34:19 +08:00
18401019693
f65c698602 短剧 CookieManager cookieManager = CookieManager.getInstance(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
    cookieManager.setAcceptThirdPartyCookies(mainWv, true);
    } else{
      cookieManager.setAcceptCookie(true);
    }
2023-12-18 15:30:29 +08:00
18401019693
215a2f8927 战令等级 2023-12-18 15:18:42 +08:00
hch
a21352302b 三星内购调用 2023-12-15 18:29:12 +08:00
18401019693
0b3ebdfc30 整蛊修改 2023-12-15 17:17:18 +08:00
18401019693
f10657f89c 弹窗整合 2023-12-15 17:01:35 +08:00
18401019693
0dc1009661 观看时长问题修改 2023-12-15 15:16:09 +08:00
18401019693
302b789970 多人Pk问题 2023-12-15 14:03:42 +08:00
18401019693
bd9c8c2265 直播间退出接口时机修改,免费礼物的修改 2023-12-15 10:17:47 +08:00
58ace7d613 Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-15 09:49:17 +08:00
hch
c723e14182 三星内购调用 2023-12-14 18:28:39 +08:00
18401019693
3982afb0d3 弹窗整合 2023-12-14 17:39:05 +08:00
18401019693
280920d5f0 弹窗整合 2023-12-14 17:28:49 +08:00
18401019693
e25980cec8 開通精英戰令 2023-12-14 15:10:25 +08:00
18401019693
e353638ec1 開通精英戰令 2023-12-14 14:49:45 +08:00
18401019693
65a3a64d7d 战令规则页面弹窗 2023-12-14 10:52:44 +08:00
b10312118b Merge remote-tracking branch 'origin/dev_6.6.4_战令' into dev_6.6.4_战令 2023-12-12 17:59:09 +08:00
18401019693
419b5d08b4 升級精英/尊享戰令弹窗 2023-12-12 17:43:12 +08:00
18401019693
b146f93029 添加弹窗,弹窗通用背景 2023-12-12 16:59:33 +08:00
18401019693
ef34a6cf4f 添加弹窗,弹窗通用背景 2023-12-12 16:36:31 +08:00
18401019693
213319d5d3 修改 测试问题 2023-12-12 15:17:09 +08:00
18401019693
ddb4e98afd 修改 测试问题 2023-12-12 14:40:48 +08:00
18401019693
8dbc0dad7a 修改 测试问题 2023-12-12 14:39:07 +08:00
cdf3c4e411 调整弹窗显示 2023-12-12 13:51:02 +08:00
18401019693
446dc271d6 Merge remote-tracking branch 'origin/master' 2023-12-12 10:51:41 +08:00
18401019693
ecca9b7b8b 修改 测试问题 2023-12-12 10:51:30 +08:00
hch
331b55a5ab 修复跳转到华为商店问题 2023-12-08 15:32:18 +08:00
hch
f8ac4617ed 新增判断 判断是否有google服务 2023-12-08 14:17:36 +08:00
18401019693
d0b7b065b2 修改 测试问题 2023-12-07 18:18:27 +08:00
53e6cb5a70 新增首页弹窗更多条件控制 2023-12-07 18:01:48 +08:00
hch
ad79190a61 三星内购 2023-12-07 17:46:22 +08:00
18401019693
5895fa8d71 修改 测试问题 2023-12-07 17:38:38 +08:00
hch
48886374d5 修复支付弹窗问题 2023-12-07 17:31:08 +08:00
18401019693
32d0fe497d 修改 测试问题 2023-12-07 16:29:28 +08:00
18401019693
6347473d0c 修改 测试问题 2023-12-07 13:24:41 +08:00
6df819f3b1 Merge remote-tracking branch 'origin/master' 2023-12-07 13:20:24 +08:00
39fbe90e8b Merge branch 'dev_6.6.3' 2023-12-07 13:19:53 +08:00
18401019693
3396ca63d0 修改 测试问题 2023-12-07 13:17:12 +08:00
8c5ae3b61a 新增首页弹窗更多条件控制 2023-12-07 13:04:41 +08:00
18401019693
484891cfe7 修改 测试问题 2023-12-06 17:13:14 +08:00
18401019693
5c00e065d2 Merge remote-tracking branch 'origin/dev_6.6.3'
# Conflicts:
#	common/src/main/java/com/yunbao/common/bean/IMLoginModel.java
#	config.gradle
2023-12-06 15:20:39 +08:00
18401019693
2857bb09a2 修改 测试问题 2023-12-06 15:18:42 +08:00
18401019693
79c1c01003 修改 测试问题 2023-12-06 13:45:37 +08:00
a2864187ed update 2023-12-06 13:42:10 +08:00
ef76b2c7e4 修复主页classtab可能为空导致的闪退问题(报错平台反馈) 2023-12-06 13:17:13 +08:00
18401019693
05e7c4ffdd 修改 测试问题 2023-12-05 18:28:53 +08:00
18401019693
b4b1efe730 修改 测试问题 2023-12-05 09:27:47 +08:00
0c7ae4e4f7 update 2023-12-04 18:19:22 +08:00
hch
b35d5d242e 修复支付弹窗问题 2023-12-01 13:33:49 +08:00
b8264997f4 修复礼物弹框闪退问题 2023-12-01 13:11:08 +08:00
18401019693
2ab1b31a94 修改 测试问题 2023-11-30 16:47:47 +08:00
hch
9dba41c22f 修复支付问题 2023-11-30 16:15:23 +08:00
18401019693
f1645cf72c 修改 测试问题 2023-11-30 15:18:28 +08:00
18401019693
cd35b9e40f 短剧 2023-11-30 14:37:16 +08:00
18401019693
33bce43737 短剧 2023-11-30 14:34:45 +08:00
18401019693
1f8025599b 小礼物逻辑上传 2023-11-30 10:45:45 +08:00
hch
7c44f09803 修复支付问题 2023-11-29 18:26:59 +08:00
hch
0b89ac21e8 lib_google
lib_huawei
2023-11-28 18:28:47 +08:00
hch
238181deca lib_google
lib_huawei
2023-11-27 17:12:27 +08:00
18401019693
71a7b47d42 修改语音连麦的逻辑 2023-11-27 17:00:30 +08:00
18401019693
59446d2518 小礼物逻辑第4次上传 2023-11-27 15:40:10 +08:00
18401019693
8a8a7a8326 小礼物逻辑第san次上传 2023-11-27 10:38:20 +08:00
18401019693
089b1881f1 小礼物逻辑第er次上传 2023-11-25 13:54:31 +08:00
18401019693
7b1f3ddd79 小礼物逻辑第一次上传 2023-11-24 13:41:21 +08:00
18401019693
56ae033523 修改中英文刷新数据问题 2023-11-16 18:30:10 +08:00
18401019693
f772a64507 修改中英文刷新数据问题 2023-11-16 13:05:56 +08:00
18401019693
8c75317ddc 修改测试问题 2023-11-15 14:27:56 +08:00
18401019693
256c19a09e 修改测试问题 2023-11-14 18:13:14 +08:00
18401019693
82c1d15ca5 修改测试问题 2023-11-14 16:05:43 +08:00
18401019693
aff5a178a0 普通公屏聊天把之前的限制50个字 修改成 100个字。其他两个个不变 2023-11-14 11:31:20 +08:00
18401019693
04b1764f7b 修改测试问题 2023-11-13 15:57:24 +08:00
18401019693
076f7130c8 修改测试问题 2023-11-13 14:24:07 +08:00
18401019693
b7842d5ac9 添加创建游戏的时候星币配置的接口 2023-11-11 15:43:41 +08:00
18401019693
eb5aebda51 修改bug 2023-11-11 14:17:16 +08:00
18401019693
6990bd13ed 修改判断 2023-11-11 10:43:05 +08:00
18401019693
c18af48fbb 修改中英文 2023-11-11 09:59:01 +08:00
18401019693
68e6f5df1b 添加新接口扣款添加星币筛选 2023-11-10 17:49:59 +08:00
18401019693
dc46ffc5b6 修改参数问题 2023-11-10 11:26:44 +08:00
18401019693
c58a5a9a55 注册的接口加一个字段 langue=语言 默认 'chinese' , 英语 'english'
Login.UserReg
Login.userLoginByThird
两个接口
2023-11-10 09:57:47 +08:00
18401019693
e2ee742091 当用户设置语言为英语时,将会调整首页推送逻辑,【英语】标签将会提前到第一位并默认展示【英语】标签内容; 2023-11-09 18:07:21 +08:00
18401019693
bcc86a899c 在游戏列表和游戏房间页面增加【游戏记录】按钮,点击可跳转至游戏记录界面,界面记录用户所参与的对局记录; 2023-11-09 15:48:28 +08:00
18401019693
b60031d2d0 游戏列表,搜索添加字段 2023-11-08 14:00:05 +08:00
18401019693
54aa5fee67 游戏规则页面 2023-11-08 10:23:45 +08:00
18401019693
816fd21fbc 1. 增加星币参与游戏的入口(先开通并隐藏,暂不开放)后台控制还未添加
在游戏门槛处,用户可自由选择金币或星币作为游戏门槛,并可输入相应数量,星币门槛为10~1000,数量必须为10的倍数;
2023-11-07 16:13:40 +08:00
18401019693
92e6b563e4 ● 游戏结束后,会出现两个选择:【再来一局】或【退出】,不论点击哪个按钮,都将回到游戏初始界面,用户都需手动再次上位、准备,修改为点击【退出】的逻辑不变,点击【再来一局】时,将会先判断用户的金豆数量是否足够参与下局游戏,若金豆数量不足,则弹出不足的提示,并回到游戏初始界面,若金豆数量足够,则直接回到座位,并自动准备本局游戏;
● 在点击加入游戏和开始游戏时,进行双重的金豆余额判断,如果余额不够进行游戏,则无法开始,并提示‘金豆不足’,如果两次判断余额充足,则正常开始游戏;
● 随机游戏房间名:1.一起玩吧! 2.來戰斗吧! 3.你的籌碼我收下了! 4.在線等遊戲夥伴~ 5.決戰到天亮 6.‘用户名’的房间(例:范德萨的房间
2023-11-07 14:46:45 +08:00
18401019693
d7bc2615d6 主播端不关闭连麦直接下播导致的问题。修复,用户端因为主播下播没关连麦导致的连麦状态不对的修复 2023-11-01 18:09:55 +08:00
18401019693
21473b1d69 修改已经连麦列表无名称问题,修改连麦列表覆盖问题,添加主播关播强制关闭连麦权限 2023-11-01 16:05:22 +08:00
18401019693
9bdee649d8 修改已经连麦列表无名称问题,修改连麦列表覆盖问题 2023-11-01 14:07:23 +08:00
18401019693
f1a8cd3a68 Android连麦申请列表重构,申请列表重构,连麦列表重构,按钮判断逻辑修改,主播断开连麦接口重构 2023-11-01 09:55:42 +08:00
18401019693
a39005b1a9 2、安卓主播开播, 安卓用户申请连麦后 ,安卓用户这边底部画面不全 2023-10-30 15:12:00 +08:00
18401019693
ec1197e5da 遊戲bug修復 2023-10-30 11:23:46 +08:00
18401019693
45372f37b8 遊戲bug修復 2023-10-28 17:55:36 +08:00
18401019693
df93b9495a 遊戲bug修復 2023-10-28 17:13:25 +08:00
18401019693
86d730cdf1 遊戲bug修復 2023-10-28 14:19:11 +08:00
18401019693
f356446c03 小遊戲bug修改 2023-10-27 16:20:19 +08:00
hch
bf7bc6b786 修复异常 Fragment 创建传值问题 2023-10-27 15:42:03 +08:00
18401019693
6a3c15e3e7 Merge remote-tracking branch 'origin/master' 2023-10-26 16:42:41 +08:00
18401019693
07d3b190e2 啟動頁跳轉廣告點擊返回鍵退出應用問題修復 2023-10-26 16:42:34 +08:00
18142669586
27b316d39b Merge remote-tracking branch 'origin/master' 2023-10-26 16:26:22 +08:00
18142669586
f928fcd4bc 去掉邀请码上传头像功能 2023-10-26 16:25:31 +08:00
hch
adcafc7e16 处理 空指针异常
CommonAppContext.getTopActivity()==null
主要处理了 ToastUtil,OpenAdManager
2023-10-26 14:50:17 +08:00
18401019693
b191dfb1be 小遊戲提醒 2023-10-26 14:42:09 +08:00
18401019693
192b0cb417 小遊戲提醒 2023-10-25 10:09:38 +08:00
18142669586
a2435cbe95 Merge remote-tracking branch 'origin/master' 2023-10-24 15:54:01 +08:00
18142669586
8925d478da 去掉邀请码上传头像功能 2023-10-24 15:51:48 +08:00
18401019693
926de0463c 小遊戲修改 2023-10-24 15:46:47 +08:00
18401019693
993b09b853 修改中英文 2023-10-19 09:45:45 +08:00
18142669586
e6c8495158 1 2023-10-18 22:21:57 +08:00
18401019693
e15953dc64 修改中英文 2023-10-18 17:26:37 +08:00
18401019693
4ff529ace9 修改中英文 2023-10-17 17:59:10 +08:00
18401019693
530622c72c 修改中英文 2023-10-17 17:47:32 +08:00
18401019693
7f38739ddc 修改中英文 2023-10-17 15:59:58 +08:00
18401019693
bc549d52f6 修改中英文 2023-10-17 15:00:20 +08:00
18401019693
14f0de093e 修改中英文 2023-10-16 18:23:59 +08:00
18401019693
51457738d2 修改中英文 2023-10-16 17:01:46 +08:00
18401019693
d8a0427791 修改中英文 2023-10-16 16:30:54 +08:00
18401019693
8abf92d42c 修改中英文 2023-10-14 17:05:14 +08:00
18401019693
fc2d700a31 修改中英文 2023-10-13 17:48:42 +08:00
18401019693
867029fa3a 修改中英文 2023-10-13 16:06:07 +08:00
18401019693
52e199b901 修改中英文 2023-10-13 14:09:34 +08:00
18401019693
c5d537fb4d 修改中英文 2023-10-12 16:19:27 +08:00
18401019693
e081f1e058 修改中英文 2023-10-12 14:26:10 +08:00
18401019693
7bedf93dd5 修改中英文 2023-10-11 17:26:07 +08:00
18401019693
000929fd02 修改中英文 2023-10-11 15:40:39 +08:00
18401019693
3e5ba2ba19 修改中英文 2023-10-11 13:39:31 +08:00
18401019693
a25ce2034f 修改中英文 2023-10-10 17:03:51 +08:00
18401019693
1625135d0c 修改中英文 2023-10-10 14:15:52 +08:00
18401019693
add3589683 修改中英文 2023-10-09 17:57:03 +08:00
18401019693
45a5d6ad61 修改中英文 2023-10-09 17:24:05 +08:00
18401019693
7b62409bf1 中英文修改 2023-10-09 16:27:54 +08:00
18401019693
45ad8a9810 盲盒头条英文图 2023-10-07 16:14:59 +08:00
18401019693
a788c347de 修改游戏的new图标展示,网页中英文检测 2023-10-07 15:20:13 +08:00
18401019693
c3d4cb8d62 Merge branch 'master' into master_sud
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	config.gradle
2023-10-07 14:46:22 +08:00
18401019693
916a1447f0 修改游戏的new图标展示,网页中英文检测 2023-10-07 14:21:20 +08:00
18401019693
b2ee091c03 修改游戏的new图标展示,网页中英文检测 2023-10-07 11:21:03 +08:00
18401019693
cf169e9a4e 修改游戏的new图标展示,网页中英文检测 2023-10-07 10:31:13 +08:00
18401019693
ea0ff70595 网页拼接中英文字段 2023-10-06 17:04:52 +08:00
18401019693
ce37918745 修改游戏问题 2023-10-06 16:30:02 +08:00
18401019693
260b615d2b 修改游戏问题 2023-10-06 15:43:34 +08:00
18401019693
45566001a7 修改游戏问题 2023-10-06 15:22:59 +08:00
18401019693
12482b6624 修改游戏问题 2023-10-06 13:45:47 +08:00
18401019693
2d7684a5c8 添加游戏列表点击查询游戏状态 2023-10-06 10:01:39 +08:00
18401019693
c1d6b67322 游戏修改,粉丝团提示修改 2023-10-05 15:44:37 +08:00
18401019693
69c0d5f28a 游戏修改,粉丝团提示修改 2023-10-05 13:46:45 +08:00
18401019693
d541a4d506 游戏修改,粉丝团提示修改 2023-10-05 10:52:54 +08:00
18401019693
4b46c72f5a 中英文页面适配修改 2023-09-28 14:47:10 +08:00
18401019693
e191fb82a3 sud游戏搜索页面优化更改 2023-09-27 17:20:29 +08:00
18401019693
32ebfa719d sud游戏搜索页面优化更改 2023-09-27 17:08:14 +08:00
18401019693
c94f549531 修改随机开始,修改游戏的上座和结束的逻辑,添加中英文 2023-09-27 16:28:43 +08:00
18401019693
6d98afa319 全屏游戏 2023-09-27 14:06:22 +08:00
20ccb37ccf udpate 2023-09-27 09:34:07 +08:00
18401019693
79fa6be313 全屏游戏 2023-09-26 16:05:30 +08:00
18401019693
210e755fed 游戏列表跳转游戏 2023-09-26 14:56:55 +08:00
a6faf12ff6 update 首页游戏专区 2023-09-26 10:31:39 +08:00
18401019693
e2148c3f31 游戏列表跳转游戏 2023-09-26 09:53:00 +08:00
18401019693
869ca75464 游戏列表跳转游戏 2023-09-25 17:56:52 +08:00
18401019693
ce48a7dcf0 创建游戏,游戏界面完成 2023-09-25 17:24:49 +08:00
18401019693
866024ae95 创建游戏,游戏界面完成 2023-09-25 11:25:03 +08:00
b40abb9bc0 fix 修复PK过程中挂后台导致摄像头关闭问题 2023-09-25 09:54:39 +08:00
18401019693
37217e529e 创建游戏,游戏界面完成 2023-09-25 09:52:31 +08:00
18401019693
eedbbb5304 创建游戏房 2023-09-23 17:44:16 +08:00
4b3b47b65f update 布局&中英文 2023-09-23 10:31:06 +08:00
c015459cf1 fix 播放器url為空時不播放 2023-09-22 14:27:23 +08:00
326ced4646 update 餘額不足時彈框 2023-09-22 14:25:54 +08:00
18970c22cf update 餘額不足時彈框 2023-09-22 13:38:34 +08:00
00db8a00c7 fix 修复一些反馈的问题 2023-09-22 11:05:02 +08:00
18401019693
0756dd9560 游戏房入口对接 2023-09-21 17:58:53 +08:00
f3195bbcf8 Merge branch 'dev_6.5.6' into master_tmp1 2023-09-21 13:28:01 +08:00
4e4b5f90bb fix 重复调用弹窗接口 2023-09-21 11:14:01 +08:00
3150489384 update 中英文
fix 播放器监测
2023-09-20 18:26:59 +08:00
9ff382e35b update 排位赛中英文IM消息 2023-09-16 18:22:51 +08:00
bcd8f7af52 Merge branch 'master' into dev_6.5.6 2023-09-16 14:38:28 +08:00
3595b89672 fix 调整英文PK惩罚倒计时过长问题 2023-09-16 14:24:06 +08:00
6e8842d30d update config加入网络失败提示 2023-09-16 14:23:43 +08:00
7b5cd9b797 update 中英文 2023-09-16 10:53:08 +08:00
9ec241f2a3 update 弹窗 2023-09-15 18:28:46 +08:00
a876018b0a update 弹窗布局 2023-09-15 18:12:40 +08:00
ea397af123 update 弹窗接口 2023-09-15 16:55:36 +08:00
a475e5dc2f update 中英文 2023-09-15 16:15:51 +08:00
54258c3f13 新增【弹框功能优化】 2023-09-15 14:54:45 +08:00
d383a08013 新增【弹框功能优化】 2023-09-15 10:04:02 +08:00
18401019693
fed6289f67 修复在直播间内跳转自己的直播间问题 2023-09-14 14:45:29 +08:00
18401019693
9b301eba25 修复在直播间内跳转自己的直播间问题 2023-09-12 17:14:17 +08:00
d1edf6bdd8 新增主播关播时,用户端调用离开房间 2023-09-11 10:41:56 +08:00
18401019693
7ca8694aed 修复在直播间内跳转自己的直播间问题 2023-09-11 10:29:16 +08:00
18401019693
406c67bf3a 修复在直播间内跳转自己的直播间问题 2023-09-08 15:58:32 +08:00
18401019693
d643df72bc 埋点配置 2023-09-08 15:57:33 +08:00
a3dacf1f59 调整盲盒说明页面地址 2023-09-06 18:28:10 +08:00
37605f46b7 調整中英文 2023-09-06 15:27:03 +08:00
18401019693
a4895df622 埋点配置 2023-09-06 14:40:45 +08:00
fc63cbbf50 update 2023-09-06 11:09:50 +08:00
b7ba717cb9 Merge branch 'dev_6.5.5'
# Conflicts:
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java
2023-09-06 10:42:05 +08:00
0c5ef0befe 跳转七日留存:新增点击打开用户卡片,新增@用户名颜色 2023-09-05 17:59:29 +08:00
18401019693
84d4423069 埋点配置 2023-09-05 14:25:50 +08:00
18401019693
0721ff4f37 Merge branch 'master_umeng'
# Conflicts:
#	app/proguard-rules.pro
#	common/src/main/res/values/strings.xml
#	live/src/main/java/com/yunbao/live/dialog/LiveGiftPopup.java
2023-09-05 14:18:42 +08:00
a5b0ee757c 新增H5网页跳转直播间并打开礼物栏选中礼物功能 2023-09-05 13:52:45 +08:00
18401019693
82fd35305a 埋点配置 2023-09-05 13:24:21 +08:00
e89e82483b 调整中英文
调整开播频道接口
2023-09-04 16:25:06 +08:00
57bda40a82 调整中英文
调整开播频道接口
2023-09-02 11:16:01 +08:00
18401019693
93aa8e55e5 埋点配置 2023-09-02 10:10:50 +08:00
2e907bc1ed 移除重复点击事件监听 2023-08-31 16:16:36 +08:00
8d984951c3 新增主動PK結束通知 2023-08-31 15:14:15 +08:00
18401019693
dd6600a89e 埋点配置 2023-08-31 09:56:41 +08:00
18401019693
233469c7e4 埋点配置 2023-08-30 13:44:56 +08:00
357ece2ebe 补充Android13权限问题 2023-08-30 13:28:42 +08:00
18401019693
72e9633045 埋点配置 2023-08-30 13:21:40 +08:00
18401019693
7a31ca52da 埋点配置 2023-08-30 09:44:26 +08:00
18401019693
33930f3e32 埋点配置 2023-08-29 13:35:38 +08:00
8e19ddcc99 兼容Android13 连麦权限问题 2023-08-29 09:54:21 +08:00
18401019693
1a58311e26 埋点配置 2023-08-28 16:52:19 +08:00
9360e5438c 修复svga库被混淆不显示问题 2023-08-28 10:30:56 +08:00
fa8d8a7421 调整红包倒计时范围 2023-08-28 10:14:38 +08:00
18401019693
bebf0820ca 埋点配置 2023-08-25 15:12:48 +08:00
e1f4e8dde4 update 6.5.5 2023-08-24 16:31:14 +08:00
2b59b1b4fe Merge branch 'master' into dev_6.5.5 2023-08-24 15:02:05 +08:00
cee1476ab1 update 6.5.5 2023-08-24 14:26:38 +08:00
20a6bae5ff 更新美颜中英文繁体 2023-08-24 13:34:08 +08:00
b6732adfd2 调整礼物栏触碰事件拦截 2023-08-24 10:54:12 +08:00
bec031688e 调整礼物栏触碰事件拦截 2023-08-24 10:46:40 +08:00
7f11195ede update 6.5.5 2023-08-24 09:43:33 +08:00
d4ff9c3072 兼容Android13权限问题 2023-08-23 17:10:52 +08:00
0a442e7df9 兼容Android13权限问题 2023-08-23 17:02:16 +08:00
52f1a78e36 update 红包优化 2023-08-23 16:37:53 +08:00
18401019693
6bcaf2ba9c 埋点配置 2023-08-23 15:05:32 +08:00
18401019693
75b176a81e 6.5.4礼物冠名 2023-08-22 14:10:09 +08:00
18401019693
3de972d12c 6.5.4礼物冠名 2023-08-22 14:03:04 +08:00
18401019693
95252f2f02 6.5.4礼物冠名 2023-08-22 13:31:32 +08:00
18401019693
3b351ffad8 6.5.4礼物冠名 2023-08-22 10:13:57 +08:00
2332255b37 礼物栏等级页面补充中英文标识 2023-08-21 17:38:41 +08:00
18401019693
90c2f3e2da 6.5.4礼物冠名 2023-08-21 17:20:29 +08:00
18401019693
644615ffc0 6.5.4礼物冠名 2023-08-21 15:28:29 +08:00
18401019693
345c9067aa 6.5.4礼物冠名 2023-08-19 16:05:30 +08:00
18401019693
c20312b982 6.5.4礼物冠名 2023-08-18 18:43:47 +08:00
18401019693
643568f63b 6.5.4礼物冠名 2023-08-18 18:08:15 +08:00
18401019693
f03ba293b5 6.5.4礼物冠名 2023-08-18 17:43:13 +08:00
a2f954b28a Merge remote-tracking branch 'origin/master' 2023-08-18 14:48:41 +08:00
d4549793d1 调整头像相关 2023-08-18 14:48:33 +08:00
18401019693
5da8855948 6.5.4礼物冠名 2023-08-18 14:17:46 +08:00
18401019693
348dca8474 6.5.4礼物冠名 2023-08-18 13:49:20 +08:00
18401019693
5afed0ee43 6.5.4礼物冠名 2023-08-18 11:04:21 +08:00
18401019693
d065726274 6.5.4礼物冠名 2023-08-17 18:20:53 +08:00
18401019693
8f9d558043 6.5.4礼物冠名 2023-08-17 18:15:25 +08:00
c594364574 调整关注逻辑 2023-08-17 17:17:06 +08:00
18401019693
68140c8a3a 6.5.4礼物冠名 2023-08-17 15:38:59 +08:00
5a4001c858 调整退出粉丝团逻辑 2023-08-17 13:45:40 +08:00
18401019693
d5953bd651 6.5.4礼物冠名 2023-08-17 13:19:04 +08:00
18401019693
17a2f5e091 6.5.4礼物冠名 2023-08-16 20:01:46 +08:00
18401019693
b2297b062e 6.5.4礼物冠名 2023-08-16 18:17:26 +08:00
b53472de28 調整文案 2023-08-16 17:32:29 +08:00
18401019693
9bce235817 6.5.4礼物冠名 2023-08-16 16:23:28 +08:00
18401019693
60ce5572cf 6.5.4礼物冠名 2023-08-16 15:37:07 +08:00
18401019693
3761cad653 6.5.4礼物冠名 2023-08-16 14:50:50 +08:00
18401019693
2a276503b5 6.5.4礼物冠名 2023-08-16 13:31:56 +08:00
fd0ad36a58 补充英文 2023-08-15 14:07:33 +08:00
41c8783b53 调整一处英文UI下字数过长问题 2023-08-15 14:00:36 +08:00
18401019693
7226add482 6.5.4礼物冠名 2023-08-15 11:29:39 +08:00
09e5f9b984 Merge remote-tracking branch 'origin/master' 2023-08-15 10:37:25 +08:00
83ee1f94df 修复一处闪退bug 2023-08-15 10:37:06 +08:00
18401019693
7e1b054a98 6.5.4礼物冠名 2023-08-14 21:05:15 +08:00
18401019693
9e0c437af5 6.5.4礼物冠名 2023-08-14 19:55:58 +08:00
18401019693
ad26ae7db8 6.5.4礼物冠名 2023-08-14 19:16:02 +08:00
18401019693
84230e517e 6.5.4礼物冠名 2023-08-14 18:40:25 +08:00
9818a1af74 新增关注的code提示 2023-08-14 18:05:55 +08:00
f91ba79c5c 新增关注的code提示 2023-08-14 17:54:27 +08:00
18401019693
0ea9ffc2e8 6.5.4礼物冠名 2023-08-14 17:40:52 +08:00
18401019693
defb5fdd02 6.5.4礼物冠名 2023-08-14 15:50:35 +08:00
b443fdd683 调整页面英文UI 2023-08-14 14:58:13 +08:00
18401019693
c11c66f56f 6.5.4礼物冠名 2023-08-14 13:47:09 +08:00
18401019693
a618bee6b7 6.5.4礼物冠名 2023-08-14 11:18:33 +08:00
399bedb874 调整购买守护页面英文UI 2023-08-14 10:57:38 +08:00
18401019693
3b6e2d47f4 6.5.4礼物冠名 2023-08-14 10:31:01 +08:00
18401019693
96daf73a5c 6.5.4礼物冠名 2023-08-14 10:16:06 +08:00
18401019693
55cbd0ff5b 6.5.4礼物冠名 2023-08-11 14:37:35 +08:00
18401019693
a3ab9ff03e 6.5.4礼物冠名 2023-08-11 14:19:15 +08:00
18401019693
92ed82ea2a 6.5.4礼物冠名 2023-08-11 13:59:54 +08:00
18401019693
6d262d0c94 6.5.4礼物冠名 2023-08-11 09:42:18 +08:00
18401019693
ce1174a88c 6.5.4礼物冠名 2023-08-10 17:40:57 +08:00
18401019693
2406e9bede 6.5.4礼物冠名 2023-08-10 17:38:06 +08:00
9b3a011499 修复英文say hi下格式问题#131 2023-08-10 17:25:53 +08:00
18401019693
7859e7cb29 6.5.4礼物冠名 2023-08-10 17:16:14 +08:00
18401019693
1fd36e3ba0 6.5.4礼物冠名 2023-08-10 17:04:26 +08:00
ec3722b7d0 新增粉丝团任务红点提示 2023-08-10 16:53:00 +08:00
18401019693
35917a5848 6.5.4礼物冠名 2023-08-10 15:40:13 +08:00
18401019693
7ea6bb570d 6.5.4礼物冠名 2023-08-10 14:20:40 +08:00
18401019693
43f95260e6 6.5.4礼物冠名 2023-08-10 13:51:49 +08:00
18142669586
54a4c0b590 Merge remote-tracking branch 'origin/master' 2023-08-10 11:15:31 +08:00
18142669586
2057a3575f 修改融云结束连麦还有对方画面的问题 2023-08-10 11:15:06 +08:00
18401019693
aa809ebaf4 6.5.4礼物冠名 2023-08-10 10:03:01 +08:00
18401019693
dffa71e346 6.5.4礼物冠名 2023-08-09 18:11:42 +08:00
18401019693
fea46aab1f 6.5.4礼物冠名 2023-08-09 17:05:51 +08:00
18401019693
e032e0807b 6.5.4礼物冠名 2023-08-09 14:38:33 +08:00
18401019693
24ed313f60 6.5.4礼物冠名 2023-08-09 14:15:03 +08:00
18142669586
02b70d559d Merge remote-tracking branch 'origin/master' 2023-08-09 14:14:11 +08:00
18142669586
7a26e81f67 修改融云合流不成功的问题,退出画面有问题 2023-08-09 14:13:52 +08:00
d07439efcf update 主播端点礼物墙按钮置灰 2023-08-09 13:53:16 +08:00
18401019693
7bca817633 6.5.4礼物冠名 2023-08-09 13:31:31 +08:00
18401019693
bad2b3689a 6.5.4礼物冠名 2023-08-09 11:01:28 +08:00
3cc9b90151 update 简繁 2023-08-09 10:24:13 +08:00
18401019693
e32e6f95b0 6.5.4礼物冠名 2023-08-08 17:09:35 +08:00
18401019693
2162645da1 6.5.4礼物冠名 2023-08-08 16:12:07 +08:00
18401019693
af17c85366 6.5.4礼物冠名 2023-08-08 16:08:43 +08:00
18401019693
20c00e2896 6.5.4礼物冠名 2023-08-08 15:37:11 +08:00
18401019693
44b95cb1c6 6.5.4礼物冠名 2023-08-08 14:50:13 +08:00
40e744a533 修复粉丝团包裹为空时会关掉对话框的情况 2023-08-08 13:32:42 +08:00
18401019693
82ccd2d89c 6.5.4礼物冠名 2023-08-08 11:37:19 +08:00
18401019693
994bd2a3aa 6.5.4礼物冠名 2023-08-08 09:34:15 +08:00
3ab91a74d1 修复礼物栏自定义数量过长导致的闪退问题 2023-08-07 18:26:45 +08:00
18142669586
d899975495 修改融云合流不成功的问题 2023-08-07 18:06:46 +08:00
dbbe753492 调整【围观】为繁体 2023-08-07 17:05:33 +08:00
18401019693
017320ac09 6.5.4礼物冠名 2023-08-07 16:29:02 +08:00
7ce0bb3a7c 修复#93测试问题 2023-08-07 15:18:34 +08:00
18401019693
a78d5b4aba 6.5.4礼物冠名 2023-08-07 14:50:29 +08:00
37fd1e9f47 调整粉丝团入场英文翻译 2023-08-07 14:39:35 +08:00
18401019693
97ad28ba62 6.5.4礼物冠名 2023-08-07 13:36:59 +08:00
3304e8f673 update 粉丝团 2023-08-05 18:04:36 +08:00
e7daabe588 Merge branch 'dev_6.5.4' 2023-08-05 16:53:13 +08:00
d912ad6119 update 粉丝团 2023-08-05 16:52:48 +08:00
18401019693
dfeb1c246b 6.5.4礼物冠名 2023-08-05 15:22:49 +08:00
18401019693
9588619b73 6.5.4礼物冠名 2023-08-04 16:54:28 +08:00
18401019693
6ba71508ca 6.5.4礼物冠名 2023-08-04 16:28:43 +08:00
c8f443c105 Merge branch 'master' into dev_6.5.4_tmp 2023-08-04 16:15:25 +08:00
18401019693
ebcfddf450 6.5.4礼物冠名 2023-08-04 16:14:36 +08:00
e43fb5e479 Merge branch 'master' into dev_6.5.4_tmp 2023-08-04 16:13:14 +08:00
18401019693
0c096dcafc 6.5.4礼物冠名 2023-08-04 15:59:20 +08:00
18401019693
545c69ff8b 6.5.4礼物冠名 2023-08-04 15:50:32 +08:00
bf8d88608d Merge branch 'master' into dev_6.5.4_tmp
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	common/src/main/java/com/yunbao/common/utils/JavascriptInterfaceUtils.java
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java
2023-08-04 15:41:11 +08:00
18401019693
45c256cbbb 6.5.4礼物冠名 2023-08-04 15:18:06 +08:00
18401019693
fb1d6c0688 6.5.4礼物冠名 2023-08-04 14:58:26 +08:00
fe921e25bb update 粉丝团 2023-08-04 14:25:49 +08:00
18401019693
d5ca010ec7 6.5.4礼物冠名 2023-08-04 13:57:36 +08:00
18401019693
04259472a1 Merge remote-tracking branch 'origin/dev_gift_6.5.4' 2023-08-04 10:19:18 +08:00
18401019693
d6032a0a0a 6.5.4礼物冠名 2023-08-04 10:18:05 +08:00
18401019693
4a7790d968 6.5.4礼物冠名 2023-08-04 10:11:03 +08:00
18401019693
49810407ce 6.5.4礼物冠名 2023-08-04 09:47:42 +08:00
18401019693
fa086dc5cb 6.5.4礼物冠名 2023-08-03 17:54:14 +08:00
18401019693
3f8d6ed4af 6.5.4礼物冠名 2023-08-03 16:08:43 +08:00
18401019693
986902886a 6.5.4礼物冠名 2023-08-03 14:29:04 +08:00
18401019693
8ed7595aec 6.5.4礼物冠名 2023-08-02 17:47:00 +08:00
18401019693
b78fef6adc 6.5.4礼物冠名 2023-08-02 16:55:36 +08:00
fae0d01dc2 update 粉丝团 2023-08-02 15:48:51 +08:00
9a8bc0505d 修复#248问题 2023-08-02 15:08:11 +08:00
e31fa0310c 修复#250问题 2023-08-02 14:43:20 +08:00
2705342e18 修复#249问题 2023-08-02 14:39:56 +08:00
1bdf3a2ba3 修复#246问题 2023-08-02 14:20:47 +08:00
18401019693
5afa3bd30b 6.5.4礼物冠名 2023-08-02 13:23:37 +08:00
18401019693
54458bd0c0 6.5.4礼物冠名 2023-07-31 18:25:32 +08:00
c53b9a6064 update 粉丝团相关 2023-07-31 16:28:42 +08:00
92d4130c45 update 粉丝团相关 2023-07-28 10:01:41 +08:00
18401019693
a353e51ba8 6.5.4礼物栏优化 2023-07-25 15:25:01 +08:00
18401019693
0646f245b6 6.5.4礼物栏优化 2023-07-25 14:08:52 +08:00
7e3ca79a01 调整随机PK弹框UI 2023-07-21 14:19:20 +08:00
dfeb3a78c1 修复英文模式下,购买是守护文案超长问题 2023-07-21 13:34:31 +08:00
e32d450ca1 修复随机PK文案在英文模式下过长问题 2023-07-21 09:45:11 +08:00
f29766731c 修复#232问题 2023-07-20 18:12:09 +08:00
736592b4e1 新增头像选择界面 2023-07-19 18:30:32 +08:00
3108c898c2 Merge branch 'dev_6.5.4_头像优化' into dev_6.5.4_联系方式 2023-07-19 15:35:48 +08:00
dd2f3db16a 新增头像选择界面 2023-07-19 15:35:30 +08:00
8af231e526 新增头像选择界面 2023-07-19 13:07:27 +08:00
fdbbc3b224 修復紅點檢測 2023-07-19 10:25:11 +08:00
1e4b0bb536 补充信箱角标点亮和防抖 2023-07-18 18:09:27 +08:00
4729f93515 新增获取联系方式的弹框新样式 2023-07-18 15:40:15 +08:00
18401019693
3376a57f9d 6.5.4版本更新-“@”功能优化 2023-07-18 13:48:37 +08:00
18401019693
410fcb5895 修改json的版本号 2023-07-17 16:56:29 +08:00
18401019693
9b62ab6011 修改json的版本号 2023-07-17 16:42:51 +08:00
18401019693
62aa1d63df 修改json的版本号 2023-07-17 16:15:04 +08:00
18142669586
034f2dba5d Merge remote-tracking branch 'origin/master'
# Conflicts:
#	app/src/main/AndroidManifest.xml
#	config.gradle
2023-07-17 16:11:17 +08:00
18142669586
aee1d6cad4 修改上架 2023-07-17 16:10:29 +08:00
9b01ae4d82 修改用户协议地址 2023-07-17 15:18:47 +08:00
16f23519b1 移除百度语言残留内容 2023-07-17 13:35:59 +08:00
9bfed0bc7b 移除腾讯地图残留配置和代码 2023-07-17 10:16:24 +08:00
18401019693
bc0ed26377 修复 2023-07-14 13:13:25 +08:00
18401019693
0d14ce5aee 修复 2023-07-14 11:14:10 +08:00
18142669586
4a7423a5b9 修改全服 2023-07-14 10:43:14 +08:00
18401019693
0a4425d705 修复 2023-07-14 10:18:50 +08:00
d4c2ef71cb 新增主播可导出日志功能 2023-07-13 10:39:33 +08:00
18401019693
7184b147d9 修复 2023-07-12 15:32:44 +08:00
39e9670cff 6.5.3 432 2023-07-12 15:05:39 +08:00
18401019693
7d7535935a 修复 2023-07-12 14:58:34 +08:00
18401019693
dd657e9918 修复 2023-07-12 13:50:00 +08:00
09cef4ade6 6.5.3 更新发送红包说明图片 2023-07-12 13:11:19 +08:00
7038681f8c 6.5.3 2023-07-11 17:57:55 +08:00
6cf68838f8 修改红包样式和文案 2023-07-11 17:25:51 +08:00
c3a08974d1 修改发红包样式 2023-07-11 14:14:33 +08:00
18401019693
20c25a51ef 修复 2023-07-11 11:44:02 +08:00
18401019693
9dfb772224 修复 2023-07-11 11:43:12 +08:00
18401019693
f5f68f16b7 Merge remote-tracking branch 'origin/master' 2023-07-11 11:34:47 +08:00
18401019693
7672cea263 修复 2023-07-11 11:34:40 +08:00
0a02b39c12 根据产品需求修改英文翻译
根据产品需求修改UI样式
2023-07-11 10:51:03 +08:00
18401019693
e786ae16c2 修复 2023-07-11 10:13:29 +08:00
18401019693
1d447b0a90 修复 2023-07-10 16:36:48 +08:00
18401019693
4918f9ba20 修复 2023-07-08 15:52:18 +08:00
18401019693
124b18dcb0 修复 2023-07-08 15:15:40 +08:00
18401019693
f55e9c0cfe 修复 2023-07-08 13:40:50 +08:00
18401019693
84c43f74bc 修复 2023-07-07 16:14:28 +08:00
18401019693
674346b6de 修复 2023-07-07 16:01:29 +08:00
18401019693
64f40d52da 修复 2023-07-07 10:34:25 +08:00
18401019693
75e342975c 修复 2023-07-07 10:15:11 +08:00
18401019693
dd4172fc3d 修复 2023-07-07 09:51:29 +08:00
6b7a98dbc3 修复#220问题 2023-07-06 17:59:00 +08:00
640dea5c53 修复#218问题 2023-07-06 17:47:03 +08:00
a907897239 修复#217问题 2023-07-06 17:45:23 +08:00
3807ff8916 修复红包出现在联系方式选项里 2023-07-06 17:00:02 +08:00
36b85c15f5 修复飘屏弹幕被禁言没提示问题 2023-07-06 16:44:07 +08:00
3e91068866 按测试反馈修改红包详情UI逻辑和新增礼物显示 2023-07-06 15:13:33 +08:00
18401019693
4d61c7e176 添加翻译 2023-07-06 10:17:14 +08:00
18401019693
c6d9dbc118 添加翻译 2023-07-06 10:02:18 +08:00
6743ec3cf6 调整红包查看手气的UI 2023-07-06 10:02:04 +08:00
18401019693
addab80997 添加翻译 2023-07-05 18:15:18 +08:00
18401019693
9081ba4cd6 添加翻译 2023-07-05 17:47:50 +08:00
18401019693
12bedd630e 修复问题 2023-07-05 17:07:11 +08:00
18401019693
003c7f9e12 修复问题 2023-07-05 16:19:30 +08:00
18401019693
9089e96856 修复问题 2023-07-05 13:29:46 +08:00
60c14f720d 修复【钻石不够的情况下,也成功发起红包】 2023-07-04 17:15:25 +08:00
18401019693
c139b03417 修复问题 2023-07-04 17:02:05 +08:00
b3fb6e62ae Merge remote-tracking branch 'origin/master' 2023-07-04 16:37:34 +08:00
613185db40 修复红包记录样式问题 2023-07-04 16:36:46 +08:00
18401019693
291492f2d0 修复问题 2023-07-04 16:29:34 +08:00
18401019693
cbe91c84e9 红包全服通知 2023-07-04 16:02:45 +08:00
f417e4ead8 修复部分机型开播异常问题 2023-07-04 13:03:19 +08:00
18401019693
08bc6d554a Merge remote-tracking branch 'origin/dev_red_packet'
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	common/src/main/res/values/strings.xml
2023-07-03 17:57:35 +08:00
18401019693
895a1c6951 红包中奖列表 2023-07-03 17:48:02 +08:00
b9f1474362 【绑定账号】和【忘记密码】页面手机号码栏新增国家名字提示 2023-07-03 16:43:55 +08:00
18401019693
58508ca0ae 红包中奖列表 2023-07-03 13:05:29 +08:00
18401019693
5736265388 展示红包,领取红包接口逻辑对接 2023-06-30 16:03:37 +08:00
18401019693
e68d20252a 创建接口,红包展示接口 2023-06-30 10:17:33 +08:00
44b4b06592 退出直播间时移除加载错误的提示 2023-06-29 15:09:46 +08:00
fb7551f7d0 Merge branch 'master' into 6.5.3 2023-06-29 14:09:33 +08:00
18401019693
40455fffc9 红包打开创建领取的样式逻辑构建 2023-06-29 10:15:24 +08:00
195035c456 update 更换插件包下载地址 2023-06-28 18:22:30 +08:00
492003ff01 update 调整禁言对话框的文案 2023-06-28 17:37:30 +08:00
17c2e7f795 update 插件化判断代码 2023-06-28 17:37:10 +08:00
1a3d66553c 修复【直播间-多次点击用户名称,弹出多个主页资料框窗口】问题 2023-06-28 17:36:22 +08:00
710cddd3a7 Merge branch 'dev_6.5.3_红包' into 6.5.3 2023-06-28 16:49:23 +08:00
da7ebb2663 add 新增红包专区
add 新增红包专区进去是只有发放红包的直播间
add 新增首页红包浮窗
add 新增红包记录
2023-06-28 16:44:42 +08:00
6a6696f355 fix 修复测试服ios发消息安卓端收不到问题 2023-06-28 16:43:26 +08:00
368b002db6 update 直播间超时进入的提示 2023-06-27 14:19:34 +08:00
501a7b482b update 红包专区 2023-06-27 13:54:18 +08:00
18401019693
279575d80b 红包直播间展示样式构建 2023-06-26 18:04:58 +08:00
3bf594d0b5 update 红包记录列表 2023-06-26 14:57:11 +08:00
5f33fa38f6 update 禁言弹框ui标题 2023-06-26 10:24:19 +08:00
e0312eedd1 update 禁言弹框ui标题 2023-06-26 10:17:45 +08:00
69d8feb9a9 update 红包 2023-06-26 10:12:38 +08:00
500588c842 update 红包 2023-06-26 10:09:37 +08:00
0a70da82f0 Merge branch '6.5.3' into dev_6.5.3_红包 2023-06-25 17:02:33 +08:00
abbb8c524c 新增被禁言的提示 2023-06-25 16:19:55 +08:00
1334d173cf update 红包详情入口 2023-06-25 16:09:47 +08:00
f3ff37aea7 Merge branch 'fix_webview' into 6.5.3 2023-06-25 15:50:04 +08:00
9741be743c 新增直播播放器报错时提示
新增观众端看异常下播直播间提示
2023-06-25 14:18:40 +08:00
f54054283c 调整混淆清单 2023-06-25 13:50:48 +08:00
fd06243c22 优化下载直播插件流程 2023-06-25 11:31:19 +08:00
cef94a248e Merge branch 'dev_proguard' into 6.5.3 2023-06-25 09:53:43 +08:00
beb566b294 新增期间禁言功能 2023-06-25 09:51:29 +08:00
18401019693
6889828c00 消息中心新增【系统消息】类型 2023-06-20 17:46:31 +08:00
9c57f0bd96 修复webView显示问题 2023-06-17 17:22:11 +08:00
a1c96cfd0f 调整直播间分享链接 2023-06-16 15:30:21 +08:00
18401019693
1198a8f1d8 送礼交互优化 2023-06-15 15:27:46 +08:00
a255d1f2b5 update 2023-06-15 13:41:57 +08:00
53ce1c703e update 2023-06-14 17:59:08 +08:00
3f9e95ce7d 新增插件模块管理 2023-06-14 13:41:12 +08:00
18401019693
8e07d4523f 修改完善资料和礼物点击 2023-06-12 13:25:59 +08:00
29ddc54303 Merge branch 'master' into dev_proguard 2023-06-12 10:50:27 +08:00
ae9c050ae6 Merge remote-tracking branch 'origin/master' 2023-06-08 17:02:32 +08:00
7b61e8c562 修复Ranking.getAnchorRankData多次调用问题 2023-06-08 17:02:20 +08:00
18142669586
23a396864f 修改全服 2023-06-08 17:02:11 +08:00
af8052f65b 修复Ranking.getAnchorRankData多次调用问题 2023-06-08 15:21:24 +08:00
6603a2dbb5 修复Ranking.getAnchorRankData多次调用问题 2023-06-08 14:33:44 +08:00
f3a0b4d145 修复Ranking.getAnchorRankData多次调用问题 2023-06-08 14:20:15 +08:00
0c99324904 Merge remote-tracking branch 'origin/master' 2023-06-08 11:13:55 +08:00
8d077e8062 修复PK结束时会隐藏投票问题 2023-06-08 11:13:38 +08:00
18401019693
3aaafdbbbe 修改完善资料和礼物点击 2023-06-08 10:12:37 +08:00
18401019693
f4016089a1 修改完善资料和礼物点击 2023-06-06 15:28:00 +08:00
c53757c64b 调整WebView 2023-06-06 14:41:53 +08:00
c8c4352284 Merge branch 'master' into dev_proguard 2023-06-05 16:42:18 +08:00
18401019693
cd2e176f0a Merge branch 'dev_6.5.3' 2023-06-05 14:09:42 +08:00
e6d92ffc86 调整投票ui 2023-06-05 13:24:13 +08:00
ea0a3375e4 修复非粉丝通过送礼打开的粉丝团url不正确问题 2023-06-05 11:42:56 +08:00
18401019693
06357088c1 修改礼物类型 2023-06-05 10:36:27 +08:00
18401019693
fa24d226ee 6.5.2 2023-06-03 18:30:08 +08:00
18401019693
7eb8153744 6.5.2 2023-06-03 18:02:49 +08:00
18401019693
35f16bdcae 修改盲盒问题 2023-06-03 15:20:18 +08:00
18401019693
aacd8b8735 修改盲盒问题 2023-06-03 14:35:39 +08:00
9926997fd7 Merge remote-tracking branch 'origin/master' 2023-06-03 14:13:47 +08:00
b02cbd7831 Home.getConfig接口新增对1000错误码的处理 2023-06-03 14:13:29 +08:00
18401019693
4150eeed64 修改盲盒问题 2023-06-03 13:51:19 +08:00
18142669586
6e595ff1e4 Merge remote-tracking branch 'origin/master' 2023-06-03 11:48:37 +08:00
18142669586
fbc50229e8 修改关播页面英文显示问题 2023-06-03 11:45:57 +08:00
1edb07d76c 调整投票主播二次点击关闭按钮后直接关闭浮窗 2023-06-03 11:45:23 +08:00
9641d90f32 Merge remote-tracking branch 'origin/master' 2023-06-03 11:33:13 +08:00
3095438a5c 调整排行榜榜单样式
调整排行榜神秘人隐藏关注按钮导致整体UI下降
2023-06-03 11:08:17 +08:00
18401019693
067bbc70c5 修改盲盒问题 2023-06-03 10:35:52 +08:00
7201fd37f3 修复排行榜神秘人ui错乱问题 2023-06-02 18:00:28 +08:00
18401019693
0bab58d507 修改盲盒问题 2023-06-02 13:52:29 +08:00
18401019693
f1ac21fe87 Merge remote-tracking branch 'origin/master' 2023-06-02 13:13:14 +08:00
18401019693
f4b5cdfed3 修改直播间展示ID 2023-06-02 13:13:07 +08:00
9021659770 修复在进入直播间瞬间关播的“抱歉出错了”提示 2023-06-02 11:31:25 +08:00
e04d277560 修复修改投票中英文导致的界面语言混乱问题 2023-06-02 11:17:08 +08:00
18142669586
a7a9a28c09 Merge remote-tracking branch 'origin/master' 2023-06-02 10:27:48 +08:00
18142669586
bbd394044f 修改关播页面英文显示问题 2023-06-02 10:27:36 +08:00
18401019693
49df393781 Merge remote-tracking branch 'origin/master' 2023-06-02 10:04:40 +08:00
18401019693
f0a8c17401 修改盲盒连宋 2023-06-02 10:04:32 +08:00
a01ddd310b 新增投票观众端的中英文切换 2023-06-02 09:56:24 +08:00
18401019693
26ec74932f 修改盲盒蒙版 2023-06-01 18:16:58 +08:00
18401019693
3aa85ca9bb 直播间房间号加ID 2023-06-01 15:56:06 +08:00
18401019693
a67c2b4009 修改榜单头像框问题 2023-06-01 15:39:24 +08:00
9486a1a572 修复下播页面关注按钮在英文状态下自动换行问题 2023-06-01 15:12:17 +08:00
c1aa8188ce 修复机器人自动打招呼条数超过20条问题 #74 2023-06-01 14:58:42 +08:00
18401019693
a83e3e0511 添加中英文翻译 2023-06-01 13:56:05 +08:00
18401019693
3488da27f0 盲盒加判断是不是本人 2023-06-01 10:26:08 +08:00
56845de59d 修复在线客服页面输入法会挡住输入框的问题 2023-05-31 16:51:00 +08:00
18401019693
282790ead5 Merge remote-tracking branch 'origin/master' 2023-05-31 13:59:28 +08:00
18401019693
db165cc05d 盲盒礼物开箱动画 2023-05-31 13:22:14 +08:00
49313ca326 修复PK滑动直播间可能画面错乱问题 2023-05-29 15:25:15 +08:00
18401019693
b0008405e2 Merge branch 'master' into dev_blind_box 2023-05-29 11:35:17 +08:00
18401019693
9c32c6af25 添加盲盒礼物蒙版 2023-05-29 11:34:34 +08:00
baa2ec127f 调整播放器在停止播放时把play2也一并停止 2023-05-29 11:25:30 +08:00
18401019693
c3b5f17f44 Merge branch 'master' into dev_blind_box
# Conflicts:
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
2023-05-27 18:25:14 +08:00
18401019693
c28a91b128 修复榜单头像框问题 2023-05-27 17:22:13 +08:00
18401019693
f064864d76 修改榜单神秘人 2023-05-27 15:17:31 +08:00
18401019693
66290323d8 盲盒全服通知逻辑 2023-05-27 11:40:09 +08:00
9526a14ca2 调整聊天区高度 2023-05-27 11:24:28 +08:00
27715cda2c 新增投票创建失败时的提示语 2023-05-26 14:24:29 +08:00
65bfc77376 修复直播结束数据界面,直播时长未对齐问题 2023-05-25 14:34:39 +08:00
99618a2779 新增IM消息:endPK,用于显示最终单人PK数据 2023-05-25 14:25:57 +08:00
1b637b7a77 修復开屏动态聚焦banner有图片溢出问题 2023-05-25 14:18:00 +08:00
6ee678bd74 开播频道屏蔽【男神】 2023-05-25 13:41:39 +08:00
18401019693
b4dc035a1b 盲盒礼物具体业务逻辑的构建,IM消息的构建 2023-05-25 13:40:49 +08:00
18401019693
1f7aef91a8 礼物盲盒基本逻辑 2023-05-24 14:50:39 +08:00
18401019693
3e72b4a9eb 修改设置页面防抖问题,登录loading加载问题 2023-05-22 16:57:12 +08:00
18401019693
4f103dadc9 修改防抖点击问题 2023-05-22 16:48:55 +08:00
18401019693
055d002a34 Merge remote-tracking branch 'origin/master' 2023-05-19 13:33:17 +08:00
18401019693
426f7450a2 修复心愿单问题 2023-05-19 13:33:09 +08:00
73a71dabc6 Merge remote-tracking branch 'origin/master' 2023-05-19 10:43:11 +08:00
435dc1c4fb 调整投票UI 2023-05-19 10:36:06 +08:00
18401019693
f347d283a0 修复心愿单问题 2023-05-19 10:36:03 +08:00
a6754eb503 补充资源 2023-05-18 15:38:55 +08:00
070312ff53 投票修复测试回报问题 2023-05-18 15:02:11 +08:00
bd8cf94171 调整投票隐藏按钮触控范围 2023-05-18 11:21:53 +08:00
98bb182d56 调整投票展示效果 2023-05-18 10:52:59 +08:00
3454b6f924 调整投票展示效果 2023-05-18 10:31:52 +08:00
5af061c26f update 2023-05-17 17:37:34 +08:00
83a240fcb8 update 2023-05-17 16:57:11 +08:00
17decb63fa Merge remote-tracking branch 'origin/master'
# Conflicts:
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
2023-05-17 16:48:02 +08:00
18401019693
dbe861c608 中英文资源文件 2023-05-17 16:40:50 +08:00
c1c8921f59 Merge branch 'dev_6.5.2'
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	common/src/main/res/values-en-rUS/string.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java
2023-05-17 16:20:10 +08:00
82b3b23470 提交主播投票功能 2023-05-17 16:14:50 +08:00
18401019693
e28c6228ad 清晰度选择提示弹窗问题修复 2023-05-17 16:14:42 +08:00
df0f5f31e0 提交主播投票功能 2023-05-17 15:12:51 +08:00
18401019693
2a6af7c165 清晰度选择提示弹窗问题修复 2023-05-17 13:36:15 +08:00
18401019693
8611817a6a 修改礼物界面的切换逻辑 2023-05-17 13:26:15 +08:00
18401019693
e4c48f948d 完善个人资料,修改getBaseInfos接口返回缓存问题 2023-05-13 17:30:19 +08:00
46e37b14e4 修复从【我的】-【獎勵中心】進去无法唤起邀请对话框的问题 2023-05-13 15:35:08 +08:00
0d86d142c9 修复从侧边栏任务进去的邀请任务无法唤起邀请对话框的问题 2023-05-13 14:47:35 +08:00
18401019693
96cbadac2c 完善个人资料,修改getBaseInfos接口返回缓存问题 2023-05-11 15:05:33 +08:00
18401019693
f8356b1283 完善个人资料,修改getBaseInfos接口返回缓存问题 2023-05-11 14:57:36 +08:00
18401019693
576d39461a 完善个人资料,离开修改页面提示弹窗,完成领取弹窗 2023-05-11 14:34:39 +08:00
18401019693
8410439a90 完善个人资料,选择性别弹窗构建 2023-05-11 10:26:05 +08:00
18401019693
73b075b2a7 完善个人资料,编辑页面调整,领取奖励页面构建 2023-05-10 15:30:36 +08:00
a6b5c102d2 新增【非贵族,守护,粉丝牌送礼交互优化】功能 2023-05-10 14:31:15 +08:00
18401019693
229c8e72cf 完善个人资料,我的页面修改,红点提示逻辑 2023-05-10 13:09:46 +08:00
18401019693
f99bef4ac8 完善个人资料, 2023-05-09 17:37:20 +08:00
34c569ecb5 update config 2023-05-09 14:40:38 +08:00
a041450766 update config 2023-05-09 10:09:03 +08:00
b5673025be fix修复line支付无法唤起app的问题 2023-05-08 14:05:43 +08:00
f0ddd98942 fix修复line支付无法唤起app的问题 2023-05-08 14:04:43 +08:00
e9488df780 update 2023-05-08 13:29:24 +08:00
18401019693
e67287e7d3 修改密码房退出页面问题 2023-04-27 17:00:22 +08:00
18401019693
4b8dd546ce 修改密码房退出页面问题 2023-04-27 11:05:06 +08:00
18401019693
319a23bf2d 修改,中英文问题(聊天框的中英文修改) 2023-04-26 10:16:11 +08:00
611f1da9b8 fix banner顺序不对的问题 2023-04-25 16:45:01 +08:00
1953b5a776 update 调整say关注边距(陈浩反馈) 2023-04-25 15:51:02 +08:00
18401019693
43deb95435 修改,中英文问题(聊天框的中英文修改) 2023-04-25 15:24:57 +08:00
5a9535e81d update 调整登录页登录按钮的位置 2023-04-25 10:00:57 +08:00
18401019693
097528f97a 修改,中英文问题(默认加载系统语言) 2023-04-24 17:31:28 +08:00
abe71808fb Merge remote-tracking branch 'origin/master' 2023-04-24 17:00:56 +08:00
59508a45cb 修复粉丝徽章帮助按钮点击没反应问题 2023-04-24 17:00:43 +08:00
18401019693
11bc23418e 注销账号功能添加 2023-04-24 16:03:20 +08:00
18401019693
5a5164f72b 注销账号功能添加 2023-04-20 17:59:51 +08:00
18401019693
381ca84525 注销账号功能添加 2023-04-20 16:46:10 +08:00
79a709a76f update 开屏过度动画接口开关 2023-04-20 15:10:57 +08:00
18401019693
5dcdd3fc5f 多语言切换 2023-04-19 16:38:56 +08:00
1dce512d27 update 2023-04-19 14:17:01 +08:00
840129651d update 2023-04-19 14:13:11 +08:00
59c19d996e Merge remote-tracking branch 'origin/master' 2023-04-19 14:08:07 +08:00
703bafa013 修复侧边栏UI在英文状态下显示不全的问题 2023-04-19 14:07:56 +08:00
18401019693
9e6e25fb9e 多语言切换 2023-04-19 14:02:45 +08:00
bddf8c71ae 移除调试代码 2023-04-19 13:55:18 +08:00
47c3282861 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	common/src/main/res/values-zh-rHK/strings.xml
#	common/src/main/res/values-zh-rTW/strings.xml
#	common/src/main/res/values-zh/strings.xml
#	common/src/main/res/values/strings.xml
#	main/src/main/java/com/yunbao/main/views/MainHomeLiveViewHolder.java
2023-04-19 10:58:02 +08:00
181ff4274c 新增字号设置 2023-04-19 10:54:22 +08:00
18401019693
dc5633bcb9 多语言切换 2023-04-19 10:16:56 +08:00
369f3f2cae 开屏图片转Banner特效 2023-04-18 16:31:31 +08:00
18401019693
293c9dcf9e 多语言切换 2023-04-18 14:51:26 +08:00
18401019693
d0e2278df7 多语言切换 2023-04-18 13:45:21 +08:00
f913248fa1 暂存方案1 2023-04-18 11:03:07 +08:00
18401019693
098ef7aa36 多语言切换 2023-04-18 10:30:55 +08:00
18401019693
bfbbe54308 多语言切换 2023-04-17 16:30:12 +08:00
18401019693
32e3584fef 修改侧边栏跳转问题 2023-04-14 16:09:02 +08:00
18142669586
90c7483dbc 修改关注点击问题 2023-04-14 13:41:52 +08:00
18401019693
e38262826d 关注ui修改,多人pk倒计时问题 2023-04-14 10:59:06 +08:00
18401019693
cbb1531356 心愿单位置移动 2023-04-14 10:46:13 +08:00
18401019693
0ed37aee11 心愿单位置移动 2023-04-14 10:40:14 +08:00
18401019693
c23ed7defb 心愿单位置移动 2023-04-13 18:25:19 +08:00
18401019693
06e077146b 心愿单位置移动 2023-04-13 17:57:40 +08:00
10588e4810 Merge remote-tracking branch 'origin/master' 2023-04-13 17:23:41 +08:00
4b7469d9d4 调整女神说banner布局 2023-04-13 17:23:29 +08:00
18142669586
eb21a17475 修改连麦样试 2023-04-13 17:22:05 +08:00
18142669586
974546697b Merge remote-tracking branch 'origin/master' 2023-04-13 16:45:07 +08:00
18142669586
8507fc1bb7 修改连麦样试 2023-04-13 16:44:41 +08:00
18401019693
bb4f8bb98e 心愿单设置加限制 2023-04-13 16:44:40 +08:00
4a4cc179bf 修复单人PK结算后新进来竖屏直播间,画面异常问题 2023-04-13 16:26:57 +08:00
18142669586
db8dc2a781 修改连麦样试 2023-04-13 15:57:11 +08:00
18401019693
4ae1b12be0 心愿单设置加限制 2023-04-13 15:45:51 +08:00
18401019693
06289b44d9 心愿单设置加限制 2023-04-13 13:08:58 +08:00
18401019693
32fa77be39 心愿单逻辑修改,ui修改 2023-04-13 13:04:12 +08:00
18142669586
9869a2376c 修改toat样试 2023-04-13 11:42:15 +08:00
af4176bcb7 移除ACache读取后最后一个换行符 2023-04-13 10:43:07 +08:00
499b73295d 修复人气票没传liveuid和stream问题 2023-04-13 10:07:42 +08:00
bec764a329 修复从直播间个人中心进去的分享按钮没反应问题 2023-04-12 15:26:57 +08:00
58c988a83a 修复ACache读多行文本未换行问题 2023-04-12 13:15:33 +08:00
18401019693
0506d82165 修改热度加成逻辑展示方式 2023-04-11 16:17:26 +08:00
cfc72f7441 根据需求调整送过一次联系方式礼物后,以后点击联系方式都是直接打开信件详情 2023-04-11 14:37:39 +08:00
18401019693
b305ba925b 修改热度加成逻辑展示方式 2023-04-11 14:14:42 +08:00
e99b18eec6 调整女神说ui 2023-04-10 18:22:37 +08:00
18401019693
38b080f082 6.5.0 2023-04-10 16:07:18 +08:00
18142669586
605f10d0ac 英文包 2023-04-10 15:37:19 +08:00
18142669586
f7480c6e43 修改中英文 2023-04-10 13:44:39 +08:00
ceef0f1e57 修改联系方式 2023-04-10 13:37:57 +08:00
18401019693
19c0c8c6e7 修改生成心愿单 2023-04-10 13:30:47 +08:00
d50c56bbb2 update 2023-04-10 13:07:08 +08:00
8ce65ced30 调整分享附带文案 2023-04-10 11:57:35 +08:00
18401019693
80e93f9981 关注消息修改 2023-04-10 11:54:25 +08:00
a34e90753c Merge remote-tracking branch 'origin/master' 2023-04-10 11:45:41 +08:00
a53da7a2b8 修复通过头像跳转到其他PK直播间,再上下滑回来会依旧保持PK倒计时状态 2023-04-10 11:45:15 +08:00
18401019693
bdd6124300 关注消息修改 2023-04-10 11:42:22 +08:00
47c3f59f74 修复通过头像跳转到其他PK直播间,再上下滑回来会依旧保持PK倒计时状态 2023-04-10 11:33:14 +08:00
76f94895fe 调整直播间UI 2023-04-10 11:14:53 +08:00
e0eea59539 调整直播间UI 2023-04-10 11:07:35 +08:00
18401019693
917d237b6d 关注消息修改 2023-04-10 10:45:07 +08:00
508f1a52ae 调整直播间UI 2023-04-10 10:22:32 +08:00
18401019693
4429dc7a4c 小助手消息修改 2023-04-10 10:05:48 +08:00
18401019693
296a6d24bb 心愿单修改 2023-04-10 09:57:24 +08:00
18142669586
6c19f0efc4 心愿单审核和贵族购买 2023-04-08 18:21:53 +08:00
18401019693
6f7a9a9310 心愿单修改 2023-04-08 18:11:35 +08:00
66e011f2d3 修复女神说主播端不隐藏的问题 2023-04-08 17:33:52 +08:00
18142669586
9e7909ec70 Merge remote-tracking branch 'origin/master' 2023-04-08 17:29:36 +08:00
18142669586
8ae58e9c14 心愿单审核和贵族购买 2023-04-08 17:27:26 +08:00
18401019693
2ce527cee8 心愿单修改 2023-04-08 17:26:39 +08:00
18401019693
28ef982b74 心愿单修改 2023-04-08 16:42:43 +08:00
b44524b25f 修复女神说不隐藏的问题 2023-04-08 16:27:33 +08:00
f76d649233 调整联系方式浮标UI 2023-04-08 16:20:43 +08:00
90fee86c19 修复信息红点显示错误问题 2023-04-08 16:11:41 +08:00
9707898af9 调整直播间UI
修复心愿单浮窗一堆问题
2023-04-08 15:45:47 +08:00
18401019693
9c3fbe0506 心愿单修改 2023-04-08 15:10:16 +08:00
a8178c51a0 调整直播间UI
修复进入直播间快速退出导致的闪退问题
2023-04-08 14:57:22 +08:00
18142669586
2b62d018b5 Merge remote-tracking branch 'origin/master' 2023-04-08 14:14:19 +08:00
18142669586
f7cf72f15f 修改聊天框长度 2023-04-08 14:14:06 +08:00
18401019693
b3d4d2b8f9 xiu gai xinyuan dan 2023-04-08 13:36:12 +08:00
18401019693
8cbbd4015f xiu gai xinyuan dan 2023-04-07 17:34:39 +08:00
51bf55fdeb 修复主播端开播热度值没背景 2023-04-07 16:46:20 +08:00
18401019693
18a5f46133 高等级飘屏修改 2023-04-07 16:44:02 +08:00
f201e0978e 修复主播端开播后点击屏幕无效问题 2023-04-07 16:23:10 +08:00
18401019693
63c2891650 心愿单修改, 2023-04-07 16:07:08 +08:00
af164f549f 修复开播后点击屏幕闪退问题
调整女神说背景固定大小
2023-04-07 16:01:59 +08:00
33034ce4d6 调整心愿单浮标大小
修复注册默认值没香港标识
调整小助手图片位置
2023-04-07 15:37:51 +08:00
18401019693
9d38ff7c8f 心愿单修改, 2023-04-07 15:28:19 +08:00
16caf60f77 更换心愿单浮标背景图
优化分享字符过多显示不全问题
优化女神说浮窗字数过多超过背景图问题
2023-04-07 14:45:12 +08:00
f3bca96ee8 Merge remote-tracking branch 'origin/master' 2023-04-07 14:43:57 +08:00
18142669586
b0ed276e23 修改新人任务的展示 2023-04-07 14:42:07 +08:00
906ff6cfa6 调整观众端点联系方式送礼界面恢复分类tab 2023-04-07 14:02:41 +08:00
6427311cec 修复单人PK发起方会重复两次倒计时问题 2023-04-07 13:58:18 +08:00
181f081706 修复单人PK会丢失结束连麦按钮问题 2023-04-07 11:34:24 +08:00
14490cacfa 修复多人PK不会隐藏女神说和联系方式的问题 2023-04-07 10:57:24 +08:00
6ff83dabff 调整信件top ui 2023-04-07 10:26:46 +08:00
a6d81ef666 移除测试用toast 2023-04-07 09:48:31 +08:00
11679a62a0 Merge remote-tracking branch 'origin/master' 2023-04-06 14:29:41 +08:00
36410ddcaa 调整女神说6字改回4字 2023-04-06 14:29:12 +08:00
18401019693
3bf6518e25 心愿单修改, 2023-04-06 14:20:46 +08:00
18142669586
028f2794bf Merge remote-tracking branch 'origin/master' 2023-04-06 13:32:18 +08:00
18142669586
1c198a44cf 页面修改 2023-04-06 13:31:52 +08:00
1fba3bd53e 调整邀请框的【复制】按钮位置和添加边框 2023-04-06 11:02:30 +08:00
fd15428ed9 新增主播联系方式详情页 2023-04-06 10:34:45 +08:00
18401019693
a5fd14cc0e 去除心愿单礼物贵族和守护的金额 2023-04-03 18:02:29 +08:00
18401019693
3c7a2d3964 心愿单增加礼物金额 2023-04-03 17:57:47 +08:00
18401019693
325d7254f0 视图资源文件修改,心愿单上传数据修改 2023-04-03 15:39:12 +08:00
18401019693
153d5ff159 修改心愿单生成 2023-04-03 15:29:21 +08:00
a86cf97d74 Merge remote-tracking branch 'origin/master' 2023-04-03 15:16:51 +08:00
192587f758 新增通过后端获取国家地区信息接口在注册时自动填写号码编号 2023-04-03 15:15:50 +08:00
18142669586
5697a19f91 Merge remote-tracking branch 'origin/master' 2023-04-03 15:10:13 +08:00
18142669586
1fa1874241 分享邀请码注册绑定 2023-04-03 15:07:48 +08:00
c43b581157 调整联系方式选项 2023-04-03 14:48:35 +08:00
ba5a80fb1d 改回联系方式礼物接口,仅显示热门分类下的礼物 2023-04-03 14:19:22 +08:00
73c8db8fb4 新增通过后端获取国家地区信息接口
调整送联系方式礼物时,不选择其他礼物
调整联系方式礼物接口
调整在模拟器超大分辨率模式下,信箱ui异常问题
2023-04-03 13:28:35 +08:00
18401019693
f55e1b9c05 修改 2023-04-02 17:29:14 +08:00
18401019693
e5a07613aa 修改随机pk轮播背景展示问题 2023-04-02 17:22:10 +08:00
ed46eb30a8 更新功能翻译资源 2023-04-02 17:22:05 +08:00
18401019693
971fceebcd 修改随机pk轮播背景展示问题 2023-04-02 16:37:05 +08:00
18401019693
329bd63229 新增功能翻译资源 2023-04-02 16:31:11 +08:00
18401019693
d320373b07 侧边栏修改,新增播放设置 2023-04-02 14:22:30 +08:00
326bb5ae7f 修复PK倒计时偶尔会提前结束问题(设置倒计时默认值为100解决)
修复PK【开始/结束】不会【隐藏/显示】女神说和联系方式浮窗
2023-04-01 18:29:12 +08:00
18401019693
95c39cca9d 心愿单直播间轮播入口(没有设置就隐藏) 2023-04-01 15:51:52 +08:00
18401019693
849677e50e 心愿单直播间轮播入口 2023-04-01 14:45:48 +08:00
c4ae047a4b 移除分享的结果的Toast 2023-04-01 11:33:20 +08:00
5657d5a00b 修正侧边栏【分享】按钮的文字 2023-04-01 11:22:51 +08:00
4b6b477351 Merge remote-tracking branch 'origin/master' 2023-04-01 11:18:17 +08:00
d035018ada 移除调试代码 2023-04-01 11:18:04 +08:00
e301e7bfce Merge branch 'dev_share'
# Conflicts:
#	main/src/main/java/com/yunbao/main/views/MainHomeViewHolder.java
2023-04-01 11:15:18 +08:00
97ad5c2d92 update 调整女神说布局大小 2023-04-01 11:14:24 +08:00
43e7713f6b update 兼容女神说接口变动 2023-04-01 09:51:26 +08:00
18142669586
cfce501d45 分享邀请码注册绑定 2023-04-01 09:44:13 +08:00
18401019693
b2f35fdc16 修复豪气榜神秘人问题 2023-03-31 17:52:00 +08:00
87afe9297d 移除调试内容 2023-03-31 17:32:52 +08:00
48f1d42739 Merge branch 'dev_use_discounts'
# Conflicts:
#	common/src/main/res/values/strings.xml
2023-03-31 17:27:24 +08:00
9eed92302d add 购买守护使用优惠卷 2023-03-31 17:26:28 +08:00
18401019693
f12f6a9130 心愿单完成 2023-03-31 16:44:22 +08:00
ef757a8adc update 分享支持社区分享按钮 2023-03-31 15:09:18 +08:00
0177a1314d update 购买守护优惠卷 2023-03-31 14:40:43 +08:00
26cb58463a update 直播間分享 2023-03-31 13:34:57 +08:00
18401019693
d1d8054c01 心愿单的重置提示 2023-03-30 17:43:42 +08:00
18401019693
2db89365bb 季心愿单的设置与展示 2023-03-30 16:46:02 +08:00
18401019693
87ba382e81 月心愿单的设置与展示 2023-03-30 16:36:53 +08:00
18401019693
55290a71aa 周心愿单的设置与展示 2023-03-30 16:28:06 +08:00
18401019693
5095de3c43 日心愿单重置 2023-03-30 16:17:25 +08:00
18401019693
70a91fedf3 心愿单添加部分功能实现 2023-03-30 14:16:50 +08:00
ef8f87d100 Merge branch 'master' into dev_share 2023-03-30 11:47:44 +08:00
6d83c6f8ae Merge branch 'dev_6.5.0_anchor_call_me'
# Conflicts:
#	common/src/main/java/com/yunbao/common/manager/IMLoginManager.java
#	common/src/main/res/values/strings.xml
#	live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java
2023-03-30 11:31:32 +08:00
ce2048b9a5 update 女神说主播端显示
update 联系方式改成svga
update PK时隐藏女神说和联系方式
2023-03-30 11:23:11 +08:00
c22da60b82 update 联系方式 2023-03-29 13:39:09 +08:00
c78bb79633 update 联系方式
update 女神说
2023-03-29 13:32:15 +08:00
3a980d22fd Merge branch 'dev_6.5.0_anchor_say' into dev_6.5.0_anchor_call_me
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
#	main/src/main/java/com/yunbao/main/views/MainHomeViewHolder.java
2023-03-28 11:01:58 +08:00
2b56eff39a update 联系方式 2023-03-27 16:16:23 +08:00
18401019693
9472ccf6c8 修改整蛊界面 2023-03-27 16:00:23 +08:00
18401019693
59d384a81c 修改右下角任务浮标,星级挑战修改 2023-03-27 15:30:30 +08:00
18401019693
c02f24fdcd 修改礼物图标 2023-03-27 15:29:43 +08:00
18401019693
86c5334ab4 高等级入场提示 2023-03-27 14:22:29 +08:00
6ef8c3778b update 女神说 2023-03-27 11:09:03 +08:00
0c6eac2936 新增设置联系方式相关UI 2023-03-24 10:52:44 +08:00
18401019693
62e2b93bd5 修改特权页面背景 2023-03-23 17:43:44 +08:00
18401019693
d80bc3bd27 默认气泡的修改 2023-03-23 17:28:34 +08:00
18401019693
085f19c3ca 修改直播间聊天界面(横竖屏聊天框高度,关注消息修改)直播间头部布局样式修改 2023-03-23 16:36:16 +08:00
f4d23c57df 新增女神说相关UI 2023-03-23 14:26:52 +08:00
18401019693
95429402c7 修改礼物界面样式 2023-03-22 18:20:34 +08:00
18401019693
1da79d6f48 礼物界面,直播间下部按钮布局样式的更改 2023-03-22 18:16:40 +08:00
18401019693
926bd1a22e 直播间聊天内容等级样式更改 2023-03-22 16:57:50 +08:00
18401019693
554bfa137a 消息气泡位置,关注消息默认消息,样式更改 2023-03-22 16:55:51 +08:00
9e5a61f66c update 2023-03-21 18:20:11 +08:00
18401019693
be608fd90b 修改直播间聊天字体背景样式 2023-03-21 17:42:34 +08:00
c9e53b4dfd Merge branch 'master' into dev_share
# Conflicts:
#	app/src/main/java/com/shayu/phonelive/NeverCrashUtils.java
#	config.gradle
#	main/src/main/java/com/yunbao/main/activity/TestActivity.java
2023-03-21 15:00:53 +08:00
c2aba5da4b 优化:调整直播间聊天输入框点击发送后不隐藏软键盘和聊天框 2023-03-21 10:05:02 +08:00
18401019693
420118b652 修改界面的中英文 2023-03-17 15:12:18 +08:00
18401019693
076008ce89 修改界面的中英文 2023-03-17 14:52:55 +08:00
18401019693
8455d1253c 修改界面的中英文 2023-03-17 10:19:35 +08:00
07f8f46f1f 修复:部分用户无法上麦问题
优化:日志上报逻辑
2023-03-17 09:50:26 +08:00
18401019693
8b46c57482 修复推特登录问题 2023-03-15 18:12:01 +08:00
18401019693
db834caf00 Merge branch 'net_error' 2023-03-15 18:11:49 +08:00
5c1eef1419 移除一个toast 2023-03-15 18:11:07 +08:00
fe29d307a9 修复连麦时可能出现50007问题,出现该错误时尝试离开房间后重试加入 2023-03-15 15:49:56 +08:00
18401019693
b8fea6366c 修复推特登录问题 2023-03-14 16:20:23 +08:00
06dddb5273 修复无法唤起推特APP登录 2023-03-14 16:18:40 +08:00
d774296db9 Merge remote-tracking branch 'origin/master' 2023-03-10 16:01:06 +08:00
18401019693
077cc7fd80 修改网络报错提示 2023-03-10 16:00:06 +08:00
18401019693
fdf9d0aea2 多人PK问题修复 2023-03-10 15:48:34 +08:00
92c38dc0dc Merge remote-tracking branch 'origin/master' 2023-03-10 11:24:10 +08:00
18401019693
d8c4b9dd04 多人PK问题修复 2023-03-10 11:06:08 +08:00
18401019693
342b2e9139 多人PK问题修复 2023-03-10 11:05:19 +08:00
88ea48b6ca 新增debug日志控制,方便调出日志用于分析问题 2023-03-09 10:26:10 +08:00
18401019693
0726c5dc1c 多人PK热度加成问题,主播,用户 2023-03-04 16:42:25 +08:00
18401019693
046adc9340 修改多人Pk界面样式 2023-03-04 16:01:27 +08:00
18401019693
46fa2419d3 修改多人Pk界面样式 2023-03-04 15:32:41 +08:00
18401019693
5c5114f808 修改多人Pk界面样式 2023-03-04 15:04:49 +08:00
18401019693
7f2f7ea4d8 修改多人Pk界面样式 2023-03-04 14:31:09 +08:00
a89c441555 修复密码登录界面按物理返回按钮时会回到桌面的问题 2023-03-04 13:56:50 +08:00
a1762bc791 修复密码登录界面点返回按钮时会回到桌面的问题
优化尝试重连im时检测到登录信息失效后返回到登录界面
2023-03-04 13:40:58 +08:00
34432e5ccf 移除闪退提示 2023-03-01 17:17:22 +08:00
18401019693
46f20c9663 修改主播协议的指向 2023-02-28 17:33:25 +08:00
18142669586
e0753ebb29 7.0弹出提示 2023-02-28 16:55:31 +08:00
18142669586
d7d24904bf 單人PK卡0分 優化計算中 2023-02-28 16:54:20 +08:00
18142669586
abbc2fc4ee 單人PK卡0分 優化計算中 2023-02-28 16:46:52 +08:00
07f0f39978 Merge remote-tracking branch 'origin/master' 2023-02-28 15:50:33 +08:00
8d932a09e1 修复与苹果端PK结束后,对方头像依旧存在的问题 2023-02-28 15:50:20 +08:00
18401019693
34c855fc8f di ban ben 2023-02-28 15:19:22 +08:00
18401019693
824d431a63 添加主播消息空页面 2023-02-28 13:06:48 +08:00
af63c4c8ac Merge remote-tracking branch 'origin/master' 2023-02-28 09:37:44 +08:00
18401019693
16ba71493e Android7及7以下默认关闭动画特效 2023-02-27 18:14:44 +08:00
94f8ee7f3b 调整日志格式 2023-02-27 16:33:40 +08:00
e7c97f2b55 移除debug入口 2023-02-27 11:35:22 +08:00
18401019693
a7e6efa0dc Merge branch 'live_anchor_6.4.8' 2023-02-27 11:12:45 +08:00
18401019693
ea9807dcdc 主播协议, 2023-02-24 14:22:49 +08:00
fdd30aa52a 修复多人连麦第三位麦克风位置不正确的问题 2023-02-23 16:54:01 +08:00
18401019693
ba23f720eb 修改社区没办法送礼问题 2023-02-23 14:20:05 +08:00
05ede89cba 修复和助手端进行PK时,助手结束PK,手机端依旧残留结束连麦按钮 2023-02-22 16:26:55 +08:00
d6eddeb130 更新主播任务 2023-02-22 13:50:40 +08:00
bf4710470f 直播数据对接接口 2023-02-21 16:29:50 +08:00
5d2a246916 直播任务对接接口 2023-02-21 13:46:08 +08:00
cca8f43f61 直播任务对接接口 2023-02-20 17:16:37 +08:00
18401019693
1d66a9b7fb 主播用户协议 2023-02-20 16:43:36 +08:00
18401019693
c1c4a7a38b 添加直播任务和直播数据入口 2023-02-18 15:01:16 +08:00
18401019693
b8a91a85e4 Merge remote-tracking branch 'origin/dev_6.4.9' into live_anchor_6.4.8 2023-02-18 14:34:48 +08:00
18401019693
7cb7258210 直播计时功能添加 2023-02-18 13:57:37 +08:00
18401019693
8d823f7a07 主播消息中心功能构建 2023-02-18 13:21:59 +08:00
6d458d0c7f 更新string 2023-02-18 11:09:27 +08:00
eaed7e448b 新增主播数据弹窗 2023-02-18 11:05:06 +08:00
b2f779f58a 新增主播数据弹窗 2023-02-18 11:03:49 +08:00
79ded6bff4 新增主播任务对话框模块 2023-02-17 17:14:01 +08:00
18401019693
d86e16c9f5 修改注册页面选择国家区号功能,添加国家名称 2023-02-15 15:57:53 +08:00
f2cff3b93f 移除闪退测试入口 2023-02-15 14:05:16 +08:00
18401019693
e97a4e607c 添加多人PK名称点击 2023-02-14 15:04:58 +08:00
4d86317ec8 修复发生闪退时会回到社区且连不上IM的问题 2023-02-14 14:42:58 +08:00
d36ece4c54 新增测试闪退入口:在首页长按排行榜图标触发空指针 2023-02-13 16:28:11 +08:00
11cf971514 移除全局异常捕获后杀死进程功能 2023-02-13 16:25:04 +08:00
60da453114 移除全局异常捕获后杀死进程 2023-02-13 16:05:20 +08:00
18401019693
3d5ac05d36 去除非必要提示影响用户体验感 2023-02-13 15:09:54 +08:00
a50a7140fd update Share 2023-02-13 11:21:40 +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
15b232f52a update Share 2023-02-09 10:04:13 +08:00
3c80038bef update Share 2023-02-08 16:01:35 +08:00
a808cd13c0 修复直播间PK时滑动到下一个PK直播间,会残留pk条观众头像问题 2023-02-07 17:04:51 +08:00
ce8088059a 暂存测试几个用intent打开分享的平台 2023-02-07 15:45:42 +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
d14939c893 create ShareUtil 2023-02-06 15:57:56 +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
862ec98fa3 Merge remote-tracking branch 'origin/master' 2022-12-14 18:12:10 +08:00
b827f7bfa6 修复主播可以自己点整蛊拯救的问题
调整整蛊设置
2022-12-14 18:11:41 +08:00
18401019693
786dfb54a3 Merge remote-tracking branch 'origin/master' 2022-12-14 18:10:34 +08:00
18401019693
a373738d70 修复:修复直播间滚动Loading问题 2022-12-14 18:10:21 +08:00
6929276512 移除DEBUG位置 2022-12-14 17:40:52 +08:00
64c33f5709 调整整蛊的UI位置 2022-12-14 17:33:22 +08:00
7330e1ae2b Merge remote-tracking branch 'origin/master'
# Conflicts:
#	config.gradle
2022-12-14 17:32:42 +08:00
f359c9994d 修复PK过程中可以再次打开PK对话框的问题 2022-12-14 17:25:03 +08:00
d49b60a1e1 修复直播间不显示靓号问题 2022-12-14 17:13:25 +08:00
18401019693
ee2cebdc41 修复:修复主播关播数据不展示问题 2022-12-14 17:08:09 +08:00
1407ecc2f2 修复随机PK天梯赛不出现的问题 2022-12-14 16:45:43 +08:00
18401019693
606fc64262 修复:修改主播播放时长位置 2022-12-14 16:31:43 +08:00
a5516ebfb3 移除一处debug位置 2022-12-14 15:35:20 +08:00
dd7214a945 Merge remote-tracking branch 'origin/master' 2022-12-14 14:44:06 +08:00
a20571e050 修复一处Glide的Contexts可能为空的问题 2022-12-14 14:43:28 +08:00
8f7adb3079 修复禁言IM消息过来时,uid可能为空的问题 2022-12-14 14:36:28 +08:00
adcf005e62 修复MainActivity初始化initTXIM时,登录信息失效导致getUid为空的问题 2022-12-14 14:18:25 +08:00
18401019693
8cff0195ad 修复:观看直播时,在直播间内主播Pk不展示对方主播头像问题 2022-12-14 14:08:38 +08:00
98940d7554 修复聊天室添加粉丝徽章,bitmap被回收的问题 2022-12-14 13:57:46 +08:00
4a8c29365c 修复CrashSaveBean的activities数组可能为空的问题 2022-12-14 13:44:22 +08:00
b641a65117 修复IMLoginManager的userInfo可能为空的问题 2022-12-14 13:42:36 +08:00
18401019693
d747407d6b 修复单人PK坐席头像展示问题 2022-12-14 13:08:03 +08:00
f302155912 update Pk补充注释 2022-12-14 11:37:00 +08:00
18401019693
3d60814538 修复单人PK坐席头像展示问题 2022-12-14 11:02:46 +08:00
1293368d59 fix:移除主播端飘屏弹幕选项 2022-12-13 18:11:57 +08:00
18401019693
d1e1f5f4e8 修复:上下滑动直播间,Pk头像展示在不PK得房间的情况 2022-12-13 16:56:06 +08:00
18401019693
b804c20ba0 修复:单人PK,PK条主播端和用户端展示问题 2022-12-13 16:23:13 +08:00
e030db04b9 fix:移除toast 2022-12-13 16:21:57 +08:00
0fcadde670 fix:修复天梯赛连胜标识通过PK-小头像-主页-跳转方式换房间不会被清空的问题 2022-12-13 16:00:17 +08:00
e522d04ead fix:修复开播后没有排位赛图标的问题 2022-12-13 14:35:51 +08:00
18401019693
ce0061e86e 修复:我的页面我的等修改只想新页面,优化:修改加入直播间报错 2022-12-13 14:30:21 +08:00
7ed4043a1f Merge remote-tracking branch 'origin/master' 2022-12-13 13:38:22 +08:00
18401019693
0b97d7bbaf 修复:多人Pk结束动画问题 2022-12-13 13:30:50 +08:00
5317f6d88f fix:修复首页ViewPager.setCurrentItem(int)为null导致的闪退问题 2022-12-13 13:23:00 +08:00
092b2ac519 udpate 移除隨機PK測試用代碼 2022-12-13 11:29:32 +08:00
c9725875b3 fix:整蠱添加禮物新增一些限制提示 2022-12-13 11:24:31 +08:00
6c33ac15f8 fix:修复主播开播返回不会弹出确认框
fix:修复主播点离开后,主播端没有离开遮罩图
2022-12-13 10:28:11 +08:00
af91783b9f Merge remote-tracking branch 'origin/master' 2022-12-12 18:30:48 +08:00
5755aa5232 update 多人PK也用新UI 2022-12-12 18:30:20 +08:00
ddc246e11c update 多人PK也用新UI 2022-12-12 18:18:36 +08:00
18401019693
869ad9adf7 修复:多人Pk结束动画问题 2022-12-12 18:16:53 +08:00
5356d91fef update 多人PK也用新UI 2022-12-12 17:45:15 +08:00
18401019693
f024283e80 修复:人Pk状态展示不正常 2022-12-12 17:00:51 +08:00
49167f332d update 隨機/自由PK 2022-12-12 16:30:32 +08:00
ea69f4bcb7 Merge remote-tracking branch 'origin/master' 2022-12-12 15:14:15 +08:00
18401019693
eaf973b927 修复单人PK胜利状态展示不对问题 2022-12-12 15:02:59 +08:00
fdbf5aee04 Merge branch 'dev_prank'
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
#	common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
2022-12-12 14:14:06 +08:00
e4c490577d update 整蛊 2022-12-12 14:11:05 +08:00
18401019693
b5247df69b 完成全服通知功能 2022-12-12 14:10:09 +08:00
d39ee17cc4 update 整蛊 2022-12-12 13:45:41 +08:00
07da7acacd update 整蛊 2022-12-10 18:28:40 +08:00
18401019693
28add09f32 修复:消息中心接受到多人PK问题 2022-12-10 17:53:49 +08:00
18401019693
9d69610713 修复:pk一次后,重新发起pk报50002错误 2022-12-10 17:39:11 +08:00
18401019693
32969a58db 修复:单人pk时间结束后,用户端由半屏自动变全屏 2022-12-10 17:38:33 +08:00
b188613035 Merge branch 'dev_random_pk' 2022-12-10 17:30:48 +08:00
308d5acc21 update 整蛊 2022-12-10 17:30:11 +08:00
18401019693
284b9784d6 多人Pk功能撤回 2022-12-10 16:20:13 +08:00
26f02065df update 随机PK 新增请求连麦超时管理 2022-12-10 16:08:04 +08:00
eef852c283 Merge branch 'dev_random_pk' 2022-12-10 15:03:00 +08:00
e0287899f8 update 随机PK RTC控制器新增超时管理 2022-12-10 15:01:24 +08:00
ae020b105a update 随机PK 修复返回uid为空时未进行下一轮PK问题 2022-12-10 15:00:48 +08:00
62c3cdcb30 update 随机PK 修复对方主播正在PK时不会继续调用next接口 2022-12-10 14:59:51 +08:00
01c657fdcb update 随机PK 修复对方主播正在PK时不会继续调用next接口 2022-12-10 14:59:21 +08:00
3a75e24601 update 随机PK 补充拒绝PK后的对话框 2022-12-10 14:58:50 +08:00
e28c393f88 update 随机PK 移除测试延迟代码 2022-12-10 14:58:01 +08:00
bfe8034b24 update 自由PK 注释 2022-12-10 14:55:21 +08:00
c056dfe246 update 自由PK 2022-12-10 14:55:03 +08:00
a7cf09de1e update 自由PK 2022-12-10 14:51:49 +08:00
7c4c22d69e 优化随机PK前先检测是否开启了连麦功能 2022-12-10 14:48:35 +08:00
3747f214b1 *新增长按随机PK【开始匹配】按钮可输入指定UIDPk的测试模式 2022-12-10 14:47:37 +08:00
18401019693
503fb0d7f1 单人Pk问题主播端修复修复 2022-12-10 14:47:29 +08:00
18401019693
6b0500b5ff 降低融云sdk 2022-12-10 13:41:38 +08:00
ae8c6cc23d update 单人PK 恢复PK计时不动的问题 2022-12-10 11:12:58 +08:00
ad028c69d0 update 自由PK 次数用完了提示用户
update 自由PK 调整UI
2022-12-09 17:51:15 +08:00
03b3398bce update 随机PK 修复对方主播正在PK时不会继续调用next接口 2022-12-09 17:35:39 +08:00
4a84283000 update 随机PK 调整拒绝PK回报服务器的时机 2022-12-09 17:19:50 +08:00
c49c560e8d update 随机PK 补充拒绝PK后的对话框 2022-12-09 17:08:12 +08:00
8d3ac7761f update 随机PK 移除测试延迟代码 2022-12-09 16:58:20 +08:00
a1d9b1f75b update 自由PK 注释 2022-12-09 16:47:00 +08:00
18401019693
afed0c8833 修改用户端多人PK视频顺序 2022-12-09 16:40:42 +08:00
415ed2fc9b update 自由PK 2022-12-09 16:39:41 +08:00
8e45e17768 update 自由PK 2022-12-09 14:13:47 +08:00
18401019693
576a30d1be 修改多人PK主播名称大小 2022-12-09 14:01:46 +08:00
18401019693
e380c8dcbc yh端多人Pk合流完成,Pk结束完成 2022-12-09 13:48:10 +08:00
5e9f23286e 优化随机PK前先检测是否开启了连麦功能 2022-12-09 10:15:20 +08:00
1bbc78fb32 *新增长按随机PK【开始匹配】按钮可输入指定UIDPk的测试模式 2022-12-09 09:50:47 +08:00
b56368412c Merge branch 'dev_random_pk'
# Conflicts:
#	common/src/main/res/values/strings.xml
#	config.gradle
#	live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java
#	live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java
#	live/src/main/java/com/yunbao/live/socket/SocketRyClient.java
2022-12-09 09:30:17 +08:00
4ad75a11a8 update 随机PK 2022-12-08 18:14:13 +08:00
3fa259c5b9 优化:调整天梯赛左右下角连胜字样大小
update 随机PK
2022-12-08 17:45:21 +08:00
18401019693
4cd4939c58 zb端多人Pk合流完成,Pk结束完成 2022-12-08 17:29:29 +08:00
b20141de02 update 整蛊 2022-12-08 14:42:33 +08:00
9eff246f06 update 随机PK&自由PK 2022-12-08 13:32:26 +08:00
285a33ff9a update 随机PK拒绝对话框 2022-12-08 11:34:31 +08:00
18401019693
7ebd935eba 多人Pk开播 2022-12-07 17:59:10 +08:00
f62a093092 update 自由PK 2022-12-07 16:10:22 +08:00
28b4a36800 完成随机PK模块 2022-12-07 15:36:23 +08:00
ec59fce097 修复新人特惠弹窗高度为1的问题 2022-12-06 17:53:17 +08:00
e134ef8d54 update 随机PK 2022-12-06 17:40:44 +08:00
29ddc68870 优化:WebViewActivity.java 兼容三按键导航栏 2022-12-06 16:58:30 +08:00
9ead9a6fb8 Merge branch 'master' into dev_random_pk
# Conflicts:
#	live/src/main/res/values/strings.xml
2022-12-05 17:46:57 +08:00
2a2672587c 关闭leakcanary 2022-12-05 17:44:49 +08:00
98122c25d8 优化LiveUserMoreDialogFragment.activity强引用导致的内存泄漏 2022-12-05 17:41:42 +08:00
84c89d7530 优化观众LiveRoomViewHolder强引用Context导致的内存泄漏 2022-12-05 17:41:42 +08:00
4268816539 优化观众直播间Activity强引用导致的内存泄漏 2022-12-05 17:41:42 +08:00
721172d48a 优化观众直播间PortraitLiveManager的强引用导致的内存泄漏 2022-12-05 17:41:42 +08:00
3e7942dbd4 优化观众直播间PortraitLiveManager的强引用导致的内存泄漏 2022-12-05 17:41:42 +08:00
17d18eff98 修复PPortraitLiveManager一处内存泄漏 2022-12-05 17:41:42 +08:00
0d422177ac 修复一处内存泄漏 2022-12-05 17:41:42 +08:00
6336eab32a 移除AliPay代码 2022-12-05 17:41:42 +08:00
f91a3f3fc1 优化对话框可能闪退的BUG 2022-12-05 17:41:41 +08:00
a489a6d00d 移除AliPay代码 2022-12-05 14:18:17 +08:00
8d8cff8d1b 修复直播间滑动列表数组下标溢出BUG 2022-12-05 10:30:15 +08:00
18142669586
5f487f74bd 修复多人连麦问题 2022-12-02 17:09:20 +08:00
857206e3da 修改连麦视频高度异常问题 2022-12-01 19:22:40 +08:00
18401019693
4ebe56913a 直播横竖屏问题修改 2022-12-01 19:13:52 +08:00
18401019693
efcc2591c2 直播横竖屏问题修改 2022-12-01 19:04:46 +08:00
18401019693
455b330b7d 关播时间问题 2022-12-01 18:53:12 +08:00
18401019693
ed2879e263 关播时间问题 2022-12-01 18:45:03 +08:00
3b1c5ac1ec 补充守护icon注释 2022-12-01 18:06:30 +08:00
18401019693
d243ffb380 修复守护问题 2022-12-01 17:56:21 +08:00
6bdd81038b Merge remote-tracking branch 'origin/master' 2022-12-01 17:29:12 +08:00
1eff58aca1 优化PK排位赛固定高度 2022-12-01 17:29:01 +08:00
18401019693
fa6eda5936 融云失败回调添加直播结束调用 2022-12-01 17:28:49 +08:00
18401019693
72f7e00dd5 修复退出直播间问题 2022-12-01 17:25:41 +08:00
707e083684 Merge remote-tracking branch 'origin/master' 2022-12-01 16:59:08 +08:00
8b4f88c766 新增开屏图 2022-12-01 16:58:05 +08:00
18401019693
ae3ac93248 主播,是否在播 2022-12-01 16:45:20 +08:00
18142669586
f43ccea32a 版本更新問題 2022-12-01 16:15:16 +08:00
18401019693
73684b9962 在线用户弹窗粉丝牌修改,我的等级页面边距修改 2022-12-01 14:51:29 +08:00
18401019693
80a1508dfc 修复手机开播Pk界面问题,直播间聊天滚动至底部优化 2022-12-01 13:34:25 +08:00
0b1393615c 修复PK结束后对方头像没隐藏问题 2022-12-01 13:19:57 +08:00
18401019693
4481b102ef 侧边栏任务领取问题修复 2022-11-30 19:05:00 +08:00
cab59a5f4a Merge remote-tracking branch 'origin/master' 2022-11-30 18:56:48 +08:00
9f6cd3fd6f 修复直播间多人PK滑动到下一个直播间依旧有PK条的问题 2022-11-30 18:56:16 +08:00
18401019693
4c5730d3bf 直播间聊天滚动问题 2022-11-30 18:50:14 +08:00
18401019693
1222aa9819 Merge remote-tracking branch 'origin/master' 2022-11-30 18:43:12 +08:00
18401019693
e58915edb6 直播间聊天滚动问题 2022-11-30 18:43:02 +08:00
18142669586
4d4c251ebd Merge remote-tracking branch 'origin/master' 2022-11-30 18:41:34 +08:00
18142669586
6a416aaba1 多人pk问题 2022-11-30 18:41:10 +08:00
bbb25cde50 Merge remote-tracking branch 'origin/master' 2022-11-30 18:40:46 +08:00
210749ebd3 移除多人连麦下麦黑屏问题 2022-11-30 18:34:18 +08:00
637fedcbe6 移除多人连麦列表一直刷新问题 2022-11-30 18:33:55 +08:00
18401019693
70b05b85d7 直播间闪烁问题 2022-11-30 17:37:20 +08:00
9a1cefdb70 移除主播未创建连麦房的【连麦房间不存在】Toast提示 2022-11-30 16:38:08 +08:00
6ca8fb0c29 新增下麦后100毫秒后检测播放器是否在播放,如果未播放则强制播放purl 2022-11-30 16:37:58 +08:00
18401019693
8e7de87c6b 侧边栏数据请求前移 2022-11-30 15:46:38 +08:00
cb55c09624 修复连麦时通过返回键触发弹窗后,直播间恢复允许滑动问题 2022-11-30 13:50:44 +08:00
18401019693
a41a58dc26 主播聊天问题修复 2022-11-30 13:20:23 +08:00
f257c2b5a9 修复多人连麦下麦后播放器横竖屏切换异常 2022-11-30 13:15:40 +08:00
18401019693
f5bd17f832 直播间聊天复用 2022-11-30 10:43:27 +08:00
1b7296c13b 修复滑动直播间观众列表头像装饰未清除问题 2022-11-30 10:24:00 +08:00
a965a83653 优化在连麦中禁止直播间滑动 2022-11-30 10:18:54 +08:00
18401019693
5cc521d93c 新增搜索主播等级标志, 2022-11-30 09:44:37 +08:00
6f2a893a4e 新增连麦头像框 2022-11-29 17:45:36 +08:00
1548b6f252 修复测试反馈的问题:上下滑动直播间会带着PK提示 2022-11-29 17:45:08 +08:00
18401019693
0c6b62ed1a 系统Im消息展示不出来问题修复 2022-11-29 16:39:09 +08:00
18401019693
1fcb3d312c 直播间头部展示上一个直播间数据问题,配合H5调整网页加载问题 2022-11-29 15:39:56 +08:00
35b24c261e 修复测试反馈的问题:用户名片点贵族跳转没用 2022-11-29 15:32:55 +08:00
e5c5a2e5f5 修复测试反馈的问题:滑动直播间数据没刷新 2022-11-29 15:25:27 +08:00
9934d53390 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java
2022-11-29 14:44:34 +08:00
030fdb6ad0 修复【在连麦中可以通过全屏广播跳转】 2022-11-29 14:37:50 +08:00
18401019693
cf4948a3e2 悬浮窗视频调整,主播离开下滑直播间离开画面不消失问题修复 2022-11-29 14:34:23 +08:00
afd4cb6e41 修复【在线观众列表,不应该显示粉丝牌】 2022-11-29 14:07:24 +08:00
596c9f9962 修复【在线观众列表,先点粉丝再点日榜周榜,粉丝牌没有消失。】 2022-11-29 14:02:22 +08:00
020bbf322d 修复【关注主播后赠送粉丝牌后进不去粉丝团任务界面,需要重进直播间才可以。】 2022-11-29 13:54:43 +08:00
05b1a9bc74 修复第一次进直播间购买守护显示为空的问题 2022-11-29 13:09:54 +08:00
7f001ba887 修复多人连麦回到桌面再返回直播间丢失连麦图标问题 2022-11-29 11:38:35 +08:00
18401019693
744de267dd 优化新人任务的判断逻辑,贵族通知切换直播间的逻辑优化 2022-11-29 10:18:48 +08:00
18401019693
af26dc24c7 直播间错误下滑 2022-11-28 18:10:37 +08:00
18401019693
e9fa533e5a 修复多次调用检查直播间接口问题 2022-11-28 18:09:20 +08:00
3bd4301cda 修复直播间@列表 userlistModels为空导致的问题 2022-11-28 16:36:52 +08:00
23be58c4e8 修复IM消息获取getUserBean.getId()为空导致的问题 2022-11-28 16:36:51 +08:00
718d4a5d2f 修复星级挑战data.getImageUrl()为空导致的问题 2022-11-28 16:29:21 +08:00
733678532a 修复首页Banner进直播间没有弹新人特惠问题 2022-11-28 15:57:50 +08:00
6fb29bbf60 修复推送通知权限提示框非activity导致的闪图问题 2022-11-28 15:27:28 +08:00
ecbfa57276 Merge remote-tracking branch 'origin/master' 2022-11-28 14:55:55 +08:00
fc59a6f182 修复从个人名片跳转到他直播间不会关闭个人名片的问题 2022-11-28 14:55:47 +08:00
83039d7b29 修复连麦小窗再进直播间会闪退问题 2022-11-28 14:52:39 +08:00
18401019693
e405965298 修复多次调用检查直播间接口问题 2022-11-28 14:42:24 +08:00
18401019693
e6766dc5eb 修复直播间滚动,横竖屏展示错误问题 2022-11-28 14:36:29 +08:00
fe027e53db 优化主播连麦邀请/同意时提示体验 2022-11-28 10:59:11 +08:00
18401019693
546d9b5728 第十次接口合并,手机开播横屏展示修复 2022-11-28 10:46:49 +08:00
7008ccc505 优化主播连麦邀请/同意时提示体验 2022-11-28 10:25:26 +08:00
1fc8977f99 补充连麦API注释 2022-11-28 10:12:18 +08:00
4acba02c6a 补充更多跳转直播间前连麦检测 2022-11-28 10:10:21 +08:00
18401019693
491427feba 合并接口第九次上传,直播間切換直播 2022-11-26 17:41:58 +08:00
18401019693
249d251708 合并接口第八次上传,直播間切換直播 2022-11-26 17:12:02 +08:00
18401019693
96eee88c82 合并接口第七次次上传,跳轉統一性 2022-11-26 17:01:40 +08:00
18401019693
7005895d90 合并接口第liu次次上传 2022-11-26 16:52:11 +08:00
18401019693
3bdee09402 合并接口第五次次上传 2022-11-26 16:12:22 +08:00
2843131151 修复连麦看观众列表json转换丢失数据问题 2022-11-26 14:36:50 +08:00
a8d4d64174 Merge remote-tracking branch 'origin/master' 2022-11-26 11:38:07 +08:00
1853acd5eb 补充直播间加载配位赛接口 2022-11-26 11:37:32 +08:00
18401019693
03a4054ee5 合并接口第四次上传 2022-11-26 11:37:03 +08:00
fe66792935 Merge remote-tracking branch 'origin/master' 2022-11-26 11:08:25 +08:00
18401019693
082c9d7d12 合并接口第三次上传 2022-11-26 11:07:56 +08:00
e35eb5ac7f 修复一处回报的闪退异常 2022-11-26 10:57:31 +08:00
18401019693
5e631652a9 合并接口第er次上传 2022-11-25 17:58:15 +08:00
4eb9adad78 调整检测连麦对话框位置
修复一处闪退问题
2022-11-25 17:48:47 +08:00
4a9a8c3ec3 Merge remote-tracking branch 'origin/master' 2022-11-25 16:28:19 +08:00
18401019693
450047aae2 合并接口第一次上传 2022-11-25 16:26:56 +08:00
eb65c0e101 优化主播下播时也同步关掉连麦房 2022-11-25 15:31:14 +08:00
6bd29ec63e 调整在线列表-守护-空列表时的图片显示 2022-11-25 14:55:56 +08:00
f0231be306 调整购买守护界面守护全年的文本颜色 2022-11-25 14:26:38 +08:00
b12547cd88 补充多人连麦文案
修复主播发起邀请时会在私聊里显示私聊im代码
2022-11-25 13:49:14 +08:00
ed6b531b8d update 随机PK 2022-11-24 18:08:45 +08:00
47b9487e13 调整连麦主播邀请用户时,用户的弹框样式 2022-11-24 17:08:38 +08:00
ec40f8fa0d 补充下麦时调用融云接口 2022-11-24 16:35:33 +08:00
86a0a19fec 修复一处闪退问题
新增统一连麦状态管理类
修复连麦过程中可以通过回到桌面-重进APP,从而可以进入其他直播间问题(方案:连麦中点击其他直播间先询问是否退出连麦)
2022-11-24 16:27:02 +08:00
e0b69be2d4 update 随机Pk 2022-11-24 15:34:51 +08:00
a2ad006a7e 修复心愿单高度异常问题 2022-11-24 13:45:59 +08:00
9b17c1225a update 随机Pk 2022-11-24 13:34:09 +08:00
18401019693
32881d3f35 修复主播发动态身份判断问题 2022-11-24 10:40:27 +08:00
e8367b8f1a 调整直播间观众列表贵族icon不居中问题 2022-11-23 18:12:05 +08:00
fc1bada607 修复部分弹框没有动画效果 2022-11-23 18:01:33 +08:00
1eca5b0309 Merge remote-tracking branch 'origin/master' 2022-11-23 17:41:44 +08:00
08906e028a 修复三按键导航模式下,首页Banner进去可能网页底部显示不全的问题 2022-11-23 17:41:34 +08:00
18401019693
6e36e15ef3 删除埋点(adjust-android) 2022-11-23 17:16:45 +08:00
d71fe7d92e 调整直播准备界面-选择频道UI 2022-11-23 16:55:08 +08:00
72ca2b7b04 修复美颜滤镜的bar显示导致对话框抖动问题 2022-11-23 16:49:01 +08:00
5768ff5518 调整个人名片UI 2022-11-23 16:33:39 +08:00
8a03b194b2 update 随机PK 2022-11-23 16:07:57 +08:00
0d18a135ec Merge remote-tracking branch 'origin/master' 2022-11-23 15:21:54 +08:00
91fdef55c7 更新多人连麦主播端部分代码注释
限制多人连麦直播端仅允许同意/邀请三人
2022-11-23 15:21:44 +08:00
18401019693
4d437be248 修改直播间切换送礼列表不停止问题 2022-11-23 15:04:04 +08:00
d42835231e 调整多人连麦踢人后刷新列表 2022-11-23 14:42:00 +08:00
3d117dbcb4 Merge remote-tracking branch 'origin/master' 2022-11-23 14:14:34 +08:00
202aedbcf3 新增多人连麦主播端 2022-11-23 14:14:02 +08:00
18401019693
14a4bc4343 修改直播间图标间距和贵族大小 2022-11-23 14:08:04 +08:00
18401019693
011322dd8e 贵族开通全服通知 2022-11-23 13:42:55 +08:00
18401019693
0d219e4b6d act进入退出动画 2022-11-22 18:15:25 +08:00
18401019693
1972144384 贵族点击 2022-11-22 17:12:15 +08:00
18401019693
08e7e6b461 礼物弹窗更改 2022-11-22 14:57:13 +08:00
dbba33f085 修复重进直播间不显示PK提示的问题 2022-11-22 14:28:29 +08:00
4a637d0a69 创建随机PK分支 2022-11-21 15:39:12 +08:00
18401019693
a9d323354b Js接口整合后续更改 2022-11-21 15:22:54 +08:00
18401019693
4cd1c22d01 6.4.5 307 2022-11-18 18:15:22 +08:00
18401019693
55ff7a1649 6.4.5 306 2022-11-18 17:43:27 +08:00
18401019693
3deb3693b3 测试更改 2022-11-18 17:40:37 +08:00
009efc2c86 屏蔽点击版本号分享日志的功能 2022-11-18 17:02:55 +08:00
40b37b49f9 修复聊天框内容变宽的问题 2022-11-18 16:39:09 +08:00
a3ad9a17c7 修复主播用户名片点击粉丝团/守护席跳转的是当前直播间的粉丝团/守护席 2022-11-18 16:33:07 +08:00
18401019693
2c13c3dce1 测试更改 2022-11-18 15:59:15 +08:00
18401019693
859d884941 测试更改 2022-11-18 15:49:24 +08:00
4a28abf5b7 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	main/src/main/java/com/yunbao/main/activity/MainActivity.java
2022-11-18 15:30:42 +08:00
527bb0f1d9 调整通知权限的弹出位置 2022-11-18 15:29:10 +08:00
0429e7ca36 修改直播间左上角靓字 2022-11-18 15:25:56 +08:00
18401019693
e8f13d7590 测试更改 2022-11-18 15:18:50 +08:00
7eb3e567f6 调整个人卡片UI 2022-11-18 15:14:32 +08:00
17ec4753b6 调整PK位置 2022-11-18 14:43:26 +08:00
2371ef1dee 调整个人名片卡主播显示主播等级底图 2022-11-18 14:42:12 +08:00
c99d139940 修复首页排行榜需要点击两次才能关注的问题
修复首页排行榜top3点击直播进个人中心问题
2022-11-18 14:38:54 +08:00
e0a2f7c798 调整天梯赛点击事件 2022-11-18 13:52:06 +08:00
a12524dc9c Merge remote-tracking branch 'origin/master' 2022-11-18 13:45:21 +08:00
18401019693
c08cf6ea57 测试更改 2022-11-18 13:42:02 +08:00
20746185e0 调整直播间礼物弹框高度 2022-11-18 13:12:01 +08:00
54cf0e213f 修复一处观众端接受PK IM消息导致闪退问题 2022-11-18 11:22:55 +08:00
18401019693
6654fe0434 测试更改 2022-11-18 10:34:51 +08:00
324917672c 调整排行榜点击正在直播的主播直接跳到直播间 2022-11-17 18:26:29 +08:00
d0a373123a Merge remote-tracking branch 'origin/master' 2022-11-17 17:54:39 +08:00
86b7ad6d92 修复通知栏布局显示不全的问题 2022-11-17 17:54:31 +08:00
c949667b94 修复排行榜没有位置时依旧显示钻石图标的问题 2022-11-17 17:32:51 +08:00
a61a41a068 新增检测通知权限弹窗 2022-11-17 17:21:05 +08:00
06d241c66c 修复首页排行榜闪退问题 2022-11-17 17:20:26 +08:00
62ed0ae78e 调整天梯赛大小 2022-11-17 17:12:41 +08:00
1ee335abf2 调整用户卡片的主播判断 2022-11-17 16:55:04 +08:00
18401019693
05ee59618b 测试更改 2022-11-17 16:03:17 +08:00
18401019693
fffa7cdabd 测试更改 2022-11-17 16:01:56 +08:00
b8ec25c94e 调整用户卡片齿轮出现的权限 2022-11-17 15:30:01 +08:00
38029f7268 调整用户卡片齿轮出现的权限 2022-11-17 15:21:57 +08:00
d2fdccadf2 调整用户卡片齿轮位置 2022-11-17 14:23:06 +08:00
18401019693
b1d06a4f1a 网页加载错误显示错误网址问题 2022-11-17 13:28:07 +08:00
18401019693
ecf3a94b64 网页加载错误显示错误网址问题 2022-11-17 13:26:01 +08:00
18401019693
99b9af2980 网页加载错误显示错误网址问题 2022-11-17 11:48:01 +08:00
18401019693
267d07f3a5 网页加载错误显示错误网址问题 2022-11-17 11:37:35 +08:00
977bfa910c 调整用户信息卡片 2022-11-16 18:28:12 +08:00
fe3c9c1563 Merge remote-tracking branch 'origin/master' 2022-11-16 18:26:50 +08:00
18401019693
8c11818b49 侧边栏修改,直播关播页面BUg修改 2022-11-16 18:16:20 +08:00
ee0d8dd1a0 Merge remote-tracking branch 'origin/master' 2022-11-16 17:25:21 +08:00
18401019693
1d50f8e4f5 侧边栏修改,直播关播页面BUg修改 2022-11-16 17:22:34 +08:00
e8f9884365 修复一处登录时空指针错误 2022-11-16 17:08:10 +08:00
38f6f2f451 修复滑动后Banner只剩下心愿单问题 2022-11-16 17:02:46 +08:00
a664ff7464 调整天梯排位赛UI位置
新增排位赛轮播点击事件
2022-11-16 16:31:48 +08:00
a4ab6df974 调整直播间重制UI 2022-11-16 16:12:57 +08:00
dc8f32062c 修复滑动直播间,部分UI未还原问题 2022-11-16 15:50:04 +08:00
0a090301df Merge branch 'dev_pkrank' 2022-11-16 15:03:51 +08:00
d53d250e6f 调整PK排位赛判断 2022-11-16 15:03:25 +08:00
18401019693
897a47bee7 侧边栏修改 2022-11-16 14:30:11 +08:00
0f457efce6 调整仅接口返回有top图片时才认为是排位赛并显示UI 2022-11-16 14:07:07 +08:00
7842c1b838 调整PK排位赛中,连胜大于等于3场才显示连胜字样 2022-11-16 13:47:05 +08:00
02a5ceaacc Merge remote-tracking branch 'origin/master' 2022-11-16 13:38:43 +08:00
6b1c223acd 修复打包后PK中屏蔽暂时离开失效问题 2022-11-16 13:38:27 +08:00
18401019693
09a9e023d3 侧边栏修改 2022-11-16 13:16:46 +08:00
9b37374066 新增PK TOP 2022-11-16 11:27:44 +08:00
45257e8fe1 Merge branch 'master' into dev_pkrank
# Conflicts:
#	common/src/main/java/com/yunbao/common/http/PDLiveApi.java
2022-11-16 11:22:35 +08:00
18401019693
85971339d4 侧边栏修改 2022-11-15 16:03:41 +08:00
18401019693
383e8c0859 悬浮窗修改 2022-11-15 13:54:28 +08:00
749ac197de 新增PK TOP 2022-11-15 11:35:03 +08:00
d20210f291 创建PK排位赛分支 2022-11-15 09:53:15 +08:00
18401019693
da3398f1f9 侧边栏修改 2022-11-14 16:54:42 +08:00
81763110d7 Merge remote-tracking branch 'origin/master' 2022-11-14 15:38:34 +08:00
6ac610e1aa Merge branch 'dev_room'
# Conflicts:
#	live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java
2022-11-14 15:27:55 +08:00
18401019693
362cc3814e 领取任务奖励逻辑 2022-11-14 15:20:12 +08:00
37dfa05a25 调整靓号icon 2022-11-14 13:57:28 +08:00
18401019693
2df205218c 用户等级和粉丝团的更改 2022-11-14 11:44:10 +08:00
18401019693
cceb697739 充值逻辑 2022-11-12 18:00:00 +08:00
7d63869d44 调整 隐藏我的-我的等级,webview的title 2022-11-12 17:52:01 +08:00
3b1cecf8a3 Merge remote-tracking branch 'origin/master' 2022-11-12 17:09:20 +08:00
e52ec4a2b8 调整日志收集 2022-11-12 17:08:58 +08:00
18401019693
ed300eec30 Js调用原生整改 2022-11-12 17:08:48 +08:00
8455c360fc 调整日志收集的参数 2022-11-12 16:56:02 +08:00
059bfaf1d9 调整日志收集的参数 2022-11-12 16:44:06 +08:00
18401019693
9f0b6897f1 Js调用原生整改,主播踢人不退出房间问题修改 2022-11-12 16:05:04 +08:00
2119d75e5b 补充个人名片主播端踢人选项 2022-11-12 15:48:45 +08:00
af39c4bac0 调整日志输出格式
调整个人名片-工会大小
2022-11-12 15:09:49 +08:00
93ac837148 调整礼物支付默认跳转页面为【钻石】 2022-11-12 13:44:28 +08:00
c4f3d10419 补充日志分享为打包压缩文件 2022-11-12 13:35:29 +08:00
3f9cf21b8f 全量日志采集系统改为保存三天内的 2022-11-12 11:32:11 +08:00
e9a8a4dc02 Merge remote-tracking branch 'origin/master' 2022-11-12 09:58:35 +08:00
18401019693
84f352a7fb Js调用原生整改 2022-11-11 18:32:35 +08:00
834170e272 新增全量日志采集系统 2022-11-11 17:47:28 +08:00
042f53e134 tmp 2022-11-11 15:04:02 +08:00
0b041bad7b 修复多人PK接收方次数用完依旧会加入的问题 2022-11-11 14:04:58 +08:00
fe124dad0c 调整支付页面H5可缩放 2022-11-11 11:39:49 +08:00
18401019693
7fe7178b27 小菜单的展开 2022-11-11 11:38:46 +08:00
18401019693
9dcc23960e 小菜单的展开 2022-11-11 09:53:10 +08:00
18401019693
140e5740e6 任务 2022-11-10 17:04:06 +08:00
18401019693
752fae680c 趣味活动 2022-11-10 16:41:27 +08:00
e2f8e52583 修复一处PK中的空指针问题 2022-11-10 15:14:17 +08:00
4d573767f7 Merge remote-tracking branch 'origin/master' 2022-11-10 15:04:59 +08:00
56475e729c 禁止PK过程中主播点离开按钮 2022-11-10 15:04:42 +08:00
8f0a1a09a6 修复关闭小窗时部分机型闪退问题 2022-11-10 14:55:27 +08:00
18401019693
c6b8b61b1e 权益 2022-11-10 14:40:06 +08:00
862295ff03 修复热度加gif不播放问题 2022-11-10 14:30:54 +08:00
18401019693
d13e42e33d 猜你喜欢 2022-11-10 13:48:08 +08:00
134cdf2e2a 调整个人名片 2022-11-10 13:22:40 +08:00
44a05ea0d5 调整个人名片 2022-11-10 11:17:04 +08:00
7f34c50b71 Merge remote-tracking branch 'origin/master' 2022-11-10 11:12:22 +08:00
18401019693
77682d310a 语音听写修改 2022-11-10 10:56:51 +08:00
2b0846f939 Merge remote-tracking branch 'origin/master' 2022-11-09 18:30:59 +08:00
18401019693
0b6c188e0a 侧边栏:侧边栏界面完成,文字消息更改 2022-11-09 18:27:41 +08:00
f51f440b43 Merge remote-tracking branch 'origin/master' 2022-11-09 17:42:55 +08:00
18401019693
f74a01efc0 侧边栏:权益 2022-11-09 17:02:02 +08:00
6dafa64e0b Merge remote-tracking branch 'origin/master' 2022-11-09 16:19:07 +08:00
18401019693
60453c756c 侧边栏:趣味游戏 2022-11-09 16:04:48 +08:00
18401019693
350f17915a 侧边栏:任务中心 2022-11-09 15:26:59 +08:00
ffcb847b02 Merge remote-tracking branch 'origin/master' 2022-11-09 15:09:52 +08:00
8eae2c29ae 修复:直播准备页面切换摄像头可能失效问题
修复:直播准备页面美颜-美肤可能无效问题
2022-11-09 15:09:37 +08:00
18401019693
5e55a5b94c 侧边栏:充值送好礼 2022-11-09 14:02:39 +08:00
1eee54fef1 修复:多人PK次数已用完再接受PK邀请会闪退问题 2022-11-09 13:43:04 +08:00
24f691d4b8 补充JS跳转方法 2022-11-09 13:12:05 +08:00
1fc417ec25 Merge branch 'dev_userCard'
# Conflicts:
#	main/src/main/java/com/yunbao/main/activity/MainActivity.java
2022-11-09 11:01:45 +08:00
71713e5b37 完成新个人名片
完成直播间主播靓号标识
2022-11-09 11:00:49 +08:00
18401019693
ef4c377990 侧边栏 2022-11-09 09:47:04 +08:00
88e27df986 调整融云推流参数 2022-11-09 09:44:18 +08:00
628d9c7a1b Merge remote-tracking branch 'origin/master' 2022-11-08 17:41:31 +08:00
18401019693
7836c57479 Merge remote-tracking branch 'origin/master' 2022-11-08 17:40:53 +08:00
18401019693
939675fe58 文字等级 2022-11-08 17:40:42 +08:00
5ed5b15737 udpate 2022-11-08 16:50:37 +08:00
783685942c 调整推流设置 2022-11-08 16:11:14 +08:00
30c09b0e26 修复开播后直播准备界面还存在的问题 2022-11-08 14:07:17 +08:00
96f21643b4 update 2022-11-08 13:53:24 +08:00
977067eda5 Merge remote-tracking branch 'origin/master' 2022-11-08 13:28:05 +08:00
3e7279b4de 修复直播设置密码房无反应问题 2022-11-08 13:27:56 +08:00
34dd3ca883 update 2022-11-08 13:17:35 +08:00
18401019693
d0d36ef207 语音转文字,上拉加载 2022-11-08 13:12:08 +08:00
a66a32038c update 2022-11-08 11:38:20 +08:00
80d5bf3007 修复主播端开播Banner没活动问题 2022-11-08 11:03:06 +08:00
cb39253785 优化主播端更新心愿单刷新banner 2022-11-08 10:57:06 +08:00
3ec3350c97 Merge remote-tracking branch 'origin/master' 2022-11-08 10:16:40 +08:00
7a01f62490 优化room为空时开播的提示 2022-11-08 10:15:55 +08:00
4a6bb9fd56 修复美颜卡住问题 2022-11-08 10:12:57 +08:00
40532a0972 update 个人名片 2022-11-07 17:39:52 +08:00
18401019693
e059d9bbb2 手机开播问题修复 2022-11-07 17:33:42 +08:00
ab953b4785 update 2022-11-07 16:48:16 +08:00
18401019693
6e38ef2962 发送和进入房间错误弹出 2022-11-07 14:51:44 +08:00
18401019693
6656aebff9 悬浮窗和开播离开 2022-11-04 14:58:40 +08:00
50b598d8a1 移除主播直播间观众列表与守护列表的购买界面 2022-11-03 17:28:50 +08:00
cf08f8197b 主播直播间新增右下角Banner 2022-11-03 16:06:18 +08:00
62f1912a7a 新增获取内存大小 2022-11-03 15:19:42 +08:00
eae7f3d1a0 排行榜圆角 2022-11-03 14:55:10 +08:00
b3e9836d7c Merge remote-tracking branch 'origin/master' 2022-11-03 14:47:24 +08:00
c3c91ba9a2 修复滑动直播间不显示离开图 2022-11-03 14:47:06 +08:00
18401019693
1075f7252a 修改主题颜色 2022-11-03 14:45:51 +08:00
302435c068 修复开播时可能的空指针错误 2022-11-03 10:39:18 +08:00
41fb743bda 调整排行榜图标大小,隐藏性别图标 2022-11-03 10:18:33 +08:00
18401019693
823075c0ad Merge branch 'change_live' 2022-11-02 18:12:34 +08:00
18401019693
c57486b69c 修改用户等级 2022-11-02 18:11:38 +08:00
8b3b0ce2ea 补充排行榜颜色 2022-11-02 17:19:45 +08:00
e3f9f21287 Merge branch 'dev_rank_test' 2022-11-02 16:54:40 +08:00
b10d9ada46 首页排行榜改成可伸缩的模式 2022-11-02 16:53:28 +08:00
b48ceea571 完成排行榜页面 2022-11-02 14:27:38 +08:00
18401019693
0f2fbeb114 修改粉丝团 2022-11-02 14:20:25 +08:00
1623743b26 update 2022-11-02 13:25:09 +08:00
703f542abf update 2022-11-01 18:27:49 +08:00
a2de293e10 update 2022-11-01 18:18:58 +08:00
18401019693
a50abb5b2c 主播等级 2022-11-01 16:38:38 +08:00
18401019693
2102acd9e5 测试修改 2022-11-01 16:10:58 +08:00
18401019693
b8ee197e52 红点通知 2022-11-01 14:52:44 +08:00
18401019693
ba81a46e2f 红点通知 2022-11-01 14:51:39 +08:00
18401019693
6841f47ac3 修改主播等级 2022-11-01 14:46:06 +08:00
a2fef0990a Merge branch '6.4.4_fix_wish'
# Conflicts:
#	config.gradle
2022-11-01 11:28:38 +08:00
9e411ecd71 修复送礼主播会闪退问题(心愿单id冲突) 2022-11-01 11:26:49 +08:00
8d14c06284 播放前移除播放尾帧 2022-11-01 11:00:17 +08:00
8b3f8d783e 修复自动消息重复发送的问题 2022-10-31 17:53:31 +08:00
b5ebc085b4 还原成腾讯播放器 2022-10-31 17:53:09 +08:00
7e169e882d 直播间内存优化稳定到0.7G左右 2022-10-31 16:41:28 +08:00
50f83939cc test 2022-10-31 15:55:52 +08:00
f856188a68 改为EXOPlayer 2022-10-31 15:48:42 +08:00
7e9b794c7f AbsActivity新增低内存回调
DeviceUtils新增获取当前应用是否处于低内存判断方法
2022-10-31 14:59:14 +08:00
18401019693
e70a5e09f6 悬浮窗问题 2022-10-31 10:22:00 +08:00
3e8db9ec7e Merge remote-tracking branch 'origin/master' 2022-10-31 10:16:18 +08:00
34f70bb4cd 修复一处闪退bug 2022-10-31 10:16:10 +08:00
18401019693
12f78dc3b8 添加版本号 2022-10-31 10:06:26 +08:00
89a54276b3 优化反馈收集类名 2022-10-31 10:02:45 +08:00
73fb523ddc 修改礼物弹框高度 2022-10-31 10:00:49 +08:00
2567 changed files with 176614 additions and 18747 deletions

View File

@@ -1,12 +1,12 @@
apply plugin: 'com.android.library'
apply plugin: 'img-optimizer'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-parcelize'
apply from: "../package_config.gradle"
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
namespace "com.yunbao.faceunity"
compileSdk rootProject.ext.android.compileSdkVersion
packagingOptions {
pickFirst "lib/armeabi/libyuvutils.so"
pickFirst "lib/arm64-v8a/libyuvutils.so"
@@ -33,7 +33,7 @@ android {
versionName rootProject.ext.android.versionName
manifestPlaceholders = rootProject.ext.manifestPlaceholders
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a", "arm64-v8a","x86","x86_64"
}
}
aaptOptions {
@@ -48,8 +48,8 @@ android {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_18
targetCompatibility JavaVersion.VERSION_18
}
}
repositories {
@@ -58,15 +58,15 @@ repositories {
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies["appcompat-androidx"]
implementation rootProject.ext.dependencies["recyclerview-androidx"]
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api fileTree(dir: 'libs', include: ['*.jar'])
api rootProject.ext.dependencies["appcompat-androidx"]
api rootProject.ext.dependencies["recyclerview-androidx"]
api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
//common
implementation project(path: ':common')
api project(path: ':common')
implementation 'com.faceunity:core:8.3.1'
implementation 'com.faceunity:model:8.3.1'
api 'com.faceunity:core:8.7.0'
api 'com.faceunity:model:8.7.0'
//implementation 'com.faceunity:nama:8.3.1' //底层库-标准版

View File

@@ -2,7 +2,7 @@ package com.yunbao.faceunity;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.platform.app.Instrimport com.yunbao.common.utils.MobclickAgent;ntationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;

View File

@@ -1,7 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.yunbao.faceunity"
>
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />

View File

@@ -71,7 +71,7 @@ public class FaceManager implements SensorEventListener {
* 配置美颜SDK
*/
public void initFURender(Context context) {
initFaceUnity(context);
mFURenderer = FURenderer.getInstance();
mFURenderer.setInputTextureType(FUInputTextureEnum.FU_ADM_FLAG_COMMON_TEXTURE);
mFURenderer.setCameraFacing(CameraFacingEnum.CAMERA_FRONT);
@@ -96,18 +96,26 @@ public class FaceManager implements SensorEventListener {
faceUnityView.setIFaceUnityInter(new FaceUnityView.IFaceUnityInter() {
@Override
public void onPause() {
if(onMirrorChanged!=null){
onMirrorChanged.onChange(false);
}
pauseFace = true;
}
@Override
public void onStart() {
if(onMirrorChanged!=null){
onMirrorChanged.onChange(true);
}
pauseFace = false;
}
});
}
public void loadConfig(){
public void loadConfig() {
initFaceBeauty();
}
public void initFaceBeauty() {
FaceBeautyDataFactory faceBeautyDataFactory;
faceBeautyDataFactory = new FaceBeautyDataFactory();
@@ -115,9 +123,13 @@ public class FaceManager implements SensorEventListener {
for (String key : configMap.keySet()) {
if ("FilterViewHolder_".equals(key)) {
for (FaceBeautyFilterBean filter : faceBeautyDataFactory.getBeautyFilters()) {
if (filter.getKey().equals(configMap.get(key))&&!"origin".equals(configMap.get(key))) {
faceBeautyDataFactory.onFilterSelected(filter.getKey(), Double.parseDouble((String) Objects.requireNonNull(configMap.get("FilterViewHolder_" + configMap.get(key) + "_val")))/100, filter.getDesRes());
Log.i(TAG, "test: 设置滤镜 ="+filter.getKey()+" val = "+configMap.get("FilterViewHolder_" + configMap.get(key) + "_val"));
if (filter.getKey().equals(configMap.get(key)) && !"origin".equals(configMap.get(key))) {
try {
faceBeautyDataFactory.onFilterSelected(filter.getKey(), Double.parseDouble((String) Objects.requireNonNull(configMap.get("FilterViewHolder_" + configMap.get(key) + "_val"))) / 100, filter.getDesRes());
Log.i(TAG, "test: 设置滤镜 =" + filter.getKey() + " val = " + configMap.get("FilterViewHolder_" + configMap.get(key) + "_val"));
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
@@ -125,17 +137,25 @@ public class FaceManager implements SensorEventListener {
String name = key.replace("BeautySkinViewHolder_", "");
for (FaceBeautyBean bean : faceBeautyDataFactory.getShapeBeauty()) {
if (bean.getKey().equals(name)) {
faceBeautyDataFactory.updateParamIntensity(bean.getKey(),Double.parseDouble((String) Objects.requireNonNull(configMap.get(key))));
Log.i(TAG, "test: 设置美颜 = "+bean.getKey()+" val = "+configMap.get(key));
try {
faceBeautyDataFactory.updateParamIntensity(bean.getKey(), Double.parseDouble((String) Objects.requireNonNull(configMap.get(key))));
Log.i(TAG, "test: 设置美颜 = " + bean.getKey() + " val = " + configMap.get(key));
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}else if(key.startsWith("BeautyShapeViewHolder")){
} else if (key.startsWith("BeautyShapeViewHolder")) {
String name = key.replace("BeautyShapeViewHolder_", "");
for (FaceBeautyBean bean : faceBeautyDataFactory.getShapeBeauty()) {
if (bean.getKey().equals(name)) {
faceBeautyDataFactory.updateParamIntensity(bean.getKey(),Double.parseDouble((String) Objects.requireNonNull(configMap.get(key))));
Log.i(TAG, "test: 设置美肤 = "+bean.getKey()+" val = "+configMap.get(key));
try {
faceBeautyDataFactory.updateParamIntensity(bean.getKey(), Double.parseDouble((String) Objects.requireNonNull(configMap.get(key))));
Log.i(TAG, "test: 设置美肤 = " + bean.getKey() + " val = " + configMap.get(key));
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
@@ -277,10 +297,22 @@ public class FaceManager implements SensorEventListener {
} catch (Exception e) {
e.printStackTrace();
}
isInit = false;
}
OnMirrorChanged onMirrorChanged;
public void setOnMirrorChanged(OnMirrorChanged onMirrorChanged) {
this.onMirrorChanged = onMirrorChanged;
}
public interface FaceStatusChanged {
void onFaceChanged(int num);
}
public interface OnMirrorChanged{
void onChange(boolean falg);
}
}

View File

@@ -80,11 +80,11 @@ public class ContainerRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolde
}
public void hideSeekBar() {
if (seekBar.getVisibility() == View.GONE) {
if (seekBar.getVisibility() == View.INVISIBLE) {
return;
}
seekBar.setOnProgressChangeListener(null);
seekBar.setVisibility(View.GONE);
seekBar.setVisibility(View.INVISIBLE);
}

View File

@@ -52,11 +52,11 @@ public class FURenderer extends IFURenderer {
/* 特效FURenderKit*/
private FURenderKit mFURenderKit;
public FURenderKit mFURenderKit;
/* AI道具*/
private String BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor_lite.bundle";
private String BUNDLE_AI_HUMAN = "model" + File.separator + "ai_human_processor.bundle";
public static String BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor.bundle";
public static String BUNDLE_AI_HUMAN = "model" + File.separator + "ai_human_processor.bundle";
/* GL 线程 ID */
private Long mGlThreadId = 0L;

View File

@@ -15,7 +15,7 @@ public class FaceUnityConfig {
/************************** 算法Model ******************************/
// 人脸识别
public static String BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor_lite.bundle";
public static String BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor.bundle";
// 手势
public static String BUNDLE_AI_HAND = "model" + File.separator + "ai_hand_processor.bundle";

View File

@@ -314,6 +314,35 @@ public class FileUtils {
return null;
}
public static String copyAssetsFile(Context context, String assetsPath, String fileName, String saveFileDir) {
File fileDir = new File(saveFileDir);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(fileDir, fileName);
if (file.exists()) {
return file.getAbsolutePath();
}
try {
InputStream inputStream = context.getAssets().open(assetsPath);
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(inputStream);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] byteArray = new byte[1024];
int bytes = bis.read(byteArray);
while (bytes > 0) {
bos.write(byteArray, 0, bytes);
bos.flush();
bytes = bis.read(byteArray);
}
bos.close();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取Uri文件绝对路径
@@ -522,6 +551,7 @@ public class FileUtils {
/**
* 遍历一个文件夹获取改文件夹下所有文件名
*
* @param path
* @return
*/
@@ -563,7 +593,7 @@ public class FileUtils {
* @param path String
* @return Boolean
*/
public static Boolean checkIsVideo(Context context,String path) {
public static Boolean checkIsVideo(Context context, String path) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(context, Uri.fromFile(new File(path)));

View File

@@ -13,7 +13,7 @@ import com.google.gson.JsonObject;
import com.yunbao.faceunity.entity.net.FineStickerEntity;
import com.yunbao.faceunity.utils.FaceUnityData;
import com.yunbao.faceunity.utils.FileUtils;
import com.yunbao.faceunity.utils.ZipUtils;
import com.yunbao.common.utils.ZipUtils;
import java.io.File;
import java.util.ArrayList;

View File

@@ -1,96 +1,96 @@
<resources>
<string name="camera_dialog_title">警告</string>
<string name="sorry_no_permission">抱歉,你所使用的证书权限或SDK不包括功能。</string>
<string name="camera_dialog_message">机权限被禁用或者相机被别的应用占用!</string>
<string name="camera_dialog_open"></string>
<string name="sorry_no_permission">抱歉,你所使用的證書權限或SDK不包括功能。</string>
<string name="camera_dialog_message">機權限被禁用或者相機被別的應用佔用!</string>
<string name="camera_dialog_open"></string>
<string name="camera_dialog_back">退出</string>
<string name="fu_base_debug">Resolution:\n\t%dX%d\nFPS: %d\nRender time:\n\t%dms</string>
<string name="save_photo_success">保存照片成功!</string>
<string name="save_video_success">保存视频成功!</string>
<string name="save_video_failed">保存视频失败</string>
<string name="save_video_too_short">视频太短啦!</string>
<string name="save_video_wait">视频处理中稍等</string>
<string name="fu_base_is_tracking_text">检测到人</string>
<string name="fu_base_incomplete_face_text">不全</string>
<string name="fu_base_input_type_single">单输</string>
<string name="fu_base_input_type_double">双输</string>
<string name="save_video_success">保存視頻成功!</string>
<string name="save_video_failed">保存視頻失敗</string>
<string name="save_video_too_short">視頻太短啦!</string>
<string name="save_video_wait">視頻處理中稍等</string>
<string name="fu_base_is_tracking_text">檢測到人</string>
<string name="fu_base_incomplete_face_text">不全</string>
<string name="fu_base_input_type_single">單輸</string>
<string name="fu_base_input_type_double">雙輸</string>
<string name="beauty_box_heavy_blur_fine">磨皮</string>
<string name="beauty_box_color_level">美白</string>
<string name="beauty_box_red_level">红润</string>
<string name="beauty_box_sharpen"></string>
<string name="beauty_box_red_level">紅潤</string>
<string name="beauty_box_sharpen"></string>
<string name="beauty_box_eye_bright">亮眼</string>
<string name="beauty_box_tooth_whiten">美牙</string>
<string name="beauty_box_eye_enlarge">大眼</string>
<string name="beauty_box_eye_circle"></string>
<string name="beauty_box_eye_circle"></string>
<string name="beauty_box_cheek_natural">自然</string>
<string name="beauty_box_cheek_goddess">女神</string>
<string name="beauty_box_cheek_long_face">长脸</string>
<string name="beauty_box_cheek_round_face">圆脸</string>
<string name="beauty_box_cheek_thinning"></string>
<string name="beauty_box_cheek_v">V</string>
<string name="beauty_box_cheek_narrow"></string>
<string name="beauty_box_cheek_short"></string>
<string name="beauty_box_cheek_small"></string>
<string name="beauty_box_cheek_long_face">長臉</string>
<string name="beauty_box_cheek_round_face">圓臉</string>
<string name="beauty_box_cheek_thinning"></string>
<string name="beauty_box_cheek_v">V</string>
<string name="beauty_box_cheek_narrow"></string>
<string name="beauty_box_cheek_short"></string>
<string name="beauty_box_cheek_small"></string>
<string name="beauty_box_intensity_chin">下巴</string>
<string name="beauty_box_intensity_forehead">额头</string>
<string name="beauty_box_intensity_forehead">額頭</string>
<string name="beauty_box_intensity_nose">瘦鼻</string>
<string name="beauty_box_intensity_mouth">嘴型</string>
<string name="beauty_box_cheekbones"></string>
<string name="beauty_box_lower_jaw">瘦下</string>
<string name="beauty_radio_skin_beauty"></string>
<string name="beauty_box_cheekbones"></string>
<string name="beauty_box_lower_jaw">瘦下</string>
<string name="beauty_radio_skin_beauty"></string>
<string name="beauty_radio_face_shape">美型</string>
<string name="beauty_radio_filter">滤镜</string>
<string name="beauty_radio_style">格推</string>
<string name="beauty_radio_filter">濾鏡</string>
<string name="beauty_radio_style">格推</string>
<string name="beauty_micro_pouch">去黑眼圈</string>
<string name="beauty_micro_nasolabial">去法令</string>
<string name="beauty_micro_nasolabial">去法令</string>
<string name="beauty_micro_smile">微笑嘴角</string>
<string name="beauty_brow_height">眉毛上下</string>
<string name="beauty_brow_space"></string>
<string name="beauty_micro_canthus">眼角</string>
<string name="beauty_micro_philtrum">人中</string>
<string name="beauty_micro_long_nose"></string>
<string name="beauty_brow_space"></string>
<string name="beauty_micro_canthus">眼角</string>
<string name="beauty_micro_philtrum">人中</string>
<string name="beauty_micro_long_nose"></string>
<string name="beauty_micro_eye_space">眼距</string>
<string name="beauty_micro_eye_rotate">眼睛角度</string>
<string name="makeup_radio_lipstick"></string>
<string name="makeup_radio_blusher"></string>
<string name="makeup_radio_lipstick"></string>
<string name="makeup_radio_blusher"></string>
<string name="makeup_radio_eyebrow">眉毛</string>
<string name="makeup_radio_eye_shadow">眼影</string>
<string name="makeup_radio_eye_liner">线</string>
<string name="makeup_radio_eye_liner"></string>
<string name="makeup_radio_eyelash">睫毛</string>
<string name="makeup_radio_contact_lens">美瞳</string>
<string name="makeup_radio_foundation">粉底</string>
<string name="makeup_radio_highlight">高光</string>
<string name="makeup_radio_shadow"></string>
<string name="makeup_radio_remove"></string>
<string name="makeup_customize">自定</string>
<string name="makeup_radio_shadow"></string>
<string name="makeup_radio_remove"></string>
<string name="makeup_customize">自定</string>
<string name="makeup_peach_blossom">桃花</string>
<string name="makeup_boyfriend">男友</string>
<string name="makeup_clear">清透</string>
<string name="makeup_grapefruit">西柚</string>
<string name="select_data_photo">选择图</string>
<string name="select_data_video">选择视频</string>
<string name="select_data_title">请从相册中选择图片或视频</string>
<string name="image_file_does_not_exist">选图片文件不存在。</string>
<string name="video_file_does_not_exist">选视频文件不存在。</string>
<string name="select_data_photo">選擇圖</string>
<string name="select_data_video">選擇視頻</string>
<string name="select_data_title">請從相冊中選擇圖片或視頻</string>
<string name="image_file_does_not_exist">選圖片文件不存在。</string>
<string name="video_file_does_not_exist">選視頻文件不存在。</string>
<string name="future_warrior">张嘴试试</string>
<string name="jet_mask">鼓腮</string>
<string name="sdx2">皱眉试试</string>
<string name="future_warrior">張嘴試試</string>
<string name="jet_mask">鼓腮</string>
<string name="sdx2">皺眉試試</string>
<string name="luhantongkuan_ztt_fu">眨一眨眼</string>
<string name="qingqing_ztt_fu">嘟嘴试试</string>
<string name="xiaobianzi_zh_fu">微笑触发</string>
<string name="xiaoxueshen_ztt_fu">气触发</string>
<string name="hez_ztt_fu">张嘴试试</string>
<string name="qingqing_ztt_fu">嘟嘴試試</string>
<string name="xiaobianzi_zh_fu">微笑觸發</string>
<string name="xiaoxueshen_ztt_fu">氣觸發</string>
<string name="hez_ztt_fu">張嘴試試</string>
<string name="push_hand">推出手掌</string>
<string name="fu_lm_koreaheart">手手指比心</string>
<string name="ssd_thread_six"></string>
<string name="ssd_thread_cute">拳靠近脸颊卖</string>
<string name="fu_lm_koreaheart">手手指比心</string>
<string name="ssd_thread_six"></string>
<string name="ssd_thread_cute">拳靠近臉頰賣</string>
<string name="origin"></string>
<string name="origin"></string>
<string name="bailiang_1">白亮 1</string>
<string name="bailiang_2">白亮 2</string>
<string name="bailiang_3">白亮 3</string>
@@ -109,23 +109,23 @@
<string name="xiaoqingxin_3">小清新 3</string>
<string name="xiaoqingxin_4">小清新 4</string>
<string name="xiaoqingxin_6">小清新 6</string>
<string name="lengsediao_1">冷色 1</string>
<string name="lengsediao_2">冷色 2</string>
<string name="lengsediao_3">冷色 3</string>
<string name="lengsediao_4">冷色 4</string>
<string name="lengsediao_7">冷色 7</string>
<string name="lengsediao_8">冷色 8</string>
<string name="lengsediao_11">冷色 11</string>
<string name="nuansediao_1">暖色 1</string>
<string name="nuansediao_2">暖色 2</string>
<string name="gexing_1">性 1</string>
<string name="gexing_2">性 2</string>
<string name="gexing_3">性 3</string>
<string name="gexing_4">性 4</string>
<string name="gexing_5">性 5</string>
<string name="gexing_7">性 7</string>
<string name="gexing_10">性 10</string>
<string name="gexing_11">性 11</string>
<string name="lengsediao_1">冷色調 1</string>
<string name="lengsediao_2">冷色調 2</string>
<string name="lengsediao_3">冷色調 3</string>
<string name="lengsediao_4">冷色調 4</string>
<string name="lengsediao_7">冷色調 7</string>
<string name="lengsediao_8">冷色調 8</string>
<string name="lengsediao_11">冷色調 11</string>
<string name="nuansediao_1">暖色調 1</string>
<string name="nuansediao_2">暖色調 2</string>
<string name="gexing_1">性 1</string>
<string name="gexing_2">性 2</string>
<string name="gexing_3">性 3</string>
<string name="gexing_4">性 4</string>
<string name="gexing_5">性 5</string>
<string name="gexing_7">性 7</string>
<string name="gexing_10">性 10</string>
<string name="gexing_11">性 11</string>
<string name="heibai_1">黑白 1</string>
<string name="heibai_2">黑白 2</string>
<string name="heibai_3">黑白 3</string>
@@ -138,14 +138,14 @@
<string name="ziran_6">自然 6</string>
<string name="ziran_7">自然 7</string>
<string name="ziran_8">自然 8</string>
<string name="zhiganhui_1">感灰 1</string>
<string name="zhiganhui_2">感灰 2</string>
<string name="zhiganhui_3">感灰 3</string>
<string name="zhiganhui_4">感灰 4</string>
<string name="zhiganhui_5">感灰 5</string>
<string name="zhiganhui_6">感灰 6</string>
<string name="zhiganhui_7">感灰 7</string>
<string name="zhiganhui_8">感灰 8</string>
<string name="zhiganhui_1">感灰 1</string>
<string name="zhiganhui_2">感灰 2</string>
<string name="zhiganhui_3">感灰 3</string>
<string name="zhiganhui_4">感灰 4</string>
<string name="zhiganhui_5">感灰 5</string>
<string name="zhiganhui_6">感灰 6</string>
<string name="zhiganhui_7">感灰 7</string>
<string name="zhiganhui_8">感灰 8</string>
<string name="mitao_1">蜜桃 1</string>
<string name="mitao_2">蜜桃 2</string>
<string name="mitao_3">蜜桃 3</string>
@@ -155,85 +155,85 @@
<string name="mitao_7">蜜桃 7</string>
<string name="mitao_8">蜜桃 8</string>
<string name="beauty_face_style_none"></string>
<string name="beauty_face_style_1">格 1</string>
<string name="beauty_face_style_2">格 2</string>
<string name="beauty_face_style_3">格 3</string>
<string name="beauty_face_style_4">格 4</string>
<string name="beauty_face_style_5">格 5</string>
<string name="beauty_face_style_6">格 6</string>
<string name="beauty_face_style_7">格 7</string>
<string name="beauty_face_style_toast">使用%s先取消“格推</string>
<string name="beauty_face_style_none"></string>
<string name="beauty_face_style_1">格 1</string>
<string name="beauty_face_style_2">格 2</string>
<string name="beauty_face_style_3">格 3</string>
<string name="beauty_face_style_4">格 4</string>
<string name="beauty_face_style_5">格 5</string>
<string name="beauty_face_style_6">格 6</string>
<string name="beauty_face_style_7">格 7</string>
<string name="beauty_face_style_toast">使用%s先取消“格推</string>
<string name="poster_take_photo">对准线框 正脸拍摄</string>
<string name="poster_change_face_error">换失败</string>
<string name="poster_template_face_none">识别模板的人脸,请重新选择模板</string>
<string name="dialog_no_track_face">检测到人脸,请重新拍</string>
<string name="dialog_no_incomplete_face">不全,重新拍</string>
<string name="dialog_face_rotation_not_valid">脸偏转角度大,请正脸拍摄</string>
<string name="poster_take_photo">對準線框 正臉拍攝</string>
<string name="poster_change_face_error">換失敗</string>
<string name="poster_template_face_none">識別模板的人臉,請重新選擇模板</string>
<string name="dialog_no_track_face">檢測到人臉,請重新拍</string>
<string name="dialog_no_incomplete_face">不全,重新拍</string>
<string name="dialog_face_rotation_not_valid">臉偏轉角度大,請正臉拍攝</string>
<string name="dialog_got">知道啦</string>
<string name="tip_dual_face">检测到多人,请选择一人进行换脸</string>
<string name="tip_dual_face">檢測到多人,請選擇一人進行換臉</string>
<string name="animoji_filter">Animoji</string>
<string name="cartoon_filter">动漫滤镜</string>
<string name="cartoon_filter">動漫濾鏡</string>
<string name="delete_avatar_model">除模型</string>
<string name="delete_avatar_model">除模型</string>
<string name="new_avatar_model">新建模型</string>
<string name="edit_avatar_model">编辑模型</string>
<string name="edit_avatar_model">編輯模型</string>
<string name="avatar_face_hair"></string>
<string name="avatar_face_face"></string>
<string name="avatar_face_hair"></string>
<string name="avatar_face_face"></string>
<string name="avatar_face_eye">眼睛</string>
<string name="avatar_face_lip">嘴唇</string>
<string name="avatar_face_nose">鼻子</string>
<string name="avatar_face_length">脸型长</string>
<string name="avatar_face_width">脸颊宽</string>
<string name="avatar_chin_width">颚宽</string>
<string name="avatar_face_length">臉型長</string>
<string name="avatar_face_width">臉頰寬</string>
<string name="avatar_chin_width">顎寬</string>
<string name="avatar_chin_height">下巴高低</string>
<string name="avatar_eye_position">眼睛位置</string>
<string name="avatar_eye_corner_height">眼角高度</string>
<string name="avatar_eye_height">眼睛高低</string>
<string name="avatar_eye_width">眼睛</string>
<string name="avatar_eye_width">眼睛</string>
<string name="avatar_nose_position">鼻子位置</string>
<string name="avatar_nose_width">鼻翼</string>
<string name="avatar_nose_height">高低</string>
<string name="avatar_nose_width">鼻翼</string>
<string name="avatar_nose_height">高低</string>
<string name="avatar_mouth_position">嘴部位置</string>
<string name="avatar_up_lip_thickness">上唇厚度</string>
<string name="avatar_down_lip_thickness">下唇厚度</string>
<string name="avatar_lip_width">嘴唇</string>
<string name="model_empty_tip">还没有创建过模型哦</string>
<string name="dialog_reset_avatar_model">是否所有参数恢复到默值?</string>
<string name="avatar_face_customize">自定</string>
<string name="avatar_lip_width">嘴唇</string>
<string name="model_empty_tip">還沒有創建過模型哦</string>
<string name="dialog_reset_avatar_model">是否所有參數恢復到默值?</string>
<string name="avatar_face_customize">自定</string>
<string name="avatar_save_succeed">保存成功</string>
<string name="live_photo_back_not_save">返回后前操作将不会被保存哦</string>
<string name="live_photo_btn_delete"></string>
<string name="live_photo_back_not_save">返回后前操作將不會被保存哦</string>
<string name="live_photo_btn_delete"></string>
<string name="live_photo_btn_cancel">取消</string>
<string name="live_photo_btn_delete_">除(%d)</string>
<string name="live_photo_delete_effect">除道具</string>
<string name="live_photo__delete_all"></string>
<string name="live_photo_empty_list_tip">还没有创建过道具哦</string>
<string name="confirm"></string>
<string name="live_photo_btn_delete_">除(%d)</string>
<string name="live_photo_delete_effect">除道具</string>
<string name="live_photo__delete_all"></string>
<string name="live_photo_empty_list_tip">還沒有創建過道具哦</string>
<string name="confirm"></string>
<string name="cancel">取消</string>
<string name="dialog_confirm_delete">确定删除所中的道具?</string>
<string name="toast_delete_succeed">除成功</string>
<string name="toast_delete_failed">除失</string>
<string name="dialog_confirm_delete">確定刪除所中的道具?</string>
<string name="toast_delete_succeed">除成功</string>
<string name="toast_delete_failed">除失</string>
<string name="live_photo_save_succeed">道具保存成功</string>
<string name="recover"></string>
<string name="recover"></string>
<string name="makeup_lip_fog"></string>
<string name="makeup_lip_moist1">润泽</string>
<string name="makeup_lip_moist2">润泽</string>
<string name="makeup_lip_fog"></string>
<string name="makeup_lip_moist1">潤澤</string>
<string name="makeup_lip_moist2">潤澤</string>
<string name="makeup_lip_pearl">珠光</string>
<string name="makeup_lip_bitelip">咬唇</string>
<string name="makeup_blusher_apple">果肌</string>
<string name="makeup_blusher_apple">果肌</string>
<string name="makeup_blusher_fan">扇形</string>
<string name="makeup_blusher_eye_corner">眼角</string>
<string name="makeup_blusher_slight_drunk">微醺</string>
<string name="makeup_highlight_one">高光 I</string>
<string name="makeup_highlight_two">高光 II</string>
<string name="makeup_shadow_one">影 I</string>
<string name="makeup_shadow_one">影 I</string>
<string name="makeup_pupil_1">蜜糖</string>
<string name="makeup_pupil_2">奶茶</string>
<string name="makeup_pupil_3">水波</string>
@@ -241,106 +241,106 @@
<string name="makeup_pupil_5">孔雀</string>
<string name="makeup_pupil_6">星河</string>
<string name="makeup_pupil_7">落目</string>
<string name="makeup_pupil_8"></string>
<string name="makeup_eyebrow_willow"></string>
<string name="makeup_pupil_8"></string>
<string name="makeup_eyebrow_willow">恭弘=叶 恭弘</string>
<string name="makeup_eyebrow_wild">野生眉</string>
<string name="makeup_eyebrow_classical">古典眉</string>
<string name="makeup_eyebrow_standard">标准</string>
<string name="makeup_eye_shadow_single">色眼影</string>
<string name="makeup_eye_shadow_double1">色眼影 I</string>
<string name="makeup_eye_shadow_double2">色眼影 II</string>
<string name="makeup_eye_shadow_double3">色眼影 III</string>
<string name="makeup_eyebrow_standard">標準</string>
<string name="makeup_eye_shadow_single">色眼影</string>
<string name="makeup_eye_shadow_double1">色眼影 I</string>
<string name="makeup_eye_shadow_double2">色眼影 II</string>
<string name="makeup_eye_shadow_double3">色眼影 III</string>
<string name="makeup_eye_shadow_triple1">三色眼影 I</string>
<string name="makeup_eye_shadow_triple2">三色眼影 II</string>
<string name="makeup_eyelash_natural1">自然型 I</string>
<string name="makeup_eyelash_natural2">自然型 II</string>
<string name="makeup_eyelash_thick1">密型 I</string>
<string name="makeup_eyelash_thick2">密型 II</string>
<string name="makeup_eyelash_exaggerate1">夸张型 I</string>
<string name="makeup_eyelash_exaggerate2">夸张型 II</string>
<string name="makeup_eye_linear_cat"></string>
<string name="makeup_eyelash_thick1">密型 I</string>
<string name="makeup_eyelash_thick2">密型 II</string>
<string name="makeup_eyelash_exaggerate1">誇張型 I</string>
<string name="makeup_eyelash_exaggerate2">誇張型 II</string>
<string name="makeup_eye_linear_cat"></string>
<string name="makeup_eye_linear_drooping">下垂眼</string>
<string name="makeup_eye_linear_pull_open">眼距</string>
<string name="makeup_eye_linear_pull_open">眼距</string>
<string name="makeup_eye_linear_pull_close">拉近眼距</string>
<string name="makeup_eye_linear_long"></string>
<string name="makeup_eye_linear_circular"></string>
<string name="makeup_eye_linear_long"></string>
<string name="makeup_eye_linear_circular"></string>
<string name="makeup_combination_diadiatu">嗲嗲兔</string>
<string name="makeup_combination_dongling">冻龄</string>
<string name="makeup_combination_guofeng">国风</string>
<string name="makeup_combination_dongling">凍齡</string>
<string name="makeup_combination_guofeng">國風</string>
<string name="makeup_combination_hunxie">混血</string>
<string name="makeup_combination_sexy">性感</string>
<string name="makeup_combination_sweet">甜美</string>
<string name="makeup_combination_neighbor"></string>
<string name="makeup_combination_occident"></string>
<string name="makeup_combination_charming"></string>
<string name="makeup_combination_jianling">减龄</string>
<string name="makeup_combination_neighbor"></string>
<string name="makeup_combination_occident"></string>
<string name="makeup_combination_charming"></string>
<string name="makeup_combination_jianling">減齡</string>
<string name="makeup_combination_nuandong">暖冬</string>
<string name="makeup_combination_hongfeng">红枫</string>
<string name="makeup_combination_hongfeng">紅楓</string>
<string name="makeup_combination_shaonv">少女</string>
<string name="makeup_combination_ziyun"></string>
<string name="makeup_combination_yanshimao">厌世猫</string>
<string name="makeup_combination_renyu"></string>
<string name="makeup_combination_ziyun"></string>
<string name="makeup_combination_yanshimao">厭世貓</string>
<string name="makeup_combination_renyu"></string>
<string name="makeup_combination_chuqiu">初秋</string>
<string name="makeup_combination_qianzhihe">纸鹤</string>
<string name="makeup_combination_qianzhihe">紙鶴</string>
<string name="makeup_combination_chaomo">超模</string>
<string name="makeup_combination_chuju"></string>
<string name="makeup_combination_gangfeng"></string>
<string name="makeup_combination_chuju"></string>
<string name="makeup_combination_gangfeng"></string>
<string name="makeup_combination_rose">Rose</string>
<string name="slimming">瘦身</string>
<string name="long_legs"></string>
<string name="thin_waist"></string>
<string name="long_legs"></string>
<string name="thin_waist"></string>
<string name="beautify_shoulder">美肩</string>
<string name="beautify_hip_slim">美臀</string>
<string name="beautify_head_slim"></string>
<string name="beautify_head_slim"></string>
<string name="beautify_leg_thin_slim">瘦腿</string>
<string name="toast_not_detect_body">检测到人</string>
<string name="pta_human_full_body">全身驱动</string>
<string name="pta_human_half_body">半身驱动</string>
<string name="toast_not_detect_body">檢測到人</string>
<string name="pta_human_full_body">全身驅動</string>
<string name="pta_human_half_body">半身驅動</string>
<string name="select_data_photo_or_video">载入图片或视频</string>
<string name="toast_not_detect_gesture">检测到手</string>
<string name="select_data_photo_or_video">載入圖片或視頻</string>
<string name="toast_not_detect_gesture">檢測到手</string>
<string name="bg_seg_green_graphic"></string>
<string name="bg_seg_green_graphic"></string>
<string name="bg_seg_green_background">背景</string>
<string name="bg_seg_green_key_color">关键颜</string>
<string name="bg_seg_green_key_color">關鍵顏</string>
<string name="bg_seg_green_similarity">相似度</string>
<string name="bg_seg_green_smooth">平滑</string>
<string name="bg_seg_green_alpha">祛色度</string>
<string name="bg_seg_green_safe_area">安全</string>
<string name="bg_seg_green_safe_area">安全</string>
<string name="bg_seg_green_science">科技</string>
<string name="bg_seg_green_beach"></string>
<string name="bg_seg_green_beach"></string>
<string name="bg_seg_green_classroom">教室</string>
<string name="bg_seg_green_forest">森林</string>
<string name="bg_seg_green_ink">水墨</string>
<string name="dialog_guide_bg_seg_green">使用色背景拍,推荐绿色幕布效果最佳</string>
<string name="bg_seg_green_ink">水墨</string>
<string name="dialog_guide_bg_seg_green">使用色背景拍,推薦綠色幕布效果最佳</string>
<string name="dialog_i_know">我知道了</string>
<string name="download_error">载失败</string>
<string name="download_error">載失敗</string>
<string name="back">返回</string>
<string name="safe_area_tips">白色区域为安全域,不参与绿幕抠</string>
<string name="safe_area_tips">白色區域為安全域,不參与綠幕摳</string>
<string name="brow_height_tips">眉毛上下功能支持在高端上使用</string>
<string name="brow_space_tips">距功能支持在高端上使用</string>
<string name="brow_height_tips">眉毛上下功能支持在高端上使用</string>
<string name="brow_space_tips">距功能支持在高端上使用</string>
<string name="home_function_name_beauty"></string>
<string name="home_function_name_makeup"></string>
<string name="home_function_name_sticker">贴纸</string>
<string name="home_function_name_beauty_body"></string>
<string name="home_function_name_beauty"></string>
<string name="home_function_name_makeup"></string>
<string name="home_function_name_sticker">貼紙</string>
<string name="home_function_name_beauty_body"></string>
<string name="toast_not_detect_face">检测到人</string>
<string name="toast_not_detect_face_or_body">检测到人或人</string>
<string name="toast_not_detect_face">檢測到人</string>
<string name="toast_not_detect_face_or_body">檢測到人或人</string>
<string name="makeup_combination_naicha">奶茶</string>
<string name="makeup_combination_dousha">豆沙</string>
<string name="makeup_combination_chaoa">超A</string>
<string name="home_function_name_big_head">搞笑大</string>
<string name="home_function_name_big_head">搞笑大</string>
<string name="home_function_name_animoji">Animoji</string>
<string name="home_function_name_fine_sticker">精品贴纸</string>
<string name="home_function_name_fine_sticker">精品貼紙</string>
<string name="dialog_reset">重置</string>
<string name="menu_diy">自定義</string>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="colorPrimary">#FF8D41</color>
<color name="colorPrimaryDark">#FF8D41</color>
<color name="colorAccent">#FF8D41</color>
<!--fulive demo 主配色-->
<color name="primary_background">#050F14</color>

View File

@@ -16,33 +16,33 @@
<string name="fu_base_input_type_single">SingleInput</string>
<string name="fu_base_input_type_double">DualInput</string>
<string name="beauty_box_heavy_blur_fine">Fine smooth</string>
<string name="beauty_box_color_level">Whiten</string>
<string name="beauty_box_red_level">Ruddy</string>
<string name="beauty_box_heavy_blur_fine">Buffing</string>
<string name="beauty_box_color_level">Skin Tone</string>
<string name="beauty_box_red_level">Rosy</string>
<string name="beauty_box_sharpen">Sharpen</string>
<string name="beauty_box_eye_bright">Eye brighten</string>
<string name="beauty_box_tooth_whiten">Tooth whiten</string>
<string name="beauty_box_eye_enlarge">Eye enlarge</string>
<string name="beauty_box_eye_circle">Eye round</string>
<string name="beauty_box_cheek_natural">Natural</string>
<string name="beauty_box_eye_bright">Brighen</string>
<string name="beauty_box_tooth_whiten">Whiten</string>
<string name="beauty_box_eye_enlarge">Enlarge</string>
<string name="beauty_box_eye_circle">Round</string>
<string name="beauty_box_cheek_natural">Origin</string>
<string name="beauty_box_cheek_goddess">Goddess</string>
<string name="beauty_box_cheek_long_face">Long face</string>
<string name="beauty_box_cheek_round_face">Round face</string>
<string name="beauty_box_cheekbones">Cheekbone</string>
<string name="beauty_box_lower_jaw">Jawbone</string>
<string name="beauty_box_cheek_thinning">Cheek thin</string>
<string name="beauty_box_cheek_v">V face</string>
<string name="beauty_box_cheek_narrow">CheekNarrow</string>
<string name="beauty_box_cheek_short">Cheek short</string>
<string name="beauty_box_cheek_small">Cheek small</string>
<string name="beauty_box_intensity_chin">Chin</string>
<string name="beauty_box_intensity_forehead">Forehead</string>
<string name="beauty_box_intensity_nose">Nose</string>
<string name="beauty_box_intensity_mouth">Mouth</string>
<string name="beauty_radio_skin_beauty">Skin</string>
<string name="beauty_radio_face_shape">Reshape</string>
<string name="beauty_box_cheekbones">Cheek</string>
<string name="beauty_box_lower_jaw">Jaw</string>
<string name="beauty_box_cheek_thinning">Lower Width</string>
<string name="beauty_box_cheek_v">V Shape</string>
<string name="beauty_box_cheek_narrow">Upper Width</string>
<string name="beauty_box_cheek_short">Short Face</string>
<string name="beauty_box_cheek_small">Size Face</string>
<string name="beauty_box_intensity_chin">Chin Length</string>
<string name="beauty_box_intensity_forehead">Hairline</string>
<string name="beauty_box_intensity_nose">Nose Size</string>
<string name="beauty_box_intensity_mouth">Mouth Size</string>
<string name="beauty_radio_skin_beauty">Skincare</string>
<string name="beauty_radio_face_shape">Beauty type</string>
<string name="beauty_radio_filter">Filter</string>
<string name="beauty_radio_style">Presets</string>
<string name="beauty_radio_style">Style recommend</string>
<string name="makeup_radio_lipstick">Lipstick</string>
<string name="makeup_radio_blusher">Blush</string>
<string name="makeup_radio_eyebrow">Eyebrow</string>
@@ -59,16 +59,16 @@
<string name="makeup_boyfriend">Boyfriend</string>
<string name="makeup_clear">Clear</string>
<string name="makeup_grapefruit">Grapefruit</string>
<string name="beauty_micro_pouch">Circle</string>
<string name="beauty_micro_nasolabial">Wrinkles</string>
<string name="beauty_micro_pouch">Dark Circles</string>
<string name="beauty_micro_nasolabial">Laugh Line</string>
<string name="beauty_micro_smile">Smile</string>
<string name="beauty_brow_height">Brow height</string>
<string name="beauty_brow_space">Brow space</string>
<string name="beauty_micro_canthus">Canthus</string>
<string name="beauty_micro_philtrum">Philtrum</string>
<string name="beauty_micro_long_nose">Length</string>
<string name="beauty_micro_eye_space">Eye distance</string>
<string name="beauty_micro_eye_rotate">Slant</string>
<string name="beauty_brow_height">Brow Position</string>
<string name="beauty_brow_space">Brow Distance</string>
<string name="beauty_micro_canthus">Inner Corner</string>
<string name="beauty_micro_philtrum">Mouth Position</string>
<string name="beauty_micro_long_nose">Nose Lift</string>
<string name="beauty_micro_eye_space">Eye Distance</string>
<string name="beauty_micro_eye_rotate">Eye Upturn</string>
<string name="beauty_face_style_none">None</string>
<string name="beauty_face_style_1">Style 1</string>
<string name="beauty_face_style_2">Style 2</string>
@@ -77,7 +77,7 @@
<string name="beauty_face_style_5">Style 5</string>
<string name="beauty_face_style_6">Style 6</string>
<string name="beauty_face_style_7">Style 7</string>
<string name="beauty_face_style_toast">To use %s, cancel \'Presets\' first.</string>
<string name="beauty_face_style_toast">To use %s, cancel \'Style recommend\' first.</string>
<string name="select_data_photo">Photo</string>
<string name="select_data_video">Video</string>
@@ -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>
@@ -334,4 +334,7 @@
<string name="home_function_name_fine_sticker">Exquisite sticker</string>
<string name="dialog_reset">Reset</string>
<string name="menu_diy">Custom</string>
<string name="toast_not_detect_face">No face tracking</string>
<string name="toast_not_detect_face_or_body">No face or body tracking</string>
</resources>

View File

@@ -1,8 +1,5 @@
package com.yunbao.faceunity;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
@@ -10,8 +7,5 @@ import static org.junit.Assert.*;
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

36
IAP6Helper/build.gradle Normal file
View File

@@ -0,0 +1,36 @@
apply plugin: 'com.android.library'
apply from: "../package_config.gradle"
android {
namespace "com.samsung.iap6helper"
compileSdk rootProject.ext.android.compileSdkVersion
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
targetSdkVersion rootProject.ext.android.targetSdkVersion
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
buildFeatures {
buildConfig = true
}
}
repositories {
flatDir {
dirs 'libs', '../libs'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation 'com.google.code.gson:gson:2.8.6'
}

Binary file not shown.

25
IAP6Helper/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,25 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\sbkim\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,19 @@
package com.samsung.android.iap;
import com.samsung.android.iap.IAPServiceCallback;
interface IAPConnector {
boolean requestCmd(IAPServiceCallback callback, in Bundle bundle);
boolean unregisterCallback(IAPServiceCallback callback);
///////////////////////////// IAP 5.0
Bundle getProductsDetails(String packageName, String itemIds, int pagingIndex, int mode);
Bundle getOwnedList(String packageName, String itemType, int pagingIndex, int mode);
Bundle consumePurchasedItems(String packageName, String purchaseIds, int mode);
Bundle requestServiceAPI(String packageName, String requestId, String extraData);
}

View File

@@ -0,0 +1,7 @@
package com.samsung.android.iap;
import android.os.Bundle;
interface IAPServiceCallback {
oneway void responseCallback(in Bundle bundle);
}

View File

@@ -0,0 +1,134 @@
package com.samsung.utils;
import android.content.Context;
import android.util.Log;
import com.google.gson.Gson;
import com.samsung.android.sdk.iap.lib.constants.HelperDefine;
import com.samsung.android.sdk.iap.lib.helper.IapHelper;
import com.samsung.android.sdk.iap.lib.listener.OnConsumePurchasedItemsListener;
import com.samsung.android.sdk.iap.lib.listener.OnGetOwnedListListener;
import com.samsung.android.sdk.iap.lib.vo.ConsumeVo;
import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
import com.samsung.android.sdk.iap.lib.vo.OwnedProductVo;
import com.samsung.iap6helper.R;
import java.util.ArrayList;
public class SamsungUtil {
private Context mContext;
IapHelper iapHelper;
private static SamsungUtil samsungUtil;
public static SamsungUtil newInstance(Context context) {
if (samsungUtil == null) {
samsungUtil = new SamsungUtil(context);
}
return samsungUtil;
}
public SamsungUtil(Context mContext) {
this.mContext = mContext;
}
/**
* 初始化
*/
public void init() {
iapHelper = IapHelper.getInstance(mContext);
//设置支付模式 OPERATION_MODE_PRODUCTION 正式模式 OPERATION_MODE_TEST 测试模式
iapHelper.setOperationMode(HelperDefine.OperationMode.OPERATION_MODE_PRODUCTION);
}
public void dispose() {
if (iapHelper != null) {
iapHelper.dispose();
}
}
/**
* 购买
*
* @param skuId
*/
public void buy(String skuId, OnPaymentListener onPaymentListener) {
//购买
iapHelper.startPayment(skuId, "", (errorVo, purchaseVo) -> {
if (purchaseVo != null) {
onPaymentListener.onPaymentSuccess(purchaseVo.getPurchaseId());
} else {
if (errorVo.getErrorCode() == HelperDefine.IAP_PAYMENT_IS_CANCELED) {
onPaymentListener.onPaymentFailed(mContext.getString(R.string.pay_cancel));
} else {
onPaymentListener.onPaymentFailed(errorVo.getErrorString());
}
}
});
}
public interface OnPaymentListener {
void onPaymentSuccess(String purchaseVo);
void onPaymentFailed(String errorVo);
}
/**
* 消耗指定商品
*
* @param skuId
*/
public void consume(String skuId) {
//消耗
iapHelper.consumePurchasedItems(skuId, new OnConsumePurchasedItemsListener() {
@Override
public void onConsumePurchasedItems(ErrorVo _errorVO, ArrayList<ConsumeVo> _consumeList) {
if (_consumeList != null) {
Log.e("samsung","消耗:" + new Gson().toJson(_consumeList));
Log.e("samsung","ErrorVo" + _errorVO.dump());
}
}
});
}
public void consumeAll(ArrayList<OwnedProductVo> _ownedList) {
if (_ownedList.size() > 0) {
iapHelper.consumePurchasedItems(_ownedList.get(0).getPurchaseId(), new OnConsumePurchasedItemsListener() {
@Override
public void onConsumePurchasedItems(ErrorVo _errorVO, ArrayList<ConsumeVo> _consumeList1) {
if (_errorVO.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
Log.e("samsung","消耗:" + new Gson().toJson(_consumeList1));
Log.e("samsung","ErrorVo" + _errorVO.dump());
_ownedList.remove(0);
consumeAll(_ownedList);
}
}
});
}
}
/**
* 消耗所有未消耗的消耗品
*/
public void query() {
//查询商品 PRODUCT_TYPE_ITEM 消耗品&非消耗品
iapHelper.getOwnedList(HelperDefine.PRODUCT_TYPE_ITEM, new OnGetOwnedListListener() {
@Override
public void onGetOwnedProducts(ErrorVo _errorVo, ArrayList<OwnedProductVo> _ownedList) {
if (_errorVo != null) {
if (_errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
if (_ownedList != null) {
consumeAll(_ownedList);
}
}
}
}
});
}
}

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** Created with STMS Automation System
*/ -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="pay_cancel">支付取消</string>
<string name="pay_suc">支付成功</string>
<string name="pay_fail">支付失敗</string>
</resources>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** Created with STMS Automation System
*/ -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="pay_cancel">支付取消</string>
<string name="pay_suc">支付成功</string>
<string name="pay_fail">支付失敗</string>
</resources>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** Created with STMS Automation System
*/ -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="pay_cancel">支付取消</string>
<string name="pay_suc">支付成功</string>
<string name="pay_fail">支付失敗</string>
</resources>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pay_cancel">Payment cancellation</string>
<string name="pay_suc">Payment successful</string>
<string name="pay_fail">Payment failed</string>
</resources>

2
SVGAlibrary/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
*.iml

37
SVGAlibrary/build.gradle Normal file
View File

@@ -0,0 +1,37 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 14
targetSdkVersion 28
}
compileOptions {
kotlinOptions.freeCompilerArgs += ['-module-name', "com.opensource.svgaplayer"]
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/ASL2.0'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/MANIFEST.MF'
}
}
dependencies {
implementation 'com.squareup.wire:wire-runtime:4.4.1'
}

17
SVGAlibrary/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/PonyCui_Home/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View File

@@ -0,0 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.opensource.svgaplayer">
<application android:allowBackup="true" android:label="@string/app_name">
</application>
</manifest>

View File

@@ -0,0 +1,9 @@
package com.opensource.svgaplayer
/**
* Created by miaojun on 2019/6/21.
* mail:1290846731@qq.com
*/
interface IClickAreaListener{
fun onResponseArea(key : String,x0 : Int, y0 : Int, x1 : Int, y1 : Int)
}

View File

@@ -0,0 +1,119 @@
package com.opensource.svgaplayer
import android.content.Context
import com.opensource.svgaplayer.utils.log.LogUtils
import java.io.File
import java.net.URL
import java.security.MessageDigest
/**
* SVGA 缓存管理
*/
object SVGACache {
enum class Type {
DEFAULT,
FILE
}
private const val TAG = "SVGACache"
private var type: Type = Type.DEFAULT
private var cacheDir: String = "/"
get() {
if (field != "/") {
val dir = File(field)
if (!dir.exists()) {
dir.mkdirs()
}
}
return field
}
fun onCreate(context: Context?) {
onCreate(context, Type.DEFAULT)
}
fun onCreate(context: Context?, type: Type) {
if (isInitialized()) return
context ?: return
cacheDir = "${context.cacheDir.absolutePath}/svga/"
File(cacheDir).takeIf { !it.exists() }?.mkdirs()
this.type = type
}
/**
* 清理缓存
*/
fun clearCache() {
if (!isInitialized()) {
LogUtils.error(TAG, "SVGACache is not init!")
return
}
SVGAParser.threadPoolExecutor.execute {
clearDir(cacheDir)
LogUtils.info(TAG, "Clear svga cache done!")
}
}
// 清除目录下的所有文件
internal fun clearDir(path: String) {
try {
val dir = File(path)
dir.takeIf { it.exists() }?.let { parentDir ->
parentDir.listFiles()?.forEach { file ->
if (!file.exists()) {
return@forEach
}
if (file.isDirectory) {
clearDir(file.absolutePath)
}
file.delete()
}
}
} catch (e: Exception) {
LogUtils.error(TAG, "Clear svga cache path: $path fail", e)
}
}
fun isInitialized(): Boolean {
return "/" != cacheDir && File(cacheDir).exists()
}
fun isDefaultCache(): Boolean = type == Type.DEFAULT
fun isCached(cacheKey: String): Boolean {
return if (isDefaultCache()) {
buildCacheDir(cacheKey)
} else {
buildSvgaFile(
cacheKey
)
}.exists()
}
fun buildCacheKey(str: String): String {
val messageDigest = MessageDigest.getInstance("MD5")
messageDigest.update(str.toByteArray(charset("UTF-8")))
val digest = messageDigest.digest()
var sb = ""
for (b in digest) {
sb += String.format("%02x", b)
}
return sb
}
fun buildCacheKey(url: URL): String = buildCacheKey(url.toString())
fun buildCacheDir(cacheKey: String): File {
return File("$cacheDir$cacheKey/")
}
fun buildSvgaFile(cacheKey: String): File {
return File("$cacheDir$cacheKey.svga")
}
fun buildAudioFile(audio: String): File {
return File("$cacheDir$audio.mp3")
}
}

View File

@@ -0,0 +1,13 @@
package com.opensource.svgaplayer
/**
* Created by cuiminghui on 2017/3/30.
*/
interface SVGACallback {
fun onPause()
fun onFinished()
fun onRepeat()
fun onStep(frame: Int, percentage: Double)
}

View File

@@ -0,0 +1,9 @@
package com.opensource.svgaplayer
/**
* Created by miaojun on 2019/6/21.
* mail:1290846731@qq.com
*/
interface SVGAClickAreaListener{
fun onClick(clickKey : String)
}

View File

@@ -0,0 +1,106 @@
package com.opensource.svgaplayer
import android.graphics.Canvas
import android.graphics.ColorFilter
import android.graphics.PixelFormat
import android.graphics.drawable.Drawable
import android.widget.ImageView
import com.opensource.svgaplayer.drawer.SVGACanvasDrawer
class SVGADrawable(val videoItem: SVGAVideoEntity, val dynamicItem: SVGADynamicEntity): Drawable() {
constructor(videoItem: SVGAVideoEntity): this(videoItem, SVGADynamicEntity())
var cleared = true
internal set (value) {
if (field == value) {
return
}
field = value
invalidateSelf()
}
var currentFrame = 0
internal set (value) {
if (field == value) {
return
}
field = value
invalidateSelf()
}
var scaleType: ImageView.ScaleType = ImageView.ScaleType.MATRIX
private val drawer = SVGACanvasDrawer(videoItem, dynamicItem)
override fun draw(canvas: Canvas?) {
if (cleared) {
return
}
canvas?.let {
drawer.drawFrame(it,currentFrame, scaleType)
}
}
override fun setAlpha(alpha: Int) {
}
override fun getOpacity(): Int {
return PixelFormat.TRANSPARENT
}
override fun setColorFilter(colorFilter: ColorFilter?) {
}
fun resume() {
videoItem.audioList.forEach { audio ->
audio.playID?.let {
if (SVGASoundManager.isInit()){
SVGASoundManager.resume(it)
}else{
videoItem.soundPool?.resume(it)
}
}
}
}
fun pause() {
videoItem.audioList.forEach { audio ->
audio.playID?.let {
if (SVGASoundManager.isInit()){
SVGASoundManager.pause(it)
}else{
videoItem.soundPool?.pause(it)
}
}
}
}
fun stop() {
videoItem.audioList.forEach { audio ->
audio.playID?.let {
if (SVGASoundManager.isInit()){
SVGASoundManager.stop(it)
}else{
videoItem.soundPool?.stop(it)
}
}
}
}
fun clear() {
videoItem.audioList.forEach { audio ->
audio.playID?.let {
if (SVGASoundManager.isInit()){
SVGASoundManager.stop(it)
}else{
videoItem.soundPool?.stop(it)
}
}
audio.playID = null
}
videoItem.clear()
}
}

View File

@@ -0,0 +1,153 @@
package com.opensource.svgaplayer
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.text.BoringLayout
import android.text.StaticLayout
import android.text.TextPaint
import java.net.HttpURLConnection
import java.net.URL
/**
* Created by cuiminghui on 2017/3/30.
*/
class SVGADynamicEntity {
internal var dynamicHidden: HashMap<String, Boolean> = hashMapOf()
internal var dynamicImage: HashMap<String, Bitmap> = hashMapOf()
internal var dynamicText: HashMap<String, String> = hashMapOf()
internal var dynamicTextPaint: HashMap<String, TextPaint> = hashMapOf()
internal var dynamicStaticLayoutText: HashMap<String, StaticLayout> = hashMapOf()
internal var dynamicBoringLayoutText: HashMap<String, BoringLayout> = hashMapOf()
internal var dynamicDrawer: HashMap<String, (canvas: Canvas, frameIndex: Int) -> Boolean> = hashMapOf()
//点击事件回调map
internal var mClickMap : HashMap<String, IntArray> = hashMapOf()
internal var dynamicIClickArea: HashMap<String, IClickAreaListener> = hashMapOf()
internal var dynamicDrawerSized: HashMap<String, (canvas: Canvas, frameIndex: Int, width: Int, height: Int) -> Boolean> = hashMapOf()
internal var isTextDirty = false
fun setHidden(value: Boolean, forKey: String) {
this.dynamicHidden.put(forKey, value)
}
fun setDynamicImage(bitmap: Bitmap, forKey: String) {
this.dynamicImage.put(forKey, bitmap)
}
fun setDynamicImage(url: String, forKey: String) {
val handler = android.os.Handler()
SVGAParser.threadPoolExecutor.execute {
(URL(url).openConnection() as? HttpURLConnection)?.let {
try {
it.connectTimeout = 20 * 1000
it.requestMethod = "GET"
it.connect()
it.inputStream.use { stream ->
BitmapFactory.decodeStream(stream)?.let {
handler.post { setDynamicImage(it, forKey) }
}
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
try {
it.disconnect()
} catch (disconnectException: Throwable) {
// ignored here
}
}
}
}
}
fun setDynamicText(text: String, textPaint: TextPaint, forKey: String) {
this.isTextDirty = true
this.dynamicText.put(forKey, text)
this.dynamicTextPaint.put(forKey, textPaint)
}
fun setDynamicText(layoutText: StaticLayout, forKey: String) {
this.isTextDirty = true
this.dynamicStaticLayoutText.put(forKey, layoutText)
}
fun setDynamicText(layoutText: BoringLayout, forKey: String) {
this.isTextDirty = true
BoringLayout.isBoring(layoutText.text,layoutText.paint)?.let {
this.dynamicBoringLayoutText.put(forKey,layoutText)
}
}
fun setDynamicDrawer(drawer: (canvas: Canvas, frameIndex: Int) -> Boolean, forKey: String) {
this.dynamicDrawer.put(forKey, drawer)
}
fun setClickArea(clickKey: List<String>) {
for(itemKey in clickKey){
dynamicIClickArea.put(itemKey,object : IClickAreaListener {
override fun onResponseArea(key: String, x0: Int, y0: Int, x1: Int, y1: Int) {
mClickMap.let {
if(it.get(key) == null){
it.put(key, intArrayOf(x0,y0,x1,y1))
}else{
it.get(key)?.let {
it[0] = x0
it[1] = y0
it[2] = x1
it[3] = y1
}
}
}
}
})
}
}
fun setClickArea(clickKey: String) {
dynamicIClickArea.put(clickKey, object : IClickAreaListener {
override fun onResponseArea(key: String, x0: Int, y0: Int, x1: Int, y1: Int) {
mClickMap.let {
if (it.get(key) == null) {
it.put(key, intArrayOf(x0, y0, x1, y1))
} else {
it.get(key)?.let {
it[0] = x0
it[1] = y0
it[2] = x1
it[3] = y1
}
}
}
}
})
}
fun setDynamicDrawerSized(drawer: (canvas: Canvas, frameIndex: Int, width: Int, height: Int) -> Boolean, forKey: String) {
this.dynamicDrawerSized.put(forKey, drawer)
}
fun clearDynamicObjects() {
this.isTextDirty = true
this.dynamicHidden.clear()
this.dynamicImage.clear()
this.dynamicText.clear()
this.dynamicTextPaint.clear()
this.dynamicStaticLayoutText.clear()
this.dynamicBoringLayoutText.clear()
this.dynamicDrawer.clear()
this.dynamicIClickArea.clear()
this.mClickMap.clear()
this.dynamicDrawerSized.clear()
}
}

View File

@@ -0,0 +1,329 @@
package com.opensource.svgaplayer
import android.animation.Animator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.ImageView
import com.opensource.svgaplayer.utils.SVGARange
import com.opensource.svgaplayer.utils.log.LogUtils
import java.lang.ref.WeakReference
import java.net.URL
/**
* Created by PonyCui on 2017/3/29.
*/
open class SVGAImageView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ImageView(context, attrs, defStyleAttr) {
private val TAG = "SVGAImageView"
enum class FillMode {
Backward,
Forward,
Clear,
}
var isAnimating = false
private set
var loops = 0
@Deprecated(
"It is recommended to use clearAfterDetached, or manually call to SVGAVideoEntity#clear." +
"If you just consider cleaning up the canvas after playing, you can use FillMode#Clear.",
level = DeprecationLevel.WARNING
)
var clearsAfterStop = false
var clearsAfterDetached = false
var fillMode: FillMode = FillMode.Forward
var callback: SVGACallback? = null
private var mAnimator: ValueAnimator? = null
private var mItemClickAreaListener: SVGAClickAreaListener? = null
private var mAntiAlias = true
private var mAutoPlay = true
private val mAnimatorListener = AnimatorListener(this)
private val mAnimatorUpdateListener = AnimatorUpdateListener(this)
private var mStartFrame = 0
private var mEndFrame = 0
init {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
this.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
}
attrs?.let { loadAttrs(it) }
}
private fun loadAttrs(attrs: AttributeSet) {
val typedArray = context.theme.obtainStyledAttributes(attrs, R.styleable.SVGAImageView, 0, 0)
loops = typedArray.getInt(R.styleable.SVGAImageView_loopCount, 0)
clearsAfterStop = typedArray.getBoolean(R.styleable.SVGAImageView_clearsAfterStop, false)
clearsAfterDetached = typedArray.getBoolean(R.styleable.SVGAImageView_clearsAfterDetached, false)
mAntiAlias = typedArray.getBoolean(R.styleable.SVGAImageView_antiAlias, true)
mAutoPlay = typedArray.getBoolean(R.styleable.SVGAImageView_autoPlay, true)
typedArray.getString(R.styleable.SVGAImageView_fillMode)?.let {
when (it) {
"0" -> {
fillMode = FillMode.Backward
}
"1" -> {
fillMode = FillMode.Forward
}
"2" -> {
fillMode = FillMode.Clear
}
}
}
typedArray.getString(R.styleable.SVGAImageView_source)?.let {
parserSource(it)
}
typedArray.recycle()
}
private fun parserSource(source: String) {
val refImgView = WeakReference<SVGAImageView>(this)
val parser = SVGAParser(context)
if (source.startsWith("http://") || source.startsWith("https://")) {
parser.decodeFromURL(URL(source), createParseCompletion(refImgView))
} else {
parser.decodeFromAssets(source, createParseCompletion(refImgView))
}
}
private fun createParseCompletion(ref: WeakReference<SVGAImageView>): SVGAParser.ParseCompletion {
return object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
ref.get()?.startAnimation(videoItem)
}
override fun onError() {}
}
}
private fun startAnimation(videoItem: SVGAVideoEntity) {
this@SVGAImageView.post {
videoItem.antiAlias = mAntiAlias
setVideoItem(videoItem)
getSVGADrawable()?.scaleType = scaleType
if (mAutoPlay) {
startAnimation()
}
}
}
fun startAnimation() {
startAnimation(null, false)
}
fun startAnimation(range: SVGARange?, reverse: Boolean = false) {
stopAnimation(false)
play(range, reverse)
}
private fun play(range: SVGARange?, reverse: Boolean) {
LogUtils.info(TAG, "================ start animation ================")
val drawable = getSVGADrawable() ?: return
setupDrawable()
mStartFrame = Math.max(0, range?.location ?: 0)
val videoItem = drawable.videoItem
mEndFrame = Math.min(videoItem.frames - 1, ((range?.location ?: 0) + (range?.length ?: Int.MAX_VALUE) - 1))
val animator = ValueAnimator.ofInt(mStartFrame, mEndFrame)
animator.interpolator = LinearInterpolator()
animator.duration = ((mEndFrame - mStartFrame + 1) * (1000 / videoItem.FPS) / generateScale()).toLong()
animator.repeatCount = if (loops <= 0) 99999 else loops - 1
animator.addUpdateListener(mAnimatorUpdateListener)
animator.addListener(mAnimatorListener)
if (reverse) {
animator.reverse()
} else {
animator.start()
}
mAnimator = animator
}
private fun setupDrawable() {
val drawable = getSVGADrawable() ?: return
drawable.cleared = false
drawable.scaleType = scaleType
}
private fun getSVGADrawable(): SVGADrawable? {
return drawable as? SVGADrawable
}
@Suppress("UNNECESSARY_SAFE_CALL")
private fun generateScale(): Double {
var scale = 1.0
try {
val animatorClass = Class.forName("android.animation.ValueAnimator") ?: return scale
val getMethod = animatorClass.getDeclaredMethod("getDurationScale") ?: return scale
scale = (getMethod.invoke(animatorClass) as Float).toDouble()
if (scale == 0.0) {
val setMethod = animatorClass.getDeclaredMethod("setDurationScale",Float::class.java) ?: return scale
setMethod.isAccessible = true
setMethod.invoke(animatorClass,1.0f)
scale = 1.0
LogUtils.info(TAG,
"The animation duration scale has been reset to" +
" 1.0x, because you closed it on developer options.")
}
} catch (ignore: Exception) {
ignore.printStackTrace()
}
return scale
}
private fun onAnimatorUpdate(animator: ValueAnimator?) {
val drawable = getSVGADrawable() ?: return
drawable.currentFrame = animator?.animatedValue as Int
val percentage = (drawable.currentFrame + 1).toDouble() / drawable.videoItem.frames.toDouble()
callback?.onStep(drawable.currentFrame, percentage)
}
private fun onAnimationEnd(animation: Animator?) {
isAnimating = false
stopAnimation()
val drawable = getSVGADrawable()
if (drawable != null) {
when (fillMode) {
FillMode.Backward -> {
drawable.currentFrame = mStartFrame
}
FillMode.Forward -> {
drawable.currentFrame = mEndFrame
}
FillMode.Clear -> {
drawable.cleared = true
}
}
}
callback?.onFinished()
}
fun clear() {
getSVGADrawable()?.cleared = true
getSVGADrawable()?.clear()
// 清除对 drawable 的引用
setImageDrawable(null)
}
fun pauseAnimation() {
stopAnimation(false)
callback?.onPause()
}
fun stopAnimation() {
stopAnimation(clear = clearsAfterStop)
}
fun stopAnimation(clear: Boolean) {
mAnimator?.cancel()
mAnimator?.removeAllListeners()
mAnimator?.removeAllUpdateListeners()
getSVGADrawable()?.stop()
getSVGADrawable()?.cleared = clear
}
fun setVideoItem(videoItem: SVGAVideoEntity?) {
setVideoItem(videoItem, SVGADynamicEntity())
}
fun setVideoItem(videoItem: SVGAVideoEntity?, dynamicItem: SVGADynamicEntity?) {
if (videoItem == null) {
setImageDrawable(null)
} else {
val drawable = SVGADrawable(videoItem, dynamicItem ?: SVGADynamicEntity())
drawable.cleared = true
setImageDrawable(drawable)
}
}
fun stepToFrame(frame: Int, andPlay: Boolean) {
pauseAnimation()
val drawable = getSVGADrawable() ?: return
drawable.currentFrame = frame
if (andPlay) {
startAnimation()
mAnimator?.let {
it.currentPlayTime = (Math.max(0.0f, Math.min(1.0f, (frame.toFloat() / drawable.videoItem.frames.toFloat()))) * it.duration).toLong()
}
}
}
fun stepToPercentage(percentage: Double, andPlay: Boolean) {
val drawable = drawable as? SVGADrawable ?: return
var frame = (drawable.videoItem.frames * percentage).toInt()
if (frame >= drawable.videoItem.frames && frame > 0) {
frame = drawable.videoItem.frames - 1
}
stepToFrame(frame, andPlay)
}
fun setOnAnimKeyClickListener(clickListener : SVGAClickAreaListener){
mItemClickAreaListener = clickListener
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action != MotionEvent.ACTION_DOWN) {
return super.onTouchEvent(event)
}
val drawable = getSVGADrawable() ?: return super.onTouchEvent(event)
for ((key, value) in drawable.dynamicItem.mClickMap) {
if (event.x >= value[0] && event.x <= value[2] && event.y >= value[1] && event.y <= value[3]) {
mItemClickAreaListener?.let {
it.onClick(key)
return true
}
}
}
return super.onTouchEvent(event)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
stopAnimation(clearsAfterDetached)
if (clearsAfterDetached) {
clear()
}
}
private class AnimatorListener(view: SVGAImageView) : Animator.AnimatorListener {
private val weakReference = WeakReference<SVGAImageView>(view)
override fun onAnimationRepeat(animation: Animator?) {
weakReference.get()?.callback?.onRepeat()
}
override fun onAnimationEnd(animation: Animator?) {
weakReference.get()?.onAnimationEnd(animation)
}
override fun onAnimationCancel(animation: Animator?) {
weakReference.get()?.isAnimating = false
}
override fun onAnimationStart(animation: Animator?) {
weakReference.get()?.isAnimating = true
}
} // end of AnimatorListener
private class AnimatorUpdateListener(view: SVGAImageView) : ValueAnimator.AnimatorUpdateListener {
private val weakReference = WeakReference<SVGAImageView>(view)
override fun onAnimationUpdate(animation: ValueAnimator?) {
weakReference.get()?.onAnimatorUpdate(animation)
}
} // end of AnimatorUpdateListener
}

View File

@@ -0,0 +1,565 @@
package com.opensource.svgaplayer
import android.content.Context
import android.net.http.HttpResponseCache
import android.os.Handler
import android.os.Looper
import com.opensource.svgaplayer.proto.MovieEntity
import com.opensource.svgaplayer.utils.log.LogUtils
import org.json.JSONObject
import java.io.*
import java.net.HttpURLConnection
import java.net.URL
import java.util.concurrent.Executors
import java.util.concurrent.ThreadPoolExecutor
import java.util.concurrent.atomic.AtomicInteger
import java.util.zip.Inflater
import java.util.zip.ZipInputStream
/**
* Created by PonyCui 16/6/18.
*/
private var fileLock: Int = 0
private var isUnzipping = false
class SVGAParser(context: Context?) {
private var mContext = context?.applicationContext
init {
SVGACache.onCreate(context)
}
@Volatile
private var mFrameWidth: Int = 0
@Volatile
private var mFrameHeight: Int = 0
interface ParseCompletion {
fun onComplete(videoItem: SVGAVideoEntity)
fun onError()
}
interface PlayCallback{
fun onPlay(file: List<File>)
}
open class FileDownloader {
var noCache = false
open fun resume(url: URL, complete: (inputStream: InputStream) -> Unit, failure: (e: Exception) -> Unit): () -> Unit {
var cancelled = false
val cancelBlock = {
cancelled = true
}
threadPoolExecutor.execute {
try {
LogUtils.info(TAG, "================ svga file download start ================")
if (HttpResponseCache.getInstalled() == null && !noCache) {
LogUtils.error(TAG, "SVGAParser can not handle cache before install HttpResponseCache. see https://github.com/yyued/SVGAPlayer-Android#cache")
LogUtils.error(TAG, "在配置 HttpResponseCache 前 SVGAParser 无法缓存. 查看 https://github.com/yyued/SVGAPlayer-Android#cache ")
}
(url.openConnection() as? HttpURLConnection)?.let {
it.connectTimeout = 20 * 1000
it.requestMethod = "GET"
it.setRequestProperty("Connection", "close")
it.connect()
it.inputStream.use { inputStream ->
ByteArrayOutputStream().use { outputStream ->
val buffer = ByteArray(4096)
var count: Int
while (true) {
if (cancelled) {
LogUtils.warn(TAG, "================ svga file download canceled ================")
break
}
count = inputStream.read(buffer, 0, 4096)
if (count == -1) {
break
}
outputStream.write(buffer, 0, count)
}
if (cancelled) {
LogUtils.warn(TAG, "================ svga file download canceled ================")
return@execute
}
ByteArrayInputStream(outputStream.toByteArray()).use {
LogUtils.info(TAG, "================ svga file download complete ================")
complete(it)
}
}
}
}
} catch (e: Exception) {
LogUtils.error(TAG, "================ svga file download fail ================")
LogUtils.error(TAG, "error: ${e.message}")
e.printStackTrace()
failure(e)
}
}
return cancelBlock
}
}
var fileDownloader = FileDownloader()
companion object {
private const val TAG = "SVGAParser"
private val threadNum = AtomicInteger(0)
private var mShareParser = SVGAParser(null)
internal var threadPoolExecutor = Executors.newCachedThreadPool { r ->
Thread(r, "SVGAParser-Thread-${threadNum.getAndIncrement()}")
}
fun setThreadPoolExecutor(executor: ThreadPoolExecutor) {
threadPoolExecutor = executor
}
fun shareParser(): SVGAParser {
return mShareParser
}
}
fun init(context: Context) {
mContext = context.applicationContext
SVGACache.onCreate(mContext)
}
fun setFrameSize(frameWidth: Int, frameHeight: Int) {
mFrameWidth = frameWidth
mFrameHeight = frameHeight
}
fun decodeFromAssets(
name: String,
callback: ParseCompletion?,
playCallback: PlayCallback? = null
) {
if (mContext == null) {
LogUtils.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。")
return
}
LogUtils.info(TAG, "================ decode $name from assets ================")
threadPoolExecutor.execute {
try {
mContext?.assets?.open(name)?.let {
this.decodeFromInputStream(
it,
SVGACache.buildCacheKey("file:///assets/$name"),
callback,
true,
playCallback,
alias = name
)
}
} catch (e: Exception) {
this.invokeErrorCallback(e, callback, name)
}
}
}
fun decodeFromURL(
url: URL,
callback: ParseCompletion?,
playCallback: PlayCallback? = null
): (() -> Unit)? {
if (mContext == null) {
LogUtils.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。")
return null
}
val urlPath = url.toString()
LogUtils.info(TAG, "================ decode from url: $urlPath ================")
val cacheKey = SVGACache.buildCacheKey(url);
return if (SVGACache.isCached(cacheKey)) {
LogUtils.info(TAG, "this url cached")
threadPoolExecutor.execute {
if (SVGACache.isDefaultCache()) {
this.decodeFromCacheKey(cacheKey, callback, alias = urlPath)
} else {
this.decodeFromSVGAFileCacheKey(cacheKey, callback, playCallback, alias = urlPath)
}
}
return null
} else {
LogUtils.info(TAG, "no cached, prepare to download")
fileDownloader.resume(url, {
this.decodeFromInputStream(
it,
cacheKey,
callback,
false,
playCallback,
alias = urlPath
)
}, {
LogUtils.error(
TAG,
"================ svga file: $url download fail ================"
)
this.invokeErrorCallback(it, callback, alias = urlPath)
})
}
}
/**
* 读取解析本地缓存的 svga 文件.
*/
fun decodeFromSVGAFileCacheKey(
cacheKey: String,
callback: ParseCompletion?,
playCallback: PlayCallback?,
alias: String? = null
) {
threadPoolExecutor.execute {
try {
LogUtils.info(TAG, "================ decode $alias from svga cachel file to entity ================")
FileInputStream(SVGACache.buildSvgaFile(cacheKey)).use { inputStream ->
readAsBytes(inputStream)?.let { bytes ->
if (isZipFile(bytes)) {
this.decodeFromCacheKey(cacheKey, callback, alias)
} else {
LogUtils.info(TAG, "inflate start")
inflate(bytes)?.let {
LogUtils.info(TAG, "inflate complete")
val videoItem = SVGAVideoEntity(
MovieEntity.ADAPTER.decode(it),
File(cacheKey),
mFrameWidth,
mFrameHeight
)
LogUtils.info(TAG, "SVGAVideoEntity prepare start")
videoItem.prepare({
LogUtils.info(TAG, "SVGAVideoEntity prepare success")
this.invokeCompleteCallback(videoItem, callback, alias)
},playCallback)
} ?: this.invokeErrorCallback(
Exception("inflate(bytes) cause exception"),
callback,
alias
)
}
} ?: this.invokeErrorCallback(
Exception("readAsBytes(inputStream) cause exception"),
callback,
alias
)
}
} catch (e: java.lang.Exception) {
this.invokeErrorCallback(e, callback, alias)
} finally {
LogUtils.info(TAG, "================ decode $alias from svga cachel file to entity end ================")
}
}
}
fun decodeFromInputStream(
inputStream: InputStream,
cacheKey: String,
callback: ParseCompletion?,
closeInputStream: Boolean = false,
playCallback: PlayCallback? = null,
alias: String? = null
) {
if (mContext == null) {
LogUtils.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。")
return
}
LogUtils.info(TAG, "================ decode $alias from input stream ================")
threadPoolExecutor.execute {
try {
readAsBytes(inputStream)?.let { bytes ->
if (isZipFile(bytes)) {
LogUtils.info(TAG, "decode from zip file")
if (!SVGACache.buildCacheDir(cacheKey).exists() || isUnzipping) {
synchronized(fileLock) {
if (!SVGACache.buildCacheDir(cacheKey).exists()) {
isUnzipping = true
LogUtils.info(TAG, "no cached, prepare to unzip")
ByteArrayInputStream(bytes).use {
unzip(it, cacheKey)
isUnzipping = false
LogUtils.info(TAG, "unzip success")
}
}
}
}
this.decodeFromCacheKey(cacheKey, callback, alias)
} else {
if (!SVGACache.isDefaultCache()) {
// 如果 SVGACache 设置类型为 FILE
threadPoolExecutor.execute {
SVGACache.buildSvgaFile(cacheKey).let { cacheFile ->
try {
cacheFile.takeIf { !it.exists() }?.createNewFile()
FileOutputStream(cacheFile).write(bytes)
} catch (e: Exception) {
LogUtils.error(TAG, "create cache file fail.", e)
cacheFile.delete()
}
}
}
}
LogUtils.info(TAG, "inflate start")
inflate(bytes)?.let {
LogUtils.info(TAG, "inflate complete")
val videoItem = SVGAVideoEntity(
MovieEntity.ADAPTER.decode(it),
File(cacheKey),
mFrameWidth,
mFrameHeight
)
LogUtils.info(TAG, "SVGAVideoEntity prepare start")
videoItem.prepare({
LogUtils.info(TAG, "SVGAVideoEntity prepare success")
this.invokeCompleteCallback(videoItem, callback, alias)
},playCallback)
} ?: this.invokeErrorCallback(
Exception("inflate(bytes) cause exception"),
callback,
alias
)
}
} ?: this.invokeErrorCallback(
Exception("readAsBytes(inputStream) cause exception"),
callback,
alias
)
} catch (e: java.lang.Exception) {
this.invokeErrorCallback(e, callback, alias)
} finally {
if (closeInputStream) {
inputStream.close()
}
LogUtils.info(TAG, "================ decode $alias from input stream end ================")
}
}
}
/**
* @deprecated from 2.4.0
*/
@Deprecated("This method has been deprecated from 2.4.0.", ReplaceWith("this.decodeFromAssets(assetsName, callback)"))
fun parse(assetsName: String, callback: ParseCompletion?) {
this.decodeFromAssets(assetsName, callback,null)
}
/**
* @deprecated from 2.4.0
*/
@Deprecated("This method has been deprecated from 2.4.0.", ReplaceWith("this.decodeFromURL(url, callback)"))
fun parse(url: URL, callback: ParseCompletion?) {
this.decodeFromURL(url, callback,null)
}
/**
* @deprecated from 2.4.0
*/
@Deprecated("This method has been deprecated from 2.4.0.", ReplaceWith("this.decodeFromInputStream(inputStream, cacheKey, callback, closeInputStream)"))
fun parse(
inputStream: InputStream,
cacheKey: String,
callback: ParseCompletion?,
closeInputStream: Boolean = false
) {
this.decodeFromInputStream(inputStream, cacheKey, callback, closeInputStream,null)
}
private fun invokeCompleteCallback(
videoItem: SVGAVideoEntity,
callback: ParseCompletion?,
alias: String?
) {
Handler(Looper.getMainLooper()).post {
LogUtils.info(TAG, "================ $alias parser complete ================")
callback?.onComplete(videoItem)
}
}
private fun invokeErrorCallback(
e: Exception,
callback: ParseCompletion?,
alias: String?
) {
e.printStackTrace()
LogUtils.error(TAG, "================ $alias parser error ================")
LogUtils.error(TAG, "$alias parse error", e)
Handler(Looper.getMainLooper()).post {
callback?.onError()
}
}
private fun decodeFromCacheKey(
cacheKey: String,
callback: ParseCompletion?,
alias: String?
) {
LogUtils.info(TAG, "================ decode $alias from cache ================")
LogUtils.debug(TAG, "decodeFromCacheKey called with cacheKey : $cacheKey")
if (mContext == null) {
LogUtils.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。")
return
}
try {
val cacheDir = SVGACache.buildCacheDir(cacheKey)
File(cacheDir, "movie.binary").takeIf { it.isFile }?.let { binaryFile ->
try {
LogUtils.info(TAG, "binary change to entity")
FileInputStream(binaryFile).use {
LogUtils.info(TAG, "binary change to entity success")
this.invokeCompleteCallback(
SVGAVideoEntity(
MovieEntity.ADAPTER.decode(it),
cacheDir,
mFrameWidth,
mFrameHeight
),
callback,
alias
)
}
} catch (e: Exception) {
LogUtils.error(TAG, "binary change to entity fail", e)
cacheDir.delete()
binaryFile.delete()
throw e
}
}
File(cacheDir, "movie.spec").takeIf { it.isFile }?.let { jsonFile ->
try {
LogUtils.info(TAG, "spec change to entity")
FileInputStream(jsonFile).use { fileInputStream ->
ByteArrayOutputStream().use { byteArrayOutputStream ->
val buffer = ByteArray(2048)
while (true) {
val size = fileInputStream.read(buffer, 0, buffer.size)
if (size == -1) {
break
}
byteArrayOutputStream.write(buffer, 0, size)
}
byteArrayOutputStream.toString().let {
JSONObject(it).let {
LogUtils.info(TAG, "spec change to entity success")
this.invokeCompleteCallback(
SVGAVideoEntity(
it,
cacheDir,
mFrameWidth,
mFrameHeight
),
callback,
alias
)
}
}
}
}
} catch (e: Exception) {
LogUtils.error(TAG, "$alias movie.spec change to entity fail", e)
cacheDir.delete()
jsonFile.delete()
throw e
}
}
} catch (e: Exception) {
this.invokeErrorCallback(e, callback, alias)
}
}
private fun readAsBytes(inputStream: InputStream): ByteArray? {
ByteArrayOutputStream().use { byteArrayOutputStream ->
val byteArray = ByteArray(2048)
while (true) {
val count = inputStream.read(byteArray, 0, 2048)
if (count <= 0) {
break
} else {
byteArrayOutputStream.write(byteArray, 0, count)
}
}
return byteArrayOutputStream.toByteArray()
}
}
private fun inflate(byteArray: ByteArray): ByteArray? {
val inflater = Inflater()
inflater.setInput(byteArray, 0, byteArray.size)
val inflatedBytes = ByteArray(2048)
ByteArrayOutputStream().use { inflatedOutputStream ->
while (true) {
val count = inflater.inflate(inflatedBytes, 0, 2048)
if (count <= 0) {
break
} else {
inflatedOutputStream.write(inflatedBytes, 0, count)
}
}
inflater.end()
return inflatedOutputStream.toByteArray()
}
}
// 是否是 zip 文件
private fun isZipFile(bytes: ByteArray): Boolean {
return bytes.size > 4 && bytes[0].toInt() == 80 && bytes[1].toInt() == 75 && bytes[2].toInt() == 3 && bytes[3].toInt() == 4
}
// 解压
private fun unzip(inputStream: InputStream, cacheKey: String) {
LogUtils.info(TAG, "================ unzip prepare ================")
val cacheDir = SVGACache.buildCacheDir(cacheKey)
cacheDir.mkdirs()
try {
BufferedInputStream(inputStream).use {
ZipInputStream(it).use { zipInputStream ->
while (true) {
val zipItem = zipInputStream.nextEntry ?: break
if (zipItem.name.contains("../")) {
// 解压路径存在路径穿越问题,直接过滤
continue
}
if (zipItem.name.contains("/")) {
continue
}
val file = File(cacheDir, zipItem.name)
ensureUnzipSafety(file, cacheDir.absolutePath)
FileOutputStream(file).use { fileOutputStream ->
val buff = ByteArray(2048)
while (true) {
val readBytes = zipInputStream.read(buff)
if (readBytes <= 0) {
break
}
fileOutputStream.write(buff, 0, readBytes)
}
}
LogUtils.error(TAG, "================ unzip complete ================")
zipInputStream.closeEntry()
}
}
}
} catch (e: Exception) {
LogUtils.error(TAG, "================ unzip error ================")
LogUtils.error(TAG, "error", e)
SVGACache.clearDir(cacheDir.absolutePath)
cacheDir.delete()
throw e
}
}
// 检查 zip 路径穿透
private fun ensureUnzipSafety(outputFile: File, dstDirPath: String) {
val dstDirCanonicalPath = File(dstDirPath).canonicalPath
val outputFileCanonicalPath = outputFile.canonicalPath
if (!outputFileCanonicalPath.startsWith(dstDirCanonicalPath)) {
throw IOException("Found Zip Path Traversal Vulnerability with $dstDirCanonicalPath")
}
}
}

View File

@@ -0,0 +1,19 @@
package com.opensource.svgaplayer
import android.content.Context
import android.util.AttributeSet
/**
* Created by cuiminghui on 2017/3/30.
* @deprecated from 2.4.0
*/
@Deprecated("This class has been deprecated from 2.4.0. We don't recommend you to use it.")
class SVGAPlayer: SVGAImageView {
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
}

View File

@@ -0,0 +1,194 @@
package com.opensource.svgaplayer
/**
* @author Devin
*
* Created on 2/24/21.
*/
import android.media.AudioAttributes
import android.media.AudioManager
import android.media.SoundPool
import android.os.Build
import com.opensource.svgaplayer.utils.log.LogUtils
import java.io.FileDescriptor
/**
* Author : llk
* Time : 2020/10/24
* Description : svga 音频加载管理类
* 将 SoundPool 抽取到单例里边,规避 load 资源之后不回调 onLoadComplete 的问题。
*
* 需要对 SVGASoundManager 进行初始化
*
* 相关文章Android SoundPool 崩溃问题研究
* https://zhuanlan.zhihu.com/p/29985198
*/
object SVGASoundManager {
private val TAG = SVGASoundManager::class.java.simpleName
private var soundPool: SoundPool? = null
private val soundCallBackMap: MutableMap<Int, SVGASoundCallBack> = mutableMapOf()
/**
* 音量设置,范围在 [0, 1] 之间
*/
private var volume: Float = 1f
/**
* 音频回调
*/
internal interface SVGASoundCallBack {
// 音量发生变化
fun onVolumeChange(value: Float)
// 音频加载完成
fun onComplete()
}
fun init() {
init(20)
}
fun init(maxStreams: Int) {
LogUtils.debug(TAG, "**************** init **************** $maxStreams")
if (soundPool != null) {
return
}
soundPool = getSoundPool(maxStreams)
soundPool?.setOnLoadCompleteListener { _, soundId, status ->
LogUtils.debug(TAG, "SoundPool onLoadComplete soundId=$soundId status=$status")
if (status == 0) { //加载该声音成功
if (soundCallBackMap.containsKey(soundId)) {
soundCallBackMap[soundId]?.onComplete()
}
}
}
}
fun release() {
LogUtils.debug(TAG, "**************** release ****************")
if (soundCallBackMap.isNotEmpty()) {
soundCallBackMap.clear()
}
}
/**
* 根据当前播放实体,设置音量
*
* @param volume 范围在 [0, 1]
* @param entity 根据需要控制对应 entity 音量大小,若为空则控制所有正在播放的音频音量
*/
fun setVolume(volume: Float, entity: SVGAVideoEntity? = null) {
if (!checkInit()) {
return
}
if (volume < 0f || volume > 1f) {
LogUtils.error(TAG, "The volume level is in the range of 0 to 1 ")
return
}
if (entity == null) {
this.volume = volume
val iterator = soundCallBackMap.entries.iterator()
while (iterator.hasNext()) {
val e = iterator.next()
e.value.onVolumeChange(volume)
}
return
}
val soundPool = soundPool ?: return
entity.audioList.forEach { audio ->
val streamId = audio.playID ?: return
soundPool.setVolume(streamId, volume, volume)
}
}
/**
* 是否初始化
* 如果没有初始化就使用原来SvgaPlayer库的音频加载逻辑。
* @return true 则已初始化, 否则为 false
*/
internal fun isInit(): Boolean {
return soundPool != null
}
private fun checkInit(): Boolean {
val isInit = isInit()
if (!isInit) {
LogUtils.error(TAG, "soundPool is null, you need call init() !!!")
}
return isInit
}
private fun getSoundPool(maxStreams: Int) = if (Build.VERSION.SDK_INT >= 21) {
val attributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
SoundPool.Builder().setAudioAttributes(attributes)
.setMaxStreams(maxStreams)
.build()
} else {
SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0)
}
internal fun load(callBack: SVGASoundCallBack?,
fd: FileDescriptor?,
offset: Long,
length: Long,
priority: Int): Int {
if (!checkInit()) return -1
val soundId = soundPool!!.load(fd, offset, length, priority)
LogUtils.debug(TAG, "load soundId=$soundId callBack=$callBack")
if (callBack != null && !soundCallBackMap.containsKey(soundId)) {
soundCallBackMap[soundId] = callBack
}
return soundId
}
internal fun unload(soundId: Int) {
if (!checkInit()) return
LogUtils.debug(TAG, "unload soundId=$soundId")
soundPool!!.unload(soundId)
soundCallBackMap.remove(soundId)
}
internal fun play(soundId: Int): Int {
if (!checkInit()) return -1
LogUtils.debug(TAG, "play soundId=$soundId")
return soundPool!!.play(soundId, volume, volume, 1, 0, 1.0f)
}
internal fun stop(soundId: Int) {
if (!checkInit()) return
LogUtils.debug(TAG, "stop soundId=$soundId")
soundPool!!.stop(soundId)
}
internal fun resume(soundId: Int) {
if (!checkInit()) return
LogUtils.debug(TAG, "stop soundId=$soundId")
soundPool!!.resume(soundId)
}
internal fun pause(soundId: Int) {
if (!checkInit()) return
LogUtils.debug(TAG, "pause soundId=$soundId")
soundPool!!.pause(soundId)
}
}

View File

@@ -0,0 +1,347 @@
package com.opensource.svgaplayer
import android.graphics.Bitmap
import android.media.AudioAttributes
import android.media.AudioManager
import android.media.SoundPool
import android.os.Build
import com.opensource.svgaplayer.bitmap.SVGABitmapByteArrayDecoder
import com.opensource.svgaplayer.bitmap.SVGABitmapFileDecoder
import com.opensource.svgaplayer.entities.SVGAAudioEntity
import com.opensource.svgaplayer.entities.SVGAVideoSpriteEntity
import com.opensource.svgaplayer.proto.AudioEntity
import com.opensource.svgaplayer.proto.MovieEntity
import com.opensource.svgaplayer.proto.MovieParams
import com.opensource.svgaplayer.utils.SVGARect
import com.opensource.svgaplayer.utils.log.LogUtils
import org.json.JSONObject
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.util.*
import kotlin.collections.ArrayList
/**
* Created by PonyCui on 16/6/18.
*/
class SVGAVideoEntity {
private val TAG = "SVGAVideoEntity"
var antiAlias = true
var movieItem: MovieEntity? = null
var videoSize = SVGARect(0.0, 0.0, 0.0, 0.0)
private set
var FPS = 15
private set
var frames: Int = 0
private set
internal var spriteList: List<SVGAVideoSpriteEntity> = emptyList()
internal var audioList: List<SVGAAudioEntity> = emptyList()
internal var soundPool: SoundPool? = null
private var soundCallback: SVGASoundManager.SVGASoundCallBack? = null
internal var imageMap = HashMap<String, Bitmap>()
private var mCacheDir: File
private var mFrameHeight = 0
private var mFrameWidth = 0
private var mPlayCallback: SVGAParser.PlayCallback?=null
private lateinit var mCallback: () -> Unit
constructor(json: JSONObject, cacheDir: File) : this(json, cacheDir, 0, 0)
constructor(json: JSONObject, cacheDir: File, frameWidth: Int, frameHeight: Int) {
mFrameWidth = frameWidth
mFrameHeight = frameHeight
mCacheDir = cacheDir
val movieJsonObject = json.optJSONObject("movie") ?: return
setupByJson(movieJsonObject)
try {
parserImages(json)
} catch (e: Exception) {
e.printStackTrace()
} catch (e: OutOfMemoryError) {
e.printStackTrace()
}
resetSprites(json)
}
private fun setupByJson(movieObject: JSONObject) {
movieObject.optJSONObject("viewBox")?.let { viewBoxObject ->
val width = viewBoxObject.optDouble("width", 0.0)
val height = viewBoxObject.optDouble("height", 0.0)
videoSize = SVGARect(0.0, 0.0, width, height)
}
FPS = movieObject.optInt("fps", 20)
frames = movieObject.optInt("frames", 0)
}
constructor(entity: MovieEntity, cacheDir: File) : this(entity, cacheDir, 0, 0)
constructor(entity: MovieEntity, cacheDir: File, frameWidth: Int, frameHeight: Int) {
this.mFrameWidth = frameWidth
this.mFrameHeight = frameHeight
this.mCacheDir = cacheDir
this.movieItem = entity
entity.params?.let(this::setupByMovie)
try {
parserImages(entity)
} catch (e: Exception) {
e.printStackTrace()
} catch (e: OutOfMemoryError) {
e.printStackTrace()
}
resetSprites(entity)
}
private fun setupByMovie(movieParams: MovieParams) {
val width = (movieParams.viewBoxWidth ?: 0.0f).toDouble()
val height = (movieParams.viewBoxHeight ?: 0.0f).toDouble()
videoSize = SVGARect(0.0, 0.0, width, height)
FPS = movieParams.fps ?: 20
frames = movieParams.frames ?: 0
}
internal fun prepare(callback: () -> Unit, playCallback: SVGAParser.PlayCallback?) {
mCallback = callback
mPlayCallback = playCallback
if (movieItem == null) {
mCallback()
} else {
setupAudios(movieItem!!) {
mCallback()
}
}
}
private fun parserImages(json: JSONObject) {
val imgJson = json.optJSONObject("images") ?: return
imgJson.keys().forEach { imgKey ->
val filePath = generateBitmapFilePath(imgJson[imgKey].toString(), imgKey)
if (filePath.isEmpty()) {
return
}
val bitmapKey = imgKey.replace(".matte", "")
val bitmap = createBitmap(filePath)
if (bitmap != null) {
imageMap[bitmapKey] = bitmap
}
}
}
private fun generateBitmapFilePath(imgName: String, imgKey: String): String {
val path = mCacheDir.absolutePath + "/" + imgName
val path1 = "$path.png"
val path2 = mCacheDir.absolutePath + "/" + imgKey + ".png"
return when {
File(path).exists() -> path
File(path1).exists() -> path1
File(path2).exists() -> path2
else -> ""
}
}
private fun createBitmap(filePath: String): Bitmap? {
return SVGABitmapFileDecoder.decodeBitmapFrom(filePath, mFrameWidth, mFrameHeight)
}
private fun parserImages(obj: MovieEntity) {
obj.images?.entries?.forEach { entry ->
val byteArray = entry.value.toByteArray()
if (byteArray.count() < 4) {
return@forEach
}
val fileTag = byteArray.slice(IntRange(0, 3))
if (fileTag[0].toInt() == 73 && fileTag[1].toInt() == 68 && fileTag[2].toInt() == 51) {
return@forEach
}
val filePath = generateBitmapFilePath(entry.value.utf8(), entry.key)
createBitmap(byteArray, filePath)?.let { bitmap ->
imageMap[entry.key] = bitmap
}
}
}
private fun createBitmap(byteArray: ByteArray, filePath: String): Bitmap? {
val bitmap = SVGABitmapByteArrayDecoder.decodeBitmapFrom(byteArray, mFrameWidth, mFrameHeight)
return bitmap ?: createBitmap(filePath)
}
private fun resetSprites(json: JSONObject) {
val mutableList: MutableList<SVGAVideoSpriteEntity> = mutableListOf()
json.optJSONArray("sprites")?.let { item ->
for (i in 0 until item.length()) {
item.optJSONObject(i)?.let { entryJson ->
mutableList.add(SVGAVideoSpriteEntity(entryJson))
}
}
}
spriteList = mutableList.toList()
}
private fun resetSprites(entity: MovieEntity) {
spriteList = entity.sprites?.map {
return@map SVGAVideoSpriteEntity(it)
} ?: listOf()
}
private fun setupAudios(entity: MovieEntity, completionBlock: () -> Unit) {
if (entity.audios == null || entity.audios.isEmpty()) {
run(completionBlock)
return
}
setupSoundPool(entity, completionBlock)
val audiosFileMap = generateAudioFileMap(entity)
//repair when audioEntity error can not callback
//如果audiosFileMap为空 soundPool?.load 不会走 导致 setOnLoadCompleteListener 不会回调 导致外层prepare不回调卡住
if (audiosFileMap.size == 0) {
run(completionBlock)
return
}
this.audioList = entity.audios.map { audio ->
return@map createSvgaAudioEntity(audio, audiosFileMap)
}
}
private fun createSvgaAudioEntity(audio: AudioEntity, audiosFileMap: HashMap<String, File>): SVGAAudioEntity {
val item = SVGAAudioEntity(audio)
val startTime = (audio.startTime ?: 0).toDouble()
val totalTime = (audio.totalTime ?: 0).toDouble()
if (totalTime.toInt() == 0) {
// 除数不能为 0
return item
}
// 直接回调文件,后续播放都不走
mPlayCallback?.let {
val fileList: MutableList<File> = ArrayList()
audiosFileMap.forEach { entity ->
fileList.add(entity.value)
}
it.onPlay(fileList)
mCallback()
return item
}
audiosFileMap[audio.audioKey]?.let { file ->
FileInputStream(file).use {
val length = it.available().toDouble()
val offset = ((startTime / totalTime) * length).toLong()
if (SVGASoundManager.isInit()) {
item.soundID = SVGASoundManager.load(soundCallback,
it.fd,
offset,
length.toLong(),
1)
} else {
item.soundID = soundPool?.load(it.fd, offset, length.toLong(), 1)
}
}
}
return item
}
private fun generateAudioFile(audioCache: File, value: ByteArray): File {
audioCache.createNewFile()
FileOutputStream(audioCache).write(value)
return audioCache
}
private fun generateAudioFileMap(entity: MovieEntity): HashMap<String, File> {
val audiosDataMap = generateAudioMap(entity)
val audiosFileMap = HashMap<String, File>()
if (audiosDataMap.count() > 0) {
audiosDataMap.forEach {
val audioCache = SVGACache.buildAudioFile(it.key)
audiosFileMap[it.key] =
audioCache.takeIf { file -> file.exists() } ?: generateAudioFile(
audioCache,
it.value
)
}
}
return audiosFileMap
}
private fun generateAudioMap(entity: MovieEntity): HashMap<String, ByteArray> {
val audiosDataMap = HashMap<String, ByteArray>()
entity.images?.entries?.forEach {
val imageKey = it.key
val byteArray = it.value.toByteArray()
if (byteArray.count() < 4) {
return@forEach
}
val fileTag = byteArray.slice(IntRange(0, 3))
if (fileTag[0].toInt() == 73 && fileTag[1].toInt() == 68 && fileTag[2].toInt() == 51) {
audiosDataMap[imageKey] = byteArray
}else if(fileTag[0].toInt() == -1 && fileTag[1].toInt() == -5 && fileTag[2].toInt() == -108){
audiosDataMap[imageKey] = byteArray
}
}
return audiosDataMap
}
private fun setupSoundPool(entity: MovieEntity, completionBlock: () -> Unit) {
var soundLoaded = 0
if (SVGASoundManager.isInit()) {
soundCallback = object : SVGASoundManager.SVGASoundCallBack {
override fun onVolumeChange(value: Float) {
SVGASoundManager.setVolume(value, this@SVGAVideoEntity)
}
override fun onComplete() {
soundLoaded++
if (soundLoaded >= entity.audios.count()) {
completionBlock()
}
}
}
return
}
soundPool = generateSoundPool(entity)
LogUtils.info("SVGAParser", "pool_start")
soundPool?.setOnLoadCompleteListener { _, _, _ ->
LogUtils.info("SVGAParser", "pool_complete")
soundLoaded++
if (soundLoaded >= entity.audios.count()) {
completionBlock()
}
}
}
private fun generateSoundPool(entity: MovieEntity): SoundPool? {
return try {
if (Build.VERSION.SDK_INT >= 21) {
val attributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
SoundPool.Builder().setAudioAttributes(attributes)
.setMaxStreams(12.coerceAtMost(entity.audios.count()))
.build()
} else {
SoundPool(12.coerceAtMost(entity.audios.count()), AudioManager.STREAM_MUSIC, 0)
}
} catch (e: Exception) {
LogUtils.error(TAG, e)
null
}
}
fun clear() {
if (SVGASoundManager.isInit()) {
this.audioList.forEach {
it.soundID?.let { id -> SVGASoundManager.unload(id) }
}
soundCallback = null
}
soundPool?.release()
soundPool = null
audioList = emptyList()
spriteList = emptyList()
imageMap.clear()
}
}

View File

@@ -0,0 +1,33 @@
package com.opensource.svgaplayer.bitmap
import android.graphics.BitmapFactory
/**
*
* Create by im_dsd 2020/7/7 17:59
*/
internal object BitmapSampleSizeCalculator {
fun calculate(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
// Raw height and width of image
val (height: Int, width: Int) = options.run { outHeight to outWidth }
var inSampleSize = 1
if (reqHeight <= 0 || reqWidth <= 0) {
return inSampleSize
}
if (height > reqHeight || width > reqWidth) {
val halfHeight: Int = height / 2
val halfWidth: Int = width / 2
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
inSampleSize *= 2
}
}
return inSampleSize
}
}

View File

@@ -0,0 +1,16 @@
package com.opensource.svgaplayer.bitmap
import android.graphics.Bitmap
import android.graphics.BitmapFactory
/**
* 通过字节码解码 Bitmap
*
* Create by im_dsd 2020/7/7 17:50
*/
internal object SVGABitmapByteArrayDecoder : SVGABitmapDecoder<ByteArray>() {
override fun onDecode(data: ByteArray, ops: BitmapFactory.Options): Bitmap? {
return BitmapFactory.decodeByteArray(data, 0, data.count(), ops)
}
}

View File

@@ -0,0 +1,35 @@
package com.opensource.svgaplayer.bitmap
import android.graphics.Bitmap
import android.graphics.BitmapFactory
/**
* Bitmap 解码器
*
* <T> 需要加载的数据类型
*
* Create by im_dsd 2020/7/7 17:39
*/
internal abstract class SVGABitmapDecoder<T> {
fun decodeBitmapFrom(data: T, reqWidth: Int, reqHeight: Int): Bitmap? {
return BitmapFactory.Options().run {
// 如果期望的宽高是合法的, 则开启检测尺寸模式
inJustDecodeBounds = (reqWidth > 0 && reqHeight > 0)
inPreferredConfig = Bitmap.Config.RGB_565
val bitmap = onDecode(data, this)
if (!inJustDecodeBounds) {
return bitmap
}
// Calculate inSampleSize
inSampleSize = BitmapSampleSizeCalculator.calculate(this, reqWidth, reqHeight)
// Decode bitmap with inSampleSize set
inJustDecodeBounds = false
onDecode(data, this)
}
}
abstract fun onDecode(data: T, ops: BitmapFactory.Options): Bitmap?
}

View File

@@ -0,0 +1,16 @@
package com.opensource.svgaplayer.bitmap
import android.graphics.Bitmap
import android.graphics.BitmapFactory
/**
* 通过文件解码 Bitmap
*
* Create by im_dsd 2020/7/7 17:50
*/
internal object SVGABitmapFileDecoder : SVGABitmapDecoder<String>() {
override fun onDecode(data: String, ops: BitmapFactory.Options): Bitmap? {
return BitmapFactory.decodeFile(data, ops)
}
}

View File

@@ -0,0 +1,53 @@
package com.opensource.svgaplayer.drawer
import android.graphics.Canvas
import android.widget.ImageView
import com.opensource.svgaplayer.SVGAVideoEntity
import com.opensource.svgaplayer.entities.SVGAVideoSpriteFrameEntity
import com.opensource.svgaplayer.utils.Pools
import com.opensource.svgaplayer.utils.SVGAScaleInfo
import kotlin.math.max
/**
* Created by cuiminghui on 2017/3/29.
*/
open internal class SGVADrawer(val videoItem: SVGAVideoEntity) {
val scaleInfo = SVGAScaleInfo()
private val spritePool = Pools.SimplePool<SVGADrawerSprite>(max(1, videoItem.spriteList.size))
inner class SVGADrawerSprite(var _matteKey: String? = null, var _imageKey: String? = null, var _frameEntity: SVGAVideoSpriteFrameEntity? = null) {
val matteKey get() = _matteKey
val imageKey get() = _imageKey
val frameEntity get() = _frameEntity!!
}
internal fun requestFrameSprites(frameIndex: Int): List<SVGADrawerSprite> {
return videoItem.spriteList.mapNotNull {
if (frameIndex >= 0 && frameIndex < it.frames.size) {
it.imageKey?.let { imageKey ->
if (!imageKey.endsWith(".matte") && it.frames[frameIndex].alpha <= 0.0) {
return@mapNotNull null
}
return@mapNotNull (spritePool.acquire() ?: SVGADrawerSprite()).apply {
_matteKey = it.matteKey
_imageKey = it.imageKey
_frameEntity = it.frames[frameIndex]
}
}
}
return@mapNotNull null
}
}
internal fun releaseFrameSprites(sprites: List<SVGADrawerSprite>) {
sprites.forEach { spritePool.release(it) }
}
open fun drawFrame(canvas : Canvas, frameIndex: Int, scaleType: ImageView.ScaleType) {
scaleInfo.performScaleType(canvas.width.toFloat(),canvas.height.toFloat(), videoItem.videoSize.width.toFloat(), videoItem.videoSize.height.toFloat(), scaleType)
}
}

View File

@@ -0,0 +1,559 @@
package com.opensource.svgaplayer.drawer
import android.graphics.*
import android.os.Build
import android.text.StaticLayout
import android.text.TextUtils
import android.widget.ImageView
import com.opensource.svgaplayer.SVGADynamicEntity
import com.opensource.svgaplayer.SVGASoundManager
import com.opensource.svgaplayer.SVGAVideoEntity
import com.opensource.svgaplayer.entities.SVGAVideoShapeEntity
/**
* Created by cuiminghui on 2017/3/29.
*/
internal class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVGADynamicEntity) : SGVADrawer(videoItem) {
private val sharedValues = ShareValues()
private val drawTextCache: HashMap<String, Bitmap> = hashMapOf()
private val pathCache = PathCache()
private var beginIndexList: Array<Boolean>? = null
private var endIndexList: Array<Boolean>? = null
override fun drawFrame(canvas: Canvas, frameIndex: Int, scaleType: ImageView.ScaleType) {
super.drawFrame(canvas, frameIndex, scaleType)
playAudio(frameIndex)
this.pathCache.onSizeChanged(canvas)
val sprites = requestFrameSprites(frameIndex)
// Filter null sprites
if (sprites.count() <= 0) return
val matteSprites = mutableMapOf<String, SVGADrawerSprite>()
var saveID = -1
beginIndexList = null
endIndexList = null
// Filter no matte layer
var hasMatteLayer = false
sprites.get(0).imageKey?.let {
if (it.endsWith(".matte")) {
hasMatteLayer = true
}
}
sprites.forEachIndexed { index, svgaDrawerSprite ->
// Save matte sprite
svgaDrawerSprite.imageKey?.let {
/// No matte layer included or VERSION Unsopport matte
if (!hasMatteLayer || Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// Normal sprite
drawSprite(svgaDrawerSprite, canvas, frameIndex)
// Continue
return@forEachIndexed
}
/// Cache matte sprite
if (it.endsWith(".matte")) {
matteSprites.put(it, svgaDrawerSprite)
// Continue
return@forEachIndexed
}
}
/// Is matte begin
if (isMatteBegin(index, sprites)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
saveID = canvas.saveLayer(0f, 0f, canvas.width.toFloat(), canvas.height.toFloat(), null)
} else {
canvas.save()
}
}
/// Normal matte
drawSprite(svgaDrawerSprite, canvas, frameIndex)
/// Is matte end
if (isMatteEnd(index, sprites)) {
matteSprites.get(svgaDrawerSprite.matteKey)?.let {
drawSprite(it, this.sharedValues.shareMatteCanvas(canvas.width, canvas.height), frameIndex)
canvas.drawBitmap(this.sharedValues.sharedMatteBitmap(), 0f, 0f, this.sharedValues.shareMattePaint())
if (saveID != -1) {
canvas.restoreToCount(saveID)
} else {
canvas.restore()
}
// Continue
return@forEachIndexed
}
}
}
releaseFrameSprites(sprites)
}
private fun isMatteBegin(spriteIndex: Int, sprites: List<SVGADrawerSprite>): Boolean {
if (beginIndexList == null) {
val boolArray = Array(sprites.count()) { false }
sprites.forEachIndexed { index, svgaDrawerSprite ->
svgaDrawerSprite.imageKey?.let {
/// Filter matte sprite
if (it.endsWith(".matte")) {
// Continue
return@forEachIndexed
}
}
svgaDrawerSprite.matteKey?.let {
if (it.length > 0) {
sprites.get(index - 1)?.let { lastSprite ->
if (lastSprite.matteKey.isNullOrEmpty()) {
boolArray[index] = true
} else {
if (lastSprite.matteKey != svgaDrawerSprite.matteKey) {
boolArray[index] = true
}
}
}
}
}
}
beginIndexList = boolArray
}
return beginIndexList?.get(spriteIndex) ?: false
}
private fun isMatteEnd(spriteIndex: Int, sprites: List<SVGADrawerSprite>): Boolean {
if (endIndexList == null) {
val boolArray = Array(sprites.count()) { false }
sprites.forEachIndexed { index, svgaDrawerSprite ->
svgaDrawerSprite.imageKey?.let {
/// Filter matte sprite
if (it.endsWith(".matte")) {
// Continue
return@forEachIndexed
}
}
svgaDrawerSprite.matteKey?.let {
if (it.length > 0) {
// Last one
if (index == sprites.count() - 1) {
boolArray[index] = true
} else {
sprites.get(index + 1)?.let { nextSprite ->
if (nextSprite.matteKey.isNullOrEmpty()) {
boolArray[index] = true
} else {
if (nextSprite.matteKey != svgaDrawerSprite.matteKey) {
boolArray[index] = true
}
}
}
}
}
}
}
endIndexList = boolArray
}
return endIndexList?.get(spriteIndex) ?: false
}
private fun playAudio(frameIndex: Int) {
this.videoItem.audioList.forEach { audio ->
if (audio.startFrame == frameIndex) {
if (SVGASoundManager.isInit()) {
audio.soundID?.let { soundID ->
audio.playID = SVGASoundManager.play(soundID)
}
} else {
this.videoItem.soundPool?.let { soundPool ->
audio.soundID?.let { soundID ->
audio.playID = soundPool.play(soundID, 1.0f, 1.0f, 1, 0, 1.0f)
}
}
}
}
if (audio.endFrame <= frameIndex) {
audio.playID?.let {
if (SVGASoundManager.isInit()) {
SVGASoundManager.stop(it)
} else {
this.videoItem.soundPool?.stop(it)
}
}
audio.playID = null
}
}
}
private fun shareFrameMatrix(transform: Matrix): Matrix {
val matrix = this.sharedValues.sharedMatrix()
matrix.postScale(scaleInfo.scaleFx, scaleInfo.scaleFy)
matrix.postTranslate(scaleInfo.tranFx, scaleInfo.tranFy)
matrix.preConcat(transform)
return matrix
}
private fun drawSprite(sprite: SVGADrawerSprite, canvas: Canvas, frameIndex: Int) {
drawImage(sprite, canvas)
drawShape(sprite, canvas)
drawDynamic(sprite, canvas, frameIndex)
}
private fun drawImage(sprite: SVGADrawerSprite, canvas: Canvas) {
val imageKey = sprite.imageKey ?: return
val isHidden = dynamicItem.dynamicHidden[imageKey] == true
if (isHidden) {
return
}
val bitmapKey = if (imageKey.endsWith(".matte")) imageKey.substring(0, imageKey.length - 6) else imageKey
val drawingBitmap = (dynamicItem.dynamicImage[bitmapKey] ?: videoItem.imageMap[bitmapKey])
?: return
val frameMatrix = shareFrameMatrix(sprite.frameEntity.transform)
val paint = this.sharedValues.sharedPaint()
paint.isAntiAlias = videoItem.antiAlias
paint.isFilterBitmap = videoItem.antiAlias
paint.alpha = (sprite.frameEntity.alpha * 255).toInt()
if (sprite.frameEntity.maskPath != null) {
val maskPath = sprite.frameEntity.maskPath ?: return
canvas.save()
val path = this.sharedValues.sharedPath()
maskPath.buildPath(path)
path.transform(frameMatrix)
canvas.clipPath(path)
frameMatrix.preScale((sprite.frameEntity.layout.width / drawingBitmap.width).toFloat(), (sprite.frameEntity.layout.height / drawingBitmap.height).toFloat())
if (!drawingBitmap.isRecycled) {
canvas.drawBitmap(drawingBitmap, frameMatrix, paint)
}
canvas.restore()
} else {
frameMatrix.preScale((sprite.frameEntity.layout.width / drawingBitmap.width).toFloat(), (sprite.frameEntity.layout.height / drawingBitmap.height).toFloat())
if (!drawingBitmap.isRecycled) {
canvas.drawBitmap(drawingBitmap, frameMatrix, paint)
}
}
dynamicItem.dynamicIClickArea.let {
it.get(imageKey)?.let { listener ->
val matrixArray = floatArrayOf(0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f)
frameMatrix.getValues(matrixArray)
listener.onResponseArea(imageKey, matrixArray[2].toInt()
, matrixArray[5].toInt()
, (drawingBitmap.width * matrixArray[0] + matrixArray[2]).toInt()
, (drawingBitmap.height * matrixArray[4] + matrixArray[5]).toInt())
}
}
drawTextOnBitmap(canvas, drawingBitmap, sprite, frameMatrix)
}
private fun drawTextOnBitmap(canvas: Canvas, drawingBitmap: Bitmap, sprite: SVGADrawerSprite, frameMatrix: Matrix) {
if (dynamicItem.isTextDirty) {
this.drawTextCache.clear()
dynamicItem.isTextDirty = false
}
val imageKey = sprite.imageKey ?: return
var textBitmap: Bitmap? = null
dynamicItem.dynamicText[imageKey]?.let { drawingText ->
dynamicItem.dynamicTextPaint[imageKey]?.let { drawingTextPaint ->
drawTextCache[imageKey]?.let {
textBitmap = it
} ?: kotlin.run {
textBitmap = Bitmap.createBitmap(drawingBitmap.width, drawingBitmap.height, Bitmap.Config.ARGB_8888)
val drawRect = Rect(0, 0, drawingBitmap.width, drawingBitmap.height)
val textCanvas = Canvas(textBitmap)
drawingTextPaint.isAntiAlias = true
val fontMetrics = drawingTextPaint.getFontMetrics();
val top = fontMetrics.top
val bottom = fontMetrics.bottom
val baseLineY = drawRect.centerY() - top / 2 - bottom / 2
textCanvas.drawText(drawingText, drawRect.centerX().toFloat(), baseLineY, drawingTextPaint);
drawTextCache.put(imageKey, textBitmap as Bitmap)
}
}
}
dynamicItem.dynamicBoringLayoutText[imageKey]?.let {
drawTextCache[imageKey]?.let {
textBitmap = it
} ?: kotlin.run {
it.paint.isAntiAlias = true
textBitmap = Bitmap.createBitmap(drawingBitmap.width, drawingBitmap.height, Bitmap.Config.ARGB_8888)
val textCanvas = Canvas(textBitmap)
textCanvas.translate(0f, ((drawingBitmap.height - it.height) / 2).toFloat())
it.draw(textCanvas)
drawTextCache.put(imageKey, textBitmap as Bitmap)
}
}
dynamicItem.dynamicStaticLayoutText[imageKey]?.let {
drawTextCache[imageKey]?.let {
textBitmap = it
} ?: kotlin.run {
it.paint.isAntiAlias = true
var layout = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
var lineMax = try {
val field = StaticLayout::class.java.getDeclaredField("mMaximumVisibleLineCount")
field.isAccessible = true
field.getInt(it)
} catch (e: Exception) {
Int.MAX_VALUE
}
StaticLayout.Builder
.obtain(it.text, 0, it.text.length, it.paint, drawingBitmap.width)
.setAlignment(it.alignment)
.setMaxLines(lineMax)
.setEllipsize(TextUtils.TruncateAt.END)
.build()
} else {
StaticLayout(it.text, 0, it.text.length, it.paint, drawingBitmap.width, it.alignment, it.spacingMultiplier, it.spacingAdd, false)
}
textBitmap = Bitmap.createBitmap(drawingBitmap.width, drawingBitmap.height, Bitmap.Config.ARGB_8888)
val textCanvas = Canvas(textBitmap)
textCanvas.translate(0f, ((drawingBitmap.height - layout.height) / 2).toFloat())
layout.draw(textCanvas)
drawTextCache.put(imageKey, textBitmap as Bitmap)
}
}
textBitmap?.let { textBitmap ->
val paint = this.sharedValues.sharedPaint()
paint.isAntiAlias = videoItem.antiAlias
paint.alpha = (sprite.frameEntity.alpha * 255).toInt()
if (sprite.frameEntity.maskPath != null) {
val maskPath = sprite.frameEntity.maskPath ?: return@let
canvas.save()
canvas.concat(frameMatrix)
canvas.clipRect(0, 0, drawingBitmap.width, drawingBitmap.height)
val bitmapShader = BitmapShader(textBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)
paint.shader = bitmapShader
val path = this.sharedValues.sharedPath()
maskPath.buildPath(path)
canvas.drawPath(path, paint)
canvas.restore()
} else {
paint.isFilterBitmap = videoItem.antiAlias
canvas.drawBitmap(textBitmap, frameMatrix, paint)
}
}
}
private fun drawShape(sprite: SVGADrawerSprite, canvas: Canvas) {
val frameMatrix = shareFrameMatrix(sprite.frameEntity.transform)
sprite.frameEntity.shapes.forEach { shape ->
shape.buildPath()
shape.shapePath?.let {
val paint = this.sharedValues.sharedPaint()
paint.reset()
paint.isAntiAlias = videoItem.antiAlias
paint.alpha = (sprite.frameEntity.alpha * 255).toInt()
val path = this.sharedValues.sharedPath()
path.reset()
path.addPath(this.pathCache.buildPath(shape))
val shapeMatrix = this.sharedValues.sharedMatrix2()
shapeMatrix.reset()
shape.transform?.let {
shapeMatrix.postConcat(it)
}
shapeMatrix.postConcat(frameMatrix)
path.transform(shapeMatrix)
shape.styles?.fill?.let {
if (it != 0x00000000) {
paint.style = Paint.Style.FILL
paint.color = it
val alpha = Math.min(255, Math.max(0, (sprite.frameEntity.alpha * 255).toInt()))
if (alpha != 255) {
paint.alpha = alpha
}
if (sprite.frameEntity.maskPath !== null) canvas.save()
sprite.frameEntity.maskPath?.let { maskPath ->
val path2 = this.sharedValues.sharedPath2()
maskPath.buildPath(path2)
path2.transform(frameMatrix)
canvas.clipPath(path2)
}
canvas.drawPath(path, paint)
if (sprite.frameEntity.maskPath !== null) canvas.restore()
}
}
shape.styles?.strokeWidth?.let {
if (it > 0) {
paint.alpha = (sprite.frameEntity.alpha * 255).toInt()
paint.style = Paint.Style.STROKE
shape.styles?.stroke?.let {
paint.color = it
val alpha = Math.min(255, Math.max(0, (sprite.frameEntity.alpha * 255).toInt()))
if (alpha != 255) {
paint.alpha = alpha
}
}
val scale = matrixScale(frameMatrix)
shape.styles?.strokeWidth?.let {
paint.strokeWidth = it * scale
}
shape.styles?.lineCap?.let {
when {
it.equals("butt", true) -> paint.strokeCap = Paint.Cap.BUTT
it.equals("round", true) -> paint.strokeCap = Paint.Cap.ROUND
it.equals("square", true) -> paint.strokeCap = Paint.Cap.SQUARE
}
}
shape.styles?.lineJoin?.let {
when {
it.equals("miter", true) -> paint.strokeJoin = Paint.Join.MITER
it.equals("round", true) -> paint.strokeJoin = Paint.Join.ROUND
it.equals("bevel", true) -> paint.strokeJoin = Paint.Join.BEVEL
}
}
shape.styles?.miterLimit?.let {
paint.strokeMiter = it.toFloat() * scale
}
shape.styles?.lineDash?.let {
if (it.size == 3 && (it[0] > 0 || it[1] > 0)) {
paint.pathEffect = DashPathEffect(floatArrayOf(
(if (it[0] < 1.0f) 1.0f else it[0]) * scale,
(if (it[1] < 0.1f) 0.1f else it[1]) * scale
), it[2] * scale)
}
}
if (sprite.frameEntity.maskPath !== null) canvas.save()
sprite.frameEntity.maskPath?.let { maskPath ->
val path2 = this.sharedValues.sharedPath2()
maskPath.buildPath(path2)
path2.transform(frameMatrix)
canvas.clipPath(path2)
}
canvas.drawPath(path, paint)
if (sprite.frameEntity.maskPath !== null) canvas.restore()
}
}
}
}
}
private val matrixScaleTempValues = FloatArray(16)
private fun matrixScale(matrix: Matrix): Float {
matrix.getValues(matrixScaleTempValues)
if (matrixScaleTempValues[0] == 0f) {
return 0f
}
var A = matrixScaleTempValues[0].toDouble()
var B = matrixScaleTempValues[3].toDouble()
var C = matrixScaleTempValues[1].toDouble()
var D = matrixScaleTempValues[4].toDouble()
if (A * D == B * C) return 0f
var scaleX = Math.sqrt(A * A + B * B)
A /= scaleX
B /= scaleX
var skew = A * C + B * D
C -= A * skew
D -= B * skew
var scaleY = Math.sqrt(C * C + D * D)
C /= scaleY
D /= scaleY
skew /= scaleY
if (A * D < B * C) {
scaleX = -scaleX
}
return if (scaleInfo.ratioX) Math.abs(scaleX.toFloat()) else Math.abs(scaleY.toFloat())
}
private fun drawDynamic(sprite: SVGADrawerSprite, canvas: Canvas, frameIndex: Int) {
val imageKey = sprite.imageKey ?: return
dynamicItem.dynamicDrawer[imageKey]?.let {
val frameMatrix = shareFrameMatrix(sprite.frameEntity.transform)
canvas.save()
canvas.concat(frameMatrix)
it.invoke(canvas, frameIndex)
canvas.restore()
}
dynamicItem.dynamicDrawerSized[imageKey]?.let {
val frameMatrix = shareFrameMatrix(sprite.frameEntity.transform)
canvas.save()
canvas.concat(frameMatrix)
it.invoke(canvas, frameIndex, sprite.frameEntity.layout.width.toInt(), sprite.frameEntity.layout.height.toInt())
canvas.restore()
}
}
class ShareValues {
private val sharedPaint = Paint()
private val sharedPath = Path()
private val sharedPath2 = Path()
private val sharedMatrix = Matrix()
private val sharedMatrix2 = Matrix()
private val shareMattePaint = Paint()
private var shareMatteCanvas: Canvas? = null
private var sharedMatteBitmap: Bitmap? = null
fun sharedPaint(): Paint {
sharedPaint.reset()
return sharedPaint
}
fun sharedPath(): Path {
sharedPath.reset()
return sharedPath
}
fun sharedPath2(): Path {
sharedPath2.reset()
return sharedPath2
}
fun sharedMatrix(): Matrix {
sharedMatrix.reset()
return sharedMatrix
}
fun sharedMatrix2(): Matrix {
sharedMatrix2.reset()
return sharedMatrix2
}
fun shareMattePaint(): Paint {
shareMattePaint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.DST_IN))
return shareMattePaint
}
fun sharedMatteBitmap(): Bitmap {
return sharedMatteBitmap as Bitmap
}
fun shareMatteCanvas(width: Int, height: Int): Canvas {
if (shareMatteCanvas == null) {
sharedMatteBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8)
// shareMatteCanvas = Canvas(sharedMatteBitmap)
}
// val matteCanvas = shareMatteCanvas as Canvas
// matteCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
// return matteCanvas
return Canvas(sharedMatteBitmap)
}
}
class PathCache {
private var canvasWidth: Int = 0
private var canvasHeight: Int = 0
private val cache = HashMap<SVGAVideoShapeEntity, Path>()
fun onSizeChanged(canvas: Canvas) {
if (this.canvasWidth != canvas.width || this.canvasHeight != canvas.height) {
this.cache.clear()
}
this.canvasWidth = canvas.width
this.canvasHeight = canvas.height
}
fun buildPath(shape: SVGAVideoShapeEntity): Path {
if (!this.cache.containsKey(shape)) {
val path = Path()
path.set(shape.shapePath)
this.cache[shape] = path
}
return this.cache[shape]!!
}
}
}

View File

@@ -0,0 +1,24 @@
package com.opensource.svgaplayer.entities
import com.opensource.svgaplayer.proto.AudioEntity
import java.io.FileInputStream
internal class SVGAAudioEntity {
val audioKey: String?
val startFrame: Int
val endFrame: Int
val startTime: Int
val totalTime: Int
var soundID: Int? = null
var playID: Int? = null
constructor(audioItem: AudioEntity) {
this.audioKey = audioItem.audioKey
this.startFrame = audioItem.startFrame ?: 0
this.endFrame = audioItem.endFrame ?: 0
this.startTime = audioItem.startTime ?: 0
this.totalTime = audioItem.totalTime ?: 0
}
}

View File

@@ -0,0 +1,100 @@
package com.opensource.svgaplayer.entities
import android.graphics.Path
import com.opensource.svgaplayer.utils.SVGAPoint
import java.util.*
private val VALID_METHODS: Set<String> = setOf("M", "L", "H", "V", "C", "S", "Q", "R", "A", "Z", "m", "l", "h", "v", "c", "s", "q", "r", "a", "z")
class SVGAPathEntity(originValue: String) {
private val replacedValue: String = if (originValue.contains(",")) originValue.replace(",", " ") else originValue
private var cachedPath: Path? = null
fun buildPath(toPath: Path) {
cachedPath?.let {
toPath.set(it)
return
}
val cachedPath = Path()
val segments = StringTokenizer(this.replacedValue, "MLHVCSQRAZmlhvcsqraz", true)
var currentMethod = ""
while (segments.hasMoreTokens()) {
val segment = segments.nextToken()
if (segment.isEmpty()) { continue }
if (VALID_METHODS.contains(segment)) {
currentMethod = segment
if (currentMethod == "Z" || currentMethod == "z") { operate(cachedPath, currentMethod, StringTokenizer("", "")) }
}
else {
operate(cachedPath, currentMethod, StringTokenizer(segment, " "))
}
}
this.cachedPath = cachedPath
toPath.set(cachedPath)
}
private fun operate(finalPath: Path, method: String, args: StringTokenizer) {
var x0 = 0.0f
var y0 = 0.0f
var x1 = 0.0f
var y1 = 0.0f
var x2 = 0.0f
var y2 = 0.0f
try {
var index = 0
while (args.hasMoreTokens()) {
val s = args.nextToken()
if (s.isEmpty()) {continue}
if (index == 0) { x0 = s.toFloat() }
if (index == 1) { y0 = s.toFloat() }
if (index == 2) { x1 = s.toFloat() }
if (index == 3) { y1 = s.toFloat() }
if (index == 4) { x2 = s.toFloat() }
if (index == 5) { y2 = s.toFloat() }
index++
}
} catch (e: Exception) {}
var currentPoint = SVGAPoint(0.0f, 0.0f, 0.0f)
if (method == "M") {
finalPath.moveTo(x0, y0)
currentPoint = SVGAPoint(x0, y0, 0.0f)
} else if (method == "m") {
finalPath.rMoveTo(x0, y0)
currentPoint = SVGAPoint(currentPoint.x + x0, currentPoint.y + y0, 0.0f)
}
if (method == "L") {
finalPath.lineTo(x0, y0)
} else if (method == "l") {
finalPath.rLineTo(x0, y0)
}
if (method == "C") {
finalPath.cubicTo(x0, y0, x1, y1, x2, y2)
} else if (method == "c") {
finalPath.rCubicTo(x0, y0, x1, y1, x2, y2)
}
if (method == "Q") {
finalPath.quadTo(x0, y0, x1, y1)
} else if (method == "q") {
finalPath.rQuadTo(x0, y0, x1, y1)
}
if (method == "H") {
finalPath.lineTo(x0, currentPoint.y)
} else if (method == "h") {
finalPath.rLineTo(x0, 0f)
}
if (method == "V") {
finalPath.lineTo(currentPoint.x, x0)
} else if (method == "v") {
finalPath.rLineTo(0f, x0)
}
if (method == "Z") {
finalPath.close()
}
else if (method == "z") {
finalPath.close()
}
}
}

View File

@@ -0,0 +1,356 @@
package com.opensource.svgaplayer.entities
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Path
import android.graphics.RectF
import com.opensource.svgaplayer.proto.ShapeEntity
import org.json.JSONArray
import org.json.JSONObject
import java.util.*
/**
* Created by cuiminghui on 2017/2/22.
*/
val sharedPath = Path()
internal class SVGAVideoShapeEntity {
enum class Type {
shape,
rect,
ellipse,
keep
}
class Styles {
var fill = 0x00000000
internal set
var stroke = 0x00000000
internal set
var strokeWidth = 0.0f
internal set
var lineCap = "butt"
internal set
var lineJoin = "miter"
internal set
var miterLimit = 0
internal set
var lineDash = FloatArray(0)
internal set
}
var type = Type.shape
private set
var args: Map<String, Any>? = null
private set
var styles: Styles? = null
private set
var transform: Matrix? = null
private set
constructor(obj: JSONObject) {
parseType(obj)
parseArgs(obj)
parseStyles(obj)
parseTransform(obj)
}
constructor(obj: ShapeEntity) {
parseType(obj)
parseArgs(obj)
parseStyles(obj)
parseTransform(obj)
}
val isKeep: Boolean
get() = type == Type.keep
var shapePath: Path? = null
private fun parseType(obj: JSONObject) {
obj.optString("type")?.let {
when {
it.equals("shape", ignoreCase = true) -> type = Type.shape
it.equals("rect", ignoreCase = true) -> type = Type.rect
it.equals("ellipse", ignoreCase = true) -> type = Type.ellipse
it.equals("keep", ignoreCase = true) -> type = Type.keep
}
}
}
private fun parseType(obj: ShapeEntity) {
obj.type?.let {
type = when (it) {
ShapeEntity.ShapeType.SHAPE -> Type.shape
ShapeEntity.ShapeType.RECT -> Type.rect
ShapeEntity.ShapeType.ELLIPSE -> Type.ellipse
ShapeEntity.ShapeType.KEEP -> Type.keep
}
}
}
private fun parseArgs(obj: JSONObject) {
val args = HashMap<String, Any>()
obj.optJSONObject("args")?.let { values ->
values.keys().forEach { key ->
values.get(key)?.let {
args.put(key, it)
}
}
this.args = args
}
}
private fun parseArgs(obj: ShapeEntity) {
val args = HashMap<String, Any>()
obj.shape?.let {
it.d?.let { args.put("d", it) }
}
obj.ellipse?.let {
args.put("x", it.x ?: 0.0f)
args.put("y", it.y ?: 0.0f)
args.put("radiusX", it.radiusX ?: 0.0f)
args.put("radiusY", it.radiusY ?: 0.0f)
}
obj.rect?.let {
args.put("x", it.x ?: 0.0f)
args.put("y", it.y ?: 0.0f)
args.put("width", it.width ?: 0.0f)
args.put("height", it.height ?: 0.0f)
args.put("cornerRadius", it.cornerRadius ?: 0.0f)
}
this.args = args
}
// 检查色域范围是否是 [0f, 1f],或者是 [0f, 255f]
private fun checkValueRange(obj: JSONArray): Float {
return if (
obj.optDouble(0) <= 1 &&
obj.optDouble(1) <= 1 &&
obj.optDouble(2) <= 1
) {
255f
} else {
1f
}
}
// 检查 alpha 的范围是否是 [0f, 1f],或者是 [0f, 255f]
private fun checkAlphaValueRange(obj: JSONArray): Float {
return if (obj.optDouble(3) <= 1) {
255f
} else {
1f
}
}
private fun parseStyles(obj: JSONObject) {
obj.optJSONObject("styles")?.let {
val styles = Styles()
it.optJSONArray("fill")?.let {
if (it.length() == 4) {
val mulValue = checkValueRange(it)
val alphaRangeValue = checkAlphaValueRange(it)
styles.fill = Color.argb(
(it.optDouble(3) * alphaRangeValue).toInt(),
(it.optDouble(0) * mulValue).toInt(),
(it.optDouble(1) * mulValue).toInt(),
(it.optDouble(2) * mulValue).toInt()
)
}
}
it.optJSONArray("stroke")?.let {
if (it.length() == 4) {
val mulValue = checkValueRange(it)
val alphaRangeValue = checkAlphaValueRange(it)
styles.stroke = Color.argb(
(it.optDouble(3) * alphaRangeValue).toInt(),
(it.optDouble(0) * mulValue).toInt(),
(it.optDouble(1) * mulValue).toInt(),
(it.optDouble(2) * mulValue).toInt()
)
}
}
styles.strokeWidth = it.optDouble("strokeWidth", 0.0).toFloat()
styles.lineCap = it.optString("lineCap", "butt")
styles.lineJoin = it.optString("lineJoin", "miter")
styles.miterLimit = it.optInt("miterLimit", 0)
it.optJSONArray("lineDash")?.let {
styles.lineDash = FloatArray(it.length())
for (i in 0 until it.length()) {
styles.lineDash[i] = it.optDouble(i, 0.0).toFloat()
}
}
this.styles = styles
}
}
// 检查色域范围是否是 [0f, 1f],或者是 [0f, 255f]
private fun checkValueRange(color: ShapeEntity.ShapeStyle.RGBAColor): Float {
return if (
(color.r ?: 0f) <= 1 &&
(color.g ?: 0f) <= 1 &&
(color.b ?: 0f) <= 1
) {
255f
} else {
1f
}
}
// 检查 alpha 范围是否是 [0f, 1f],有可能是 [0f, 255f]
private fun checkAlphaValueRange(color: ShapeEntity.ShapeStyle.RGBAColor): Float {
return if (color.a <= 1f) {
255f
} else {
1f
}
}
private fun parseStyles(obj: ShapeEntity) {
obj.styles?.let {
val styles = Styles()
it.fill?.let {
val mulValue = checkValueRange(it)
val alphaRangeValue = checkAlphaValueRange(it)
styles.fill = Color.argb(
((it.a ?: 0f) * alphaRangeValue).toInt(),
((it.r ?: 0f) * mulValue).toInt(),
((it.g ?: 0f) * mulValue).toInt(),
((it.b ?: 0f) * mulValue).toInt()
)
}
it.stroke?.let {
val mulValue = checkValueRange(it)
val alphaRangeValue = checkAlphaValueRange(it)
styles.stroke = Color.argb(
((it.a ?: 0f) * alphaRangeValue).toInt(),
((it.r ?: 0f) * mulValue).toInt(),
((it.g ?: 0f) * mulValue).toInt(),
((it.b ?: 0f) * mulValue).toInt()
)
}
styles.strokeWidth = it.strokeWidth ?: 0.0f
it.lineCap?.let {
when (it) {
ShapeEntity.ShapeStyle.LineCap.LineCap_BUTT -> styles.lineCap = "butt"
ShapeEntity.ShapeStyle.LineCap.LineCap_ROUND -> styles.lineCap = "round"
ShapeEntity.ShapeStyle.LineCap.LineCap_SQUARE -> styles.lineCap = "square"
}
}
it.lineJoin?.let {
when (it) {
ShapeEntity.ShapeStyle.LineJoin.LineJoin_BEVEL -> styles.lineJoin = "bevel"
ShapeEntity.ShapeStyle.LineJoin.LineJoin_MITER -> styles.lineJoin = "miter"
ShapeEntity.ShapeStyle.LineJoin.LineJoin_ROUND -> styles.lineJoin = "round"
}
}
styles.miterLimit = (it.miterLimit ?: 0.0f).toInt()
styles.lineDash = kotlin.FloatArray(3)
it.lineDashI?.let { styles.lineDash[0] = it }
it.lineDashII?.let { styles.lineDash[1] = it }
it.lineDashIII?.let { styles.lineDash[2] = it }
this.styles = styles
}
}
private fun parseTransform(obj: JSONObject) {
obj.optJSONObject("transform")?.let {
val transform = Matrix()
val arr = FloatArray(9)
val a = it.optDouble("a", 1.0)
val b = it.optDouble("b", 0.0)
val c = it.optDouble("c", 0.0)
val d = it.optDouble("d", 1.0)
val tx = it.optDouble("tx", 0.0)
val ty = it.optDouble("ty", 0.0)
arr[0] = a.toFloat() // a
arr[1] = c.toFloat() // c
arr[2] = tx.toFloat() // tx
arr[3] = b.toFloat() // b
arr[4] = d.toFloat() // d
arr[5] = ty.toFloat() // ty
arr[6] = 0.0.toFloat()
arr[7] = 0.0.toFloat()
arr[8] = 1.0.toFloat()
transform.setValues(arr)
this.transform = transform
}
}
private fun parseTransform(obj: ShapeEntity) {
obj.transform?.let {
val transform = Matrix()
val arr = FloatArray(9)
val a = it.a ?: 1.0f
val b = it.b ?: 0.0f
val c = it.c ?: 0.0f
val d = it.d ?: 1.0f
val tx = it.tx ?: 0.0f
val ty = it.ty ?: 0.0f
arr[0] = a
arr[1] = c
arr[2] = tx
arr[3] = b
arr[4] = d
arr[5] = ty
arr[6] = 0.0f
arr[7] = 0.0f
arr[8] = 1.0f
transform.setValues(arr)
this.transform = transform
}
}
fun buildPath() {
if (this.shapePath != null) {
return
}
sharedPath.reset()
if (this.type == Type.shape) {
(this.args?.get("d") as? String)?.let {
SVGAPathEntity(it).buildPath(sharedPath)
}
} else if (this.type == Type.ellipse) {
val xv = this.args?.get("x") as? Number ?: return
val yv = this.args?.get("y") as? Number ?: return
val rxv = this.args?.get("radiusX") as? Number ?: return
val ryv = this.args?.get("radiusY") as? Number ?: return
val x = xv.toFloat()
val y = yv.toFloat()
val rx = rxv.toFloat()
val ry = ryv.toFloat()
sharedPath.addOval(RectF(x - rx, y - ry, x + rx, y + ry), Path.Direction.CW)
} else if (this.type == Type.rect) {
val xv = this.args?.get("x") as? Number ?: return
val yv = this.args?.get("y") as? Number ?: return
val wv = this.args?.get("width") as? Number ?: return
val hv = this.args?.get("height") as? Number ?: return
val crv = this.args?.get("cornerRadius") as? Number ?: return
val x = xv.toFloat()
val y = yv.toFloat()
val width = wv.toFloat()
val height = hv.toFloat()
val cornerRadius = crv.toFloat()
sharedPath.addRoundRect(RectF(x, y, x + width, y + height), cornerRadius, cornerRadius, Path.Direction.CW)
}
this.shapePath = Path()
this.shapePath?.set(sharedPath)
}
}

View File

@@ -0,0 +1,60 @@
package com.opensource.svgaplayer.entities
import com.opensource.svgaplayer.proto.SpriteEntity
import org.json.JSONObject
/**
* Created by cuiminghui on 2016/10/17.
*/
internal class SVGAVideoSpriteEntity {
val imageKey: String?
val matteKey: String?
val frames: List<SVGAVideoSpriteFrameEntity>
constructor(obj: JSONObject) {
this.imageKey = obj.optString("imageKey")
this.matteKey = obj.optString("matteKey")
val mutableFrames: MutableList<SVGAVideoSpriteFrameEntity> = mutableListOf()
obj.optJSONArray("frames")?.let {
for (i in 0 until it.length()) {
it.optJSONObject(i)?.let {
val frameItem = SVGAVideoSpriteFrameEntity(it)
if (frameItem.shapes.isNotEmpty()) {
frameItem.shapes.first().let {
if (it.isKeep && mutableFrames.size > 0) {
frameItem.shapes = mutableFrames.last().shapes
}
}
}
mutableFrames.add(frameItem)
}
}
}
frames = mutableFrames.toList()
}
constructor(obj: SpriteEntity) {
this.imageKey = obj.imageKey
this.matteKey = obj.matteKey
var lastFrame: SVGAVideoSpriteFrameEntity? = null
frames = obj.frames?.map {
val frameItem = SVGAVideoSpriteFrameEntity(it)
if (frameItem.shapes.isNotEmpty()) {
frameItem.shapes.first().let {
if (it.isKeep) {
lastFrame?.let {
frameItem.shapes = it.shapes
}
}
}
}
lastFrame = frameItem
return@map frameItem
} ?: listOf()
}
}

View File

@@ -0,0 +1,94 @@
package com.opensource.svgaplayer.entities
import android.graphics.Matrix
import com.opensource.svgaplayer.proto.FrameEntity
import com.opensource.svgaplayer.utils.SVGARect
import org.json.JSONObject
/**
* Created by cuiminghui on 2016/10/17.
*/
internal class SVGAVideoSpriteFrameEntity {
var alpha: Double
var layout = SVGARect(0.0, 0.0, 0.0, 0.0)
var transform = Matrix()
var maskPath: SVGAPathEntity? = null
var shapes: List<SVGAVideoShapeEntity> = listOf()
constructor(obj: JSONObject) {
this.alpha = obj.optDouble("alpha", 0.0)
obj.optJSONObject("layout")?.let {
layout = SVGARect(it.optDouble("x", 0.0), it.optDouble("y", 0.0), it.optDouble("width", 0.0), it.optDouble("height", 0.0))
}
obj.optJSONObject("transform")?.let {
val arr = FloatArray(9)
val a = it.optDouble("a", 1.0)
val b = it.optDouble("b", 0.0)
val c = it.optDouble("c", 0.0)
val d = it.optDouble("d", 1.0)
val tx = it.optDouble("tx", 0.0)
val ty = it.optDouble("ty", 0.0)
arr[0] = a.toFloat()
arr[1] = c.toFloat()
arr[2] = tx.toFloat()
arr[3] = b.toFloat()
arr[4] = d.toFloat()
arr[5] = ty.toFloat()
arr[6] = 0.0.toFloat()
arr[7] = 0.0.toFloat()
arr[8] = 1.0.toFloat()
transform.setValues(arr)
}
obj.optString("clipPath")?.let { d ->
if (d.isNotEmpty()) {
maskPath = SVGAPathEntity(d)
}
}
obj.optJSONArray("shapes")?.let {
val mutableList: MutableList<SVGAVideoShapeEntity> = mutableListOf()
for (i in 0 until it.length()) {
it.optJSONObject(i)?.let {
mutableList.add(SVGAVideoShapeEntity(it))
}
}
shapes = mutableList.toList()
}
}
constructor(obj: FrameEntity) {
this.alpha = (obj.alpha ?: 0.0f).toDouble()
obj.layout?.let {
this.layout = SVGARect((it.x ?: 0.0f).toDouble(), (it.y
?: 0.0f).toDouble(), (it.width ?: 0.0f).toDouble(), (it.height
?: 0.0f).toDouble())
}
obj.transform?.let {
val arr = FloatArray(9)
val a = it.a ?: 1.0f
val b = it.b ?: 0.0f
val c = it.c ?: 0.0f
val d = it.d ?: 1.0f
val tx = it.tx ?: 0.0f
val ty = it.ty ?: 0.0f
arr[0] = a
arr[1] = c
arr[2] = tx
arr[3] = b
arr[4] = d
arr[5] = ty
arr[6] = 0.0f
arr[7] = 0.0f
arr[8] = 1.0f
transform.setValues(arr)
}
obj.clipPath?.takeIf { it.isNotEmpty() }?.let {
maskPath = SVGAPathEntity(it)
}
this.shapes = obj.shapes.map {
return@map SVGAVideoShapeEntity(it)
}
}
}

View File

@@ -0,0 +1,258 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 19:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Integer;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import okio.ByteString;
public final class AudioEntity extends Message<AudioEntity, AudioEntity.Builder> {
public static final ProtoAdapter<AudioEntity> ADAPTER = new ProtoAdapter_AudioEntity();
private static final long serialVersionUID = 0L;
public static final String DEFAULT_AUDIOKEY = "";
public static final Integer DEFAULT_STARTFRAME = 0;
public static final Integer DEFAULT_ENDFRAME = 0;
public static final Integer DEFAULT_STARTTIME = 0;
public static final Integer DEFAULT_TOTALTIME = 0;
/**
* 音频文件名
*/
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#STRING"
)
public final String audioKey;
/**
* 音频播放起始帧
*/
@WireField(
tag = 2,
adapter = "com.squareup.wire.ProtoAdapter#INT32"
)
public final Integer startFrame;
/**
* 音频播放结束帧
*/
@WireField(
tag = 3,
adapter = "com.squareup.wire.ProtoAdapter#INT32"
)
public final Integer endFrame;
/**
* 音频播放起始时间(相对音频长度)
*/
@WireField(
tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#INT32"
)
public final Integer startTime;
/**
* 音频总长度
*/
@WireField(
tag = 5,
adapter = "com.squareup.wire.ProtoAdapter#INT32"
)
public final Integer totalTime;
public AudioEntity(String audioKey, Integer startFrame, Integer endFrame, Integer startTime, Integer totalTime) {
this(audioKey, startFrame, endFrame, startTime, totalTime, ByteString.EMPTY);
}
public AudioEntity(String audioKey, Integer startFrame, Integer endFrame, Integer startTime, Integer totalTime, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.audioKey = audioKey;
this.startFrame = startFrame;
this.endFrame = endFrame;
this.startTime = startTime;
this.totalTime = totalTime;
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.audioKey = audioKey;
builder.startFrame = startFrame;
builder.endFrame = endFrame;
builder.startTime = startTime;
builder.totalTime = totalTime;
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof AudioEntity)) return false;
AudioEntity o = (AudioEntity) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(audioKey, o.audioKey)
&& Internal.equals(startFrame, o.startFrame)
&& Internal.equals(endFrame, o.endFrame)
&& Internal.equals(startTime, o.startTime)
&& Internal.equals(totalTime, o.totalTime);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (audioKey != null ? audioKey.hashCode() : 0);
result = result * 37 + (startFrame != null ? startFrame.hashCode() : 0);
result = result * 37 + (endFrame != null ? endFrame.hashCode() : 0);
result = result * 37 + (startTime != null ? startTime.hashCode() : 0);
result = result * 37 + (totalTime != null ? totalTime.hashCode() : 0);
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (audioKey != null) builder.append(", audioKey=").append(audioKey);
if (startFrame != null) builder.append(", startFrame=").append(startFrame);
if (endFrame != null) builder.append(", endFrame=").append(endFrame);
if (startTime != null) builder.append(", startTime=").append(startTime);
if (totalTime != null) builder.append(", totalTime=").append(totalTime);
return builder.replace(0, 2, "AudioEntity{").append('}').toString();
}
public static final class Builder extends Message.Builder<AudioEntity, Builder> {
public String audioKey;
public Integer startFrame;
public Integer endFrame;
public Integer startTime;
public Integer totalTime;
public Builder() {
}
/**
* 音频文件名
*/
public Builder audioKey(String audioKey) {
this.audioKey = audioKey;
return this;
}
/**
* 音频播放起始帧
*/
public Builder startFrame(Integer startFrame) {
this.startFrame = startFrame;
return this;
}
/**
* 音频播放结束帧
*/
public Builder endFrame(Integer endFrame) {
this.endFrame = endFrame;
return this;
}
/**
* 音频播放起始时间(相对音频长度)
*/
public Builder startTime(Integer startTime) {
this.startTime = startTime;
return this;
}
/**
* 音频总长度
*/
public Builder totalTime(Integer totalTime) {
this.totalTime = totalTime;
return this;
}
@Override
public AudioEntity build() {
return new AudioEntity(audioKey, startFrame, endFrame, startTime, totalTime, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_AudioEntity extends ProtoAdapter<AudioEntity> {
ProtoAdapter_AudioEntity() {
super(FieldEncoding.LENGTH_DELIMITED, AudioEntity.class);
}
@Override
public int encodedSize(AudioEntity value) {
return (value.audioKey != null ? ProtoAdapter.STRING.encodedSizeWithTag(1, value.audioKey) : 0)
+ (value.startFrame != null ? ProtoAdapter.INT32.encodedSizeWithTag(2, value.startFrame) : 0)
+ (value.endFrame != null ? ProtoAdapter.INT32.encodedSizeWithTag(3, value.endFrame) : 0)
+ (value.startTime != null ? ProtoAdapter.INT32.encodedSizeWithTag(4, value.startTime) : 0)
+ (value.totalTime != null ? ProtoAdapter.INT32.encodedSizeWithTag(5, value.totalTime) : 0)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, AudioEntity value) throws IOException {
if (value.audioKey != null) ProtoAdapter.STRING.encodeWithTag(writer, 1, value.audioKey);
if (value.startFrame != null) ProtoAdapter.INT32.encodeWithTag(writer, 2, value.startFrame);
if (value.endFrame != null) ProtoAdapter.INT32.encodeWithTag(writer, 3, value.endFrame);
if (value.startTime != null) ProtoAdapter.INT32.encodeWithTag(writer, 4, value.startTime);
if (value.totalTime != null) ProtoAdapter.INT32.encodeWithTag(writer, 5, value.totalTime);
writer.writeBytes(value.unknownFields());
}
@Override
public AudioEntity decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.audioKey(ProtoAdapter.STRING.decode(reader)); break;
case 2: builder.startFrame(ProtoAdapter.INT32.decode(reader)); break;
case 3: builder.endFrame(ProtoAdapter.INT32.decode(reader)); break;
case 4: builder.startTime(ProtoAdapter.INT32.decode(reader)); break;
case 5: builder.totalTime(ProtoAdapter.INT32.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public AudioEntity redact(AudioEntity value) {
Builder builder = value.newBuilder();
builder.clearUnknownFields();
return builder.build();
}
}
}

View File

@@ -0,0 +1,259 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 115:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Float;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import java.util.List;
import okio.ByteString;
public final class FrameEntity extends Message<FrameEntity, FrameEntity.Builder> {
public static final ProtoAdapter<FrameEntity> ADAPTER = new ProtoAdapter_FrameEntity();
private static final long serialVersionUID = 0L;
public static final Float DEFAULT_ALPHA = 0.0f;
public static final String DEFAULT_CLIPPATH = "";
/**
* 透明度
*/
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float alpha;
/**
* 初始约束大小
*/
@WireField(
tag = 2,
adapter = "com.opensource.svgaplayer.proto.Layout#ADAPTER"
)
public final Layout layout;
/**
* 2D 变换矩阵
*/
@WireField(
tag = 3,
adapter = "com.opensource.svgaplayer.proto.Transform#ADAPTER"
)
public final Transform transform;
/**
* 遮罩路径,使用 SVG 标准 Path 绘制图案进行 Mask 遮罩。
*/
@WireField(
tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#STRING"
)
public final String clipPath;
/**
* 矢量元素列表
*/
@WireField(
tag = 5,
adapter = "com.opensource.svgaplayer.proto.ShapeEntity#ADAPTER",
label = WireField.Label.REPEATED
)
public final List<ShapeEntity> shapes;
public FrameEntity(Float alpha, Layout layout, Transform transform, String clipPath, List<ShapeEntity> shapes) {
this(alpha, layout, transform, clipPath, shapes, ByteString.EMPTY);
}
public FrameEntity(Float alpha, Layout layout, Transform transform, String clipPath, List<ShapeEntity> shapes, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.alpha = alpha;
this.layout = layout;
this.transform = transform;
this.clipPath = clipPath;
this.shapes = Internal.immutableCopyOf("shapes", shapes);
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.alpha = alpha;
builder.layout = layout;
builder.transform = transform;
builder.clipPath = clipPath;
builder.shapes = Internal.copyOf("shapes", shapes);
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof FrameEntity)) return false;
FrameEntity o = (FrameEntity) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(alpha, o.alpha)
&& Internal.equals(layout, o.layout)
&& Internal.equals(transform, o.transform)
&& Internal.equals(clipPath, o.clipPath)
&& shapes.equals(o.shapes);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (alpha != null ? alpha.hashCode() : 0);
result = result * 37 + (layout != null ? layout.hashCode() : 0);
result = result * 37 + (transform != null ? transform.hashCode() : 0);
result = result * 37 + (clipPath != null ? clipPath.hashCode() : 0);
result = result * 37 + shapes.hashCode();
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (alpha != null) builder.append(", alpha=").append(alpha);
if (layout != null) builder.append(", layout=").append(layout);
if (transform != null) builder.append(", transform=").append(transform);
if (clipPath != null) builder.append(", clipPath=").append(clipPath);
if (!shapes.isEmpty()) builder.append(", shapes=").append(shapes);
return builder.replace(0, 2, "FrameEntity{").append('}').toString();
}
public static final class Builder extends Message.Builder<FrameEntity, Builder> {
public Float alpha;
public Layout layout;
public Transform transform;
public String clipPath;
public List<ShapeEntity> shapes;
public Builder() {
shapes = Internal.newMutableList();
}
/**
* 透明度
*/
public Builder alpha(Float alpha) {
this.alpha = alpha;
return this;
}
/**
* 初始约束大小
*/
public Builder layout(Layout layout) {
this.layout = layout;
return this;
}
/**
* 2D 变换矩阵
*/
public Builder transform(Transform transform) {
this.transform = transform;
return this;
}
/**
* 遮罩路径,使用 SVG 标准 Path 绘制图案进行 Mask 遮罩。
*/
public Builder clipPath(String clipPath) {
this.clipPath = clipPath;
return this;
}
/**
* 矢量元素列表
*/
public Builder shapes(List<ShapeEntity> shapes) {
Internal.checkElementsNotNull(shapes);
this.shapes = shapes;
return this;
}
@Override
public FrameEntity build() {
return new FrameEntity(alpha, layout, transform, clipPath, shapes, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_FrameEntity extends ProtoAdapter<FrameEntity> {
ProtoAdapter_FrameEntity() {
super(FieldEncoding.LENGTH_DELIMITED, FrameEntity.class);
}
@Override
public int encodedSize(FrameEntity value) {
return (value.alpha != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(1, value.alpha) : 0)
+ (value.layout != null ? Layout.ADAPTER.encodedSizeWithTag(2, value.layout) : 0)
+ (value.transform != null ? Transform.ADAPTER.encodedSizeWithTag(3, value.transform) : 0)
+ (value.clipPath != null ? ProtoAdapter.STRING.encodedSizeWithTag(4, value.clipPath) : 0)
+ ShapeEntity.ADAPTER.asRepeated().encodedSizeWithTag(5, value.shapes)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, FrameEntity value) throws IOException {
if (value.alpha != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 1, value.alpha);
if (value.layout != null) Layout.ADAPTER.encodeWithTag(writer, 2, value.layout);
if (value.transform != null) Transform.ADAPTER.encodeWithTag(writer, 3, value.transform);
if (value.clipPath != null) ProtoAdapter.STRING.encodeWithTag(writer, 4, value.clipPath);
ShapeEntity.ADAPTER.asRepeated().encodeWithTag(writer, 5, value.shapes);
writer.writeBytes(value.unknownFields());
}
@Override
public FrameEntity decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.alpha(ProtoAdapter.FLOAT.decode(reader)); break;
case 2: builder.layout(Layout.ADAPTER.decode(reader)); break;
case 3: builder.transform(Transform.ADAPTER.decode(reader)); break;
case 4: builder.clipPath(ProtoAdapter.STRING.decode(reader)); break;
case 5: builder.shapes.add(ShapeEntity.ADAPTER.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public FrameEntity redact(FrameEntity value) {
Builder builder = value.newBuilder();
if (builder.layout != null) builder.layout = Layout.ADAPTER.redact(builder.layout);
if (builder.transform != null) builder.transform = Transform.ADAPTER.redact(builder.transform);
Internal.redactElements(builder.shapes, ShapeEntity.ADAPTER);
builder.clearUnknownFields();
return builder.build();
}
}
}

View File

@@ -0,0 +1,205 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 27:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Float;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import okio.ByteString;
public final class Layout extends Message<Layout, Layout.Builder> {
public static final ProtoAdapter<Layout> ADAPTER = new ProtoAdapter_Layout();
private static final long serialVersionUID = 0L;
public static final Float DEFAULT_X = 0.0f;
public static final Float DEFAULT_Y = 0.0f;
public static final Float DEFAULT_WIDTH = 0.0f;
public static final Float DEFAULT_HEIGHT = 0.0f;
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float x;
@WireField(
tag = 2,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float y;
@WireField(
tag = 3,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float width;
@WireField(
tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float height;
public Layout(Float x, Float y, Float width, Float height) {
this(x, y, width, height, ByteString.EMPTY);
}
public Layout(Float x, Float y, Float width, Float height, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.x = x;
builder.y = y;
builder.width = width;
builder.height = height;
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof Layout)) return false;
Layout o = (Layout) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(x, o.x)
&& Internal.equals(y, o.y)
&& Internal.equals(width, o.width)
&& Internal.equals(height, o.height);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (x != null ? x.hashCode() : 0);
result = result * 37 + (y != null ? y.hashCode() : 0);
result = result * 37 + (width != null ? width.hashCode() : 0);
result = result * 37 + (height != null ? height.hashCode() : 0);
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (x != null) builder.append(", x=").append(x);
if (y != null) builder.append(", y=").append(y);
if (width != null) builder.append(", width=").append(width);
if (height != null) builder.append(", height=").append(height);
return builder.replace(0, 2, "Layout{").append('}').toString();
}
public static final class Builder extends Message.Builder<Layout, Builder> {
public Float x;
public Float y;
public Float width;
public Float height;
public Builder() {
}
public Builder x(Float x) {
this.x = x;
return this;
}
public Builder y(Float y) {
this.y = y;
return this;
}
public Builder width(Float width) {
this.width = width;
return this;
}
public Builder height(Float height) {
this.height = height;
return this;
}
@Override
public Layout build() {
return new Layout(x, y, width, height, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_Layout extends ProtoAdapter<Layout> {
ProtoAdapter_Layout() {
super(FieldEncoding.LENGTH_DELIMITED, Layout.class);
}
@Override
public int encodedSize(Layout value) {
return (value.x != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(1, value.x) : 0)
+ (value.y != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(2, value.y) : 0)
+ (value.width != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(3, value.width) : 0)
+ (value.height != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(4, value.height) : 0)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, Layout value) throws IOException {
if (value.x != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 1, value.x);
if (value.y != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 2, value.y);
if (value.width != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 3, value.width);
if (value.height != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 4, value.height);
writer.writeBytes(value.unknownFields());
}
@Override
public Layout decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.x(ProtoAdapter.FLOAT.decode(reader)); break;
case 2: builder.y(ProtoAdapter.FLOAT.decode(reader)); break;
case 3: builder.width(ProtoAdapter.FLOAT.decode(reader)); break;
case 4: builder.height(ProtoAdapter.FLOAT.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public Layout redact(Layout value) {
Builder builder = value.newBuilder();
builder.clearUnknownFields();
return builder.build();
}
}
}

View File

@@ -0,0 +1,265 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 123:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import java.util.List;
import java.util.Map;
import okio.ByteString;
public final class MovieEntity extends Message<MovieEntity, MovieEntity.Builder> {
public static final ProtoAdapter<MovieEntity> ADAPTER = new ProtoAdapter_MovieEntity();
private static final long serialVersionUID = 0L;
public static final String DEFAULT_VERSION = "";
/**
* SVGA 格式版本号
*/
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#STRING"
)
public final String version;
/**
* 动画参数
*/
@WireField(
tag = 2,
adapter = "com.opensource.svgaplayer.proto.MovieParams#ADAPTER"
)
public final MovieParams params;
/**
* Key 是位图键名Value 是位图文件名或二进制 PNG 数据。
*/
@WireField(
tag = 3,
keyAdapter = "com.squareup.wire.ProtoAdapter#STRING",
adapter = "com.squareup.wire.ProtoAdapter#BYTES"
)
public final Map<String, ByteString> images;
/**
* 元素列表
*/
@WireField(
tag = 4,
adapter = "com.opensource.svgaplayer.proto.SpriteEntity#ADAPTER",
label = WireField.Label.REPEATED
)
public final List<SpriteEntity> sprites;
/**
* 音频列表
*/
@WireField(
tag = 5,
adapter = "com.opensource.svgaplayer.proto.AudioEntity#ADAPTER",
label = WireField.Label.REPEATED
)
public final List<AudioEntity> audios;
public MovieEntity(String version, MovieParams params, Map<String, ByteString> images, List<SpriteEntity> sprites, List<AudioEntity> audios) {
this(version, params, images, sprites, audios, ByteString.EMPTY);
}
public MovieEntity(String version, MovieParams params, Map<String, ByteString> images, List<SpriteEntity> sprites, List<AudioEntity> audios, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.version = version;
this.params = params;
this.images = Internal.immutableCopyOf("images", images);
this.sprites = Internal.immutableCopyOf("sprites", sprites);
this.audios = Internal.immutableCopyOf("audios", audios);
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.version = version;
builder.params = params;
builder.images = Internal.copyOf("images", images);
builder.sprites = Internal.copyOf("sprites", sprites);
builder.audios = Internal.copyOf("audios", audios);
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof MovieEntity)) return false;
MovieEntity o = (MovieEntity) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(version, o.version)
&& Internal.equals(params, o.params)
&& images.equals(o.images)
&& sprites.equals(o.sprites)
&& audios.equals(o.audios);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (version != null ? version.hashCode() : 0);
result = result * 37 + (params != null ? params.hashCode() : 0);
result = result * 37 + images.hashCode();
result = result * 37 + sprites.hashCode();
result = result * 37 + audios.hashCode();
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (version != null) builder.append(", version=").append(version);
if (params != null) builder.append(", params=").append(params);
if (!images.isEmpty()) builder.append(", images=").append(images);
if (!sprites.isEmpty()) builder.append(", sprites=").append(sprites);
if (!audios.isEmpty()) builder.append(", audios=").append(audios);
return builder.replace(0, 2, "MovieEntity{").append('}').toString();
}
public static final class Builder extends Message.Builder<MovieEntity, Builder> {
public String version;
public MovieParams params;
public Map<String, ByteString> images;
public List<SpriteEntity> sprites;
public List<AudioEntity> audios;
public Builder() {
images = Internal.newMutableMap();
sprites = Internal.newMutableList();
audios = Internal.newMutableList();
}
/**
* SVGA 格式版本号
*/
public Builder version(String version) {
this.version = version;
return this;
}
/**
* 动画参数
*/
public Builder params(MovieParams params) {
this.params = params;
return this;
}
/**
* Key 是位图键名Value 是位图文件名或二进制 PNG 数据。
*/
public Builder images(Map<String, ByteString> images) {
Internal.checkElementsNotNull(images);
this.images = images;
return this;
}
/**
* 元素列表
*/
public Builder sprites(List<SpriteEntity> sprites) {
Internal.checkElementsNotNull(sprites);
this.sprites = sprites;
return this;
}
/**
* 音频列表
*/
public Builder audios(List<AudioEntity> audios) {
Internal.checkElementsNotNull(audios);
this.audios = audios;
return this;
}
@Override
public MovieEntity build() {
return new MovieEntity(version, params, images, sprites, audios, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_MovieEntity extends ProtoAdapter<MovieEntity> {
private final ProtoAdapter<Map<String, ByteString>> images = ProtoAdapter.newMapAdapter(ProtoAdapter.STRING, ProtoAdapter.BYTES);
ProtoAdapter_MovieEntity() {
super(FieldEncoding.LENGTH_DELIMITED, MovieEntity.class);
}
@Override
public int encodedSize(MovieEntity value) {
return (value.version != null ? ProtoAdapter.STRING.encodedSizeWithTag(1, value.version) : 0)
+ (value.params != null ? MovieParams.ADAPTER.encodedSizeWithTag(2, value.params) : 0)
+ images.encodedSizeWithTag(3, value.images)
+ SpriteEntity.ADAPTER.asRepeated().encodedSizeWithTag(4, value.sprites)
+ AudioEntity.ADAPTER.asRepeated().encodedSizeWithTag(5, value.audios)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, MovieEntity value) throws IOException {
if (value.version != null) ProtoAdapter.STRING.encodeWithTag(writer, 1, value.version);
if (value.params != null) MovieParams.ADAPTER.encodeWithTag(writer, 2, value.params);
images.encodeWithTag(writer, 3, value.images);
SpriteEntity.ADAPTER.asRepeated().encodeWithTag(writer, 4, value.sprites);
AudioEntity.ADAPTER.asRepeated().encodeWithTag(writer, 5, value.audios);
writer.writeBytes(value.unknownFields());
}
@Override
public MovieEntity decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.version(ProtoAdapter.STRING.decode(reader)); break;
case 2: builder.params(MovieParams.ADAPTER.decode(reader)); break;
case 3: builder.images.putAll(images.decode(reader)); break;
case 4: builder.sprites.add(SpriteEntity.ADAPTER.decode(reader)); break;
case 5: builder.audios.add(AudioEntity.ADAPTER.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public MovieEntity redact(MovieEntity value) {
Builder builder = value.newBuilder();
if (builder.params != null) builder.params = MovieParams.ADAPTER.redact(builder.params);
Internal.redactElements(builder.sprites, SpriteEntity.ADAPTER);
Internal.redactElements(builder.audios, AudioEntity.ADAPTER);
builder.clearUnknownFields();
return builder.build();
}
}
}

View File

@@ -0,0 +1,230 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 6:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Float;
import java.lang.Integer;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import okio.ByteString;
public final class MovieParams extends Message<MovieParams, MovieParams.Builder> {
public static final ProtoAdapter<MovieParams> ADAPTER = new ProtoAdapter_MovieParams();
private static final long serialVersionUID = 0L;
public static final Float DEFAULT_VIEWBOXWIDTH = 0.0f;
public static final Float DEFAULT_VIEWBOXHEIGHT = 0.0f;
public static final Integer DEFAULT_FPS = 0;
public static final Integer DEFAULT_FRAMES = 0;
/**
* 画布宽
*/
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float viewBoxWidth;
/**
* 画布高
*/
@WireField(
tag = 2,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float viewBoxHeight;
/**
* 动画每秒播放帧数,合法值是 [1, 2, 3, 5, 6, 10, 12, 15, 20, 30, 60] 中的任意一个。
*/
@WireField(
tag = 3,
adapter = "com.squareup.wire.ProtoAdapter#INT32"
)
public final Integer fps;
/**
* 动画总帧数
*/
@WireField(
tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#INT32"
)
public final Integer frames;
public MovieParams(Float viewBoxWidth, Float viewBoxHeight, Integer fps, Integer frames) {
this(viewBoxWidth, viewBoxHeight, fps, frames, ByteString.EMPTY);
}
public MovieParams(Float viewBoxWidth, Float viewBoxHeight, Integer fps, Integer frames, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.viewBoxWidth = viewBoxWidth;
this.viewBoxHeight = viewBoxHeight;
this.fps = fps;
this.frames = frames;
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.viewBoxWidth = viewBoxWidth;
builder.viewBoxHeight = viewBoxHeight;
builder.fps = fps;
builder.frames = frames;
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof MovieParams)) return false;
MovieParams o = (MovieParams) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(viewBoxWidth, o.viewBoxWidth)
&& Internal.equals(viewBoxHeight, o.viewBoxHeight)
&& Internal.equals(fps, o.fps)
&& Internal.equals(frames, o.frames);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (viewBoxWidth != null ? viewBoxWidth.hashCode() : 0);
result = result * 37 + (viewBoxHeight != null ? viewBoxHeight.hashCode() : 0);
result = result * 37 + (fps != null ? fps.hashCode() : 0);
result = result * 37 + (frames != null ? frames.hashCode() : 0);
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (viewBoxWidth != null) builder.append(", viewBoxWidth=").append(viewBoxWidth);
if (viewBoxHeight != null) builder.append(", viewBoxHeight=").append(viewBoxHeight);
if (fps != null) builder.append(", fps=").append(fps);
if (frames != null) builder.append(", frames=").append(frames);
return builder.replace(0, 2, "MovieParams{").append('}').toString();
}
public static final class Builder extends Message.Builder<MovieParams, Builder> {
public Float viewBoxWidth;
public Float viewBoxHeight;
public Integer fps;
public Integer frames;
public Builder() {
}
/**
* 画布宽
*/
public Builder viewBoxWidth(Float viewBoxWidth) {
this.viewBoxWidth = viewBoxWidth;
return this;
}
/**
* 画布高
*/
public Builder viewBoxHeight(Float viewBoxHeight) {
this.viewBoxHeight = viewBoxHeight;
return this;
}
/**
* 动画每秒播放帧数,合法值是 [1, 2, 3, 5, 6, 10, 12, 15, 20, 30, 60] 中的任意一个。
*/
public Builder fps(Integer fps) {
this.fps = fps;
return this;
}
/**
* 动画总帧数
*/
public Builder frames(Integer frames) {
this.frames = frames;
return this;
}
@Override
public MovieParams build() {
return new MovieParams(viewBoxWidth, viewBoxHeight, fps, frames, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_MovieParams extends ProtoAdapter<MovieParams> {
ProtoAdapter_MovieParams() {
super(FieldEncoding.LENGTH_DELIMITED, MovieParams.class);
}
@Override
public int encodedSize(MovieParams value) {
return (value.viewBoxWidth != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(1, value.viewBoxWidth) : 0)
+ (value.viewBoxHeight != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(2, value.viewBoxHeight) : 0)
+ (value.fps != null ? ProtoAdapter.INT32.encodedSizeWithTag(3, value.fps) : 0)
+ (value.frames != null ? ProtoAdapter.INT32.encodedSizeWithTag(4, value.frames) : 0)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, MovieParams value) throws IOException {
if (value.viewBoxWidth != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 1, value.viewBoxWidth);
if (value.viewBoxHeight != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 2, value.viewBoxHeight);
if (value.fps != null) ProtoAdapter.INT32.encodeWithTag(writer, 3, value.fps);
if (value.frames != null) ProtoAdapter.INT32.encodeWithTag(writer, 4, value.frames);
writer.writeBytes(value.unknownFields());
}
@Override
public MovieParams decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.viewBoxWidth(ProtoAdapter.FLOAT.decode(reader)); break;
case 2: builder.viewBoxHeight(ProtoAdapter.FLOAT.decode(reader)); break;
case 3: builder.fps(ProtoAdapter.INT32.decode(reader)); break;
case 4: builder.frames(ProtoAdapter.INT32.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public MovieParams redact(MovieParams value) {
Builder builder = value.newBuilder();
builder.clearUnknownFields();
return builder.build();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,202 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 13:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import java.util.List;
import okio.ByteString;
public final class SpriteEntity extends Message<SpriteEntity, SpriteEntity.Builder> {
public static final ProtoAdapter<SpriteEntity> ADAPTER = new ProtoAdapter_SpriteEntity();
private static final long serialVersionUID = 0L;
public static final String DEFAULT_IMAGEKEY = "";
public static final String DEFAULT_MATTEKEY = "";
/**
* 元件所对应的位图键名, 如果 imageKey 含有 .vector 后缀,该 sprite 为矢量图层 含有 .matte 后缀,该 sprite 为遮罩图层。
*/
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#STRING"
)
public final String imageKey;
/**
* 帧列表
*/
@WireField(
tag = 2,
adapter = "com.opensource.svgaplayer.proto.FrameEntity#ADAPTER",
label = WireField.Label.REPEATED
)
public final List<FrameEntity> frames;
/**
* 被遮罩图层的 matteKey 对应的是其遮罩图层的 imageKey.
*/
@WireField(
tag = 3,
adapter = "com.squareup.wire.ProtoAdapter#STRING"
)
public final String matteKey;
public SpriteEntity(String imageKey, List<FrameEntity> frames, String matteKey) {
this(imageKey, frames, matteKey, ByteString.EMPTY);
}
public SpriteEntity(String imageKey, List<FrameEntity> frames, String matteKey, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.imageKey = imageKey;
this.frames = Internal.immutableCopyOf("frames", frames);
this.matteKey = matteKey;
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.imageKey = imageKey;
builder.frames = Internal.copyOf("frames", frames);
builder.matteKey = matteKey;
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof SpriteEntity)) return false;
SpriteEntity o = (SpriteEntity) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(imageKey, o.imageKey)
&& frames.equals(o.frames)
&& Internal.equals(matteKey, o.matteKey);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (imageKey != null ? imageKey.hashCode() : 0);
result = result * 37 + frames.hashCode();
result = result * 37 + (matteKey != null ? matteKey.hashCode() : 0);
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (imageKey != null) builder.append(", imageKey=").append(imageKey);
if (!frames.isEmpty()) builder.append(", frames=").append(frames);
if (matteKey != null) builder.append(", matteKey=").append(matteKey);
return builder.replace(0, 2, "SpriteEntity{").append('}').toString();
}
public static final class Builder extends Message.Builder<SpriteEntity, Builder> {
public String imageKey;
public List<FrameEntity> frames;
public String matteKey;
public Builder() {
frames = Internal.newMutableList();
}
/**
* 元件所对应的位图键名, 如果 imageKey 含有 .vector 后缀,该 sprite 为矢量图层 含有 .matte 后缀,该 sprite 为遮罩图层。
*/
public Builder imageKey(String imageKey) {
this.imageKey = imageKey;
return this;
}
/**
* 帧列表
*/
public Builder frames(List<FrameEntity> frames) {
Internal.checkElementsNotNull(frames);
this.frames = frames;
return this;
}
/**
* 被遮罩图层的 matteKey 对应的是其遮罩图层的 imageKey.
*/
public Builder matteKey(String matteKey) {
this.matteKey = matteKey;
return this;
}
@Override
public SpriteEntity build() {
return new SpriteEntity(imageKey, frames, matteKey, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_SpriteEntity extends ProtoAdapter<SpriteEntity> {
ProtoAdapter_SpriteEntity() {
super(FieldEncoding.LENGTH_DELIMITED, SpriteEntity.class);
}
@Override
public int encodedSize(SpriteEntity value) {
return (value.imageKey != null ? ProtoAdapter.STRING.encodedSizeWithTag(1, value.imageKey) : 0)
+ FrameEntity.ADAPTER.asRepeated().encodedSizeWithTag(2, value.frames)
+ (value.matteKey != null ? ProtoAdapter.STRING.encodedSizeWithTag(3, value.matteKey) : 0)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, SpriteEntity value) throws IOException {
if (value.imageKey != null) ProtoAdapter.STRING.encodeWithTag(writer, 1, value.imageKey);
FrameEntity.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.frames);
if (value.matteKey != null) ProtoAdapter.STRING.encodeWithTag(writer, 3, value.matteKey);
writer.writeBytes(value.unknownFields());
}
@Override
public SpriteEntity decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.imageKey(ProtoAdapter.STRING.decode(reader)); break;
case 2: builder.frames.add(FrameEntity.ADAPTER.decode(reader)); break;
case 3: builder.matteKey(ProtoAdapter.STRING.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public SpriteEntity redact(SpriteEntity value) {
Builder builder = value.newBuilder();
Internal.redactElements(builder.frames, FrameEntity.ADAPTER);
builder.clearUnknownFields();
return builder.build();
}
}
}

View File

@@ -0,0 +1,251 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source file: svga.proto at 34:1
package com.opensource.svgaplayer.proto;
import com.squareup.wire.FieldEncoding;
import com.squareup.wire.Message;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import com.squareup.wire.ProtoWriter;
import com.squareup.wire.WireField;
import com.squareup.wire.internal.Internal;
import java.io.IOException;
import java.lang.Float;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import okio.ByteString;
public final class Transform extends Message<Transform, Transform.Builder> {
public static final ProtoAdapter<Transform> ADAPTER = new ProtoAdapter_Transform();
private static final long serialVersionUID = 0L;
public static final Float DEFAULT_A = 0.0f;
public static final Float DEFAULT_B = 0.0f;
public static final Float DEFAULT_C = 0.0f;
public static final Float DEFAULT_D = 0.0f;
public static final Float DEFAULT_TX = 0.0f;
public static final Float DEFAULT_TY = 0.0f;
@WireField(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float a;
@WireField(
tag = 2,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float b;
@WireField(
tag = 3,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float c;
@WireField(
tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float d;
@WireField(
tag = 5,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float tx;
@WireField(
tag = 6,
adapter = "com.squareup.wire.ProtoAdapter#FLOAT"
)
public final Float ty;
public Transform(Float a, Float b, Float c, Float d, Float tx, Float ty) {
this(a, b, c, d, tx, ty, ByteString.EMPTY);
}
public Transform(Float a, Float b, Float c, Float d, Float tx, Float ty, ByteString unknownFields) {
super(ADAPTER, unknownFields);
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.tx = tx;
this.ty = ty;
}
@Override
public Builder newBuilder() {
Builder builder = new Builder();
builder.a = a;
builder.b = b;
builder.c = c;
builder.d = d;
builder.tx = tx;
builder.ty = ty;
builder.addUnknownFields(unknownFields());
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof Transform)) return false;
Transform o = (Transform) other;
return unknownFields().equals(o.unknownFields())
&& Internal.equals(a, o.a)
&& Internal.equals(b, o.b)
&& Internal.equals(c, o.c)
&& Internal.equals(d, o.d)
&& Internal.equals(tx, o.tx)
&& Internal.equals(ty, o.ty);
}
@Override
public int hashCode() {
int result = super.hashCode;
if (result == 0) {
result = unknownFields().hashCode();
result = result * 37 + (a != null ? a.hashCode() : 0);
result = result * 37 + (b != null ? b.hashCode() : 0);
result = result * 37 + (c != null ? c.hashCode() : 0);
result = result * 37 + (d != null ? d.hashCode() : 0);
result = result * 37 + (tx != null ? tx.hashCode() : 0);
result = result * 37 + (ty != null ? ty.hashCode() : 0);
super.hashCode = result;
}
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (a != null) builder.append(", a=").append(a);
if (b != null) builder.append(", b=").append(b);
if (c != null) builder.append(", c=").append(c);
if (d != null) builder.append(", d=").append(d);
if (tx != null) builder.append(", tx=").append(tx);
if (ty != null) builder.append(", ty=").append(ty);
return builder.replace(0, 2, "Transform{").append('}').toString();
}
public static final class Builder extends Message.Builder<Transform, Builder> {
public Float a;
public Float b;
public Float c;
public Float d;
public Float tx;
public Float ty;
public Builder() {
}
public Builder a(Float a) {
this.a = a;
return this;
}
public Builder b(Float b) {
this.b = b;
return this;
}
public Builder c(Float c) {
this.c = c;
return this;
}
public Builder d(Float d) {
this.d = d;
return this;
}
public Builder tx(Float tx) {
this.tx = tx;
return this;
}
public Builder ty(Float ty) {
this.ty = ty;
return this;
}
@Override
public Transform build() {
return new Transform(a, b, c, d, tx, ty, super.buildUnknownFields());
}
}
private static final class ProtoAdapter_Transform extends ProtoAdapter<Transform> {
ProtoAdapter_Transform() {
super(FieldEncoding.LENGTH_DELIMITED, Transform.class);
}
@Override
public int encodedSize(Transform value) {
return (value.a != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(1, value.a) : 0)
+ (value.b != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(2, value.b) : 0)
+ (value.c != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(3, value.c) : 0)
+ (value.d != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(4, value.d) : 0)
+ (value.tx != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(5, value.tx) : 0)
+ (value.ty != null ? ProtoAdapter.FLOAT.encodedSizeWithTag(6, value.ty) : 0)
+ value.unknownFields().size();
}
@Override
public void encode(ProtoWriter writer, Transform value) throws IOException {
if (value.a != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 1, value.a);
if (value.b != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 2, value.b);
if (value.c != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 3, value.c);
if (value.d != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 4, value.d);
if (value.tx != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 5, value.tx);
if (value.ty != null) ProtoAdapter.FLOAT.encodeWithTag(writer, 6, value.ty);
writer.writeBytes(value.unknownFields());
}
@Override
public Transform decode(ProtoReader reader) throws IOException {
Builder builder = new Builder();
long token = reader.beginMessage();
for (int tag; (tag = reader.nextTag()) != -1;) {
switch (tag) {
case 1: builder.a(ProtoAdapter.FLOAT.decode(reader)); break;
case 2: builder.b(ProtoAdapter.FLOAT.decode(reader)); break;
case 3: builder.c(ProtoAdapter.FLOAT.decode(reader)); break;
case 4: builder.d(ProtoAdapter.FLOAT.decode(reader)); break;
case 5: builder.tx(ProtoAdapter.FLOAT.decode(reader)); break;
case 6: builder.ty(ProtoAdapter.FLOAT.decode(reader)); break;
default: {
FieldEncoding fieldEncoding = reader.peekFieldEncoding();
Object value = fieldEncoding.rawProtoAdapter().decode(reader);
builder.addUnknownField(tag, fieldEncoding, value);
}
}
}
reader.endMessage(token);
return builder.build();
}
@Override
public Transform redact(Transform value) {
Builder builder = value.newBuilder();
builder.clearUnknownFields();
return builder.build();
}
}
}

View File

@@ -0,0 +1,102 @@
package com.opensource.svgaplayer.utils
/**
* Helper class for creating pools of objects. An example use looks like this:
* <pre>
* public class MyPooledClass {
*
* private static final SynchronizedPool<MyPooledClass> sPool =
* new SynchronizedPool<MyPooledClass>(10);
*
* public static MyPooledClass obtain() {
* MyPooledClass instance = sPool.acquire();
* return (instance != null) ? instance : new MyPooledClass();
* }
*
* public void recycle() {
* // Clear state if needed.
* sPool.release(this);
* }
*
* . . .
* }
* </pre>
*
*/
class Pools private constructor() {
/**
* Interface for managing a pool of objects.
*
* @param <T> The pooled type.
*/
interface Pool<T> {
/**
* @return An instance from the pool if such, null otherwise.
*/
fun acquire(): T?
/**
* Release an instance to the pool.
*
* @param instance The instance to release.
* @return Whether the instance was put in the pool.
*
* @throws IllegalStateException If the instance is already in the pool.
*/
fun release(instance: T): Boolean
}
/**
* Simple (non-synchronized) pool of objects.
*
* @param maxPoolSize The max pool size.
*
* @throws IllegalArgumentException If the max pool size is less than zero.
*
* @param <T> The pooled type.
*/
open class SimplePool<T>(maxPoolSize: Int) : Pool<T> {
private val mPool: Array<Any?>
private var mPoolSize = 0
init {
require(maxPoolSize > 0) { "The max pool size must be > 0" }
mPool = arrayOfNulls(maxPoolSize)
}
@Suppress("UNCHECKED_CAST")
override fun acquire(): T? {
if (mPoolSize > 0) {
val lastPooledIndex = mPoolSize - 1
val instance = mPool[lastPooledIndex] as T?
mPool[lastPooledIndex] = null
mPoolSize--
return instance
}
return null
}
override fun release(instance: T): Boolean {
check(!isInPool(instance)) { "Already in the pool!" }
if (mPoolSize < mPool.size) {
mPool[mPoolSize] = instance
mPoolSize++
return true
}
return false
}
private fun isInPool(instance: T): Boolean {
for (i in 0 until mPoolSize) {
if (mPool[i] === instance) {
return true
}
}
return false
}
}
}

View File

@@ -0,0 +1,146 @@
package com.opensource.svgaplayer.utils
import android.widget.ImageView
/**
* Created by ubt on 2018/1/19.
*/
class SVGAScaleInfo {
var tranFx : Float = 0.0f
var tranFy : Float = 0.0f
var scaleFx : Float = 1.0f
var scaleFy : Float = 1.0f
var ratio = 1.0f
var ratioX = false
private fun resetVar(){
tranFx = 0.0f
tranFy = 0.0f
scaleFx = 1.0f
scaleFy = 1.0f
ratio = 1.0f
ratioX = false
}
fun performScaleType(canvasWidth : Float, canvasHeight: Float, videoWidth : Float, videoHeight : Float, scaleType: ImageView.ScaleType) {
if (canvasWidth == 0.0f || canvasHeight == 0.0f || videoWidth == 0.0f || videoHeight == 0.0f) {
return
}
resetVar()
val canW_vidW_f = (canvasWidth - videoWidth) / 2.0f
val canH_vidH_f = (canvasHeight - videoHeight) / 2.0f
val videoRatio = videoWidth / videoHeight
val canvasRatio = canvasWidth / canvasHeight
val canH_d_vidH = canvasHeight / videoHeight
val canW_d_vidW = canvasWidth / videoWidth
when (scaleType) {
ImageView.ScaleType.CENTER -> {
tranFx = canW_vidW_f
tranFy = canH_vidH_f
}
ImageView.ScaleType.CENTER_CROP -> {
if (videoRatio > canvasRatio) {
ratio = canH_d_vidH
ratioX = false
scaleFx = canH_d_vidH
scaleFy = canH_d_vidH
tranFx = (canvasWidth - videoWidth * (canH_d_vidH)) / 2.0f
}
else {
ratio = canW_d_vidW
ratioX = true
scaleFx = canW_d_vidW
scaleFy = canW_d_vidW
tranFy = (canvasHeight - videoHeight * (canW_d_vidW)) / 2.0f
}
}
ImageView.ScaleType.CENTER_INSIDE -> {
if (videoWidth < canvasWidth && videoHeight < canvasHeight) {
tranFx = canW_vidW_f
tranFy = canH_vidH_f
}
else {
if (videoRatio > canvasRatio) {
ratio = canW_d_vidW
ratioX = true
scaleFx = canW_d_vidW
scaleFy = canW_d_vidW
tranFy = (canvasHeight - videoHeight * (canW_d_vidW)) / 2.0f
}
else {
ratio = canH_d_vidH
ratioX = false
scaleFx = canH_d_vidH
scaleFy = canH_d_vidH
tranFx = (canvasWidth - videoWidth * (canH_d_vidH)) / 2.0f
}
}
}
ImageView.ScaleType.FIT_CENTER -> {
if (videoRatio > canvasRatio) {
ratio = canW_d_vidW
ratioX = true
scaleFx = canW_d_vidW
scaleFy = canW_d_vidW
tranFy = (canvasHeight - videoHeight * (canW_d_vidW)) / 2.0f
}
else {
ratio = canH_d_vidH
ratioX = false
scaleFx = canH_d_vidH
scaleFy = canH_d_vidH
tranFx = (canvasWidth - videoWidth * (canH_d_vidH)) / 2.0f
}
}
ImageView.ScaleType.FIT_START -> {
if (videoRatio > canvasRatio) {
ratio = canW_d_vidW
ratioX = true
scaleFx = canW_d_vidW
scaleFy = canW_d_vidW
}
else {
ratio = canH_d_vidH
ratioX = false
scaleFx = canH_d_vidH
scaleFy = canH_d_vidH
}
}
ImageView.ScaleType.FIT_END -> {
if (videoRatio > canvasRatio) {
ratio = canW_d_vidW
ratioX = true
scaleFx = canW_d_vidW
scaleFy = canW_d_vidW
tranFy= canvasHeight - videoHeight * (canW_d_vidW)
}
else {
ratio = canH_d_vidH
ratioX = false
scaleFx = canH_d_vidH
scaleFy = canH_d_vidH
tranFx = canvasWidth - videoWidth * (canH_d_vidH)
}
}
ImageView.ScaleType.FIT_XY -> {
ratio = Math.max(canW_d_vidW, canH_d_vidH)
ratioX = canW_d_vidW > canH_d_vidH
scaleFx = canW_d_vidW
scaleFy = canH_d_vidH
}
else -> {
ratio = canW_d_vidW
ratioX = true
scaleFx = canW_d_vidW
scaleFy = canW_d_vidW
}
}
}
}

View File

@@ -0,0 +1,11 @@
package com.opensource.svgaplayer.utils
/**
* Created by cuiminghui on 2017/3/29.
*/
class SVGAPoint(val x: Float, val y: Float, val value: Float)
class SVGARect(val x: Double, val y: Double, val width: Double, val height: Double)
class SVGARange(val location: Int, val length: Int)

View File

@@ -0,0 +1,28 @@
package com.opensource.svgaplayer.utils.log
import android.util.Log
/**
* 内部默认 ILogger 接口实现
*/
class DefaultLogCat : ILogger {
override fun verbose(tag: String, msg: String) {
Log.v(tag, msg)
}
override fun info(tag: String, msg: String) {
Log.i(tag, msg)
}
override fun debug(tag: String, msg: String) {
Log.d(tag, msg)
}
override fun warn(tag: String, msg: String) {
Log.w(tag, msg)
}
override fun error(tag: String, msg: String?, error: Throwable?) {
Log.e(tag, msg, error)
}
}

View File

@@ -0,0 +1,12 @@
package com.opensource.svgaplayer.utils.log
/**
* log 外部接管接口
**/
interface ILogger {
fun verbose(tag: String, msg: String)
fun info(tag: String, msg: String)
fun debug(tag: String, msg: String)
fun warn(tag: String, msg: String)
fun error(tag: String, msg: String?, error: Throwable?)
}

View File

@@ -0,0 +1,57 @@
package com.opensource.svgaplayer.utils.log
/**
* 日志输出
*/
internal object LogUtils {
private const val TAG = "SVGALog"
fun verbose(tag: String = TAG, msg: String) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.verbose(tag, msg)
}
fun info(tag: String = TAG, msg: String) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.info(tag, msg)
}
fun debug(tag: String = TAG, msg: String) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.debug(tag, msg)
}
fun warn(tag: String = TAG, msg: String) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.warn(tag, msg)
}
fun error(tag: String = TAG, msg: String) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.error(tag, msg, null)
}
fun error(tag: String, error: Throwable) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.error(tag, error.message, error)
}
fun error(tag: String = TAG, msg: String, error: Throwable) {
if (!SVGALogger.isLogEnabled()) {
return
}
SVGALogger.getSVGALogger()?.error(tag, msg, error)
}
}

View File

@@ -0,0 +1,40 @@
package com.opensource.svgaplayer.utils.log
/**
* SVGA logger 配置管理
**/
object SVGALogger {
private var mLogger: ILogger? = DefaultLogCat()
private var isLogEnabled = false
/**
* log 接管注入
*/
fun injectSVGALoggerImp(logImp: ILogger): SVGALogger {
mLogger = logImp
return this
}
/**
* 设置是否开启 log
*/
fun setLogEnabled(isEnabled: Boolean): SVGALogger {
isLogEnabled = isEnabled
return this
}
/**
* 获取当前 ILogger 实现类
*/
fun getSVGALogger(): ILogger? {
return mLogger
}
/**
* 是否开启 log
*/
fun isLogEnabled(): Boolean {
return isLogEnabled
}
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SVGAImageView">
<attr name="source" format="string" />
<attr name="autoPlay" format="boolean" />
<attr name="antiAlias" format="boolean" />
<attr name="loopCount" format="integer" />
<attr name="clearsAfterStop" format="boolean" />
<attr name="clearsAfterDetached" format="boolean" />
<attr name="fillMode" format="enum">
<enum name="Backward" value="0" />
<enum name="Forward" value="1" />
<enum name="Clear" value="2"/>
</attr>
</declare-styleable>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<string name="app_name">SVGAPlayer</string>
</resources>

1
Share/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

74
Share/build.gradle Normal file
View File

@@ -0,0 +1,74 @@
apply plugin: 'com.android.library'
apply plugin: 'img-optimizer'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-parcelize'
apply from: "../package_config.gradle"
android {
namespace "com.newpdlive.sy"
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
packagingOptions {
pickFirst "lib/armeabi/libyuvutils.so"
pickFirst "lib/arm64-v8a/libyuvutils.so"
pickFirst "lib/armeabi-v7a/libyuvutils.so"
pickFirst "lib/armeabi/libyuvtools.so"
pickFirst "lib/arm64-v8a/libyuvtools.so"
pickFirst "lib/armeabi-v7a/libyuvtools.so"
exclude "lib/arm64-v8a/libmmcv_api_handgesture.so"
exclude "lib/arm64-v8a/libmmcv_api_express.so"
exclude "lib/arm64-v8a/libMediaEncoder.so"
exclude "lib/arm64-v8a/libarcore_sdk_c.so"
exclude "lib/arm64-v8a/libmediadecoder.so"
exclude "lib/arm64-v8a/libMediaMuxer.so"
exclude "lib/arm64-v8a/libarcore_sdk_jni.so"
exclude "lib/arm64-v8a/libMediaUtils.so"
exclude "lib/arm64-v8a/libcosmosffmpeg.so"
}
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
manifestPlaceholders = rootProject.ext.manifestPlaceholders
ndk {
abiFilters "armeabi-v7a", "arm64-v8a","x86","x86_64"
}
}
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
flatDir {
dirs 'libs', '../libs'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies["appcompat-androidx"]
implementation rootProject.ext.dependencies["recyclerview-androidx"]
//common
implementation project(path: ':common')
//Twitter
implementation 'com.twitter.sdk.android:twitter:3.1.1'
//facebook & Messenger
implementation 'com.facebook.android:facebook-share:15.2.0'
}

0
Share/consumer-rules.pro Normal file
View File

21
Share/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,26 @@
package com.yunbao.share;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.yunbao.share.test", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<queries>
<package android:name="com.newpdlive.sy"/>
<package android:name="com.facebook.orca"/>
<package
android:name="com.facebook.composer" />
<package
android:name="com.facebook.katana" />
<package
android:name="com.facebook.messenger" />
<provider
android:authorities="com.facebook.katana.provider.PlatformProvider"
tools:ignore="ExportedContentProvider" />
</queries>
<application android:allowBackup="true">
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:screenOrientation="portrait" />
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.app.FacebookContentProvider2011402032399020"
android:exported="true" />
<receiver
android:name="com.yunbao.share.receiver.TwitterResultReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_SUCCESS" />
<action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE" />
<action android:name="com.twitter.sdk.android.tweetcomposer.TWEET_COMPOSE_CANCEL" />
</intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -0,0 +1,34 @@
package com.yunbao.share;
import android.content.Context;
import android.content.IntentFilter;
import android.net.Uri;
import androidx.core.content.FileProvider;
import com.twitter.sdk.android.tweetcomposer.TweetUploadService;
import com.yunbao.share.bean.ShareBuilder;
import com.yunbao.share.receiver.TwitterResultReceiver;
import java.io.File;
public abstract class AbsShareInterface {
protected final Context mContext;
public AbsShareInterface(Context context) {
this.mContext = context;
IntentFilter filter = new IntentFilter(TweetUploadService.UPLOAD_SUCCESS);
filter.addAction(TweetUploadService.UPLOAD_FAILURE);
filter.addAction(TweetUploadService.TWEET_COMPOSE_CANCEL);
context.registerReceiver(new TwitterResultReceiver(), filter);
}
public abstract void share(ShareBuilder builder, ICallback callback);
public Uri fileToUri(File file){
return FileProvider.getUriForFile(mContext,
mContext.getPackageName() + ".fileprovider",
file
);
}
}

View File

@@ -0,0 +1,6 @@
package com.yunbao.share;
public interface ICallback {
void onSuccess();
void onFailure();
}

View File

@@ -0,0 +1,130 @@
package com.yunbao.share.adapters;
import android.content.Context;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.recyclerview.widget.RecyclerView;
import com.newpdlive.sy.R;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
import com.yunbao.share.platform.FacebookShare;
import com.yunbao.share.platform.Instagram;
import com.yunbao.share.platform.Line;
import com.yunbao.share.platform.MessengerShare;
import com.yunbao.share.platform.TwitterShare;
import com.yunbao.share.platform.WhatsApp;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class ShareAppAdapter extends RecyclerView.Adapter<ShareAppAdapter.AppViewHolder> {
private Context mContext;
private List<ShareBuilder> list;
public ShareAppAdapter(Context mContext) {
list = new ArrayList<>();
this.mContext = mContext;
}
public void setList(List<ShareBuilder> list) {
this.list = list;
notifyDataSetChanged();
}
@NonNull
@Override
public AppViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new AppViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_share_app, parent, false));
}
@Override
public void onBindViewHolder(@NonNull AppViewHolder holder, int position) {
ShareBuilder builder = list.get(position);
switch (builder.getType()) {
case ShareBuilder.APP_FACEBOOK:
holder.setData(builder, R.mipmap.icon_share_facebook, R.string.dialog_share_app_facebook);
break;
case ShareBuilder.APP_LINE:
holder.setData(builder, R.mipmap.icon_share_line, R.string.dialog_share_app_line);
break;
case ShareBuilder.APP_TWITTER:
holder.setData(builder, R.mipmap.icon_share_twitter, R.string.dialog_share_app_twitter);
break;
case ShareBuilder.APP_WHATSAPP:
holder.setData(builder, R.mipmap.icon_share_whatsapp, R.string.dialog_share_app_whatsapp);
break;
case ShareBuilder.APP_MESSENGER:
holder.setData(builder, R.mipmap.icon_share_messenger, R.string.dialog_share_app_messenger);
break;
case ShareBuilder.APP_INSTAGRAM:
holder.setData(builder, R.mipmap.icon_share_instagram, R.string.dialog_share_app_instagram);
break;
}
}
@Override
public int getItemCount() {
return list.size();
}
public static class AppViewHolder extends RecyclerView.ViewHolder {
ImageView icon;
TextView title;
public AppViewHolder(@NonNull View itemView) {
super(itemView);
icon = itemView.findViewById(R.id.share_app_icon);
title = itemView.findViewById(R.id.share_app_name);
}
public void setData(ShareBuilder bean, @DrawableRes int iconId, @StringRes int appName) {
icon.setImageResource(iconId);
title.setText(appName);
itemView.setOnClickListener(v -> {
switch (bean.getType()) {
case ShareBuilder.APP_FACEBOOK:
new FacebookShare(itemView.getContext()).share(bean, new ShareCallback());
break;
case ShareBuilder.APP_LINE:
new Line(itemView.getContext()).share(bean, new ShareCallback());
break;
case ShareBuilder.APP_TWITTER:
new TwitterShare(itemView.getContext()).share(bean, new ShareCallback());
break;
case ShareBuilder.APP_WHATSAPP:
new WhatsApp(itemView.getContext()).share(bean, new ShareCallback());
break;
case ShareBuilder.APP_MESSENGER:
new MessengerShare(itemView.getContext()).share(bean, new ShareCallback());
break;
case ShareBuilder.APP_INSTAGRAM:
new Instagram(itemView.getContext()).share(bean, new ShareCallback());
break;
}
});
}
private static class ShareCallback implements ICallback {
@Override
public void onSuccess() {
}
@Override
public void onFailure() {
}
}
}
}

View File

@@ -0,0 +1,134 @@
package com.yunbao.share.bean;
import androidx.annotation.NonNull;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.StringUtil;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Locale;
public class ShareBuilder {
public static final int APP_FACEBOOK = 0;
public static final int APP_LINE = 1;
public static final int APP_TWITTER = 2;
public static final int APP_WHATSAPP = 3;
public static final int APP_MESSENGER = 4;
public static final int APP_INSTAGRAM = 5;
private String text;
private String link;
private File file;
private int type;
private String uid;
private String anchorId;
private String anchorName;
private String anchorAvatar;
public static String createLiveShareLink(String shareUid, String anchorId, String anchorName, String anchorAvatar) {
return String.format(CommonAppConfig.HOST +
"/index.php?g=Appapi&m=home&a=share&uid=%s&user_id=%s&isGoogle=%s",
anchorId,
shareUid,
CommonAppConfig.IS_GOOGLE_PLAY
);
}
public static String createInviteLink(String shareUid) {
return String.format("https://www.pdlive.com/public/app/download/index.html?user_id=%s&isGoogle=%s",
shareUid,
CommonAppConfig.IS_GOOGLE_PLAY
);
}
public static ShareBuilder builder(int type) {
return new ShareBuilder(type);
}
private ShareBuilder(int type) {
this.type = type;
}
public int getType() {
return type;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getAnchorId() {
return anchorId;
}
public void setAnchorId(String anchorId) {
this.anchorId = anchorId;
}
public String getAnchorName() {
return anchorName;
}
public void setAnchorName(String anchorName) {
this.anchorName = anchorName;
}
public String getAnchorAvatar() {
return anchorAvatar;
}
public void setAnchorAvatar(String anchorAvatar) {
this.anchorAvatar = anchorAvatar;
}
public ShareBuilder setText(String text) {
this.text = text;
return this;
}
public ShareBuilder setLink(String link) {
this.link = link;
return this;
}
public ShareBuilder setFile(File file) {
this.file = file;
return this;
}
public String getText() {
if (StringUtil.isEmpty(text)) {
return getLink();
}
return text + "\n" + getLink();
}
public String getLink() {
if (StringUtil.isEmpty(link)) {
link = createLiveShareLink(uid, anchorId, anchorName, anchorAvatar);
}
return link;
}
public File getFile() {
return file;
}
@NonNull
@Override
public String toString() {
return "ShareBuilder{" +
"text='" + text + '\'' +
", link='" + link + '\'' +
", file=" + file +
'}';
}
}

View File

@@ -0,0 +1,48 @@
package com.yunbao.share.platform;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import androidx.annotation.NonNull;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.share.Sharer;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.share.AbsShareInterface;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
public class FacebookShare extends AbsShareInterface {
public static CallbackManager callbackManager;
public FacebookShare(Context context) {
super(context);
}
@Override
public void share(ShareBuilder builder, ICallback callback) {
callbackManager= CallbackManager.Factory.create();
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse(builder.getLink()))
.build();
ShareDialog dialog=new ShareDialog((Activity) mContext);
dialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
@Override
public void onSuccess(Sharer.Result result) {
}
@Override
public void onCancel() {
}
@Override
public void onError(@NonNull FacebookException e) {
}
});
dialog.show(content);
}
}

View File

@@ -0,0 +1,27 @@
package com.yunbao.share.platform;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.yunbao.share.AbsShareInterface;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
public class Instagram extends AbsShareInterface {
public Instagram(Context context) {
super(context);
}
@Override
public void share(ShareBuilder builder, ICallback callback) {
String type = "image/*";
Intent share = new Intent(Intent.ACTION_SEND);
Uri uri = fileToUri(builder.getFile());
share.setType(type);
share.putExtra(Intent.EXTRA_STREAM, uri);
share.setPackage("com.instagram.android");
mContext.startActivity(Intent.createChooser(share, "Share to"));
callback.onSuccess();
}
}

View File

@@ -0,0 +1,31 @@
package com.yunbao.share.platform;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.yunbao.share.AbsShareInterface;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
import java.net.URLEncoder;
public class Line extends AbsShareInterface {
public Line(Context context) {
super(context);
}
@Override
public void share(ShareBuilder builder, ICallback callback) {
try {
Intent share = new Intent(Intent.ACTION_VIEW, Uri.parse("https://line.me/R/share?text=" + URLEncoder.encode(builder.getText(), "UTF-8")));
mContext.startActivity(share);
callback.onSuccess();
} catch (Exception e) {
callback.onFailure();
throw new RuntimeException(e);
}
}
}

View File

@@ -0,0 +1,57 @@
package com.yunbao.share.platform;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import androidx.annotation.NonNull;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.share.Sharer;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.MessageDialog;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.share.AbsShareInterface;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
public class MessengerShare extends AbsShareInterface {
public static CallbackManager callbackManager;
public MessengerShare(Context context) {
super(context);
FacebookSdk.setIsDebugEnabled(true);
}
@Override
public void share(ShareBuilder builder, ICallback callback) {
callbackManager = CallbackManager.Factory.create();
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse(builder.getLink()))
.build();
MessageDialog dialog = new MessageDialog((Activity) mContext);
dialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
@Override
public void onSuccess(Sharer.Result result) {
callback.onSuccess();
}
@Override
public void onCancel() {
}
@Override
public void onError(@NonNull FacebookException e) {
e.printStackTrace();
}
});
if(dialog.canShow(content)) {
dialog.show(content);
}else{
callback.onFailure();
}
}
}

View File

@@ -0,0 +1,73 @@
package com.yunbao.share.platform;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.twitter.sdk.android.core.Twitter;
import com.yunbao.share.AbsShareInterface;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
import java.net.URLEncoder;
public class TwitterShare extends AbsShareInterface {
public TwitterShare(Context context) {
super(context);
Twitter.initialize(context);
}
@Override
public void share(ShareBuilder date, ICallback callback) {
/*
new TwitterAuthClient().authorize((Activity) mContext, new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
//获取以下登录成功返回信息进行登录验证
//获取登录用户信息
final TwitterSession activeSession=TwitterCore.getInstance().getSessionManager().getActiveSession();
Intent intent = new ComposerActivity.Builder(mContext)
.session(activeSession)
.image(fileToUri(date.getFile()))
.text(date.getText())
.hashtags("#twitter")
.createIntent();
mContext.startActivity(intent);
}
@Override
public void failure(TwitterException e) {
}
});*/
/* TweetComposer.Builder builder;
if (date.getFile() == null) {
try {
builder=new TweetComposer.Builder(mContext)
.text(date.getText())
.url(new URL(date.getLink()));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
} else {
builder = new TweetComposer.Builder(mContext)
.text(date.getText())
.image(fileToUri(date.getFile()));
}
builder.show();*/
try {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_VIEW);
sendIntent.putExtra(Intent.EXTRA_TEXT, date.getText());
// sendIntent.setType("text/plain");
//sendIntent.setPackage("com.twitter.composer.ComposerShareActivity");
sendIntent.setData(Uri.parse("https://twitter.com/intent/tweet?text=" +URLEncoder.encode(date.getText(),"UTF-8")));
mContext.startActivity(sendIntent);
callback.onSuccess();
} catch (Exception e) {
callback.onFailure();
}
}
}

View File

@@ -0,0 +1,30 @@
package com.yunbao.share.platform;
import android.content.Context;
import android.content.Intent;
import com.yunbao.share.AbsShareInterface;
import com.yunbao.share.ICallback;
import com.yunbao.share.bean.ShareBuilder;
public class WhatsApp extends AbsShareInterface {
public WhatsApp(Context context) {
super(context);
}
@Override
public void share(ShareBuilder builder, ICallback callback) {
try {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, builder.getText());
sendIntent.setType("text/plain");
sendIntent.setPackage("com.whatsapp");
mContext.startActivity(sendIntent);
callback.onSuccess();
} catch (Exception e) {
callback.onFailure();
}
}
}

View File

@@ -0,0 +1,28 @@
package com.yunbao.share.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.twitter.sdk.android.tweetcomposer.TweetUploadService;
import com.yunbao.common.utils.ToastUtil;
public class TwitterResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("分享log", "onReceive: "+intent.getAction());
if (TweetUploadService.UPLOAD_SUCCESS.equals(intent.getAction())) {
ToastUtil.show("推特分享成功");
// success
final Long tweetId = intent.getExtras().getLong(TweetUploadService.EXTRA_TWEET_ID);
} else if (TweetUploadService.UPLOAD_FAILURE.equals(intent.getAction())) {
// failure
ToastUtil.show("推特分享失败");
final Intent retryIntent = intent.getExtras().getParcelable(TweetUploadService.EXTRA_RETRY_INTENT);
} else if (TweetUploadService.TWEET_COMPOSE_CANCEL.equals(intent.getAction())) {
// cancel
ToastUtil.show("推特分享取消");
}
}
}

View File

@@ -0,0 +1,158 @@
package com.yunbao.share.ui;
import static android.content.Context.CLIPBOARD_SERVICE;
import android.app.Dialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Shader;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.lxj.xpopup.XPopup;
import com.makeramen.roundedimageview.RoundedImageView;
import com.newpdlive.sy.R;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.dialog.AbsDialogPopupWindow;
import com.yunbao.common.utils.DialogUitl;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import com.yunbao.share.bean.ShareBuilder;
import com.yunbao.share.adapters.ShareAppAdapter;
import java.util.ArrayList;
import java.util.List;
public class InvitePopDialog extends AbsDialogPopupWindow {
private ShareAppAdapter adapter;
private RecyclerView list;
private RoundedImageView avatar;
private TextView info;
private TextView link;
private TextView title;
private List<ShareBuilder> data;
private String uid;
private String anchorId;
private String anchorName;
private String anchorAvatar;
private String url;
public InvitePopDialog(@NonNull Context context) {
super(context);
}
public InvitePopDialog setUid(String uid) {
this.uid = uid;
return this;
}
public InvitePopDialog setAnchorId(String anchorId) {
this.anchorId = anchorId;
return this;
}
public InvitePopDialog setAnchorName(String anchorName) {
this.anchorName = anchorName;
return this;
}
public InvitePopDialog setAnchorAvatar(String anchorAvatar) {
this.anchorAvatar = anchorAvatar;
return this;
}
@Override
public void buildDialog(XPopup.Builder builder) {
}
@Override
public int bindLayoutId() {
return R.layout.dialog_share;
}
@Override
protected void onCreate() {
super.onCreate();
findViewById(R.id.close).setOnClickListener(v -> dismiss());
((ImageView) findViewById(R.id.close)).setImageResource(R.mipmap.icon_invite_close);
findViewById(R.id.share_copy).setOnClickListener(v -> copyLink());
// findViewById(R.id.share_preview).setVisibility(GONE);
findViewById(R.id.share_dialog).setBackgroundResource(R.mipmap.bg_dialog_inviet);
title = findViewById(R.id.share_title);
list = findViewById(R.id.share_apps_list);
avatar = findViewById(R.id.share_avatar);
info = findViewById(R.id.share_info);
link = findViewById(R.id.share_link);
adapter = new ShareAppAdapter(getContext());
list.setLayoutManager(new GridLayoutManager(getContext(), 3));
list.setAdapter(adapter);
initData();
link.setText(url.substring(0, 40));
info.setText(mContext.getString(R.string.dialog_invite_info));
avatar.setImageResource(R.mipmap.ic_launcher);
//title.setTextColor(getContext().getResources().getColorStateList(R.drawable.bg_invite_title));
title.setText(R.string.dialog_invite_title);
title.getViewTreeObserver().addOnGlobalLayoutListener(this::setTitleColor);
}
private void setTitleColor() {
int[] colors = {
Color.parseColor("#3377FF"),
Color.parseColor("#7F66FF"),
};
float[] position = {
0f,
1.0f
};
float height = title.getMeasuredHeight();
LinearGradient mLinearGradient = new LinearGradient(0, 0, 0, height, colors, position, Shader.TileMode.CLAMP);
title.getPaint().setShader(mLinearGradient);
title.invalidate();
}
private void initData() {
data = new ArrayList<>();
data.add(builder(ShareBuilder.APP_FACEBOOK));
data.add(builder(ShareBuilder.APP_LINE));
data.add(builder(ShareBuilder.APP_TWITTER));
data.add(builder(ShareBuilder.APP_WHATSAPP));
data.add(builder(ShareBuilder.APP_MESSENGER));
// data.add(builder(ShareBuilder.APP_INSTAGRAM));
adapter.setList(data);
}
private ShareBuilder builder(int type) {
ShareBuilder builder = ShareBuilder.builder(type);
builder.setText(getContext().getString(R.string.dialog_invite_info));
builder.setLink(url);
builder.setUid(uid);
builder.setAnchorId(anchorId);
builder.setAnchorName(anchorName);
builder.setAnchorAvatar(anchorAvatar);
return builder;
}
private void copyLink() {
ClipboardManager cm = (ClipboardManager) getContext().getSystemService(CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("text", info.getText() + "\n" + url);
cm.setPrimaryClip(clipData);
ToastUtil.show(getContext().getString(com.yunbao.common.R.string.copy_success));
}
public InvitePopDialog setUrl(String data) {
this.url = data + "&isGoogle=" + CommonAppConfig.IS_GOOGLE_PLAY;
return this;
}
}

View File

@@ -0,0 +1,147 @@
package com.yunbao.share.ui;
import static android.content.Context.CLIPBOARD_SERVICE;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.lxj.xpopup.XPopup;
import com.makeramen.roundedimageview.RoundedImageView;
import com.newpdlive.sy.R;
import com.yunbao.common.dialog.AbsDialogPopupWindow;
import com.yunbao.common.glide.ImgLoader;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import com.yunbao.share.adapters.ShareAppAdapter;
import com.yunbao.share.bean.ShareBuilder;
import java.util.ArrayList;
import java.util.List;
public class SharePopDialog extends AbsDialogPopupWindow {
private ShareAppAdapter adapter;
private RecyclerView list;
private RoundedImageView avatar;
private TextView info;
private TextView link;
private List<ShareBuilder> data;
private String uid;
private String anchorId;
private String anchorName;
private String anchorAvatar;
private String shareLink;
public SharePopDialog(@NonNull Context context) {
super(context);
}
public SharePopDialog setUid(String uid) {
this.uid = uid;
return this;
}
public SharePopDialog setAnchorId(String anchorId) {
this.anchorId = anchorId;
return this;
}
public SharePopDialog setAnchorName(String anchorName) {
this.anchorName = anchorName;
return this;
}
public SharePopDialog setAnchorAvatar(String anchorAvatar) {
this.anchorAvatar = anchorAvatar;
return this;
}
public SharePopDialog setShareLink(String link) {
this.shareLink = link + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
return this;
}
@Override
public void buildDialog(XPopup.Builder builder) {
}
@Override
public int bindLayoutId() {
return R.layout.dialog_share;
}
@Override
protected void onCreate() {
super.onCreate();
findViewById(R.id.close).setOnClickListener(v -> dismiss());
findViewById(R.id.share_copy).setOnClickListener(v -> copyLink());
list = findViewById(R.id.share_apps_list);
avatar = findViewById(R.id.share_avatar);
info = findViewById(R.id.share_info);
link = findViewById(R.id.share_link);
adapter = new ShareAppAdapter(getContext());
list.setLayoutManager(new GridLayoutManager(getContext(), 3));
list.setAdapter(adapter);
initData();
}
private void initData() {
data = new ArrayList<>();
data.add(builder(ShareBuilder.APP_FACEBOOK));
data.add(builder(ShareBuilder.APP_LINE));
data.add(builder(ShareBuilder.APP_TWITTER));
data.add(builder(ShareBuilder.APP_WHATSAPP));
data.add(builder(ShareBuilder.APP_MESSENGER));
//data.add(builder(ShareBuilder.APP_INSTAGRAM));
adapter.setList(data);
String url;
if (shareLink == null) {
url = ShareBuilder.createLiveShareLink(uid, anchorId, anchorName, anchorAvatar).substring(0, 40) + "...";
} else {
if (shareLink.length() > 40) {
url = shareLink.substring(0, 40) + "...";
} else {
url = shareLink;
}
}
url = url + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
link.setText(url);
info.setText(String.format(getContext().getString(R.string.dialog_share_info), StringUtil.isEmpty(anchorName) ? "" : anchorName));
ImgLoader.display(getContext(), anchorAvatar, avatar);
}
private ShareBuilder builder(int type) {
ShareBuilder builder = ShareBuilder.builder(type);
builder.setText(String.format(getContext().getString(R.string.dialog_share_info), StringUtil.isEmpty(anchorName) ? "" : anchorName));
builder.setUid(uid);
builder.setAnchorId(anchorId);
builder.setAnchorName(anchorName);
builder.setAnchorAvatar(anchorAvatar);
if (shareLink != null) {
builder.setLink(shareLink);
}
return builder;
}
private void copyLink() {
String url;
if (shareLink != null) {
url = shareLink;
} else {
url = ShareBuilder.createLiveShareLink(uid, anchorId, anchorName, anchorAvatar);
}
ClipboardManager cm = (ClipboardManager) getContext().getSystemService(CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("text", info.getText().toString() + "\n" + url + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0));
cm.setPrimaryClip(clipData);
ToastUtil.show(getContext().getString(com.yunbao.common.R.string.copy_success));
}
}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="189dp" android:height="42dp">
<shape android:shape="rectangle">
<gradient android:type="linear" android:useLevel="true" android:startColor="#ffffc621" android:endColor="#ffffae05" android:angle="135" />
<corners android:radius="21dp" />
</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 android:width="112dp" android:height="42dp">
<shape android:shape="rectangle">
<stroke android:width="1dp" android:color="#ffffffff" />
<gradient android:type="linear" android:useLevel="true" android:startColor="#3377FF" android:endColor="#7F66FF" android:angle="90" />
<corners android:topLeftRadius="22dp" android:topRightRadius="22dp" android:bottomLeftRadius="22dp" android:bottomRightRadius="22dp" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,12 @@
<?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="15dp" />
<solid android:color="#ffffff" />
<stroke
android:width="1dp"
android:color="#EBEBEB" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/share_dialog"
android:layout_height="wrap_content"
android:background="@mipmap/bg_dialog_share">
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/share_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="@string/dialog_invite_title"
android:textColor="@drawable/bg_invite_title"
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/close"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
app:srcCompat="@mipmap/icon_dialog_charge_close" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/share_apps_list"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout2"
tools:itemCount="6"
tools:layoutManager="GridLayoutManager"
tools:listitem="@layout/item_share_app"
tools:spanCount="3" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/share_dialog"
android:layout_height="wrap_content"
android:background="@mipmap/bg_dialog_share">
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/share_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="@string/dialog_share_title"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/close"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
app:srcCompat="@mipmap/icon_share_close" />
</LinearLayout>
<include
android:id="@+id/share_preview"
layout="@layout/view_share_preview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="14dp"
android:layout_marginEnd="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout2" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/share_apps_list"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/share_preview"
tools:itemCount="6"
tools:layoutManager="GridLayoutManager"
tools:listitem="@layout/item_share_app"
tools:spanCount="3" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/linearLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/share_app_icon"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_marginStart="35dp"
android:layout_marginTop="12dp"
android:layout_marginEnd="35dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/avatars" />
<TextView
android:id="@+id/share_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="12dp"
android:text="TextView"
android:textColor="#666666"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/share_app_icon" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_preview"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="12dp"
android:layout_marginEnd="2dp"
android:orientation="horizontal">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/share_avatar"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerCrop"
android:src="@drawable/m_chu_xia"
app:riv_oval="true" />
<TextView
android:id="@+id/share_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:text="@string/dialog_share_info"
android:textColor="#333333"
android:textSize="12sp" />
<TextView
android:id="@+id/share_copy"
android:layout_width="70dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:layout_marginEnd="16dp"
android:background="@drawable/bg_btn"
android:gravity="center"
android:layout_marginStart="25dp"
android:text="@string/dialog_share_copy"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/share_layout_link"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="12dp"
android:layout_marginBottom="12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@mipmap/icon_share_url" />
<TextView
android:id="@+id/share_link"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="TextView"
android:textColor="#999999"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

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