Compare commits

...

1128 Commits

Author SHA1 Message Date
e1e6924b6e tinker_base 4.1.0-191 2020-08-11 18:30:29 +08:00
80a2cbb8cd versionCode 改为191 2020-08-11 18:09:08 +08:00
b5ff891db1 修复动态页跳转礼包详情的游戏图标显示问题 2020-08-11 16:03:22 +08:00
52efa96e2c 修复游戏图标的列表复用问题 2020-08-11 10:10:56 +08:00
816dd60298 修复游戏图标角标的复用问题 2020-08-10 18:20:11 +08:00
a181292f80 修复游戏图标角标的复用问题 2020-08-10 18:09:55 +08:00
4ecc0c073b 补充GID获取异常的MTA统计 2020-08-10 11:36:47 +08:00
faa41248eb 修改获取Toast默认偏移量和位置闪退 2020-08-10 10:11:55 +08:00
f3fab1b3f6 tinker-base_4.1.0 2020-08-07 19:21:13 +08:00
5340a41298 fix bug 2020-08-07 14:24:31 +08:00
caf2a379d9 修复xapk解压后安装包路径没有写入数据库的问题 2020-08-06 16:55:51 +08:00
c59b79427c 修复xapk解压后安装包路径没有写入数据库的问题 2020-08-06 16:42:32 +08:00
e54fcca53e xapk解压失败增加MTA统计 2020-08-06 14:55:40 +08:00
ad416c6a5d xapk解压增加备用解决方案 2020-08-06 14:07:06 +08:00
4a65c1a5c8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-08-05 15:53:00 +08:00
878529f646 fix 2020-08-05 15:52:47 +08:00
d01bc1e2d1 移除无用的ijkplayer依赖 2020-08-04 15:59:34 +08:00
d63f5f5ab2 调整广点通激活数据的发送时机 2020-08-04 10:01:00 +08:00
ad0fb7a55a 处理游戏图标类型不一致导致的闪退问题 2020-08-03 16:25:57 +08:00
b0258eef77 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-08-03 16:06:33 +08:00
86d4df8ad9 修复新增开服默认选择时间分钟不准问题 2020-08-03 16:06:20 +08:00
bb11d984f9 处理消息中心闪退问题 2020-08-03 14:56:34 +08:00
d3f3d2ca98 下载详细过程埋点更新 https://gitlab.ghzs.com/stats/stats-issues/-/issues/188 2020-07-31 18:19:52 +08:00
0c1e712c79 编辑封面禁止左右滑动(与图片缩放会有冲突)
修复xapk提示存储不足后没有把当前解压线程移除问题
2020-07-31 15:21:33 +08:00
e193a40651 修改预约弹窗号码提示动画的持续时间 2020-07-31 14:47:42 +08:00
03f36476cb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-31 11:45:13 +08:00
a721637be3 预约弹窗增加号码提示弹出动画 2020-07-31 11:44:58 +08:00
722fb1ad64 调整视频数据UI间隔 2020-07-31 10:32:01 +08:00
52a05c3aa4 这是环境api版本改为v4d1d0 2020-07-31 10:31:30 +08:00
bcbdac6afc Merge remote-tracking branch 'origin/dev' into dev 2020-07-30 22:29:09 +08:00
a9507af3f4 修复镜像游戏的角标问题 2020-07-30 22:29:01 +08:00
68601ca8be 修改预约弹窗点击弹窗以外区域弹窗没有消失问题 2020-07-30 22:17:00 +08:00
a7adc27896 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-30 21:23:44 +08:00
d19d0eb571 修改预约弹窗的弹出位置 2020-07-30 21:23:30 +08:00
d8e365fe08 修改游戏评论显示异常 2020-07-30 21:12:17 +08:00
b34f61ce0d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-30 18:10:05 +08:00
1f24d16f95 h5游戏增加关闭按钮开关控制 2020-07-30 18:10:00 +08:00
738074ec00 光环助手V4.1.0-游戏评论功能强化20200730测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/925 2020-07-30 18:09:07 +08:00
c8eee33475 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-30 17:13:25 +08:00
badf9f9c20 修改编辑封面UI
防止手机登录连续点击获取验证码重复发送问题
2020-07-30 17:13:19 +08:00
0398cc4ffc 修改视频数据总览 2020-07-30 15:59:55 +08:00
b88abf6b9a link为空拦截跳转 2020-07-30 15:37:35 +08:00
a0d193bc52 web跳转视频流添加gameId参数 2020-07-30 15:24:33 +08:00
6ac635f8c6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-30 14:38:11 +08:00
30c7d71114 外部跳转增加qq群 2020-07-30 14:38:05 +08:00
0223b3ab22 修复查看图片的bug(0730测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-30 11:57:48 +08:00
c9663662d5 补充遗漏的游戏图标显示优化页面 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/939 2020-07-30 11:41:17 +08:00
12bed97638 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-30 11:11:25 +08:00
a857af970d 修复游戏评分一直显示加载中问题 2020-07-30 11:11:20 +08:00
7da621583f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-30 11:08:38 +08:00
46a32b62c2 光环前端优化汇总(2020年7月第3周)20200729测试问题补充5 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-30 11:08:33 +08:00
45bcc95e7d 游戏详情玩家评论数据同步 2020-07-30 11:07:44 +08:00
7d7bcfaa1d 补充遗漏的游戏图标显示优化页面 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/939 2020-07-30 10:45:23 +08:00
3a9a561c77 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2020-07-30 10:08:03 +08:00
e8d344256a 光环助手V4.1.0-视频上传支持剪辑封面(20200729测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/941 2020-07-30 10:07:34 +08:00
1a7c1119bf 微调UI 2020-07-29 17:44:24 +08:00
0b6a2503aa Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-29 17:32:01 +08:00
459b9f65a9 修改封面尝试修复截帧失败问题 2020-07-29 17:31:49 +08:00
6c1ebe531e 更改游戏图标圆角逻辑 2020-07-29 16:47:53 +08:00
604450292b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-29 15:53:31 +08:00
e42361e84a 1.H5游戏跳转到指趣 2.修改web跳转到视频流闪退 2020-07-29 15:53:24 +08:00
a974652f7f 处理自动打包编译时间不对的问题 2020-07-29 14:40:51 +08:00
309ab54e90 微调UI 2020-07-29 14:40:07 +08:00
486d680c26 补充游戏图标显示优化的页面 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/939 2020-07-29 14:30:22 +08:00
61a5f3a275 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-29 14:22:08 +08:00
c865417a4b 光环助手V4.1.0-游戏评论功能强化20200729测试问题:4,6,7 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/925 2020-07-29 14:22:03 +08:00
b142feaaae 微调下载管理-游戏下载UI 2020-07-29 14:19:15 +08:00
7380854133 微调UI 2020-07-29 11:29:23 +08:00
8a0f185eda 修改视频上传UI 2020-07-29 10:59:17 +08:00
bd9604a53e 微调UI 2020-07-29 10:13:44 +08:00
1aeab51f94 修复上传视频后视频投稿页面无法及时刷新问题 2020-07-29 09:56:54 +08:00
b16a6fedc6 修改列表分页结束数量限制 2020-07-28 17:54:26 +08:00
b97c381ed4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-28 17:43:04 +08:00
acb8c723a3 微调UI 2020-07-28 17:42:51 +08:00
4492307e23 处理刷新列表MarkerView会显示问题 2020-07-28 17:42:29 +08:00
e31224b332 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-28 17:13:22 +08:00
6933d6c590 修复预约弹窗键盘弹出延迟问题 2020-07-28 17:13:09 +08:00
3d58841ce5 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-28 16:59:45 +08:00
0654b0a25f 更改评论弹窗动画实现方式 2020-07-28 16:59:41 +08:00
44dde3f91b Merge branch 'video_poster' 2020-07-28 16:27:56 +08:00
abad30595f 光环助手V4.1.0-视频上传支持剪辑封面 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/941 2020-07-28 15:14:51 +08:00
c4df411560 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-28 11:36:14 +08:00
2974fa4562 修改视频数据图表自定义MarkerView 2020-07-28 11:36:10 +08:00
b086b1cb0c 完成接入腾讯企点会话接待组件(0727测试4) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/928 2020-07-28 11:24:12 +08:00
22cf026335 删除无用注释 2020-07-28 11:03:48 +08:00
90bd53fe61 修复选择游戏弹窗的闪退问题 2020-07-28 11:03:16 +08:00
9c580a356e 腾讯企点唤起改成应用内 2020-07-28 10:30:05 +08:00
7198c28e6f 补充遗漏的游戏图标角标位置 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/939 2020-07-28 10:29:33 +08:00
7bf074fddc 光环助手4.1.0-前端新增视频数据统计20200727测试1,4 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/936 2020-07-28 09:59:46 +08:00
bea1a336e9 视频编辑封面支持线上视频链接截取 2020-07-27 21:10:11 +08:00
97a9e03192 光环助手V4.1.0-视频上传支持剪辑封面(初步完成,后续细节尚需调整) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/941 2020-07-27 18:05:42 +08:00
244d57b6bc 更改判断应用前后台状态的实现逻辑 2020-07-27 17:44:57 +08:00
3cbd484147 更改判断应用前后台状态的实现逻辑 2020-07-27 17:43:56 +08:00
8b81819c30 修改大图触发下拉消失的滑动阈值为大于60度 2020-07-27 16:31:53 +08:00
1873ac5d4e 光环前端优化汇总(2020年7月第3周)0727测试12 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-27 16:29:06 +08:00
cf70c1e7fe 光环助手4.1.0-前端新增视频数据统计20200727UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/936 2020-07-27 15:49:05 +08:00
6f6b26ea4d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-27 15:19:09 +08:00
e2708d9078 对接专区视频流接口 2020-07-27 15:19:05 +08:00
fb5a40c6e4 修复游戏图标的占位图显示问题 2020-07-27 12:03:03 +08:00
e2a10c1410 游戏评论显示折叠评论按钮 2020-07-27 12:01:08 +08:00
5461d3d548 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-27 11:45:26 +08:00
c47365e626 光环助手V4.1.0-游戏评论功能强化 20200725测试问题2,20200727UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/925 2020-07-27 11:45:22 +08:00
3476f8df3a 修复一些闪退问题 2020-07-27 11:14:48 +08:00
f812c1e5c8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-27 09:24:51 +08:00
391f196005 修改游戏大事件时间转换错误 2020-07-27 09:24:46 +08:00
097dbca26e 修复客服消息列表页复制ID按钮不显示的问题 2020-07-24 18:34:29 +08:00
a147118381 完成游戏图标显示优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/939 2020-07-24 16:31:58 +08:00
e6bdde8273 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-24 15:27:27 +08:00
747757faa7 处理视频数据图标显示问题 2020-07-24 15:27:21 +08:00
6f21b9d0ae 腾讯企点改由内部 webview 跳转 2020-07-24 14:47:20 +08:00
e505554aac 修改视频数据图表配置 2020-07-24 11:18:18 +08:00
3323cce890 删除本地导入的videocache 2020-07-24 09:41:22 +08:00
ffd468db1e 格式化视频数据 2020-07-23 18:29:52 +08:00
e98e0d1522 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-23 17:12:07 +08:00
13a4f2014c 光环助手4.1.0-前端新增视频数据统计 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/936 2020-07-23 17:12:01 +08:00
8cbfe6450a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-23 11:44:09 +08:00
bcc866888e 删除无用代码 2020-07-23 11:44:02 +08:00
60911d5dcb 移除无用的 glide 依赖 2020-07-23 11:15:35 +08:00
7e77d5749e 处理编译问题 2020-07-23 10:36:06 +08:00
6c3be5627d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-23 10:02:41 +08:00
f6a9585700 彻底移除用数据库存储登录信息的代码 2020-07-23 10:02:30 +08:00
06fddb7dcd 完成游戏管理apk包提供海外下载地址 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/930 2020-07-22 18:21:01 +08:00
3a3f9a625b 删除部分测试代码 2020-07-22 17:49:54 +08:00
3702b104fc 光环助手V4.1.0-安装游戏支持解压xapk文件(20200722测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/896 2020-07-22 17:39:46 +08:00
3e023089a1 Merge remote-tracking branch 'origin/dev' into dev 2020-07-22 16:24:37 +08:00
7455674f6b 完成7月第3周优化(3,11,14) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-22 16:24:26 +08:00
c93c0f2fc6 修改列表分页结束数量限制 2020-07-22 16:23:56 +08:00
727f02e571 光环助手V4.1.0-预约游戏自动填写手机号(20200722测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/926 2020-07-22 15:15:25 +08:00
784fae1f5d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-22 14:54:56 +08:00
42ef075912 光环助手V4.1.0-游戏名称点号处理(20200722补充) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/921
修改dev api host
2020-07-22 14:54:44 +08:00
15307c5223 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-22 14:18:38 +08:00
aad3b48883 光环助手V4.1.0-视频详情功能优化20200722测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/935 2020-07-22 14:18:31 +08:00
d65d8f1c4c 删除多余刷新动画图片 2020-07-22 11:46:02 +08:00
c581496975 Merge branch 'refresh' into dev 2020-07-22 11:41:41 +08:00
d5481a8888 修改问答-推荐的下拉刷新动画 2020-07-22 11:24:08 +08:00
e0a61278fc fix import 2020-07-22 10:25:57 +08:00
2c36283833 Merge branch 'dev_4.1.0' into 'dev'
Dev 4.1.0

See merge request halo/assistant-android!21
2020-07-22 10:17:38 +08:00
1b5a8f3a7e Merge branch 'dev' into 'dev_4.1.0'
# Conflicts:
#   app/src/main/java/com/gh/common/DefaultUrlHandler.kt
#   app/src/main/java/com/gh/common/util/ShareUtils.java
#   dependencies.gradle
2020-07-22 10:17:19 +08:00
95c918b4e3 光环助手V4.1.0-游戏大事件功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/938 2020-07-22 09:47:57 +08:00
f32cc1673c 调整查看大图过渡动画 2020-07-21 18:32:32 +08:00
f0fc2f06da Merge branch 'dev_4.1.0' of gitlab.ghzhushou.com:halo/assistant-android into dev_4.1.0 2020-07-21 18:23:58 +08:00
b6c6abaa5b 调整大图动画 2020-07-21 18:23:33 +08:00
6ed67c911c Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-21 18:14:44 +08:00
1eda223a1e 光环助手V4.1.0-预约游戏自动填写手机号 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/926 2020-07-21 18:14:27 +08:00
316c0c28ab 扩大安利墙列表的部分点击区域 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-21 17:27:18 +08:00
895d4d5cf1 tinker_base 4.0.3 2020-07-21 17:18:49 +08:00
877df95e02 添加安利墙列表的部分点击区域 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-21 17:15:57 +08:00
801f0b95e7 版本改为4.0.3 2020-07-21 17:01:07 +08:00
9019f555b5 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-21 16:52:00 +08:00
106b03a316 下载文件格式兼容xapk 2020-07-21 16:51:44 +08:00
d8faa554be 优化查看图片交互 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-21 16:44:59 +08:00
93080a74a7 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-21 15:54:08 +08:00
3ea2ede0cb 视频上传增加视频宽高字段 2020-07-21 15:53:59 +08:00
1242848b6f Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-21 15:35:50 +08:00
24d44a2c90 光环助手V4.1.0-游戏评论功能强化MTA数据统计 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/925 2020-07-21 15:35:45 +08:00
971779a529 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-21 15:28:59 +08:00
14f561c237 扩大下载管理删除按钮的点击范围 2020-07-21 15:28:38 +08:00
3a38e746f6 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-21 14:38:05 +08:00
dd3bc9d39d 光环助手V4.1.0-游戏评论功能强化1-5,6(1) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/925 2020-07-21 14:38:01 +08:00
39a8062aef 光环后台功能迁移测试汇总0717测试-1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/923 2020-07-21 14:35:52 +08:00
55b6ccb760 merge xapk branch 2020-07-21 14:35:01 +08:00
a8a55eb9bd 修复首页游戏隐藏评论后还能显示评分问题 2020-07-21 14:30:15 +08:00
3eb73439aa 修改页面loading动画 2020-07-21 11:30:29 +08:00
466e118579 尝试替换SwipeRefreshLayout的下拉动画 2020-07-20 17:58:51 +08:00
b38032074b 按帧导入下拉刷新动画,SwipeRefreshLayout以源码的方式引入到主工程 2020-07-20 17:54:56 +08:00
9ee771e528 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-20 17:04:11 +08:00
9253ed47e6 微信浏览器跳转到app 2020-07-20 17:04:03 +08:00
bc82263286 更改获取 bitmap 的实现 2020-07-20 16:41:46 +08:00
11979240ab Merge branch 'dev_4.0.1_bugfix' into dev
# Conflicts:
#	app/src/main/java/com/gh/common/DefaultUrlHandler.kt
#	dependencies.gradle
#	gradle.properties
2020-07-20 15:57:50 +08:00
255e6182a9 更改评论弹窗点击更多按钮交互方式 2020-07-20 15:41:39 +08:00
f170abb7ea 修复分享内容含 gif 图片时会分享失败的问题 2020-07-20 11:00:44 +08:00
eb80deb413 升级应用版本号为 4.1.0, 正式环境接口退回 4.0.2 (正式环境 4.1.0 API 暂未开启) 2020-07-20 10:58:15 +08:00
10ba5a9ba5 修改注释 2020-07-17 17:15:23 +08:00
94c49cba8b 修复裁剪控件图片过大显示异常问题 2020-07-17 17:13:54 +08:00
354dca8b04 非视频作者也可以删除自己的评论 2020-07-17 16:56:51 +08:00
034488ff34 非视频作者也可以删除自己的评论 2020-07-17 16:53:30 +08:00
59c70e23dd 光环前端优化汇总(2020年7月第3周)(5, 8, 12) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-17 16:04:45 +08:00
7d98a842f1 完成接入腾讯企点会话接待组件 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/928 2020-07-17 14:37:15 +08:00
5f8006dc5a Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-17 11:24:10 +08:00
239bd69580 update LGLibrary version 2020-07-17 11:24:07 +08:00
bc96f102a1 光环前端优化汇总(2020年7月第3周)(2,4,6,7)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/940 2020-07-17 11:19:13 +08:00
e2ef3f4d01 尝试解决登录失效后,无法打开登录界面问题 2020-07-17 10:47:07 +08:00
5c20bbf5e4 光环助手V4.1.0-视频详情功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/935 2020-07-16 18:09:54 +08:00
b07edd256a 增加登录异常MTA事件 2020-07-16 17:15:34 +08:00
1478d37889 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0
# Conflicts:
#	app/src/main/res/values/colors.xml
2020-07-16 16:40:24 +08:00
7151b56de3 光环助手V4.1.0-预约游戏自动填写手机号 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/926 2020-07-16 16:37:55 +08:00
220fd9528b 去掉部分页面游戏图标右上角的礼包角标 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/939 2020-07-16 14:43:10 +08:00
1c26c35571 完成首页轮播图数据调整 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/933 2020-07-16 11:03:35 +08:00
78eb6b7b02 Merge branch 'dev_4.1.0' of gitlab.ghzs.com:halo/assistant-android into dev_4.1.0 2020-07-16 09:11:10 +08:00
9dc9add896 折叠评论UI 2020-07-16 09:11:05 +08:00
2d09f8c008 游戏专区外部跳转 2020-07-16 09:07:14 +08:00
166e1e77ec 完成首页弹窗数据统计 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/881 2020-07-15 18:32:07 +08:00
ea782d002b 光环助手V4.1.0-资讯文章配置的超链接跳转逻辑优化2(1,2,3) 3 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/927 2020-07-15 17:27:10 +08:00
f525a3c46d 接口版本改为v4d1d0 2020-07-15 17:23:22 +08:00
bef6cbb212 tinker_base 4.0.2-183 2020-07-15 17:00:17 +08:00
5e0af8654a 完成新首页轮播图数据上报调整 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/933 2020-07-15 16:56:04 +08:00
032a89e0cd versionCode 改为183 2020-07-15 16:48:28 +08:00
c9afb6df02 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-15 16:30:50 +08:00
b8092447ff 游戏列表默认不显示评分 2020-07-15 16:30:43 +08:00
bff20bea49 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-15 16:29:34 +08:00
87f2d9c85f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2020-07-15 15:04:43 +08:00
154dfc8538 DsBridge原生Api支持无参方法 2020-07-15 15:03:56 +08:00
59c4176983 尝试根据视频帧数获取视频截图 2020-07-15 14:40:10 +08:00
fddcdfb3aa 更改今日头条SDK的初始化位置 2020-07-15 09:41:29 +08:00
cdbf7d39a5 光环助手V4.1.0-资讯文章配置的超链接跳转逻辑优化(1) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/927 2020-07-14 17:56:18 +08:00
6a55821d4d 完成一些todo 2020-07-14 10:16:45 +08:00
a305db7b13 tinker_base 4.0.2-182 2020-07-13 17:14:15 +08:00
58b1cd4b12 versionCode 改为182 2020-07-13 16:45:19 +08:00
5e7559e43f 修复一些闪退问题 2020-07-13 16:42:03 +08:00
2a74e35388 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-13 16:41:22 +08:00
5b9bef79da 修复一些闪退问题 2020-07-13 16:01:11 +08:00
e89750c364 光环助手V4.1.0-游戏名称点号处理 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/921 2020-07-13 15:38:06 +08:00
9da6cbf097 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-13 15:23:08 +08:00
f83f719283 光环助手V4.1.0-安装游戏支持解压xapk文件(20200710补充) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/896 2020-07-13 11:16:31 +08:00
4a1c81ffb4 预留方法供网页端确定是否已安装某应用 2020-07-13 09:49:51 +08:00
be26f5168b 增加视频上传urlscheme参数 2020-07-11 21:03:55 +08:00
4e6c75995c tinker_base 4.0.2-bugfix 2020-07-10 17:38:36 +08:00
df693ce0c2 versionCode 改为181 2020-07-10 17:00:55 +08:00
f0236d7ad5 sync submodule 2020-07-10 16:59:18 +08:00
1d3e2b5c16 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-10 16:00:25 +08:00
545d257135 修复一些闪退问题 2020-07-10 16:00:03 +08:00
f5164d2102 修复在模拟器上可能卡启动页的问题 2020-07-10 15:55:58 +08:00
9af83be9a7 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-10 15:40:38 +08:00
49b0b982f5 基本完成Xapk解压安装,还有部分细节可能要调整 2020-07-09 18:31:27 +08:00
ad7543e7bc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-09 14:56:24 +08:00
1bd0db013b 处理Picasso获取Bitmap有时不显示问题 2020-07-09 14:56:18 +08:00
ef6a2c58ff tinker_base-4.0.2 2020-07-09 10:28:15 +08:00
2aa41661a2 首页横向专题备注默认隐藏 2020-07-09 09:49:24 +08:00
e63a374da1 重新整理Xapk解压部分以及增加取消操作 2020-07-09 09:28:57 +08:00
e326f072d2 视频合集用户信息扩大点击区域 2020-07-08 14:29:59 +08:00
f53cc18ab6 修改启动页调用获取设备弹窗接口错误 2020-07-08 10:38:54 +08:00
723a504d7c 开发环境不主动捕获RxJava抛出的异常 2020-07-08 10:23:21 +08:00
dab48607e8 修改文案 2020-07-08 09:59:23 +08:00
3ee69146bb 光环助手V4.0.2-视频上传与编辑功能优化(20200707测试补充 1) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/887 2020-07-08 09:57:33 +08:00
ca86a66b14 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-07 18:26:51 +08:00
c92bdd3014 修复首页竖向专题下载进度无法刷新问题 2020-07-07 18:26:35 +08:00
0be23f26f2 修复自定义栏目正文高亮文字点击提示复制成功的问题 2020-07-07 18:12:23 +08:00
6ce4592e5e 修改分享事件上报 2020-07-07 17:49:20 +08:00
92caedb011 光环助手V4.0.2-视频上传与编辑功能优化(20200707测试补充 3,5)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/887 2020-07-07 16:48:45 +08:00
f796411fa8 光环助手V4.0.2-视频上传与编辑功能优化(20200707测试补充 1,2,4)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/887 2020-07-07 16:06:38 +08:00
d45f185f77 处理分享数据未上传问题 2020-07-07 15:03:54 +08:00
6564de8a72 整理安装/卸载相关代码,尽量做到统一处理 2020-07-07 14:57:06 +08:00
10028dfebc 视频浏览记录、视频收藏列表扩大用户信息点击区域 2020-07-07 14:41:00 +08:00
fa06795cef Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-06 16:55:45 +08:00
c1eb324d79 分享功能数据埋点 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/919 2020-07-06 16:55:39 +08:00
cdf9528583 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-06 15:10:26 +08:00
5f5a621bd1 光环助手V4.0.2-视频上传与编辑功能优化(20200703测试补充1,2,3,5,6) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/887 2020-07-06 15:10:10 +08:00
b8d54dfa59 更新依赖库 hash 2020-07-06 11:55:37 +08:00
b4f39d09e4 Merge branch 'intergrate-antibot-sdk' into 'dev'
集成反爬虫SDK

See merge request halo/assistant-android!18
2020-07-06 11:47:52 +08:00
d57ac57f43 尝试将Xapk安装部分接入到原有的下载体系 2020-07-03 17:09:50 +08:00
a3aea6259c 光环助手V4.0.2 RELEASE(20200629-2330)测试汇总20200703测试问题(1) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/914 2020-07-03 15:31:32 +08:00
73e4c90956 恢复 chucker 2020-07-03 12:02:46 +08:00
c1432159f3 修复前台启动也会显示光环助手正在运行中的问题 2020-07-03 11:59:44 +08:00
45f47d98ba 补充部分遗漏的接口 2020-07-03 10:13:00 +08:00
2e9638b8c5 光环助手V4.0.2 RELEASE(20200629-2330)测试汇总(8,9) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/914 2020-07-03 09:42:25 +08:00
7ea30c1d0e 修改 keep 规则 2020-07-02 18:09:26 +08:00
034e04944a 调整API_HOST 2020-07-02 17:51:48 +08:00
99326596d5 接入阿里反爬虫 SDK https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/915 2020-07-02 17:39:51 +08:00
1cc2b85816 光环助手V4.0.2-开服日历表优化(20200702需求补充) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/893 2020-07-02 17:12:37 +08:00
942291d7c5 确定xapk的命名和存放路径问题 2020-07-02 16:59:57 +08:00
f4cd9419a4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-02 15:56:35 +08:00
a24b9d92c7 WebFragment页面支持js打开分享弹窗 2020-07-02 15:56:29 +08:00
8e7e83ad72 处理link跳转使用jumpActivity方式 2020-07-02 15:37:14 +08:00
cd810f0048 光环助手V4.0.2-游戏专题功能强化(前端)20200701优化补充(2,3,4) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885 2020-07-02 14:52:25 +08:00
fa050039cd 暂时停用chucker 2020-07-02 11:09:07 +08:00
935fb1149f DsBridge 转为本地依赖,暂时停用chucker(jitpack连不上) 2020-07-02 11:03:34 +08:00
951817455a 修复游戏列表评分数值字体大小不一问题 2020-07-01 18:22:53 +08:00
de597bdd36 初步完成Xapk解压部分 2020-07-01 16:06:03 +08:00
e71e7f6163 处理系统消息link不显示 2020-07-01 10:07:21 +08:00
09be5e157d 修复去掉游戏详情富文本正文换行符时会切掉最后一个字符的问题 2020-06-30 17:33:59 +08:00
1f5e59fc1d 处理系统推送列表link显示 2020-06-30 17:14:10 +08:00
e58861afa4 处理系统推送title为空问题 2020-06-30 16:47:36 +08:00
44e51ecb0a 补充一些代码注释 2020-06-30 15:10:59 +08:00
794c17a1bb 恢复误删的带 chucker 测试环境编译代码 2020-06-30 15:08:49 +08:00
1b287962f0 完成将镜像游戏隐藏的自定义栏目放置于详细信息之后的功能 2020-06-30 15:07:53 +08:00
8bdf98b9d8 修改游戏专题大图link跳转问题 2020-06-30 14:27:55 +08:00
e1aeb61c9b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-30 10:56:28 +08:00
a39a70ac2d 修复游戏列表和游戏详情评分数值不一致的问题 2020-06-30 10:56:22 +08:00
4fdcaaf591 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-30 00:07:04 +08:00
b4502638ff 修改光环助手V4.0.2-链接跳转做成通用模块bug 2020-06-30 00:07:00 +08:00
05502d56b1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-29 22:54:31 +08:00
90e1e8a40f 修复游戏列表和游戏详情评分数值不一致的问题 2020-06-29 22:54:26 +08:00
b10293da50 镜像游戏去掉大家都在玩 2020-06-29 22:50:43 +08:00
83cf0687e6 修复一些闪退问题 2020-06-29 22:32:15 +08:00
f56b03716a 我的光环进入游戏投稿前请求权限 2020-06-29 21:45:41 +08:00
61a41e6039 修复游戏详情游戏简介的显示异常 2020-06-29 21:02:03 +08:00
20ae9fe0ec 补充镜像游戏的镜像下载选项 2020-06-29 20:51:36 +08:00
74fdec9d72 UI优化 2020-06-29 19:31:51 +08:00
3437265cc1 Merge branches 'dev' and 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt
2020-06-29 19:08:36 +08:00
271993a876 光环助手V4.0.2-链接跳转做成通用模块0629测试1(2),2(1),5(3),9(2) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/879 2020-06-29 19:06:28 +08:00
3a8b7bb920 视频上传时把是否勾选"视频上传服务准则"的判断放到最后 2020-06-29 17:52:37 +08:00
fd85f3889d 修复镜像游戏的预约状态问题 2020-06-29 17:05:01 +08:00
556ecea749 修复游戏详情游戏简介的换行问题 2020-06-29 17:04:33 +08:00
8a97844676 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-29 16:58:06 +08:00
f152296e7a 游戏列表评分数值与游戏详情统一 2020-06-29 16:57:59 +08:00
4ccc789c7c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-29 16:09:55 +08:00
747b02eb7a 处理视频流内存泄漏问题 2020-06-29 16:09:50 +08:00
a73c033c03 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-29 15:57:59 +08:00
939db8c820 光环助手V4.0.2-游戏专题功能强化(前端)(20200629UI测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885 2020-06-29 15:57:54 +08:00
8601440d97 修复接口环境标识文字造成的显示问题 2020-06-29 15:12:48 +08:00
7a1fa90175 测试包右上角添加接口环境标识文字 2020-06-29 12:36:41 +08:00
46722ba69d 测试包右上角添加接口环境标识文字 2020-06-29 12:03:37 +08:00
70d9d461bf 更换web编辑器图标 2020-06-29 11:03:52 +08:00
91944df6a4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-29 10:59:40 +08:00
ef86c1158c 尝试修复Tab专题页面Fragment回收后无法重建的问题 2020-06-29 10:59:36 +08:00
0f3b6ed34b 镜像游戏去掉镜像标签中的特殊标签 2020-06-29 10:26:52 +08:00
8b50620ddc SpanBuilder的image方法使用application,避免出现内存泄漏 2020-06-29 10:12:39 +08:00
8b2a9eb6ca 我的收藏ui优化 2020-06-29 09:54:27 +08:00
7297f5480e 修改意见反馈文案 2020-06-28 19:58:41 +08:00
3bee8cc034 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-28 18:56:12 +08:00
584a16e111 上传视频流浏览记录 2020-06-28 18:55:25 +08:00
6460c7f8d6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-28 18:24:15 +08:00
feb99c9f78 光环助手V4.0.2-开服日历表优化(20200628UI测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/893 2020-06-28 18:24:09 +08:00
68ac809bcb 恢复误删的华为离线推送配置 2020-06-28 17:58:35 +08:00
de207f66d9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-28 17:53:09 +08:00
054fcd2049 修正横向专题第一行文案标红规则 2020-06-28 17:52:45 +08:00
497fc998fe 修复通知栏推送的跳转问题 2020-06-28 17:16:56 +08:00
03f76453ab 更正错误的游戏镜像判断规则 2020-06-28 15:57:55 +08:00
0a87bd354a 修复首次启动时根据 gid 获取已下载的游戏列表失败的问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/880 2020-06-28 15:13:36 +08:00
1baceaef15 光环助手V4.0.2-多版本下载面板:合集插件化提示 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/907 2020-06-28 10:50:28 +08:00
9719a7fa28 微调视频上传页面UI 2020-06-28 09:39:41 +08:00
1718a66126 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-24 18:21:38 +08:00
b317ef3a39 fix bug 2020-06-24 18:21:29 +08:00
8b0cd69ae6 DownloadService 的前台通知增加 channelId 避免在部分国产 ROM 上显示不出来 2020-06-24 16:50:33 +08:00
c7126e9836 处理一些内存泄漏问题 2020-06-24 15:33:53 +08:00
f3d01335a4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-24 15:07:01 +08:00
88e029b129 修复多平台下载面板-我的版本出现的未知类型 2020-06-24 15:06:54 +08:00
2bc72328c1 修复一些闪退异常 2020-06-24 14:45:44 +08:00
81179b1f72 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-24 11:54:59 +08:00
9a7d4997c2 修改更新弹窗文案 2020-06-24 11:54:53 +08:00
3b6ac881c2 正式环境api地址更新至4.0.2 2020-06-24 11:33:14 +08:00
6b5fb7d8bc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-24 10:47:42 +08:00
1551b0a358 测试环境App更新为了方便测试写死下载链接(测试环境的包链接是不可用的) 2020-06-24 10:47:35 +08:00
6540af8386 适配居中显示文字的渐隐文字颜色 2020-06-24 10:29:24 +08:00
9badcdc382 插件意见反馈跳转协议新增参数 2020-06-24 10:05:14 +08:00
0ba94fa56f 插件意见反馈跳转协议新增参数 2020-06-24 09:51:46 +08:00
52c1343ade 光环助手V4.0.2-视频上传与编辑功能优化(20200623测试1,4) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/887 2020-06-23 21:14:00 +08:00
7a0e633b79 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-23 20:53:46 +08:00
9b68b05d7d 光环助手V4.0.2-更新推送功能优化(20200619补充)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/882 2020-06-23 20:53:41 +08:00
9e7f6b0854 处理一些内存泄漏问题 2020-06-23 20:34:47 +08:00
cf20ad6fc2 修复曝光类型下载上报类型错误问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/884 2020-06-23 19:42:56 +08:00
cb7bdba338 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-23 18:13:58 +08:00
f1fc06ca84 游戏上传接口更改 2020-06-23 18:13:52 +08:00
18f9fe7fcf 游戏详情自定义栏目渐隐文字支持颜色继承 2020-06-23 17:51:28 +08:00
18816a8a4e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-23 17:15:24 +08:00
8d379501cb 光环助手V4.0.2-游戏上传功能优化20200623测试1,2,4 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/903 2020-06-23 17:15:18 +08:00
8f4c6abfd3 游戏详情自定义栏目富文本正文兼容低版本安卓系统 2020-06-23 16:44:28 +08:00
a24d0a9618 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-23 14:44:24 +08:00
8cdd66cd89 光环前端优化汇总(2020年6月第2周)0622测试:7(2) 9/10(1) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/895 2020-06-23 14:44:17 +08:00
3fd34576e8 更改游戏详情的自定义栏目富文本正文的展开实现 2020-06-23 11:58:27 +08:00
78d5cbcc42 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-23 10:43:40 +08:00
803f2bef75 修改新增开服的默认时间选择规则->开服表的选择时间(yyyy-MM-dd)+当前时间(HH:mm) 2020-06-23 10:43:33 +08:00
40c7e8f9e6 处理一些内存泄漏问题 2020-06-23 10:31:35 +08:00
b3c5ca6112 光环助手V4.0.2-意见反馈增加 版权申诉20200622测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/904 2020-06-22 18:22:20 +08:00
31067ea66d 光环助手V4.0.2-意见反馈增加 版权申诉 20200622UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/904 2020-06-22 18:05:31 +08:00
4e7626ff41 游戏上传UI优化 2020-06-22 17:50:58 +08:00
e62822505e urlscheme增加游戏上传 2020-06-22 17:02:28 +08:00
cbc705d1eb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-22 16:05:40 +08:00
aa2e147a51 光环助手V4.0.2-游戏上传功能优化(20200622测试 1-5,7-9,15) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/903 2020-06-22 16:05:34 +08:00
6249726839 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-22 16:05:04 +08:00
8f4bc5a164 修复游戏专题在部分情况游戏摘要无法控制的问题 2020-06-22 16:04:53 +08:00
eee459d08a 修复自定义栏目富文本正文的收起异常 2020-06-22 15:55:09 +08:00
81b4e40dbf Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-22 11:51:26 +08:00
261068e286 处理视频数据统计异常问题 2020-06-22 11:51:21 +08:00
84364a7c66 修复模拟器上游戏详情自定义栏目圆形头像导致闪退的问题 2020-06-22 10:52:58 +08:00
3beb47a8be 避免周期性任务在其它进程触发 2020-06-22 10:11:28 +08:00
ca76af4474 避免周期性任务在其它进程触发 2020-06-22 09:55:43 +08:00
bc33673533 完成MTA的AppKey替换和不需要事件的移除 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/910 2020-06-22 09:54:28 +08:00
c5d038a173 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-19 17:57:50 +08:00
b1e492df1b 修复APP更新弹窗点击弹窗边缘无法取消弹窗问题 2020-06-19 17:57:42 +08:00
9d9c213af7 修复插件化更新曝光事件没有附上版本号的问题 2020-06-19 17:25:46 +08:00
d3f97ea527 更新 leakCanary 2020-06-19 17:24:58 +08:00
0a5fb4cb1d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-19 17:03:19 +08:00
6905f7191a 修复一些闪退问题 2020-06-19 17:03:11 +08:00
bad7fb4922 游戏详情自定义栏目正文里的用户头像裁成圆形 2020-06-19 16:41:38 +08:00
250fa7eb7b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-19 16:22:03 +08:00
f0cd8567cb 1.增加视频流浏览记录表用于日志上传 2.视频流增加计时器 2020-06-19 16:21:58 +08:00
f6dd35e4b8 回答、文章web编辑器字数监听 2020-06-19 15:02:18 +08:00
2dc299e7f4 游戏投稿包名去掉后缀apk 2020-06-19 11:01:13 +08:00
366e8ded14 完成"下载数据统计需求"的0618测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/884 2020-06-19 09:35:32 +08:00
8175742143 完成"下载数据统计需求"的0618测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/884 2020-06-18 18:20:52 +08:00
fc858f1272 删除无用的多版本图片 2020-06-18 18:20:18 +08:00
84b668714b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-18 17:53:58 +08:00
5ea5346ee8 修改我的光环小红点规则 2020-06-18 17:53:53 +08:00
c2eb0b267c 完成"首页插件化提示区域优化"的红点优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/898 2020-06-18 17:32:17 +08:00
7fb502e87e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-18 17:27:24 +08:00
98726ddc3a 修改我的光环小红点规则 2020-06-18 17:27:20 +08:00
75ff76acf4 评论详情间距优化 2020-06-18 17:13:14 +08:00
ba552812a3 游戏详情自定义栏目正文内容支持用户头像 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/891 2020-06-18 14:53:29 +08:00
83bfeb0abc 修复一些闪退问题 2020-06-18 14:31:26 +08:00
70f1b7a678 游戏开服的新增取最后一条开服数据作为模板 2020-06-18 11:07:33 +08:00
455d53fee0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-18 10:55:16 +08:00
39e4b5bf55 20200616测试问题:1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/893 2020-06-18 10:55:00 +08:00
40a729b6f8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-18 10:40:26 +08:00
9643176e06 光环助手V4.0.2-意见反馈增加 版权申诉 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/904 2020-06-18 10:40:21 +08:00
1a70c33bef Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-18 10:25:45 +08:00
888ebe5f54 光环助手V4.0.2-多版本下载面板:合集插件化提示 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/907 2020-06-18 10:25:39 +08:00
cb02dbae57 游戏分地区配置添加网络状态切换重试 2020-06-18 09:43:51 +08:00
2683d02dcd Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-17 18:32:38 +08:00
ceb924e8f1 微调UI 2020-06-17 18:32:19 +08:00
bd91609a80 补充数据库升级配置 2020-06-17 18:31:39 +08:00
2fd74a4698 Merge remote-tracking branch 'origin/dev' into dev 2020-06-17 18:21:07 +08:00
e9e0d3b43e 基本完成游戏分地区管理供嗯 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/900 2020-06-17 18:20:59 +08:00
17e09ddad3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-17 18:18:00 +08:00
65427c55d6 修改游戏投稿 2020-06-17 18:17:55 +08:00
e1fc23a1bb tinker_base-4.0.1_bugfix 2020-06-17 17:51:22 +08:00
2d551a3f73 VersionCode 改为171 2020-06-17 17:42:37 +08:00
7f99f75c6f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-17 17:39:10 +08:00
548aea8d13 光环助手V4.0.2-首页插件化提示区域优化(除4.4外,其它完成) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/898 2020-06-17 17:39:05 +08:00
a177137744 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-17 16:50:52 +08:00
3c6443d78f 版权申诉UI 2020-06-17 16:50:47 +08:00
ba81ed9cb0 完成游戏镜像功能 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/899 2020-06-17 15:19:48 +08:00
6a1cbd10c6 光环助手V4.0.2-游戏上传功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/903 2020-06-17 11:25:40 +08:00
9b205366f7 1.修改视频流广告gif不播放 2.添加网页跳转支付宝微信支付 2020-06-16 18:29:20 +08:00
7e9ac0c4f1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-16 17:26:10 +08:00
fe889639b3 游戏投稿(未完) 2020-06-16 17:26:05 +08:00
848e43af28 首页相关接口增加channel参数 2020-06-16 14:18:49 +08:00
c7a3893fae 修复虚拟按键遮挡启动图的问题 2020-06-16 11:51:51 +08:00
f7d633188c 光环助手V4.0.2-更新推送功能优化(3)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/882 2020-06-16 10:59:11 +08:00
e1e7d2d3d6 修复版块轮播图的曝光统计缺失问题 2020-06-15 18:18:43 +08:00
2b8a280768 移除无用代码 2020-06-15 18:18:08 +08:00
6efe96eb0d 微调UI 2020-06-15 18:06:33 +08:00
3562fe9273 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-15 16:29:04 +08:00
739ef44a8b 光环助手V4.0.2-开服日历表优化(1)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/893 2020-06-15 16:27:51 +08:00
879b42dbf2 修复游戏详情自定义栏目正文描述的显示问题 2020-06-15 15:02:43 +08:00
fae626bb98 移除下载限速相关的无用代码 2020-06-15 15:01:47 +08:00
cebd639d78 处理视频流全屏播放时点击返回键关闭页面问题 2020-06-15 11:32:35 +08:00
17a99a1cda 微调专题过滤选项UI 2020-06-15 10:50:02 +08:00
2a03683e1e 修改游戏专题平铺样式UI 2020-06-15 10:34:00 +08:00
a579b3fe10 修复游戏详情闪退问题 2020-06-15 09:33:51 +08:00
9c75dd18df Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-12 18:30:12 +08:00
cdc9c86852 光环助手V4.0.2-游戏专题功能强化(前端)(7) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885
修改专题详情游戏列表UI
修改多行类型专题控制选项UI(包换标签详情和分类详情)
2020-06-12 18:30:04 +08:00
fab1851436 完成自定义栏目优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/891 2020-06-12 11:54:04 +08:00
a6704e46a9 微调游戏列表UI 2020-06-12 11:49:19 +08:00
e188f70eb6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-12 10:54:24 +08:00
02dd115886 移除游戏列表礼包图标相关代码
修复开服表闪退问题
2020-06-12 10:54:19 +08:00
5cbfc7b461 游戏评论、撰写问答、撰写文章toast居中显示 2020-06-12 10:43:48 +08:00
b4742b5645 更换富文本编辑器图标 2020-06-12 09:36:22 +08:00
5ec25475ea Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-11 18:34:20 +08:00
c58040ef83 光环助手V4.0.2-游戏专题功能强化(前端)(1,2,3,4,5,6) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885 2020-06-11 18:34:10 +08:00
75701b6875 游戏详情自定义栏目支持富文本 2020-06-11 18:29:44 +08:00
2155a33689 处理个人主页文章关闭评论显示问题 2020-06-11 15:21:05 +08:00
68a9d5d771 微调UI 2020-06-11 11:51:35 +08:00
ebf6107faf Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-10 18:19:43 +08:00
e4bc36a743 光环前端优化汇总(2020年6月第2周)2-6,8,13 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/895 2020-06-10 18:19:37 +08:00
7a64251811 Merge branch 'update_push_sdk' into 'dev'
Update push sdk

See merge request halo/assistant-android!17
2020-06-10 18:13:12 +08:00
65409d75a7 统一测试环境和正式环境的推送配置 2020-06-10 18:08:49 +08:00
d40081d58b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-10 16:34:46 +08:00
f276e981ed 光环助手V4.0.2-游戏专题功能强化(前端)(11)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885 2020-06-10 16:34:42 +08:00
e50db66b47 光环助手V4.0.2-游戏评论功能优化4,5 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/892 2020-06-10 15:06:16 +08:00
fc84022852 微调UI 2020-06-10 11:43:21 +08:00
b593f2f3ea 微调UI 2020-06-09 18:21:29 +08:00
e782d0542c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-09 17:59:28 +08:00
1a085cad98 光环助手V4.0.2-开服日历表优化2(3) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/893
修复开服备注字数过多产生的UI显示异常问题
2020-06-09 17:59:22 +08:00
1c33a0c4c5 去掉评论数为0时,点击评论内容卡片自动弹出键盘的功能 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/892 2020-06-09 17:36:36 +08:00
3c4a7961c2 处理EllipsizeTextView省略号不显示问题 2020-06-09 16:37:48 +08:00
712f9b84cf 简单升级推送SDK,离线推送还有很多问题 2020-06-09 16:08:19 +08:00
2efb7b76cc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-09 15:45:25 +08:00
5c4d93ce15 光环助手V4.0.2-视频上传与编辑功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/887 2020-06-09 15:45:16 +08:00
7addd92058 处理滑动视频流播放问题 2020-06-09 14:40:12 +08:00
82c5898b9a 光环助手V4.0.2-链接跳转做成通用模块 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/879 2020-06-09 11:40:12 +08:00
cced6b7035 光环助手V4.0.2-开服日历表优化(2(1),2(2))https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/893 2020-06-08 16:47:38 +08:00
ae0b5b3738 Merge branch 'dev_4.0.2' into 'dev'
Merge 4.0.2 feature changes

See merge request halo/assistant-android!16
2020-06-08 15:37:08 +08:00
6fdf9cbe5d Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-08 15:36:00 +08:00
009244c65d 游戏评论字数限制 2020-06-08 15:35:54 +08:00
73a720bb9c Merge branch 'dev_4.0.2' of gitlab.ghzhushou.com:halo/assistant-android into dev_4.0.2 2020-06-08 15:31:19 +08:00
fd9df9904f 完成首页游戏替换功能(第三期) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/880 2020-06-08 15:30:52 +08:00
e75fb3a40d 视频合集、浏览记录、我的收藏视频点击用户头像昵称跳转个人主页 2020-06-08 11:36:33 +08:00
0bef1a2aa8 视频合集、个人主页、浏览记录、我的收藏视频UI优化 2020-06-08 11:01:03 +08:00
395eb641e5 移除首页无用的下载监听 2020-06-05 16:21:32 +08:00
9019242ffb Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-05 15:10:49 +08:00
9433bb72ca 光环助手V4.0.2-游戏专题功能强化(后台)(8) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/886 2020-06-05 15:10:13 +08:00
500f751152 完成光环助手V4.0.2-下载数据统计需求 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/884 2020-06-05 15:03:01 +08:00
9ebe3f4a0e 处理关闭视频流页面上传播放数据progress为0的问题 2020-06-05 10:32:51 +08:00
4727f22b0f tinker_base-4.0.1 2020-06-05 10:05:57 +08:00
8c92fc9a42 Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-04 17:40:11 +08:00
2a7cb34218 新增urlscheme跳转链接 2020-06-04 17:40:07 +08:00
e1a42b49c1 光环助手V4.0.2-更新推送功能优化(2) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/882 2020-06-04 17:24:07 +08:00
5a825debf5 Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-04 15:49:33 +08:00
e46b0a42b0 修复专题下载进度串行问题(10)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885 2020-06-04 15:49:25 +08:00
eb0c442a5e Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-04 10:58:29 +08:00
eb6460236b 视频UI封面图比例改为16:9 2020-06-04 10:58:24 +08:00
ef051daffd 历史记录数据库表新增字段 2020-06-04 10:55:50 +08:00
b6acb302d2 Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-04 10:54:36 +08:00
5cfc5a3971 光环助手V4.0.2-游戏专题功能强化(前端)(8,9)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/885 2020-06-04 10:54:28 +08:00
04de97af16 升级版本至4.0.2 2020-06-04 10:32:03 +08:00
6367f90589 Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-03 17:33:32 +08:00
bc8f9d07bb 页面回收重建,根据tag找回fragment避免每次都重新创建 2020-06-03 17:33:27 +08:00
a3d693ddc1 更改自定义栏目浮窗消失逻辑 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-06-03 17:25:03 +08:00
e205abd120 Merge branch 'dev_4.0.2' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.2 2020-06-03 17:22:56 +08:00
5da8fccef7 尝试修复首页-问答模块不能左右滑动的问题 2020-06-03 17:22:38 +08:00
c7e78142ee okhttp版本更新至3.12.12 2020-06-03 16:42:21 +08:00
79cbb44d51 更改自定义栏目浮窗消失逻辑 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-06-03 16:36:38 +08:00
dcde3db33a 修复 ExpandTextView 使用渐隐展开样式时在部分设备上会换行显示的问题 2020-06-03 16:03:46 +08:00
44fbc7a182 游戏详情评论回复用户姓名加粗 2020-06-03 15:13:24 +08:00
354c7d1f85 光环助手V4.0.2-游戏关注功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/851 2020-06-03 14:49:33 +08:00
d7a85edb76 完成游戏详情自定义栏目显示三秒自动隐藏的提示展开浮窗 2020-06-03 11:50:26 +08:00
ceb9dc6707 完成游戏详情自定义栏目显示三秒自动隐藏的提示展开浮窗 2020-06-03 11:39:02 +08:00
b0f20ee017 去掉梦工厂SDK 2020-06-03 10:13:47 +08:00
cdf78f2bc5 游戏详情UI优化 2020-06-02 18:40:28 +08:00
d3f0a8fe4a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-02 15:39:41 +08:00
17acf1bd86 优化游戏详情UI 2020-06-02 15:39:36 +08:00
31a0bb24c7 修复 ExpandTextView 尾部空隙太大的问题 2020-06-02 15:29:50 +08:00
13ff1f4343 微调游戏详情UI 2020-06-02 10:50:14 +08:00
ec76be9d5e 处理点击web页面闪退 2020-06-02 09:22:59 +08:00
84d53616a0 完成游戏详情UI优化 2020-06-01 18:38:44 +08:00
2758216ae2 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-01 18:12:38 +08:00
c492f066ca 游戏详情UI优化(未完) 2020-06-01 18:12:33 +08:00
897478e30e 完成游戏详情UI优化(0601自定义栏目部分) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-06-01 18:01:16 +08:00
a94d825ead 修复历史版本在下载数据(旧)的终点问题 2020-06-01 11:45:42 +08:00
ba05e6137e 去掉 ExpandTextView 同时应用 lineSpacingExtra, maxLines, movementMethod 时底部出现的额外内边距 2020-06-01 11:39:27 +08:00
dc55342343 修复详情页页面回收重建时重复创建 tab 的问题 2020-06-01 11:37:21 +08:00
3ea96d27db 修复评论详情徽章显示问题 2020-06-01 11:06:44 +08:00
48842c099b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-01 10:27:39 +08:00
4f87cac46a 优化h5小游戏全屏展示 2020-06-01 10:27:35 +08:00
52680b63b9 正式环境Api 切换至v4d0d1 2020-06-01 09:54:48 +08:00
f89defc78f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-06-01 09:38:15 +08:00
46e9a161a4 光环前端优化汇总(2020年5月第2周)(0529测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/858 2020-06-01 09:38:07 +08:00
8e602e8169 h5小游戏全屏展示 2020-06-01 09:36:07 +08:00
c60df98577 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-29 16:05:08 +08:00
ad7db50336 删除文章/回答/视频评论页面临时草稿功能 2020-05-29 16:05:03 +08:00
e40ef5292e 调整游戏详情自定义栏目间距 2020-05-29 15:38:19 +08:00
94b844788c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-29 15:29:42 +08:00
9c222baf91 修改h5游戏顶部按钮不能点击 2020-05-29 15:29:37 +08:00
0794606e57 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-29 14:30:43 +08:00
be34c486bf 开服日历表版主对开测信息改为不可编辑 2020-05-29 14:30:35 +08:00
fa7a5fef9b 修改UI间距 2020-05-29 14:10:47 +08:00
9e518d5414 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-29 10:52:13 +08:00
2d17ecd438 社区优化汇总(2020年5月)(0528测试6)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-29 10:52:07 +08:00
56d6c28811 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-29 10:33:33 +08:00
86b77e29e2 修改资讯文章-评论详情-查看对话评论框UI 2020-05-29 10:33:28 +08:00
23b8b09834 恢复 startForegroundService 的后台限制 2020-05-29 10:17:53 +08:00
30eb397c66 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 19:55:34 +08:00
05bcc0f818 社区优化汇总(2020年5月)(1,2,3,5,7)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-28 19:55:29 +08:00
3f9434239f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 18:24:02 +08:00
4caf7eabc0 光环助手V4.0.1-H5游戏功能优化(接入梦工厂H5小游戏)20200528补充1,2 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/856 2020-05-28 18:23:58 +08:00
0aee08bbb0 调整游戏详情自定义栏目UI https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-05-28 18:07:37 +08:00
602dbff3c8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 18:06:37 +08:00
d52cfd475f 修改玩家评论UI 2020-05-28 18:06:33 +08:00
4512accb37 调整游戏详情自定义栏目UI https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-05-28 18:03:39 +08:00
2d57c00149 调整游戏详情自定义栏目UI https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-05-28 17:59:55 +08:00
cae908da6a 修复历史版本下载的下载数据显示问题 2020-05-28 17:31:20 +08:00
38f97673b8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2020-05-28 16:52:24 +08:00
ed2bf89413 多平台下载弹窗增加存储大小判断 2020-05-28 16:51:53 +08:00
259d343e31 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 16:42:58 +08:00
8e9dbafb4d 游戏大事件弹窗自适应宽度 2020-05-28 16:42:53 +08:00
7e737d7a46 游戏列表去除默认标签(没有数据时,直接不显示) 2020-05-28 16:06:28 +08:00
50fd30d173 去除消息中心第一页的加载动画 2020-05-28 15:27:40 +08:00
4c7310f71e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 11:21:01 +08:00
b3e7168922 修改开服日历表UI 2020-05-28 11:20:55 +08:00
261cc5b0eb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 11:16:54 +08:00
60218eea97 修改查看对话输入框UI 2020-05-28 11:16:48 +08:00
bc1945326a 修改查看对话输入框UI 2020-05-28 11:16:12 +08:00
2fd12d56ed 修改回答/文章草稿发布后的跳转逻辑 2020-05-28 11:07:29 +08:00
cb28838b40 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-28 10:32:03 +08:00
4cfd6952c0 社区优化汇总(2020年5月)(0527测试7,8) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-28 10:31:58 +08:00
f5761e378e 避免 broadcast receiver 被多次调用 2020-05-28 10:31:37 +08:00
314144c384 调整文案 2020-05-28 10:30:35 +08:00
81debc1cd8 修改收起评论框数据丢失 2020-05-28 09:40:56 +08:00
9a2baf1d8c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-27 20:34:24 +08:00
55ec26bd3d 社区优化汇总(2020年5月)(0527测试1,2,3,4,6) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-27 20:34:19 +08:00
4c372eeb2b 光环助手V4.0.1-内容间距优化20200527测试 1,2 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/855 2020-05-27 16:52:09 +08:00
c2f9e28edd Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-27 15:45:39 +08:00
65a8297fe0 保存顶部视频进度重启恢复 2020-05-27 15:45:35 +08:00
1a48cca197 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-27 15:39:37 +08:00
24984b5d67 光环前端优化汇总(2020年5月第2周)(20200526测试1,2)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/858 2020-05-27 15:39:33 +08:00
619660e5e5 新多版本弹窗补充曝光路径 2020-05-27 10:57:49 +08:00
c9c4a996dc 粗暴修复因为多线程下载同一任务造成的解析包错误问题 2020-05-27 10:32:03 +08:00
b8ae8b68dc 修改我的评论点击两次才能进入评论详情问题 2020-05-27 10:03:21 +08:00
a9f4620d8b 处理专区事件拦截 2020-05-26 17:21:43 +08:00
66abdb1eed Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-26 17:08:31 +08:00
1dc4be2d54 增加NestedScrollWebView2,处理CoordinatorLayout嵌套webview滑动卡顿 2020-05-26 17:08:25 +08:00
a286f51801 完成下载管理优化与下载异常修复的(1,2) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/873 2020-05-26 16:33:13 +08:00
27708da1bf Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-26 16:13:45 +08:00
3aa0e19b0f 社区优化汇总(2020年5月)(3)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-26 16:13:38 +08:00
4d5627348a 光环助手V4.0.1-评论内容网络错误排查与交互优化20200525测试1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/869 2020-05-26 15:55:48 +08:00
2aefeb5e53 1.开始玩设置全屏 2.梦工厂集成防沉迷库 2020-05-26 15:26:56 +08:00
728b663c7a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-26 14:27:09 +08:00
36156cddc4 光环助手V4.0.1-评论复制功能优化20200525 1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/861 2020-05-26 14:27:04 +08:00
2b98702ceb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-26 14:15:42 +08:00
2c2ab02398 光环助手V4.0.1-下拉刷新loading优化(20200525测试) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/850 2020-05-26 14:15:36 +08:00
8ae8c6d6fb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-26 11:53:58 +08:00
1171424f19 修改资讯文章评论详情评论框UI 2020-05-26 11:53:53 +08:00
3444922861 光环助手V4.0.1-视频相关优化汇总(6,7)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/866 2020-05-26 11:13:20 +08:00
5821a519ee Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-25 18:15:40 +08:00
439a2353b0 重复增加登录异常MTA事件 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/863 (3) 2020-05-25 18:15:28 +08:00
8f8f3193dd Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-25 18:12:07 +08:00
5907b8b1a5 修改评论框UI(除资讯评论) 2020-05-25 18:12:01 +08:00
ba5783417e 光环助手V4.0.0补充需求:游戏列表优化(5) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/862 2020-05-25 18:02:04 +08:00
56573deea1 修复回答/文章草稿无法删除问题 2020-05-25 17:31:11 +08:00
892933888c dev api 升为 v4d0d1
删除comment host
2020-05-25 17:14:48 +08:00
b3725baad0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-25 17:05:47 +08:00
cf79735780 回答/文章编辑增加草稿功能 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 (5,6) 2020-05-25 17:05:36 +08:00
ad059fe18d 修复因改版造成的下载数据(新)下载事件缺失的问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/877 2020-05-25 17:03:57 +08:00
03fa2052da Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-25 10:28:38 +08:00
d7d55b7341 回答/文章评论增加评论草稿功能 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 (7) 2020-05-25 10:28:30 +08:00
6ea9a7de90 处理视频流切换全屏马上又退出全屏问题 2020-05-25 09:39:51 +08:00
3bc65f42c7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-22 17:12:04 +08:00
854227304f 微调UI 2020-05-22 17:11:58 +08:00
62d34c6c06 调整游戏详情横向滑动列表边距 2020-05-22 16:34:25 +08:00
69f0beff9c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-22 16:22:16 +08:00
2a32859c48 修改文章/回答草稿UI 2020-05-22 16:22:09 +08:00
c6bdb4ee8d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-22 15:54:27 +08:00
cf5e981758 修改状态栏颜色,去掉immersionbar 2020-05-22 15:54:23 +08:00
2bf246562b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-22 11:57:21 +08:00
c1cd25b89b 光环前端优化汇总(2020年5月第2周)(11,12)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/858 2020-05-22 11:57:11 +08:00
2eb259055a 移除BlockCanary库 2020-05-22 10:48:41 +08:00
fe743590c9 修改注释 2020-05-21 18:19:53 +08:00
d3de1c238c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-21 18:17:01 +08:00
931593d726 光环助手V4.0.1-多版本下载-包名过滤异常修复 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/876 2020-05-21 18:16:53 +08:00
8f002fc804 完成新首页轮播图曝光数据 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/877 2020-05-21 18:02:23 +08:00
10e0d0123e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-21 16:58:42 +08:00
b93cb06662 修改历史版本下载按钮mta事件 2020-05-21 16:58:36 +08:00
5471099e7b 修改网络状态变动后下载重试的时机(防止退出app后无法触发重试机制) 2020-05-21 16:27:27 +08:00
5a2f86be87 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-21 16:14:06 +08:00
3d7ce17b07 下载增加下载服务外的重试机制 2020-05-21 16:13:46 +08:00
cf0e237529 修复历史版本的下载路径上报异常问题 2020-05-21 14:48:10 +08:00
60c84153e5 修改游戏设备弹窗类型转换错误 2020-05-21 14:26:28 +08:00
f9a8efe084 修改h5游戏状态栏颜色 2020-05-21 11:52:25 +08:00
6b48c546c4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-21 10:31:57 +08:00
b1893718f6 光环助手V4.0.1-顶部状态栏统一改为全透明样式 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/871 2020-05-21 10:31:52 +08:00
7ad95d5f26 社区优化汇总(2020年5月)(4)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-21 10:22:25 +08:00
778b0e8f16 版本号升级到 4.0.1 2020-05-20 17:58:09 +08:00
ad847f6113 Merge branch 'dev_4.0.1' into 'dev'
Dev 4.0.1

See merge request halo/assistant-android!15
2020-05-20 17:51:19 +08:00
27778c2b31 Merge branch 'dev' into 'dev_4.0.1'
# Conflicts:
#   app/src/main/java/com/gh/common/util/TimeUtils.kt
#   app/src/main/java/com/gh/download/DownloadManager.java
2020-05-20 17:50:59 +08:00
484694cbdb 完成4.0.1点赞功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/853 2020-05-20 17:48:31 +08:00
969680a7ad Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-20 17:46:43 +08:00
6357e008dc 社区优化汇总(2020年5月)(1,2)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/872 2020-05-20 17:46:31 +08:00
a570cfe32b 优化视频流页面UI 2020-05-20 17:44:50 +08:00
ccba561d47 光环助手V4.0.1-评论内容网络错误排查与交互优化(2,3) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/869 2020-05-20 16:52:05 +08:00
0dcf86ce1c tinker_base 4.0.0-bugfix 2020-05-20 11:43:01 +08:00
961d4ebb5c 修复空指针问题 2020-05-20 11:12:34 +08:00
54b947504c 1.修改游戏大事件超过15天不显示时间 2.修改礼包进度条显示 2020-05-20 10:19:05 +08:00
f5abd7e075 光环助手V4.0.1-评论内容网络错误排查与交互优化1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/869 2020-05-20 09:20:34 +08:00
35cd97c751 Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-19 17:41:57 +08:00
147bc150f5 光环前端优化汇总(2020年5月第2周)(问答相关)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/858 2020-05-19 17:41:45 +08:00
ee7f102d34 游戏详情自定义栏目图片添加占位图,避免详情列表加载抖动 2020-05-19 17:15:24 +08:00
7f0e59aba5 预加载广告图片、延迟0.1s视频预加载 2020-05-19 17:03:28 +08:00
135b55f6f9 修改礼包详情按钮UI 2020-05-19 15:05:38 +08:00
6986bd9a57 光环助手V4.0.1-视频加载机制优化(1) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/870 2020-05-19 11:42:27 +08:00
17782a500f 更换所有礼包领取按钮样式 2020-05-19 10:42:24 +08:00
64a64960ac 尝试修复初始化闪退 2020-05-19 10:29:27 +08:00
d4be850e68 1.修改标签弹窗重构闪退问题 2.修改获取求更新开关空指针问题 2020-05-19 10:15:55 +08:00
a6feb57f85 Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-19 09:54:34 +08:00
50fee01249 光环助手V4.0.1-视频相关优化汇总(1,3) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/866 2020-05-19 09:54:28 +08:00
4ff12e91aa Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-18 16:17:13 +08:00
24b196f216 光环助手V4.0.1-内容发表后与Toast优化(二)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/857 2020-05-18 16:16:57 +08:00
414064699a 修改DownloadDialog传参方式 2020-05-18 15:18:44 +08:00
d36b2f99ee 升级gsyVideo版本至7.1.4 2020-05-18 11:52:33 +08:00
704b73aef7 完成光环助手V4.0.1-H5游戏功能优化(接入梦工厂H5小游戏)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/856 2020-05-18 11:20:32 +08:00
99878606d5 修复多版本下载弹窗页面重构时的闪退问题 2020-05-18 10:41:19 +08:00
e1cfccfcc0 修复游戏详情页标签后台返回为空时的闪退 2020-05-18 10:40:30 +08:00
4c2a46875d tinker_base-4.0.0 2020-05-15 19:01:45 +08:00
6ce64892e4 处理游戏礼包换行 2020-05-15 18:51:19 +08:00
92e1c55913 优化游戏详情礼包UI 2020-05-15 18:42:34 +08:00
72cfcd66b1 Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-15 18:35:05 +08:00
0cb65ab216 光环助手V4.0.1-下拉刷新loading优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/850 2020-05-15 18:34:30 +08:00
d18731ccfe 完成光环助手V4.0.1-时间显示规则优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/865 2020-05-15 18:11:52 +08:00
b0a4aa66f6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-15 15:58:17 +08:00
aad92e529e 去掉延迟播放视频逻辑 2020-05-15 15:58:13 +08:00
6e03e75110 修复问答-全部页面无法显示问题 2020-05-15 15:51:44 +08:00
91f79a5ff1 光环助手V4.0.1-时间显示规则优化(未完)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/865 2020-05-15 15:15:25 +08:00
cc53a1f3d6 tinker_base-4.0.0 2020-05-15 14:19:10 +08:00
25cd086298 默认的checkRetryDownload(重试下载)放到initDownloadService(初始化下载)里面 2020-05-15 13:32:01 +08:00
b27ecab969 tinker_base-4.0.0 2020-05-15 12:27:51 +08:00
db1c0d954f 修改获取baseActivity不是本应用包名 2020-05-15 12:15:58 +08:00
03d20aed61 tinker_base-4.0.0 2020-05-15 11:01:14 +08:00
d37929548e Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-14 18:36:15 +08:00
663891dd54 光环助手V4.0.1-评论复制功能优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/861 2020-05-14 18:36:11 +08:00
79d1c4fed4 完成4.0.1历史浏览记录优化 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/852 2020-05-14 18:21:02 +08:00
ecc8196701 光环前端优化汇总(2020年5月第2周)(4(关注问题、我的问题),7,9) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/858 2020-05-14 17:15:26 +08:00
c2fb1a58db 修改礼包剩余百分比 2020-05-14 15:54:40 +08:00
55998c3c4d 礼包详情剩余百分比改为四舍五入 2020-05-14 14:59:32 +08:00
83e44808cb Merge branch 'dev_4.0.1' of gitlab.ghzs.com:halo/assistant-android into dev_4.0.1 2020-05-14 14:35:36 +08:00
bfbc9900ed 光环前端优化汇总(2020年5月第2周) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/858 2020-05-14 14:35:19 +08:00
1735ba3312 1.对接梦工厂小游戏 2.导入穿山甲 2020-05-14 14:23:14 +08:00
1ef8fa5deb 把初始化下载服务放到主线程执行 2020-05-14 11:05:16 +08:00
d0a2868e5a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-14 10:31:15 +08:00
49c2366a89 修改游戏标签样式 2020-05-14 10:31:08 +08:00
cb7d985195 修复自定义栏目跳转反馈页面的异常 2020-05-14 10:22:23 +08:00
bead0bded1 修复自定义栏目跳转反馈页面的异常 2020-05-13 17:58:46 +08:00
cc92d5f639 修改游戏详情-相关游戏标签样式 2020-05-13 17:34:43 +08:00
84c281122e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/res/layout/item_game_detail_related_version.xml
2020-05-13 17:28:08 +08:00
bb4a35a6a9 调整游戏详情板块之间的边距 2020-05-13 17:25:26 +08:00
71ae36fbf0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-13 16:27:50 +08:00
04864e059c 光环助手V4.0.0补充需求:游戏列表优化(后台尚未完成,标签颜色暂且写死) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/862 2020-05-13 16:27:41 +08:00
7a47184af3 去掉游戏详情倒数第二个栏目的特殊底边距 2020-05-13 15:22:15 +08:00
48e2831e96 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-13 12:29:05 +08:00
c1caa23b10 恢复webview实现NestedScrollingChild接口 2020-05-13 12:29:00 +08:00
443cc6007d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-13 11:18:40 +08:00
7d99923960 整理多平台下载弹窗代码 2020-05-13 11:18:18 +08:00
7342d0706f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-13 11:12:28 +08:00
c15c194feb 再次修改游戏详情礼包UI 2020-05-13 11:12:23 +08:00
3b6a5b5a20 更换引导图 2020-05-13 11:04:39 +08:00
f9028ea8a5 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-13 10:56:39 +08:00
8cd06a80ba 多版本下载面板优化20200512测试3 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/819 2020-05-13 10:56:34 +08:00
6c80266abb 修复多平台面板无法读取链接图标问题 2020-05-13 10:53:44 +08:00
ca3c1fa8c2 修改游戏详情礼包UI 2020-05-12 22:18:53 +08:00
2b7deaef2c 完成4.0测试问题汇总(0511)的0512UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/859 2020-05-12 21:10:55 +08:00
42f1898bd1 整理游戏详情页列表间距 2020-05-12 20:38:03 +08:00
0bdff3eac7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-12 19:46:43 +08:00
a00f6660a1 修改徽章中心不显示问题 2020-05-12 19:46:38 +08:00
67d1ad497f 完成4.0.0测试问题汇总(0511)的 2, 3, 4, 8 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/859 2020-05-12 18:03:58 +08:00
f1bbf4e9fc 专区网页二级页面点击右上角返回按钮直接关闭页面 2020-05-12 17:35:13 +08:00
00ff5e6a94 视频流底部添加渐变背景 2020-05-12 16:05:00 +08:00
7f77a8fd63 详细信息功能标签增加分割线 2020-05-12 15:17:22 +08:00
7c1267148b 光环助手V4.0.0-测试问题汇总(20200511)(5,6,7,9) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/859 2020-05-12 12:12:33 +08:00
2dbb7b67cb 调整游戏详情板块间距 2020-05-12 11:14:33 +08:00
c41db52b05 网页控制分享新加url参数 2020-05-12 11:13:46 +08:00
72f3a262ca 评论页面评论过少时不展示评分区域 2020-05-11 16:55:48 +08:00
2fbe6a4937 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-11 16:44:32 +08:00
c6fb63afe6 专区网页跳转二级页面使用原生页面打开 2020-05-11 16:44:28 +08:00
2e05320ddf 优化详情页公告/自定义栏目的初始化显示样式 2020-05-11 16:40:57 +08:00
a3f86ab604 避免数组越界 2020-05-11 16:38:48 +08:00
5d2efda925 修复历史版本页面下载游戏时文字抖动的问题 2020-05-11 15:14:07 +08:00
4a30ac04b7 修复可展开文字在触摸全部按钮是高度会变更的问题 2020-05-11 15:13:33 +08:00
1097068393 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-11 14:05:00 +08:00
df88502c3d 光环助手V4.0-前端测试问题汇总(0509)1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/849 2020-05-11 14:04:55 +08:00
b8df485a7e 历史安装包列表没包时隐藏下载按钮 2020-05-11 11:41:50 +08:00
a8a66a7b1e 开服日历开服说明支持换行符 2020-05-11 10:47:29 +08:00
a1548faeda 补充从 APK 中读签名公钥的细节 2020-05-11 10:01:22 +08:00
34f452be6e 调整专区空数据占位图位置 2020-05-10 19:24:46 +08:00
bef04854e3 尝试修复从APK文件中读取公钥耗时过长的问题 2020-05-09 21:29:51 +08:00
757782e43b 尝试修复从APK文件中读取公钥耗时过长的问题 2020-05-09 21:11:13 +08:00
8a69f565a3 修复自定义栏目跳转问题 2020-05-09 21:07:27 +08:00
be20d1fec6 尝试修复从APK文件中读取公钥耗时过长的问题 2020-05-09 20:52:35 +08:00
7a71e457ef 历史版本更新的介绍文字调整为最多三行 2020-05-09 20:49:56 +08:00
3af9fa0a10 修复点击下载闪退问题 2020-05-09 18:45:53 +08:00
ff8b3efde9 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-09 17:56:45 +08:00
161f63a664 多平台弹窗增加游戏图标展位符 2020-05-09 17:56:38 +08:00
3206e04639 微调自定栏目UI 2020-05-09 17:47:28 +08:00
f1dea0f200 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-09 17:39:51 +08:00
d94a83a7c3 修改插件化显示规则 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/838 (三) 2020-05-09 17:39:40 +08:00
6bbc7104d9 修复在 MIUI 上首页顶部会出现空白区域的问题 2020-05-09 17:10:59 +08:00
a2180196ee Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-09 16:51:51 +08:00
a6dc4c7891 暴力处理顶部视频静音问题 2020-05-09 16:51:30 +08:00
fa7355c5c6 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-09 15:28:26 +08:00
0140c10f15 20200508测试(1,2,3,4) https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/819 2020-05-09 15:28:12 +08:00
796da0e673 完成游戏详情自定义栏目的0509测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/829 2020-05-09 14:43:07 +08:00
743f78096a 光环助手V4.0.0-游戏评论Tab20200509测试问题:1https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/834 2020-05-09 14:38:30 +08:00
52d726b6f3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-09 12:02:24 +08:00
bed4450900 光环助手V4.0.0-游戏评论Tab20200509测试问题:2 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/834 2020-05-09 12:01:56 +08:00
c2ab369d0c Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-09 11:48:51 +08:00
32a7f37b6a 20200508补充规则(1,2,3)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/838 2020-05-09 11:48:45 +08:00
b299199579 光环助手V4.0.0-游戏详情Tab202200509测试问题1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/827 2020-05-09 11:13:27 +08:00
7091ea179d 游戏详情历史版本入口判断 2020-05-09 09:59:54 +08:00
dceb582bb1 游戏详情视频点赞数 2020-05-09 09:03:23 +08:00
6e2e9f7dcf Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-08 20:44:23 +08:00
c27025269e 游戏详情视频添加背景 2020-05-08 20:44:01 +08:00
cf1411b412 完成首页弹窗 0508 测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/821 2020-05-08 19:03:02 +08:00
b167f5bb8b 完成光环助手V4.0-前端优化汇总(视频相关)20200508评论 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/842 2020-05-08 18:32:10 +08:00
87d0fd9edb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-08 18:09:06 +08:00
b59a169e10 完成实名认证弹窗20200505补充 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/847 2020-05-08 18:08:47 +08:00
941e3985b0 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-08 16:59:36 +08:00
127fb76c19 尝试修复某些设备出现的下载红点位置异常问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/824 (3) 2020-05-08 16:59:28 +08:00
5f3028f795 完成游戏详情自定义栏目 20200508 测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/829 2020-05-08 16:50:35 +08:00
b596f04dba Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-08 16:19:53 +08:00
0bb96ecf12 尝试修复下载通知跳转问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/824 (2) 2020-05-08 16:19:38 +08:00
60f21f6113 光环助手V4.0.0-游戏大事件功能20200508测试问题1,2 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/828 2020-05-08 15:12:13 +08:00
051000e4a8 光环助手V4.0.0-游戏历史版本功能20200508测试问题2 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/832 2020-05-08 11:47:43 +08:00
14e8020147 游戏详情新增低权重的自定义栏目样式 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/829 2020-05-07 18:54:10 +08:00
a99b1499a2 微调使用帮助UI 2020-05-07 18:30:04 +08:00
6a1c01556b 微调使用帮助UI 2020-05-07 18:21:22 +08:00
c41327640b [使用帮助]功能升级为[Q&A管理](0507测试3/4)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/837 2020-05-07 17:10:44 +08:00
7df5834ebc Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-07 15:25:17 +08:00
ebafc2f98f 多版本下载面板优化(20200507测试1)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/819 2020-05-07 15:24:53 +08:00
92c9d81171 视频预加载大小根据设备内存大小决定 2020-05-07 15:04:59 +08:00
7d34a3972d 修复游戏详情简介不显示的问题 2020-05-07 12:11:04 +08:00
90f1254c6c 完成首页UI调整的0430测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/820 2020-05-07 11:57:16 +08:00
8b71d68749 更换答案/文章详情底部分享按钮 2020-05-07 11:37:23 +08:00
17c0cf52b6 修复游戏历史版本功能的部分测试bug https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/832 2020-05-07 11:06:58 +08:00
045be4ff09 游戏详情自定义栏目内容支持富文本 2020-05-07 10:58:06 +08:00
af7948fcb5 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-07 10:26:50 +08:00
e1c12d5007 优化游戏详情触摸事件 2020-05-07 10:26:29 +08:00
8676b20fbb 增加试玩开关判断 2020-05-07 10:24:00 +08:00
54db9fb910 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-07 10:16:00 +08:00
0eaee1ae63 修复下载弹窗重复弹出问题 2020-05-07 10:15:46 +08:00
e141dfb6b5 修复部分游戏详情自定义栏目的问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/829 2020-05-06 19:02:49 +08:00
b14b8c9f66 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-06 18:26:42 +08:00
b4b589f307 光环助手V4.0.0-游戏详情Tab20200506测试1 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/827 2020-05-06 18:26:21 +08:00
7a74bc0d04 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-06 17:59:47 +08:00
b826c0a9ad 移除旧版多平台弹窗相关代码 2020-05-06 17:59:39 +08:00
a197b59200 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-06 17:16:36 +08:00
c25503d7f8 设备弹窗逻辑修改 2020-05-06 17:16:15 +08:00
2c0449dcf6 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-06 15:43:18 +08:00
59655daa3b MTA事件ID,Q&A改为QA 2020-05-06 15:43:11 +08:00
1c36d7b923 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-06 15:22:45 +08:00
a51175620c 光环助手V4.0.0-游戏详情Tab 20200505测试问题4,5,7 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/827 2020-05-06 15:22:25 +08:00
7b95c265df Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-06 15:12:47 +08:00
a11bb9c210 [使用帮助]功能升级为[Q&A管理](0430测试5/7/8)https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/837 2020-05-06 15:12:30 +08:00
72227a5591 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-05-06 14:17:49 +08:00
f9f2eb4c05 光环助手V4.0.0-游戏大事件功能20200501测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/828 2020-05-06 14:17:25 +08:00
e9c57df5fb 视频预加载捕抓 OutOfMemoryError 2020-05-06 11:25:52 +08:00
158c47d94b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-05-06 11:04:54 +08:00
7616435098 开服日历表开服信息弹窗增加滚动条 2020-05-06 11:04:41 +08:00
69443ff457 光环助手V4.0.0-游戏详情数据统计(MTA)20200505测试 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/846 2020-05-06 10:22:55 +08:00
6a257c0a9f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-30 18:29:43 +08:00
eddd56e53a 对接游戏详情视频流接口 2020-04-30 18:29:11 +08:00
de6648867b 调整游戏详情的更新栏目和自定义栏目UI https://gitlab.ghzs.com/pm/halo-app-issues/issues/829 2020-04-30 18:22:05 +08:00
567a6ceda5 设备新增/删除/覆盖已安装的应用,接口和loghub都各发送一份数据
https://gitlab.ghzs.com/stats/stats-issues/issues/135
2020-04-30 16:35:04 +08:00
59330bcd7e Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-30 16:27:42 +08:00
36803f24bc 修改游戏详情开服日历表相关UI 2020-04-30 16:27:32 +08:00
46458e2667 Merge remote-tracking branch 'origin/dev' into dev 2020-04-30 15:23:23 +08:00
d0aa6e1fe5 字体大小不随系统设置变更 2020-04-30 15:23:13 +08:00
9bef919123 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-30 15:22:12 +08:00
88a0603d50 修改数据统计上传格式
https://gitlab.ghzs.com/stats/stats-issues/-/issues/130#note_45881
2020-04-30 15:21:48 +08:00
106dbb3d8d 修改展开更多不流畅 2020-04-30 15:04:57 +08:00
4214d924a4 游戏详情UI优化 2020-04-30 11:18:08 +08:00
c3b40f9264 光环助手V4.0.0-游戏详细信息内容20200429UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/830 2020-04-29 20:42:11 +08:00
69f00626a2 光环助手V4.0.0-游戏评论Tab0429UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/834 2020-04-29 20:32:44 +08:00
c485b1f7f8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-29 18:26:12 +08:00
7186c73a64 游戏详情专区UI优化 2020-04-29 18:25:47 +08:00
88f9f65fb6 完成自定义栏目UI调整(20200428UI测试) https://gitlab.ghzs.com/pm/halo-app-issues/issues/829 2020-04-29 18:19:13 +08:00
714573ec6b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-29 17:54:14 +08:00
a979445ffc 多平台下载弹窗安装/卸载后即时刷新数据 2020-04-29 17:54:00 +08:00
3cf38eb3fc Merge remote-tracking branch 'origin/dev' into dev 2020-04-29 17:19:59 +08:00
94ceca35bf 提前 Loghub 初始化避免提交时的异常 2020-04-29 17:19:47 +08:00
2bd4eb2004 修复首页游戏替换的逻辑错误 2020-04-29 17:19:10 +08:00
355e71e620 修改编辑问题的标题显示规则 2020-04-29 17:19:09 +08:00
7d9520d97b 修改游戏详情下载进度条UI 2020-04-29 17:11:24 +08:00
ce0957cea7 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-29 16:29:09 +08:00
c93169fe97 游戏详情开服日历表更改数据来源 2020-04-29 16:29:01 +08:00
485dd96e93 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-29 16:01:42 +08:00
9b0f0892ff 光环助手V4.0-前端优化汇总(视频相关)11-13 https://gitlab.ghzs.com/pm/halo-app-issues/issues/842 2020-04-29 16:01:18 +08:00
9a04f3ae38 调整首页间距,修复首页下拉刷新无法替换已安装游戏的问题 2020-04-29 15:53:12 +08:00
968d668afa 处理Loghub数据包裹问题 2020-04-29 15:22:38 +08:00
85d19ed2bd 修复回答数同步异常问题 2020-04-29 15:10:48 +08:00
28e490f8d4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-29 11:23:08 +08:00
298ae7f657 光环助手V4.0.0-游戏详情Tab0428UI测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/827 2020-04-29 11:22:46 +08:00
d50f29b3dc 修复游戏详情自定义栏目行数设置为0会闪退的问题 2020-04-29 10:00:40 +08:00
f167eff21c Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-28 18:57:58 +08:00
69d4f00807 [使用帮助]功能升级为[Q&A管理] (二)https://gitlab.ghzs.com/pm/halo-app-issues/issues/837 2020-04-28 18:57:37 +08:00
904dc4fe2e 光环助手V4.0.0-游戏详细信息内容20200428测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/830 2020-04-28 17:59:00 +08:00
c870cc683d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-28 15:00:23 +08:00
deb29fd2e4 去掉首页tab按下时状态 2020-04-28 14:59:50 +08:00
19f1bc947a 前台服务的通知 ID 改为 1 2020-04-28 14:33:20 +08:00
60d1b47c66 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-28 11:41:01 +08:00
d67b845dfd 光环助手V4.0.0-游戏评论Tab0427测试问题:1-4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/834 2020-04-28 11:40:37 +08:00
6f1c7c7ded Merge remote-tracking branch 'origin/dev' into dev 2020-04-27 20:39:19 +08:00
46e9118d73 光环助手V4.0-前端优化汇总(视频相关)10 https://gitlab.ghzs.com/pm/halo-app-issues/issues/842 2020-04-27 20:05:30 +08:00
8aa1557b7a 调整首页分割线粗细 2020-04-27 18:26:08 +08:00
6058c3f8c1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-27 18:23:51 +08:00
d409e6f2a9 游戏详情ui优化 2020-04-27 18:23:19 +08:00
a4d272c556 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-27 18:10:48 +08:00
911d7c04ec 处理Loghub数据包裹问题 2020-04-27 18:10:41 +08:00
afc379d449 完成游戏历史版本功能 https://gitlab.ghzs.com/pm/halo-app-issues/issues/832 2020-04-27 17:05:11 +08:00
18feca49e2 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-27 16:45:19 +08:00
792b19d40d 多版本下载面板优化(UI测试问题补充)https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-27 16:44:29 +08:00
108d05edea 20200426补充4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/833 2020-04-27 16:06:56 +08:00
d8882da17b 去掉游戏详情横向列表滑动padding 2020-04-27 15:55:22 +08:00
f120dfda15 修复游戏详情文字展开按钮换行时的错位问题 2020-04-27 15:23:03 +08:00
dd60ed7abd Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-27 14:53:13 +08:00
d0b478c743 添加游戏详情展开遮罩 2020-04-27 14:52:50 +08:00
defe69ba18 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-27 14:26:34 +08:00
32d748efae 多版本下载面板优化(三)https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-27 14:26:12 +08:00
f194dc9bf6 20200426测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/826 2020-04-27 11:53:41 +08:00
075fbd77b2 完成游戏详情的展开按钮遮罩效果 2020-04-27 11:17:17 +08:00
edb3e3713a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-27 10:45:51 +08:00
c70648e038 更换评论标签样式 2020-04-27 10:45:26 +08:00
966f4ee57d Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-26 17:14:13 +08:00
f90ced4c31 下载弹窗扩大手势拖拽关闭区域 2020-04-26 17:14:04 +08:00
6bda4d80bf 自定义栏目MTA数据统计 2020-04-26 16:53:36 +08:00
3ecb6b30c9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt
2020-04-26 16:39:34 +08:00
3c337b618c 光环助手V4.0.0-游戏详情数据统计(MTA)https://gitlab.ghzs.com/pm/halo-app-issues/issues/846 2020-04-26 16:36:53 +08:00
40a90bbcfa 完成游戏详情自定义栏目的UI https://gitlab.ghzs.com/pm/halo-app-issues/issues/829 2020-04-26 16:09:04 +08:00
e54b124252 完成游戏详情自定义栏目的UI https://gitlab.ghzs.com/pm/halo-app-issues/issues/829 2020-04-26 16:07:05 +08:00
18923efe23 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-26 15:39:22 +08:00
5c5ad63cc6 多版本下载面板优化(UI测试问题汇总) https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-26 15:39:10 +08:00
d5fd444ae5 优化游戏详情视频UI 2020-04-26 11:09:06 +08:00
4a22f70e30 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-26 11:03:20 +08:00
9805bd4caa 修改图片压缩格式(防止部分Webp图片无法缩放) 2020-04-26 11:03:00 +08:00
0690f13bea 处理游戏详情标签显示不全和切换状态栏颜色 2020-04-26 09:43:23 +08:00
da8faea4c8 处理视频流顶部标题小红点显示问题 2020-04-26 09:27:57 +08:00
ff927bab09 调整游戏详情自定义栏目的部分UI https://gitlab.ghzs.com/pm/halo-app-issues/issues/829 2020-04-24 18:28:29 +08:00
e3e5def3b6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-24 18:00:39 +08:00
ba246585ad 完成游戏大事件(后台无数据还未测试) 2020-04-24 18:00:11 +08:00
f242a6a3bc Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-24 17:21:34 +08:00
0c89e76b39 光环前端优化汇总(2020年4月第3周) (3)https://gitlab.ghzs.com/pm/halo-app-issues/issues/845 2020-04-24 17:21:23 +08:00
1fa82e72f1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-24 16:10:38 +08:00
b4e6b04e47 完成实名认证弹窗 https://gitlab.ghzs.com/pm/halo-app-issues/issues/847 2020-04-24 16:10:21 +08:00
002f824f5c 光环前端优化汇总(2020年4月第1周) (4.5)https://gitlab.ghzs.com/pm/halo-app-issues/issues/824 2020-04-24 15:45:25 +08:00
1aaf7f8de1 修复下载多平台弹窗合集和链接Item内容无法显示问题 2020-04-24 15:14:34 +08:00
82ba19842c Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-24 14:20:06 +08:00
32ed1bf622 修改游戏开服日历表反馈跳转 2020-04-24 14:19:50 +08:00
0d4838c536 修改退出登录我的光环未恢复默认页面 2020-04-24 11:18:16 +08:00
11527b46f9 版权说明时间换成服务器时间 2020-04-24 09:58:20 +08:00
20c1957b59 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-23 17:57:45 +08:00
ed2630e016 光环助手V4.0.0-游戏详情数据统计(MTA)2-8 https://gitlab.ghzs.com/pm/halo-app-issues/issues/846 2020-04-23 17:57:21 +08:00
8cc2ac2cad 转换光环用户按照app列表数据的埋点方式 https://gitlab.ghzs.com/stats/stats-issues/issues/135 2020-04-23 17:50:41 +08:00
37745ca548 1.转换下载(旧)及相关数据的埋点方式 https://gitlab.ghzs.com/stats/stats-issues/issues/130
2.移除DataService相关代码
 - 相关接口部分移到ApiService部分用LogHub代替
2020-04-23 17:24:47 +08:00
29edcdca4b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-23 11:25:16 +08:00
92669d6974 光环前端优化汇总(2020年4月第3周)(8.9)https://gitlab.ghzs.com/pm/halo-app-issues/issues/845 2020-04-23 11:24:49 +08:00
351a64f592 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-22 18:55:19 +08:00
a29e56543b 实名认证弹窗(未完) 2020-04-22 18:55:05 +08:00
6db3e8c671 完成部分粗糙的游戏详情自定义栏目UI(暂毫无细节) https://gitlab.ghzs.com/pm/halo-app-issues/issues/829 2020-04-22 18:21:36 +08:00
20c4d24698 正式环境接口切换到 4.0.0 2020-04-22 18:18:45 +08:00
114e185bcb Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-22 18:14:57 +08:00
a293bff964 光环助手V4.0.0-游戏开服信息内容(三)https://gitlab.ghzs.com/pm/halo-app-issues/issues/831 2020-04-22 18:14:44 +08:00
98b4d9f95d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-22 09:37:02 +08:00
8489e87586 光环前端优化汇总(2020年4月第3周)4-6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/845 2020-04-22 09:36:36 +08:00
6f7ee2179d 修复编译失败问题 2020-04-22 09:23:00 +08:00
ea6b442a48 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-21 18:35:28 +08:00
12d26edd76 光环助手V4.0.0-游戏开服信息内容(三)https://gitlab.ghzs.com/pm/halo-app-issues/issues/831 2020-04-21 18:35:14 +08:00
27053eecd7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-21 18:31:50 +08:00
151d5b9c1f 游戏详情评论点赞按钮已点赞显示 2020-04-21 18:31:30 +08:00
d35c558658 完成首页弹窗优化 https://gitlab.ghzs.com/pm/halo-app-issues/issues/821 2020-04-21 18:23:05 +08:00
baa4dc7a23 完成个人主页-玩过的游戏&我的游戏-玩过整体优化 https://gitlab.ghzs.com/pm/halo-app-issues/issues/839 2020-04-21 18:09:00 +08:00
9b565c32d1 修改开服时间显示 2020-04-21 17:25:53 +08:00
243dd26d73 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-21 16:11:36 +08:00
263234fecb 光环助手V4.0.0-游戏评论Tab https://gitlab.ghzs.com/pm/halo-app-issues/issues/834 2020-04-21 16:11:14 +08:00
0ba598ee67 删除无用代码,临时修复下载插件化判断错误问题 2020-04-21 10:25:42 +08:00
29430b9967 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-20 18:38:29 +08:00
2038b16dce 修改下载按钮样式 2020-04-20 18:38:12 +08:00
9ea793397b 光环助手V4.0-前端优化汇总(视频相关)1-3,5,6,7 https://gitlab.ghzs.com/pm/halo-app-issues/issues/842 2020-04-20 18:26:41 +08:00
6061938129 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-20 12:35:43 +08:00
62277aa525 光环前端优化汇总(2020年4月第3周)5 https://gitlab.ghzs.com/pm/halo-app-issues/issues/845 2020-04-20 12:35:22 +08:00
1c118b06c9 Merge remote-tracking branch 'origin/dev' into dev 2020-04-20 12:16:15 +08:00
a41c315e36 修复打包异常 2020-04-20 12:11:07 +08:00
40576e0012 光环前端优化汇总(2020年4月第3周)1,4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/845 2020-04-20 11:58:12 +08:00
a582db52f4 游戏详情实体添加@Keep注解 2020-04-20 11:12:18 +08:00
cb2656ad85 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-19 17:59:19 +08:00
da1c686d42 尝试解决长时间处于后台视频流页面控件为空的问题 2020-04-19 17:58:41 +08:00
b613fe2ba0 修复由于延迟问答tab和我的光环tab加载引起的问题 2020-04-19 17:00:52 +08:00
83e29b1cf3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-17 18:56:04 +08:00
5bbd23bf33 游戏详情游戏详细信息显示问题 2020-04-17 18:55:59 +08:00
9f69b83b51 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/common/util/GameUtils.java
2020-04-17 18:54:13 +08:00
4f77781e24 下载按钮状态优化(三) https://gitlab.ghzs.com/pm/halo-app-issues/issues/838 2020-04-17 18:50:28 +08:00
b23d589a29 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-17 17:49:33 +08:00
7f16a69301 完成游戏详情专区tab https://gitlab.ghzs.com/pm/halo-app-issues/issues/833 2020-04-17 17:49:08 +08:00
006da73737 基本完成游戏历史版本功能(部分UI细节待完善) https://gitlab.ghzs.com/pm/halo-app-issues/issues/832 2020-04-17 17:44:47 +08:00
3f998cdf75 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-17 16:38:13 +08:00
3e94cd9d8c 下载按钮状态优化(一,二) https://gitlab.ghzs.com/pm/halo-app-issues/issues/838 2020-04-17 16:38:06 +08:00
5922f92caf 游戏详情详细信息,版本求更新 https://gitlab.ghzs.com/pm/halo-app-issues/issues/830 2020-04-17 11:11:19 +08:00
f5f5909fde Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-16 19:00:58 +08:00
7e67357887 多版本下载面板UI跳转 2020-04-16 19:00:49 +08:00
d5750c6cb8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-16 18:59:35 +08:00
b2983d5c96 游戏详情专区支持显示webview页面 2020-04-16 18:59:30 +08:00
5a19e46d26 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-16 18:44:04 +08:00
8456a5a1d6 多版本下载面板增加"其它版本"跳转按钮 2020-04-16 18:43:51 +08:00
b9329a092e 大致完成游戏详情详情tab(除自定义栏目) 2020-04-16 18:20:05 +08:00
6ecad9eebd Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-16 15:45:52 +08:00
f32dd9efee 多版本下载面板优化(添加相关交互动画) https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-16 15:45:44 +08:00
48cbaf03b7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-15 18:57:51 +08:00
7f23cda97a 对接游戏详情数据(未完) 2020-04-15 18:57:46 +08:00
49c1809aa2 多版本下载面板优化(增加链接弹窗) https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-15 17:45:57 +08:00
173aa82134 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-15 15:49:01 +08:00
c57e8b2c76 多版本下载面板优化(细节补充) https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-15 15:48:35 +08:00
bb741013d4 Merge remote-tracking branch 'origin/dev' into dev 2020-04-15 10:33:21 +08:00
5b014a5a1d 更正版块曝光路径 https://gitlab.ghzs.com/pm/halo-app-issues/issues/843 2020-04-15 10:33:12 +08:00
a85548ac33 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-14 19:15:16 +08:00
77e689fec4 游戏详情UI 2020-04-14 19:15:11 +08:00
fe942dcf73 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2020-04-14 19:14:49 +08:00
da3b700403 多版本下载面板优化(合计页面基本完成)https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-14 19:13:57 +08:00
fcd46cb2ea 延迟加载我的光环 (部分问题后续处理 2020-04-14 12:10:01 +08:00
e918b19e2e 延迟渲染问答tab 2020-04-13 20:48:14 +08:00
afb8badc74 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-13 19:10:12 +08:00
4e22a5c7bb 游戏详情UI 2020-04-13 19:10:08 +08:00
b5d2e02606 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-13 18:57:32 +08:00
28afb4f14c 多版本下载面板优化(一级页面基本完成)https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-13 18:57:17 +08:00
165659a664 Merge branch 'optimise-startup' into 'dev'
Optimise startup

See merge request !14
2020-04-13 17:16:26 +08:00
7b3d910b10 优化首页启动速度 https://gitlab.ghzs.com/pm/halo-app-issues/issues/820 2020-04-13 17:12:12 +08:00
1e4a85719a Merge branch '3.7.5-bugfix' into 'dev'
3.7.5 bugfix

See merge request !13
2020-04-13 15:16:49 +08:00
4269cb37d2 Merge branch 'dev' into '3.7.5-bugfix'
# Conflicts:
#   dependencies.gradle
2020-04-13 15:16:32 +08:00
b7ce3e8c20 延迟初始化部分变量 2020-04-13 12:29:54 +08:00
15a0240808 游戏详情(未完) 2020-04-12 16:29:22 +08:00
0aa68ea04b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-10 19:03:44 +08:00
2d9b69fd1e 重新整理检查是否可以更新/插件化的方法 2020-04-10 19:03:37 +08:00
48d6023e0d 游戏下载弹窗:试玩提醒与设备提醒 20200409补充 https://gitlab.ghzs.com/pm/halo-app-issues/issues/818 2020-04-10 17:20:57 +08:00
113ebb36e9 tinker_base-3.7.6 2020-04-10 14:12:30 +08:00
d0c9bd8038 Merge branch '3.7.5-bugfix' of gitlab.ghzhushou.com:halo/assistant-android into 3.7.5-bugfix 2020-04-10 13:50:54 +08:00
104586fb7f 版本号改为 3.7.6 2020-04-10 13:50:24 +08:00
0612582a46 支持应用内/外跳转社区专题 2020-04-10 11:34:05 +08:00
1bc5bb3ef6 tinker_base-3.7.5 2020-04-10 11:26:12 +08:00
a3d0d91dd7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-09 21:52:06 +08:00
982e8f67bf 游戏详情顶部区域UI 2020-04-09 21:51:41 +08:00
0bb871bff2 完成首页轮播图优化 https://gitlab.ghzs.com/pm/halo-app-issues/issues/820 2020-04-09 17:41:10 +08:00
0eb43d6552 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-09 17:24:42 +08:00
b4f29f4856 多版本下载面板优化(Item的数据填充)https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-09 17:24:20 +08:00
2719bff65f 修改视频分享统计问题 2020-04-09 14:23:21 +08:00
4fd68565d2 更换游戏详情标题栏icon 2020-04-09 11:12:11 +08:00
b87972143d 修复搜索页可能的闪退问题 2020-04-09 11:01:15 +08:00
8241551438 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-09 10:42:04 +08:00
d7bb45f287 光环前端优化汇总(2020年4月第1周)11 https://gitlab.ghzs.com/pm/halo-app-issues/issues/824 2020-04-09 10:41:28 +08:00
0cdec2a226 捕抓自动安装闪退 2020-04-09 10:25:28 +08:00
dbb3078300 版本号改为 4.0.0 2020-04-09 10:07:35 +08:00
545c235b24 修复游戏详情页因修复 bundle 过大而造成的页面重构闪退 2020-04-08 18:52:03 +08:00
53d3cb320b 提前 downloadService startForeground 操作避免部分设备初始化闪退 2020-04-08 18:50:09 +08:00
38682f01a8 升级 appcompat 依赖避免在5.1设备上webview闪退 2020-04-08 18:49:04 +08:00
a7d141efcc Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-08 18:25:06 +08:00
31c404021c 多版本下载面板优化(初步完成UI相关)https://gitlab.ghzs.com/pm/halo-app-issues/issues/819 2020-04-08 18:24:48 +08:00
631cec2fc6 游戏详情顶部区域 2020-04-08 17:51:07 +08:00
13a76e8de7 Merge branch '3.7.5-bugfix' of gitlab.ghzhushou.com:halo/assistant-android into 3.7.5-bugfix 2020-04-08 12:39:57 +08:00
1e98fa98c3 增加应用内 webview 返回应用版本号的方法 2020-04-08 12:39:23 +08:00
be6eab0cae 首页专题支持游戏替换 https://gitlab.ghzs.com/pm/halo-app-issues/issues/820 2020-04-08 11:36:28 +08:00
71ee8bfd29 Merge remote-tracking branch 'origin/dev' into dev 2020-04-07 18:23:32 +08:00
66c9c02dc6 完成游戏大图UI优化 https://gitlab.ghzs.com/pm/halo-app-issues/issues/820 2020-04-07 18:23:21 +08:00
7880ee4aef 游戏详情Tab位置调整 2020-04-07 18:19:16 +08:00
6274d1f778 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-04-07 11:55:37 +08:00
5e98813f92 顶部Tab栏统一样式(补充:开服表)https://gitlab.ghzs.com/pm/halo-app-issues/issues/825 2020-04-07 11:55:21 +08:00
1a30800fb4 光环前端优化汇总(2020年4月第1周)9,10 https://gitlab.ghzs.com/pm/halo-app-issues/issues/824 2020-04-07 10:47:00 +08:00
454e6933f4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-06 17:51:19 +08:00
e3072071b7 完成游戏设备弹窗 https://gitlab.ghzs.com/pm/halo-app-issues/issues/818 2020-04-06 17:50:57 +08:00
83a88326f0 完成光环前端优化汇总(4月第1周)8 https://gitlab.ghzs.com/pm/halo-app-issues/issues/824 2020-04-06 10:36:19 +08:00
27109a810f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-06 10:20:26 +08:00
3d5bd424c5 游戏下载弹窗:试玩提醒 https://gitlab.ghzs.com/pm/halo-app-issues/issues/818 2020-04-06 10:20:02 +08:00
c7cd56e7be 完成光环前端优化汇总(4月第1周)的7,8,12 https://gitlab.ghzs.com/pm/halo-app-issues/issues/824 2020-04-06 10:05:17 +08:00
860769c44a 删除无用代码 2020-04-04 18:25:37 +08:00
a83761b88d 顶部Tab栏统一样式(除了开服表,其它的已完成)https://gitlab.ghzs.com/pm/halo-app-issues/issues/825 2020-04-04 18:11:53 +08:00
a79fc9c0b1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-02 18:33:56 +08:00
877bd63d9d add DownloadDialog 2020-04-02 18:33:48 +08:00
bb9d0582c4 修改游戏试玩弹窗 2020-04-02 17:46:55 +08:00
df7e89e7e4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-02 16:45:54 +08:00
a12593ea51 游戏试玩弹窗 https://gitlab.ghzs.com/pm/halo-app-issues/issues/818 2020-04-02 16:45:16 +08:00
5ca0af4285 关闭TooLargeTool 2020-04-02 15:55:59 +08:00
20bc38add4 视频流播放错误重试一次 2020-04-02 15:00:07 +08:00
89e72a0fea 下载按钮状态新增“试玩”(未完) 2020-04-02 14:13:02 +08:00
efabaafa38 20200402正式环境测试2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/817 2020-04-02 11:04:10 +08:00
fc25ad7ddb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-02 10:27:25 +08:00
6b656cf446 add todo 2020-04-02 10:27:06 +08:00
26927661e7 修改视频流banner 2020-04-02 09:40:32 +08:00
15ba945751 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-01 16:44:31 +08:00
8e0527b777 尝试修复SyncPage快速添加/删除时数据无法同步问题 2020-04-01 16:44:21 +08:00
b9dfa0a8a9 视频流静音按钮增加防抖判断 2020-04-01 16:30:32 +08:00
c462973eb6 修复"问答-推荐精选"文章不能点赞问题 2020-04-01 15:29:21 +08:00
b8cefd69c0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-01 11:56:04 +08:00
1c1537be8a 尝试修改滑动视频不播放问题 2020-04-01 11:55:57 +08:00
1dad632c70 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-01 11:49:24 +08:00
41600c7576 光环助手V3.7.5-前端测试问题汇总(0331)(1.4) https://gitlab.ghzs.com/pm/halo-app-issues/issues/817 2020-04-01 11:45:06 +08:00
5f0074c88d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-01 10:09:48 +08:00
907f2a2678 修改视频分享按钮动画 2020-04-01 10:09:28 +08:00
4a118bd51c 修复客服页面没授予权限选图片会闪退的问题 2020-04-01 10:08:21 +08:00
4919b46e5d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-04-01 09:44:52 +08:00
034a6662f9 修复WebFragment JavascriptObject命名空间冲突问题 2020-04-01 09:44:38 +08:00
3fb1c9f315 视频流分享复制链接分享次数也+1 2020-03-31 17:14:42 +08:00
aed4610afd WebFragment分享文案改为Web端控制 2020-03-31 16:48:37 +08:00
345be8035a WebFragment分享文案改为Web端控制 2020-03-31 16:30:03 +08:00
68c7b0ddaf 正式环境改为3.7.5 2020-03-31 10:00:27 +08:00
f39ce00152 20200331测试:1 https://gitlab.ghzs.com/pm/halo-app-issues/issues/801 2020-03-31 09:51:48 +08:00
0b6d1bd6df Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-30 16:57:08 +08:00
dca7a44884 修复游戏详情由于Bundle的数据内容过大导致的闪退
引入TooLargeTool库(监控Bundle大小)
2020-03-30 16:56:47 +08:00
d90cdf341e 处理切换tab视频页面闪烁 2020-03-30 11:40:11 +08:00
7828189ea0 update LGLibrary version 2020-03-29 12:49:11 +08:00
e4cd8da65c 修复一下闪退问题 2020-03-29 12:36:39 +08:00
8cebbd3bbe Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-27 17:47:39 +08:00
63d9b354d4 update sync page 2020-03-27 17:47:26 +08:00
254944fbfc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-27 16:56:57 +08:00
ec93080190 20200327测试1,2,4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/801 2020-03-27 16:56:36 +08:00
ec638cb231 资讯文章详情播放视频增加MTA事件 2020-03-27 16:45:34 +08:00
7c72623f90 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-27 15:52:23 +08:00
2e58404e01 资讯文章详情播放视频由在Web页面改为在App视频详情播放 2020-03-27 15:52:10 +08:00
5eae896330 光环助手V3.7.5-视频详情UI优化2(2) https://gitlab.ghzs.com/pm/halo-app-issues/issues/801 2020-03-27 14:51:37 +08:00
6c2dcc7d37 回退视频流游戏名字颜色值 2020-03-27 11:54:33 +08:00
d40e4e97c1 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-27 11:48:03 +08:00
3164ed1b0e 修改SwitchButton样式 2020-03-27 11:47:48 +08:00
b49fae0384 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-27 11:43:47 +08:00
80544aff32 0326测试补充2(1),4,6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/801 2020-03-27 11:43:25 +08:00
64235951c2 修复游戏详情回答点赞数量不准确问题 2020-03-27 10:40:33 +08:00
f08fe7d855 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-26 22:08:20 +08:00
ff1a9e8694 update sync page 2020-03-26 22:07:59 +08:00
2abf87628a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-26 18:53:18 +08:00
e835482abd 0326测试补充1,3,5,8 https://gitlab.ghzs.com/pm/halo-app-issues/issues/801 2020-03-26 18:52:54 +08:00
e78882e911 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-26 18:33:50 +08:00
b021d99f78 RichEditor添加javascript提交Mta事件的接口 2020-03-26 18:33:33 +08:00
084781dc0a jenkins 打包脚本添加错误重试 2020-03-26 18:21:11 +08:00
ce83fed40d Merge branch '3.7.4-bugfix-again' into 'dev'
3.7.4 bugfix again

See merge request !12
2020-03-26 17:49:28 +08:00
24d16a234f Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-26 17:29:58 +08:00
536af50a4f 光环助手V3.7.5-视频功能优化(上传视频)0326测试:2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/808 2020-03-26 17:29:42 +08:00
9eccc459d9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-26 17:03:41 +08:00
6e8310e4c9 添加浏览器跳转视频流协议并对接活动视频接口 2020-03-26 17:03:20 +08:00
35e79f938c 微调资讯文章详情UI 2020-03-26 15:53:31 +08:00
10764ac3f4 RichEditor添加显示Dialog/获取数据/存储数据接口 2020-03-26 15:35:27 +08:00
2a6ecfa176 修改获取上传配置的链接参数 2020-03-25 16:31:31 +08:00
5b44c7f856 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-25 15:01:11 +08:00
1e5e36a8c7 社区文章/回答列表执行点赞/评论操作后即时刷新列表数据 2020-03-25 15:00:57 +08:00
92dda8e64c 修复应用外跳转只能跳一次的问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/812 2020-03-25 10:38:18 +08:00
27488e8084 Merge branch 'sync_page_data' 2020-03-24 16:49:39 +08:00
72871e55c6 数据同步模块基本完成 2020-03-24 15:28:19 +08:00
07c05b2191 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-24 11:33:24 +08:00
89d2fb98fa 修改问题列表的跳转规则 2020-03-24 11:33:09 +08:00
6d1719b877 处理闪退异常 2020-03-24 10:51:00 +08:00
51599d5bb4 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-24 10:46:28 +08:00
aedaee8d3a 光环助手V3.7.5-视频功能优化(上传视频)(2.5) https://gitlab.ghzs.com/pm/halo-app-issues/issues/808 2020-03-24 10:46:02 +08:00
c1c655fcb0 完成光环前端优化汇总(3月第3周)的1,2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/812 2020-03-23 18:47:34 +08:00
fabcce9a6c 删除无用代码 2020-03-23 18:14:26 +08:00
16feb963f6 光环前端优化汇总(2020年3月第3周)(3.7.10.12) https://gitlab.ghzs.com/pm/halo-app-issues/issues/812 2020-03-23 18:12:22 +08:00
e7ae608986 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-23 13:12:21 +08:00
7ec4625d45 RichEditor添加视频库以支持在Web页面直接播放视频 2020-03-23 13:11:50 +08:00
135d717715 光环前端优化汇总(2020年3月第3周)5,6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/812 2020-03-23 10:31:08 +08:00
77c3131a69 Merge branch '3.7.4-bugfix' into 'dev'
3.7.4 bugfix

See merge request !11
2020-03-20 16:35:34 +08:00
7e74cbfbd1 Merge branch 'dev' into '3.7.4-bugfix'
# Conflicts:
#   app/src/main/java/com/gh/gamecenter/help/HelpContentAdapter.kt
2020-03-20 16:35:20 +08:00
a2cd548d1e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-20 15:56:23 +08:00
0a4d6122df 尝试解决exo内核播放完毕不回调问题 2020-03-20 15:56:17 +08:00
23d1435ed2 修复一些闪退问题 2020-03-20 15:31:28 +08:00
dd60900bcb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-20 10:34:13 +08:00
0fbb0aa363 修改AppManager的activity出栈方式,以修复Activity销毁后会自动退出App的问题 2020-03-20 10:33:49 +08:00
23539b9316 视频详情徽章显示问题 2020-03-19 18:23:09 +08:00
a1460b07c6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-19 17:45:03 +08:00
02b6c2733b 修复一些闪退问题 2020-03-19 17:44:47 +08:00
1d29d68aa2 解决进入首页视频流未选中的tab页面播放视频 2020-03-19 15:23:07 +08:00
aa76a20065 完成视频流广告 2020-03-19 10:43:56 +08:00
ec945919ba 广告banner添加indicator 2020-03-18 18:09:08 +08:00
e626e82945 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-18 17:26:31 +08:00
6e238379f2 播放界面UI优化 2020-03-18 17:26:26 +08:00
7a4ae83a2b 光环助手V3.7.5-视频功能优化(上传视频)(1) https://gitlab.ghzs.com/pm/halo-app-issues/issues/808 2020-03-18 17:00:21 +08:00
46827b1489 光环前端优化汇总(2020年3月第2周)(11) https://gitlab.ghzs.com/pm/halo-app-issues/issues/805 2020-03-18 15:56:29 +08:00
762897521b 光环助手V3.7.5-视频数据相关 https://gitlab.ghzs.com/pm/halo-app-issues/issues/809 2020-03-18 14:25:09 +08:00
b8d74357b5 显示版本号改为 3.7.5 2020-03-18 10:31:28 +08:00
21c116ea5b 完成前端优化汇总(3月第2周)的第4点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/805 2020-03-18 10:30:49 +08:00
2cf23b9a32 对接最新Tab视频流接口 2020-03-17 17:24:27 +08:00
6b03098ac7 Merge branch 'upgrade_dependencies' into dev
# Conflicts:
#	dependencies.gradle
2020-03-17 09:55:41 +08:00
bcd846024e 视频流分享统计 2020-03-17 09:53:49 +08:00
d98edc8f77 光环前端优化汇总(2020年3月第2周)8 https://gitlab.ghzs.com/pm/halo-app-issues/issues/805 2020-03-17 09:20:47 +08:00
faef2a5e4d 使用帮助Web页面避免缩放 2020-03-16 18:18:01 +08:00
3d88792d11 视频流广告banner 2020-03-16 16:54:46 +08:00
f7fe7a5153 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-15 19:16:05 +08:00
9aeb1624a6 修改视频流详情UI(未完) 2020-03-15 19:15:42 +08:00
ec9c282618 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-13 16:59:04 +08:00
7e1da213d5 光环前端优化汇总(2020年3月第2周)(7.9.10)https://gitlab.ghzs.com/pm/halo-app-issues/issues/805 2020-03-13 16:58:47 +08:00
8d9fd482b9 视频流增加最新Tab 2020-03-13 16:28:47 +08:00
c87bf1e613 update 2020-03-12 14:19:45 +08:00
81dc17530f update 2020-03-11 17:56:10 +08:00
b53f769a0d update 2020-03-11 17:22:44 +08:00
aadd2071b9 update 2020-03-10 18:16:44 +08:00
fc7566d2c9 整理并更新版本依赖 2020-03-10 17:56:53 +08:00
7f082b7a36 update 2020-03-10 10:27:51 +08:00
bebda2de70 update 2020-03-05 15:59:56 +08:00
3e0887b5f9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into sync_page_data 2020-03-05 11:52:15 +08:00
a8894cc464 init sync page data 2020-03-02 17:04:30 +08:00
1373 changed files with 45658 additions and 20556 deletions

View File

@ -23,6 +23,10 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
dexOptions {
// jumboMode = true
javaMaxHeapSize "4g"
@ -38,7 +42,7 @@ android {
}
ndk {
abiFilters "armeabi-v7a", "x86"
abiFilters "armeabi-v7a"
}
// 由于app只针对中文用户所以仅保留zh资源其他删掉
@ -61,6 +65,15 @@ android {
buildConfigField "String", "WEIBO_APPKEY", "\"${WEIBO_APPKEY}\""
buildConfigField "String", "MTA_APPKEY", "\"${MTA_APPKEY}\""
buildConfigField "String", "TD_APPID", "\"${TD_APPID}\""
buildConfigField "String", "LETO_APPID", "\"${LETO_APPID}\""
buildConfigField "String", "TTAD_APPID", "\"${TTAD_APPID}\""
buildConfigField "String", "MIPUSH_APPID", "\"${MIPUSH_APPID}\""
buildConfigField "String", "MIPUSH_APPKEY", "\"${MIPUSH_APPKEY}\""
buildConfigField "String", "MEIZUPUSH_APPID", "\"${MEIZUPUSH_APPID}\""
buildConfigField "String", "MEIZUPUSH_APPKEY", "\"${MEIZUPUSH_APPKEY}\""
resValue "string", "huawei_push_appid", "appid=${HUAWEI_PUSH_APPID}"
/**
* Build Time 供区分 jenkins 打包时间用
@ -89,7 +102,7 @@ android {
signingConfig signingConfigs.debug
buildConfigField "String", "EXPOSURE_REPO", "\"test\""
buildConfigField "String", "EXPOSURE_VERSION", "\"E3\""
buildConfigField "String", "EXPOSURE_VERSION", "\"E4\""
multiDexKeepProguard file("tinker_multidexkeep.pro")
}
@ -101,7 +114,7 @@ android {
signingConfig signingConfigs.release
buildConfigField "String", "EXPOSURE_REPO", "\"exposure\""
buildConfigField "String", "EXPOSURE_VERSION", "\"E3\""
buildConfigField "String", "EXPOSURE_VERSION", "\"E4\""
multiDexKeepProguard file("tinker_multidexkeep.pro")
}
@ -117,16 +130,11 @@ android {
publish {
dimension "nonsense"
buildConfigField "String", "API_HOST", "\"${API_HOST}\""
buildConfigField "String", "COMMENT_HOST", "\"${COMMENT_HOST}\""
buildConfigField "String", "DATA_HOST", "\"${DATA_HOST}\""
buildConfigField "String", "SENSITIVE_API_HOST", "\"${SENSITIVE_API_HOST}\""
buildConfigField "String", "UMENG_APPKEY", "\"${UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${UMENG_MESSAGE_SECRET}\""
buildConfigField "String", "MIPUSH_APPID", "\"${MIPUSH_APPID}\""
buildConfigField "String", "MIPUSH_APPKEY", "\"${MIPUSH_APPKEY}\""
buildConfigField "String", "MEIZUPUSH_APPID", "\"${MEIZUPUSH_APPID}\""
buildConfigField "String", "MEIZUPUSH_APPKEY", "\"${MEIZUPUSH_APPKEY}\""
buildConfigField "String", "BUGLY_APPID", "\"${BUGLY_APPID}\""
}
// internal test dev host
@ -135,17 +143,12 @@ android {
versionNameSuffix "-debug"
buildConfigField "String", "API_HOST", "\"${DEV_API_HOST}\""
buildConfigField "String", "COMMENT_HOST", "\"${DEV_COMMENT_HOST}\""
buildConfigField "String", "DATA_HOST", "\"${DEV_DATA_HOST}\""
buildConfigField "String", "UMENG_APPKEY", "\"${DEBUG_UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${DEBUG_UMENG_MESSAGE_SECRET}\""
buildConfigField "String", "MIPUSH_APPID", "\"${DEBUG_MIPUSH_APPID}\""
buildConfigField "String", "MIPUSH_APPKEY", "\"${DEBUG_MIPUSH_APPKEY}\""
buildConfigField "String", "MEIZUPUSH_APPID", "\"${DEBUG_MEIZUPUSH_APPID}\""
buildConfigField "String", "MEIZUPUSH_APPKEY", "\"${DEBUG_MEIZUPUSH_APPKEY}\""
buildConfigField "String", "SENSITIVE_API_HOST", "\"${DEV_API_HOST}\""
buildConfigField "String", "BUGLY_APPID", "\"${DEBUG_BUGLY_APPID}\""
buildConfigField "String", "UMENG_APPKEY", "\"${DEV_UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${DEV_UMENG_MESSAGE_SECRET}\""
buildConfigField "String", "BUGLY_APPID", "\"${DEV_BUGLY_APPID}\""
}
}
}
@ -169,7 +172,7 @@ rebuildChannel {
repositories {
flatDir {
dirs 'libs/aars'
dirs 'libs', 'libs/aars'
}
}
@ -183,6 +186,7 @@ dependencies {
debugImplementation "com.facebook.stetho:stetho:${stetho}"
debugImplementation "com.facebook.stetho:stetho-okhttp3:${stetho}"
debugImplementation "com.squareup.okhttp3:logging-interceptor:${okHttp}"
debugImplementation "com.gu.android:toolargetool:${toolargetool}"
implementation "androidx.core:core:${core}"
implementation "androidx.fragment:fragment:${fragment}"
@ -192,14 +196,14 @@ dependencies {
implementation "androidx.annotation:annotation:${annotation}"
implementation "androidx.constraintlayout:constraintlayout:${constraintLayout}"
implementation "androidx.recyclerview:recyclerview:${recyclerView}"
implementation "androidx.lifecycle:lifecycle-runtime:${lifeCycle}"
implementation "androidx.lifecycle:lifecycle-extensions:${lifeCycle}"
kapt "androidx.lifecycle:lifecycle-compiler:${lifeCycle}"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifeCycle"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifeCycle"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifeCycle"
implementation "androidx.room:room-runtime:${room}"
implementation "androidx.room:room-rxjava2:${room}"
implementation "androidx.core:core-ktx:${ktx}"
implementation "androidx.viewpager2:viewpager2:${viewpager2}"
kapt "androidx.room:room-compiler:${room}"
kapt "androidx.databinding:databinding-compiler:${databinding}"
implementation "com.google.android.material:material:${material}"
@ -241,13 +245,13 @@ dependencies {
// bugly with tinker support
implementation "com.tencent.bugly:crashreport_upgrade:${buglyTinkerSupport}"
implementation 'com.google.android:flexbox:1.1.0'
implementation "com.google.android:flexbox:${flexbox}"
implementation "pub.devrel:easypermissions:${easypermissions}"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.contrarywind:Android-PickerView:4.1.8'
implementation "com.contrarywind:Android-PickerView:${pickerView}"
implementation "com.scwang.smartrefresh:SmartRefreshLayout:${smartRefreshLayout}"
implementation "net.cachapa.expandablelayout:expandablelayout:${expandableLayout}"
@ -260,40 +264,39 @@ dependencies {
implementation "com.squareup.picasso:picasso:${picasso}"
// for video streaming
implementation ("com.shuyu:gsyVideoPlayer-java:$gsyVideo",{
implementation("com.shuyu:gsyVideoPlayer-java:$gsyVideo", {
exclude module: "gsyvideoplayer-androidvideocache"
exclude group: "tv.danmaku.ijk.media"
})
implementation "com.shuyu:GSYVideoPlayer-exo2:$gsyVideo"
// implementation "com.shuyu:gsyVideoPlayer-armv7a:$gsyVideo"
// implementation "com.shuyu:gsyVideoPlayer-x86:$gsyVideo"
implementation "com.github.wendux:DSBridge-Android:$dsBridge"
implementation "android.arch.work:work-runtime:${workManager}"
implementation "com.llew.huawei:verifier:1.0.6"
implementation "com.llew.huawei:verifier:${verifier}"
implementation "com.github.tbruyelle:rxpermissions:${rxPermissions}"
implementation 'com.ethanhua:skeleton:1.1.1'
implementation 'io.supercharge:shimmerlayout:2.1.0'
implementation "com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.3.1"
implementation 'com.walkud.rom.checker:RomChecker:1.0.0'
implementation "com.ethanhua:skeleton:${skeleton}"
implementation "io.supercharge:shimmerlayout:${shimmerlayout}"
implementation "com.tencent.mm.opensdk:wechat-sdk-android-without-mta:${mta}"
implementation "com.walkud.rom.checker:RomChecker:${romChecker}"
debugImplementation "com.github.nichbar.chucker:library:$chucker"
releaseImplementation "com.github.nichbar.chucker:library-no-op:$chucker"
implementation "com.bytedance.applog:RangersAppLog-Lite-cn:$bytedanceApplog"
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.2'
implementation "com.aliyun.dpa:oss-android-sdk:${oss}"
implementation "com.airbnb.android:lottie:$lottie"
implementation "net.lingala.zip4j:zip4j:${zip4j}"
implementation("com.github.piasy:BigImageViewer:$bigImageViewer", {
exclude group: 'com.squareup.okhttp3'
exclude group: 'androidx.swiperefreshlayout'
exclude group: 'com.github.bumptech.glide'
})
debugImplementation "com.github.markzhai:blockcanary-android:$blockcanary"
releaseImplementation "com.github.markzhai:blockcanary-no-op:$blockcanary"
implementation "com.github.PhilJay:MPAndroidChart:${chart}"
implementation project(':libraries:LGLibrary')
implementation project(':libraries:MTA')
@ -303,7 +306,6 @@ dependencies {
// implementation project(':libraries:WechatShare')
implementation project(':libraries:im')
implementation project(':libraries:Matisse')
implementation project(path: ':libraries:gsyVideoPlayer-proxy_cache')
}
File propFile = file('sign.properties')
if (propFile.exists()) {

Binary file not shown.

View File

@ -240,4 +240,18 @@
-keep class com.shuyu.gsyvideoplayer.utils.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.utils.**
-keep class tv.danmaku.ijk.** { *; }
-dontwarn tv.danmaku.ijk.**
-dontwarn tv.danmaku.ijk.**
#穿山甲
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.pgl.sys.ces.* {*;}
-keep class com.gyf.immersionbar.* {*;}
-dontwarn com.gyf.immersionbar.**
-keep class com.taobao.securityjni.**{*;}
-keep class com.taobao.wireless.security.**{*;}
-keep class com.ut.secbody.**{*;}
-keep class com.taobao.dp.**{*;}
-keep class com.alibaba.wireless.security.**{*;}

View File

@ -4,7 +4,6 @@ import android.app.Application;
import com.facebook.stetho.Stetho;
import com.facebook.stetho.okhttp3.StethoInterceptor;
import com.squareup.leakcanary.LeakCanary;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
@ -18,18 +17,11 @@ import okhttp3.logging.HttpLoggingInterceptor;
public class Injection {
public static boolean appInit(Application application) {
// init leakcanary
if (LeakCanary.isInAnalyzerProcess(application)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return false;
}
LeakCanary.install(application);
// init stetho
Stetho.initializeWithDefaults(application);
// 监控Bundle大小,预防溢出(需要调试的时候再开启吧!)
// TooLargeTool.startLogging(application);
return true;
}

View File

@ -36,6 +36,15 @@
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--可选,穿山甲提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告-->
<!--请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 如果有视频相关的广告且使用textureView播放请务必添加否则黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-sdk tools:overrideLibrary="com.shuyu.gsyvideoplayer,
com.shuyu.gsyvideoplayer.lib,
com.shuyu.gsyvideoplayer.armv7a,
@ -44,7 +53,13 @@
com.google.android.exoplayer2,
tv.danmaku.ijk.media.exo2,
shuyu.com.androidvideocache,
pl.droidsonroids.gif" />
pl.droidsonroids.gif,
com.ledong.lib.minigame,
com.ledong.lib.leto,
com.leto.game.base.glide4,
com.leto.game.ad.gdt,
com.leto.game.fcm,
com.leto.game.ad.toutiao" />
<!-- 去掉 SDK 一些流氓权限 -->
<uses-permission
@ -67,6 +82,7 @@
android:largeHeap="true"
android:resizeableActivity="true"
android:theme="@style/AppCompatTheme.APP"
tools:replace="android:allowBackup"
tools:targetApi="n">
<!--android:launchMode = "singleTask"-->
@ -97,7 +113,9 @@
android:screenOrientation="portrait" />
<!--android:theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" 退出时屏幕抖动 -->
<activity android:name="com.gh.gamecenter.ViewImageActivity" />
<activity
android:name="com.gh.gamecenter.ImageViewerActivity"
android:theme="@style/Theme.Transparent" />
<activity
android:name="com.gh.gamecenter.SearchActivity"
@ -115,6 +133,10 @@
android:name="com.gh.gamecenter.ShellActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.gamedetail.history.HistoryApkListActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.NewsDetailActivity"
android:screenOrientation="portrait" />
@ -158,7 +180,8 @@
<activity
android:name="com.gh.gamecenter.MessageDetailActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
android:theme="@style/TransparentStatusBarAndNavigationBar" />
<activity
android:name="com.gh.gamecenter.LibaoActivity"
@ -187,7 +210,8 @@
<activity
android:name="com.gh.gamecenter.CommentDetailActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
android:theme="@style/TransparentStatusBarAndNavigationBar" />
<activity
android:name="com.gh.gamecenter.mygame.MyGameActivity"
@ -398,7 +422,8 @@
<activity
android:name="com.gh.gamecenter.gamedetail.rating.RatingReplyActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
android:theme="@style/TransparentStatusBarAndNavigationBar" />
<activity
android:name="com.gh.gamecenter.history.HistoryActivity"
@ -458,8 +483,8 @@
<activity
android:name="com.gh.gamecenter.HelpAndFeedbackActivity"
android:windowSoftInputMode="stateHidden"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.gh.gamecenter.help.HelpDetailActivity"
@ -480,10 +505,37 @@
android:name=".gamedetail.myrating.MyRatingActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.gamedetail.fuli.kaifu.ServersCalendarActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.QaActivity"
android:screenOrientation="portrait" />
<activity
android:name=".qa.answer.draft.AnswerDraftActivity"
android:screenOrientation="portrait" />
<activity
android:name=".gamedetail.rating.RatingFoldActivity"
android:screenOrientation="portrait" />
<activity
android:name=".video.data.VideoDataActivity"
android:screenOrientation="portrait" />
<activity
android:name=".video.poster.PosterEditActivity"
android:screenOrientation="portrait" />
<activity
android:name=".video.poster.PosterClipActivity"
android:screenOrientation="portrait" />
<!-- 使用小米/华为推送弹窗功能提高推送成功率-->
<activity
android:name="com.gh.gamecenter.PushProxyActivity"
android:exported="true"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Translucent" />
<activity
@ -546,7 +598,7 @@
</receiver>
<!--魅族push应用定义消息receiver声明 -->
<receiver android:name="com.gh.gamecenter.receiver.MeizuPushReceiver">
<receiver android:name="com.gh.gamecenter.receiver.UmengMeizuPushReceiver">
<intent-filter>
<!-- 接收push消息 -->
<action android:name="com.meizu.flyme.push.intent.MESSAGE" />
@ -571,10 +623,49 @@
</intent-filter>
</receiver>
<service android:name="com.gh.base.GHUmengNotificationService" />
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="@string/huawei_push_appid" />
<service
android:name="com.gh.base.GHUmengNotificationService"
android:permission="android.permission.BIND_JOB_SERVICE" />
<!--<service android:name = "com.gh.gamecenter.statistics.AppStaticService" />-->
<!-- 梦工厂配置 开始 -->
<!--<meta-data
android:name="MGC_APPID"
android:value="1001276" />
<provider
android:name="com.leto.game.base.provider.LetoFileProvider"
android:authorities="${applicationId}.leto.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/leto_file_path"
tools:replace="android:resource" />
</provider>-->
<!-- 梦工厂配置 结束 -->
<!-- 穿山甲配置 开始 -->
<!--<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />-->
<!-- 穿山甲配置 结束 -->
</application>
</manifest>

View File

@ -6,13 +6,16 @@
<link rel="stylesheet" type="text/css" href="normalize.css">
<link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" type="text/css" href="video-js.min.css">
<!-- <link rel="stylesheet" href="https://static-web.ghzs.com/website-static/lib/video-js.min.css">--> <!--在web页面播放视频-->
<!--<link rel="stylesheet" type="text/css" href="https://resource.ghzs.com/css/halo_app.css">-->
</head>
<body>
<body style="overflow-x: hidden; word-break: break-all;">
<div id="editor" contenteditable="false"></div>
<script type="text/javascript" src="zepto.min.js"></script>
<script type="text/javascript" src="rich_editor.js"></script>
<script type="text/javascript" src="video.min.js"></script>
<!--<script src="https://static-web.ghzs.com/website-static/lib/video.min.js"></script>--> <!--在web页面播放视频-->
<!--<script type="text/javascript" src="content.js"></script>-->
<!--<script type="text/javascript" src="https://resource.ghzs.com/js/halo_app.js"></script>-->
</body>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -624,3 +624,18 @@ function customLinkgo(self) {
// console.log(datas)
window.OnLinkClickListener.onClick(datas)
}
// 在web页面播放视频
//RE.initArticleVideo = function(){
// initArticleVideo()
//}
function showNativeDialog(title, message, positive, negative, callback) {
var jsCallbackCode = "(" + function (v) {
window.onNativeDialogCallback(v);
delete window.onNativeDialogCallback;
}.toString() + ")";
window.onNativeDialogCallback = callback;
window.NativeCallBack.showDialog(title, message, positive, negative, jsCallbackCode);
}

View File

@ -0,0 +1,159 @@
/*
* Copyright 2018 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.
*/
package androidx.swiperefreshlayout.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.View;
import android.view.animation.Animation;
import android.widget.ImageView;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
/**
* Private class created to work around issues with AnimationListeners being
* called before the animation is actually complete and support shadows on older
* platforms.
*/
class CircleImageView extends ImageView {
private static final int KEY_SHADOW_COLOR = 0x1E000000;
private static final int FILL_SHADOW_COLOR = 0x3D000000;
// PX
private static final float X_OFFSET = 0f;
private static final float Y_OFFSET = 1.75f;
private static final float SHADOW_RADIUS = 3.5f;
private static final int SHADOW_ELEVATION = 4;
private Animation.AnimationListener mListener;
int mShadowRadius;
CircleImageView(Context context, int color) {
super(context);
final float density = getContext().getResources().getDisplayMetrics().density;
final int shadowYOffset = (int) (density * Y_OFFSET);
final int shadowXOffset = (int) (density * X_OFFSET);
mShadowRadius = (int) (density * SHADOW_RADIUS);
ShapeDrawable circle;
if (elevationSupported()) {
circle = new ShapeDrawable(new OvalShape());
ViewCompat.setElevation(this, SHADOW_ELEVATION * density);
} else {
OvalShape oval = new OvalShadow(mShadowRadius);
circle = new ShapeDrawable(oval);
setLayerType(View.LAYER_TYPE_SOFTWARE, circle.getPaint());
circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset,
KEY_SHADOW_COLOR);
final int padding = mShadowRadius;
// set padding so the inner image sits correctly within the shadow.
setPadding(padding, padding, padding, padding);
}
circle.getPaint().setColor(color);
ViewCompat.setBackground(this, circle);
}
private boolean elevationSupported() {
return android.os.Build.VERSION.SDK_INT >= 21;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (!elevationSupported()) {
setMeasuredDimension(getMeasuredWidth() + mShadowRadius * 2, getMeasuredHeight()
+ mShadowRadius * 2);
}
}
public void setAnimationListener(Animation.AnimationListener listener) {
mListener = listener;
}
@Override
public void onAnimationStart() {
super.onAnimationStart();
if (mListener != null) {
mListener.onAnimationStart(getAnimation());
}
}
@Override
public void onAnimationEnd() {
super.onAnimationEnd();
if (mListener != null) {
mListener.onAnimationEnd(getAnimation());
}
}
/**
* Update the background color of the circle image view.
*
* @param colorRes Id of a color resource.
*/
public void setBackgroundColorRes(int colorRes) {
setBackgroundColor(ContextCompat.getColor(getContext(), colorRes));
}
@Override
public void setBackgroundColor(int color) {
if (getBackground() instanceof ShapeDrawable) {
((ShapeDrawable) getBackground()).getPaint().setColor(color);
}
}
private class OvalShadow extends OvalShape {
private RadialGradient mRadialGradient;
private Paint mShadowPaint;
OvalShadow(int shadowRadius) {
super();
mShadowPaint = new Paint();
mShadowRadius = shadowRadius;
updateRadialGradient((int) rect().width());
}
@Override
protected void onResize(float width, float height) {
super.onResize(width, height);
updateRadialGradient((int) width);
}
@Override
public void draw(Canvas canvas, Paint paint) {
final int viewWidth = CircleImageView.this.getWidth();
final int viewHeight = CircleImageView.this.getHeight();
canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2, mShadowPaint);
canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2 - mShadowRadius, paint);
}
private void updateRadialGradient(int diameter) {
mRadialGradient = new RadialGradient(diameter / 2, diameter / 2,
mShadowRadius, new int[] { FILL_SHADOW_COLOR, Color.TRANSPARENT },
null, Shader.TileMode.CLAMP);
mShadowPaint.setShader(mRadialGradient);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +1,34 @@
package com.gh.base;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import com.gh.base.fragment.BaseFragment;
import com.gh.common.constant.Constants;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.MtaHelper;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.PackageInstaller;
import com.gh.common.util.RunningUtils;
import com.gh.common.util.ShareUtils;
import com.gh.common.util.StringUtils;
@ -33,8 +49,6 @@ import org.json.JSONObject;
import java.lang.ref.WeakReference;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import butterknife.ButterKnife;
import pub.devrel.easypermissions.EasyPermissions;
@ -93,8 +107,8 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
ButterKnife.bind(this);
if (useEventBus()) EventBus.getDefault().register(this);
if (useButterKnife()) ButterKnife.bind(this);
mEntrance = getIntent().getStringExtra(KEY_ENTRANCE);
if (TextUtils.isEmpty(mEntrance)) {
mEntrance = Constants.ENTRANCE_UNKNOWN;
@ -105,9 +119,18 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
}
}
@SuppressWarnings("ConstantConditions")
@Override
public void setContentView(View view) {
if (BuildConfig.DEBUG || BuildConfig.BUILD_TIME != 0) {
view = getRootViewWithEnvIndicator(view);
}
super.setContentView(view);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
if (useEventBus()) EventBus.getDefault().unregister(this);
mBaseHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
@ -124,21 +147,55 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
String icon,
String shareTitle,
String shareSummary,
ShareUtils.ShareType shareType) {
ShareUtils.ShareEntrance shareEntrance, String id) {
ShareUtils.getInstance(this).showShareWindows(this,
getWindow().getDecorView(),
url,
icon,
shareTitle,
shareSummary,
shareType);
if (shareType == ShareUtils.ShareType.game || shareType == ShareUtils.ShareType.plugin) {
shareEntrance, id);
if (shareEntrance == ShareUtils.ShareEntrance.game || shareEntrance == ShareUtils.ShareEntrance.plugin) {
MtaHelper.onEvent("内容分享", "内容分享", shareTitle + shareSummary);
} else {
MtaHelper.onEvent("内容分享", "内容分享", shareTitle);
}
}
private View getRootViewWithEnvIndicator(View view) {
RelativeLayout screenRootView = new RelativeLayout(this);
screenRootView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
LinearLayout ll = new LinearLayout(this);
TextView tv = new TextView(this);
String envText = "正式环境";
if (BuildConfig.FLAVOR.equals("internal")) {
envText = "测试环境";
}
tv.setText(envText);
tv.setGravity(Gravity.CENTER);
tv.setTextColor(Color.WHITE);
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
tv.setBackground(ContextCompat.getDrawable(this, R.color.red));
tv.measure(0, 0);
tv.setAlpha(0.15F);
int height = tv.getMeasuredHeight();
int width = tv.getMeasuredWidth();
tv.setPadding(DisplayUtils.dip2px(20), 0, DisplayUtils.dip2px(20), 0);
ll.setTranslationX(DisplayUtils.dip2px(20));
ll.setRotation(45);
ll.addView(tv);
ll.setPadding(0, (width - height) / 2, 0, (width - height) / 2);
screenRootView.addView(view);
screenRootView.addView(ll);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) ll.getLayoutParams();
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
return screenRootView;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(final EBShowDialog showDialog) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)
@ -150,7 +207,7 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
if (FileUtils.isEmptyFile(showDialog.getPath())) {
toast(R.string.install_failure_hint);
} else {
startActivity(PackageUtils.getUninstallIntent(BaseActivity.this, showDialog.getPath()));
PackageInstaller.uninstall(BaseActivity.this, showDialog.getPath());
}
});
} else if (LOGIN_EXCEPTION.equals(showDialog.getType())) {
@ -180,6 +237,11 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
super.onPause();
if (isFinishing()) {
onFinish();
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment.isAdded() && fragment instanceof BaseFragment) {
((BaseFragment) fragment).onParentActivityFinish();
}
}
}
}
@ -187,13 +249,12 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
protected void onResume() {
super.onResume();
}
/**
* 可凭借此回调确定当前 activity 已经执行了 finish() 处于 isFinishing 状态
* 可在后续进行
* 此回调可用于确认当前 activity 已经执行了 finish() 方法并处于 isFinishing 状态
*/
protected void onFinish() {
}
@Override
@ -246,4 +307,22 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
return StringUtils.buildString(entrance, "+(", path, ")");
}
protected boolean useEventBus() {
return true;
}
protected boolean useButterKnife() {
return true;
}
@Override
public Resources getResources() {
Resources resources = super.getResources();
if (resources.getConfiguration().fontScale != 1.0f) {
Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1.0f;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
}

View File

@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.gh.base.adapter.FragmentAdapter;
import com.gh.base.fragment.BaseFragment_TabLayout;
import com.gh.common.view.TabIndicatorView;
import com.gh.gamecenter.R;
import com.google.android.material.tabs.TabLayout;
@ -45,7 +46,7 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements
protected abstract void initTabTitleList(List<String> tabTitleList);
protected int provideIndicatorWidth() {
return 65;
return 20;
}
protected View provideTabView(int position, String tabTitle) {
@ -89,11 +90,14 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
TabLayout.Tab tab = mTabLayout.getTabAt(i);
if (tab == null) continue;
View tabView = provideTabView(i, tab.getText() != null ? tab.getText().toString() : "");
if (tabView == null) continue;
String tabTitle = tab.getText() != null ? tab.getText().toString() : "";
View tabView = provideTabView(i, tabTitle);
if (tabView == null)
tabView = BaseFragment_TabLayout.createDefaultTabCustomView(tabTitle);
tab.setCustomView(tabView);
}
BaseFragment_TabLayout.initTabStyle(mTabLayout, mCheckedIndex);
}
@Override

View File

@ -9,6 +9,7 @@ import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.webkit.JavascriptInterface
import android.widget.TextView
import butterknife.OnClick
import com.gh.common.util.DialogUtils
import com.gh.common.util.MtaHelper
@ -16,6 +17,7 @@ import com.gh.common.view.RichEditor
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.MyVideoEntity
import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity
import com.gh.gamecenter.qa.editor.GameActivity
import com.gh.gamecenter.qa.editor.InsertAnswerWrapperActivity
import com.gh.gamecenter.qa.editor.InsertArticleWrapperActivity
@ -31,7 +33,9 @@ import kotterknife.bindView
abstract class BaseRichEditorActivity : ToolBarActivity() {
val mRichEditor by bindView<RichEditor>(R.id.rich_editor)
val mDraftBtn by bindView<TextView>(R.id.draft_btn)
private val mEditorTextNumTv by bindView<TextView>(R.id.editorTextNumTv)
private val mEditorFont by bindView<CheckableImageView>(R.id.editor_font)
private val mEditorLink by bindView<CheckableImageView>(R.id.editor_link)
private val mEditorParagraph by bindView<CheckableImageView>(R.id.editor_paragraph)
@ -86,7 +90,12 @@ abstract class BaseRichEditorActivity : ToolBarActivity() {
// 防止个别手机在Js里无法获取粘贴内容
mRichEditor.addJavascriptInterface(OnPasteListener(), "onPasteListener")
mRichEditor.addJavascriptInterface(OnCursorChangeListener(), "OnCursorChangeListener")
mRichEditor.addJavascriptInterface(OnEditorTextChangeListener(), "OnEditorTextChangeListener")
mRichEditor.setInputEnabled(true)
mDraftBtn.text = if (this is AnswerEditActivity) {
"回答草稿"
} else "文章草稿"
}
@OnClick(R.id.editor_image, R.id.editor_font, R.id.editor_link, R.id.editor_paragraph,
@ -251,6 +260,14 @@ abstract class BaseRichEditorActivity : ToolBarActivity() {
}
}
private inner class OnEditorTextChangeListener {
@JavascriptInterface
fun onTextChange(count: Int) {
val num = if (count > MAX_INPUT_TEXT_NUM) MAX_INPUT_TEXT_NUM - count else count
mEditorTextNumTv.text = num.toString()
}
}
abstract fun mtaEventName(): String
companion object {
@ -266,5 +283,6 @@ abstract class BaseRichEditorActivity : ToolBarActivity() {
const val INSERT_ANSWER_CODE = 411
const val INSERT_ARTICLE_CODE = 412
const val INSERT_GAME_CODE = 413
const val MAX_INPUT_TEXT_NUM = 10000
}
}

View File

@ -65,7 +65,9 @@ public class GHActivityLifecycleCallbacksImpl implements ActivityLifecycleCallba
@Override
public void onActivityDestroyed(Activity activity) {
AppManager.getInstance().finishActivity(activity);
if (activity.isFinishing()) {
AppManager.getInstance().finishActivity(activity);
}
}
}

View File

@ -12,11 +12,9 @@ import android.preference.PreferenceManager
import android.text.TextUtils
import android.view.View
import androidx.core.app.NotificationCompat
import androidx.core.text.htmlEncode
import com.gh.common.notifier.Notifier
import com.gh.common.util.EntranceUtils
import com.gh.common.util.MtaHelper
import com.gh.common.util.StringUtils
import com.gh.common.util.toObject
import com.gh.common.util.*
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.PushEntity
import com.gh.gamecenter.entity.PushMessageEntity
@ -97,7 +95,7 @@ class GHUmengNotificationService : UmengMessageService() {
// 用户未登录的情况下不生成消息中心通知,避免用户掉登录了还收到跳转至消息中心的通知
if (data != null
&& data.link?.target == "system"
&& data.link?.link == "system"
&& !UserManager.getInstance().isLoggedIn) {
return
}
@ -132,7 +130,7 @@ class GHUmengNotificationService : UmengMessageService() {
.setSmallIcon(R.drawable.ic_notification)
.setTicker(pushData.body?.ticker)
.setContentTitle(pushData.body?.title)
.setContentText(pushData.body?.text)
.setContentText(pushData.body?.text?.fromHtml())
.setContentIntent(clickPendingIntent)
.setDeleteIntent(deletePendingIntent)
.build()

View File

@ -3,7 +3,6 @@ package com.gh.base;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
@ -12,12 +11,17 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.MtaHelper;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.DownloadManagerActivity;
import com.gh.gamecenter.R;
@ -34,13 +38,6 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
/**
* 需要用到工具栏的页面使用
* <p>
@ -52,6 +49,8 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon
@Nullable
private PackageViewModel mPackageViewModel;
protected View mToolbarContainer;
protected Toolbar mToolbar;
protected TextView mTitleTv;
@ -62,7 +61,6 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarDarkMode(true, this);
initToolbar();
@ -88,6 +86,7 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon
}
private void initToolbar() {
mToolbarContainer = findViewById(R.id.normal_toolbar_container);
mToolbar = findViewById(R.id.normal_toolbar);
mTitleTv = findViewById(R.id.normal_title);
if (mToolbar != null) {
@ -239,7 +238,7 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.menu_download) {
MtaHelper.onEvent("下载管理", "下载管理入口", getActivityNameInChinese());
// MtaHelper.onEvent("下载管理", "下载管理入口", getActivityNameInChinese());
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(this, mEntrance);
startActivity(intent);
}
@ -253,4 +252,11 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon
protected boolean showDownloadMenu() {
return false;
}
@Override
public void hideToolbar(boolean isHide) {
if (mToolbarContainer != null) {
mToolbarContainer.setVisibility(isHide ? View.GONE : View.VISIBLE);
}
}
}

View File

@ -9,9 +9,20 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.RecyclerView;
import com.gh.base.OnListClickListener;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.constant.Constants;
import com.gh.common.syncpage.ISyncAdapterHandler;
import com.gh.common.syncpage.SyncDataEntity;
import com.gh.common.syncpage.SyncPageRepository;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.eventbus.EBMiPush;
import com.lightgame.OnTitleClickListener;
@ -23,18 +34,14 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import butterknife.ButterKnife;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import kotlin.Pair;
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
@ -138,9 +145,55 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
} else {
mCachedView = View.inflate(getContext(), getLayoutId(), null);
}
ButterKnife.bind(this, mCachedView);
if (useButterKnife()) {
ButterKnife.bind(this, mCachedView);
}
initView(mCachedView);
if (addSyncPageObserver()) {
initSyncPageObserver();
}
}
private void initSyncPageObserver() {
SyncPageRepository.INSTANCE.getSyncPageLiveData().observe(this, syncDataEntities -> {
try {
Utils.log("SyncPageRepository initSyncPageObserver->" + syncDataEntities);
List<SyncDataEntity> readyRemoveList = new ArrayList<>();
if (syncDataEntities == null || syncDataEntities.isEmpty()) return;
RecyclerView.Adapter adapter = provideSyncAdapter();
if (!(adapter instanceof ISyncAdapterHandler)) return;
for (int i = 0; i < adapter.getItemCount(); i++) {
Pair<String, Object> syncKey = ((ISyncAdapterHandler) adapter).getSyncData(i);
if (syncKey == null) continue;
for (SyncDataEntity syncDataEntity : syncDataEntities) {
if (syncDataEntity.getSyncId().equals(syncKey.getFirst())) {
boolean isSuccess = SyncPageRepository.INSTANCE.handleSyncData(syncKey.getSecond(), syncDataEntity);
if (isSuccess) {
if (BuildConfig.DEBUG) {
Utils.log("SyncPageRepository notify position->" + i);
}
adapter.notifyItemChanged(i);
if (syncDataEntity.getRemove()) {
readyRemoveList.add(syncDataEntity);
}
}
}
}
}
mBaseHandler.postDelayed(() -> SyncPageRepository.removeSyncData(readyRemoveList), 2000);
} catch (Exception e) {
if (BuildConfig.DEBUG) {
throw e;
} else {
e.printStackTrace();
}
}
});
}
// 必须的有subscribe才能register
@ -158,6 +211,13 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
return mCachedView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
mCachedView = null;
}
@Override
public void onResume() {
super.onResume();
@ -183,11 +243,7 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
}
public void toast(String msg) {
try {
Utils.toast(getContext(), msg);
} catch (Exception ignore) {
}
Utils.toast(getContext(), msg);
}
public void toastLong(@StringRes int msg) {
@ -255,4 +311,20 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
return this;
}
public void onParentActivityFinish() {
}
@Nullable
protected RecyclerView.Adapter provideSyncAdapter() {
return null;
}
protected boolean addSyncPageObserver() {
return false;
}
protected boolean useButterKnife() {
return true;
}
}

View File

@ -1,18 +1,28 @@
package com.gh.base.fragment;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.tabs.TabLayout;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.TextView;
import com.gh.base.adapter.FragmentAdapter;
import com.gh.common.view.TabIndicatorView;
import com.gh.gamecenter.R;
import com.gh.gamecenter.normal.NormalFragment;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Utils;
import com.lightgame.view.NoScrollableViewPager;
import java.util.ArrayList;
@ -46,7 +56,7 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
protected abstract void initTabTitleList(List<String> tabTitleList);
protected int provideIndicatorWidth() {
return 65;
return 20;
}
protected View provideTabView(int position, String tabTitle) {
@ -94,11 +104,71 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
TabLayout.Tab tab = mTabLayout.getTabAt(i);
if (tab == null) continue;
View tabView = provideTabView(i, tab.getText() != null ? tab.getText().toString() : "");
if (tabView == null) continue;
String tabTitle = tab.getText() != null ? tab.getText().toString() : "";
View tabView = provideTabView(i, tabTitle);
if (tabView == null) tabView = createDefaultTabCustomView(tabTitle);
tab.setCustomView(tabView);
}
initTabStyle(mTabLayout, mCheckedIndex);
}
public static void initTabStyle(TabLayout tabLayout, int currentItem) {
// 默认选择addOnTabSelectedListener不会回调
int tabCount = tabLayout.getTabCount();
if (tabCount > 0) {
TabLayout.Tab tab = tabLayout.getTabAt(currentItem);
if (tab != null) updateTabStyle(tab, true);
}
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
updateTabStyle(tab, true);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
updateTabStyle(tab, false);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
updateTabStyle(tab, true);
}
});
}
private static void updateTabStyle(TabLayout.Tab tab, boolean isChecked) {
View tabView = tab.getCustomView();
if (tabView == null) {
Utils.log("TabLayout->Tab样式不是通用样式,请检查");
return;
}
TextView tabTitle;
if (tabView instanceof TextView) {
tabTitle = (TextView) tabView;
} else {
tabTitle = tabView.findViewById(R.id.tab_title);
}
if (tabTitle == null) {
Utils.log("TabLayout->Tab样式不是通用样式,请检查");
return;
}
tabTitle.setTypeface(isChecked ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
}
// 如果不设置View的话无法动态设置字体样式
@NonNull
public static View createDefaultTabCustomView(String title) {
View view = LayoutInflater.from(HaloApp.getInstance().getApplication().getBaseContext()).inflate(R.layout.tab_item, null);
View tabTitle = view.findViewById(R.id.tab_title);
if (tabTitle instanceof CheckedTextView) {
((CheckedTextView) tabTitle).setText(title);
}
return view;
}
@Override

View File

@ -2,6 +2,7 @@ package com.gh.base.fragment
import android.os.Bundle
import com.gh.gamecenter.normal.NormalFragment
import com.lightgame.utils.Utils
/**
* 懒加载(支持多层嵌套)
@ -12,10 +13,10 @@ abstract class BaseLazyFragment : NormalFragment() {
private var isViewCreated = false
private var isSupportVisible = false
protected var isSupportVisible = false
/**
* 用于分发可见时间的时候获取 fragment 是否隐藏
* 用于分发可见时间的时候获取 fragment 是否隐藏
*
* @return true fragment 不可见, false 父 fragment 可见
*/
@ -104,7 +105,7 @@ abstract class BaseLazyFragment : NormalFragment() {
isSupportVisible = visible
if (visible) {
if (mIsFirstVisible) {
if (mIsFirstVisible && view != null) {
mIsFirstVisible = false
onFragmentFirstVisible()
}

View File

@ -0,0 +1,107 @@
package com.gh.base.fragment
import android.content.Intent
import android.graphics.Typeface
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
import butterknife.BindView
import com.gh.base.adapter.FragmentAdapter
import com.gh.common.view.TabIndicatorView
import com.gh.gamecenter.R
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import com.lightgame.utils.Utils
import com.lightgame.view.NoScrollableViewPager
abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeListener {
@BindView(R.id.fragment_tab_layout)
lateinit var mTabLayout: TabLayout
@BindView(R.id.fragment_view_pager)
lateinit var mViewPager: NoScrollableViewPager
@BindView(R.id.fragment_tab_indicator)
lateinit var mTabIndicatorView: TabIndicatorView
var mFragmentsList: MutableList<Fragment> = arrayListOf()
var mTabTitleList: MutableList<String> = arrayListOf()
var mCheckedIndex = 0
abstract fun initFragmentList(fragments: MutableList<Fragment>)
abstract fun initTabTitleList(tabTitleList: MutableList<String>)
protected open fun provideIndicatorWidth(): Int {
return 20
}
protected open fun provideTabView(position: Int, tabTitle: String?): View? {
return null
}
override fun getLayoutId(): Int {
return R.layout.fragment_tablayout_viewpager
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val fragments = childFragmentManager.fragments
if (fragments != null) {
for (fragment in fragments) {
fragment.onActivityResult(requestCode, resultCode, data)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) mCheckedIndex = requireArguments().getInt(PAGE_INDEX, 0)
}
open fun providePagerAdapter(): PagerAdapter? {
return null
}
override fun onFragmentFirstVisible() {
super.onFragmentFirstVisible()
initFragmentList(mFragmentsList)
initTabTitleList(mTabTitleList)
mViewPager.offscreenPageLimit = mFragmentsList.size
mViewPager.addOnPageChangeListener(this)
mViewPager.adapter = providePagerAdapter()
?: FragmentAdapter(childFragmentManager, mFragmentsList, mTabTitleList)
mViewPager.currentItem = mCheckedIndex
mTabLayout.setupWithViewPager(mViewPager)
mTabIndicatorView.setupWithTabLayout(mTabLayout)
mTabIndicatorView.setupWithViewPager(mViewPager)
mTabIndicatorView.setIndicatorWidth(provideIndicatorWidth())
for (i in 0 until mTabLayout.tabCount) {
val tab = mTabLayout.getTabAt(i) ?: continue
val tabTitle = if (tab.text != null) tab.text.toString() else ""
var tabView = provideTabView(i, tabTitle)
if (tabView == null) tabView = BaseFragment_TabLayout.createDefaultTabCustomView(tabTitle)
tab.customView = tabView
}
BaseFragment_TabLayout.initTabStyle(mTabLayout, mCheckedIndex)
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {}
override fun onPageScrollStateChanged(state: Int) {}
companion object {
const val PAGE_INDEX = "PAGE_INDEX"
}
}

View File

@ -5,7 +5,9 @@ import android.os.Looper
import com.gh.common.AppExecutor.ioExecutor
import com.gh.common.AppExecutor.lightWeightIoExecutor
import com.gh.common.AppExecutor.uiExecutor
import java.util.concurrent.*
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.Executor
import java.util.concurrent.Executors
/**
* APP 线程池管理类
@ -18,11 +20,13 @@ import java.util.concurrent.*
object AppExecutor {
@JvmStatic
var uiExecutor = MainThreadExecutor()
val uiExecutor by lazy { MainThreadExecutor() }
@JvmStatic
var lightWeightIoExecutor = Executors.newSingleThreadExecutor()
val lightWeightIoExecutor by lazy { Executors.newSingleThreadExecutor() }
@JvmStatic
var ioExecutor = Executors.newCachedThreadPool()
val ioExecutor = Executors.newCachedThreadPool() // 用 by lazy 可能影响初始化速度
val cachedScheduler by lazy { Schedulers.from(ioExecutor) }
class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())

View File

@ -4,11 +4,15 @@ import android.annotation.SuppressLint
import android.content.Context
import android.webkit.JavascriptInterface
import androidx.annotation.Keep
import androidx.appcompat.app.AppCompatActivity
import com.gh.base.CurrentActivityHolder
import com.gh.common.util.*
import com.gh.common.view.dsbridge.CompletionHandler
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.ImageViewerActivity
import com.gh.gamecenter.LoginActivity
import com.gh.gamecenter.ViewImageActivity
import com.gh.gamecenter.entity.Badge
import com.gh.gamecenter.entity.MtaEvent
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.retrofit.RetrofitManager
@ -21,7 +25,6 @@ import io.reactivex.schedulers.Schedulers
import okhttp3.ResponseBody
import org.json.JSONObject
import retrofit2.HttpException
import wendu.dsbridge.CompletionHandler
class DefaultJsApi(var context: Context) {
@ -68,7 +71,6 @@ class DefaultJsApi(var context: Context) {
userInfoEntity.badge = null
}
UserManager.getInstance().userInfoEntity = userInfoEntity
AppDatabase.getInstance(context).userInfoDao().updateUserInfo(userInfoEntity)
}
@JavascriptInterface
@ -76,6 +78,11 @@ class DefaultJsApi(var context: Context) {
return HaloApp.getInstance().channel
}
@JavascriptInterface
fun getAppVersion(msg: Any): String {
return BuildConfig.VERSION_NAME
}
@JavascriptInterface
fun bindWechat(msg: Any, handler: CompletionHandler<Any>) {
context.ifLogin("浏览器") {
@ -132,7 +139,21 @@ class DefaultJsApi(var context: Context) {
val context = CurrentActivityHolder.getCurrentActivity()
context?.startActivity(ViewImageActivity.getViewImageIntent(context, imageEvent.imageList, imageEvent.position, "浏览器"))
context?.startActivity(ImageViewerActivity.getIntent(context, imageEvent.imageList, imageEvent.position, "浏览器"))
}
@JavascriptInterface
fun isInstalled(event: Any): String {
val localInstalledPackageList = PackageUtils.getAllPackageName(HaloApp.getInstance().application)
val packageNameList: ArrayList<String> = event.toString().toObject() ?: ArrayList()
for (packageName in packageNameList) {
if (!localInstalledPackageList.contains(packageName)) {
return "false"
}
}
return "true"
}
@JavascriptInterface
@ -141,11 +162,13 @@ class DefaultJsApi(var context: Context) {
Base64ImageHolder.image = event.toString()
context?.startActivity(ViewImageActivity.getBase64ViewImageIntent(context, true))
context?.startActivity(ImageViewerActivity.getBase64Intent(context, true))
}
@Keep
internal data class MtaEvent(var name: String = "", var key: String = "", var value: String = "")
@JavascriptInterface
fun openNotificationSetting(msg: Any){
NotificationHelper.show(context as AppCompatActivity)
}
@Keep
internal data class ImageEvent(var imageList: ArrayList<String> = arrayListOf(), var position: Int = 0)

View File

@ -0,0 +1,338 @@
package com.gh.common
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.text.TextUtils
import com.gh.common.util.*
import com.gh.common.util.DirectUtils.directToGameDetailVideoStreaming
import com.gh.common.util.DirectUtils.directToGameVideo
import com.gh.common.util.DirectUtils.directToVideoDetail
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.*
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.entity.SimpleGameEntity
import com.gh.gamecenter.entity.SubjectRecommendEntity
import com.gh.gamecenter.entity.VideoLinkEntity
import com.gh.gamecenter.subject.SubjectActivity
import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel
import com.lightgame.utils.Utils
object DefaultUrlHandler {
@JvmStatic
fun interceptUrl(context: Context, url: String, entrance: String): Boolean {
val uri = Uri.parse(url)
if ("ghzhushou" == uri.scheme) {
Utils.log("url = $url")
Utils.log("url = " + uri.scheme!!)
val host = uri.host
val path = uri.path
var id = ""
if (!TextUtils.isEmpty(path)) {
id = path!!.substring(1)
}
val intent: Intent
when (host) {
"article" -> context.startActivity(NewsDetailActivity.getIntentById(context, id, entrance))
"game" -> GameDetailActivity.startGameDetailActivity(context, id, "libao" == uri.getQueryParameter("to"), entrance)
"column" -> SubjectActivity.startSubjectActivity(context, id, uri.getQueryParameter("name"), false, entrance)
"libao" -> context.startActivity(LibaoDetailActivity.getIntentById(context, id, entrance))
"qq" -> try {
DirectUtils.directToQqConversation(context, id)
} catch (e: Throwable) {
Utils.toast(context, "请检查是否已经安装手机QQ")
e.printStackTrace()
}
EntranceUtils.HOST_QQ_QUN -> {
val key = uri.getQueryParameter("key")
if (!DirectUtils.directToQqGroup(context, key)) {
Utils.toast(context, "请检查是否已经安装手机QQ")
}
}
"inurl" -> {
intent = Intent(context, WebActivity::class.java)
intent.putExtra(EntranceUtils.KEY_URL, uri.getQueryParameter("url"))
context.startActivity(intent)
}
"outurl" -> {
intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse(uri.getQueryParameter("url"))
try {
context.startActivity(intent)
} catch (e: Exception) {
Utils.toast(context, "请检查是否已经安装手机浏览器")
e.printStackTrace()
}
}
"question" -> DirectUtils.directToQuestionDetail(context, id, entrance, "文章链接")
"community" -> {
val community = CommunityEntity()
community.id = id
community.name = uri.getQueryParameter("name") ?: ""
DirectUtils.directToCommunity(context, community)
}
"community_column" -> {
val community = CommunityEntity()
community.id = uri.getQueryParameter("community_id") ?: ""
community.name = uri.getQueryParameter("community_name") ?: ""
val columnId = uri.getQueryParameter("column_id") ?: ""
DirectUtils.directToCommunityColumn(context, community, columnId, entrance, "文章链接")
}
"answer" -> DirectUtils.directToAnswerDetail(context, id, entrance, "文章链接")
"communities" -> {
// ghzhushou://communities/5a32405b2397ab000f688de3/articles/5c99d262c140b321564f04e3
var communityId = ""
var type = ""
var typeId = ""
val split = id.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (text in split) {
if (TextUtils.isEmpty(communityId)) {
communityId = text
continue
}
if (TextUtils.isEmpty(type)) {
type = text
continue
}
if (TextUtils.isEmpty(typeId)) {
typeId = text
}
}
if ("articles" == type) {
DirectUtils.directToCommunityArticle(
context, typeId, communityId,
entrance, "文章链接")
}
}
EntranceUtils.HOST_UPLOAD_VIDEO -> {
val titleParameter = uri.getQueryParameter("title")
val title = if (titleParameter.isNullOrEmpty()) "" else "#$titleParameter#"
val categoryId = uri.getQueryParameter("category_id") ?: ""
val link = uri.getQueryParameter("link") ?: ""
val linkEntity = VideoLinkEntity(title, categoryId, link)
val gameId = uri.getQueryParameter("gameId") ?: ""
val gameName = uri.getQueryParameter("gameName") ?: ""
val simpleGameEntity = SimpleGameEntity(gameId, gameName)
CheckLoginUtils.checkLogin(context, null, true, EntranceUtils.ENTRANCE_BROWSER) {
DirectUtils.directToVideoManager(context, linkEntity, simpleGameEntity, EntranceUtils.ENTRANCE_BROWSER, "")
}
}
EntranceUtils.HOST_USERHOME -> {
val position = uri.getQueryParameter("position")
DirectUtils.directToHomeActivity(context, id, if (position.isNullOrEmpty()) -1 else position.toInt(), entrance, "")
}
EntranceUtils.HOST_VIDEO_MORE -> {
val referer = uri.getQueryParameter("referer") ?: ""
val type = uri.getQueryParameter("type") ?: ""
val act = uri.getQueryParameter("act") ?: ""
val gameId = uri.getQueryParameter("gameId") ?: ""
val fieldId = uri.getQueryParameter("fieldId") ?: ""
val sectionName = uri.getQueryParameter("sectionName") ?: ""
val location = if (!TextUtils.isEmpty(act)) {
VideoDetailContainerViewModel.Location.VIDEO_ACTIVITY.value
} else if (!TextUtils.isEmpty(fieldId)) {
VideoDetailContainerViewModel.Location.GAME_ZONE.value
} else {
id
}
directToVideoDetail(context, id, location, false, gameId, entrance, "", referer, type, act, fieldId, sectionName)
}
EntranceUtils.HOST_VIDEO_SINGLE -> {
val referer = uri.getQueryParameter("referer") ?: ""
directToVideoDetail(context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value,
false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer)
}
EntranceUtils.HOST_VIDEO_STREAMING_HOME -> {
intent = Intent(context, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
intent.putExtra(MainActivity.SWITCH_TO_VIDEO, true)
context.startActivity(intent)
}
EntranceUtils.HOST_VIDEO_STREAMING_DESC -> {
directToGameDetailVideoStreaming(context, id, entrance)
}
EntranceUtils.HOST_VIDEO_COLLECTION -> {
directToGameVideo(context, id, entrance, "")
}
EntranceUtils.HOST_CATEGORY -> {
val title = uri.getQueryParameter("title")
DirectUtils.directCategoryDirectory(context, id, title ?: "", entrance, "")
}
EntranceUtils.HOST_COLUMN_COLLECTION -> {
val name = uri.getQueryParameter("name")
DirectUtils.directToColumnCollection(context, id, -1, entrance, name ?: "")
}
EntranceUtils.HOST_COLUMN -> {
DirectUtils.directToSubject(context, id, uri.getQueryParameter(EntranceUtils.KEY_NAME), entrance)
}
EntranceUtils.HOST_COMMUNITY_QUESTION_LABEL_DETAIL -> {
val community = CommunityEntity()
community.id = uri.getQueryParameter("community_id") ?: ""
community.name = uri.getQueryParameter("community_name") ?: ""
val tag = uri.getQueryParameter("tag") ?: ""
DirectUtils.directAskColumnLabelDetail(context, tag, community, entrance, "")
}
EntranceUtils.HOST_COMMUNITY_COLUMN_DETAIL -> {
val community = CommunityEntity()
community.id = uri.getQueryParameter("community_id") ?: ""
community.name = uri.getQueryParameter("community_name") ?: ""
val columnId = uri.getQueryParameter("column_id") ?: ""
DirectUtils.directAskColumnDetail(context, columnId, community, entrance, "")
}
EntranceUtils.HOST_BLOCK -> {
val name = uri.getQueryParameter("name")
?: ""
val entity = SubjectRecommendEntity(link = id, name = name, text = name)
DirectUtils.directToBlock(context, entity, entrance)
}
EntranceUtils.HOST_SERVER_BLOCK -> {
DirectUtils.directToGameServers(context, entrance = entrance, path = "")
}
EntranceUtils.HOST_AMWAY_BLOCK -> {
DirectUtils.directToAmway(context, entrance = entrance, path = "")
}
EntranceUtils.HOST_HELP -> {
val name = uri.getQueryParameter("name")
?: ""
DirectUtils.directToQa(context, name, id)
}
EntranceUtils.HOST_HELP_COLLECTION -> {
val name = uri.getQueryParameter("name")
?: ""
DirectUtils.directToQaCollection(context, name, id)
}
EntranceUtils.HOST_GAME_UPLOAD -> {
DirectUtils.directGameUpload(context, entrance = entrance, path = "")
}
EntranceUtils.HOST_GAME_ZONE -> {
val zoneUrl = uri.getQueryParameter("url") ?: ""
DirectUtils.directGameZone(context, id, zoneUrl, entrance)
}
else -> DialogUtils.showLowVersionDialog(context)
}
return true
} else if ("zhiqu" == uri.scheme) {
if (PackageUtils.isInstalled(context, "com.beieryouxi.zqyxh")) {
val intent = Intent()
intent.data = Uri.parse(url)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
} else {
Utils.toast(context, "请安装指趣游戏盒")
}
}
if (url.startsWith("alipays:") || url.startsWith("alipay")) {
try {
context.startActivity(Intent("android.intent.action.VIEW", Uri.parse(url)))
} catch (e: Exception) {
ToastUtils.showToast("请安装支付宝客户端")
}
return true
} else if (url.startsWith("weixin")) {
try {
context.startActivity(Intent("android.intent.action.VIEW", Uri.parse(url)))
} catch (e: Exception) {
ToastUtils.showToast("请安装微信客户端")
}
return true
} else if (url.startsWith("mqqwpa")) {
try {
context.startActivity(Intent("android.intent.action.VIEW", Uri.parse(url)))
} catch (e: Exception) {
ToastUtils.showToast("请安装QQ客户端")
}
return true
}
if ("http" != uri.scheme && "https" != uri.scheme) return true
return false
}
@JvmStatic
fun transformNormalScheme(context: Context, url: String, entrance: String): Boolean {
val uri = Uri.parse(url)
if (uri.host == "www.ghzs666.com" || uri.host == "www.ghzs.com" || uri.host == "ask.ghzs.com" || uri.host == "m.ghzs.com") {
Utils.log(uri.path)
uri.path?.apply {
when {
contains("game") -> {
val gameId = uri.getQueryParameter("gameId") ?: ""
DirectUtils.directToGameDetail(context, gameId, entrance, autoDownload = false, scrollToLibao = false, traceEvent = null)
}
contains("question") -> {
val questionId = split("/")[2]
val answerId = uri.getQueryParameter("answer")
if (answerId.isNullOrEmpty()) {
DirectUtils.directToQuestionDetail(context, questionId, entrance, "")
} else {
DirectUtils.directToAnswerDetail(context, answerId, entrance, "")
}
}
contains("communities") && contains("article") -> {
var communityId = ""
var type = ""
var typeId = ""
val split = replace("/communities", "").replace(".html", "").split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (text in split) {
if (TextUtils.isEmpty(communityId)) {
communityId = text
continue
}
if (TextUtils.isEmpty(type)) {
type = text
continue
}
if (TextUtils.isEmpty(typeId)) {
typeId = text
}
}
if ("articles" == type) {
DirectUtils.directToCommunityArticle(
context, typeId, communityId,
entrance, "文章链接")
}
}
contains("article") -> {
val articleId = split("/")[2].replace(".html", "")
DirectUtils.directToArticle(context, articleId, entrance)
}
contains("columns") -> {
val columnsId = split("/")[3]
val id = uri.getQueryParameter("communityId") ?: ""
val name = uri.getQueryParameter("communityName") ?: ""
DirectUtils.directToCommunityColumn(context, CommunityEntity(id, name), columnsId, entrance, "")
}
contains("zone") -> {
val gameId = split("/")[2]
DirectUtils.directGameZone(context, gameId, url, entrance)
}
}
}
return true
}
return false
}
}

View File

@ -1,136 +0,0 @@
package com.gh.common
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.text.TextUtils
import com.gh.common.util.CheckLoginUtils
import com.gh.common.util.DialogUtils
import com.gh.common.util.DirectUtils
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.LibaoDetailActivity
import com.gh.gamecenter.NewsDetailActivity
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.entity.VideoLinkEntity
import com.gh.gamecenter.subject.SubjectActivity
import com.lightgame.utils.Utils
object DefaultWebViewUrlHandler {
@JvmStatic
fun interceptUrl(context: Context, url: String, entrance: String): Boolean {
val uri = Uri.parse(url)
if ("ghzhushou" == uri.scheme) {
Utils.log("url = $url")
Utils.log("url = " + uri.scheme!!)
val host = uri.host
val path = uri.path
var id = ""
if (!TextUtils.isEmpty(path)) {
id = path!!.substring(1)
}
val intent: Intent
when (host) {
"article" -> context.startActivity(NewsDetailActivity.getIntentById(context, id, entrance))
"game" -> GameDetailActivity.startGameDetailActivity(context, id, "libao" == uri.getQueryParameter("to"), entrance)
"column" -> SubjectActivity.startSubjectActivity(context, id, uri.getQueryParameter("name"), false, entrance)
"libao" -> context.startActivity(LibaoDetailActivity.getIntentById(context, id, entrance))
"qq" -> try {
DirectUtils.directToQqConversation(context, id)
} catch (e: Exception) {
Utils.toast(context, "请检查是否已经安装手机QQ")
e.printStackTrace()
}
"qqqun" -> {
val key = uri.getQueryParameter("key")
if (!DirectUtils.directToQqGroup(context, key)) {
Utils.toast(context, "请检查是否已经安装手机QQ")
}
}
"inurl" -> {
intent = Intent(context, WebActivity::class.java)
intent.putExtra(EntranceUtils.KEY_URL, uri.getQueryParameter("url"))
context.startActivity(intent)
}
"outurl" -> {
intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse(uri.getQueryParameter("url"))
try {
context.startActivity(intent)
} catch (e: Exception) {
Utils.toast(context, "请检查是否已经安装手机浏览器")
e.printStackTrace()
}
}
"question" -> DirectUtils.directToQuestionDetail(context, id, entrance, "文章链接")
"community" -> {
val community = CommunityEntity()
community.id = id
community.name = uri.getQueryParameter("name")
DirectUtils.directToCommunity(context, community)
}
"answer" -> DirectUtils.directToAnswerDetail(context, id, entrance, "文章链接")
"communities" -> {
// ghzhushou://communities/5a32405b2397ab000f688de3/articles/5c99d262c140b321564f04e3
var communityId = ""
var type = ""
var typeId = ""
val split = id.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (text in split) {
if (TextUtils.isEmpty(communityId)) {
communityId = text
continue
}
if (TextUtils.isEmpty(type)) {
type = text
continue
}
if (TextUtils.isEmpty(typeId)) {
typeId = text
}
}
if ("articles" == type) {
DirectUtils.directToCommunityArticle(
context, typeId, communityId,
entrance, "文章链接")
}
}
EntranceUtils.HOST_UPLOAD_VIDEO -> {
val titleParameter = uri.getQueryParameter("title")
val title = if (titleParameter.isNullOrEmpty()) "" else "#$titleParameter#"
val categoryId = uri.getQueryParameter("category_id") ?: ""
val link = uri.getQueryParameter("link") ?: ""
val linkEntity = VideoLinkEntity(title, categoryId, link)
// if (!CheckLoginUtils.isLogin()) {
// HaloApp.put(EntranceUtils.HOST_UPLOAD_VIDEO, linkEntity)
// }
CheckLoginUtils.checkLogin(context, null, true, EntranceUtils.ENTRANCE_BROWSER) {
DirectUtils.directToVideoManager(context, linkEntity, EntranceUtils.ENTRANCE_BROWSER, "")
}
}
EntranceUtils.HOST_USERHOME -> {
val position = uri.getQueryParameter("position")
DirectUtils.directToHomeActivity(context, id, if(position.isNullOrEmpty()) -1 else position.toInt(), entrance, "")
}
else -> DialogUtils.showLowVersionDialog(context)
}
return true
}
if ("http" != uri.scheme && "https" != uri.scheme) return true
return false
}
}

View File

@ -0,0 +1,67 @@
package com.gh.common
import com.gh.common.exposure.ExposureManager
import com.gh.common.filter.RegionSettingHelper
import com.gh.common.loghub.LoghubUtils
import com.gh.common.util.doOnMainProcessOnly
import com.gh.common.videolog.VideoRecordUtils
import com.gh.gamecenter.entity.TimeEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import kotlin.concurrent.fixedRateTimer
object FixedRateJobHelper {
private const val CHECKER_PERIOD: Long = 60 * 1000L
private const val TIME_PERIOD: Long = 600 * 1000L
private const val LOGHUB_PERIOD: Long = 120 * 1000L
private const val EXPOSURE_PERIOD: Long = 300 * 1000L
private const val REGION_SETTING_PERIOD: Long = 300 * 1000L
private const val VIDEO_RECORD_PERIOD: Long = 60 * 1000L
private var mExecuteCount: Int = 0
var timeDeltaBetweenServerAndClient: Long = 0
@JvmStatic
fun begin() {
doOnMainProcessOnly {
fixedRateTimer("Global-Fixed-Rate-Timer", initialDelay = 100, period = CHECKER_PERIOD) {
// 时间校对10分钟一次
if ((mExecuteCount * CHECKER_PERIOD) % TIME_PERIOD == 0L) {
RetrofitManager.getInstance(HaloApp.getInstance().application).api.time
.subscribeOn(AppExecutor.cachedScheduler)
.subscribe(object : Response<TimeEntity>() {
override fun onResponse(response: TimeEntity?) {
val serverTime = response?.time
serverTime?.let { timeDeltaBetweenServerAndClient = it * 1000 - System.currentTimeMillis() }
}
})
}
// 提交曝光数据
if ((mExecuteCount * CHECKER_PERIOD) % EXPOSURE_PERIOD == 0L) {
ExposureManager.commitSavedExposureEvents(true)
}
// 提交普通 loghub 数据
if ((mExecuteCount * CHECKER_PERIOD) % LOGHUB_PERIOD == 0L) {
LoghubUtils.commitSavedLoghubEvents()
}
// 更新游戏屏蔽信息
if ((mExecuteCount * CHECKER_PERIOD) % REGION_SETTING_PERIOD == 0L) {
RegionSettingHelper.getRegionSetting()
}
// 提交视频浏览记录数据
if ((mExecuteCount * CHECKER_PERIOD) % VIDEO_RECORD_PERIOD == 0L) {
VideoRecordUtils.commitVideoRecord()
}
// ExposureUtils.logADownloadCompleteExposureEvent(GameEntity(id = mExecuteCount.toString(), name = "测试曝光上传"), platform = "", trace = null, downloadType = ExposureUtils.DownloadType.DOWNLOAD)
mExecuteCount++
}
}
}
}

View File

@ -8,6 +8,7 @@ import com.gh.common.exposure.meta.MetaUtil
import com.gh.common.util.edit
import com.gh.common.util.toJson
import com.gh.common.util.toObject
import com.gh.common.util.tryWithDefaultCatch
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.entity.AliasEntity
import com.gh.gamecenter.retrofit.RetrofitManager
@ -35,33 +36,29 @@ object PushManager {
@JvmStatic
fun init(channel: String) {
//初始化友盟推送
UMConfigure.init(mApplication,
Config.UMENG_APPKEY, channel,
UMConfigure.DEVICE_TYPE_PHONE,
Config.UMENG_MESSAGE_SECRET)
tryWithDefaultCatch {
//初始化友盟推送
UMConfigure.init(mApplication, Config.UMENG_APPKEY, channel, UMConfigure.DEVICE_TYPE_PHONE, Config.UMENG_MESSAGE_SECRET)
// 注册小米、华为和魅族通道
MiPushRegistar.register(mApplication, Config.MIPUSH_APPID, Config.MIPUSH_APPKEY)
HuaWeiRegister.register(mApplication)
MeizuRegister.register(mApplication, BuildConfig.MEIZUPUSH_APPID, BuildConfig.MEIZUPUSH_APPKEY)
val pushAgent = PushAgent.getInstance(mApplication)
//友盟推送
val pushAgent = PushAgent.getInstance(mApplication)
pushAgent.onAppStart() // 开启App统计
runOnIoThread { registerDevice() }
//注册推送服务每次调用register方法都会回调该接口
registerDevice()
// 注册小米、华为和魅族通道
MiPushRegistar.register(mApplication, Config.MIPUSH_APPID, Config.MIPUSH_APPKEY)
HuaWeiRegister.register(mApplication)
MeizuRegister.register(mApplication, BuildConfig.MEIZUPUSH_APPID, BuildConfig.MEIZUPUSH_APPKEY)
val aliasInSp = PreferenceManager.getDefaultSharedPreferences(mApplication).getString(SP_PUSH_ALIAS, "")
mPreviousAlias = aliasInSp?.toObject()
val aliasInSp = PreferenceManager.getDefaultSharedPreferences(mApplication).getString(SP_PUSH_ALIAS, "")
mPreviousAlias = aliasInSp?.toObject()
if (mPreviousAlias == null) {
getAndSetAlias()
if (mPreviousAlias == null) {
getAndSetAlias()
}
// 完全自定义处理(透传)
pushAgent.setPushIntentServiceClass(GHUmengNotificationService::class.java)
}
// 完全自定义处理(透传)
pushAgent.setPushIntentServiceClass(GHUmengNotificationService::class.java)
}
private fun registerDevice() {

View File

@ -6,6 +6,7 @@ import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import com.halo.assistant.HaloApp
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
/**
@ -113,7 +114,7 @@ class TimeElapsedHelper(val fragment: Fragment?, val activity: Activity?) {
}
object TimeElapsedThreadHolder {
val threadService = Executors.newSingleThreadExecutor()
val threadService: ExecutorService by lazy { Executors.newSingleThreadExecutor() }
}
interface TimeoutCallback {

View File

@ -0,0 +1,16 @@
package com.gh.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 标记那些不需要检查的同步字段
*
* 同步字段冲突时使用
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SyncIgnore {
}

View File

@ -0,0 +1,12 @@
package com.gh.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SyncPage {
String[] syncNames();
}

View File

@ -31,8 +31,7 @@ import io.reactivex.schedulers.Schedulers;
public class Config {
public static final String API_HOST = BuildConfig.API_HOST;
public static final String COMMENT_HOST = BuildConfig.COMMENT_HOST;
public static final String DATA_HOST = BuildConfig.DATA_HOST;
public static final String SENSITIVE_API_HOST = BuildConfig.SENSITIVE_API_HOST;
/**
* 需要配置的请使用{@link PreferenceManager#getDefaultSharedPreferences(Context)}
@ -50,6 +49,8 @@ public class Config {
public static final String UMENG_APPKEY = BuildConfig.UMENG_APPKEY;
public static final String UMENG_MESSAGE_SECRET = BuildConfig.UMENG_MESSAGE_SECRET;
public static final String BUGLY_APPID = BuildConfig.BUGLY_APPID;
public static final String LETO_APPID = BuildConfig.LETO_APPID;
public static final String TTAD_APPID = BuildConfig.TTAD_APPID;
// http://www.ghzs666.com/article/${articleId}.html
public static final String URL_ARTICLE = "http://www.ghzs666.com/article/"; // ghzs/ghzs666 统一
public static final String PATCHES = "patches";
@ -235,6 +236,10 @@ public class Config {
return false;
}
public static boolean isGameDomeSwitchOpen() {
return getSettings() != null && getSettings().getGameDomeSwitch().equals("on");
}
public static void fixHideFunction() {
SharedPreferences preferences = PreferenceManager.
getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
@ -249,7 +254,7 @@ public class Config {
public static void getGhzsSettings() {
String channel = HaloApp.getInstance().getChannel();
RetrofitManager.getInstance(HaloApp.getInstance().getApplication())
.getApi().getSettings(PackageUtils.getVersionName(), channel)
.getSensitiveApi().getSettings(PackageUtils.getVersionName(), channel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<SettingsEntity>() {

View File

@ -12,11 +12,12 @@ public class Constants {
public final static int NOT_NETWORK_CODE = 504; // 没有网络的状态码(应该是这个吧!)
public static final String LOGIN_TOKEN_ID = "userToken_id"; // 用户ID 与服务器无关
public static final String USER_TOKEN_KEY = "userTokenKey";
public static final String USER_INFO_KEY = "userInfoKey";
public static final String WELCOME_DIALOG_ID = "welcome_dialog_id";
public static final String WELCOME_DIALOG_LINK_TITLE = "welcome_dialog_link_title";
public static final String DEVICE_KEY = "deviceKey";
public static final String HAS_REQUESTED_NOTIFICATION_PERMISSIONS = "has_requested_notification_permissions";
@ -29,10 +30,27 @@ public class Constants {
public static final String EB_QUIT_LOGIN = "quit_login";
// 用于避免历史下载掺和到普通下载状态的 ID 修饰符
public static final String GAME_ID_DIVIDER = ":";
// 用于避免历史下载影响到部分依赖名字作为数据更新条件的修饰符
public static final String GAME_NAME_DECORATOR = " ";
// 游戏详情进入时的自定义栏目标签是否已经默认展开过一次的标记
public static final String SP_HAS_EXPANDED_GAME_DETAIL_TAGS = "has_expanded_game_detail_tags";
// 游戏详情进入时的自定义栏目标签是否已经显示过一次展开更多的浮窗提示
public static final String SP_HAS_SHOWN_EXPANDED_GAME_DETAIL_TAGS_HINT = "has_shown_expanded_game_detail_tags_hint";
// 最近显示的弹窗信息
public static final String SP_LAST_OPENING_ID = "last_opening_dialog_id";
public static final String SP_LAST_OPENING_TIME = "last_opening_dialog_time";
// 游戏图标和图标角标
public static final String RAW_GAME_ICON = "raw_game_icon";
public static final String GAME_ICON_SUBSCRIPT = "game_icon_subscript";
// 新用户首次启动光环的时间
public static final String SP_INITIAL_USAGE_TIME = "initial_usage_time";
//引导设置 “通知管理” 引导弹窗
public static final String SP_SHOWED_NOTIFICATION_LOGIN = "show_notification_login_hint";
public static final String SP_SHOWED_NOTIFICATION_QUESTION = "show_notification_question_hint";
@ -62,6 +80,22 @@ public class Constants {
public static final String SP_ADDONS_FUNCS_HAVE_READ = "addons_funcs_have_read";
//视频非wifi提醒只提醒一次重启恢复
public static final String SP_NON_WIFI_TIPS = "non_wifi_tips";
//首页视频最新tab提示
public static final String SP_HOME_NEW_VIDEO_TIPS = "home_new_video";
//游戏设备弹窗提示
public static final String SP_DEVICE_REMIND = "device_remind";
//是否是第一次弹出游戏设备弹窗提示
public static final String SP_FIRST_DEVICE_REMIND = "first_device_remind";
//游戏设备弹窗不再提示
public static final String SP_NO_REMIND_AGAIN = "no_remind_again";
//游戏详情过滤标签数据
public static final String SP_FILTER_TAGS = "filter_tags";
//实名认证弹窗分类数据
public static final String SP_AUTH_DIALOG = "auth_dialog";
//顶部视频进度保存,重启恢复
public static final String SP_TOP_VIDEO_SCHEDULE = "top_video_schedule";
//我的光环小红点提示
public static final String SP_GH_RED_POINT_REMIND = "gh_red_point_remind";
//手机号码匹配规则
public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
@ -79,6 +113,9 @@ public class Constants {
public static final String BADGE_ADDRESS_DEV = "http://resource.ghzs.com/page/badge_dev/index.html#/";
public static final String BADGE_ADDRESS = "http://resource.ghzs.com/page/badge_pro/index.html#/";
// 腾讯企点地址
public static final String TENCENT_QIDIAN_ADDRESS = "https://url.cn/D80iyMVV?_type=wpa&qidian=true";
//最少需要多少数据才能上传
public static final int DATA_AMOUNT = 20;
@ -98,13 +135,16 @@ public class Constants {
public static final int ADDONS_CD = 10 * 60 * 1000;
//已收录包名更新 cd间隔
public static final int PACKAGES_CD = 60 * 1000;
public static final String[] REPORT_LIST = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它"};
public static final String ENTRANCE_UNKNOWN = "(unknown)";
public static final String DEFAULT_TEXT_WRAPPER = "###";
// 触发了安装事件的标记
public static final String MARK_ALREADY_TRIGGERED_INSTALLATION = "triggered_installation";
// 标记下载重试标记(值为任务已下载大小,为空表示需要重试)
public static final String MARK_RETRY_DOWNLOAD = "retry_download";
}

View File

@ -2,6 +2,7 @@ package com.gh.common.databind;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
@ -13,12 +14,19 @@ import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.databinding.BindingAdapter;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.OnViewClickListener;
import com.gh.common.constant.Config;
import com.gh.common.dialog.CertificationDialog;
import com.gh.common.dialog.ReserveDialogFragment;
import com.gh.common.exposure.ExposureEvent;
import com.gh.common.exposure.ExposureUtils;
import com.gh.common.history.HistoryHelper;
import com.gh.common.repository.ReservationRepository;
import com.gh.common.util.CheckLoginUtils;
import com.gh.common.util.DataUtils;
@ -32,14 +40,16 @@ import com.gh.common.util.LogUtils;
import com.gh.common.util.MtaHelper;
import com.gh.common.util.NewsUtils;
import com.gh.common.util.NumberUtils;
import com.gh.common.util.PackageInstaller;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.PermissionHelper;
import com.gh.common.util.PlatformUtils;
import com.gh.common.util.ReservationHelper;
import com.gh.common.view.DownloadDialog;
import com.gh.common.view.DownloadProgressBar;
import com.gh.common.view.DrawableView;
import com.gh.common.view.GameIconView;
import com.gh.download.DownloadManager;
import com.gh.download.dialog.DownloadDialog;
import com.gh.gamecenter.DownloadManagerActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.WebActivity;
@ -52,6 +62,7 @@ import com.gh.gamecenter.entity.LinkEntity;
import com.gh.gamecenter.entity.PluginLocation;
import com.gh.gamecenter.entity.ServerCalendarEntity;
import com.gh.gamecenter.entity.TagStyleEntity;
import com.gh.gamecenter.entity.TestEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.PackagesManager;
import com.gh.gamecenter.qa.entity.CommunityVideoEntity;
@ -62,15 +73,10 @@ import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.EventBus;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.databinding.BindingAdapter;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
/**
* Created by khy on 12/02/18.
*/
@ -92,6 +98,26 @@ public class BindingAdapters {
view.setTextSize(number);
}
@BindingAdapter("setTypeface")
public static void setTypeface(TextView view, String type) {
if (type == null) return;
switch (type) {
case "bold":
view.setTypeface(null, Typeface.BOLD);
break;
case "italic":
view.setTypeface(null, Typeface.ITALIC);
break;
case "bold_italic":
view.setTypeface(null, Typeface.BOLD_ITALIC);
break;
default:
view.setTypeface(null, Typeface.NORMAL);
break;
}
}
@BindingAdapter({"addDetailKaiFuView", "addDetailKaiFuViewListener", "isReadyPatch"})
public static void addDetailKaiFuView(LinearLayout view, List<ServerCalendarEntity> list
, OnViewClickListener listener, Boolean isReadyPatch) {
@ -198,6 +224,17 @@ public class BindingAdapters {
}
}
@BindingAdapter("textColorFromString")
public static void textColorFromString(TextView tv, String hexString) {
if (TextUtils.isEmpty(hexString)) return;
try {
tv.setTextColor(Color.parseColor(hexString));
} catch (Exception e) {
e.printStackTrace();
}
}
@BindingAdapter("visibleGone")
public static void showHide(View view, Boolean show) {
if (show != null && show) {
@ -207,6 +244,40 @@ public class BindingAdapters {
}
}
@BindingAdapter("goneIf")
public static void goneIf(View view, Boolean gone) {
if (gone != null && gone) {
view.setVisibility(View.GONE);
} else {
view.setVisibility(View.VISIBLE);
}
}
/**
* lazy 的 paddingTop
*/
@BindingAdapter("lazyPaddingTop")
public static void lazyPaddingTop(View view, int paddingTopInDp) {
view.setPadding(view.getPaddingLeft(), DisplayUtils.dip2px(paddingTopInDp), view.getPaddingRight(), view.getPaddingBottom());
}
/**
* lazy 的 paddingBottom
*/
@BindingAdapter("lazyPaddingBottom")
public static void lazyPaddingBottom(View view, int paddingBottomInDp) {
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), DisplayUtils.dip2px(paddingBottomInDp));
}
@BindingAdapter("visibleInvisible")
public static void visibleInvisible(View view, Boolean show) {
if (show != null && show) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.INVISIBLE);
}
}
@BindingAdapter("messageUnread")
public static void setMessageUnread(TextView view, int unreadCount) {
if (unreadCount < 100) {
@ -244,6 +315,13 @@ public class BindingAdapters {
}
}
@BindingAdapter("game")
public static void setGame(View view, GameEntity gameEntity) {
if (gameEntity != null && view instanceof GameIconView) {
((GameIconView) view).displayGameIcon(gameEntity);
}
}
@BindingAdapter("articleType")
public static void setArticleType(TextView view, String articleType) {
NewsUtils.setNewsType(view, articleType, 0, 0);
@ -358,17 +436,27 @@ public class BindingAdapters {
case PLUGIN:
if (gameEntity.getApk().size() == 1) {
ApkEntity apk = gameEntity.getApk().get(0);
DownloadDialogHelper.findAvailableDialogAndShow(
v.getContext(),
gameEntity,
apk,
() -> {
DialogUtils.checkDownload(v.getContext(), apk.getSize(),
isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location));
DownloadDialogHelper.findAvailableDialogAndShow(v.getContext(), gameEntity, apk, () -> {
CertificationDialog.showCertificationDialog(v.getContext(), gameEntity, () -> {
DialogUtils.showVersionNumberDialog(v.getContext(), gameEntity, () -> {
DialogUtils.showOverseaDownloadDialog(v.getContext(), gameEntity, () -> {
DialogUtils.checkDownload(v.getContext(), apk.getSize(),
isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location));
});
});
});
});
} else {
DownloadDialog.getInstance(v.getContext()).showPopupWindow(v, gameEntity,
entrance, location + gameEntity.getName(), traceEvent);
CertificationDialog.showCertificationDialog(v.getContext(), gameEntity, () -> {
DialogUtils.showVersionNumberDialog(v.getContext(), gameEntity, () -> {
DownloadDialog.showDownloadDialog(
v.getContext(),
gameEntity,
traceEvent,
entrance,
location + ":" + gameEntity.getName());
});
});
}
break;
case LAUNCH_OR_OPEN:
@ -376,8 +464,12 @@ public class BindingAdapters {
DataUtils.onGameLaunchEvent(v.getContext(), gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location);
PackageUtils.launchApplicationByPackageName(v.getContext(), gameEntity.getApk().get(0).getPackageName());
} else {
DownloadDialog.getInstance(v.getContext()).showPopupWindow(v, gameEntity,
entrance, location + gameEntity.getName(), traceEvent);
DownloadDialog.showDownloadDialog(
v.getContext(),
gameEntity,
traceEvent,
entrance,
location + ":" + gameEntity.getName());
}
break;
case INSTALL_PLUGIN:
@ -385,7 +477,7 @@ public class BindingAdapters {
if (gameEntity.getApk().size() == 1) {
DownloadEntity downloadEntity = DownloadManager.getInstance(progressBar.getContext()).getDownloadEntityByUrl(gameEntity.getApk().get(0).getUrl());
if (downloadEntity != null) {
PackageUtils.launchSetup(v.getContext(), downloadEntity);
PackageInstaller.install(v.getContext(), downloadEntity);
}
}
break;
@ -416,9 +508,15 @@ public class BindingAdapters {
}
break;
case H5_GAME:
MtaHelper.onEvent("H5页面", "入口", "列表页_" + gameEntity.getName());
LinkEntity linkEntity = gameEntity.getH5Link();
Intent i = new Intent(WebActivity.getIntentForWebGame(progressBar.getContext(), linkEntity.getLink(), gameEntity.getName(), "play".equals(linkEntity.getType())));
boolean isPlay = "play".equals(linkEntity.getType()); // 是否为开始玩
MtaHelper.onEvent("H5页面", "入口", "列表页_" + gameEntity.getName());
if (isPlay) {
HistoryHelper.insertGameEntity(gameEntity);
}
Intent i = new Intent(WebActivity.getIntentForWebGame(progressBar.getContext(), linkEntity.getLink(), gameEntity.getName(), isPlay,linkEntity.getCloseButton()));
progressBar.getContext().startActivity(i);
break;
}
@ -455,7 +553,7 @@ public class BindingAdapters {
}
progressBar.setDownloadType(DownloadProgressBar.DownloadType.NONE);
}
} else {
String status = GameUtils.getDownloadBtnText(progressBar.getContext(), gameEntity, PluginLocation.only_game);
switch (status) {
@ -511,6 +609,23 @@ public class BindingAdapters {
}
}
/*private static void download(DownloadProgressBar progressBar, GameEntity gameEntity, ExposureEvent traceEvent, @Nullable String entrance, @Nullable String location, View v) {
if (gameEntity.getApk().size() == 1) {
ApkEntity apk = gameEntity.getApk().get(0);
DownloadDialogHelper.findAvailableDialogAndShow(
v.getContext(),
gameEntity,
apk,
() -> {
DialogUtils.checkDownload(v.getContext(), apk.getSize(),
isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location));
});
} else {
DownloadDialog.getInstance(v.getContext()).showPopupWindow(v, gameEntity,
entrance, location + gameEntity.getName(), traceEvent);
}
}*/
private static void updateReservation(DownloadProgressBar progressBar, GameEntity gameEntity) {
// 显示预约
@ -546,10 +661,7 @@ public class BindingAdapters {
String msg = FileUtils.isCanDownload(progressBar.getContext(), apkEntity.getSize());
if (TextUtils.isEmpty(msg)) {
DataUtils.onGameDownloadEvent(progressBar.getContext(), gameEntity.getName(), apkEntity.getPlatform(), entrance, "下载开始", method);
ExposureUtils.DownloadType downloadType = ExposureUtils.getDownloadType(apkEntity, method);
ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, apkEntity.getPlatform(), traceEvent, downloadType);
DownloadManager.createDownload(progressBar.getContext(),
apkEntity,
gameEntity,
@ -557,7 +669,7 @@ public class BindingAdapters {
entrance,
location + gameEntity.getName(),
isSubscribe,
downloadExposureEvent);
traceEvent);
progressBar.setProgress(0);
progressBar.setDownloadType("插件化".equals(method) ?
@ -567,27 +679,36 @@ public class BindingAdapters {
}
}
@BindingAdapter({"gameLabelList", "subjectTag"})
public static void setGameLabelList(LinearLayout layout, GameEntity gameEntity, String subjectTag) {
if (gameEntity == null) return;
if (gameEntity.getTest() != null) {
layout.removeAllViews();
View testView = LayoutInflater.from(layout.getContext()).inflate(R.layout.game_test_label, null);
TextView testType = testView.findViewById(R.id.test_type);
TextView testTime = testView.findViewById(R.id.test_time);
testType.setText(gameEntity.getTest().getType());
testType.setBackgroundColor(ContextCompat.getColor(layout.getContext(), R.color.tag_yellow));
@BindingAdapter("gameLabelList")
public static void setGameLabelList(LinearLayout layout, List<TagStyleEntity> tagStyle) {
GameViewUtils.setLabelList(layout.getContext(), layout, tagStyle);
}
if (gameEntity.getTest().getStart() == 0) {
testTime.setVisibility(View.GONE);
// 包含测试开服标签
@BindingAdapter("setGameTags")
public static void setGameTags(LinearLayout layout, GameEntity gameEntity) {
try {
ArrayList<TagStyleEntity> tagStyle = new ArrayList<>();
TestEntity test = gameEntity.getTest();
if (test != null) {
TagStyleEntity typeTag = new TagStyleEntity();
typeTag.setName(test.getType() != null ? test.getType() : "");
typeTag.setBackground("FFF3E0");
typeTag.setColor("FA8500");
tagStyle.add(typeTag);
TagStyleEntity timeTag = new TagStyleEntity();
timeTag.setName(GameViewUtils.getGameTestDate(test.getStart()));
timeTag.setBackground("E0FFF9");
timeTag.setColor("00A887");
tagStyle.add(timeTag);
} else {
testTime.setText(GameViewUtils.getGameTestDate(gameEntity.getTest().getStart()));
tagStyle = gameEntity.getTagStyle();
}
layout.addView(testView);
} else {
GameViewUtils.setLabelList(layout.getContext(), layout, gameEntity.getTag(), subjectTag, gameEntity.getTagStyle());
GameViewUtils.setLabelList(layout.getContext(), layout, tagStyle);
} catch (Exception e) {
e.printStackTrace();
}
}
@BindingAdapter("isRefreshing")
@ -597,14 +718,15 @@ public class BindingAdapters {
}
}
@BindingAdapter({"setGameName", "isShowPlatform"})
public static void setGameName(TextView view, GameEntity game, boolean isShowPlatform) {
@BindingAdapter({"setGameName", "isShowPlatform", "isShowSuffix"})
public static void setGameName(TextView view, GameEntity game, boolean isShowPlatform, @Nullable Boolean isShowSuffix) {
if (isShowSuffix == null) isShowSuffix = true; // 默认显示
if (isShowPlatform && game.getApk().size() > 0) {
view.setText(String.format("%s - %s", game.getName(),
view.setText(String.format("%s - %s", !isShowSuffix ? game.getNameWithoutSuffix() : game.getName(),
PlatformUtils.getInstance(view.getContext()).getPlatformName(
game.getApk().get(0).getPlatform())));
} else {
view.setText(game.getName());
view.setText(!isShowSuffix ? game.getNameWithoutSuffix() : game.getName());
}
}
@ -663,4 +785,17 @@ public class BindingAdapters {
}
view.setText(span);
}
@BindingAdapter({"setVideoData"})
public static void setVideoData(TextView view, int count) {
if (count > 0) {
view.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(view.getContext(), R.drawable.ic_video_data_up), null, null, null);
view.setTextColor(ContextCompat.getColor(view.getContext(), R.color.text_EA3333));
view.setText(count + "");
} else {
view.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
view.setTextColor(ContextCompat.getColor(view.getContext(), R.color.text_999999));
view.setText("-");
}
}
}

View File

@ -15,6 +15,7 @@ abstract class BaseTrackableDialogFragment : BaseDialogFragment() {
abstract fun getEvent(): String
abstract fun getKey(): String
open fun getValue(): String = ""
// 区分此 dialog 是点击 dialog 外部取消的还是点击返回取消的
private val mIsCanceledByClickOutsideOfDialog = AtomicBoolean(true)
@ -47,6 +48,9 @@ abstract class BaseTrackableDialogFragment : BaseDialogFragment() {
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), value)
} else {
MtaHelper.onEvent(getEvent(), getKey(), value)
if (getValue().isNotEmpty()) {
MtaHelper.onEvent(getEvent(), value, getValue())
}
}
}

View File

@ -0,0 +1,196 @@
package com.gh.common.dialog
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.Paint
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.CheckBox
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.gh.common.avoidcallback.AvoidOnResultManager
import com.gh.common.avoidcallback.Callback
import com.gh.common.constant.Constants
import com.gh.common.util.CheckLoginUtils
import com.gh.common.util.DialogUtils
import com.gh.common.util.GsonUtils
import com.gh.common.util.SPUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.UserInfoEditActivity
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.entity.AuthDialogEntity
import com.gh.gamecenter.entity.AuthDialogLevel
import com.gh.gamecenter.entity.DeviceDialogEntity
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.gh.gamecenter.user.UserViewModel
import com.google.gson.reflect.TypeToken
import com.halo.assistant.fragment.user.UserInfoEditFragment
import com.lightgame.utils.AppManager
import com.tencent.bugly.beta.tinker.TinkerManager.getApplication
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import okhttp3.ResponseBody
import retrofit2.HttpException
class CertificationDialog(context: Context, private val authDialogEntity: AuthDialogEntity, val gameId: String, val listener: DialogUtils.ConfirmListener) :
Dialog(context, R.style.GhAlertDialog) {
private lateinit var view: View
private lateinit var detailedDesTv: TextView
private lateinit var noRemindAgainCb: CheckBox
private lateinit var actionLeftTv: TextView
private lateinit var actionRightTv: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
view = LayoutInflater.from(context).inflate(R.layout.dialog_sertification, null)
setContentView(view)
detailedDesTv = view.findViewById(R.id.detailedDesTv)
noRemindAgainCb = view.findViewById(R.id.noRemindAgainCb)
actionLeftTv = view.findViewById(R.id.actionLeftTv)
actionRightTv = view.findViewById(R.id.actionRightTv)
detailedDesTv.paint.flags = Paint.UNDERLINE_TEXT_FLAG
detailedDesTv.paint.isAntiAlias = true
detailedDesTv.setOnClickListener {
context.startActivity(WebActivity.getIntentByUrl(context, authDialogEntity.link))
}
when (authDialogEntity.level) {
AuthDialogLevel.MUST_PASS.value -> {
actionLeftTv.text = "暂不下载"
actionRightTv.text = "去实名认证"
noRemindAgainCb.visibility = View.GONE
actionLeftTv.setOnClickListener {
dismiss()
}
actionRightTv.setOnClickListener {
if (UserManager.getInstance().isLoggedIn) {
gotoAuthPage()
} else {
gotoLoginPage()
}
}
}
AuthDialogLevel.ALWAYS_HINT.value -> {
actionLeftTv.text = "去实名认证"
actionRightTv.text = "继续下载"
noRemindAgainCb.visibility = View.GONE
actionLeftTv.setOnClickListener {
if (UserManager.getInstance().isLoggedIn) {
gotoAuthPage()
} else {
gotoLoginPage()
}
}
actionRightTv.setOnClickListener {
listener.onConfirm()
dismiss()
}
}
AuthDialogLevel.OPTIONAL_HINT.value -> {
actionLeftTv.text = "去实名认证"
actionRightTv.text = "继续下载"
noRemindAgainCb.visibility = View.VISIBLE
actionLeftTv.setOnClickListener {
if (noRemindAgainCb.isChecked) {
SPUtils.setBoolean(gameId, true)
}
if (UserManager.getInstance().isLoggedIn) {
gotoAuthPage()
} else {
gotoLoginPage()
}
}
actionRightTv.setOnClickListener {
if (noRemindAgainCb.isChecked) {
SPUtils.getBoolean(gameId, true)
}
listener.onConfirm()
dismiss()
}
}
}
}
//跳转登录页面
private fun gotoLoginPage() {
CheckLoginUtils.checkLogin(AppManager.getInstance().currentActivity() as AppCompatActivity,
null, true, "实名认证弹窗") {
if (UserManager.getInstance().isAuth) {
listener.onConfirm()
dismiss()
}
}
}
//跳转实名认证页面
private fun gotoAuthPage() {
AvoidOnResultManager.getInstance(AppManager.getInstance().currentActivity() as AppCompatActivity)
.startForResult(UserInfoEditActivity.getIntent(context, UserViewModel.TYPE_ID_CARD), object : Callback {
override fun onActivityResult(resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK && data != null) {
val isAuthSuccess = data.getBooleanExtra(UserInfoEditFragment.AUTH_SUCCESS, false)
if (isAuthSuccess) {
listener.onConfirm()
dismiss()
}
}
}
})
}
companion object {
@JvmStatic
fun showCertificationDialog(context: Context, game: GameEntity, listener: DialogUtils.ConfirmListener) {
//1.先判断是否登录 是执行2 否执行3
//2.判断是否实名认证 是终止 否执行3
//3.判断是否需要弹出认证弹窗接口
if (UserManager.getInstance().isLoggedIn) {
if (UserManager.getInstance().isAuth) {//已实名认证
listener.onConfirm()
} else {
authDialog(context, game, listener)
}
} else {
authDialog(context, game, listener)
}
}
@SuppressLint("CheckResult")
private fun authDialog(context: Context, game: GameEntity, listener: DialogUtils.ConfirmListener) {
var authDialog: AuthDialogEntity? = null
if (game.authDialog != null) {
authDialog = game.authDialog
}
if (authDialog == null) {
val datas = SPUtils.getString(Constants.SP_AUTH_DIALOG)
val type = object : TypeToken<List<AuthDialogEntity>>() {}.type
val authDialogs = GsonUtils.gson.fromJson<List<AuthDialogEntity>>(datas, type)
if (!authDialogs.isNullOrEmpty()) {
authDialog = authDialogs.find { it.gameCategory == game.category }
}
}
val isCloseAuthDialog = SPUtils.getBoolean(game.id, false)
if (authDialog != null && (authDialog.level != AuthDialogLevel.OPTIONAL_HINT.value || !isCloseAuthDialog)) {
val dialog = CertificationDialog(context, authDialog, game.id, listener)
dialog.show()
} else {
listener.onConfirm()
}
}
}
}

View File

@ -0,0 +1,233 @@
package com.gh.common.dialog
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.preference.PreferenceManager
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.facebook.drawee.view.SimpleDraweeView
import com.gh.common.constant.Constants
import com.gh.common.util.*
import com.gh.download.DownloadManager
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.DeviceDialogEntity
import com.gh.gamecenter.entity.GameEntity
import com.google.gson.reflect.TypeToken
import com.halo.assistant.fragment.SettingsFragment.AUTO_INSTALL_SP_KEY
import com.lightgame.download.DataWatcher
import com.lightgame.download.DownloadEntity
import com.lightgame.download.DownloadStatus
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.dialog_device_remind.view.*
import java.lang.ref.WeakReference
/**
* 设备提醒弹窗
*/
class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val gameEntity: GameEntity) : Dialog(context, R.style.GhAlertDialog) {
private lateinit var view: View
private var currentPage = 0
private var mSlideLooperInterval = 3000L
private lateinit var mLooperHandle: LooperHandle
private lateinit var mAdapter: BannerAdapter
private var mDatas: ArrayList<String> = ArrayList()
private val mSlideLooperKey = 100
private var disposable: Disposable? = null
private val dataWatcher = object : DataWatcher() {
override fun onDataChanged(downloadEntity: DownloadEntity) {
if (downloadEntity.status == DownloadStatus.done && downloadEntity.name == gameEntity.name) {
val sp = PreferenceManager.getDefaultSharedPreferences(getContext())
val autoInstall = sp.getBoolean(AUTO_INSTALL_SP_KEY, true)
if (autoInstall) {
dismiss()
}
}
}
}
companion object {
fun showDeviceRemindDialog(context: Context, gameEntity: GameEntity) {
val datas = SPUtils.getString(Constants.SP_DEVICE_REMIND)
if (datas.isNotEmpty()) {
val type = object : TypeToken<List<DeviceDialogEntity>>() {}.type
val entitys = GsonUtils.gson.fromJson<List<DeviceDialogEntity>>(datas, type)
//1.判断设备是否匹配
val entity = entitys.find { it.manufacturer.toLowerCase().startsWith(Build.MANUFACTURER.toLowerCase()) }
?: return
//2.判断游戏不含剔除标签
gameEntity.tagStyle.forEach {
if (entity.excludeTags.contains(it.name)) {
return
}
}
//3.不再弹出提示判断
val isNoRemindAgain = SPUtils.getBoolean(Constants.SP_NO_REMIND_AGAIN, false)
if (isNoRemindAgain) return
val dialog = DeviceRemindDialog(context, entity, gameEntity)
dialog.show()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
view = LayoutInflater.from(context).inflate(R.layout.dialog_device_remind, null)
setContentView(view)
mDatas.addAll(entity.gallery)
view.titleTv.text = entity.title
view.contentTv.text = entity.content
view.bannerView.apply {
orientation = ViewPager2.ORIENTATION_HORIZONTAL
mAdapter = BannerAdapter()
val recyclerView = getChildAt(0) as RecyclerView
recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_NEVER
registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
currentPage = position
slideIndicator(currentPage % mDatas.size)
}
})
recyclerView.addOnItemTouchListener(object : RecyclerView.SimpleOnItemTouchListener() {
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
val isStop = e.action == MotionEvent.ACTION_DOWN || e.action == MotionEvent.ACTION_MOVE
if (isStop) mAdapter.stopScroll() else mAdapter.startScroll()
return false
}
})
adapter = mAdapter
mLooperHandle = LooperHandle(mAdapter)
currentPage = (adapter as BannerAdapter).getActualFirstPositionInCenter()
setCurrentItem(currentPage, false)
if (mDatas.size > 1) {
addIndicator()
slideIndicator(currentPage % mDatas.size)
autoPlay()
}
}
val isFirst = SPUtils.getBoolean(Constants.SP_FIRST_DEVICE_REMIND, false)
if (!isFirst) {
view.cancelTv.isEnabled = false
view.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_round_f5f5f5)
disposable = countDownTimer(3) { finish, time ->
if (finish) {
view.cancelTv.isEnabled = true
view.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_blue_oval)
view.cancelTv.text = "我知道了"
view.cancelTv.setTextColor(ContextCompat.getColor(context, R.color.white))
} else {
view.cancelTv.text = "我知道了(${time}S)"
}
}
SPUtils.setBoolean(Constants.SP_FIRST_DEVICE_REMIND, true)
} else {
view.noRemindAgainCb.visibility = View.VISIBLE
view.cancelTv.text = "我知道了"
view.cancelTv.isEnabled = true
view.cancelTv.setTextColor(ContextCompat.getColor(context, R.color.white))
view.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_blue_oval)
}
view.cancelTv.setOnClickListener {
SPUtils.setBoolean(Constants.SP_NO_REMIND_AGAIN, view.noRemindAgainCb.isChecked)
dismiss()
}
DownloadManager.getInstance(context).addObserver(dataWatcher)
}
private fun addIndicator() {
view.indicatorLl.removeAllViews()
mDatas.forEach { _ ->
val indicatorView = ImageView(context).apply {
setImageResource(R.drawable.selector_device_remind_indicator)
val params = LinearLayout.LayoutParams(DisplayUtils.dip2px(8F), LinearLayout.LayoutParams.WRAP_CONTENT)
params.leftMargin = DisplayUtils.dip2px(1F)
params.rightMargin = DisplayUtils.dip2px(1F)
layoutParams = params
}
view.indicatorLl.addView(indicatorView)
}
}
private fun slideIndicator(position: Int) {
for (i in 0 until view.indicatorLl.childCount) {
val childAt = view.indicatorLl.getChildAt(i)
childAt.isSelected = i == position
}
}
private fun autoPlay() {
mAdapter.startScroll()
}
inner class BannerAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return object : RecyclerView.ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_device_remind_banner, parent, false)) {}
}
override fun getItemCount(): Int = if (mDatas.size == 1) mDatas.size else Int.MAX_VALUE
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val data = mDatas[position % mDatas.size]
val view = holder.itemView as SimpleDraweeView
ImageUtils.display(view, data)
}
fun getActualFirstPositionInCenter(): Int {
if (mDatas.size == 1) return 0
var index = itemCount / 2
if (index % mDatas.size != 0) {
index -= (index % mDatas.size)
}
return index
}
fun scrollToNextPage() {
currentPage++
view.bannerView.setCurrentItem(currentPage, true)
}
fun startScroll() {
mLooperHandle.removeMessages(mSlideLooperKey)
mLooperHandle.sendEmptyMessageDelayed(mSlideLooperKey, mSlideLooperInterval)
}
fun stopScroll() {
mLooperHandle.removeMessages(mSlideLooperKey)
}
}
class LooperHandle(val mAdapter: BannerAdapter) : Handler() {
private val mWeakReference: WeakReference<BannerAdapter> = WeakReference(mAdapter)
override fun handleMessage(msg: Message?) {
val adapter = mWeakReference.get()
adapter?.scrollToNextPage()
adapter?.startScroll()
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
if (disposable != null && !disposable!!.isDisposed) {
disposable!!.dispose()
disposable = null
}
DownloadManager.getInstance(context).removeObserver(dataWatcher)
}
}

View File

@ -10,6 +10,7 @@ import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat
import com.gh.base.fragment.BaseDialogFragment
import com.gh.common.util.DirectUtils
import com.gh.common.util.DisplayUtils
import com.gh.common.util.MtaHelper
@ -18,7 +19,10 @@ import com.gh.gamecenter.entity.GameEntity
import kotlinx.android.synthetic.main.dialog_game_off_service.*
// 游戏关闭下载弹窗
class GameOffServiceDialogFragment : BaseTrackableDialogFragment() {
class GameOffServiceDialogFragment
// : BaseTrackableDialogFragment()
:BaseDialogFragment() {
private var mDialog: GameEntity.Dialog? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -42,7 +46,7 @@ class GameOffServiceDialogFragment : BaseTrackableDialogFragment() {
siteTv.text = site.text
siteTv.paintFlags = siteTv.paintFlags or Paint.UNDERLINE_TEXT_FLAG
siteTv.setOnClickListener {
MtaHelper.onEvent("游戏下载状态按钮", getKey(), site.text)
// MtaHelper.onEvent("游戏下载状态按钮", getKey(), site.text)
DirectUtils.directToWebView(requireContext(), site.url, "(关闭下载弹窗)")
dismiss()
}
@ -52,13 +56,13 @@ class GameOffServiceDialogFragment : BaseTrackableDialogFragment() {
}
}
override fun getEvent(): String {
return "游戏下载状态按钮"
}
override fun getKey(): String {
return "查看详情弹窗"
}
// override fun getEvent(): String {
// return "游戏下载状态按钮"
// }
//
// override fun getKey(): String {
// return "查看详情弹窗"
// }
companion object {
@JvmStatic

View File

@ -37,7 +37,7 @@ class NotificationHintDialogFragment : BaseTrackableDialogFragment() {
titleTv.text = mNotificationHint?.title
contentContainer.removeAllViews()
for (item in mNotificationHint?.content!!) {
for (item in mNotificationHint?.content ?: arrayListOf()) {
val tv = TextView(context)
tv.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT).apply {

View File

@ -4,17 +4,19 @@ import android.annotation.SuppressLint
import android.app.Application
import android.os.Bundle
import android.text.Html
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.*
import android.view.animation.AnimationUtils
import android.widget.EditText
import android.widget.TextView
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import butterknife.BindView
import butterknife.ButterKnife
import butterknife.OnClick
import com.gh.base.fragment.BaseDialogFragment
import com.gh.common.constant.Config
import com.gh.common.history.HistoryHelper
import com.gh.common.repository.ReservationRepository
import com.gh.common.util.*
import com.gh.gamecenter.R
@ -22,53 +24,92 @@ import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import okhttp3.ResponseBody
import org.json.JSONArray
import org.json.JSONObject
// 预约弹窗
class ReserveDialogFragment : BaseTrackableDialogFragment() {
class ReserveDialogFragment
: BaseDialogFragment(), KeyboardHeightObserver {
// : BaseTrackableDialogFragment() {
@BindView(R.id.reserve_hint_tv)
lateinit var reserveHintTv: TextView
@BindView(R.id.reserve_content_tv)
lateinit var reserveContentTv: TextView
@BindView(R.id.reserve_completed_content_tv)
lateinit var reserveCompletedContentTv: TextView
@BindView(R.id.mobile_et)
lateinit var mobileEt: EditText
@BindView(R.id.reserve_container)
lateinit var reserveContainer: View
@BindView(R.id.reserve_completed_container)
lateinit var reserveCompletedContainer: View
@BindView(R.id.customizable_btn)
lateinit var customizableBtn: TextView
@BindView(R.id.content_container)
lateinit var contentContainer: View
@BindView(R.id.mobile_index_container)
lateinit var mobileIndexContainer: View
@BindView(R.id.mobile_index_reserve)
lateinit var mobileIndexReserve: TextView
@BindView(R.id.mobile_index_user)
lateinit var mobileIndexUser: TextView
@BindView(R.id.mobile_et_delete)
lateinit var mobileEtDelete: View
@BindView(R.id.layout_container)
lateinit var layoutContainer: View
private lateinit var mViewModel: ReserveViewModel
private var mSuccessCallback: SuccessCallback? = null
private var mGame: GameEntity? = null
private var mGameId: String = ""
private var mGameName: String = ""
private var mKeyboardHeightProvider: KeyboardHeightProvider? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewModel = viewModelProvider()
mKeyboardHeightProvider = KeyboardHeightProvider(activity)
mKeyboardHeightProvider?.start()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_reserve_game, null)
}
override fun getEvent(): String {
return "预约游戏"
}
override fun getKey(): String {
return "预约功能操作"
}
// override fun getEvent(): String {
// return "预约游戏"
// }
//
// override fun getKey(): String {
// return "预约功能操作"
// }
@Suppress("DEPRECATION")
@SuppressLint("SetTextI18n")
@ -76,18 +117,27 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
super.onViewCreated(view, savedInstanceState)
ButterKnife.bind(this, view)
val reserveContent = "游戏上线,您将<font color='#ff4147'>免费</font>收到短信提醒"
val reserveContent = "游戏上线,您将收到<font color='#1383EB'>免费短信</font>提醒"
reserveContentTv.text = Html.fromHtml(reserveContent)
mobileEt.setText(UserManager.getInstance().userInfoEntity.mobile)
mobileEt.setSelection(mobileEt.text.length)
mobileEt.setTextChangedListener { s, _, _, _ ->
mobileIndexContainer.visibility = View.GONE
mobileEtDelete.goneIf(s.trim().isEmpty())
}
mViewModel.reservation.observeNonNull(this) {
if (it.success) {
showSuccessDialog(it.withMobile, it.boundWechat)
mSuccessCallback?.onSuccess()
HistoryHelper.insertGameEntity(mGame!!)
}
}
mViewModel.reserveMobile.observe(viewLifecycleOwner, Observer {
setMobileIndexHint(it)
})
dialog?.setCanceledOnTouchOutside(true)
}
@ -106,7 +156,7 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
} else {
customizableBtn.text = dialogConfig?.text
customizableBtn.setOnClickListener {
MtaHelper.onEvent("预约游戏", "预约功能操作", "点击跳转按钮")
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击跳转按钮")
DirectUtils.directToLinkPage(
requireContext(),
dialogConfig!!.toLinkEntity(),
@ -117,38 +167,133 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
}
}
private fun setMobileIndexHint(reserveMobile: String?) {
var userMobile = UserManager.getInstance().userInfoEntity.mobile
if (reserveMobile == userMobile) userMobile = null
if (!reserveMobile.isNullOrEmpty()) {
mobileIndexReserve.visibility = View.VISIBLE
mobileIndexReserve.text = reserveMobile
} else {
mobileIndexReserve.visibility = View.GONE
}
if (!userMobile.isNullOrEmpty()) {
mobileIndexUser.visibility = View.VISIBLE
mobileIndexUser.text = userMobile
} else {
mobileIndexUser.visibility = View.GONE
}
mobileIndexContainer.goneIf(mobileIndexUser.visibility == View.GONE && mobileIndexReserve.visibility == View.GONE)
if (mobileIndexContainer.visibility ==View.VISIBLE) {
mobileIndexContainer.animation = AnimationUtils.loadAnimation(requireContext(), R.anim.reserve_dialog_index_anim)
}
}
@OnClick(R.id.reserve_with_mobile_btn,
R.id.reserve_without_mobile_btn,
R.id.content_container,
R.id.close_btn,
R.id.customizable_btn)
R.id.customizable_btn,
R.id.mobile_index_reserve,
R.id.mobile_index_user,
R.id.mobile_et_delete,
R.id.mobile_et,
R.id.layout_container)
fun onClick(view: View) {
when (view.id) {
R.id.reserve_without_mobile_btn -> {
MtaHelper.onEvent("预约游戏", "预约功能操作", "点击无手机号预约")
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击无手机号预约")
if (mobileIndexContainer.visibility == View.VISIBLE) {
mobileIndexContainer.visibility = View.GONE
return
}
mViewModel.reserve(gameId = mGameId, gameName = mGameName)
}
R.id.reserve_with_mobile_btn -> {
if (mobileIndexContainer.visibility == View.VISIBLE) {
mobileIndexContainer.visibility = View.GONE
return
}
val mobile = mobileEt.text.toString()
if (mobile.length < 11 || !mobile.startsWith("1")) {
Utils.toast(context, "手机号格式错误,请检查并重新输入")
return
}
MtaHelper.onEvent("预约游戏", "预约功能操作", "点击立即预约")
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击立即预约")
mViewModel.reserve(gameId = mGameId, gameName = mGameName, mobile = mobile)
}
R.id.close_btn -> {
MtaHelper.onEvent("预约游戏", "预约功能操作", "点击关闭")
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击关闭")
dismissAllowingStateLoss()
}
R.id.content_container -> {
mobileIndexContainer.visibility = View.GONE
}
R.id.mobile_index_reserve -> {
mobileEt.setText(mobileIndexReserve.text.toString())
mobileEt.setSelection(mobileEt.text.length)
mobileIndexContainer.visibility = View.GONE
}
R.id.mobile_index_user -> {
mobileEt.setText(mobileIndexUser.text.toString())
mobileEt.setSelection(mobileEt.text.length)
mobileIndexContainer.visibility = View.GONE
}
R.id.mobile_et_delete -> {
mobileEt.setText("")
}
R.id.mobile_et -> {
mobileIndexContainer.visibility = View.GONE
}
R.id.layout_container -> {
dismissAllowingStateLoss()
}
}
}
override fun onResume() {
super.onResume()
if (HaloApp.getInstance().mCacheKeyboardHeight > 0) {
val attributes = dialog?.window?.attributes
val heightPixels = requireContext().resources.displayMetrics.heightPixels
val mCacheKeyboardHeight = HaloApp.getInstance().mCacheKeyboardHeight
val statusBarHeight = DisplayUtils.getStatusBarHeight(requireContext().resources)
dialog?.window?.attributes?.height = heightPixels - mCacheKeyboardHeight - statusBarHeight
attributes?.gravity = Gravity.TOP
dialog?.window?.attributes = attributes
}
mKeyboardHeightProvider?.setKeyboardHeightObserver(this)
}
override fun onPause() {
super.onPause()
mKeyboardHeightProvider?.setKeyboardHeightObserver(null)
}
override fun onDestroy() {
super.onDestroy()
mKeyboardHeightProvider?.close()
}
override fun onKeyboardHeightChanged(height: Int, orientation: Int) {
if (height > 0) {
val attributes = dialog?.window?.attributes
attributes?.gravity = Gravity.CENTER
dialog?.window?.attributes = attributes
HaloApp.getInstance().mCacheKeyboardHeight = height
}
}
companion object {
@JvmStatic
fun getInstance(gameEntity: GameEntity, successCallback: SuccessCallback) = ReserveDialogFragment().apply {
this.mGame = gameEntity
this.mGameId = gameEntity.id
this.mGameName = gameEntity.name ?: ""
this.mSuccessCallback = successCallback
@ -163,6 +308,12 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
class ReserveViewModel(application: Application) : AndroidViewModel(application) {
val reservation = MutableLiveData<Reservation>()
val reserveMobile = MutableLiveData<String>()
init {
getAppointmentMobile()
}
@SuppressLint("CheckResult")
fun reserve(gameId: String, gameName: String, mobile: String = "") {
@ -185,7 +336,7 @@ class ReserveViewModel(application: Application) : AndroidViewModel(application)
reservation.postValue(Reservation(success = true, withMobile = mobile.isNotEmpty(), boundWechat = boundWechat))
ReservationRepository.addReservationToMemoryAndRefresh(gameId)
MtaHelper.onEvent("预约游戏", "预约", gameName)
// MtaHelper.onEvent("预约游戏", "预约", gameName)
}
override fun onFailure(exception: Exception) {
@ -194,5 +345,30 @@ class ReserveViewModel(application: Application) : AndroidViewModel(application)
})
}
@SuppressLint("CheckResult")
private fun getAppointmentMobile() {
RetrofitManager.getInstance(getApplication()).api
.getAppointmentMobile(UserManager.getInstance().userId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : BiResponse<ResponseBody>() {
override fun onSuccess(data: ResponseBody) {
var mobile: String? = null
tryCatchInRelease {
val jsonArray = JSONArray(data.string())
if (jsonArray.length() > 0) {
mobile = jsonArray.get(0).toString()
}
}
reserveMobile.postValue(mobile)
}
override fun onFailure(exception: Exception) {
reserveMobile.postValue(null)
}
})
}
class Reservation(var success: Boolean = false, var withMobile: Boolean = false, var boundWechat: Boolean = false)
}

View File

@ -8,12 +8,13 @@ import com.gh.common.util.MtaHelper
import java.util.concurrent.atomic.AtomicBoolean
open class TrackableDialog(context: Context,
themeResId: Int,
private var mEvent: String,
private var mKey: String,
private var mCancelValue: String? = null,
private var mKeyBackValue: String? = null,
private var mLogShowEvent: Boolean = true)
themeResId: Int,
private var mEvent: String,
private var mKey: String,
private var mValue: String? = null,
private var mCancelValue: String? = null,
private var mKeyBackValue: String? = null,
private var mLogShowEvent: Boolean = true)
: Dialog(context, themeResId) {
// 区分此 dialog 是点击 dialog 外部取消的还是点击返回取消的
@ -25,6 +26,9 @@ open class TrackableDialog(context: Context,
setOnCancelListener {
if (mIsCanceledByClickOutsideOfDialog.get()) {
MtaHelper.onEvent(mEvent, mKey, mCancelValue ?: "点击空白")
if (!mValue.isNullOrEmpty()) {
MtaHelper.onEvent(mEvent, "点击空白", mValue)
}
}
}
@ -32,6 +36,9 @@ open class TrackableDialog(context: Context,
if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
mIsCanceledByClickOutsideOfDialog.set(false)
MtaHelper.onEvent(mEvent, mKey, mKeyBackValue ?: "点击返回")
if (mValue != null) {
MtaHelper.onEvent(mEvent, "点击返回", mValue)
}
}
false
}
@ -41,6 +48,9 @@ open class TrackableDialog(context: Context,
super.show()
if (mLogShowEvent) {
MtaHelper.onEvent(mEvent, mKey, "出现弹窗")
if (!mValue.isNullOrEmpty()) {
MtaHelper.onEvent(mEvent, "出现弹窗", mValue)
}
}
}

View File

@ -11,8 +11,15 @@ data class ExposureEntity(
@SerializedName("game_id")
val gameId: String? = "",
val gameName: String? = "",
val gameVersion: String? = "",
val sequence: Int? = 0,
val platform: String? = "",
val downloadType: String? = "",
val downloadCompleteType: String? = ""
val downloadCompleteType: String? = "",
// 统计启动弹窗相关数据用的 (ugly)
@SerializedName("dialog_id")
var welcomeDialogId: String? = "",
@SerializedName("link_title")
var welcomeDialogLinkTitle: String? = ""
) : Parcelable

View File

@ -4,9 +4,11 @@ import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.gh.common.constant.Constants
import com.gh.common.exposure.meta.Meta
import com.gh.common.exposure.meta.MetaUtil
import com.gh.common.exposure.time.TimeUtil
import com.gh.common.util.getFirstElementDividedByDivider
import com.gh.gamecenter.entity.GameEntity
import kotlinx.android.parcel.Parcelize
import java.util.*
@ -26,13 +28,21 @@ data class ExposureEvent(
companion object {
@JvmStatic
fun createEvent(gameEntity: GameEntity?, source: List<ExposureSource>, eTrace: List<ExposureEvent>? = null, event: ExposureType = ExposureType.EXPOSURE): ExposureEvent {
if (gameEntity?.getApk()?.size == 1) {
gameEntity.gameVersion = gameEntity.getApk().elementAtOrNull(0)?.version ?: ""
}
return ExposureEvent(
payload = ExposureEntity(gameId = gameEntity?.id,
gameName = gameEntity?.name,
payload = ExposureEntity(
gameId = gameEntity?.id?.getFirstElementDividedByDivider(Constants.GAME_ID_DIVIDER),
gameName = gameEntity?.name?.removeSuffix(Constants.GAME_NAME_DECORATOR),
gameVersion = gameEntity?.gameVersion,
sequence = gameEntity?.sequence,
platform = gameEntity?.platform,
downloadType = gameEntity?.downloadType,
downloadCompleteType = gameEntity?.downloadCompleteType),
downloadCompleteType = gameEntity?.downloadCompleteType,
// ugly
welcomeDialogId = gameEntity?.welcomeDialogId ?: eTrace?.firstOrNull()?.payload?.welcomeDialogId,
welcomeDialogLinkTitle = gameEntity?.welcomeDialogTitle ?: eTrace?.firstOrNull()?.payload?.welcomeDialogLinkTitle),
source = source,
eTrace = eTrace,
event = event).apply { gameEntity?.exposureEvent = this }

View File

@ -26,6 +26,10 @@ class ExposureListener(var fragment: Fragment, var exposable: IExposable) : Recy
visibleState?.let { commitExposure(it) }
throttleBus?.clear()
}
override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) {
fragment.fragmentManager?.unregisterFragmentLifecycleCallbacks(this)
}
}, false)
}

View File

@ -9,7 +9,6 @@ import com.gh.loghub.LoghubHelper
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import java.util.concurrent.Executors
import kotlin.concurrent.fixedRateTimer
/**
* A handful tool for committing logs to aliyun loghub.
@ -17,7 +16,7 @@ import kotlin.concurrent.fixedRateTimer
* 如何简单地统计列表中每个 item 的曝光事件?
*
* 1. Adapter 实现 IExposable 接口,在 BindView 阶段更新 ExposureEventExposureEvent 供 getEventByPosition(pos) 方法获取用
* 2. 构建一个 ExposureListener 并作为入参添加至 recyclerview 的 Scroll 回调中
* 2. 构建一个 ExposureListener 并作为入参添加至 recyclerview 的 onScroll 回调中
* 3. 没了
*/
object ExposureManager {
@ -25,31 +24,24 @@ object ExposureManager {
private const val ENDPOINT = "cn-qingdao.log.aliyuncs.com"
private const val PROJECT = "ghzs"
private const val STORE_SIZE = 100
private const val STORE_FORCE_UPLOAD_PERIOD = 300 * 1000L
private const val LOG_STORE = BuildConfig.EXPOSURE_REPO
private val loghubHelper = LoghubHelper.getInstance()
// exposureCache 用来过滤掉具有相同 id 的曝光事件,避免重复发送事件
private val exposureSet = hashSetOf<ExposureEvent>()
private val exposureExecutor = Executors.newSingleThreadExecutor()
private val exposureCache = FixedSizeLinkedHashSet<String>(300)
private val exposureSet by lazy { hashSetOf<ExposureEvent>() }
private val exposureExecutor by lazy { Executors.newSingleThreadExecutor() }
private val exposureCache by lazy { FixedSizeLinkedHashSet<String>(300) }
private val exposureDao by lazy { ExposureDatabase.buildDatabase(HaloApp.getInstance().application).logHubEventDao() }
@JvmStatic
fun init() {
TimeUtil.init()
loghubHelper.init(HaloApp.getInstance().application, ENDPOINT, PROJECT, LOG_STORE) { TimeUtil.currentTimeMillis() }
exposureExecutor.execute {
val eventList = exposureDao.getAll()
exposureSet.addAll(eventList)
}
fixedRateTimer(name = "ExposureManager-Store-Checker", initialDelay = 500, period = STORE_FORCE_UPLOAD_PERIOD) {
commitSavedExposureEvents(true)
}
}
/**

View File

@ -1,5 +1,8 @@
package com.gh.common.exposure
import android.text.TextUtils
import com.g00fy2.versioncompare.Version
import com.gh.common.constant.Constants
import com.gh.common.util.PackageUtils
import com.gh.common.util.toObject
import com.gh.gamecenter.entity.ApkEntity
@ -15,6 +18,12 @@ object ExposureUtils {
traceEvent: ExposureEvent?,
downloadType: DownloadType): ExposureEvent {
val gameEntity = entity.clone()
gameEntity.id = if (entity.id.contains(Constants.GAME_ID_DIVIDER)) {
entity.id.split(Constants.GAME_ID_DIVIDER).toTypedArray()[0]
} else {
entity.id
}
gameEntity.gameVersion = entity.getApk().elementAtOrNull(0)?.version ?: gameEntity.gameVersion
gameEntity.platform = platform
gameEntity.downloadType = downloadType.toString()
val exposureEvent = ExposureEvent.createEvent(gameEntity = gameEntity,
@ -43,29 +52,30 @@ object ExposureUtils {
}
@JvmStatic
fun getDownloadType(apkEntity: ApkEntity, method: String) : DownloadType {
return if ("更新" == method) {
if (PackageUtils.isSignature(HaloApp.getInstance().application, apkEntity.packageName)) {
DownloadType.PLUGIN_UPDATE
fun getDownloadType(apkEntity: ApkEntity, gameId: String): DownloadType {
return if (PackageUtils.isInstalled(HaloApp.getInstance().application, apkEntity.packageName)) {
if (PackageUtils.isSignedByGh(HaloApp.getInstance().application, apkEntity.packageName)) {
if (PackageUtils.isCanUpdate(apkEntity, gameId)) {
DownloadType.PLUGIN_UPDATE
} else {
if (Version(apkEntity.version).isHigherThan(PackageUtils.getVersionByPackage(apkEntity.packageName))) {
DownloadType.UPDATE
} else {
DownloadType.DOWNLOAD
}
}
} else {
DownloadType.UPDATE
if (!TextUtils.isEmpty(apkEntity.ghVersion)) {
DownloadType.PLUGIN_DOWNLOAD
} else {
DownloadType.UPDATE
}
}
} else if ("插件化" == method) {
DownloadType.PLUGIN_DOWNLOAD
} else {
DownloadType.DOWNLOAD
}
}
@JvmStatic
fun getUpdateType(apkEntity: ApkEntity) : DownloadType {
return if (PackageUtils.isSignature(HaloApp.getInstance().application, apkEntity.packageName)) {
DownloadType.PLUGIN_UPDATE
} else {
DownloadType.UPDATE
}
}
enum class DownloadType {
DOWNLOAD,

View File

@ -1,30 +0,0 @@
package com.gh.common.exposure.time
import com.gh.gamecenter.entity.TimeEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import io.reactivex.schedulers.Schedulers
import kotlin.concurrent.fixedRateTimer
class Corrector {
companion object {
const val TIME_CORRECTOR_ADJUST_PERIOD: Long = 600000
}
var delta: Long = 0
init {
fixedRateTimer("TimeUtil-Corrector-Checker", initialDelay = 0, period = TIME_CORRECTOR_ADJUST_PERIOD) {
RetrofitManager.getInstance(HaloApp.getInstance().application).api.time
.subscribeOn(Schedulers.io())
.subscribe(object : Response<TimeEntity>() {
override fun onResponse(response: TimeEntity?) {
val serverTime = response?.time
serverTime?.let { delta = it * 1000 - System.currentTimeMillis() }
}
})
}
}
}

View File

@ -1,23 +1,15 @@
package com.gh.common.exposure.time
import com.gh.common.FixedRateJobHelper
object TimeUtil {
private lateinit var corrector: Corrector
fun init() {
corrector = Corrector()
}
fun currentTimeMillis(): Long {
return corrector.delta + System.currentTimeMillis()
return FixedRateJobHelper.timeDeltaBetweenServerAndClient + System.currentTimeMillis()
}
fun currentTime(): Int {
return if (::corrector.isInitialized) {
((corrector.delta + System.currentTimeMillis()) / 1000).toInt()
} else {
(System.currentTimeMillis() / 1000).toInt()
}
return ((FixedRateJobHelper.timeDeltaBetweenServerAndClient + System.currentTimeMillis()) / 1000).toInt()
}
}

View File

@ -0,0 +1,21 @@
package com.gh.common.filter
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
@Keep
data class RegionSetting(
@SerializedName("game_mirror")
var mirrorGameIdSet: HashSet<String>,
@SerializedName("game_block")
var filterGameIdSet: HashSet<String>,
@SerializedName("channel_control")
var channelControl: ChannelControl) {
@Keep
data class ChannelControl(
@SerializedName("game_category")
var gameCategory: String,
@SerializedName("effect")
var effect: Boolean)
}

View File

@ -0,0 +1,98 @@
package com.gh.common.filter
import android.annotation.SuppressLint
import com.gh.common.AppExecutor
import com.gh.common.constant.Constants
import com.gh.common.util.SPUtils
import com.gh.common.util.toJson
import com.gh.common.util.toObject
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Function
import io.reactivex.schedulers.Schedulers
object RegionSettingHelper {
private var mChannelControl: RegionSetting.ChannelControl? = null
private var mFilterGameIdSet: HashSet<String>? = hashSetOf()
private var mDisplayMirrorIfoGameIdSet: HashSet<String>? = hashSetOf()
private const val SP_SETTING = "region_setting"
fun shouldThisGameDisplayMirrorInfo(gameId: String): Boolean {
return mDisplayMirrorIfoGameIdSet?.contains(gameId) ?: false
}
@JvmStatic
fun shouldThisGameBeFiltered(gameId: String?): Boolean {
return mFilterGameIdSet?.contains(gameId) ?: false
}
@JvmStatic
fun filterGame(list: List<GameEntity>?): ArrayList<GameEntity> {
if (list == null) return arrayListOf()
if (mFilterGameIdSet?.isEmpty() == true) {
if (list is ArrayList) return list
}
val listCopy: ArrayList<GameEntity> = if (list is ArrayList) list else ArrayList(list)
listCopy.removeAll { mFilterGameIdSet?.contains(it.id) ?: false }
return listCopy
}
@JvmField
var filterGame = Function { list: List<GameEntity> ->
filterGame(list)
list
}
fun shouldGameOfThisCategoryUseMirrorInfo(category: String) : Boolean {
return if (mChannelControl == null || mChannelControl?.effect == false || !isUserUsedLessThan24Hours()) {
false
} else {
mChannelControl?.gameCategory == category
}
}
@SuppressLint("CheckResult")
@JvmStatic
fun getRegionSetting() {
// 使用默认的 Schdulers.io() 可能会触发 OOM
RetrofitManager.getInstance(HaloApp.getInstance().application)
.sensitiveApi
.getRegionSetting(HaloApp.getInstance().channel)
.subscribeOn(AppExecutor.cachedScheduler)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : BiResponse<RegionSetting>() {
override fun onSuccess(data: RegionSetting) {
updateSettingsInMemory(data)
SPUtils.setString(SP_SETTING, data.toJson())
}
override fun onFailure(exception: Exception) {
SPUtils.getString(SP_SETTING).toObject<RegionSetting>()?.let {
updateSettingsInMemory(it)
}
}
})
}
private fun updateSettingsInMemory(data: RegionSetting) {
mFilterGameIdSet = data.filterGameIdSet
mDisplayMirrorIfoGameIdSet = data.mirrorGameIdSet
mChannelControl = data.channelControl
}
/**
* 该用户是否是使用了不到 24 小时的新用户
*/
private fun isUserUsedLessThan24Hours(): Boolean {
val initialUsageTime = SPUtils.getLong(Constants.SP_INITIAL_USAGE_TIME, 0)
return !(initialUsageTime == 0L || System.currentTimeMillis() - initialUsageTime > 86400000)
}
}

View File

@ -15,7 +15,7 @@ import com.gh.gamecenter.room.converter.*
import com.gh.gamecenter.room.dao.*
import com.halo.assistant.HaloApp
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class], version = 5, exportSchema = false)
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class], version = 7, exportSchema = false)
@TypeConverters(CountConverter::class,
CommunityConverter::class,
TimeConverter::class,
@ -23,7 +23,8 @@ import com.halo.assistant.HaloApp
ThumbnailConverter::class,
TagStyleListConverter::class,
StringArrayListConverter::class,
CommunityVideoConverter::class)
CommunityVideoConverter::class,
UserConverter::class)
abstract class HistoryDatabase : RoomDatabase() {
@ -54,11 +55,27 @@ abstract class HistoryDatabase : RoomDatabase() {
}
}
val MIGRATION_5_6: Migration = object : Migration(5, 6) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("Alter TABLE MyVideoEntity add title TEXT NOT NULL DEFAULT ''")
database.execSQL("Alter TABLE MyVideoEntity add commentCount INTEGER NOT NULL DEFAULT 0")
database.execSQL("Alter TABLE MyVideoEntity add user TEXT NOT NULL DEFAULT ''")
}
}
val MIGRATION_6_7: Migration = object : Migration(6, 7) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("Alter TABLE HistoryGameEntity add iconSubscript TEXT DEFAULT ''")
}
}
val instance by lazy {
Room.databaseBuilder(HaloApp.getInstance().application, HistoryDatabase::class.java, "USER_TRACK_HISTORY_DATABASE")
.addMigrations(MIGRATION_2_3)
.addMigrations(MIGRATION_3_4)
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.addMigrations(MIGRATION_6_7)
.build()
}
}

View File

@ -4,9 +4,7 @@ import com.gh.common.runOnIoThread
import com.gh.common.util.clearHtmlFormatCompletely
import com.gh.common.util.removeInsertedContent
import com.gh.common.util.removeVideoContent
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.HistoryGameEntity
import com.gh.gamecenter.entity.NewsEntity
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.qa.entity.AnswerDetailEntity
import com.gh.gamecenter.qa.entity.AnswerEntity
import com.gh.gamecenter.qa.entity.ArticleDetailEntity
@ -24,11 +22,33 @@ object HistoryHelper {
runOnIoThread { HistoryDatabase.instance.articleDao().addArticle(articleEntity) }
}
@JvmStatic
fun insertGameEntity(gameEntity: GameEntity) {
val historyGameEntity = convertGameEntityToHistoryGameEntity(gameEntity)
runOnIoThread { HistoryDatabase.instance.gameDao().addGame(historyGameEntity) }
}
@JvmStatic
fun insertGameEntity(updateEntity: GameUpdateEntity) {
val historyGameEntity = convertGameUpdateEntityToHistoryGameEntity(updateEntity)
runOnIoThread { HistoryDatabase.instance.gameDao().addGame(historyGameEntity) }
}
private fun convertGameUpdateEntityToHistoryGameEntity(updateEntity: GameUpdateEntity): HistoryGameEntity{
val historyGame = HistoryGameEntity()
historyGame.orderTag = System.currentTimeMillis()
historyGame.id = updateEntity.id
historyGame.brief = updateEntity.brief
historyGame.des = ""
historyGame.icon = updateEntity.rawIcon ?: updateEntity.icon
historyGame.iconSubscript = historyGame.iconSubscript
historyGame.name = updateEntity.name
historyGame.tagStyle = updateEntity.tagStyle
historyGame.tag = updateEntity.tag
return historyGame
}
private fun convertGameEntityToHistoryGameEntity(gameEntity: GameEntity): HistoryGameEntity {
val historyGame = HistoryGameEntity()
@ -36,11 +56,11 @@ object HistoryHelper {
historyGame.id = gameEntity.id
historyGame.brief = gameEntity.brief
historyGame.des = gameEntity.des
historyGame.icon = gameEntity.icon
historyGame.icon = gameEntity.rawIcon ?: gameEntity.icon
historyGame.iconSubscript = gameEntity.iconSubscript
historyGame.name = gameEntity.name
historyGame.tagStyle = gameEntity.tagStyle
historyGame.tag = gameEntity.getTag()
historyGame.isLibaoExist = gameEntity.isLibaoExists
return historyGame
}
@ -70,6 +90,11 @@ object HistoryHelper {
runOnIoThread { HistoryDatabase.instance.answerDao().deleteAnswer(AnswerEntity().apply { primaryKey = answerId }) }
}
@JvmStatic
fun deleteVideoEntity(videoId: String) {
runOnIoThread { HistoryDatabase.instance.videoHistoryDao().deleteVideo(MyVideoEntity().apply { id = videoId }) }
}
@JvmStatic
fun emptyDatabase() {
runOnIoThread { HistoryDatabase.instance.clearAllTables() }

View File

@ -10,6 +10,7 @@ import android.content.Intent
import android.os.Build
import androidx.core.app.NotificationCompat
import com.gh.base.CurrentActivityHolder
import com.gh.common.util.doOnMainProcessOnly
import com.gh.gamecenter.R
import com.m7.imkfsdk.chat.ChatActivity
import com.m7.imkfsdk.utils.Utils
@ -25,51 +26,53 @@ class ImReceiver : BroadcastReceiver() {
var notificationManager: NotificationManager? = null
override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
if (intent.action == IMChatManager.NEW_MSG_ACTION) {
notificationManager = context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 判断 ImActivity 是否在最顶端
if (CurrentActivityHolder.getCurrentActivity() is ChatActivity) {
ImManager.showFloatingWindow()
ImManager.updateShouldShowFloatingWindowDot(false)
} else {
val contentIntent = Intent(Utils.getApp(), ChatActivity::class.java)
contentIntent.putExtra("PeerId", "")
contentIntent.putExtra("type", "peedId")
contentIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
val resultPendingIntent = PendingIntent.getActivity(
Utils.getApp(),
0,
contentIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
// 新的通知
val builder = NotificationCompat.Builder(Utils.getApp(), "Halo_IM")
val notification = builder.setTicker("您有新的消息")
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(R.drawable.ic_notification)
.setWhen(System.currentTimeMillis())
.setContentIntent(resultPendingIntent)
.setContentTitle("光环助手客服回复")
.setContentText("您有新的消息")
.setAutoCancel(true)
.build()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("Halo_IM", "Halo_IM", NotificationManager.IMPORTANCE_DEFAULT)
notificationManager?.createNotificationChannel(channel)
}
if (notification != null) {
notificationManager?.notify(NOTIFICATION_ID, notification)
context?.doOnMainProcessOnly {
intent?.let {
if (intent.action == IMChatManager.NEW_MSG_ACTION) {
notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 判断 ImActivity 是否在最顶端
if (CurrentActivityHolder.getCurrentActivity() is ChatActivity) {
ImManager.showFloatingWindow()
ImManager.updateShouldShowFloatingWindowDot(false)
} else {
val contentIntent = Intent(Utils.getApp(), ChatActivity::class.java)
contentIntent.putExtra("PeerId", "")
contentIntent.putExtra("type", "peedId")
contentIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
val resultPendingIntent = PendingIntent.getActivity(
Utils.getApp(),
0,
contentIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
// 新的通知
val builder = NotificationCompat.Builder(Utils.getApp(), "Halo_IM")
val notification = builder.setTicker("您有新的消息")
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(R.drawable.ic_notification)
.setWhen(System.currentTimeMillis())
.setContentIntent(resultPendingIntent)
.setContentTitle("光环助手客服回复")
.setContentText("您有新的消息")
.setAutoCancel(true)
.build()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("Halo_IM", "Halo_IM", NotificationManager.IMPORTANCE_DEFAULT)
notificationManager?.createNotificationChannel(channel)
}
if (notification != null) {
notificationManager?.notify(NOTIFICATION_ID, notification)
ImManager.showFloatingWindow()
}
}
} else if (intent.action == IMChatManager.FINISH_ACTION) {
ImManager.dismissFloatingWindow()
}
} else if (intent.action == IMChatManager.FINISH_ACTION) {
ImManager.dismissFloatingWindow()
}
}
}

View File

@ -1,21 +1,21 @@
package com.gh.common.loghub
import android.app.Application
import androidx.annotation.Keep
import com.aliyun.sls.android.sdk.model.Log
import com.aliyun.sls.android.sdk.model.LogGroup
import com.gh.common.exposure.ExposureEntity
import com.gh.common.exposure.meta.Meta
import com.gh.loghub.LoghubHelper
import org.json.JSONObject
import java.util.concurrent.Executors
import kotlin.concurrent.fixedRateTimer
object LoghubUtils {
private const val STORE_SIZE = 100
private const val STORE_FORCE_UPLOAD_INTERVAL = 120 * 1000L
private lateinit var mApplication: Application
private val loghubEventSet = hashSetOf<LoghubEvent>()
private val loghubEventSet by lazy { hashSetOf<LoghubEvent>() }
private val loghubEventExecutor by lazy { Executors.newSingleThreadExecutor() }
private val loghubEventDao by lazy { LoghubDatabase.buildDatabase(mApplication).logHubEventDao() }
@ -27,10 +27,6 @@ object LoghubUtils {
val eventList = loghubEventDao.getAll()
loghubEventSet.addAll(eventList)
}
fixedRateTimer(name = "Loghub-Event-Checker", initialDelay = 1000, period = STORE_FORCE_UPLOAD_INTERVAL) {
commitSavedLoghubEvents()
}
}
@JvmStatic
@ -50,11 +46,28 @@ object LoghubUtils {
}
}
@JvmStatic
fun log(jsonString: String, logStore: String, forcedUpload: Boolean) {
loghubEventExecutor.execute {
try {
val event = LoghubEvent(time = (System.currentTimeMillis() / 1000L).toString(), content = jsonString, logStore = logStore)
loghubEventSet.add(event)
loghubEventDao.insert(event)
} catch (e: Exception) {
e.printStackTrace()
}
if (forcedUpload || loghubEventSet.size >= STORE_SIZE) {
commitSavedLoghubEvents()
}
}
}
private fun uploadLogGroup(logGroup: LogGroup, logStore: String) {
LoghubHelper.getInstance().uploadLogGroup(logGroup, logStore)
}
private fun commitSavedLoghubEvents() {
fun commitSavedLoghubEvents() {
loghubEventExecutor.execute {
if (loghubEventSet.isEmpty()) return@execute
@ -75,8 +88,16 @@ object LoghubUtils {
}
val log = Log()
log.PutContent("current time ", event.time)
log.PutContent("content", event.content)
// 特殊处理以下logStore不需要用content包裹数据
if (event.logStore == "collection" || event.logStore == "common" || event.logStore == "halo-api-device-installed") {
val contentJson = JSONObject(event.content)
for (key in contentJson.keys()) {
log.PutContent(key, contentJson.get(key).toString())
}
} else {
log.PutContent("current time ", event.time)
log.PutContent("content", event.content)
}
logGroupHashMap[event.logStore]?.PutLog(log)
}
@ -85,4 +106,12 @@ object LoghubUtils {
}
}
}
}
@Keep
data class SimpleLogContainerEntity(
var event: String? = null,
var action: String? = null,
var meta: Meta? = null,
var payload: ExposureEntity? = null,
var timestamp: Long? = 0)

View File

@ -1,5 +1,6 @@
package com.gh.common.repository
import com.gh.common.filter.RegionSettingHelper
import com.gh.common.util.ApkActiveUtils
import com.gh.common.util.RandomUtils
import com.gh.gamecenter.entity.GameEntity
@ -15,7 +16,8 @@ object RemenkapaiRepository {
@JvmStatic
fun getRemenkapai(size: Int): Observable<List<GameEntity>> {
return if (remenkapaiList.isEmpty()) {
RetrofitManager.getInstance(getApplication()).api.remenkapai
RetrofitManager.getInstance(getApplication()).sensitiveApi.remenkapai
.map(RegionSettingHelper.filterGame)
.map { gameList -> filterEntityWithoutApk(gameList) }
.map { pickRandomSizeEntity(size) }
.map(ApkActiveUtils.filterMapperList)

View File

@ -0,0 +1,12 @@
package com.gh.common.syncpage
interface ISyncAdapterHandler {
/**
* @param position position to query
* @return Pair first: item sync id
* Pair second: item data entity
*/
fun getSyncData(position: Int): Pair<String, Any>?
}

View File

@ -0,0 +1,43 @@
package com.gh.common.syncpage
import androidx.annotation.Keep
@Keep
data class SyncDataEntity(
/**
* 标识一条数据的唯一ID
*
* 与[ISyncAdapterHandler.getSyncData]返回的Pair first一致
*/
val syncId: String,
/**
* 需要同步的字段名
*
* 与@SyncPage注解的值一致
*/
val syncFieldName: String?,
/**
* 需要同步的具体内容
*/
val syncFieldValue: Any?,
/**
* 同步完一次是否自动删除
*/
val remove: Boolean = true,
/**
* 是否需要查询同步实体的父级字段
*
* 由于反射可能会导致较大的性能消耗,默认关闭,具体按实际情况开启
*/
val checkInherited: Boolean = false,
/**
* 是否需要查询同步实体的嵌套实体内容
*
* 由于反射可能会导致较大的性能消耗,默认关闭,具体按实际情况开启
*/
val checkFieldEntity: Boolean = false)

View File

@ -0,0 +1,20 @@
package com.gh.common.syncpage
object SyncFieldConstants {
// 是否点赞
const val ANSWER_VOTE = "ANSWER_VOTE"
const val ARTICLE_VOTE = "ARTICLE_VOTE"
// 赞同数量
const val ANSWER_VOTE_COUNT = "ANSWER_VOTE_COUNT"
const val ARTICLE_VOTE_COUNT = "ARTICLE_VOTE_COUNT"
// 评论数量
const val ANSWER_COMMENT_COUNT = "ANSWER_COMMENT_COUNT"
const val ARTICLE_COMMENT_COUNT = "ARTICLE_COMMENT_COUNT"
// 回答数量
const val ANSWER_COUNT = "ANSWER_COUNT"
}

View File

@ -0,0 +1,154 @@
package com.gh.common.syncpage
import androidx.lifecycle.MutableLiveData
import com.gh.common.annotation.SyncIgnore
import com.gh.common.annotation.SyncPage
import com.gh.common.util.debugOnly
import com.gh.common.util.toJson
import com.gh.common.util.tryCatchInRelease
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import java.lang.reflect.Field
/**
* 页面之间实现数据同步(主要是单个字段的同步)
*
* 实现思路:
* 1.把需要同步的数据以一个特殊ID作为唯一标识并存于一个全局的仓库
* 2.利用LiveData进行页面回调,再通过[ISyncAdapterHandler.getSyncData]找到需要被同步的数据
* 3.最后利用反射进行数据替换,具体请见[SyncPageRepository.replaceSyncData]
*
* 具体的接入方式(以列表为例)
* 1.通过[SyncPageRepository.postSyncData]提交同步数据
* 2.在Fragment重写[BaseFragment.addSyncPageObserver]开启同步事件监听
* 3.在Fragment重写[BaseFragment.provideSyncAdapter]提供获取数据的来源
* - [BaseFragment.provideSyncAdapter]提供的Adapter必须实现[ISyncAdapterHandler]接口
*
*/
object SyncPageRepository {
// 只有在新增操作时,才需要进行页面刷新
val syncPageLiveData = MutableLiveData<List<SyncDataEntity>>()
val syncDataList = ArrayList<SyncDataEntity>()
// size: 防止删除刚刚添加的数据
@JvmStatic
fun clearSyncData() {
tryCatchInRelease {
synchronized(syncDataList) {
if (syncDataList.size > 0) {
debugOnly {
Utils.log("SyncPageRepository clearSyncData 存在" + syncDataList.size + "条数据尚未处理,即将删除")
}
syncDataList.clear()
}
}
}
}
@JvmStatic
fun removeSyncData(list: List<SyncDataEntity>) {
tryCatchInRelease {
synchronized(syncDataList) {
for (syncDataEntity in list) {
val remove = syncDataList.remove(syncDataEntity)
debugOnly {
Utils.log("SyncPageRepository removeSyncData ->" + syncDataEntity.syncId +
", fieldName->" + syncDataEntity.syncFieldName +
", remove->" + remove)
}
}
}
}
debugOnly {
Utils.log("SyncPageRepository removeSyncData ->" + syncDataList.size)
}
}
// 提交同步数据
fun postSyncData(entity: SyncDataEntity) {
tryCatchInRelease {
synchronized(syncDataList) {
// 检查是否存在重复操作
for (syncDataEntity in syncDataList) {
if (syncDataEntity.syncId == entity.syncId && syncDataEntity.syncFieldName == entity.syncFieldName) {
syncDataList.remove(syncDataEntity)
debugOnly {
Utils.log("SyncPageRepository postSyncData 存在重复操作->" + entity.toJson())
}
break
}
}
syncDataList.add(entity)
syncPageLiveData.postValue(syncDataList)
debugOnly {
Utils.log("SyncPageRepository postSyncData->" + entity.toJson())
}
}
}
}
fun handleSyncData(rawData: Any, syncData: SyncDataEntity): Boolean {
val fields = if (syncData.checkInherited) {
getAllFieldsList(rawData::class.java)
} else rawData::class.java.declaredFields.toList()
var isNeedNotify = false
for (field in fields) {
isNeedNotify = replaceSyncData(field, rawData, syncData)
if (isNeedNotify) break
}
if (!isNeedNotify) {
debugOnly {
Utils.log("SyncPageRepository sync failure-> " + syncData.syncFieldName)
}
}
return isNeedNotify
}
private fun replaceSyncData(field: Field, extractObject: Any, syncData: SyncDataEntity): Boolean {
field.getAnnotation(SyncPage::class.java)?.syncNames?.forEach { syncName ->
if (syncName == syncData.syncFieldName && field.getAnnotation(SyncIgnore::class.java) == null) {
field.isAccessible = true
debugOnly {
Utils.log("SyncPageRepository sync success-> " + syncData.syncFieldName + ", fieldName->" + field.name + ", fieldValue->" + field.get(extractObject))
}
field.set(extractObject, syncData.syncFieldValue)
return true
}
}
if (syncData.checkFieldEntity) {
// 递归查询
val pkgName = field.type.getPackage()?.name ?: return false
if (pkgName.contains(HaloApp.getInstance().application.packageName) && field.getAnnotation(SyncIgnore::class.java) == null) {
field.isAccessible = true
val extractEntityObject = field.get(extractObject) ?: return false
field.type.declaredFields.forEach {
if (replaceSyncData(it, extractEntityObject, syncData)) return true
}
}
}
return false
}
// 包括父类 Field 对象
private fun getAllFieldsList(cls: Class<*>?): List<Field> {
if (cls == null) return arrayListOf()
val allFields = arrayListOf<Field>()
var currentClass = cls
while (currentClass != null) {
val declaredFields = currentClass.declaredFields
allFields.addAll(declaredFields)
currentClass = currentClass.superclass
}
return allFields
}
}

View File

@ -0,0 +1,98 @@
package com.gh.common.syncpage.example
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.constant.ItemViewType
import com.gh.common.syncpage.ISyncAdapterHandler
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
import com.gh.gamecenter.baselist.ListAdapter
import com.gh.gamecenter.databinding.CommunityAnswerItemBinding
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.answer.CommunityAnswerItemViewHolder
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
import com.gh.gamecenter.qa.entity.AnswerEntity
import com.gh.gamecenter.qa.entity.Questions
import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity
class ExampleAdapter(context: Context) : ListAdapter<AnswerEntity>(context), ISyncAdapterHandler {
override fun areItemsTheSame(oldItem: AnswerEntity?, newItem: AnswerEntity?): Boolean {
return oldItem?.id == newItem?.id
}
override fun getItemViewType(position: Int): Int {
if (position == itemCount - 1) return ItemViewType.ITEM_FOOTER
return ItemViewType.ITEM_BODY
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view: View
return when (viewType) {
ItemViewType.ITEM_FOOTER -> {
view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)
FooterViewHolder(view)
}
else -> {
view = mLayoutInflater.inflate(R.layout.community_answer_item, parent, false)
CommunityAnswerItemViewHolder(CommunityAnswerItemBinding.bind(view))
}
}
}
override fun getItemCount(): Int {
return if (mEntityList.isNotEmpty()) mEntityList.size + FOOTER_ITEM_COUNT else 0
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) {
ItemViewType.ITEM_BODY -> {
val answer = mEntityList[position]
if ("community_article" == answer.type) {
val questions = Questions()
questions.title = answer.articleTitle
answer.questions = questions
}
val answerViewHolder = holder as CommunityAnswerItemViewHolder
val binding = answerViewHolder.binding
answerViewHolder.bindAnswerItem(answer, "", getPath())
binding.title.setOnClickListener {
if ("community_article" == answer.type) {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answer.id!!, "", getPath()))
} else {
val questions = answer.questions
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "", getPath()))
}
}
answerViewHolder.itemView.setOnClickListener {
if ("community_article" == answer.type) {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answer.id!!, "", getPath()))
} else {
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answer.id, "", getPath()))
}
}
}
ItemViewType.ITEM_FOOTER -> {
val footerViewHolder = holder as FooterViewHolder
footerViewHolder.initItemPadding()
footerViewHolder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint)
}
}
}
override fun getSyncData(position: Int): Pair<String, AnswerEntity>? {
if (position >= mEntityList.size) return null
val entity = mEntityList[position]
return Pair(entity.id ?: "", entity)
}
fun getPath(): String {
return "问答-推荐-按时间"
}
}

View File

@ -0,0 +1,65 @@
package com.gh.common.syncpage.example
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.view.VerticalItemDecoration
import com.gh.gamecenter.baselist.ListFragment
import com.gh.gamecenter.baselist.NormalListViewModel
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.entity.AnswerEntity
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import io.reactivex.Observable
class ExampleFragment : ListFragment<AnswerEntity, NormalListViewModel<AnswerEntity>>() {
private var mAdapter: ExampleAdapter? = null
override fun provideListAdapter(): ExampleAdapter {
if (mAdapter == null) {
mAdapter = ExampleAdapter(requireContext())
}
return mAdapter!!
}
override fun getItemDecoration(): RecyclerView.ItemDecoration {
return VerticalItemDecoration(context, 8F, false)
}
override fun provideDataObservable(page: Int): Observable<MutableList<AnswerEntity>> {
return RetrofitManager.getInstance(context).api.getCommunitiesRecommendNewest(UserManager.getInstance().community.id, page)
}
override fun provideListViewModel(): NormalListViewModel<AnswerEntity> {
val factory = NormalListViewModel.Factory(HaloApp.getInstance().application, this)
return ViewModelProviders.of(this, factory).get(NormalListViewModel::class.java) as NormalListViewModel<AnswerEntity>
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// SyncPageRepository.syncPageLiveData.observe(this, Observer {
// it ?: return@Observer
// val adapter = mListRv.adapter
// if (adapter !is ISyncAdapterHandler) return@Observer
// for(position in 0 until adapter.itemCount) {
// val syncKey = adapter.getSyncData(position)
// for (syncDataEntity in it) {
// if (syncDataEntity.syncId == syncKey?.first) {
// val isSuccess = SyncPageRepository.handleSyncData(syncKey.second, syncDataEntity)
// if (isSuccess) adapter.notifyItemChanged(position)
// }
// }
// }
// })
}
override fun provideSyncAdapter(): RecyclerView.Adapter<*>? {
return mListRv.adapter
}
override fun addSyncPageObserver(): Boolean {
return true
}
}

View File

@ -0,0 +1,14 @@
package com.gh.common.util
import com.alibaba.wireless.security.jaq.avmp.IJAQAVMPSignComponent
import com.alibaba.wireless.security.open.SecurityGuardManager
import com.halo.assistant.HaloApp
object AntiBotHelper {
@JvmStatic
val manager by lazy {
SecurityGuardManager.getInstance(HaloApp.getInstance().application).getInterface(IJAQAVMPSignComponent::class.java).apply {
this.initialize()
}
}
}

View File

@ -0,0 +1,6 @@
package com.gh.common.util
interface BiCallback<FIRST, SECOND> {
fun onFirst(first: FIRST)
fun onSecond(second: SECOND)
}

View File

@ -1,14 +1,19 @@
package com.gh.common.util
import android.content.Context
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import com.gh.common.util.CommentUtils.copyText
import com.gh.common.view.BugFixedPopupWindow
import com.gh.gamecenter.CommentDetailActivity
import com.gh.gamecenter.MessageDetailActivity
import com.gh.gamecenter.adapter.OnCommentCallBackListener
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.CommentEntity
import com.gh.gamecenter.entity.MeEntity
import com.gh.gamecenter.entity.Permissions
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.comment.OnCommentOptionClickListener
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.lightgame.utils.Utils
@ -23,13 +28,13 @@ import retrofit2.HttpException
object CommentHelper {
@JvmStatic
fun showCommunityArticleCommentOptions(context: Context,
fun showCommunityArticleCommentOptions(view: View,
commentEntity: CommentEntity,
showConversation: Boolean,
articleId: String,
communityId: String,
listener: OnCommentCallBackListener?) {
showCommentOptions(context = context,
listener: OnCommentOptionClickListener?) {
showCommentOptions(view = view,
commentEntity = commentEntity,
showConversation = showConversation,
articleId = articleId,
@ -38,12 +43,12 @@ object CommentHelper {
}
@JvmStatic
fun showAnswerCommentOptions(context: Context,
fun showAnswerCommentOptions(view: View,
commentEntity: CommentEntity,
showConversation: Boolean,
answerId: String,
listener: OnCommentCallBackListener?) {
showCommentOptions(context = context,
listener: OnCommentOptionClickListener?) {
showCommentOptions(view = view,
commentEntity = commentEntity,
showConversation = showConversation,
answerId = answerId,
@ -51,27 +56,34 @@ object CommentHelper {
}
@JvmStatic
fun showVideoCommentOptions(context: Context,
fun showVideoCommentOptions(view: View,
commentEntity: CommentEntity,
showConversation: Boolean,
videoId: String,
listener: OnCommentCallBackListener?) {
showCommentOptions(context = context,
isVideoAuthor: Boolean,
listener: OnCommentOptionClickListener?) {
showCommentOptions(view = view,
commentEntity = commentEntity,
showConversation = showConversation,
videoId = videoId,
isVideoAuthor = isVideoAuthor,
listener = listener)
}
private fun showCommentOptions(context: Context,
private fun showCommentOptions(view: View,
commentEntity: CommentEntity,
showConversation: Boolean,
articleId: String? = null,
communityId: String? = null,
answerId: String? = null,
videoId: String? = null,
listener: OnCommentCallBackListener? = null) {
isVideoAuthor: Boolean = false,
listener: OnCommentOptionClickListener? = null) {
val context = view.context
val dialogOptions = ArrayList<String>()
if (isVideoAuthor || (videoId != null && commentEntity.user.id == UserManager.getInstance().userId)) {
dialogOptions.add("删除评论")
}
dialogOptions.add("复制")
dialogOptions.add("投诉")
@ -88,55 +100,75 @@ object CommentHelper {
dialogOptions.add("查看对话")
}
DialogUtils.showListDialog(context, dialogOptions, null) {
when (it) {
"管理" -> showControlDialog(context, answerId, articleId, communityId, commentEntity, commentEntity.me!!)
val inflater = LayoutInflater.from(context)
val layout = inflater.inflate(R.layout.comment_more_option, null)
val popupWindow = BugFixedPopupWindow(layout,
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT)
val container = layout.findViewById<LinearLayout>(R.id.container)
for (text in dialogOptions) {
val item = inflater.inflate(R.layout.comment_more_option_item, container, false)
container.addView(item)
"复制" -> copyText(commentEntity.content, context)
val hitText = item.findViewById<TextView>(R.id.hint_text)
hitText.text = text
"投诉" -> {
context.ifLogin("回答详情-评论-投诉") {
showReportTypeDialog(context) { reportType ->
item.setOnClickListener {
popupWindow.dismiss()
listener?.onCommentOptionClick(commentEntity, text)
when (text) {
"管理" -> showControlDialog(context, answerId, articleId, communityId, commentEntity, commentEntity.me!!)
val commentListener = object : PostCommentUtils.PostCommentListener {
override fun postSuccess(response: JSONObject?) {
Utils.toast(context, "感谢您的投诉")
}
"复制" -> copyText(commentEntity.content, context)
override fun postFailed(error: Throwable?) {
if (error == null) {
Utils.toast(context, "投诉失败,请稍后重试")
} else {
Utils.toast(context, "投诉失败,${error.message}")
"投诉" -> {
context.ifLogin("回答详情-评论-投诉") {
showReportTypeDialog(context) { reportType ->
val commentListener = object : PostCommentUtils.PostCommentListener {
override fun postSuccess(response: JSONObject?) {
Utils.toast(context, "感谢您的投诉")
}
override fun postFailed(error: Throwable?) {
if (error == null) {
Utils.toast(context, "投诉失败,请稍后重试")
} else {
Utils.toast(context, "投诉失败,${error.message}")
}
}
}
}
if (answerId != null) {
PostCommentUtils.postAnswerReportData(context, commentEntity.id, answerId, reportType, commentListener)
} else if (articleId != null) {
PostCommentUtils.reportCommunityArticleComment(context, communityId, articleId, commentEntity.id, reportType, commentListener)
} else {
PostCommentUtils.reportVideoComment(context, videoId, commentEntity.id, reportType, commentListener)
if (answerId != null) {
PostCommentUtils.postAnswerReportData(context, commentEntity.id, answerId, reportType, commentListener)
} else if (articleId != null) {
PostCommentUtils.reportCommunityArticleComment(context, communityId, articleId, commentEntity.id, reportType, commentListener)
} else {
PostCommentUtils.reportVideoComment(context, videoId, commentEntity.id, reportType, commentListener)
}
}
}
}
}
"查看对话" -> {
if (answerId != null) {
context.startActivity(CommentDetailActivity
.getAnswerCommentIntent(context, commentEntity.id, answerId, null))
} else if (articleId != null) {
context.startActivity(CommentDetailActivity
.getCommunityArticleCommentIntent(context, articleId, commentEntity.id, communityId, null))
} else {
context.startActivity(CommentDetailActivity
.getVideoCommentIntent(context, commentEntity.id, videoId, null))
"查看对话" -> {
if (answerId != null) {
context.startActivity(CommentDetailActivity
.getAnswerCommentIntent(context, commentEntity.id, answerId, null))
} else if (articleId != null) {
context.startActivity(CommentDetailActivity
.getCommunityArticleCommentIntent(context, articleId, commentEntity.id, communityId, null))
} else {
context.startActivity(CommentDetailActivity
.getVideoCommentIntent(context, commentEntity.id, videoId, isVideoAuthor, null))
}
}
}
}
}
popupWindow.isTouchable = true
popupWindow.isFocusable = true
popupWindow.showAutoOrientation(view)
}
private fun showControlDialog(context: Context,

View File

@ -33,6 +33,7 @@ import java.lang.ref.WeakReference;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
@ -51,8 +52,12 @@ public class CommentUtils {
public static void setCommentTime(TextView textView, long time) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
long today = format.parse(format.format(new Date())).getTime();
long day = time * 1000;
String year = String.valueOf(Calendar.getInstance().get(Calendar.YEAR));
format.applyPattern("yyyy");
String currentYear = format.format(day);
format.applyPattern("yyyyMMdd");
long today = format.parse(format.format(new Date())).getTime();
if (day >= today && day < today + 86400 * 1000) {
long min = new Date().getTime() / 1000 - day / 1000;
int hour = (int) (min / (60 * 60));
@ -68,6 +73,13 @@ public class CommentUtils {
} else if (day >= today - 86400 * 1000 && day < today) {
format.applyPattern("HH:mm");
textView.setText("昨天 ");
} else if (day >= today - 86400 * 1000 * 7 && day < today - 86400 * 1000) {
format.applyPattern("HH:mm");
long days = (today - day) / 86400000 + 1;
textView.setText(String.format(Locale.getDefault(), "%d天前 ", days));
} else if (day < today - 86400 * 1000 * 7 && year.equals(currentYear)) {
format.applyPattern("MM-dd");
textView.setText(format.format(day));
} else {
format.applyPattern("yyyy-MM-dd");
textView.setText(format.format(day));
@ -199,7 +211,7 @@ public class CommentUtils {
final TextView commentLikeCountTv, final ImageView commentLikeIv,
final OnVoteListener listener) {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme_font)) {
Utils.toast(context, "已经点过赞啦!");
ToastUtils.INSTANCE.showToast("已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
@ -236,7 +248,7 @@ public class CommentUtils {
try {
String detail = new JSONObject(exception.response().errorBody().string()).getString("detail");
if ("voted".equals(detail)) {
Utils.toast(context, "已经点过赞啦!");
ToastUtils.INSTANCE.showToast("已经点过赞啦!");
}
} catch (Exception ex) {
ex.printStackTrace();
@ -265,7 +277,7 @@ public class CommentUtils {
}
CheckLoginUtils.checkLogin(context, entrance, () -> {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme_font)) {
Utils.toast(context, "已经点过赞啦!");
ToastUtils.INSTANCE.showToast("已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
@ -301,7 +313,7 @@ public class CommentUtils {
try {
String detail = new JSONObject(exception.response().errorBody().string()).getString("detail");
if ("voted".equals(detail)) {
Utils.toast(context, "已经点过赞啦!");
ToastUtils.INSTANCE.showToast("已经点过赞啦!");
}
} catch (Exception ex) {
ex.printStackTrace();
@ -421,7 +433,7 @@ public class CommentUtils {
ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(copyContent);
Utils.toast(context, "复制成功");
ToastUtils.INSTANCE.showToast("复制成功");
}

View File

@ -5,6 +5,7 @@ import android.graphics.BitmapFactory
import android.graphics.Matrix
import com.gh.common.constant.Config
import com.gh.gamecenter.entity.SettingsEntity
import com.github.piasy.biv.metadata.ImageInfoExtractor
import com.halo.assistant.HaloApp
import java.io.File
import java.io.FileOutputStream
@ -26,11 +27,16 @@ object CompressImageUtils {
* 压缩图片并保存到目标文件
* 该压缩方法是同步执行 请勿在主线程执行
* 返回源文件的三种情况:小于特定值,图片类型为GIF,压缩失败
* ---------------------------------------------------------------------------------------------
* 关于压缩格式问题:
* 1.图片详情对动态Webp/静态Webp的判断存在问题导致部分静态Webp图片误判为动态Webp而直接委托Fresco处理出现无法缩放问题
* 2.为了解决上述问题如果压缩是检测到是动态Webp时直接压缩为JPEG这样就能解决图片详情无法缩放问题todo 这样会导致动态Webp无法播放
*/
@Throws(Exception::class)
fun compressImageAndSaveToFile(imageFile: File, compressGif: Boolean): File {
val imageType = ImageInfoExtractor.getImageType(imageFile)
// 小于某一个设定的值时,直接返回原图
if (imageFile.length() < getImageSetting().processLimitSize) {
if (imageType != ImageInfoExtractor.TYPE_ANIMATED_WEBP && imageFile.length() < getImageSetting().processLimitSize) {
return imageFile
}
@ -49,7 +55,7 @@ object CompressImageUtils {
} else if (options.outMimeType.contains("gif") && !compressGif) { // gif直接返回原图
return imageFile
} else {
Bitmap.CompressFormat.WEBP
Bitmap.CompressFormat.JPEG
}
fileOutputStream = FileOutputStream(cacheDir)
@ -165,6 +171,7 @@ object CompressImageUtils {
enum class CompressType {
// 0: 短边等比压缩至1280 H:长边 W:短边
LIMIT_SHORT,
// 1: 取长边等比压缩至1280 H:短边 W: 长边
LIMIT_LONG
}

View File

@ -6,7 +6,7 @@ import android.widget.LinearLayout;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.gamecenter.ViewImageActivity;
import com.gh.gamecenter.ImageViewerActivity;
import java.util.ArrayList;
import java.util.List;
@ -93,7 +93,7 @@ public class ConcernContentUtils {
break;
}
imageView.setOnClickListener(v -> {
Intent checkIntent = ViewImageActivity.getViewImageIntent(context, (ArrayList<String>) list, position, entrance);
Intent checkIntent = ImageViewerActivity.getIntent(context, (ArrayList<String>) list, position, entrance);
context.startActivity(checkIntent);
});
return imageView;

View File

@ -3,17 +3,18 @@ package com.gh.common.util;
import android.content.Context;
import android.os.Build;
import com.gh.common.constant.Constants;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.NewsDetailEntity;
import com.gh.gamecenter.manager.DataCollectionManager;
import com.gh.gamecenter.manager.PackagesManager;
import com.lightgame.download.DownloadEntity;
import org.json.JSONArray;
import java.util.HashMap;
import java.util.Map;
import kotlin.text.StringsKt;
/**
* Created by LGT on 2016/12/9.
* 数据收集 工具类data.ghzs666.com
@ -33,8 +34,8 @@ public class DataCollectionUtils {
// 上传下载数据(开始、完成)
public static void uploadDownload(Context context, DownloadEntity downloadEntity, String status) {
Map<String, Object> map = new HashMap<>();
map.put("game", downloadEntity.getName());
map.put("game_id", downloadEntity.getGameId());
map.put("game", StringsKt.removeSuffix(downloadEntity.getName(), Constants.GAME_NAME_DECORATOR));
map.put("game_id", downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER));
if (downloadEntity.isPluggable()) {
map.put("method", "插件化");
map.put("btn_status", "插件化");
@ -169,24 +170,4 @@ public class DataCollectionUtils {
map.put("type", args[2]);
DataCollectionManager.onEvent(context, "concern", map);
}
//上传推荐位数据
public static void uploadPosition(Context context, String... args) {
if (args.length < 3) {
return;
}
Map<String, Object> map = new HashMap<>();
map.put("page", args[0]);
map.put("location", args[1]);
map.put("name", args[2]);
DataCollectionManager.onEvent(context, "position", map);
}
//上传应用列表
public static void uploadAppList(Context context, JSONArray applist) {
Map<String, Object> map = new HashMap<>();
map.put("applist", applist);
DataCollectionManager.onEvent(context, "applist", map);
}
}

View File

@ -2,8 +2,7 @@ package com.gh.common.util;
import android.content.Context;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.gh.common.loghub.LoghubUtils;
import com.halo.assistant.HaloApp;
import com.lightgame.download.DownloadEntity;
import com.lightgame.utils.Util_System_Phone_State;
@ -14,12 +13,6 @@ import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
/**
* Created by LGT on 2016/12/8.
* 日志上传工具类
@ -27,12 +20,13 @@ import okhttp3.ResponseBody;
public class DataLogUtils {
// 轮播图
public static void uploadLunbotuLog(Context context, String type, String text, String index, String source) {
public static void uploadLunbotuLog(Context context, String type, String text, String title, String index, String source) {
Map<String, Object> map = new HashMap<>();
map.put("index", index);
map.put("type", type);
map.put("text", text);
map.put("source", source);
map.put("slide_title", title);
uploadLog(context, "slide", map);
}
@ -68,12 +62,7 @@ public class DataLogUtils {
params.put("time", String.valueOf(Utils.getTime(context)));
params.put("content", new JSONObject(map).toString());
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
new JSONObject(params).toString());
RetrofitManager.getInstance(context).getData().postLog(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>());
LoghubUtils.log(new JSONObject(params), "common", true);
}
// 网络错误

View File

@ -3,19 +3,16 @@ package com.gh.common.util;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import com.gh.common.constant.Config;
import com.gh.common.constant.Constants;
import com.gh.common.exposure.meta.MetaUtil;
import com.gh.gamecenter.BuildConfig;
import com.gh.gid.GidCallback;
import com.gh.gid.GidHelper;
import com.halo.assistant.HaloApp;
import com.lightgame.config.CommonDebug;
import com.lightgame.utils.Util_System_Phone_State;
import com.lightgame.utils.Utils;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.stat.MtaSDkException;
@ -126,18 +123,25 @@ public class DataUtils {
public static void getGid() {
GidHelper.getInstance().registerDevice(new GidCallback() {
@Override
public void onSuccess(String s) {
Utils.log("Gid", s);
PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication()).edit().putString(Constants.DEVICE_KEY, s).apply();
public void onSuccess(String gid) {
Utils.log("Gid", gid);
PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication()).edit().putString(Constants.DEVICE_KEY, gid).apply();
String originalGid = HaloApp.getInstance().getGid();
HaloApp.getInstance().setGid(gid);
// 避免重复调用
if (!TextUtils.isEmpty(gid) && !gid.equals(originalGid)) {
GameSubstituteRepositoryHelper.updateSubstitutableGames();
}
HaloApp.getInstance().setGid(s);
// 避免初始化顺序问题导致 MetaUtil 一直持有空的 gid
MetaUtil.INSTANCE.refreshMeta();
}
@Override
public void onFailure(String s) {
Utils.log(s);
MtaHelper.onEventWithBasicDeviceInfo("开发辅助", "GID 获取异常", s);
}
});
}
@ -197,36 +201,36 @@ public class DataUtils {
// 游戏下载
public static void onGameDownloadEvent(Context context, String gameName, String platform, String entrance, String status, String method) {
Map<String, Object> kv = new HashMap<>();
platform = PlatformUtils.getInstance(HaloApp.getInstance().getApplication()).getPlatformName(platform);
kv.put("版本", platform);
kv.put("用户机型", Build.MODEL);
kv.put("设备IMEI", Util_System_Phone_State.getDeviceId(HaloApp.getInstance().getApplication()));
kv.put("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication()));
kv.put("光环助手版本", BuildConfig.VERSION_NAME);
kv.put("位置", entrance);
kv.put("类型", method);
kv.put("厂商", Build.MANUFACTURER);
kv.put("Android版本", Build.VERSION.RELEASE);
onEvent(context, "游戏下载", gameName, kv);
Map<String, Object> kv2 = new HashMap<>();
kv2.put("状态", status);
kv2.put("位置", entrance);
if (status.equals("开始")) {
kv2.put("版本", entrance + "-开始");
kv2.put("游戏分平台", gameName + "-" + platform + "-开始");
kv2.put("光环助手版本", BuildConfig.VERSION_NAME + "-开始");
} else {
kv2.put("版本", platform);
kv2.put("游戏分平台", gameName + "-" + platform);
kv2.put("光环助手版本", BuildConfig.VERSION_NAME);
}
onEvent(context, "游戏下载位置", gameName, kv2);
// Map<String, Object> kv = new HashMap<>();
//
// platform = PlatformUtils.getInstance(HaloApp.getInstance().getApplication()).getPlatformName(platform);
//
// kv.put("版本", platform);
// kv.put("用户机型", Build.MODEL);
// kv.put("设备IMEI", Util_System_Phone_State.getDeviceId(HaloApp.getInstance().getApplication()));
// kv.put("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication()));
// kv.put("光环助手版本", BuildConfig.VERSION_NAME);
// kv.put("位置", entrance);
// kv.put("类型", method);
// kv.put("厂商", Build.MANUFACTURER);
// kv.put("Android版本", Build.VERSION.RELEASE);
// onEvent(context, "游戏下载", gameName, kv);
//
// Map<String, Object> kv2 = new HashMap<>();
// kv2.put("状态", status);
// kv2.put("位置", entrance);
//
// if (status.equals("开始")) {
// kv2.put("版本", entrance + "-开始");
// kv2.put("游戏分平台", gameName + "-" + platform + "-开始");
// kv2.put("光环助手版本", BuildConfig.VERSION_NAME + "-开始");
// } else {
// kv2.put("版本", platform);
// kv2.put("游戏分平台", gameName + "-" + platform);
// kv2.put("光环助手版本", BuildConfig.VERSION_NAME);
// }
//
// onEvent(context, "游戏下载位置", gameName, kv2);
}
// 游戏更新

View File

@ -6,6 +6,8 @@ import android.view.View;
import com.gh.common.constant.Config;
import com.gh.common.repository.ReservationRepository;
import com.gh.common.view.DownloadProgressBar;
import com.gh.common.xapk.XapkInstaller;
import com.gh.common.xapk.XapkUnzipStatus;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.DetailViewHolder;
@ -22,6 +24,7 @@ import com.lightgame.download.DownloadEntity;
public class DetailDownloadUtils {
public static void detailInitDownload(DetailViewHolder viewHolder, boolean isCheck) {
String downloadAddWord = viewHolder.gameEntity.getDownloadAddWord();
if (viewHolder.gameEntity != null
&& Config.isShowDownload(viewHolder.gameEntity.getId())
@ -34,10 +37,11 @@ public class DetailDownloadUtils {
if (viewHolder.gameEntity.isReservable()) {
if (!ReservationRepository.thisGameHasBeenReserved(viewHolder.gameEntity.getId())) {
if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
if (TextUtils.isEmpty(downloadAddWord)) {
viewHolder.mDownloadPb.setText(String.format("预约" + "《%s》", viewHolder.gameEntity.getName()));
} else {
viewHolder.mDownloadPb.setText(String.format("预约" + "《%s》%s", viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
viewHolder.mDownloadPb.setText(String.format("预约" + "《%s》%s", viewHolder.gameEntity.getName(), downloadAddWord));
}
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.RESERVABLE);
} else {
@ -49,10 +53,10 @@ public class DetailDownloadUtils {
if (viewHolder.gameEntity.getApk().isEmpty() || viewHolder.gameEntity.getDownloadOffStatus() != null) {
LinkEntity h5LinkEntity = viewHolder.gameEntity.getH5Link();
if (h5LinkEntity != null) {
if ("play".equals(h5LinkEntity.getType())) {
String defaultString = String.format("开始玩" + "《%s》", viewHolder.gameEntity.getName());
String defaultString = String.format("开始玩" + "《%s》", viewHolder.gameEntity.getName());
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(h5LinkEntity.getText()) ? defaultString : h5LinkEntity.getText());
} else {
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(h5LinkEntity.getText()) ? "查看" : h5LinkEntity.getText());
@ -60,35 +64,39 @@ public class DetailDownloadUtils {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.H5_GAME);
} else {
if ("dialog".equals(viewHolder.gameEntity.getDownloadOffStatus())) {
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.downloadOffText) ? "查看详情" : viewHolder.downloadOffText);
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.gameEntity.getDownloadOffText()) ? "查看详情" : viewHolder.gameEntity.getDownloadOffText());
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NONE_WITH_HINT);
} else {
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.downloadOffText) ? "暂无下载" : viewHolder.downloadOffText);
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.gameEntity.getDownloadOffText()) ? "暂无下载" : viewHolder.gameEntity.getDownloadOffText());
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NONE);
}
}
} else {
} else if (viewHolder.gameEntity.getApk().size() == 1) {
String status = GameUtils.getDownloadBtnText(viewHolder.context, viewHolder.gameEntity, PluginLocation.only_game);
switch (status) {
case "插件化":
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.PLUGIN);
break;
case "打开":
case "启动":
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.LAUNCH_OR_OPEN);
break;
default:
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NORMAL);
break;
if (viewHolder.context.getString(R.string.pluggable).equals(status)) {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.PLUGIN);
} else if (viewHolder.context.getString(R.string.launch).equals(status)) {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.LAUNCH_OR_OPEN);
} else {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NORMAL);
}
String downloadText;
if (viewHolder.isNewsDetail) {
viewHolder.mDownloadPb.setText(status);
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
viewHolder.mDownloadPb.setText(String.format(status + "《%s》", viewHolder.gameEntity.getName()));
downloadText = status;
} else if (viewHolder.context.getString(R.string.pluggable).equals(status)) {
downloadText = "升级" + (TextUtils.isEmpty(downloadAddWord) ? "" : "" + downloadAddWord) + getDownloadSizeText(viewHolder);
} else if (viewHolder.context.getString(R.string.launch).equals(status)) {
downloadText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : "-" + downloadAddWord);
} else if (viewHolder.context.getString(R.string.attempt).equals(status)) {
downloadText = status + getDownloadSizeText(viewHolder);
} else {
viewHolder.mDownloadPb.setText(String.format(status + "《%s》%s", viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
downloadText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : downloadAddWord) + getDownloadSizeText(viewHolder);
}
viewHolder.mDownloadPb.setText(downloadText);
} else {
viewHolder.mDownloadPb.setText("选择下载你的版本" + (TextUtils.isEmpty(downloadAddWord) ? "" : "-" + downloadAddWord) + " >");
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NORMAL);
}
if (isCheck && viewHolder.gameEntity.getApk().size() == 1) {
String url = viewHolder.gameEntity.getApk().get(0).getUrl();
@ -100,9 +108,23 @@ public class DetailDownloadUtils {
}
}
private static String getDownloadSizeText(DetailViewHolder viewHolder) {
return String.format("%s", viewHolder.gameEntity.getApk().get(0).getSize());
}
public static void detailInvalidate(DetailViewHolder viewHolder) {
viewHolder.mDownloadPb.setProgress((int) (viewHolder.downloadEntity.getPercent() * 10));
DownloadEntity downloadEntity = viewHolder.downloadEntity;
String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS);
if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) {
String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT);
viewHolder.mDownloadPb.setText("解压中(" + percent + "%");
viewHolder.mDownloadPb.setProgress((int) (Float.valueOf(percent) * 10));
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.XAPK_UNZIPPING);
return;
}
viewHolder.mDownloadPb.setProgress((int) (viewHolder.downloadEntity.getPercent() * 10));
switch (downloadEntity.getStatus()) {
case downloading:
case pause:
@ -128,7 +150,7 @@ public class DetailDownloadUtils {
case done:
viewHolder.mDownloadPb.setText(R.string.install);
if (downloadEntity.isPluggable()
&& PackagesManager.INSTANCE.isInstalled(downloadEntity.getPackageName())) {
&& PackagesManager.isInstalled(downloadEntity.getPackageName())) {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_PLUGIN);
} else {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_NORMAL);
@ -143,6 +165,4 @@ public class DetailDownloadUtils {
break;
}
}
}

View File

@ -11,6 +11,8 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Util_System_Phone_State;
import com.tencent.stat.StatConfig;
@ -222,8 +224,7 @@ public class DeviceUtils {
// get sim
public static String getSim(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imsi = tm.getSubscriberId();
String imsi = getTelephonySubscriberId(context);
if (imsi == null) {
return "";
}
@ -239,6 +240,12 @@ public class DeviceUtils {
return "";
}
@Nullable
public static String getTelephonySubscriberId(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSubscriberId();
}
// ping domain
public static String ping(String domain) {
try {
@ -269,18 +276,21 @@ public class DeviceUtils {
// 只能获取WiFi的IpAddress
public static String getCurrentIpAddress() {
String ipAddress;
WifiManager wifiManager = (WifiManager) HaloApp.getInstance().
getApplication().
getApplicationContext().
getSystemService(Context.WIFI_SERVICE);
int address = wifiManager.getDhcpInfo().ipAddress;
ipAddress = ((address & 0xFF)
+ "." + ((address >> 8) & 0xFF)
+ "." + ((address >> 16) & 0xFF)
+ "." + ((address >> 24) & 0xFF));
return ipAddress;
String ipAddress = "0.0.0.0";
try {
WifiManager wifiManager = (WifiManager) HaloApp.getInstance().
getApplication().
getApplicationContext().
getSystemService(Context.WIFI_SERVICE);
int address = wifiManager.getDhcpInfo().ipAddress;
ipAddress = ((address & 0xFF)
+ "." + ((address >> 8) & 0xFF)
+ "." + ((address >> 16) & 0xFF)
+ "." + ((address >> 24) & 0xFF));
return ipAddress;
} catch (Exception e) {
return ipAddress;
}
}
}

View File

@ -29,33 +29,45 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.gh.common.AppExecutor;
import com.gh.common.constant.Config;
import com.gh.common.dialog.TrackableDialog;
import com.gh.common.view.DrawableView;
import com.gh.common.view.FixLinearLayoutManager;
import com.gh.common.view.LimitHeightLinearLayout;
import com.gh.common.view.MaxHeightNestedScrollView;
import com.gh.gamecenter.AboutActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SuggestionActivity;
import com.gh.gamecenter.WebActivity;
import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder;
import com.gh.gamecenter.databinding.DialogOverseaConfirmationBinding;
import com.gh.gamecenter.databinding.ImprintContentItemBinding;
import com.gh.gamecenter.databinding.PrivacyItemBinding;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.PrivacyPolicyEntity;
import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.entity.TrackableEntity;
import com.gh.gamecenter.suggest.SuggestType;
import com.halo.assistant.HaloApp;
import com.halo.assistant.fragment.SettingsFragment;
import com.lightgame.adapter.BaseRecyclerAdapter;
import com.lightgame.download.DownloadEntity;
import com.lightgame.utils.AppManager;
import com.lightgame.utils.Utils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
public class DialogUtils {
public static Dialog showWaitDialog(Context context, String msg) {
@ -186,7 +198,7 @@ public class DialogUtils {
AppExecutor.getUiExecutor().executeWithDelay(() -> Utils.toast(context, "当前使用移动网络下载,请注意流量消耗"), 500);
callBack.onResponse(false);
} else {
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(context), "出现弹窗提示");
// MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(context), "出现弹窗提示");
showDownloadDialog(context,
() -> callBack.onResponse(false),
() -> callBack.onResponse(true));
@ -246,12 +258,12 @@ public class DialogUtils {
}, 500);
listener.onConfirm();
dialog.dismiss();
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "本次允许");
// MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "本次允许");
});
wifiAuto.setOnClickListener(v -> {
cancelListener.onCancel();
dialog.dismiss();
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "连上WiFi后自动下载");
// MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "连上WiFi后自动下载");
});
allowAlways.setOnClickListener(v -> {
PreferenceManager
@ -266,7 +278,7 @@ public class DialogUtils {
}, 500);
listener.onConfirm();
dialog.dismiss();
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "总是允许");
// MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "总是允许");
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
@ -1091,17 +1103,43 @@ public class DialogUtils {
final ConfirmListener cmListener,
final CancelListener clListener,
TrackableEntity trackableEntity) {
return showTrackableDialog(context, false, title, message, positive, negative, cmListener, clListener, trackableEntity);
}
/**
* @param useRoundedCornerStyle 使用圆角样式
*/
public static Dialog showTrackableDialog(Context context,
boolean useRoundedCornerStyle,
String title,
CharSequence message,
String positive,
String negative,
final ConfirmListener cmListener,
final CancelListener clListener,
TrackableEntity trackableEntity) {
context = checkDialogContext(context);
final TrackableDialog dialog = new TrackableDialog(context,
R.style.GhAlertDialog,
trackableEntity.getEvent(),
trackableEntity.getKey(),
trackableEntity.getValue(),
trackableEntity.getCancelValue(),
trackableEntity.getKeyBackValue(),
trackableEntity.getLogShowEvent());
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null);
View contentView;
if (useRoundedCornerStyle) {
contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert_with_rounded_corner, null);
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
} else {
contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null);
}
TextView contentTv = contentView.findViewById(R.id.dialog_content);
TextView titleTv = contentView.findViewById(R.id.dialog_title);
TextView negativeTv = contentView.findViewById(R.id.dialog_negative);
@ -1224,6 +1262,245 @@ public class DialogUtils {
dialog.show();
}
public static void showVersionNumberDialog(Context context, GameEntity gameEntity, @NonNull ConfirmListener listener) {
context = checkDialogContext(context);
if (!gameEntity.isShowVersionNumber()) {
listener.onConfirm();
} else {
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_version_number, null);
TextView contentTv = contentView.findViewById(R.id.contentTv);
TextView cancelTv = contentView.findViewById(R.id.cancelTv);
TextView continueTv = contentView.findViewById(R.id.continueTv);
contentTv.setText(gameEntity.getVersionNumberString());
cancelTv.setOnClickListener(v -> dialog.dismiss());
continueTv.setOnClickListener(v -> {
listener.onConfirm();
dialog.dismiss();
});
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
}
// 海外下载地址弹窗
public static void showOverseaDownloadDialog(Context context, GameEntity gameEntity, @NonNull ConfirmListener listener) {
context = checkDialogContext(context);
if (gameEntity.getOverseasAddressDialog() == null
|| gameEntity.getApk().size() == 0
|| !gameEntity.getOverseasAddressDialog().isEnable()) {
listener.onConfirm();
} else {
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
DialogOverseaConfirmationBinding binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_oversea_confirmation, null, false);
View contentView = binding.getRoot();
binding.setGame(gameEntity);
binding.urlTv.setText(gameEntity.getOverseasAddressDialog().getLink());
binding.closeIv.setOnClickListener(v -> dialog.dismiss());
binding.downloadBtn.setText("下载(" + gameEntity.getApk().get(0).getSize() + "");
binding.downloadBtn.setOnClickListener(v -> {
listener.onConfirm();
dialog.dismiss();
});
if ("show&download".equals(gameEntity.getOverseasAddressDialog().getStatus())) {
gameEntity.getApk().get(0).setUrl(gameEntity.getOverseasAddressDialog().getLink());
}
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
}
public static void showImprintDialog(Context context, GameEntity gameEntity, String titleName) {
context = checkDialogContext(context);
Dialog dialog = new Dialog(context, R.style.full_dialog);
View inflate = LayoutInflater.from(context).inflate(R.layout.imprint_dialog, null);
dialog.setContentView(inflate);
dialog.show();
Window window = dialog.getWindow();
WindowManager.LayoutParams params;
if (window != null) {
params = window.getAttributes();
params.width = (int) (context.getResources().getDisplayMetrics().widthPixels * 0.9);
window.setAttributes(params);
window.setBackgroundDrawableResource(R.drawable.full_dialog_background);
}
inflate.findViewById(R.id.imprint_close).setOnClickListener(v -> dialog.dismiss());
LinearLayout content = inflate.findViewById(R.id.imprint_content);
((TextView) inflate.findViewById(R.id.imprint_title)).setText(titleName);
View head = LayoutInflater.from(context).inflate(R.layout.imprint_content_item, null);
content.addView(head, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(30));
LimitHeightLinearLayout imprintContainer = inflate.findViewById(R.id.imprint_container);
imprintContainer.setLimitHeight((int) (context.getResources().getDisplayMetrics().heightPixels * 0.8));
ArrayList<ApkEntity> list = gameEntity.getApk();
SettingsEntity settings = Config.getSettings();
for (int i = 0; i < list.size(); i++) {
ApkEntity apk = gameEntity.getApk().get(i);
if (settings != null && settings.getGameDownloadBlackList().contains(apk.getPackageName())) {
continue;
}
View item = LayoutInflater.from(context).inflate(R.layout.imprint_content_item, null);
ImprintContentItemBinding bind = DataBindingUtil.bind(item);
bind.setApk(apk);
bind.setPlatformName(PlatformUtils.getInstance(context).getPlatformName(apk.getPlatform()));
content.addView(item, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(40));
}
// close line
View view = new View(context);
view.setBackgroundColor(context.getResources().getColor(R.color.text_5d5d5d));
view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(1)));
content.addView(view);
}
public static void showKaifuRemindDialog(Context context, String content, String gameName) {
context = checkDialogContext(context);
final Dialog dialog = new TrackableDialog(context, R.style.GhAlertDialog, "开服说明弹窗", "弹窗", gameName, null, null, true);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_kaifu_remind, null);
TextView contentTv = contentView.findViewById(R.id.contentTv);
MaxHeightNestedScrollView scrollView = contentView.findViewById(R.id.scrollView);
contentTv.setText(Html.fromHtml(content));
TextView ok = contentView.findViewById(R.id.dialog_ok);
scrollView.setScrollChangedListener((l, t, oldl, oldt) -> {
MtaHelper.onEvent("开服说明弹窗", "滑动内容", gameName);
});
ok.setOnClickListener(v -> {
MtaHelper.onEvent("开服说明弹窗", "弹窗", "点击我知道了");
MtaHelper.onEvent("开服说明弹窗", "点击我知道了", gameName);
dialog.dismiss();
});
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
public static void showStopServerExplanationDialog(Context context, String content, String gameName) {
context = checkDialogContext(context);
final Dialog dialog = new TrackableDialog(context, R.style.GhAlertDialog, "评论说明弹窗", "弹窗", gameName, null, null, true);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_stop_service_explanation, null);
TextView contentTv = contentView.findViewById(R.id.contentTv);
MaxHeightNestedScrollView scrollView = contentView.findViewById(R.id.scrollView);
if (TextUtils.isEmpty(content)) {
content = context.getString(R.string.rating_protection);
}
contentTv.setText(content);
TextView ok = contentView.findViewById(R.id.dialog_ok);
scrollView.setScrollChangedListener((l, t, oldl, oldt) -> {
MtaHelper.onEvent("评论说明弹窗", "滑动内容", gameName);
});
ok.setOnClickListener(v -> {
MtaHelper.onEvent("评论说明弹窗", "弹窗", "点击我知道了");
MtaHelper.onEvent("评论说明弹窗", "点击我知道了", gameName);
dialog.dismiss();
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams params = window.getAttributes();
params.width = context.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(60f);
window.setAttributes(params);
}
}
public static void showPluggableNeverRemindDialog(Context context, String nameAndPlatform, @NonNull ConfirmListener listener) {
context = checkDialogContext(context);
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_pluggable_never_remind, null);
View cancelBtn = contentView.findViewById(R.id.cancel);
View confirmBtn = contentView.findViewById(R.id.confirm);
TextView contentTv = contentView.findViewById(R.id.content);
contentTv.setText(("助手首页将不再提示《" + nameAndPlatform + "》的所有插件化消息,确定吗?"));
cancelBtn.setOnClickListener(v -> {
dialog.dismiss();
});
confirmBtn.setOnClickListener(v -> {
listener.onConfirm();
dialog.dismiss();
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
public static void showUnzipFailureDialog(Context context, DownloadEntity downloadEntity) {
final Context activityContext = checkDialogContext(context);
final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog);
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawableResource(android.R.color.transparent);
}
View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_unzip_failure, null);
View cancelBtn = contentView.findViewById(R.id.cancel);
View confirmBtn = contentView.findViewById(R.id.confirm);
cancelBtn.setOnClickListener(v -> {
dialog.dismiss();
});
confirmBtn.setOnClickListener(v -> {
dialog.dismiss();
String hint = "" + downloadEntity.getName() + "》游戏安装包解压失败,问题反馈:";
SuggestionActivity.startSuggestionActivity(activityContext, SuggestType.normal, null, hint);
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
/**
* @param context may be is application context
* @return activity context
@ -1237,6 +1514,7 @@ public class DialogUtils {
return context;
}
// currentActivity 是否存在 isDestroyed 的情况?
return AppManager.getInstance().currentActivity();
}

View File

@ -6,11 +6,17 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.TextUtils
import androidx.appcompat.app.AppCompatActivity
import com.gh.base.BaseActivity
import com.gh.base.ToolBarActivity
import com.gh.base.fragment.BaseFragment_TabLayout
import com.gh.common.AppExecutor
import com.gh.common.constant.Config
import com.gh.common.exposure.ExposureEvent
import com.gh.common.exposure.ExposureEvent.Companion.createEvent
import com.gh.common.exposure.ExposureManager.log
import com.gh.common.exposure.ExposureTraceUtils.appendTrace
import com.gh.common.exposure.ExposureType
import com.gh.common.util.EntranceUtils.*
import com.gh.gamecenter.*
import com.gh.gamecenter.amway.AmwayActivity
@ -21,8 +27,10 @@ import com.gh.gamecenter.eventbus.EBReuse
import com.gh.gamecenter.eventbus.EBSkip
import com.gh.gamecenter.fragment.MainWrapperFragment
import com.gh.gamecenter.game.columncollection.detail.ColumnCollectionDetailActivity
import com.gh.gamecenter.game.upload.GameSubmissionActivity
import com.gh.gamecenter.gamedetail.GameDetailFragment
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.mvvm.Resource
import com.gh.gamecenter.mygame.PlayedGameActivity
import com.gh.gamecenter.personalhome.UserHomeActivity
import com.gh.gamecenter.qa.CommunityFragment
@ -32,17 +40,24 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
import com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity
import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity
import com.gh.gamecenter.qa.subject.CommunitySubjectActivity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.gh.gamecenter.servers.GameServersActivity
import com.gh.gamecenter.subject.SubjectActivity
import com.gh.gamecenter.suggest.SuggestType
import com.gh.gamecenter.tag.TagsActivity
import com.gh.gamecenter.video.data.VideoDataActivity
import com.gh.gamecenter.video.detail.VideoDetailActivity
import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel
import com.gh.gamecenter.video.game.GameVideoActivity
import com.gh.gamecenter.video.videomanager.VideoManagerActivity
import com.halo.assistant.HaloApp
import com.lightgame.utils.Util_System_ClipboardManager
import com.lightgame.utils.Utils
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.EventBus
import retrofit2.HttpException
/**
* 跳转用的方法
@ -124,30 +139,39 @@ object DirectUtils {
when (linkEntity.type) {
"article", "news", "文章" -> {
NewsUtils.statNewsViews(context, linkEntity.link) // 统计阅读量
context.startActivity(NewsDetailActivity.getIntentById(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path)))
directToArticle(context, linkEntity.link
?: "", BaseActivity.mergeEntranceAndPath(entrance, path))
}
"game", "游戏" -> {
if (exposureEvent != null) {
GameDetailActivity.startGameDetailActivity(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path), exposureEvent)
directToGameDetail(context, linkEntity.link
?: "", BaseActivity.mergeEntranceAndPath(entrance, path), traceEvent = exposureEvent)
} else {
GameDetailActivity.startGameDetailActivity(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path))
directToGameDetail(context, linkEntity.link
?: "", BaseActivity.mergeEntranceAndPath(entrance, path))
}
}
"column", "游戏专题" -> SubjectActivity.startSubjectActivity(context, linkEntity.link, linkEntity.text, false, BaseActivity.mergeEntranceAndPath(entrance, path))
"column", "游戏专题" -> directToSubject(context, linkEntity.link
?: "", linkEntity.text, BaseActivity.mergeEntranceAndPath(entrance, path))
"question", "社区问题" -> context.startActivity(QuestionsDetailActivity.getIntent(context, linkEntity.link, entrance, path))
"question", "社区问题" -> directToQuestionDetail(context, linkEntity.link
?: "", entrance, path)
"answer", "社区回答" -> context.startActivity(AnswerDetailActivity.getIntent(context, linkEntity.link, entrance, path))
"answer", "社区回答" -> directToAnswerDetail(context, linkEntity.link ?: "", entrance, path)
"community", "问答社区" -> directToCommunity(context, CommunityEntity(linkEntity.link!!, linkEntity.text!!))
"community", "问答社区" -> {
if (linkEntity.link.isNullOrEmpty()) return
directToCommunity(context, CommunityEntity(linkEntity.link!!, linkEntity.text!!))
}
"community_article", "社区文章" -> context.startActivity(ArticleDetailActivity.getIntent(context, linkEntity.community!!, linkEntity.link!!, entrance, path))
"community_article", "社区文章" -> directToCommunityArticle(context, linkEntity.community!!, linkEntity.link!!, entrance, path)
"community_column", "社区专题" -> directToCommunityColumn(context, linkEntity.community, linkEntity.link!!, entrance, path)
"community_special_column" -> context.startActivity(AskColumnDetailActivity.getIntentByColumnId(context, linkEntity.link, linkEntity.community!!, entrance, path))
"community_special_column" -> directAskColumnDetail(context, linkEntity.link
?: "", linkEntity.community!!, entrance, path)
"web", "inurl", "web链接" -> {
when {
@ -166,37 +190,31 @@ object DirectUtils {
"tag" -> context.startActivity(TagsActivity.getIntent(context, linkEntity.text!!, linkEntity.title, entrance, path))
"all_community_article" -> {
context.startActivity(SimpleArticleListActivity.getIntent(
context,
linkEntity.link ?: "",
entrance,
path))
}
"all_community_article" -> directSimpleArticleList(context, linkEntity.link
?: "", entrance, path)
"category", "分类" -> {
context.startActivity(CategoryDirectoryActivity.getIntent(context, linkEntity.link!!, linkEntity.text!!))
}
"category", "分类" -> directCategoryDirectory(context, linkEntity.link!!, linkEntity.text!!)
"block", "版块" -> {
context.startActivity(BlockActivity.getIntent(context, SubjectRecommendEntity(
link = linkEntity.link,
text = linkEntity.text,
name = linkEntity.name,
display = linkEntity.display ?: Display())))
if (linkEntity.link.isNullOrEmpty()) return
directToBlock(context,
SubjectRecommendEntity(
link = linkEntity.link,
text = linkEntity.text,
name = linkEntity.name,
display = linkEntity.display ?: Display()),
entrance)
}
"column_collection", "专题合集" -> directToColumnCollection(context, linkEntity.link!!, -1, entrance)
"server" -> {
context.startActivity(GameServersActivity.getIntent(context, entrance, path))
}
"server", "game_server", "开服表" -> directToGameServers(context, entrance, path)
"top_game_comment" -> directToAmway(context, null, entrance, path)
"wechat_bind" -> context.startActivity(WebActivity.getBindWechatIntent(context))
"video", "video_stream" -> directToVideoDetail(context,
"video", "video_stream", "视频" -> directToVideoDetail(context,
videoId = linkEntity.link!!,
fromLocation = VideoDetailContainerViewModel.Location.VIDEO_CHOICENESS.value,
entrance = entrance,
@ -204,6 +222,27 @@ object DirectUtils {
"game_video" -> directToGameVideo(context, linkEntity.link ?: "", entrance, path)
"libao", "礼包" -> directToGiftDetail(context, linkEntity.link ?: "", entrance)
"feedback" -> directToFeedback(context, linkEntity.name, linkEntity.text, entrance)
"qa", "Q&A" -> directToQa(context, linkEntity.text ?: "", linkEntity.link ?: "")
"qa_collection", "Q&A合集" -> directToQaCollection(context, linkEntity.text
?: "", linkEntity.link
?: "")
"anliwall", "安利墙" -> directToAmway(context, fixedTopAmwayCommentId = null, entrance = entrance, path = path)
"game_detail_comment" -> directToGameDetail(context, linkEntity.link ?: "", entrance)
"game_upload", "游戏投稿" -> directGameUpload(context, entrance, path)
//"h5_game_center" -> directLetoGameCenter(context)
"" -> {
// do nothing
}
else -> {
if (unknownCallback != null) {
unknownCallback.invoke()
@ -214,11 +253,45 @@ object DirectUtils {
}
}
/**
* 跳转至QA
*/
@JvmStatic
fun directToQa(context: Context, text: String, id: String) {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_TO, QaActivity::class.java.simpleName)
bundle.putString(KEY_NAVIGATION_TITLE, text)
bundle.putString(KEY_QA_ID, id)
jumpActivity(context, bundle)
}
/**
* 跳转至QA合集
*/
@JvmStatic
fun directToQaCollection(context: Context, text: String, id: String) {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_TO, QaActivity::class.java.simpleName)
bundle.putString(KEY_NAVIGATION_TITLE, text)
bundle.putString(KEY_QA_COLLECTION_ID, id)
jumpActivity(context, bundle)
}
/**
* 跳转至专题合集
*/
fun directToColumnCollection(context: Context, id: String, position: Int = -1, entrance: String) {
context.startActivity(ColumnCollectionDetailActivity.getIntent(context, id, position, entrance))
@JvmStatic
fun directToColumnCollection(context: Context, id: String, position: Int = -1, entrance: String, columnName: String = "") {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_TO, ColumnCollectionDetailActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, entrance)
bundle.putString(KEY_COLLECTION_ID, id)
bundle.putString(KEY_COLUMNNAME, columnName)
bundle.putInt(KEY_POSITION, position)
jumpActivity(context, bundle)
}
/**
@ -226,6 +299,7 @@ object DirectUtils {
*/
@JvmStatic
fun directToArticle(context: Context, id: String, entrance: String? = null) {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, NewsDetailActivity::class.java.simpleName)
@ -268,7 +342,8 @@ object DirectUtils {
* 跳转到游戏详情
*/
@JvmStatic
fun directToGameDetail(context: Context, id: String, entrance: String? = null, autoDownload: Boolean? = null, scrollToLibao: Boolean = false) {
fun directToGameDetail(context: Context, id: String, entrance: String? = null, autoDownload: Boolean? = null, scrollToLibao: Boolean = false, traceEvent: ExposureEvent? = null) {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, GameDetailActivity::class.java.simpleName)
@ -277,6 +352,11 @@ object DirectUtils {
bundle.putInt(KEY_TARGET, GameDetailFragment.INDEX_TRENDES)
bundle.putBoolean(KEY_SCROLL_TO_LIBAO, scrollToLibao)
}
if (traceEvent != null) {
val clickEvent = createEvent(GameEntity(id), traceEvent.source, appendTrace(traceEvent), ExposureType.CLICK)
log(clickEvent)
bundle.putParcelable(KEY_TRACE_EVENT, clickEvent)
}
bundle.putBoolean(KEY_AUTO_DOWNLOAD, autoDownload ?: false)
jumpActivity(context, bundle)
}
@ -292,7 +372,16 @@ object DirectUtils {
bundle.putString(KEY_GAMEID, id)
bundle.putBoolean(KEY_OPEN_VIDEO_STREAMING, true)
bundle.putInt(KEY_TARGET, GameDetailFragment.INDEX_DESC)
// GameDetailActivity.startGameDetailToVideoStreaming(context, id, entrance)
jumpActivity(context, bundle)
}
@JvmStatic
fun directToGameDetail(context: Context, id: String, defaultTab: Int = GameDetailFragment.INDEX_DESC, entrance: String? = null) {
val bundle = Bundle()
bundle.putString(KEY_TO, GameDetailActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, entrance)
bundle.putString(KEY_GAMEID, id)
bundle.putInt(KEY_TARGET, defaultTab)
jumpActivity(context, bundle)
}
@ -304,6 +393,7 @@ object DirectUtils {
// 专栏
@JvmStatic
fun directToSubject(context: Context, id: String, subjectName: String? = "", entrance: String? = null) {
if (id.isEmpty()) return
val bundle = Bundle()
val subjectData = SubjectData(subjectId = id, subjectName = subjectName, isOrder = false)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
@ -315,12 +405,21 @@ object DirectUtils {
// 反馈
@JvmStatic
fun directToFeedback(context: Context, content: String? = null, entrance: String? = null) {
directToFeedback(context, content, null, entrance)
}
@JvmStatic
fun directToFeedback(context: Context, content: String? = null, hintType: String? = null, entrance: String? = null) {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, SuggestionActivity::class.java.simpleName)
bundle.putString(KEY_CONTENT, content)
bundle.putString(KEY_SUGGEST_HINT_TYPE, KEY_PLUGIN)
bundle.putSerializable(EntranceUtils.KEY_SUGGESTTYPE, SuggestType.gameQuestion)
if (TextUtils.isEmpty(hintType)) {
bundle.putString(KEY_SUGGEST_HINT_TYPE, KEY_PLUGIN)
} else {
bundle.putString(KEY_SUGGEST_HINT_TYPE, hintType)
}
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.gameQuestion)
jumpActivity(context, bundle)
}
@ -371,6 +470,7 @@ object DirectUtils {
@JvmStatic
fun directToAnswerDetail(context: Context, id: String, entrance: String? = null, path: String? = null) {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, AnswerDetailActivity::class.java.name)
@ -381,6 +481,7 @@ object DirectUtils {
@JvmStatic
fun directToQuestionDetail(context: Context, id: String, entrance: String? = null, path: String? = null) {
if (id.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, QuestionsDetailActivity::class.java.name)
@ -391,6 +492,7 @@ object DirectUtils {
@JvmStatic
fun directToWebView(context: Context, url: String, entrance: String? = null) {
if (url.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, WebActivity::class.java.simpleName)
@ -409,7 +511,11 @@ object DirectUtils {
@JvmStatic
fun directToExternalBrowser(context: Context, url: String) {
if (url.isEmpty()) return
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
if (context !is AppCompatActivity) {
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(browserIntent)
}
@ -430,7 +536,11 @@ object DirectUtils {
chatType = "wpa"
}
val str = "mqqwpa://im/chat?chat_type=$chatType&uin=$qq&version=1&src_type=web"
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str)))
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(str))
if (context !is AppCompatActivity) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(intent)
} else {
// 没有安装QQ 复制账号
Util_System_ClipboardManager.setText(context, qq)
@ -441,16 +551,25 @@ object DirectUtils {
// 跳转 QQ 群
@JvmStatic
fun directToQqGroup(context: Context, groupNumber: String? = null): Boolean {
val intent = Intent()
intent.data = Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D$groupNumber")
// 此Flag可根据具体产品需要自定义如设置则在加群界面按返回返回手Q主界面不设置按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
context.startActivity(intent)
return true
} catch (e: Exception) {
// 未安装手Q或安装的版本不支持
if (groupNumber.isNullOrEmpty()) return false
if (ShareUtils.isQQClientAvailable(context)) {
val intent = Intent()
intent.data = Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D$groupNumber")
// 此Flag可根据具体产品需要自定义如设置则在加群界面按返回返回手Q主界面不设置按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
return try {
if (context !is AppCompatActivity) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(intent)
true
} catch (e: Exception) {
false
}
} else {
Utils.toast(context, "请安装QQ客户端")
return false
}
}
/**
@ -458,6 +577,7 @@ object DirectUtils {
*/
@JvmStatic
fun directToGiftDetail(context: Context, giftId: String, entrance: String? = null) {
if (giftId.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, LibaoDetailActivity::class.java.simpleName)
@ -510,11 +630,24 @@ object DirectUtils {
jumpActivity(context, bundle)
}
@JvmStatic
fun directToCommunityArticle(context: Context, community: CommunityEntity?, articleId: String?, entrance: String?, path: String?) {
if (articleId.isNullOrEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_PATH, path)
bundle.putString(KEY_TO, ArticleDetailActivity::class.java.name)
bundle.putString(KEY_COMMUNITY_ARTICLE_ID, articleId)
bundle.putParcelable(KEY_COMMUNITY_DATA, community)
jumpActivity(context, bundle)
}
/**
* 跳转到社区专题
*/
@JvmStatic
fun directToCommunityColumn(context: Context, community: CommunityEntity?, subjectId: String, entrance: String?, path: String?) {
if (subjectId.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_PATH, path)
bundle.putString(KEY_TO, CommunitySubjectActivity::class.java.name)
@ -528,7 +661,8 @@ object DirectUtils {
* @param fromLocation 可见 [VideoDetailContainerViewModel.Location]
*/
@JvmStatic
fun directToVideoDetail(context: Context, videoId: String, fromLocation: String, showComment: Boolean = false, gameId: String = "", entrance: String? = null, path: String? = "", referer: String = "") {
fun directToVideoDetail(context: Context, videoId: String, fromLocation: String, showComment: Boolean = false, gameId: String = "", entrance: String? = null,
path: String? = "", referer: String = "", type: String = "", act: String = "", fieldId: String = "", sectionName: String = "") {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
@ -539,12 +673,21 @@ object DirectUtils {
bundle.putString(KEY_LOCATION, fromLocation)
bundle.putBoolean(KEY_SHOW_COMMENT, showComment)
bundle.putString(KEY_REFERER, referer)
bundle.putString(KEY_TYPE, type)
bundle.putString(KEY_ACTIVITY_NAME, act)
bundle.putString(KEY_FIELD_ID, fieldId)
bundle.putString(KEY_SECTION_NAME, sectionName)
jumpActivity(context, bundle)
} else {
DialogUtils.showLowSystemVersionDialog(context)
}
}
@JvmStatic
fun directToVideoDetail(context: Context, videoId: String, fromLocation: String, showComment: Boolean = false, gameId: String = "", entrance: String? = null, path: String? = "", referer: String = "") {
directToVideoDetail(context, videoId, fromLocation, showComment, gameId, entrance, path, referer, "", "")
}
/**
* 跳转至安利墙
* @param fixedTopAmwayCommentId 需要置顶的安利Id
@ -571,10 +714,11 @@ object DirectUtils {
* 跳转至上传视频
*/
@JvmStatic
fun directToVideoManager(context: Context, linkEntity: VideoLinkEntity, entrance: String? = null, path: String? = "") {
fun directToVideoManager(context: Context, linkEntity: VideoLinkEntity, simpleGameEntity: SimpleGameEntity, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_PATH, path)
bundle.putParcelable(VideoLinkEntity::class.java.simpleName, linkEntity)
bundle.putParcelable(SimpleGameEntity::class.java.simpleName, simpleGameEntity)
bundle.putString(KEY_TO, VideoManagerActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
jumpActivity(context, bundle)
@ -585,6 +729,7 @@ object DirectUtils {
*/
@JvmStatic
fun directToGameVideo(context: Context, gameId: String, entrance: String? = null, path: String? = "") {
if (gameId.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_PATH, path)
bundle.putString(KEY_TO, GameVideoActivity::class.java.name)
@ -602,4 +747,157 @@ object DirectUtils {
context.startActivity(intent)
}
}
/**
* 跳转梦工厂小游戏
*/
/*@JvmStatic
fun directLetoGameCenter(context: Context) {
if (UserManager.getInstance().isLoggedIn) {
UserManager.getInstance().userInfoEntity?.run {
MgcAccountManager.syncAccount(context, if (idCard != null) idCard!!.name else name, mobile, name, icon, true,
object : SyncUserInfoListener {
override fun onSuccess(data: LoginResultBean?) {}
override fun onFail(code: String?, message: String?) {}
})
}
} else {
MgcAccountManager.exitAccount(context, object : SyncUserInfoListener {
override fun onSuccess(data: LoginResultBean?) {}
override fun onFail(code: String?, message: String?) {}
})
}
Leto.getInstance().startGameCenter(context)
}*/
/**
* 跳转分类
*/
@JvmStatic
fun directCategoryDirectory(context: Context, categoryId: String, categoryTitle: String, entrance: String? = null, path: String? = "") {
if (categoryId.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_TO, CategoryDirectoryActivity::class.java.name)
bundle.putString(KEY_CATEGORY_ID, categoryId)
bundle.putString(KEY_CATEGORY_TITLE, categoryTitle)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_PATH, path)
jumpActivity(context, bundle)
}
/**
* 跳转到问题标签详情
*/
@JvmStatic
fun directAskColumnLabelDetail(context: Context, tag: String, community: CommunityEntity, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_TO, AskColumnDetailActivity::class.java.name)
bundle.putString(KEY_ASK_TAG, tag)
bundle.putParcelable(KEY_COMMUNITY_DATA, community)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_PATH, path)
jumpActivity(context, bundle)
}
/**
* 跳转到专栏详情
*/
@JvmStatic
fun directAskColumnDetail(context: Context, columnId: String, community: CommunityEntity, entrance: String? = null, path: String? = "") {
if (columnId.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_TO, AskColumnDetailActivity::class.java.name)
bundle.putString(KEY_COLUMN_ID, columnId)
bundle.putParcelable(KEY_COMMUNITY_DATA, community)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_PATH, path)
jumpActivity(context, bundle)
}
/**
* 跳转到板块
*/
@JvmStatic
fun directToBlock(context: Context, blockData: SubjectRecommendEntity, entrance: String) {
val bundle = Bundle()
bundle.putString(KEY_TO, BlockActivity::class.java.name)
bundle.putParcelable(KEY_BLOCK_DATA, blockData)
bundle.putString(KEY_ENTRANCE, entrance)
jumpActivity(context, bundle)
}
/**
* 跳转到开服表
*/
@JvmStatic
fun directToGameServers(context: Context, entrance: String, path: String) {
val bundle = Bundle()
bundle.putString(KEY_TO, GameServersActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, ToolBarActivity.mergeEntranceAndPath(entrance, path))
jumpActivity(context, bundle)
}
/**
* 跳转到游戏上传
*/
@JvmStatic
fun directGameUpload(context: Context, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_TO, GameSubmissionActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_PATH, path)
jumpActivity(context, bundle)
}
/**
* 社区文章
*/
@JvmStatic
fun directSimpleArticleList(context: Context, sortType: String, entrance: String? = null, path: String? = "") {
if (sortType.isEmpty()) return
val bundle = Bundle()
bundle.putString(KEY_TO, SimpleArticleListActivity::class.java.name)
bundle.putString(KEY_TYPE, sortType)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_PATH, path)
jumpActivity(context, bundle)
}
@JvmStatic
fun directGameZone(context: Context, gameId: String, url: String, entrance: String? = null) {
RetrofitManager.getInstance(HaloApp.getInstance().application)
.sensitiveApi
.getGameDigest(gameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<GameEntity>() {
override fun onResponse(response: GameEntity?) {
response?.apply {
if (zone.status == "on") {
if (zone.style == "link") {
directToGameDetail(context, gameId, GameDetailFragment.INDEX_TRENDES, entrance)
} else {
directToWebView(context, url, entrance)
}
} else {
directToWebView(context, url, entrance)
}
}
}
override fun onFailure(e: HttpException?) {
}
})
}
@JvmStatic
fun directVideoData(context: Context, entrance: String? = null) {
val bundle = Bundle()
bundle.putString(KEY_TO, VideoDataActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, entrance)
jumpActivity(context, bundle)
}
}

View File

@ -9,6 +9,7 @@ import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
@ -206,6 +207,13 @@ public class DisplayUtils {
public static void setStatusBarColor(Activity activity, int color, boolean lightStatusBar) {
Window window = activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (!isMiuiOs()) {
//取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
}
window.setStatusBarColor(ContextCompat.getColor(activity, color));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@ -250,6 +258,40 @@ public class DisplayUtils {
return false;
}
public static int getScreenWidth() {
WindowManager manager = (WindowManager) HaloApp.getInstance().getApplication().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
return metrics.widthPixels;
}
public static int getScreenHeight() {
WindowManager manager = (WindowManager) HaloApp.getInstance().getApplication().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
return metrics.heightPixels;
}
public static int getToastOffset() {
try {
int i = Resources.getSystem().getIdentifier("toast_y_offset", "dimen", "android");
return HaloApp.getInstance().getApplication().getResources().getDimensionPixelSize(i);
} catch (Resources.NotFoundException e) {
e.printStackTrace();
return dip2px(24);
}
}
public static int getToastDefaultGravity() {
try {
int i = Resources.getSystem().getIdentifier("config_toastDefaultGravity", "integer", "android");
return HaloApp.getInstance().getApplication().getResources().getInteger(i);
} catch (Resources.NotFoundException e) {
e.printStackTrace();
return Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
}
}
public static boolean hasSoftKeys(Context context) {
if (!(context instanceof Activity)) return false;

View File

@ -1,5 +1,6 @@
package com.gh.common.util
import com.gh.common.filter.RegionSettingHelper
import com.gh.download.DownloadManager
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.retrofit.Response
@ -18,8 +19,12 @@ object DownloadHelper {
* @param block 成功添加下载任务后执行的代码块
*/
fun createABrandNewDownloadTaskQuietly(gameId: String? = "", packageName: String? = "", block: () -> Unit) {
if (RegionSettingHelper.shouldThisGameBeFiltered(gameId)) {
return
}
RetrofitManager.getInstance(HaloApp.getInstance().application)
.api
.sensitiveApi
.getGameDigest(gameId)
.map(ApkActiveUtils.filterMapper)
.subscribeOn(Schedulers.io())

View File

@ -9,12 +9,16 @@ import android.view.View;
import android.widget.TextView;
import com.gh.common.constant.Config;
import com.gh.common.dialog.CertificationDialog;
import com.gh.common.dialog.DeviceRemindDialog;
import com.gh.common.dialog.ReserveDialogFragment;
import com.gh.common.exposure.ExposureEvent;
import com.gh.common.exposure.ExposureUtils;
import com.gh.common.history.HistoryHelper;
import com.gh.common.repository.ReservationRepository;
import com.gh.common.view.DownloadDialog;
import com.gh.common.xapk.XapkInstaller;
import com.gh.common.xapk.XapkUnzipStatus;
import com.gh.download.DownloadManager;
import com.gh.download.dialog.DownloadDialog;
import com.gh.gamecenter.DownloadManagerActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.WebActivity;
@ -38,6 +42,9 @@ import androidx.collection.ArrayMap;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
/**
* todo 下载判断不能以按钮文案为判断条件,否则按钮文案修改时又要修改判断逻辑
*/
public class DownloadItemUtils {
// 更新下载进度条
@ -125,20 +132,27 @@ public class DownloadItemUtils {
holder.gameDownloadBtn.setTextColor(Color.WHITE);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_dn);
}
if (gameEntity.isLibaoExists()) {
holder.gameLibaoIcon.setVisibility(View.VISIBLE);
} else {
holder.gameLibaoIcon.setVisibility(View.GONE);
}
}
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder,
boolean isShowPlatform) {
updateItem(context, gameEntity, holder, isShowPlatform, PluginLocation.only_game);
updateItem(context, gameEntity, holder, isShowPlatform, PluginLocation.only_game, false, null);
}
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder,
boolean isShowPlatform, PluginLocation pluginLocation) {
boolean isShowPlatform, boolean hideDownloadBtnIfNoAvailableContent) {
updateItem(context, gameEntity, holder, isShowPlatform, PluginLocation.only_game, hideDownloadBtnIfNoAvailableContent, null);
}
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder,
boolean isShowPlatform, String briefStyle) {
updateItem(context, gameEntity, holder, isShowPlatform, PluginLocation.only_game, false, briefStyle);
}
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder,
boolean isShowPlatform, PluginLocation pluginLocation,
boolean hideDownloadBtnIfNoAvailableContent,
@Nullable String briefStyle) {
// 控制是否显示下载按钮
if (!Config.isShowDownload(gameEntity.getId()) || context.getString(R.string.app_name).equals(gameEntity.getName())) {
@ -147,17 +161,9 @@ public class DownloadItemUtils {
holder.gameDownloadBtn.setVisibility(View.VISIBLE);
}
if (gameEntity.isLibaoExists()) {
holder.gameLibaoIcon.setVisibility(View.VISIBLE);
} else {
holder.gameLibaoIcon.setVisibility(View.GONE);
}
// 显示预约
if (gameEntity.isReservable()) {
holder.gameDes.setVisibility(View.VISIBLE);
holder.gameProgressbar.setVisibility(View.GONE);
holder.gameInfo.setVisibility(View.GONE);
updateItemViewStatus(holder, false, briefStyle);
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) {
holder.gameDownloadBtn.setText("预约");
holder.gameDownloadBtn.setTextColor(Color.WHITE);
@ -171,14 +177,12 @@ public class DownloadItemUtils {
}
if (gameEntity.getApk().isEmpty()
|| gameEntity.getDownloadOffStatus() != null) {
|| gameEntity.getDownloadOffStatus() != null) {
LinkEntity h5LinkEntity = gameEntity.getH5Link();
String offStatus = gameEntity.getDownloadOffStatus();
holder.gameDes.setVisibility(View.VISIBLE);
holder.gameProgressbar.setVisibility(View.GONE);
holder.gameInfo.setVisibility(View.GONE);
updateItemViewStatus(holder, false, briefStyle);
if (h5LinkEntity != null) {
if ("play".equals(h5LinkEntity.getType())) {
holder.gameDownloadBtn.setText("开始玩");
@ -195,20 +199,23 @@ public class DownloadItemUtils {
holder.gameDownloadBtn.setText("暂无");
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.button_gray));
holder.gameDownloadBtn.setBackgroundResource(R.drawable.news_detail_comment);
if (hideDownloadBtnIfNoAvailableContent) {
holder.gameDownloadBtn.setVisibility(View.GONE);
}
}
holder.gameDownloadBtn.setClickable(false);
}
} else if (gameEntity.getApk().size() == 1) {
updateNormalItem(context, holder, gameEntity, isShowPlatform, pluginLocation);
updateNormalItem(context, holder, gameEntity, isShowPlatform, pluginLocation, briefStyle);
} else {
updatePluginItem(context, holder, gameEntity, isShowPlatform, pluginLocation);
updatePluginItem(context, holder, gameEntity, isShowPlatform, pluginLocation, briefStyle);
}
}
// 更新正常的条目只有一个apk包
static void updateNormalItem(Context context, GameViewHolder holder, GameEntity gameEntity,
boolean isShowPlatform, PluginLocation pluginLocation) {
boolean isShowPlatform, PluginLocation pluginLocation, String briefStyle) {
final ArrayMap<String, DownloadEntity> entryMap = gameEntity.getEntryMap();
final ApkEntity apkEntity = gameEntity.getApk().get(0);
@ -224,14 +231,12 @@ public class DownloadItemUtils {
GameUtils.setDownloadBtnStatus(context, gameEntity, holder.gameDownloadBtn, pluginLocation);
holder.gameDes.setVisibility(View.VISIBLE);
holder.gameProgressbar.setVisibility(View.GONE);
holder.gameInfo.setVisibility(View.GONE);
updateItemViewStatus(holder, false, briefStyle);
}
// 更新插件的条目有多个apk包
private static void updatePluginItem(Context context, GameViewHolder holder, GameEntity gameEntity,
boolean isShowPlatform, PluginLocation pluginLocation) {
boolean isShowPlatform, PluginLocation pluginLocation, String briefStyle) {
GameUtils.setDownloadBtnStatus(context, gameEntity, holder.gameDownloadBtn, pluginLocation);
ArrayMap<String, DownloadEntity> entryMap = gameEntity.getEntryMap();
@ -250,18 +255,15 @@ public class DownloadItemUtils {
return;
}
}
holder.gameDes.setVisibility(View.VISIBLE);
holder.gameProgressbar.setVisibility(View.GONE);
holder.gameInfo.setVisibility(View.GONE);
updateItemViewStatus(holder, false, briefStyle);
}
// 更改进度条和提示文本的状态
public static void changeStatus(Context context, GameViewHolder holder, DownloadEntity downloadEntity,
boolean isShowPlatform, boolean isNormal) {
holder.gameDes.setVisibility(View.GONE);
holder.gameProgressbar.setVisibility(View.VISIBLE);
holder.gameInfo.setVisibility(View.VISIBLE);
updateItemViewStatus(holder, true, null);
holder.gameProgressbar.setProgressDrawable(context.getResources().getDrawable(R.drawable.progressbar_bg_style));
String platform = PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform());
@ -322,6 +324,17 @@ public class DownloadItemUtils {
holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
}
} else if (status.equals(DownloadStatus.done)) {
String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS);
if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) {
String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT);
holder.gameProgressbar.setProgressDrawable(context.getResources().getDrawable(R.drawable.progressbar_xapk_style));
holder.gameDownloadSpeed.setText(R.string.unzipping);
holder.gameProgressbar.setProgress((int) (Float.valueOf(percent) * 10));
holder.gameDownloadPercentage.setText(percent + "%");
holder.gameDownloadBtn.setText(R.string.unzipping);
return;
}
holder.gameProgressbar.setProgress(1000);
if (isShowPlatform && platform != null) {
holder.gameDownloadSpeed.setText(String.format("%s - 下载完成", platform));
@ -334,15 +347,38 @@ public class DownloadItemUtils {
holder.gameDownloadBtn.setText(R.string.install);
holder.gameDownloadBtn.setTextColor(Color.WHITE);
if (downloadEntity.isPluggable()
&& PackagesManager.INSTANCE.isInstalled(downloadEntity.getPackageName())) {
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
&& PackagesManager.isInstalled(downloadEntity.getPackageName())) {
holder.gameDownloadBtn.setBackgroundResource(R.drawable.download_button_pluggable_style);
} else {
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.download_button_normal_style);
}
}
}
}
private static void updateItemViewStatus(GameViewHolder holder, boolean hasDownload, @Nullable String briefStyle) {
if (hasDownload) {
if (holder.gameRating != null) holder.gameRating.setVisibility(View.GONE);
holder.gameDes.setVisibility(View.GONE);
holder.gameProgressbar.setVisibility(View.VISIBLE);
holder.gameInfo.setVisibility(View.VISIBLE);
} else {
holder.gameProgressbar.setVisibility(View.GONE);
holder.gameInfo.setVisibility(View.GONE);
if (briefStyle != null && briefStyle.contains("star")) {
if (holder.gameRating != null) holder.gameRating.setVisibility(View.VISIBLE);
} else {
if (holder.gameRating != null) holder.gameRating.setVisibility(View.GONE);
}
if (TextUtils.isEmpty(briefStyle) || briefStyle.contains("brief")) {
holder.gameDes.setVisibility(View.VISIBLE);
} else {
holder.gameDes.setVisibility(View.GONE);
}
}
}
public static void setOnClickListener(final Context context,
final TextView downloadBtn,
final GameEntity gameEntity,
@ -420,11 +456,19 @@ public class DownloadItemUtils {
}
return;
}
if (gameEntity.getApk().size() == 0 && gameEntity.getH5Link() != null) {
downloadBtn.setOnClickListener(v -> {
MtaHelper.onEvent("H5页面", "入口", "列表页_" + gameEntity.getName());
Intent i = WebActivity.getIntentForWebGame(context, gameEntity.getH5Link().getLink(), gameEntity.getName(), "play".equals(gameEntity.getH5Link().getType()));
LinkEntity linkEntity = gameEntity.getH5Link();
boolean isPlay = "play".equals(linkEntity.getType()); // 是否为开始玩
if (isPlay) {
HistoryHelper.insertGameEntity(gameEntity);
}
Intent i = WebActivity.getIntentForWebGame(context, gameEntity.getH5Link().getLink(), gameEntity.getName(), isPlay,linkEntity.getCloseButton());
context.startActivity(i);
});
} else if (gameEntity.getApk().size() == 1) {
@ -449,7 +493,16 @@ public class DownloadItemUtils {
clickCallback.onCallback();
}
PermissionHelper.checkStoragePermissionBeforeAction(context, () -> {
DownloadDialog.getInstance(context).showPopupWindow(v, gameEntity, entrance, location, traceEvent);
CertificationDialog.showCertificationDialog(context, gameEntity, () -> {
DialogUtils.showVersionNumberDialog(context, gameEntity, () -> {
DownloadDialog.showDownloadDialog(
v.getContext(),
gameEntity,
traceEvent,
entrance,
location);
});
});
});
});
}
@ -480,19 +533,42 @@ public class DownloadItemUtils {
if (str.equals(context.getString(R.string.download))) {
// 先弹下载弹窗(如果需要的话)
DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> {
DialogUtils.checkDownload(context, apk.getSize(),
isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent));
CertificationDialog.showCertificationDialog(context, gameEntity, () -> {
DialogUtils.showOverseaDownloadDialog(context, gameEntity, () -> {
DialogUtils.checkDownload(context, apk.getSize(),
isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent));
});
});
});
DataLogUtils.uploadGameLog(context, gameEntity.getId(), gameEntity.getName(), entrance);
} else if (str.equals(context.getString(R.string.pluggable))) {
} else if (str.equals(context.getString(R.string.attempt))) {
DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> {
CertificationDialog.showCertificationDialog(context, gameEntity, () -> {
DialogUtils.showVersionNumberDialog(context, gameEntity, () -> {
DialogUtils.showOverseaDownloadDialog(context, gameEntity, () -> {
DialogUtils.checkDownload(context, apk.getSize(),
isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent));
});
});
});
});
DataLogUtils.uploadGameLog(context, gameEntity.getId(), gameEntity.getName(), entrance);
} else if (str.contains("")) {
if (entrance.contains("我的游戏")) {
MtaHelper.onEvent("我的游戏_启动", "插件化", gameEntity.getName());
}
DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> {
DialogUtils.checkDownload(context, apk.getSize(),
isSubscribe -> plugin(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent));
});
if (gameEntity.getPluggableCollection() != null) {
DownloadDialog.showDownloadDialog(context, gameEntity, traceEvent, entrance, location);
} else {
DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> {
CertificationDialog.showCertificationDialog(context, gameEntity, () -> {
DialogUtils.checkDownload(context, apk.getSize(),
isSubscribe -> plugin(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent));
});
});
}
} else if (str.equals(context.getString(R.string.install))) {
install(context, gameEntity, position, adapter);
} else if (str.equals(context.getString(R.string.launch))) {
@ -501,10 +577,6 @@ public class DownloadItemUtils {
}
DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location);
PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName());
} else if (str.equals(context.getString(R.string.waiting))
|| str.equals(context.getString(R.string.downloading))) {
context.startActivity(DownloadManagerActivity.getDownloadMangerIntent(context,
apk.getUrl(), entrance + "+(" + location.split(":")[0] + ")"));
} else if (str.equals(context.getString(R.string.update))) {
if (entrance.contains("我的游戏")) {
MtaHelper.onEvent("我的游戏_启动", "更新", gameEntity.getName());
@ -513,6 +585,9 @@ public class DownloadItemUtils {
DialogUtils.checkDownload(context, apk.getSize(),
isSubscribe -> update(context, gameEntity, entrance, location, isSubscribe, traceEvent));
});
} else {
context.startActivity(DownloadManagerActivity.getDownloadMangerIntent(context,
apk.getUrl(), entrance + "+(" + location.split(":")[0] + ")"));
}
}
@ -528,14 +603,13 @@ public class DownloadItemUtils {
if (TextUtils.isEmpty(msg)) {
DataUtils.onGameDownloadEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), entrance, "下载开始", "下载");
ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, gameEntity.getApk().get(0).getPlatform(), traceEvent, ExposureUtils.DownloadType.DOWNLOAD);
DownloadManager.createDownload(context, gameEntity, context.getString(R.string.download), entrance, location, isSubscribe, downloadExposureEvent);
DownloadManager.createDownload(context, gameEntity, context.getString(R.string.download), entrance, location, isSubscribe, traceEvent);
Utils.toast(context, gameEntity.getName() + "已加入下载队列");
downloadBtn.setText(R.string.downloading);
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
DeviceRemindDialog.Companion.showDeviceRemindDialog(context, gameEntity);
} else {
Utils.toast(context, msg);
}
@ -548,9 +622,7 @@ public class DownloadItemUtils {
if (TextUtils.isEmpty(msg)) {
DataUtils.onGameDownloadEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), entrance, "下载开始", "插件化");
ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, gameEntity.getApk().get(0).getPlatform(), traceEvent, ExposureUtils.DownloadType.PLUGIN_DOWNLOAD);
DownloadManager.createDownload(context, gameEntity, "插件化", entrance, location, isSubscribe, downloadExposureEvent);
DownloadManager.createDownload(context, gameEntity, "插件化", entrance, location, isSubscribe, traceEvent);
Utils.toast(context, gameEntity.getName() + "已加入下载队列");
downloadBtn.setText(R.string.downloading);
@ -575,8 +647,10 @@ public class DownloadItemUtils {
gameEntity.getEntryMap().remove(apkEntity.getPlatform());
}
adapter.notifyItemChanged(position);
} else if (PackageUtils.isCanPluggable(apkEntity)) {
DialogUtils.showPluginDialog(context, () -> PackageInstaller.uninstall(context, path));
} else {
PackageUtils.launchSetup(context, downloadEntity);
PackageInstaller.install(context, downloadEntity);
}
}
}
@ -584,13 +658,9 @@ public class DownloadItemUtils {
//更新
private static void update(Context context, GameEntity gameEntity, String entrance, String location, boolean isSubscribe, @Nullable ExposureEvent traceEvent) {
ApkEntity apkEntity = gameEntity.getApk().get(0);
ExposureUtils.DownloadType downloadType = ExposureUtils.getUpdateType(apkEntity);
DataUtils.onGameUpdateEvent(context, gameEntity.getName(), apkEntity.getPlatform(), "下载开始");
ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, apkEntity
.getPlatform(), traceEvent, downloadType);
DownloadManager.createDownload(context, gameEntity, "更新", entrance, location, isSubscribe, downloadExposureEvent);
DownloadManager.createDownload(context, gameEntity, "更新", entrance, location, isSubscribe, traceEvent);
}
}

View File

@ -10,6 +10,8 @@ import android.os.Build
import androidx.core.app.NotificationCompat
import com.gh.common.AppExecutor
import com.gh.common.constant.Constants
import com.gh.common.xapk.XapkInstaller
import com.gh.common.xapk.XapkUnzipStatus
import com.gh.gamecenter.R
import com.halo.assistant.HaloApp
import com.lightgame.download.DownloadEntity
@ -38,9 +40,10 @@ object DownloadNotificationHelper {
var requireUpdateNotificationGroupDelay = false
val notificationManager = getNotificationManager()
val downloadNotificationId = (entity.gameId + entity.packageName).hashCode()
val xapkStatus = entity.meta[XapkInstaller.XAPK_UNZIP_STATUS]
val intent = Intent()
if (entity.status == DownloadStatus.done) {
if (entity.status == DownloadStatus.done && xapkStatus != XapkUnzipStatus.FAILURE.name) {
intent.putExtra(EntranceUtils.KEY_DATA, entity.toJson())
intent.putExtra(EntranceUtils.KEY_PATH, entity.path)
intent.action = ACTION_INSTALL
@ -65,18 +68,23 @@ object DownloadNotificationHelper {
.setContentIntent(pendingIntent)
.setGroup(DOWNLOAD_GROUP_KEY)
.setWhen(whenTime)
.setProgress(PROGRESS_MAX, entity.percent.toInt(), false)
when (entity.status) {
DownloadStatus.downloading -> builder.setContentText(String.format("%s(剩%s)",
SpeedUtils.getSpeed(entity.speed),
SpeedUtils.getRemainTime(entity.size, entity.progress, entity.speed * 1024)))
DownloadStatus.done -> builder.setContentText("下载完成,点击立即安装")
DownloadStatus.waiting -> builder.setContentText("等待中")
DownloadStatus.subscribe,
DownloadStatus.timeout,
DownloadStatus.neterror -> builder.setContentText("已暂停连接WiFi自动下载")
else -> builder.setContentText("暂停")
if (xapkStatus == XapkUnzipStatus.FAILURE.name) {
builder.setContentText("" + entity.name + "》解压失败,点击查看详情~")
} else {
when (entity.status) {
DownloadStatus.downloading -> builder.setContentText(String.format("%s(剩%s)",
SpeedUtils.getSpeed(entity.speed),
SpeedUtils.getRemainTime(entity.size, entity.progress, entity.speed * 1024)))
DownloadStatus.done -> builder.setContentText("下载完成,点击立即安装")
DownloadStatus.waiting -> builder.setContentText("等待")
DownloadStatus.subscribe,
DownloadStatus.timeout,
DownloadStatus.neterror -> builder.setContentText("已暂停连接WiFi自动下载")
else -> builder.setContentText("暂停中")
}
builder.setProgress(PROGRESS_MAX, entity.percent.toInt(), false)
}
when {
@ -88,30 +96,39 @@ object DownloadNotificationHelper {
else -> builder.setSortKey("C")
}
val notification = builder.build()
notification.flags = notification.flags or Notification.FLAG_NO_CLEAR
if (entity.status == DownloadStatus.delete
|| entity.status == DownloadStatus.cancel
|| entity.status == DownloadStatus.hijack
|| entity.status == DownloadStatus.notfound
|| entity.status == DownloadStatus.overflow
|| (entity.status == DownloadStatus.done // 触发安装事件以后也 cancel 掉通知
&& !entity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION].isNullOrEmpty())) {
requireUpdateNotificationGroupDelay = true
notificationManager.cancel(entity.path, DOWNLOAD_NOTIFICATION_ID)
} else {
if (entity.status != DownloadStatus.downloading) {
notificationManager.notify(entity.path, DOWNLOAD_NOTIFICATION_ID, notification)
tryCatchInRelease {
val notification = builder.build() // 可能会抛出异常
notification.flags = notification.flags or Notification.FLAG_NO_CLEAR
if (xapkStatus == XapkUnzipStatus.FAILURE.name) {
notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL
} else {
val time = mNotifyMap[entity.path]
val curTime = System.currentTimeMillis()
if (time == null || curTime - time > 2000) {
mNotifyMap[entity.path] = curTime
notification.flags = notification.flags or Notification.FLAG_NO_CLEAR
}
if (entity.status == DownloadStatus.delete
|| entity.status == DownloadStatus.cancel
|| entity.status == DownloadStatus.hijack
|| entity.status == DownloadStatus.notfound
|| entity.status == DownloadStatus.overflow
|| (entity.status == DownloadStatus.done // 触发安装事件以后也 cancel 掉通知
&& !entity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION].isNullOrEmpty()
&& xapkStatus != XapkUnzipStatus.FAILURE.name)) {
requireUpdateNotificationGroupDelay = true
notificationManager.cancel(entity.path, DOWNLOAD_NOTIFICATION_ID)
} else {
if (entity.status != DownloadStatus.downloading) {
notificationManager.notify(entity.path, DOWNLOAD_NOTIFICATION_ID, notification)
} else {
val time = mNotifyMap[entity.path]
val curTime = System.currentTimeMillis()
if (time == null || curTime - time > 2000) {
mNotifyMap[entity.path] = curTime
notificationManager.notify(entity.path, DOWNLOAD_NOTIFICATION_ID, notification)
}
}
}
}
if (requireUpdateNotificationGroupDelay) {
// 虽然运行到这里时 notification 已经被 cancel 了,但在下面的 notificationManager.getActiveNotifications 里它有可能还是 active 状态,
// 这里延时 100 ms 避免出现所有的任务都取消了以后依旧有一条 notification group 常驻

View File

@ -6,6 +6,8 @@ import android.preference.PreferenceManager
import com.gh.base.BaseActivity
import com.gh.common.constant.Constants
import com.gh.common.exposure.ExposureUtils
import com.gh.common.xapk.XapkInstaller
import com.gh.download.DownloadDataHelper
import com.gh.download.DownloadManager
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.R
@ -35,15 +37,23 @@ import org.json.JSONObject
import java.util.*
object DownloadObserver {
private val mApplication = HaloApp.getInstance().application
// 如果在WIFI状态下,下载自动暂停,则再重试一遍
@JvmStatic
fun initObserver() {
val dataWatcher = object : DataWatcher() {
override fun onDataChanged(downloadEntity: DownloadEntity) {
if (downloadEntity.status != DownloadStatus.downloading) {
LogUtils.uploadDownloadEvent(downloadEntity)
// todo 如何处理xapk安装问题
val xapkStatus = downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS]
if (!xapkStatus.isNullOrEmpty()) return
val gameId = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER)
val downloadManager = DownloadManager.getInstance(HaloApp.getInstance().application)
tryCatchInRelease {
DownloadDataHelper.uploadDownloadEvent(downloadEntity)
}
if (DownloadStatus.hijack == downloadEntity.status) {
@ -51,41 +61,56 @@ object DownloadObserver {
processHijack(downloadEntity)
val nameAndPlatform = (downloadEntity.name + ":"
+ PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
MtaHelper.onEvent( "下载劫持",
"游戏名字", nameAndPlatform,
"网络状态", DeviceUtils.getNetwork(mApplication))
// MtaHelper.onEvent("下载劫持",
// "游戏名字", nameAndPlatform,
// "网络状态", DeviceUtils.getNetwork(mApplication))
return
} else if (DownloadStatus.notfound == downloadEntity.status) {
// 404 Not Found
// 删除任务
downloadEntity.status = DownloadStatus.cancel
DownloadManager.getInstance(mApplication).cancel(downloadEntity.url)
downloadManager.cancel(downloadEntity.url)
Utils.toast(mApplication, "该链接已失效!请联系管理员。")
MtaHelper.onEventWithBasicDeviceInfo("下载失败弹窗",
"游戏", downloadEntity.name,
"平台", downloadEntity.platform)
// MtaHelper.onEventWithBasicDeviceInfo("下载失败弹窗",
// "游戏", downloadEntity.name,
// "平台", downloadEntity.platform)
DialogUtils.showAlertDialog(AppManager.getInstance().currentActivity(), "下载失败", "下载链接已失效,建议提交反馈", "立即反馈", "取消", {
SuggestionActivity.startSuggestionActivity(AppManager.getInstance().currentActivity(),
SuggestType.gameQuestion, "notfound",
StringUtils.buildString(downloadEntity.name, ",问题反馈:下载链接失效"),
SimpleGameEntity(downloadEntity.gameId, downloadEntity.name, ""))
SimpleGameEntity(gameId, downloadEntity.name, ""))
}, null)
return
} else if (DownloadStatus.neterror == downloadEntity.status || DownloadStatus.timeout == downloadEntity.status) {
if (downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD].isNullOrEmpty()
&& NetworkUtils.isWifiConnected(HaloApp.getInstance().application)) {
downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD] = downloadEntity.progress.toString()
downloadManager.updateDownloadEntity(downloadEntity)
downloadManager.startDownload(downloadEntity.url)
debugOnly {
Utils.log("DownloadObserver", "下载重试->" + downloadEntity.toJson())
}
} else {
Utils.toast(mApplication, "网络不稳定,下载任务已暂停")
DataLogUtils.uploadNeterrorLog(mApplication, downloadEntity)
Utils.toast(mApplication, "网络不稳定,下载任务已暂停")
DataLogUtils.uploadNeterrorLog(mApplication, downloadEntity)
MtaHelper.onEventWithBasicDeviceInfo("下载自动暂停",
"游戏", downloadEntity.name,
"平台", downloadEntity.platform)
// MtaHelper.onEventWithBasicDeviceInfo("下载自动暂停",
// "游戏", downloadEntity.name,
// "平台", downloadEntity.platform)
debugOnly {
Utils.log("DownloadObserver", "下载自动暂停->" + downloadEntity.toJson())
}
}
}
if (DownloadStatus.done == downloadEntity.status) {
if (downloadEntity.name.contains(mApplication.getString(R.string.app_name))) {
MtaHelper.onEvent("软件更新", "下载完成")
mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path, true))
tryWithDefaultCatch {
// 会有 ActivityNotFoundException 异常catch 掉不管了
PackageInstaller.install(mApplication, downloadEntity)
}
DataLogUtils.uploadUpgradeLog(mApplication, "install") //上传更新安装数据
} else {
statDoneEvent(downloadEntity)
@ -107,11 +132,13 @@ object DownloadObserver {
if (PreferenceManager.getDefaultSharedPreferences(mApplication).getBoolean(SettingsFragment.AUTO_INSTALL_SP_KEY, true)) {
if (FileUtils.isEmptyFile(downloadEntity.path)) {
Utils.toast(mApplication, R.string.install_failure_hint)
DownloadManager.getInstance(mApplication).cancel(downloadEntity.url)
downloadManager.cancel(downloadEntity.url)
} else {
if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path)) {
downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES"
mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path))
tryWithDefaultCatch {
PackageInstaller.install(mApplication, downloadEntity, false)
}
} else {
// 弹出卸载提示框
EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path))
@ -121,26 +148,33 @@ object DownloadObserver {
}
// 统计下载完成
uploadData(downloadEntity.gameId, downloadEntity.platform)
uploadData(gameId, downloadEntity.platform)
}
// 下载过程分析统计
val pm = mApplication.packageManager
val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, PackageManager.GET_ACTIVITIES)
if (packageInfo == null) {
MtaHelper.onEventWithBasicDeviceInfo("解析包错误分析",
"游戏名字", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
MtaHelper.onEventWithBasicDeviceInfo("解析包错误_新",
"游戏", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
// MtaHelper.onEventWithBasicDeviceInfo("解析包错误分析",
// "游戏名字", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
//
// MtaHelper.onEventWithBasicDeviceInfo("解析包错误_新",
// "游戏", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
}
}
if (downloadEntity.status == DownloadStatus.done) {
EventBus.getDefault().post(EBDownloadStatus("done", "", "", "", "", ""))
EventBus.getDefault().post(EBDownloadStatus("done", "", "", "", downloadEntity.packageName, ""))
}
DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity)
// 如果已下载大小发生变化,表示成功恢复下载,则重置重试标记
if (downloadEntity.status == DownloadStatus.downloading &&
downloadEntity.progress.toString() != downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD]) {
downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD] = ""
downloadManager.updateDownloadEntity(downloadEntity)
}
}
}
@ -171,32 +205,34 @@ object DownloadObserver {
type = ExposureUtils.DownloadType.DOWNLOAD
}
val kv2 = HashMap<String, Any>()
kv2["版本"] = downloadEntity.platform
kv2["状态"] = "下载完成"
kv2["位置"] = downloadEntity.entrance ?: "null"
kv2["游戏分平台"] = downloadEntity.name + "-" + platform
kv2["光环助手版本"] = BuildConfig.VERSION_NAME
DataUtils.onEvent(mApplication, "游戏下载位置", downloadEntity.name, kv2)
// val kv2 = HashMap<String, Any>()
// kv2["版本"] = downloadEntity.platform
// kv2["状态"] = "下载完成"
// kv2["位置"] = downloadEntity.entrance ?: "null"
// kv2["游戏分平台"] = downloadEntity.name + "-" + platform
// kv2["光环助手版本"] = BuildConfig.VERSION_NAME
// DataUtils.onEvent(mApplication, "游戏下载位置", downloadEntity.name, kv2)
if (downloadEntity.isPluggable) {
val kv3 = HashMap<String, Any>()
kv3["下载"] = "下载完成"
kv3["版本"] = downloadEntity.platform
kv3["位置"] = downloadEntity.entrance ?: "null"
kv3["位置"] = downloadEntity.entrance ?: "null"
type = ExposureUtils.DownloadType.PLUGIN_DOWNLOAD
DataUtils.onEvent(mApplication, "插件化", downloadEntity.name, kv3)
MtaHelper.onEvent(
"插件化_新",
"位置", downloadEntity.entrance,
"游戏", downloadEntity.name + "-" + downloadEntity.platform,
"操作", "下载完成",
"网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application))
// MtaHelper.onEvent(
// "插件化_新",
// "位置", downloadEntity.entrance,
// "游戏", downloadEntity.name + "-" + downloadEntity.platform,
// "操作", "下载完成",
// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application))
}
ExposureUtils.logADownloadCompleteExposureEvent(
GameEntity(downloadEntity.gameId, downloadEntity.name),
GameEntity(id = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER),
mName = downloadEntity.name.removeSuffix(Constants.GAME_NAME_DECORATOR),
gameVersion = downloadEntity.versionName ?: ""),
downloadEntity.platform,
downloadEntity.exposureTrace,
type)

View File

@ -28,6 +28,7 @@ public class EntranceUtils {
public static final String KEY_ID = "id";
public static final String KEY_URL = "url";
public static final String KEY_GAMENAME = "gameName";
public static final String KEY_PACKAGE_MD5 = "package_md5";
public static final String HOST_ARTICLE = "article";
public static final String HOST_UPLOAD_VIDEO = "upload_video";//上传视频
public static final String HOST_VIDEO_SINGLE = "video_single";//指定视频-不能划动
@ -37,6 +38,17 @@ public class EntranceUtils {
public static final String HOST_VIDEO_COLLECTION = "video_collection";//视频合集
public static final String HOST_USERHOME = "userhome";//个人主页
public static final String HOST_VIDEO = "video";
public static final String HOST_CATEGORY = "category";//分类
public static final String HOST_COLUMN_COLLECTION = "column_collection";//专题合集
public static final String HOST_COMMUNITY_QUESTION_LABEL_DETAIL = "community_question_label_detail";//问题标签详情
public static final String HOST_COMMUNITY_COLUMN_DETAIL = "community_column_detail";//专栏详情
public static final String HOST_BLOCK = "block";//板块
public static final String HOST_SERVER_BLOCK = "server";//开服表板块
public static final String HOST_AMWAY_BLOCK = "amway";//安利墙板块
public static final String HOST_HELP = "help";//Q&A
public static final String HOST_HELP_COLLECTION = "help_collection";//Q&A合集
public static final String HOST_GAME_UPLOAD = "game_upload";//游戏上传
public static final String HOST_GAME_ZONE = "game_zone";//游戏专区
public static final String HOST_COMMUNITY_ARTICLE = "community_article";
public static final String HOST_COMMUNITY_COLUMN = "community_column";
public static final String HOST_GAME = "game";
@ -45,6 +57,7 @@ public class EntranceUtils {
public static final String HOST_WEB = "web";
public static final String HOST_QQ = "qq";
public static final String HOST_QQ_GROUP = "qqgroup";
public static final String HOST_QQ_QUN = "qqqun";
public static final String HOST_DOWNLOAD = "download";
public static final String HOST_UPDATE = "update";
public static final String HOST_LIBAO = "libao";
@ -70,6 +83,7 @@ public class EntranceUtils {
public static final String ENTRANCE_DOWNLOAD = "(下载跳转)";
public static final String ENTRANCE_RECOMMEND = "(落地页)";
public static final String ENTRANCE_BLOCK_RECOMMEND = "(推荐入口)";
public static final String ENTRANCE_AMWAY = "(安利墙)";
public static final String KEY_SUGGEST_HINT_TYPE = "suggestHintType";
public static final String KEY_PACKAGENAME = "packageName";
public static final String KEY_PLATFORM = "platform";
@ -86,6 +100,7 @@ public class EntranceUtils {
public static final String KEY_OLDERUSER = "isOldUser";
public static final String KEY_SEARCHKEY = "searchKey";
public static final String KEY_HINT = "hint";
public static final String KEY_GAME = "game";
public static final String KEY_GAME_ICON_URL = "gameIconUrl";
public static final String KEY_SHARECONTENT = "shareContent";
public static final String KEY_SUGGESTTYPE = "suggestType";
@ -138,6 +153,7 @@ public class EntranceUtils {
public static final String KEY_DIRECT_COMMENT = "directComment";
public static final String KEY_SORT = "sort";
public static final String KEY_AMWAY = "amway";
public static final String KEY_SKIP_SUCCESS_PAGE = "skipSuccessPage";
public static final String KEY_COLLECTION_ID = "collectionId";
public static final String KEY_NAVIGATION_TITLE = "navigationTitle";
public static final String KEY_IMAGE_CROP_RATIO = "imageCropRatio";
@ -147,8 +163,22 @@ public class EntranceUtils {
public static final String KEY_IS_HOME_VIDEO = "isHomeVideo";
public static final String KEY_IS_HOME = "isHome";
public static final String KEY_WEB_SHARE = "webShare";
public static final String KEY_ACTIVITY_NAME = "activityName";//活动名称
public static final String KEY_REQUIRE_REDIRECT = "require_redirect"; // 标记需要再跳转
public static final String KEY_FIELD_ID = "field_id"; // 专区板块id
public static final String KEY_SECTION_NAME = "section_name"; // 专区专题名
public static final String KEY_COLUMNNAME = "columnName";
public static final String KEY_QA_ID = "qaId";
public static final String KEY_QA_COLLECTION_ID = "qaCollectionId";
public static final String KEY_SHOW_EDIT_DRAFT = "showEditDraft";
public static final String KEY_ARTICLE_OPEN_IN_NEW_PAGE = "openArticleInNewPage";
public static final String KEY_ONLY_CREATE_DRAFT = "onlyCreateDraft";
public static final String KEY_KAIFU_SELECT_TIME = "kaifuSelectTime";
public static final String KEY_POSTER_PATH = "posterPath";
public static final String KEY_BLACK_THEME = "blackTheme";
public static void jumpActivity(Context context, Bundle bundle) {
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
//TODO 把其他类似的跳转启动逻辑也处理掉
if (RunningUtils.isRunning(context)
@ -173,6 +203,7 @@ public class EntranceUtils {
public static void jumpActivity(Context context, Bundle nextToBundle, Bundle bundle, Callback callback) {
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
//TODO 把其他类似的跳转启动逻辑也处理掉
if (RunningUtils.isRunning(context)

View File

@ -3,10 +3,11 @@ package com.gh.common.util
import android.animation.Animator
import android.content.ClipboardManager
import android.content.Context
import android.text.Editable
import android.text.Html
import android.text.Spanned
import android.text.TextWatcher
import android.os.Build
import android.text.*
import android.text.style.ClickableSpan
import android.text.style.ImageSpan
import android.text.style.URLSpan
import android.util.TypedValue
import android.view.Gravity
import android.view.View
@ -18,16 +19,23 @@ import androidx.core.text.HtmlCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.*
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
import com.airbnb.lottie.LottieAnimationView
import com.facebook.drawee.view.SimpleDraweeView
import com.gh.common.DefaultUrlHandler
import com.gh.common.constant.Config
import com.gh.common.constant.Constants
import com.gh.common.view.CenterImageSpan
import com.gh.common.view.CustomLinkMovementMethod
import com.gh.common.view.ExpandTextView
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.R
import com.gh.gamecenter.WebActivity
import com.google.gson.reflect.TypeToken
import com.halo.assistant.HaloApp
import com.lightgame.download.DownloadEntity
import com.lightgame.utils.Utils
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
@ -35,7 +43,9 @@ import io.reactivex.disposables.Disposable
import okhttp3.MediaType
import okhttp3.RequestBody
import java.net.URI
import java.util.*
import java.util.concurrent.TimeUnit
import java.util.regex.Pattern
import kotlin.math.abs
/**
@ -191,6 +201,28 @@ inline fun <reified T : Any> T.toJson(): String {
return GsonUtils.toJson(this)
}
fun String.insert(index: Int, string: String): String {
return this.substring(0, index) + string + this.substring(index, this.length)
}
/**
* TextView 内部处理 ul li ol 得跟 Android 版本走,这里换成专属的标签手动处理
*/
fun String.replaceUnsupportedHtmlTag(): String {
return this.replace("<ul", "<hul")
.replace("</ul>", "</hul>")
.replace("<li", "<hli")
.replace("</li>", "</hli>")
.replace("<ol", "<hol")
.replace("</ol>", "</hol>")
}
fun String.containHtmlTag(): Boolean {
val pattern = Pattern.compile("<(\"[^\"]*\"|'[^']*'|[^'\">])*>")
val matcher = pattern.matcher(this)
return matcher.find()
}
/**
* 在限定 interval 里只触发一次 action
*/
@ -237,6 +269,24 @@ inline fun tryCatchInRelease(action: (() -> Unit)) {
}
}
/**
* 在 debug 状态下抛出异常
*/
fun throwExceptionInDebug(message: String = "", predicate: Boolean = true) {
if (predicate && BuildConfig.DEBUG) {
throw RuntimeException(message)
}
}
/**
* 主动抛出异常
*/
fun throwException(message: String = "", predicate: Boolean = true) {
if (predicate) {
throw RuntimeException(message)
}
}
/**
* String related
*/
@ -276,11 +326,22 @@ fun String.subStringIfPossible(length: Int): String {
}
}
fun String.countOccurrences(char: String): Int {
return StringTokenizer(" $this ", char).countTokens() - 1
}
fun String.getFirstElementDividedByDivider(divider: String): String {
if (this.contains(divider)) {
return this.split(divider.toRegex()).toTypedArray()[0]
}
return this
}
fun String.copyTextAndToast(toastText: String = "复制成功") {
val application = HaloApp.getInstance().application
val cmb = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
cmb.text = this
Utils.toast(application, toastText)
ToastUtils.showToast(toastText)
}
fun Map<String, String>.createRequestBody(): RequestBody {
@ -433,6 +494,75 @@ fun TextView.setTextChangedListener(action: (s: CharSequence, start: Int, before
})
}
/**
* 拦截 TextView 中的 Url Span用应用内页面的形式打开链接
* @param shrankText 未展开时的文字
* @param expandedText 展开后的文字
*/
fun ExpandTextView.setTextWithInterceptingInternalUrl(shrankText: CharSequence, expandedText: CharSequence) {
var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan()
var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan()
// 去掉旧版本 Android 系统 [Html.FROM_HTML_MODE_LEGACY] 产生的两个换行符 (丑陋的代码)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
while (shrankSsb.contains("\n\n")) {
val index = shrankSsb.indexOf("\n\n", 0, true)
shrankSsb = SpannableStringBuilder(shrankSsb.subSequence(0, index)).append(shrankSsb.subSequence(index + "\n".length, shrankSsb.length))
}
while (expandedSsb.contains("\n\n")) {
val index = expandedSsb.indexOf("\n\n", 0, true)
expandedSsb = SpannableStringBuilder(expandedSsb.subSequence(0, index)).append(expandedSsb.subSequence(index + "\n".length, expandedSsb.length))
}
}
// 去掉多余的 P 标签换行
if (expandedSsb.endsWith("\n", true)) {
expandedSsb = SpannableStringBuilder((expandedSsb.subSequence(0, expandedSsb.length - "\n".length)))
}
movementMethod = CustomLinkMovementMethod.getInstance()
shrankSsb = TextHelper.updateSpannableStringWithHighlightedSpan(context, shrankSsb, highlightedTextClickListener = null)
expandedSsb = TextHelper.updateSpannableStringWithHighlightedSpan(context, expandedSsb, highlightedTextClickListener = null)
setShrankTextAndExpandedText(shrankSsb, expandedSsb)
}
fun CharSequence.interceptUrlSpanAndRoundImageSpan(): SpannableStringBuilder {
return SpannableStringBuilder.valueOf(this).apply {
getSpans(0, length, URLSpan::class.java).forEach {
setSpan(
object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(HaloApp.getInstance().application, R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
if (!DefaultUrlHandler.interceptUrl(widget.context, it.url, "")) {
widget.context.startActivity(WebActivity.getIntent(widget.context, it.url, true))
}
}
},
getSpanStart(it),
getSpanEnd(it),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
removeSpan(it)
}
getSpans(0, length, ImageSpan::class.java).forEach {
setSpan(
CenterImageSpan(it.drawable),
getSpanStart(it),
getSpanEnd(it),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
removeSpan(it)
}
}
}
fun Int.toColor(): Int {
return ContextCompat.getColor(HaloApp.getInstance().application, this)
}
@ -452,6 +582,46 @@ fun SimpleDraweeView.display(url: String) {
ImageUtils.display(this, url)
}
/**
* DownloadEntity extension
*/
fun DownloadEntity.addMetaExtra(key: String, value: String?) {
value?.let { meta[key] = value }
}
fun DownloadEntity.getMetaExtra(key: String) : String {
return meta[key] ?: ""
}
/**
* Process related
*/
fun Context.doOnMainProcessOnly(callback: EmptyCallback) {
doOnMainProcessOnly { callback.onCallback() }
}
inline fun Context.doOnMainProcessOnly(f: () -> Unit) {
val processName = PackageUtils.obtainProcessName(this)
if (processName == null || BuildConfig.APPLICATION_ID == processName) {
f.invoke()
} else {
tryWithDefaultCatch {
Utils.log("Block one useless sub process method call from ${Thread.currentThread().stackTrace[3].methodName} -> ${Thread.currentThread().stackTrace[2].methodName}.")
}
}
}
inline fun doOnMainProcessOnly(f: () -> Unit) {
val processName = PackageUtils.obtainProcessName(HaloApp.getInstance().application)
if (processName == null || BuildConfig.APPLICATION_ID == processName) {
f.invoke()
} else {
tryWithDefaultCatch {
Utils.log("Block one useless sub process method call from ${Thread.currentThread().stackTrace[3].methodName} -> ${Thread.currentThread().stackTrace[2].methodName}.")
}
}
}
/**
* 测试用包裹
*/
@ -471,15 +641,15 @@ inline fun testChannelOnly(f: () -> Unit) {
* 倒计时单位s
*/
inline fun countDownTimer(
millisUntilFinish: Long,
crossinline block: (finish: Boolean, millisUntilFinished: Long) -> Unit
timeInSeconds: Long,
crossinline block: (finish: Boolean, remainingTime: Long) -> Unit
): Disposable {
var subscribe: Disposable? = null
subscribe = Observable.interval(0, 1000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
if (it < millisUntilFinish) {
block.invoke(false, millisUntilFinish - it)
if (it < timeInSeconds) {
block.invoke(false, timeInSeconds - it)
} else {
block.invoke(true, 0)
if (subscribe != null && !subscribe!!.isDisposed) {
@ -537,4 +707,41 @@ fun LottieAnimationView.doOnAnimationEnd(action: () -> Unit) {
}
})
}
fun String?.getExtension(): String? {
this ?: return null
tryCatchInRelease {
val lastDotIndex = this.lastIndexOf('.')
return if (lastDotIndex == -1) null else this.substring(lastDotIndex + 1)
}
return null
}
/**
* 检查内容是否一致
* @return true:相同 false:不同
*/
fun List<String>?.checkSameFromStringArray(check2: List<String>?): Boolean {
if (this == check2) {
return true
}
if (this == null && check2 == null) {
return true
}
if (this == null || check2 == null) {
return false
}
if (this.size != check2.size) {
return false
}
for (tag in this) {
if (!check2.contains(tag)) return false
}
for (tag in check2) {
if (!this.contains(tag)) return false
}
return true
}

View File

@ -0,0 +1,183 @@
package com.gh.common.util
import android.text.Editable
import android.text.Html.TagHandler
import android.text.Spanned
import android.text.style.BulletSpan
import android.text.style.LeadingMarginSpan
import android.util.Log
import org.xml.sax.XMLReader
import java.util.*
/**
* Implements support for ordered (`<ol>`) and unordered (`<ul>`) lists in to Android TextView.
*
*
* This can be used as follows:<br></br>
* `textView.setText(Html.fromHtml("<ul><li>item 1</li><li>item 2</li></ul>", null, new HtmlListTagHandler()));`
*
*
* Implementation based on code by Juha Kuitunen (https://bitbucket.org/Kuitsi/android-textview-html-list),
* released under Apache License v2.0. Refactored & improved by Matthias Stevens (InThePocket.mobi).
*
*
* **Known issues:**
* * The indentation on nested `<ul>`s isn't quite right (TODO fix this)
* * the `start` attribute of `<ol>` is not supported. Doing so is tricky because
* [Html.TagHandler.handleTag] does not expose tag attributes.
* The only way to do it would be to use reflection to access the attribute information kept by the XMLReader
* (see: http://stackoverflow.com/a/24534689/1084488).
*
* https://bitbucket.org/Kuitsi/android-textview-html-list/src/master/app/src/main/java/fi/iki/kuitsi/listtest/MyTagHandler.java
*
*/
class ExtraTagHandler : TagHandler {
/**
* Keeps track of lists (ol, ul). On bottom of Stack is the outermost list
* and on top of Stack is the most nested list
*/
private val lists = Stack<ListTag>()
/**
* @see android.text.Html.TagHandler.handleTag
*/
override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
if (UL_TAG.equals(tag, ignoreCase = true)) {
if (opening) { // handle <ul>
lists.push(Ul())
} else { // handle </ul>
lists.pop()
}
} else if (OL_TAG.equals(tag, ignoreCase = true)) {
if (opening) { // handle <ol>
lists.push(Ol()) // use default start index of 1
} else { // handle </ol>
lists.pop()
}
} else if (LI_TAG.equals(tag, ignoreCase = true)) {
if (opening) { // handle <li>
lists.peek().openItem(output)
} else { // handle </li>
lists.peek().closeItem(output, lists.size)
}
} else {
Log.d("TagHandler", "Found an unsupported tag $tag")
}
}
/**
* Abstract super class for [Ul] and [Ol].
*/
private abstract class ListTag {
/**
* Opens a new list item.
*
* @param text
*/
open fun openItem(text: Editable) {
if (text.length > 0 && text[text.length - 1] != '\n') {
text.append("\n")
}
val len = text.length
text.setSpan(this, len, len, Spanned.SPAN_MARK_MARK)
}
/**
* Closes a list item.
*
* @param text
* @param indentation
*/
fun closeItem(text: Editable, indentation: Int) {
if (text.length > 0 && text[text.length - 1] != '\n') {
text.append("\n")
}
val replaces = getReplaces(text, indentation)
val len = text.length
val listTag = getLast(text)
val where = text.getSpanStart(listTag)
text.removeSpan(listTag)
if (where != len) {
for (replace in replaces) {
text.setSpan(replace, where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
}
protected abstract fun getReplaces(text: Editable?, indentation: Int): Array<Any>
/**
* Note: This knows that the last returned object from getSpans() will be the most recently added.
*
* @see Html
*/
private fun getLast(text: Spanned): ListTag? {
val listTags = text.getSpans(0, text.length, ListTag::class.java)
return if (listTags.size == 0) {
null
} else listTags[listTags.size - 1]
}
}
/**
* Class representing the unordered list (`<ul>`) HTML tag.
*/
private class Ul : ListTag() {
override fun getReplaces(text: Editable?, indentation: Int): Array<Any> {
// Nested BulletSpans increases distance between BULLET_SPAN and text, so we must prevent it.
var bulletMargin = INDENT_PX
if (indentation > 1) {
bulletMargin = INDENT_PX - BULLET_SPAN.getLeadingMargin(true)
if (indentation > 2) {
// This get's more complicated when we add a LeadingMarginSpan into the same line:
// we have also counter it's effect to BulletSpan
bulletMargin -= (indentation - 2) * LIST_ITEM_INDENT_PX
}
}
return arrayOf(
LeadingMarginSpan.Standard(LIST_ITEM_INDENT_PX * (indentation - 1)),
BulletSpan(bulletMargin)
)
}
}
/**
* Class representing the ordered list (`<ol>`) HTML tag.
*/
private class Ol
/**
* Creates a new `<ul>` with start index of 1.
*/ @JvmOverloads constructor(private var nextIdx: Int = 1) : ListTag() {
override fun openItem(text: Editable) {
super.openItem(text)
text.append(Integer.toString(nextIdx++)).append(". ")
}
override fun getReplaces(text: Editable?, indentation: Int): Array<Any> {
var numberMargin = LIST_ITEM_INDENT_PX * (indentation - 1)
if (indentation > 2) {
// Same as in ordered lists: counter the effect of nested Spans
numberMargin -= (indentation - 2) * LIST_ITEM_INDENT_PX
}
return arrayOf(LeadingMarginSpan.Standard(numberMargin))
}
/**
* Creates a new `<ul>` with given start index.
*
* @param nextIdx
*/
}
companion object {
private const val OL_TAG = "hol"
private const val UL_TAG = "hul"
private const val LI_TAG = "hli"
/**
* List indentation in pixels. Nested lists use multiple of this.
*/
private const val INDENT_PX = 10
private const val LIST_ITEM_INDENT_PX = INDENT_PX * 2
private val BULLET_SPAN = BulletSpan(INDENT_PX)
}
}

View File

@ -1,100 +0,0 @@
package com.gh.common.util
import android.content.Context
import android.text.TextUtils
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.SubjectEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import io.reactivex.schedulers.Schedulers
/**
* 首页补充游戏库辅助类
*/
object GameRepositoryHelper {
private const val KEY_GAME_REPOSITORY = "game_repository"
var gameCollectionList: List<SubjectEntity> = arrayListOf()
init {
loadSavedRepository()
}
/**
* 获取游戏补充库
*/
@JvmStatic
fun getGameRepository(context: Context) {
RetrofitManager.getInstance(context)
.api
.reserveColumns
.subscribeOn(Schedulers.io())
.subscribe(object : Response<List<SubjectEntity>>() {
override fun onResponse(response: List<SubjectEntity>?) {
super.onResponse(response)
updateGameRepository(response)
}
})
}
/**
* 刷新内存中的游戏库(即从 SP 中再读一次)
*/
@JvmStatic
fun refreshGameRepository() = loadSavedRepository()
private fun loadSavedRepository() {
gameCollectionList = SPUtils.getString(KEY_GAME_REPOSITORY).toObject() ?: arrayListOf()
}
fun updateGameRepository(subjects: List<SubjectEntity>?) {
if (subjects == null) return
SPUtils.setString(KEY_GAME_REPOSITORY, subjects.toJson())
gameCollectionList = subjects
}
/**
* 从补充游戏库相应的专题中取出一个与其它游戏都不相同的游戏,为空时即为游戏用完或不存在该相应专题
* @param collectionId 补充游戏库相应专题 ID
* @param gameIdList 该专题里已经包含的游戏 ID 列表
*/
fun getOneUniqueGame(collectionId: String?, gameIdList: HashSet<String>): GameEntity? {
collectionId?.let {
val collection = gameCollectionList.find { it.id == collectionId }
collection?.let {
val game = collection.data?.find { game -> isThisGameUnique(game, gameIdList) }
game?.let {
collection.data?.remove(game)
// 产品说要记录补充专题的曝光数,所以这个游戏附带了所在专题的名字
game.subjectName = collection.name
return game
}
}
}
return null
}
private fun isThisGameUnique(game: GameEntity, gameIdList: HashSet<String>): Boolean {
// 若该补充游戏已经存在关联关系,判定为非唯一
for (relatedId in game.relatedGameIds!!) {
gameIdList.contains(relatedId)
return false
}
for (apk in game.getApk()) {
// 检查本地是否已安装该游戏,已过滤那部分框架服务的包名
if (PackageHelper.validLocalPackageNameSet.contains(apk.packageName)) {
return false
}
}
return !gameIdList.contains(game.id) && !TextUtils.isEmpty(game.id)
}
}

View File

@ -0,0 +1,194 @@
package com.gh.common.util
import android.annotation.SuppressLint
import android.text.TextUtils
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.SubjectEntity
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import io.reactivex.schedulers.Schedulers
/**
* 首页补充游戏库辅助类
*/
object GameSubstituteRepositoryHelper {
private const val KEY_GAME_REPOSITORY = "game_substitute_repository"
private var mSubstitutableGameIdSet = hashSetOf<String>()
private var mApi = RetrofitManager.getInstance(HaloApp.getInstance().application).api
private val mSensitiveApi = RetrofitManager.getInstance(HaloApp.getInstance().application).sensitiveApi
private var mApplicationContext = HaloApp.getInstance().application
var gameCollectionList: List<SubjectEntity> = arrayListOf()
init {
loadSavedRepository()
}
/**
* 获取游戏补充库
*/
@JvmStatic
fun updateGameSubstituteRepository() {
mSensitiveApi.reserveColumns
.subscribeOn(Schedulers.io())
.subscribe(object : Response<List<SubjectEntity>>() {
override fun onResponse(response: List<SubjectEntity>?) {
super.onResponse(response)
updateGameRepository(response)
}
})
}
@JvmStatic
@SuppressLint("CheckResult")
fun updateSubstitutableGames() {
mApplicationContext.doOnMainProcessOnly {
val single = if (UserManager.getInstance().isLoggedIn) {
mApi.getIdListOfPlayedGames(UserManager.getInstance().userId, Utils.getTime(mApplicationContext))
} else {
mApi.getIdListOfDownloadedGames(HaloApp.getInstance().gid, Utils.getTime(mApplicationContext))
}
single.subscribeOn(Schedulers.io()).subscribe(object : BiResponse<List<String>>() {
override fun onSuccess(data: List<String>) {
mSubstitutableGameIdSet = data.toHashSet()
}
})
}
}
/**
* 刷新内存中的游戏库(即从 SP 中再读一次)
*/
@JvmStatic
fun refreshRepositoryFromLocal() = loadSavedRepository()
private fun loadSavedRepository() {
gameCollectionList = SPUtils.getString(KEY_GAME_REPOSITORY).toObject() ?: arrayListOf()
}
private fun updateGameRepository(subjects: List<SubjectEntity>?) {
if (subjects == null) return
SPUtils.setString(KEY_GAME_REPOSITORY, subjects.toJson())
gameCollectionList = subjects
}
/**
* 从补充游戏库相应的专题中取出一个与其它游戏都不相同的游戏,为空时即为游戏用完或不存在该相应专题
* @param collectionId 补充游戏库相应专题 ID
* @param gameIdList 该专题里已经包含的游戏 ID 列表
*/
private fun getOneUniqueGame(collectionId: String?, gameIdList: HashSet<String>): GameEntity? {
collectionId?.let {
val collection = gameCollectionList.find { it.id == collectionId }
collection?.let {
val game = collection.data?.find { game -> isThisGameUnique(game, gameIdList) }
game?.let {
collection.data?.remove(game)
// 产品说要记录补充专题的曝光数,所以这个游戏附带了所在专题的名字
game.subjectName = collection.name
return game
}
}
}
return null
}
/**
* 替换游戏,包括 已安装,历史下载,历史已安装等类型
*/
fun replaceGames(gameList: MutableList<GameEntity>,
alreadyDisplayedGameIdSet: HashSet<String>,
relatedCollectionId: String,
shouldLogReplaceEvent: Boolean) {
val positionOfTheGameToReplaceList = arrayListOf<Int>()
// 标记需要替换的已安装游戏
for ((index, game) in gameList.withIndex()) {
// 是大图形式的游戏时不标记替换
if ((index == 0 && !gameList[0].image.isNullOrEmpty())) {
continue
}
var isThisPositionLabeled = false
// 从 游戏ID 判断当前游戏是否需要被替换
if (mSubstitutableGameIdSet.contains(game.id)) {
positionOfTheGameToReplaceList.add(index)
isThisPositionLabeled = true
}
// 检查是否已安装该游戏里同包名的 APK
if (!isThisPositionLabeled) {
for (apk in game.getApk()) {
if (PackageHelper.validLocalPackageNameSet.contains(apk.packageName)) {
// 将该位置的游戏标记为需要替换
positionOfTheGameToReplaceList.add(index)
isThisPositionLabeled = true
break
}
}
}
// 若此游戏所包含的 apk 没有已安装,那么再检查是否已安装有预设相关包名
if (!isThisPositionLabeled) {
var relatedPackageList = arrayListOf<String>()
for (entity in PackageHelper.relatedPackageList) {
if (entity.gameId == game.id) {
relatedPackageList = ArrayList(entity.packages!!)
break
}
}
for (packageName in relatedPackageList) {
if (PackageHelper.validLocalPackageNameSet.contains(packageName)) {
positionOfTheGameToReplaceList.add(index)
break
}
}
}
}
if (positionOfTheGameToReplaceList.isNotEmpty()) {
if (shouldLogReplaceEvent) {
MtaHelper.onEvent("首页_加载", "启动光环", "替换游戏")
}
for (position in positionOfTheGameToReplaceList) {
val replacingGame = getOneUniqueGame(relatedCollectionId, alreadyDisplayedGameIdSet)
replacingGame?.let {
gameList[position] = replacingGame
}
}
}
}
private fun isThisGameUnique(game: GameEntity, gameIdList: HashSet<String>): Boolean {
// 判断该游戏是否出现在已安装列表
if (mSubstitutableGameIdSet.contains(game.id)) return false
// 该补充游戏是否已经存在关联关系
for (relatedId in game.relatedGameIds!!) {
if (gameIdList.contains(relatedId)) {
return false
}
}
for (apk in game.getApk()) {
// 检查本地是否已安装该游戏,已过滤那部分框架服务的包名
if (PackageHelper.validLocalPackageNameSet.contains(apk.packageName)) {
return false
}
}
return !gameIdList.contains(game.id) && !TextUtils.isEmpty(game.id)
}
}

View File

@ -5,12 +5,14 @@ import android.graphics.Color;
import android.text.TextUtils;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.annotation.Nullable;
import com.gh.common.constant.Config;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.ApkLink;
import com.gh.gamecenter.entity.GameCollectionEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.GameUpdateEntity;
import com.gh.gamecenter.entity.PluginLocation;
@ -19,9 +21,9 @@ import com.gh.gamecenter.manager.PackagesManager;
import com.lightgame.download.DownloadEntity;
import com.lightgame.download.DownloadStatus;
import java.util.ArrayList;
import java.util.List;
public class GameUtils {
/**
@ -53,13 +55,13 @@ public class GameUtils {
String status = getDownloadBtnText(context, gameEntity, pluginLocation);
downloadBtn.setTextColor(Color.WHITE);
downloadBtn.setText(status);
if ("插件化".equals(status)) {
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
} else if ("打开".equals(status) || "启动".equals(status)) {
downloadBtn.setBackgroundResource(R.drawable.detail_download_open_style);
downloadBtn.setTextColor(ContextCompat.getColor(context, R.color.theme_font));
if (context.getString(R.string.pluggable).equals(status)) {
downloadBtn.setBackgroundResource(R.drawable.download_button_pluggable_style);
String pluginDesc = gameEntity.getPluginDesc();
if (pluginDesc.length() > 3) pluginDesc = pluginDesc.substring(0, 3);
downloadBtn.setText((pluginDesc + ""));
} else {
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
downloadBtn.setBackgroundResource(R.drawable.download_button_normal_style);
}
}
@ -67,6 +69,10 @@ public class GameUtils {
* 获取下载按钮文案
*/
public static String getDownloadBtnText(Context context, GameEntity gameEntity, PluginLocation pluginLocation) {
if (gameEntity.getApk().size() > 1) {
return context.getString(R.string.expand);
}
int doneCount = 0; // 下载完成数量
int pluginCount = 0; // 可插件化数量
int updateCount = 0; // 可更新数量
@ -103,7 +109,7 @@ public class GameUtils {
gh_id = PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_id");
if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
&& !TextUtils.isEmpty(apkEntity.getGhVersion())
&& !PackageUtils.isSignature(context, apkEntity.getPackageName())
&& !PackageUtils.isSignedByGh(context, apkEntity.getPackageName())
&& apkEntity.isShowPlugin(pluginLocation)) {
pluginCount++;
} else if (gh_id == null || gh_id.equals(gameEntity.getId())) {
@ -118,23 +124,66 @@ public class GameUtils {
} else if (updateCount != 0) {
return context.getString(R.string.update);
} else if (installCount != 0) {
if (gameEntity.getApk().size() == 1) {
return context.getString(R.string.launch);
} else {
return context.getString(R.string.open);
}
return context.getString(R.string.launch);
} else if (gameEntity.getVersionNumber().contains("无版号") && Config.isGameDomeSwitchOpen()) {
return context.getString(R.string.attempt);
} else {
return context.getString(R.string.download);
}
}
/**
* 获取GameUpdateEntity
* 获取简单的下载按钮文案,只需要知道是否已下载,是否已安装
*/
public static String getSimpleDownloadBtnText(Context context, GameEntity gameEntity) {
int doneCount = 0; // 下载完成数量
int installCount = 0; // 已安装数量
DownloadEntity downloadEntity;
Object gh_id;
apkFor:
for (ApkEntity apkEntity : gameEntity.getApk()) {
// filter by packageName
SettingsEntity settings = Config.getSettings();
if (settings != null && gameEntity.getApk().size() > 1) {
for (String pkgName : settings.getGameDownloadBlackList()) {
if (pkgName.equals(apkEntity.getPackageName())) {
continue apkFor;
}
}
}
downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.getUrl());
if (downloadEntity != null) {
if (downloadEntity.getStatus().equals(DownloadStatus.done)) {
doneCount++;
}
}
if (PackagesManager.INSTANCE.isInstalled(apkEntity.getPackageName())) {
gh_id = PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_id");
if (gh_id == null || gh_id.equals(gameEntity.getId())) {
installCount++;
}
}
}
if (doneCount != 0) {
return context.getString(R.string.install);
} else if (installCount != 0) {
return context.getString(R.string.launch);
} else {
return context.getString(R.string.download);
}
}
/**
* 获取GameUpdateEntity(插件化)
*/
public static GameUpdateEntity getGameUpdateEntity(GameEntity gameEntity, ApkEntity apkEntity) {
GameUpdateEntity gameUpdateEntity = new GameUpdateEntity();
gameUpdateEntity.setId(gameEntity.getId());
gameUpdateEntity.setIcon(gameEntity.getIcon());
gameUpdateEntity.setRawIcon(gameEntity.getRawIcon());
gameUpdateEntity.setIconSubscript(gameEntity.getIconSubscript());
gameUpdateEntity.setName(gameEntity.getName());
gameUpdateEntity.setPackageName(apkEntity.getPackageName());
gameUpdateEntity.setSize(apkEntity.getSize());
@ -150,7 +199,51 @@ public class GameUtils {
gameUpdateEntity.setPlugin(apkEntity.getPlugin());
gameUpdateEntity.setDownload(gameEntity.getDownload());
gameUpdateEntity.setIndexPlugin(gameEntity.getIndexPlugin());
gameUpdateEntity.setPluginDesc(gameEntity.getPluginDesc());
gameUpdateEntity.setFormat(apkEntity.getFormat());
GameCollectionEntity pluggableCollection = getPluggableCollectionFromGameEntity(gameEntity, apkEntity.getPackageName());
if (pluggableCollection != null) {
gameUpdateEntity.setPluggableCollection(pluggableCollection);
}
return gameUpdateEntity;
}
@Nullable
public static GameCollectionEntity getPluggableCollectionFromGameEntity(GameEntity gameEntity, String targetPkg) {
// 添加插件化包所在的合集
for (GameCollectionEntity collectionEntity : gameEntity.getCollection()) {
if (collectionEntity.getPackages().contains(targetPkg)) {
ArrayList<ApkEntity> saveApkEntity = new ArrayList<>();
for (String pkg : collectionEntity.getPackages()) {
for (ApkEntity apk : gameEntity.getApk()) {
if (pkg.equals(apk.getPackageName())) {
saveApkEntity.add(apk);
break;
}
}
}
ArrayList<ApkLink> apkLinks = gameEntity.getApkLink();
if (apkLinks != null) {
for (ApkLink apkLink : apkLinks) {
if (apkLink.getCollection().equals(collectionEntity.getId())) {
ApkEntity element = new ApkEntity();
element.setApkLink(apkLink);
if (saveApkEntity.size() > apkLink.getSort()) {
saveApkEntity.add(apkLink.getSort(), element);
} else {
saveApkEntity.add(element);
}
}
}
}
collectionEntity.setSaveApkEntity(saveApkEntity);
return collectionEntity;
}
}
return null;
}
}

View File

@ -10,6 +10,9 @@ import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.gh.common.view.DrawableView;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.TagStyleEntity;
@ -21,8 +24,6 @@ import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import androidx.core.content.ContextCompat;
/**
* @author 温冠超
* @email 294299195@qq.com
@ -32,21 +33,17 @@ import androidx.core.content.ContextCompat;
*/
public class GameViewUtils {
public static void setLabelList(Context context, LinearLayout labelLayout, List<String> tag, String tagType, List<TagStyleEntity> tagStyle) {
public static void setLabelList(Context context, LinearLayout labelLayout, List<TagStyleEntity> tagStyle) {
labelLayout.removeAllViews();
if (tag == null || tag.isEmpty()) {
labelLayout.addView(getGameTagView(context, "官方版", 0, tagType, null));
if (tagStyle == null || tagStyle.isEmpty()) {
// 没有数据的话默认不显示
// TagStyleEntity tagEntity = new TagStyleEntity();
// tagEntity.setName("官方版");
// labelLayout.addView(getNewGameTagView(context, tagEntity, 0));
} else {
for (int i = 0, size = tag.size(); i < size; i++) {
View view;
if (i == size - 1) {
view = getGameTagView(context, tag.get(i), 0, tagType, tagStyle.size() > i ? tagStyle.get(i) : null);
} else {
view = getGameTagView(context, tag.get(i), DisplayUtils.dip2px(context, 8), tagType, tagStyle.size() > i ? tagStyle.get(i) : null);
}
if (view != null) {
labelLayout.addView(view);
}
for (int i = 0, size = tagStyle.size(); i < size; i++) {
View view = getNewGameTagView(context, tagStyle.get(i), i == size - 1 ? 0 : DisplayUtils.dip2px(context, 8));
labelLayout.addView(view);
if (labelLayout.getChildCount() == 3) {
break;
}
@ -76,6 +73,32 @@ public class GameViewUtils {
}
}
// 新的游戏标签样式 version>=4.0.0
private static TextView getNewGameTagView(Context context, TagStyleEntity tagEntity, int rightMargin) {
// 参数不全,用旧样式实现
if (TextUtils.isEmpty(tagEntity.getBackground())) {
return getGameTagView(context, tagEntity.getName(), rightMargin, "type", tagEntity);
}
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lparams.rightMargin = rightMargin;
TextView tag = new TextView(context);
tag.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
tag.setSingleLine(true);
tag.setText(tagEntity.getName());
tag.setLayoutParams(lparams);
tag.setPadding(
DisplayUtils.dip2px(context, 4),
0,
DisplayUtils.dip2px(context, 4),
DisplayUtils.dip2px(context, 1));
tag.setTextColor(Color.parseColor("#" + tagEntity.getColor()));
tag.setBackground(DrawableView.getServerDrawable(Color.parseColor("#" + tagEntity.getBackground())));
return tag;
}
private static TextView getGameTagView(Context context, String tagStr, int rightMargin, String tagType, TagStyleEntity tagEntity) {
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

View File

@ -1,6 +1,7 @@
package com.gh.common.util
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import org.json.JSONArray
@ -10,6 +11,7 @@ import org.json.JSONArray
*/
object GsonUtils {
val gson: Gson = Gson()
val gsonThatIgnoreNull: Gson = GsonBuilder().serializeNulls().create()
@JvmStatic
fun <T> fromJson(json: String, t: Class<T>): T {
@ -22,8 +24,19 @@ object GsonUtils {
return gson.fromJson(json.toString(), type)
}
@JvmStatic
fun <T> fromJsonList(json: String): List<T> {
val type = object : TypeToken<List<T>>() {}.type
return gson.fromJson(json, type)
}
@JvmStatic
fun toJson(any: Any?): String {
return gson.toJson(any)
}
@JvmStatic
fun toJsonIgnoreNull(any: Any?): String {
return gsonThatIgnoreNull.toJson(any)
}
}

View File

@ -0,0 +1,50 @@
package com.gh.common.util
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.HomePluggableFilterEntity
import com.gh.gamecenter.room.AppDatabase
import com.halo.assistant.HaloApp
object HomePluggableHelper {
private val mHomePluggableFilterDao = AppDatabase.getInstance(HaloApp.getInstance().application).homePluggableFilterDao()
@JvmStatic
fun setHomePluggableFilterData(gameEntity: GameEntity, isNever: Boolean) {
val apkList = gameEntity.getApk()
if (apkList.isNotEmpty()) {
val apk = apkList.first()
val tag = if (isNever) "never" else apk.version ?: ""
mHomePluggableFilterDao.addData(HomePluggableFilterEntity(pkgName = apk.packageName, tag = tag, active = isNever))
}
}
@JvmStatic
fun showHomePluggable(gameEntity: GameEntity): Boolean {
val apkList = gameEntity.getApk()
if (apkList.isNotEmpty()) {
val apk = apkList.first()
val filterData = mHomePluggableFilterDao.getDataByPkgName(apk.packageName)
if (filterData?.active == true) {
val filterTag = filterData.tag
return filterTag != "never" && apk.version != filterTag
}
}
return true
}
@JvmStatic
fun getPermanentInactivePluggablePackage() = mHomePluggableFilterDao.getDataByTag("never")
@JvmStatic
fun activationFilterData() {
val filterList = mHomePluggableFilterDao.getDataByActive(false)
if (filterList != null) {
for (entity in filterList) {
entity.active = true
}
mHomePluggableFilterDao.addData(filterList)
}
}
}

View File

@ -1,5 +1,6 @@
package com.gh.common.util
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.Resources
import android.graphics.Bitmap
@ -9,19 +10,21 @@ import android.net.Uri
import android.os.Build
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import com.facebook.common.executors.CallerThreadExecutor
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.controller.BaseControllerListener
import com.facebook.drawee.controller.ControllerListener
import com.facebook.drawee.drawable.ScalingUtils
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder
import com.facebook.drawee.view.SimpleDraweeView
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber
import com.facebook.imagepipeline.image.ImageInfo
import com.facebook.imagepipeline.request.ImageRequest
import com.facebook.imagepipeline.request.ImageRequestBuilder
import com.gh.common.constant.Config
import com.gh.gamecenter.R
import com.halo.assistant.HaloApp
import com.squareup.picasso.Picasso
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import java.io.ByteArrayOutputStream
@ -214,17 +217,21 @@ object ImageUtils {
.build()
}
// 获取bitmap
// 获取bitmap (使用 fresco 获取 gif bitmap 会为空https://github.com/facebook/fresco/issues/241)
// 所以这里换用 picasso
@SuppressLint("CheckResult")
@JvmStatic
fun display(context: Context?, url: String?, dataSubscriber: BaseBitmapDataSubscriber) {
val imageRequest = ImageRequestBuilder
.newBuilderWithSource(Uri.parse(url))
.setProgressiveRenderingEnabled(true)
.build()
Fresco.getImagePipeline()
.fetchDecodedImage(imageRequest, context)
.subscribe(dataSubscriber, CallerThreadExecutor.getInstance())
fun getBitmap(url: String, callback: BiCallback<Bitmap, Boolean>) {
Single.just(url)
.map { Picasso.with(HaloApp.getInstance().application).load(url).priority(Picasso.Priority.HIGH).get() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
callback.onFirst(it)
}, {
callback.onSecond(true)
it.printStackTrace()
})
}
/**
@ -323,8 +330,19 @@ object ImageUtils {
draweeView.setImageURI("res:///" + res)
}
//预加载图片
@JvmStatic
fun prefetchToDiskCache(url: String) {
val imagePipeline = Fresco.getImagePipeline()
val imageRequest = ImageRequest.fromUri(url)
imagePipeline.prefetchToDiskCache(imageRequest, HaloApp.getInstance().application)
}
public interface OnImageloadListener {
fun onLoadFinal(imageInfo: ImageInfo?)
}
fun getVideoSnapshot(videoUrl: String, progress: Long): String {
return "$videoUrl?x-oss-process=video/snapshot,t_$progress,f_jpg,w_0,h_0"
}
}

View File

@ -67,8 +67,8 @@ public class InstallUtils {
String installVersion = PackageUtils.getVersionByPackage(packageName);
if (!TextUtils.isEmpty(installVersion) && downloadEntity != null &&
installVersion.equals(downloadEntity.getVersionName())) {
if (!downloadEntity.isPluggable() || PackageUtils.isSignature(context, packageName)) {
EventBus.getDefault().post(new EBPackage("安装", packageName));
if (!downloadEntity.isPluggable() || PackageUtils.isSignedByGh(context, packageName)) {
EventBus.getDefault().post(new EBPackage("安装", packageName, installVersion));
}
}
}
@ -85,7 +85,7 @@ public class InstallUtils {
keys.add(packageName);
} else if (!list.contains(packageName)) {
keys.add(packageName);
EventBus.getDefault().post(new EBPackage("卸载", packageName));
EventBus.getDefault().post(new EBPackage("卸载", packageName, ""));
}
}
for (String key : keys) {

View File

@ -11,8 +11,6 @@ import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.LibaoDetailAdapter;
@ -37,6 +35,7 @@ import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import androidx.core.content.ContextCompat;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
@ -151,76 +150,76 @@ public class LibaoUtils {
});
}
public static void setLiBaoBtnStatus(final TextView libaoBtn, String status, Context context) {
public static void setLiBaoBtnStatusRound(final TextView libaoBtn, String status, Context context) {
libaoBtn.setTextColor(Color.WHITE);
if (TextUtils.isEmpty(status)) return;
switch (status) {
case "ling":
libaoBtn.setText(R.string.libao_ling);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style);
break;
case "tao":
libaoBtn.setText(R.string.libao_tao);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style);
break;
case "coming":
libaoBtn.setText(R.string.libao_coming);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
break;
case "used_up":
libaoBtn.setText(R.string.libao_used_up);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
break;
case "finish":
libaoBtn.setText(R.string.libao_finish);
libaoBtn.setBackgroundResource(R.drawable.button_border_gray);
libaoBtn.setBackgroundResource(R.drawable.button_border_round_gray);
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
break;
case "linged":
libaoBtn.setText(R.string.libao_linged);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
break;
case "taoed":
libaoBtn.setText(R.string.libao_taoed);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
break;
case "copy":
libaoBtn.setText(R.string.libao_copy);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style);
break;
case "repeatLing":
libaoBtn.setText(R.string.libao_repeat_ling);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
break;
case "repeatLinged":
libaoBtn.setText(R.string.libao_repeat_ling);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style);
break;
case "repeatTao":
libaoBtn.setText(R.string.libao_repeat_tao);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
break;
case "repeatTaoed":
libaoBtn.setText(R.string.libao_repeat_tao);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style);
break;
case "unshelve":
libaoBtn.setBackgroundResource(R.drawable.button_border_gray);
libaoBtn.setBackgroundResource(R.drawable.button_border_round_gray);
libaoBtn.setText(R.string.libao_unshelve);
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
break;
case "check":
libaoBtn.setText(R.string.libao_check);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style);
break;
default:
libaoBtn.setBackgroundResource(R.drawable.button_border_gray);
libaoBtn.setBackgroundResource(R.drawable.button_border_round_gray);
libaoBtn.setText("异常");
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
break;
@ -230,7 +229,7 @@ public class LibaoUtils {
public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity,
final boolean isInstallRequired, final LibaoDetailAdapter adapter, final String entrance) {
String status = libaoEntity.getStatus();
setLiBaoBtnStatus(libaoBtn, status, context);
setLiBaoBtnStatusRound(libaoBtn, status, context);
libaoBtn.setOnClickListener(v -> {
String btnStatus = libaoBtn.getText().toString();

View File

@ -6,12 +6,16 @@ import android.os.Build;
import android.provider.Settings;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.gh.common.constant.Constants;
import com.gh.common.exposure.ExposureEntity;
import com.gh.common.exposure.ExposureEvent;
import com.gh.common.exposure.ExposureSource;
import com.gh.common.exposure.meta.Meta;
import com.gh.common.exposure.meta.MetaUtil;
import com.gh.common.loghub.LoghubUtils;
import com.gh.download.DownloadDataHelper;
import com.gh.common.loghub.SimpleLogContainerEntity;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.entity.CommunityEntity;
import com.gh.gamecenter.entity.GameEntity;
@ -19,7 +23,6 @@ import com.gh.gamecenter.entity.SpecialColumn;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.qa.entity.Questions;
import com.halo.assistant.HaloApp;
import com.lightgame.download.DownloadEntity;
import com.lightgame.utils.Util_System_Phone_State;
import com.lightgame.utils.Utils;
@ -29,8 +32,6 @@ import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.Nullable;
/**
* Created by khy on 2/01/18.
*/
@ -53,55 +54,6 @@ public class LogUtils {
uploadVideoStreaming(object);
}
public static void uploadDownloadEvent(DownloadEntity downloadEntity) {
Context context = HaloApp.getInstance().getApplication();
Meta meta = MetaUtil.INSTANCE.getMeta();
JSONObject object = new JSONObject();
try {
object.put("event", DownloadDataHelper.getDownloadStatusAlias(downloadEntity));
object.put("msg", downloadEntity.getError());
object.put("status", downloadEntity.getStatus().getStatus());
// payload
JSONObject payloadObject = new JSONObject();
payloadObject.put("game_id", downloadEntity.getGameId());
payloadObject.put("gameName", downloadEntity.getName());
payloadObject.put("platform", downloadEntity.getPlatform());
payloadObject.put("package", downloadEntity.getPackageName());
payloadObject.put("filename", downloadEntity.getPath().substring(downloadEntity.getPath().lastIndexOf("/") + 1));
payloadObject.put("total_size", (downloadEntity.getSize() / 1024 / 1024));
payloadObject.put("completed_size", (downloadEntity.getProgress() / 1024 / 1024));
object.put("payload", payloadObject);
// meta
JSONObject metaObject = new JSONObject();
metaObject.put("android_id", meta.getAndroid_id());
metaObject.put("android_sdk", meta.getAndroid_sdk());
metaObject.put("android_version", meta.getAndroid_version());
metaObject.put("appVersion", meta.getAppVersion());
metaObject.put("channel", meta.getChannel());
metaObject.put("gid", meta.getGid());
metaObject.put("imei", meta.getImei());
metaObject.put("mac", meta.getMac());
metaObject.put("manufacturer", meta.getManufacturer());
metaObject.put("model", meta.getModel());
metaObject.put("network", DeviceUtils.getNetwork(context));
metaObject.put("os", meta.getOs());
metaObject.put("userId", meta.getUserId());
object.put("meta", metaObject);
object.put("timestamp", System.currentTimeMillis() / 1000);
} catch (Exception e) {
e.printStackTrace();
}
if (BuildConfig.DEBUG) {
Utils.log("LogUtils->" + object.toString());
}
LoghubUtils.log(object, "download_debug", false);
}
public static void uploadCommunityArticle(String tracers, String articleId, String articleTitle, int readTime, CommunityEntity community, SpecialColumn specialColumn) {
JSONObject object = new JSONObject();
try {
@ -283,7 +235,7 @@ public class LogUtils {
uploadToReservation(object);
}
private static void uploadToCommunity(JSONObject object) {
uploadToCommunity(object, false);
}
@ -419,4 +371,138 @@ public class LogUtils {
}
uploadVideoStreaming(object);
}
public static void uploadWelcomeDialog(String action, String dialogId, String linkTitle) {
ExposureEntity payload = new ExposureEntity();
payload.setWelcomeDialogId(dialogId);
payload.setWelcomeDialogId(linkTitle);
SimpleLogContainerEntity entity = new SimpleLogContainerEntity();
entity.setEvent("dialog");
entity.setAction(action);
entity.setMeta(MetaUtil.INSTANCE.getMeta());
entity.setPayload(payload);
entity.setTimestamp(System.currentTimeMillis() / 1000);
LoghubUtils.log(GsonUtils.toJsonIgnoreNull(entity), "event", false);
}
public static void uploadLikeFromWelcomeDialog() {
String dialogId = (String) HaloApp.get(Constants.WELCOME_DIALOG_ID, false);
String linkTitle = (String) HaloApp.get(Constants.WELCOME_DIALOG_LINK_TITLE, false);
ExposureEntity payload = new ExposureEntity();
payload.setWelcomeDialogId(dialogId);
payload.setWelcomeDialogLinkTitle(linkTitle);
SimpleLogContainerEntity entity = new SimpleLogContainerEntity();
entity.setEvent("like");
entity.setMeta(MetaUtil.INSTANCE.getMeta());
entity.setPayload(payload);
entity.setTimestamp(System.currentTimeMillis() / 1000);
LoghubUtils.log(GsonUtils.toJsonIgnoreNull(entity), "event", false);
}
public static void uploadCommentFromWelcomeDialog() {
String dialogId = (String) HaloApp.get(Constants.WELCOME_DIALOG_ID, false);
String linkTitle = (String) HaloApp.get(Constants.WELCOME_DIALOG_LINK_TITLE, false);
ExposureEntity payload = new ExposureEntity();
payload.setWelcomeDialogId(dialogId);
payload.setWelcomeDialogLinkTitle(linkTitle);
SimpleLogContainerEntity entity = new SimpleLogContainerEntity();
entity.setEvent("comment");
entity.setMeta(MetaUtil.INSTANCE.getMeta());
entity.setPayload(payload);
entity.setTimestamp(System.currentTimeMillis() / 1000);
LoghubUtils.log(GsonUtils.toJsonIgnoreNull(entity), "event", false);
}
private static void uploadShare(JSONObject object) {
Meta meta = MetaUtil.INSTANCE.getMeta();
JSONObject metaObject = new JSONObject();
try {
metaObject.put("android_id", meta.getAndroid_id());
metaObject.put("android_sdk", meta.getAndroid_sdk());
metaObject.put("android_version", meta.getAndroid_version());
metaObject.put("appVersion", meta.getAppVersion());
metaObject.put("channel", meta.getChannel());
metaObject.put("gid", meta.getGid());
metaObject.put("imei", meta.getImei());
metaObject.put("mac", meta.getMac());
metaObject.put("manufacturer", meta.getManufacturer());
metaObject.put("model", meta.getModel());
metaObject.put("network", meta.getNetwork());
metaObject.put("os", meta.getOs());
metaObject.put("userId", meta.getUserId());
object.put("event", "SHARE");
object.put("meta", metaObject);
object.put("timestamp", System.currentTimeMillis() / 1000);
} catch (JSONException e) {
e.printStackTrace();
}
if (BuildConfig.DEBUG) {
Utils.log("LogUtils->" + object.toString());
}
LoghubUtils.log(object, "event", false);
}
public static void uploadShareEnter(String entrance, String url, String title, String summary, String resourceId) {
JSONObject object = new JSONObject();
JSONObject payloadObject = new JSONObject();
try {
object.put("action", "entrance_source");
payloadObject.put("entrance", entrance);
payloadObject.put("url", url);
payloadObject.put("title", title);
payloadObject.put("summary", summary);
payloadObject.put("resource_id", resourceId);
object.put("payload", payloadObject);
} catch (JSONException e) {
e.printStackTrace();
}
uploadShare(object);
}
public static void uploadShareType(String shareType, String entrance, String url, String title, String summary, String resourceId) {
JSONObject object = new JSONObject();
JSONObject payloadObject = new JSONObject();
try {
object.put("action", "share_type");
payloadObject.put("share_type", shareType);
payloadObject.put("entrance", entrance);
payloadObject.put("url", url);
payloadObject.put("title", title);
payloadObject.put("summary", summary);
payloadObject.put("resource_id", resourceId);
object.put("payload", payloadObject);
} catch (JSONException e) {
e.printStackTrace();
}
uploadShare(object);
}
public static void uploadShareResult(String shareType, String entrance, String shareResult, String url, String title, String summary, String resourceId) {
JSONObject object = new JSONObject();
JSONObject payloadObject = new JSONObject();
try {
object.put("action", "share_result");
payloadObject.put("share_type", shareType);
payloadObject.put("entrance", entrance);
payloadObject.put("share_result", shareResult);
payloadObject.put("url", url);
payloadObject.put("title", title);
payloadObject.put("summary", summary);
payloadObject.put("resource_id", resourceId);
object.put("payload", payloadObject);
} catch (JSONException e) {
e.printStackTrace();
}
uploadShare(object);
}
}

View File

@ -23,7 +23,7 @@ import com.tencent.tauth.Tencent
import com.tencent.tauth.UiError
import org.json.JSONException
import org.json.JSONObject
import java.lang.ref.WeakReference
/**
* 第三方登录辅助类
@ -37,12 +37,12 @@ object LoginHelper {
private var mTencent: Tencent // QQ
private var mIWXAPI: IWXAPI // 微信
private var mSsoHandler: SsoHandler? = null // 微博 // TODO 完成回调时清掉这个 handler
private var mSsoHandler: WeakReference<SsoHandler>? = null // 微博
private var mQqLoginListener: IUiListener
private var mAccessToken: Oauth2AccessToken? = null // weibo
private var mLoginCallback: LoginCallback? = null
private var mLoginCallback: WeakReference<LoginCallback>? = null
init {
val context = HaloApp.getInstance().application.applicationContext
@ -64,11 +64,11 @@ object LoginHelper {
content.put("access_token_expire", Utils.getTime(context) + o.getLong("expires_in"))
content.put("access_token", o.getString("access_token"))
mLoginCallback?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功
mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功
} catch (e: JSONException) {
val errorString = "QQ登录数据回调异常$e"
mLoginCallback?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败
Utils.log(errorString)
e.printStackTrace()
@ -77,12 +77,12 @@ object LoginHelper {
}
override fun onCancel() {
mLoginCallback?.onLoginFailure(LoginTag.qq,"登录取消")
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录取消")
Utils.log("QQ 登录取消")
}
override fun onError(p0: UiError?) {
mLoginCallback?.onLoginFailure(LoginTag.qq,"登录失败")
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录失败")
Utils.log("QQ 登录失败")
}
}
@ -99,23 +99,23 @@ object LoginHelper {
@JvmStatic
fun onWechatLoginSuccess(content: JSONObject) {
mLoginCallback?.onLoginSuccess(LoginTag.wechat, content)
mLoginCallback?.get()?.onLoginSuccess(LoginTag.wechat, content)
}
@JvmStatic
fun onWechatLoginFailure(error: String) {
mLoginCallback?.onLoginFailure(LoginTag.wechat, error)
mLoginCallback?.get()?.onLoginFailure(LoginTag.wechat, error)
}
@JvmStatic
fun onWeiboLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) {
mSsoHandler?.authorizeCallBack(requestCode, resultCode, data)
mSsoHandler?.get()?.authorizeCallBack(requestCode, resultCode, data)
}
// QQ登录
@JvmStatic
fun loginWithQQ(loginCallback: LoginCallback, activity: Activity) {
mLoginCallback = loginCallback
mLoginCallback = WeakReference(loginCallback)
if (!mTencent.isSessionValid) {
Utils.log("QQLogin")
mTencent.login(activity, "all", mQqLoginListener)
@ -132,7 +132,7 @@ object LoginHelper {
// 微信登录
@JvmStatic
fun loginWithWechat(loginCallback: LoginCallback) {
mLoginCallback = loginCallback
mLoginCallback = WeakReference(loginCallback)
val register = mIWXAPI.registerApp(Config.WECHAT_APPID)
val req = SendAuth.Req()
@ -149,9 +149,9 @@ object LoginHelper {
// 微博登录
@JvmStatic
fun loginWithWeibo(loginCallback: LoginCallback, context: Activity) {
mLoginCallback = loginCallback
mSsoHandler = SsoHandler(context)
mSsoHandler?.authorizeClientSso(object : WbAuthListener {
mLoginCallback = WeakReference(loginCallback)
mSsoHandler = WeakReference(SsoHandler(context))
mSsoHandler?.get()?.authorizeClientSso(object : WbAuthListener {
override fun onSuccess(token: Oauth2AccessToken?) {
token?.let {
RuntimeUtils.getInstance().runOnUiThread {
@ -159,7 +159,7 @@ object LoginHelper {
if (mAccessToken?.isSessionValid == true) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(context, mAccessToken)
Toast.makeText(context, "授权成功", Toast.LENGTH_SHORT).show()
Utils.toast(context, "授权成功")
}
}
@ -170,17 +170,17 @@ object LoginHelper {
content.put("access_token_expire", Utils.getTime(context) + token.expiresTime)
content.put("refresh_token", token.refreshToken)
// content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天
mLoginCallback?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调
mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调
}
}
}
override fun onFailure(p0: WbConnectErrorMessage?) {
mLoginCallback?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博")
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博")
}
override fun cancel() {
mLoginCallback?.onLoginFailure(LoginTag.weibo, "取消授权")
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权")
}
})
// 第一次启动本应用AccessToken 不可用

View File

@ -55,6 +55,7 @@ public class LoginUtils {
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
listener.onCaptcha(null);
if (e == null) {
Utils.toast(context, "无法获取验证码,请检查你的网络状态");
return;

View File

@ -1,6 +1,13 @@
package com.gh.common.util;
import android.text.TextUtils;
import com.lightgame.utils.Utils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
@ -75,4 +82,61 @@ public class MD5Utils {
return bigInt.toString(16);
}
public static boolean checkMD5(String md5, File updateFile) {
if (TextUtils.isEmpty(md5) || updateFile == null) {
Utils.log("MD5 string empty or updateFile null");
return false;
}
String calculatedDigest = calculateMD5(updateFile);
if (calculatedDigest == null) {
Utils.log("calculatedDigest null");
return false;
}
Utils.log("Calculated digest: " + calculatedDigest);
Utils.log("Provided digest: " + md5);
return calculatedDigest.equalsIgnoreCase(md5);
}
public static String calculateMD5(File updateFile) {
MessageDigest digest;
try {
digest = MessageDigest.getInstance("MD5");
} catch (Exception e) {
Utils.log("Exception while getting digest", e);
return null;
}
InputStream is;
try {
is = new FileInputStream(updateFile);
} catch (Exception e) {
Utils.log("Exception while getting FileInputStream", e);
return null;
}
byte[] buffer = new byte[8192];
int read;
try {
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String output = bigInt.toString(16);
// Fill to 32 chars
output = String.format("%32s", output).replace(' ', '0');
return output;
} catch (Exception e) {
throw new RuntimeException("Unable to process file for MD5", e);
} finally {
try {
is.close();
} catch (Exception e) {
Utils.log("Exception on closing MD5 input stream", e);
}
}
}
}

View File

@ -146,6 +146,8 @@ public class NetworkUtils {
return "3G";
case TelephonyManager.NETWORK_TYPE_LTE:
return "4G";
case 20://暂未适配AndroidQ这里粗暴设置为20
return "5G";
default:
return "unknown";
}

View File

@ -4,6 +4,8 @@ import android.content.Context;
import android.graphics.Color;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.retrofit.Response;
@ -11,6 +13,7 @@ import com.gh.gamecenter.retrofit.RetrofitManager;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
@ -46,7 +49,7 @@ public class NewsUtils {
* 统计阅读量
*/
public static void statNewsViews(Context context, String news_id) {
RetrofitManager.getInstance(context).getData().postNewsViews(news_id)
RetrofitManager.getInstance(context).getApi().postArticleVisit(news_id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>());
@ -77,7 +80,7 @@ public class NewsUtils {
/**
* 设置新闻类型
*/
public static void setNewsType(TextView textView, String type, int priority, int position) {
public static void setNewsType(TextView textView, @Nullable String type, int priority, int position) {
if (priority != 0) {
if (position == 0) {
textView.setText(R.string.article_top);
@ -91,7 +94,7 @@ public class NewsUtils {
}
textView.setTextColor(Color.WHITE);
switch (type) {
switch (type != null ? type : "") {
case "活动":
textView.setBackgroundResource(R.drawable.textview_orange_style);
break;
@ -117,64 +120,23 @@ public class NewsUtils {
* 设置新闻发布时间
*/
public static void setNewsPublishOn(TextView textView, long time) {
time = time * 1000;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
long today = format.parse(format.format(new Date())).getTime();
if (time >= today && time < today + 86400 * 1000) {
format.applyPattern("HH:mm");
textView.setText(format.format(time));
} else if (time >= today - 86400 * 1000 && time < today) {
format.applyPattern("HH:mm");
textView.setText(String.format("昨天 %s", format.format(time)));
} else {
format.applyPattern("yyyy年MM月dd日 HH:mm");
textView.setText(format.format(time));
}
} catch (ParseException e) {
e.printStackTrace();
format.applyPattern("yyyy年MM月dd日 HH:mm");
textView.setText(format.format(time));
}
CommentUtils.setCommentTime(textView, time);
}
public static void setNewsDetailTime(TextView textView, long time) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
long today = format.parse(format.format(new Date())).getTime();
long day = time * 1000;
if (day >= today && day < today + 86400 * 1000) {
long min = new Date().getTime() / 1000 - day / 1000;
int hour = (int) (min / (60 * 60));
if (hour == 0) {
if (min < 60) {
textView.setText("刚刚");
} else {
textView.setText(String.format(Locale.getDefault(), "%d分钟前", (int) (min / 60)));
}
} else {
textView.setText(String.format(Locale.getDefault(), "%d小时前", hour));
}
} else if (day >= today - 86400 * 1000 * 100 && day < today) {
format.applyPattern("HH:mm");
textView.setText("昨天 ");
} else {
format.applyPattern("yyyy-MM-dd");
textView.setText(format.format(day));
}
} catch (ParseException e) {
e.printStackTrace();
format.applyPattern("yyyy-MM-dd");
textView.setText(format.format(time * 1000));
}
CommentUtils.setCommentTime(textView, time);
}
public static String getFormattedTime(long time) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
long today = format.parse(format.format(new Date())).getTime();
long day = time * 1000;
String year = String.valueOf(Calendar.getInstance().get(Calendar.YEAR));
format.applyPattern("yyyy");
String currentYear = format.format(day);
format.applyPattern("yyyyMMdd");
long today = format.parse(format.format(new Date())).getTime();
if (day >= today && day < today + 86400 * 1000) {
long min = new Date().getTime() / 1000 - day / 1000;
int hour = (int) (min / (60 * 60));
@ -190,6 +152,13 @@ public class NewsUtils {
} else if (day >= today - 86400 * 1000 && day < today) {
format.applyPattern("HH:mm");
return ("昨天 ");
} else if (day >= today - 86400 * 1000 * 7 && day < today - 86400 * 1000) {
format.applyPattern("HH:mm");
long days = (today - day) / 86400000 + 1;
return String.format(Locale.getDefault(), "%d天前 ", days);
} else if (day < today - 86400 * 1000 * 7 && year.equals(currentYear)) {
format.applyPattern("MM-dd");
return (format.format(day));
} else {
format.applyPattern("yyyy-MM-dd");
return (format.format(day));

View File

@ -96,7 +96,7 @@ object NotificationHelper {
}
@SuppressLint("CheckResult")
private fun show(activity: AppCompatActivity?) {
fun show(activity: AppCompatActivity?) {
if (activity == null) return
RetrofitManager.getInstance(activity).api.bootPopup
.subscribeOn(Schedulers.io())

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