Compare commits

..

1527 Commits

Author SHA1 Message Date
4727f22b0f tinker_base-4.0.1 2020-06-05 10:05:57 +08:00
a3d693ddc1 更改自定义栏目浮窗消失逻辑 https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/878 2020-06-03 17:25:03 +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
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
82a859e820 tinker-base-3.7.4-bugfix 2020-03-24 10:40:08 +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
c7db58f6ea 处理一些闪退异常 2020-03-23 15:18:27 +08:00
79ff887375 修复一些闪退问题 2020-03-23 13:35:46 +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
4f68f30576 修复玩过的游戏统计异常 2020-03-23 11:27:37 +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
0683a579c0 tinker_base 3.7.4 2020-03-18 19:21:45 +08:00
f1194d434b 帮助与反馈拼接标题 2020-03-18 18:21:10 +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
59e80970ae tinker_base 3.7.4 2020-03-18 14:36:31 +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
92a0d77885 光环助手V3.7.4-测试问题汇总(20200311-1900)10 https://gitlab.ghzs.com/pm/halo-app-issues/issues/797 2020-03-17 16:07:35 +08:00
1bc0b0e085 tinker_base 3.7.4 2020-03-17 09:57:08 +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
a5129c809b 完成复刻工具箱礼包码跳转游戏详情礼包项的需求 https://gitlab.ghzs.com/pm/halo-app-issues/issues/807 2020-03-16 21:12:40 +08:00
3e8e5572d2 修复未登录状态下游戏详情动态 tab 的礼包不显示领取按钮的问题 2020-03-16 21:06:26 +08:00
faef2a5e4d 使用帮助Web页面避免缩放 2020-03-16 18:18:01 +08:00
3d88792d11 视频流广告banner 2020-03-16 16:54:46 +08:00
862b66f8e7 回退启动页更改(在全屏下拉伸比较严重,无奈~) 2020-03-16 15:25:32 +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
15fad5635b 避免原因未知的闪退 2020-03-13 19:04:00 +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
bddde8c851 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-12 16:28:06 +08:00
b589c38eea 尝试修复启动图适配问题 2020-03-12 16:27:47 +08:00
5c3cdf227e 解决第一次滑动视频闪退 2020-03-12 16:27:29 +08:00
838b775a3e 光环助手V3.7.4-测试问题汇总(20200311-1900)3,4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/797 2020-03-12 15:52:19 +08:00
c87bf1e613 update 2020-03-12 14:19:45 +08:00
81dc17530f update 2020-03-11 17:56:10 +08:00
7af2b7c2d7 api版本改为3.7.4
修改社区问题的点击效果
2020-03-11 17:33:49 +08:00
b53f769a0d update 2020-03-11 17:22:44 +08:00
f78570ce80 答案/文章富文本编辑框添加meta避免缩放 2020-03-11 15:56:27 +08:00
071376267a 修复点击动态页进入问答的闪退问题 2020-03-11 15:55:04 +08:00
51c3d25f3a 调整 Entity 命名 2020-03-11 11:44:20 +08:00
cc6c31027a 修复进入已关注游戏的游戏详情不会自动切换到动态tab的问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/783 2020-03-11 11:24:54 +08:00
f3b91b63ec 完成游戏详情加载优化(将接口分为用户相关和用户不相关两部分) https://gitlab.ghzs.com/pm/halo-app-issues/issues/783 2020-03-10 21:30:36 +08:00
aadd2071b9 update 2020-03-10 18:16:44 +08:00
fc7566d2c9 整理并更新版本依赖 2020-03-10 17:56:53 +08:00
48b8c0d23e 去掉无用的 ijk so 减小应用体积 2020-03-10 14:23:52 +08:00
c56826b29d Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-10 13:53:25 +08:00
28ec3ef5dc 全局拦截参数缺失的非法请求 2020-03-10 13:53:09 +08:00
7f082b7a36 update 2020-03-10 10:27:51 +08:00
c3b8538ac3 修复在部分老旧设备上 webview 标题回调异常的问题 2020-03-09 17:48:00 +08:00
f04b1c4300 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-09 16:46:41 +08:00
1d7c8b894f 社区回答/文章编辑,插入回答-收藏回答去除修改红点提示 2020-03-09 16:46:29 +08:00
afd1232cea Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-09 15:59:03 +08:00
2b141e79cd 修改会刷到重复视频问题 2020-03-09 15:58:30 +08:00
f6e452237a Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-03-09 15:08:18 +08:00
508dff3bae 尝试修复游戏库闪屏问题 2020-03-09 15:08:03 +08:00
1259199e2c 删除一些无用代码 2020-03-09 15:05:00 +08:00
85fc2dda02 更换首页安利墙和评分字体颜色 2020-03-09 10:36:44 +08:00
d57a6879fb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-07 10:58:18 +08:00
c0f32124ad 回退WebFragment的修改 2020-03-07 10:57:46 +08:00
b3a53f51b0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-06 18:25:55 +08:00
66175c7f20 光环助手V4.0-测试问题汇总(20200304-1900)UI测试补充 https://gitlab.ghzs.com/pm/halo-app-issues/issues/796 2020-03-06 18:25:22 +08:00
dc698ca2cc 微调社区相关UI 2020-03-06 16:40:43 +08:00
6d8c703f33 再次调整视频双击点赞时间间隔 2020-03-06 16:15:22 +08:00
f32e6b60d1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-06 15:12:22 +08:00
f45d1ded17 光环助手V4.0-测试问题汇总(20200304-1900)5,11 https://gitlab.ghzs.com/pm/halo-app-issues/issues/796 2020-03-06 15:12:00 +08:00
da9eac4ecd 修复RichEditor个别机型插入自定义样式无法跳转问题 2020-03-06 15:07:34 +08:00
b58d52709f 光环助手V4.0-视频相关测试汇总(正式环境)19-23 https://gitlab.ghzs.com/pm/halo-app-issues/issues/794 2020-03-06 15:05:46 +08:00
3cde5cc39d 修复游戏搜索多次输入相同关键字时,只有首次触发的问题 2020-03-06 14:28:08 +08:00
50214e7461 修复首页可能出现的无响应问题(改了这个又不能防止抖动了)
社区问答/文章发表评论对接关闭评论和隐藏状态
 修改社区评论/资讯评论可以回复自己的BUG
2020-03-06 12:02:23 +08:00
dc0994d084 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-03-05 19:46:00 +08:00
f79a45e533 光环助手V4.0-测试问题汇总(20200304-1900)(14.16) https://gitlab.ghzs.com/pm/halo-app-issues/issues/796 2020-03-05 19:45:14 +08:00
b704e47322 光环助手V4.0-测试问题汇总(20200304-1900)完成4,7,8,9 https://gitlab.ghzs.com/pm/halo-app-issues/issues/796 2020-03-05 17:47:35 +08:00
bebda2de70 update 2020-03-05 15:59:56 +08:00
dab9f850ba Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-05 15:41:58 +08:00
e7073bf010 修改视频流非Wifi弹窗只弹一次 2020-03-05 15:41:35 +08:00
c1ab9617ad Merge branch 'dev' of gitlab.ghzhushou.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-03-05 14:54:33 +08:00
c6d9026333 修改问题详情图标 2020-03-05 14:53:14 +08:00
42dae5c993 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-05 12:06:26 +08:00
a3af3dcf9b 调整视频双击点赞时间间隔 2020-03-05 12:05:59 +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
ba15462981 修复部分列表社区文章无法点赞问题 2020-03-05 11:33:29 +08:00
c29066eb46 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-05 11:07:30 +08:00
0464a859d2 尝试修复OnErrorNotImplementedException 2020-03-05 11:07:13 +08:00
962ff89833 避免原因未知的数组越界异常 2020-03-05 11:02:55 +08:00
74a40ebe97 在自动编译安装包的反馈闪退内容中添加编译时间帮助定位问题 2020-03-05 10:57:55 +08:00
686b454abe Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-05 10:32:03 +08:00
6d54ddea60 修复资讯文章评论后用户ID错误问题 2020-03-05 10:31:55 +08:00
d005403f65 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-04 18:19:27 +08:00
8e907f5221 恢复顶部视频非wifi不自动播放 2020-03-04 18:19:05 +08:00
96bb953d9d 更换部分图标 2020-03-04 18:15:22 +08:00
78b581b376 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-04 18:01:59 +08:00
ef7edb4a9e 社区回答/文章列表增加隐藏和关闭评论判断 2020-03-04 18:01:51 +08:00
4bf5ae40e2 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-04 16:44:32 +08:00
22ebdc0e87 添加卡顿检测BlockCanary 2020-03-04 16:44:19 +08:00
01bd1628cf 光环助手V4.0-视频相关测试汇总(正式环境)17,18 https://gitlab.ghzs.com/pm/halo-app-issues/issues/794 2020-03-04 16:39:18 +08:00
7de88bc8ad 修复下载流量提醒在某个别设备toast样式不同问题 2020-03-04 14:41:43 +08:00
1a01e2dd4d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-04 11:55:25 +08:00
9e20c7082a 回退关注问题/我的问题UI代码到v3.7.3 2020-03-04 11:55:15 +08:00
74cb2f253b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-04 11:25:08 +08:00
cf41d2e4a7 我的光环分组小红点添加描边 2020-03-04 11:24:44 +08:00
f232adaa98 修复隐私弹窗内容不居中问题 2020-03-04 11:18:21 +08:00
713af4bf12 修复首页横向专题刷新问题 2020-03-04 09:53:46 +08:00
f0f1906ffc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-03 18:21:19 +08:00
3da6444ede 光环助手V4.0-测试问题汇总(UI相关)https://gitlab.ghzs.com/pm/halo-app-issues/issues/795 2020-03-03 18:21:10 +08:00
f149c56617 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-03 17:44:02 +08:00
9915a18656 解决视频点赞动画点击边缘变小问题 2020-03-03 17:43:40 +08:00
2173e5a91c 光环助手V4.0-视频相关测试汇总(正式环境)13 https://gitlab.ghzs.com/pm/halo-app-issues/issues/794 2020-03-03 17:43:08 +08:00
4a6866d8fd 完成测试问题汇总(20200228-1930)的1(4) https://gitlab.ghzs.com/pm/halo-app-issues/issues/793 2020-03-03 16:11:10 +08:00
ddc324bcf1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-03 15:42:08 +08:00
daba7e0d12 完成光环助手V4.0-测试问题汇总(20200228-1930)14 https://gitlab.ghzs.com/pm/halo-app-issues/issues/793 2020-03-03 15:41:42 +08:00
6203b80c4e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-03 15:12:38 +08:00
416cbe7e82 光环助手V4.0-测试问题汇总(20200228-1930)(1(2),1(5),1(6),2,3,4,5,6,7,10,11,12) https://gitlab.ghzs.com/pm/halo-app-issues/issues/793 2020-03-03 15:12:30 +08:00
e28ce4d099 完成20200303补充11,12 https://gitlab.ghzs.com/pm/halo-app-issues/issues/794 2020-03-03 10:56:19 +08:00
d1f5ec6c2e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-02 18:31:49 +08:00
166f44bb1d 光环助手V4.0-视频相关测试汇总(正式环境)https://gitlab.ghzs.com/pm/halo-app-issues/issues/794 2020-03-02 18:31:30 +08:00
c8a0420b21 修改隐私弹窗UI 2020-03-02 18:31:09 +08:00
a8894cc464 init sync page data 2020-03-02 17:04:30 +08:00
a3d7d9cb81 处理视频滑动冲突 2020-03-02 15:13:27 +08:00
b6d49c88db Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-03-02 14:45:48 +08:00
8572f8eaf4 修改视频点赞效果 2020-03-02 14:45:07 +08:00
c533cd021f 社区回答/文章列表增加防抖操作 2020-02-28 19:00:40 +08:00
3eb1af7e23 修改社区回答/文章列表混合状态时点赞和评论异常问题 2020-02-28 18:40:24 +08:00
97188a7d9c Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-28 17:56:34 +08:00
e29ffa3d13 光环助手V4.0.0-问答社区优化汇总(2200226测试)
https://gitlab.ghzs.com/pm/halo-app-issues/issues/768
2020-02-28 17:56:16 +08:00
5b772a0537 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-28 16:52:23 +08:00
82a8888676 修改一些UI问题 2020-02-28 16:52:01 +08:00
bf8630756a 回退视频上传转码中相关代码 2020-02-28 16:24:37 +08:00
35fc381162 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-28 15:42:10 +08:00
f72342ac72 社区测试汇总 2020-02-28 15:42:04 +08:00
5a6e528c65 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-28 14:46:03 +08:00
4eb52c91a4 设备未安装“抖音”应用,直接打开网页 2020-02-28 14:45:41 +08:00
77bc1594aa 回答和文章列表增加取消点赞操作 2020-02-28 13:26:12 +08:00
23267ec0ee 回退关注问题/我的问题UI代码 2020-02-28 12:44:41 +08:00
1b1bd3264a Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-28 12:08:33 +08:00
b954c1f664 修复游戏库刷新替换抖动的问题 2020-02-28 12:08:21 +08:00
707beb9672 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-28 11:53:31 +08:00
b2f5a19bde 更换视频点赞动画 2020-02-28 11:52:56 +08:00
e24d7f1045 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-28 10:57:47 +08:00
142a64d261 修复上传视频修改封面图闪退问题
回答/文章列表点赞时检查登录状态
2020-02-28 10:57:29 +08:00
2ef98fd050 完成游戏详情加载优化的0228测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/783 2020-02-28 10:00:04 +08:00
2f3c387c16 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-27 18:16:10 +08:00
83b97a9de9 修复评论标签显示问题 2020-02-27 18:15:38 +08:00
97becbea2e 修改字体/色块颜色 2020-02-27 18:13:34 +08:00
8361609c70 merge change_theme_color into dev 2020-02-27 18:07:13 +08:00
eb7d871e70 修复收藏文章提交已读信息闪退问题 2020-02-27 16:24:22 +08:00
d06ab34db1 下载互斥弹窗逻辑修改 2020-02-27 16:18:42 +08:00
d59f604c7e Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-27 16:01:37 +08:00
a8d9bb9180 修改隐私弹窗 2020-02-27 16:01:27 +08:00
db90717617 双击点赞toast多次只显示一次 2020-02-27 15:50:03 +08:00
f916c7b8a5 修改游戏库刷新替换规则 2020-02-27 13:56:53 +08:00
4e410e3ea3 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-27 12:32:04 +08:00
5a5fb7a5cc 修改评论输入框UI 2020-02-27 12:31:22 +08:00
233a2172f1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-26 18:00:37 +08:00
6376973a61 修复线程池线程数量不够报错,改用newCachedThreadPool 2020-02-26 18:00:04 +08:00
5dd6d73603 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-26 17:54:12 +08:00
5918b35793 修改社区专题详情UI 2020-02-26 17:53:52 +08:00
10c3536b2b 修改问答专题徽章显示问题 2020-02-26 17:47:49 +08:00
fffef74480 完成光环前端优化汇总(2020年2月第1周)第2点的0226测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-26 17:36:14 +08:00
c5c2938089 修改App桌面图片 2020-02-26 17:24:58 +08:00
32fe28f536 社区文章/回答列表对接点赞数据 2020-02-26 16:43:27 +08:00
fc4a751b2b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-26 16:08:33 +08:00
e364b7d3b0 修改我的收藏-社区文章/回答UI 2020-02-26 16:08:13 +08:00
bc28e08b3f 处理在子线程调用ExoPlayer方法报错和限制预加载视频50M 2020-02-26 15:38:53 +08:00
69b8155dcd Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-26 13:30:02 +08:00
16254bb578 社区回答/文章相关列表增加多图显示 2020-02-26 13:29:50 +08:00
acc4a5b2aa 20200226补充:1,2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/769 2020-02-26 12:18:53 +08:00
fddce1ebe3 解决视频双击点赞点三次会触发单击事件 2020-02-26 11:13:25 +08:00
7151cba40e 修改上传配置 2020-02-25 18:36:50 +08:00
6cff45eada Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-25 18:10:41 +08:00
a05b4f7b65 全局修改评论相关样式(资讯文章/社区/视频) 2020-02-25 18:10:23 +08:00
e5797a41b7 游戏详情顶部声音问题 2020-02-25 16:51:00 +08:00
9f0191ce0a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-25 16:39:02 +08:00
68a5c472c0 标记我的收藏已读 2020-02-25 16:38:39 +08:00
6c7e6d95ce 删除一些无用资源 2020-02-25 16:31:36 +08:00
ec84bbb4f3 完成游戏详情加载优化 https://gitlab.ghzs.com/pm/halo-app-issues/issues/783 2020-02-25 15:38:02 +08:00
780a8649e3 完成光环前端优化汇总(2020年2月第1周)第2点的0225测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-25 15:33:34 +08:00
9aaaf2204a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-25 14:08:39 +08:00
c7f608b9cb 完成0225测试 第6点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-25 14:08:16 +08:00
591885095b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-25 13:18:00 +08:00
3bcdd37837 修改游戏搜索“找不到想要的游戏”悬浮窗的显示规则 2020-02-25 13:17:50 +08:00
959c5e4cf5 修改评论作者显示错误 2020-02-25 09:33:11 +08:00
7ecc8446ea Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-24 18:20:41 +08:00
d3809bb699 修改文案 2020-02-24 18:20:31 +08:00
d5113a52fc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-24 18:15:28 +08:00
e2dd868705 完成20200224测试补充 https://gitlab.ghzs.com/pm/halo-app-issues/issues/779 2020-02-24 18:15:05 +08:00
41ae5b9b6b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-24 18:11:07 +08:00
b0470b3a41 光环助手V4.0.0-插件版本下载互斥弹窗 https://gitlab.ghzs.com/pm/halo-app-issues/issues/788 2020-02-24 18:10:56 +08:00
d371ae9dc5 补充佩戴徽章的显示位置 https://gitlab.ghzs.com/pm/halo-app-issues/issues/778 2020-02-24 17:15:06 +08:00
00124a657d 完成光环前端优化汇总(2020年2月第1周)的第2点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-24 16:52:53 +08:00
620cec08eb Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-24 16:42:54 +08:00
b1205356c8 光环助手V4.0.0-版块(游戏库)优化:新增刷新按钮 https://gitlab.ghzs.com/pm/halo-app-issues/issues/784 2020-02-24 16:42:38 +08:00
e96d6829a4 处理徽章显示异常 2020-02-24 15:08:06 +08:00
0652da2300 完成游戏详情动态 tab 接口的合并 https://gitlab.ghzs.com/pm/halo-app-issues/issues/783 2020-02-22 17:44:08 +08:00
ebe3852132 正式环境接口切换到 4.0.0 2020-02-22 16:58:02 +08:00
1ae73277a9 更换桌面图标 2020-02-21 17:56:55 +08:00
97ec50f8a9 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-21 16:38:43 +08:00
1997a8b296 光环前端优化汇总(2020年2月第3周)(1.2.3.5.6) https://gitlab.ghzs.com/pm/halo-app-issues/issues/791 2020-02-21 16:38:25 +08:00
baae0e5bca 预加载视频封面图 2020-02-21 15:51:52 +08:00
4136bfab42 社区文章/回答列表增加点赞动画 2020-02-20 17:17:25 +08:00
3d64d3c90e 社区问题列表支持跳转至回答编辑页面 2020-02-20 15:59:25 +08:00
7d2835bb83 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-20 15:32:54 +08:00
9ffaa97d70 撰写回答页面问题标题增加收起功能 2020-02-20 15:32:29 +08:00
363751a970 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-20 14:27:42 +08:00
c7218d9c0d 视频点赞取消toast 2020-02-20 14:27:30 +08:00
e9387e29c6 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-20 13:33:59 +08:00
33b4d60882 视频管理后台增加压缩功能(6.7.9.10.11)https://gitlab.ghzs.com/pm/halo-app-issues/issues/785 2020-02-20 13:33:40 +08:00
86537b8f1e 光环前端优化汇总(2020年2月第3周)4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/791 2020-02-20 10:01:15 +08:00
c2e64e2a71 双击点赞引导 2020-02-19 18:28:13 +08:00
79af4945e3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-19 16:56:34 +08:00
f83a50d4c5 添加点赞动画 2020-02-19 16:54:49 +08:00
1868488390 社区文章/回答列表增加点赞和评论功能 2020-02-19 15:54:51 +08:00
4dc71d2d76 光环助手V4.0.0-问答社区优化汇总(4) https://gitlab.ghzs.com/pm/halo-app-issues/issues/768 2020-02-19 15:01:29 +08:00
dca5565f45 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-18 16:11:41 +08:00
aa6294bfd4 光环前端优化汇总(2020年2月第2周)(1) https://gitlab.ghzs.com/pm/halo-app-issues/issues/786 2020-02-18 16:11:18 +08:00
77a6d3f295 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-18 10:47:12 +08:00
10fd6d9aef 光环助手V4.0.0-徽章功能优化汇总4,5 https://gitlab.ghzs.com/pm/halo-app-issues/issues/778 2020-02-18 10:46:46 +08:00
37e6120768 光环助手V4.0.0-视频功能优化(视频详情)1,2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/777 2020-02-18 10:46:18 +08:00
b9defd4a58 光环助手V4.0.0-视频功能优化(上传视频)(3) https://gitlab.ghzs.com/pm/halo-app-issues/issues/776 2020-02-17 17:51:12 +08:00
7f7938fdfa 修改社区搜索样式 2020-02-17 15:30:11 +08:00
7c2f411a48 修改社区文章/回答列表样式 2020-02-17 14:26:37 +08:00
51c152ca5e 使用exo自带缓存策略,重写预加载功能 2020-02-17 11:12:45 +08:00
dc46ee4431 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-14 18:53:40 +08:00
da3ba76547 全局修改社区所有列表UI(未完成)(6)
https://gitlab.ghzs.com/pm/halo-app-issues/issues/768
2020-02-14 18:53:24 +08:00
36a31f28f0 完成光环前端优化汇总(2020年2月第2周)的第4点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/786 2020-02-14 11:57:20 +08:00
450a732f2e 修复4.0.0数据后台统计的 6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/789 2020-02-14 11:56:21 +08:00
b8c5dcf4b4 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-13 17:39:50 +08:00
8ae5eacffe 游戏搜索(游戏搜索索引和游戏搜索结果)页面重构并且游戏搜索结果页面加上分页操作 2020-02-13 17:39:31 +08:00
bb9f7a33fb 修复游戏评论相关Bug汇总的三(2) https://gitlab.ghzs.com/pm/halo-app-issues/issues/774 2020-02-13 17:36:47 +08:00
06f603e975 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-13 16:38:05 +08:00
20c74a1727 光环前端优化汇总(2020年2月第1周)7 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-13 16:37:48 +08:00
5dd3ba43c9 光环前端优化汇总(2020年2月第2周)6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/786 2020-02-12 20:09:30 +08:00
cd749fc1c9 光环前端优化汇总(2020年2月第2周)8,9 https://gitlab.ghzs.com/pm/halo-app-issues/issues/786 2020-02-12 18:08:42 +08:00
6b7610bac8 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-12 17:29:47 +08:00
041f48bdb5 光环前端优化汇总(2020年2月第2周)(2)https://gitlab.ghzs.com/pm/halo-app-issues/issues/786 2020-02-12 17:28:58 +08:00
a1adfb336b 修复在低版本系统上自动安装时的闪退问题 2020-02-12 17:24:37 +08:00
35ff5af974 光环助手V4.0.0-版块(游戏库)优化:新增刷新按钮&显示静态图标(二)
https://gitlab.ghzs.com/pm/halo-app-issues/issues/784
2020-02-12 16:21:11 +08:00
638f324cd2 Merge branch 'exo' into dev 2020-02-12 11:36:33 +08:00
62390f88e5 我的光环小红点 2020-02-12 10:57:15 +08:00
9428604613 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-11 17:32:47 +08:00
610fc444af 光环助手V4.0.0-问答社区优化汇总(5) https://gitlab.ghzs.com/pm/halo-app-issues/issues/768 2020-02-11 17:32:25 +08:00
e5d7b68a85 版本号升级为4.0.0, 测试环境API亦切换至 4.0.0 2020-02-11 17:24:48 +08:00
9e91a53e94 修复新首页轮播图路径记录问题 https://gitlab.ghzs.com/pm/issues-Inbox/issues/2237 2020-02-11 17:23:46 +08:00
fa553238bb overrideLibrary添加exo,最低版本恢复至16 2020-02-11 10:53:03 +08:00
0a579427f4 顶部视频声音问题 2020-02-11 09:53:37 +08:00
921bc29f73 尝试更换exo内核 2020-02-10 18:26:33 +08:00
2864fa0d91 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-10 18:01:05 +08:00
9771fb7f25 光环助手V4.0.0-问答社区优化汇总(2.3) https://gitlab.ghzs.com/pm/halo-app-issues/issues/768 2020-02-10 18:00:45 +08:00
ec5bf05d42 光环助手V4.0.0-视频功能优化(数据与算法)1-3 https://gitlab.ghzs.com/pm/halo-app-issues/issues/781 2020-02-10 15:47:59 +08:00
7257f88993 增加非Wi-Fi环境播放视频提醒 2020-02-10 09:44:28 +08:00
79a5402e83 fix bug 2020-02-07 19:48:07 +08:00
abc899e822 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-07 19:37:44 +08:00
4e96f00ae9 Matisse增加单选模式 2020-02-07 19:37:21 +08:00
48106a8577 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-07 18:36:14 +08:00
dcdba2a9ad 光环助手V4.0.0-视频功能优化(游戏详情顶部视频)1,2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/779 2020-02-07 18:35:54 +08:00
544c7a065f 优化应用进程重建时的状态异常问题 https://gitlab.ghzs.com/halo/assistant-android/issues/16 2020-02-07 17:04:43 +08:00
cd3ed911d2 视频双击点赞(缺少动画) 2020-02-07 15:33:34 +08:00
e95b2a905c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-07 14:20:32 +08:00
e36209306e 光环助手V4.0.0-我的光环优化汇总 16 https://gitlab.ghzs.com/pm/halo-app-issues/issues/769 2020-02-07 14:20:09 +08:00
af607bc64a 修复由于CDN缓存造成的游戏收录延迟问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/773 2020-02-07 10:31:40 +08:00
450d81a4e3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-06 19:12:01 +08:00
75c69adc87 修改首页状态栏高度未被消费问题 2020-02-06 19:11:35 +08:00
97b808fa81 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2020-02-06 17:26:38 +08:00
512ae70b94 尝试修复已安装列表闪退问题 2020-02-06 17:26:12 +08:00
322a31fcac 光环助手V4.0.0-我的光环优化汇总 7-9,13-15 https://gitlab.ghzs.com/pm/halo-app-issues/issues/769 2020-02-06 15:45:30 +08:00
20b6c383e1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-06 12:39:12 +08:00
e7ff3ab327 光环前端优化汇总(2020年2月第1周)6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-06 12:38:47 +08:00
60b55bddab 修复安利内容过长导致标签样式无法显示的问题 2020-02-06 11:57:08 +08:00
1898e594dd 完成前端优化汇总(2月第1周)的 3,4,5 https://gitlab.ghzs.com/pm/halo-app-issues/issues/771 2020-02-06 11:56:09 +08:00
09f0704ad2 更换主题色并区分色块颜色与字体颜色
https://gitlab.ghzs.com/pm/halo-app-issues/issues/767
2020-02-05 17:11:04 +08:00
a6cd047b24 增加回调用于确定 activity 销毁状态 2020-02-05 12:01:40 +08:00
37429a4993 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-04 18:29:15 +08:00
47f2b1e62f 完善登录回落功能 https://gitlab.ghzs.com/halo/assistant-android/issues/17 2020-02-04 18:28:47 +08:00
4e5fe8c32d 修复APP放置于后台过长时间被系统回收后再启动时出现的掉登录的问题 2020-02-04 18:26:31 +08:00
2fdf5421ad 统一管理线程分配,减少资源占用 2020-02-04 16:31:45 +08:00
412e6aa0c5 尝试修复后台执行下载行为时没有将进程转换为前台的问题 2020-02-03 18:02:58 +08:00
1fdafeec4e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-02-03 17:55:28 +08:00
ac819893d4 处理闪退问题 2020-02-03 17:54:40 +08:00
118936845e 处理一些闪退问题 2020-02-03 17:15:44 +08:00
4b1ab3453f 我的光环徽章小红点刷新 2020-02-03 16:13:26 +08:00
53690ff46d Merge branch '3.7.2-bugfix' into 'dev'
3.7.2 bugfix

See merge request !10
2020-02-03 10:09:16 +08:00
e9578bdeec 查看大图兼容 BASE64 编码图片 2020-01-22 11:22:25 +08:00
3c4cc4ff7f tinker-3.7.3-base 2020-01-21 16:03:35 +08:00
150d640977 处理标记下载红点闪退问题 2020-01-21 15:30:45 +08:00
a3599af9d1 修改视频预加载闪退问题 2020-01-21 15:23:53 +08:00
1ac1196b20 处理闪退问题 2020-01-21 14:43:03 +08:00
6c5e863a5b 处理MTA分享事件统计错乱问题 2020-01-21 14:19:35 +08:00
15376a5e13 创建 tinker_3.7.3 标记 2020-01-21 11:13:55 +08:00
eaf5b24044 处理看大图的闪退问题 2020-01-21 10:41:53 +08:00
f05c6540f1 Merge branch '3.7.2-bugfix' of gitlab.ghzhushou.com:halo/assistant-android into 3.7.2-bugfix 2020-01-21 10:18:24 +08:00
25dd3ca4df 完成首页游戏评分显示规则调整 https://gitlab.ghzs.com/pm/halo-app-issues/issues/765 2020-01-21 10:16:51 +08:00
6281b4f510 tinker_base 3.7.2-fix_download 2020-01-20 18:17:33 +08:00
2cbc0b0e17 关闭bugly的Crash处理,统一由AppUncaughtHandler处理 2020-01-20 17:10:25 +08:00
f18a0ef72c Merge branch '3.7.2-bugfix' of gitlab.ghzs.com:halo/assistant-android into 3.7.2-bugfix 2020-01-20 17:04:59 +08:00
98fb4fc412 开启bugly的错误上报 2020-01-20 17:03:52 +08:00
73c995c31f Merge branch '3.7.2-bugfix' of gitlab.ghzhushou.com:halo/assistant-android into 3.7.2-bugfix 2020-01-20 16:28:02 +08:00
60dcafe0c1 处理无参启动 DownloadService 会闪退的问题 2020-01-20 16:27:44 +08:00
c118d7e4ad tinker_base 3.7.2-bugfix 2020-01-20 09:02:42 +08:00
babc55739b Merge branch '3.7.2-bugfix' of gitlab.ghzs.com:halo/assistant-android into 3.7.2-bugfix 2020-01-19 16:53:03 +08:00
df8790c6ff 更改首页我的光环tab小红点大小 2020-01-19 16:52:57 +08:00
30ccdcd750 Merge branch '3.7.2-bugfix' of gitlab.ghzhushou.com:halo/assistant-android into 3.7.2-bugfix 2020-01-19 16:44:23 +08:00
79d23bb203 兼容新游戏详情视频数量字段 2020-01-19 16:42:13 +08:00
b2c5e6551b 去掉预加载5M限制 2020-01-19 15:59:56 +08:00
ec49d7f20a 处理AndroidVideoCache异常问题 2020-01-19 15:39:51 +08:00
5a35d13d70 Merge branch '3.7.2-bugfix' of gitlab.ghzs.com:halo/assistant-android into 3.7.2-bugfix 2020-01-19 15:34:30 +08:00
dcfa4fdaaf 光环助手V3.7.2 RELEASE 20200117-1830 测试汇总 3,4 https://gitlab.ghzs.com/pm/halo-app-issues/issues/764 2020-01-19 15:34:26 +08:00
43324ca44e Merge branch '3.7.2-bugfix' of gitlab.ghzhushou.com:halo/assistant-android into 3.7.2-bugfix 2020-01-19 15:02:58 +08:00
8e778e8172 修复日志触发上传过于频繁的问题 2020-01-19 14:59:22 +08:00
928a98831e Merge branch '3.7.2-bugfix' of gitlab.ghzs.com:halo/assistant-android into 3.7.2-bugfix 2020-01-19 12:21:15 +08:00
3dc678bc27 修复游戏详情加载变慢问题 2020-01-19 12:21:03 +08:00
d2b19a128d 修复初始化下载服务时可能的闪退问题 2020-01-19 11:50:20 +08:00
cc75cb497d 屏蔽下载限速,修复专题详情闪退问题 2020-01-19 11:13:17 +08:00
4840c5c604 修复插件化弹窗闪退的问题 2020-01-19 10:17:22 +08:00
347cfdb72d tinker_base 3.7.2 2020-01-17 15:25:02 +08:00
06ec87ba6d 解决miui系统更改状态栏颜色导致视频流播放异常 2020-01-17 14:56:32 +08:00
1206800a3d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-17 09:45:23 +08:00
d4763468c1 帮助详情增加长按复制操作 2020-01-17 09:45:16 +08:00
9c1a186a28 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-17 09:37:35 +08:00
bd9b914c18 视频流播放移动网络提醒 2020-01-17 09:37:30 +08:00
d40a57bcaa 微调UI 2020-01-16 15:38:58 +08:00
1892758288 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-16 15:29:38 +08:00
ca2e26756a 修复视频封面显示异常问题 2020-01-16 15:29:28 +08:00
ed5696f4bd Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-16 14:57:51 +08:00
cee34e7d76 处理视频流暂停显示问题 2020-01-16 14:57:44 +08:00
54decbade3 调整详情页自定义栏目显示逻辑 2020-01-16 14:28:38 +08:00
11167670f8 增加通用分享弹窗 MTA 事件 2020-01-16 14:28:15 +08:00
37c7629cf0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-16 11:17:56 +08:00
947236f85d 修复个别手机下载流量toast提示被覆盖掉的问题 2020-01-16 11:17:49 +08:00
eafa13ec76 修复非曝光入口进入游戏详情触发预约会闪退的问题 2020-01-16 11:13:56 +08:00
7258812537 视频流接口添加随机数 2020-01-16 10:55:29 +08:00
e0a82f5050 优化逻辑 2020-01-16 09:42:29 +08:00
e0e7cbd2a3 处理编译问题 2020-01-16 09:33:57 +08:00
554ec20493 修复视频流滑动卡顿的问题 2020-01-15 22:08:47 +08:00
31c3ed3bc5 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 20:44:00 +08:00
466b690ac0 光环助手V3.7.2 RELEASE 20200115-1000 测试汇总3,4,9 https://gitlab.ghzs.com/pm/halo-app-issues/issues/760 2020-01-15 20:43:51 +08:00
0420557f47 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 19:58:50 +08:00
c0edbf1a57 光环助手V3.7.2 RELEASE 20200115-1000 测试汇总(1.5.8)https://gitlab.ghzs.com/pm/halo-app-issues/issues/760 2020-01-15 19:58:40 +08:00
374610dbc0 崩溃问题 2020-01-15 19:56:30 +08:00
080ac5f1d5 Merge branches 'dev' and 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 17:09:34 +08:00
9dc967087d MIUI系统更改状态栏字体颜色 2020-01-15 17:09:29 +08:00
80a238253d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 17:02:15 +08:00
d7b7f11ebf RichEditor onVideoClick 进行Catch操作 2020-01-15 17:02:07 +08:00
9abb14e37f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 15:50:16 +08:00
5fbb93cbee 视频流不循环加载问题 2020-01-15 15:50:12 +08:00
20b75ff046 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 15:35:07 +08:00
73374017a5 微调UI 2020-01-15 15:35:00 +08:00
73c3d5cd4d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 14:46:30 +08:00
01a02a000f 光环助手V3.7.2 RELEASE 20200113-1830 测试汇总 11 https://gitlab.ghzs.com/pm/halo-app-issues/issues/759 2020-01-15 14:46:25 +08:00
8998f1323f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 14:18:12 +08:00
bb77cf4624 fix bug 2020-01-15 14:18:05 +08:00
772705ed0f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 11:19:36 +08:00
6e2f568ad3 光环助手V3.7.2 RELEASE 20200113-1830 测试汇总3,9,12,13 https://gitlab.ghzs.com/pm/halo-app-issues/issues/759 2020-01-15 11:19:31 +08:00
df20c8235e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-15 11:07:19 +08:00
4882cc5203 光环助手视频新年活动页面(WEB)(一 3~7,四 5,7,五 4)https://gitlab.ghzs.com/pm/halo-app-issues/issues/742 2020-01-15 11:07:07 +08:00
4fa6a41681 我的光环数据刷新 2020-01-14 18:55:20 +08:00
f77e9d4949 视频流优化 2020-01-14 17:38:24 +08:00
1bc167fe7b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-14 16:16:40 +08:00
98213ad3ee 完成光环助手V3.7.2 RELEASE(20200111-0250)测试问题汇总 10,13 https://gitlab.ghzs.com/pm/halo-app-issues/issues/757 2020-01-14 16:16:33 +08:00
0b101d693d 修复下载通知刷新时闪烁问题 2020-01-14 15:41:41 +08:00
8655822d88 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-14 14:22:08 +08:00
386923d16e 视频流优化 2020-01-14 11:47:40 +08:00
013536b147 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-14 10:33:38 +08:00
880eef90fb 光环助手V3.7.2 RELEASE(20200111-0250)测试问题汇总(4.5.6)https://gitlab.ghzs.com/pm/halo-app-issues/issues/757 2020-01-14 10:33:25 +08:00
61e3784991 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-13 16:44:02 +08:00
0664d92e62 尝试解决离开页面会继续缓冲问题 2020-01-13 16:43:56 +08:00
aab99b0c29 微调UI 2020-01-13 14:33:18 +08:00
2e6ca9c524 修复隐私弹窗按钮拉伸问题 2020-01-13 14:09:40 +08:00
0a402e4e92 更换一些资源文件 2020-01-13 09:02:14 +08:00
7e75cd7859 视频流无数据不显示引导动画 2020-01-11 15:09:19 +08:00
e3522d4160 视频流延迟隐藏mBottomContainer使用Rxjava实现计时器 2020-01-11 15:00:40 +08:00
c9d0b813b6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-11 02:35:28 +08:00
3a7e28fac2 光环助手V3.7.2 RELEASE(20200110-1830)测试问题汇总 1,6,9 https://gitlab.ghzs.com/pm/halo-app-issues/issues/755 2020-01-11 02:35:24 +08:00
9aca24c02b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-11 01:24:35 +08:00
9c818e1470 个人主页问答跳转至相关详情页面 2020-01-11 01:24:20 +08:00
614ed0e7e2 修复从视频 tab 回到桌面再回到光环状态栏变黑的问题 2020-01-11 00:49:40 +08:00
55b1d43e73 修复禁言文案错误问题 2020-01-11 00:31:42 +08:00
25526f3666 update submodule 2020-01-10 23:56:28 +08:00
773f2e798d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 23:55:42 +08:00
58b5ec4eb9 尝试解决离开页面仍然会继续缓存视频的问题 2020-01-10 23:53:21 +08:00
007cef39a7 完成20200107-1830的(20200110测试补充3) https://gitlab.ghzs.com/pm/halo-app-issues/issues/751 2020-01-10 23:04:44 +08:00
ba1a702ea1 修复图片上传失败问题(可能是文件名导致) 2020-01-10 22:30:52 +08:00
56d8b58f72 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 22:30:21 +08:00
f53c8377e6 修复视频流接口相关问题 2020-01-10 22:30:13 +08:00
cfb1d86e8e 完成20200107-1830的(20200110测试补充3) https://gitlab.ghzs.com/pm/halo-app-issues/issues/751 2020-01-10 21:45:44 +08:00
8f0caa0949 修复我的光环页面滚动脱节的问题 2020-01-10 21:41:04 +08:00
8ef13cb4ff 游戏库入口修改默认图片 2020-01-10 21:37:58 +08:00
e6d4f60d4f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 21:20:47 +08:00
e67f85c084 调整首页UI 2020-01-10 21:20:40 +08:00
5318693650 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 20:58:24 +08:00
3bf242b145 光环助手V3.7.2 RELEASE(20200109-1830)测试问题汇总4,10,12,19,20,23 https://gitlab.ghzs.com/pm/halo-app-issues/issues/754 2020-01-10 20:58:18 +08:00
0ba82a334e 光环助手V3.7.2 RELEASE(20200109-1830)测试问题汇总(6.9.11.16.17.24.25.26) https://gitlab.ghzs.com/pm/halo-app-issues/issues/754 2020-01-10 20:56:33 +08:00
0a385bb720 RichEditor 增加js接口(判断当前页面是不是编辑状态) 2020-01-10 19:44:10 +08:00
7658fd2a4f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 18:25:10 +08:00
e40e655bfa 首页大图游戏 摘要前增加游戏标签 2020-01-10 18:25:02 +08:00
cfa000bf88 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 17:14:04 +08:00
12c35cebc4 我的光环用户数据刷新 2020-01-10 17:13:59 +08:00
92089e60ce 完成 20200108-2100 测试汇总的 (3,4,6,11) https://gitlab.ghzs.com/pm/halo-app-issues/issues/753 2020-01-10 17:03:39 +08:00
141a6df8ab 修复首页游戏库入口动画无法显示问题 2020-01-10 16:49:50 +08:00
7719e9763d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-10 15:23:34 +08:00
8d3307986d 修改游戏库入口的占位符 2020-01-10 15:23:21 +08:00
d0b7ec39a7 光环助手V3.7.2 RELEASE(20200108-2100)测试问题汇总2,5,7,8,10 https://gitlab.ghzs.com/pm/halo-app-issues/issues/753 2020-01-10 15:13:44 +08:00
cfd198b4ab 光环助手V3.7.2 RELEASE(20200107-1830)测试问题汇总 6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/752 2020-01-10 11:24:56 +08:00
a557c12c6d 问题详情视频审核中/未通过显示默认封面图 2020-01-10 10:16:12 +08:00
6b777d4ec8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-09 21:01:47 +08:00
882dd95190 光环助手V3.7.2 (20200107-1830) 测试问题汇总4、5、7-9、14、15、19 https://gitlab.ghzs.com/pm/halo-app-issues/issues/752 2020-01-09 21:01:42 +08:00
7764bd29c8 完成 20200107-1830 测试汇总的 10 https://gitlab.ghzs.com/pm/halo-app-issues/issues/752 2020-01-09 20:55:39 +08:00
08730f1ce9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-09 18:27:37 +08:00
f9c15d3427 fix bug 2020-01-09 18:27:30 +08:00
8e8668036e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-09 18:25:24 +08:00
cc65eed48d 光环助手V3.7.2 RELEASE(20200107-1830)测试问题汇总(视频相关)https://gitlab.ghzs.com/pm/halo-app-issues/issues/751 2020-01-09 18:25:19 +08:00
29f4e547a1 RichEditor更改初始化Html方法 2020-01-09 17:15:11 +08:00
419003ae23 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-09 16:33:46 +08:00
0519872d81 RichEditor 增加判断是不是作者的接口 2020-01-09 16:33:36 +08:00
e9b52bb70b 修复今日头条推广SDK激活问题以及下载劫持弹窗的显示问题 2020-01-09 16:08:46 +08:00
681ea201c3 更换视频流引导点击动画 2020-01-09 14:06:51 +08:00
a5466bb6ad 修复下载重试过程中速度降为 0K 每秒时会闪退的问题 2020-01-09 12:03:06 +08:00
3a3998ae84 更换首页tab gif文件 2020-01-09 11:42:57 +08:00
7e27502430 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-09 10:49:24 +08:00
8956885f1c fix bug 2020-01-09 10:38:36 +08:00
caeb0a1362 修复已安装列表和视频流列表缺失曝光事件的问题 2020-01-08 20:12:17 +08:00
cc094889b8 完成20200106测试汇总(5~7,19~21) https://gitlab.ghzs.com/pm/halo-app-issues/issues/749 2020-01-08 19:27:37 +08:00
839386c5f4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java
2020-01-08 19:05:32 +08:00
6c5de65278 首页tab动画部分改为gif 2020-01-08 18:46:24 +08:00
3aadac942c 修复插件化显示异常问题 2020-01-08 16:27:06 +08:00
dca9b49d75 光环助手V3.7.2 (20200106-1838)测试问题汇总12-18 https://gitlab.ghzs.com/pm/halo-app-issues/issues/749 2020-01-08 15:57:20 +08:00
8e764dc22a 启动预约弹窗优化
问题详情视频审核状态显示规则修改
2020-01-08 15:16:20 +08:00
383cf4941e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java
2020-01-08 10:58:34 +08:00
05510a8588 光环助手V3.7.2首页优化第二期:占位图&预约上线弹窗(预约上线弹窗未经过测试)https://gitlab.ghzs.com/pm/halo-app-issues/issues/744 2020-01-08 10:55:34 +08:00
eb611a9ff1 处理我的光环滑动卡顿 2020-01-07 18:18:20 +08:00
15aa3713e6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-07 15:42:59 +08:00
7d11713c49 修改视频流页面 2020-01-07 15:42:54 +08:00
66ff610078 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-07 09:47:03 +08:00
f351761d9e 微调视频投稿UI
修复图片详情保存后无法刷新到图片库问题
2020-01-07 09:46:56 +08:00
6bb5e18253 修改问答-关注-推荐关注按钮样式 2020-01-07 09:38:51 +08:00
c44e8cffcc Fix typo 2020-01-06 18:37:52 +08:00
39d4c35504 修复数据统计需求(光环数据后台) 20200103测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2020-01-06 18:24:25 +08:00
d42b57f385 视频功能优化(问答相关)(2.7.8.9)https://gitlab.ghzs.com/pm/halo-app-issues/issues/731 2020-01-06 18:15:40 +08:00
2142a1676e 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-01-06 16:53:13 +08:00
b0fa41bded 隐私弹窗相关图片增加占位符 2020-01-06 16:52:02 +08:00
28f552ca19 完成下载管理与下载提示优化的20200106测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/726 2020-01-06 16:46:41 +08:00
da0b256054 微调UI 2020-01-06 16:44:16 +08:00
8b477c357a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-06 16:32:10 +08:00
650075488d 修复意见反馈"添加图片"图标被切割问题 2020-01-06 16:31:59 +08:00
8cff41defa 完成新增游戏时长功能 20200106测试 (2,3,6) https://gitlab.ghzs.com/pm/halo-app-issues/issues/722 2020-01-06 16:25:01 +08:00
6519eca511 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-06 16:22:33 +08:00
85d8463972 我的游戏跳转规则 2020-01-06 16:22:28 +08:00
c762a7c755 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-06 16:17:36 +08:00
142859fd39 首页优化:视频入口、插件化区域、导航栏按钮(20200103测试,20200104测试) https://gitlab.ghzs.com/pm/halo-app-issues/issues/730 2020-01-06 16:17:25 +08:00
d7f84ff3c8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-06 14:04:40 +08:00
6c4545e364 完成20200104测试补充2-7 https://gitlab.ghzs.com/pm/halo-app-issues/issues/732 2020-01-06 14:04:34 +08:00
a3d9f12414 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-06 11:30:12 +08:00
412d2ff9dc 修复数据库版本升级问题 2020-01-06 11:30:05 +08:00
65f8440637 降级查看大图的库避免在新版本 MUMU 模拟器上的初始化问题 2020-01-06 11:29:33 +08:00
f06359f5c3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-04 18:42:32 +08:00
433088116e 微调UI 2020-01-04 18:42:09 +08:00
c93e55f306 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-04 18:12:17 +08:00
e613066ed3 关注按钮样式 2020-01-04 18:12:11 +08:00
9aabfde5b0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-04 18:06:58 +08:00
9f4c9431b9 修改图片详情页面的实现方式,适配大图/长图 2020-01-04 18:06:50 +08:00
74f64d9782 使下载完成通知在点击安装后消失 https://gitlab.ghzs.com/pm/halo-app-issues/issues/726 2020-01-04 17:55:25 +08:00
d79b3f10e8 评论被隐藏跳转去修改 2020-01-04 15:42:31 +08:00
b29d32c8f2 Merge branches 'dev' and 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-04 14:32:10 +08:00
b8ec93c6a1 完成20200104测试问题:2-5 https://gitlab.ghzs.com/pm/halo-app-issues/issues/720 2020-01-04 14:32:05 +08:00
dad3c9aee7 修复华为设备下载完成通知不能置顶的问题 2020-01-04 11:50:27 +08:00
833e0406f0 修改游戏广告问题 2020-01-04 10:28:24 +08:00
3d6b556dfd 修复评论标签不显示问题 2020-01-04 09:42:31 +08:00
ad0a5525f0 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 18:41:10 +08:00
a012c3e3de 修改视频流下载按钮样式 2020-01-03 18:41:06 +08:00
6c2d489940 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 18:31:38 +08:00
0ea56b01eb 微调意见反馈UI 2020-01-03 18:31:31 +08:00
f65c226657 处理一个数组越界闪退 2020-01-03 18:25:43 +08:00
006b82381b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 18:21:30 +08:00
059414b9f8 更换首页tab动效 2020-01-03 18:21:26 +08:00
93c1105346 微调隐私弹窗UI 2020-01-03 18:15:34 +08:00
7ca92e8b7f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 17:56:11 +08:00
eeb7415086 Merge branch '3.7.1_game' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java
#	app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java
#	app/src/main/java/com/halo/assistant/HaloApp.java
#	app/src/main/res/layout/fragment_main.xml
2020-01-03 17:55:59 +08:00
9a288e8870 修复游戏评论使用的星星库在三星安卓10设备上的闪退问题 2020-01-03 17:45:23 +08:00
351fefd57b Merge remote-tracking branch 'origin/dev' into dev 2020-01-03 17:23:30 +08:00
4915cdc3ba 完成下载管理与下载提示优化20200101测试的 1,3,4 及20200103测试的 1,2 https://gitlab.ghzs.com/pm/halo-app-issues/issues/726 2020-01-03 17:23:21 +08:00
9d044a4001 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 17:19:47 +08:00
8e465c17dd 视频功能优化(基础功能)(1.2.3.4.5.7) https://gitlab.ghzs.com/pm/halo-app-issues/issues/715 2020-01-03 17:19:38 +08:00
fa73ac790c 修复模拟器应用内更新的闪退问题 2020-01-03 17:19:11 +08:00
899f442f14 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 17:07:42 +08:00
698af5d584 光环助手V3.7.2-评论引导标签 20200103测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/728 2020-01-03 17:07:37 +08:00
66dea77546 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 16:26:38 +08:00
eed2eed992 发表游戏评论支持跳转在线客服&意见反馈(20200103测试问题)https://gitlab.ghzs.com/pm/halo-app-issues/issues/723 2020-01-03 16:26:31 +08:00
913c0027a6 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 15:38:51 +08:00
a7884325c8 我的游戏评论数据刷新 2020-01-03 15:38:38 +08:00
a7caa063ef Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 15:31:46 +08:00
ee99895cba 视频功能优化(数据与算法)https://gitlab.ghzs.com/pm/halo-app-issues/issues/737 2020-01-03 15:31:42 +08:00
cf7a14e80a 问答推荐跳转视频流 2020-01-03 15:15:29 +08:00
07a64d118a 光环助手前端优化汇总(2019年12月)(11~15)https://gitlab.ghzs.com/pm/halo-app-issues/issues/745 2020-01-03 11:11:29 +08:00
72329d0222 微调隐私弹窗UI 2020-01-03 10:52:07 +08:00
16e85e9222 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-03 10:50:46 +08:00
dd11883eab 修复MTA事件缺失问题 2020-01-03 10:50:36 +08:00
be70ce8551 完成0102测试问题1-8 https://gitlab.ghzs.com/pm/halo-app-issues/issues/720 2020-01-03 10:33:50 +08:00
d428c46957 修复一键修复按钮常驻的问题 2020-01-02 18:29:58 +08:00
516b956269 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-02 18:12:36 +08:00
8bb90f4d4c 更换底部icon动效 2020-01-02 18:12:31 +08:00
2f9e9fe976 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-02 17:59:42 +08:00
bf2271ac06 部分页面跳转视频详情添加path路径 2020-01-02 17:59:35 +08:00
f279564e02 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-02 17:38:53 +08:00
386eafa0bc 光环助手前端优化汇总(2019年12月)1~9.16.17 https://gitlab.ghzs.com/pm/halo-app-issues/issues/745 2020-01-02 17:38:46 +08:00
619b5a3cc3 首页优化:视频入口、插件化区域、导航栏按钮(14)https://gitlab.ghzs.com/pm/halo-app-issues/issues/730 2020-01-02 17:23:08 +08:00
d0391c779d 修改隐私弹窗默认文案 2020-01-02 16:44:38 +08:00
fc9d3f2e91 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-02 16:31:47 +08:00
42c7123d2d 视频功能优化(问答相关) https://gitlab.ghzs.com/pm/halo-app-issues/issues/731 2020-01-02 16:31:39 +08:00
8e66f80360 修复移动网络下在视频 tab 点暂不播放会退出光环的问题 2020-01-02 16:26:56 +08:00
b80fab06ad 修复新增游戏时长功能部分测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/722 2020-01-02 16:23:33 +08:00
943c359c22 Merge remote-tracking branch 'origin/dev' into dev 2020-01-02 11:13:30 +08:00
8631045874 更新今日头条广告SDK(增加上报OAID) https://gitlab.ghzs.com/pm/halo-app-issues/issues/743 2020-01-02 11:13:14 +08:00
5991a90353 设置首页底部padding 2020-01-02 10:14:19 +08:00
8534455344 恢复设置页面的版本更新提示 https://gitlab.ghzs.com/pm/halo-app-issues/issues/720 2020-01-02 09:57:00 +08:00
1a21fceeb7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-01-02 09:45:43 +08:00
274739c885 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/video/detail/VideoAdapter.kt
2020-01-02 09:45:37 +08:00
5134fa19be 补充遗漏的下载按钮打开网页逻辑 https://gitlab.ghzs.com/pm/halo-app-issues/issues/727 2020-01-02 09:32:56 +08:00
7342e94bdc 完成1231测试问题1-6 https://gitlab.ghzs.com/pm/halo-app-issues/issues/720 2020-01-02 09:31:50 +08:00
28bf579518 完成光环助手V3.7.2数据统计需求 https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2019-12-31 21:09:10 +08:00
9e490ef349 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-31 18:19:35 +08:00
548206792e 首页tab切换改变颜色 2019-12-31 18:19:30 +08:00
c87d7f9c28 视频详情广告 2019-12-31 18:18:36 +08:00
cfe1584fc3 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.
2019-12-31 16:26:49 +08:00
137a95f5ab 发表游戏评论支持跳转在线客服&意见反馈(1225测试问题) https://gitlab.ghzs.com/pm/halo-app-issues/issues/723 2019-12-31 16:25:42 +08:00
6ab8b24353 修复无法删除下载目录旧更新包的问题 2019-12-31 15:24:44 +08:00
1515cc1ddd 修复隐私弹窗页面切换时状态栏占位问题 2019-12-31 14:47:00 +08:00
abfd4834ef Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-31 14:18:12 +08:00
03032a0dbd 首页优化:视频入口、插件化区域、导航栏按钮(6) https://gitlab.ghzs.com/pm/halo-app-issues/issues/730 2019-12-31 14:18:05 +08:00
75545a5929 修改首页视频退出全屏后页面白屏 2019-12-31 10:42:03 +08:00
1425a95bc8 完成标签列表页的曝光统计 https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2019-12-31 09:54:00 +08:00
23674a1c55 处理接口未同步至正式环境造成的闪退问题 2019-12-31 09:52:49 +08:00
caf0a8d5f5 修复滑动视频闪退问题 2019-12-31 09:28:15 +08:00
b11928528c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-30 18:23:35 +08:00
cf9bd70c6c web端跳转到光环视频相关页面 2019-12-30 18:23:30 +08:00
c6ab68e9b4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-30 18:16:03 +08:00
899da43682 下载行为监控-数据埋点需求 https://gitlab.ghzs.com/pm/halo-app-issues/issues/738 2019-12-30 18:15:30 +08:00
1825f713b3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-30 17:04:52 +08:00
760bc9b63c 视频详情游戏下载 2019-12-30 17:04:46 +08:00
4974c105bf 处理答案/文章内容有反斜杠导致无法插入的问题 2019-12-30 17:04:02 +08:00
9c910ce6de 首页底部切换Tab播放动画 2019-12-30 11:56:53 +08:00
fcd1c2d418 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-28 18:37:42 +08:00
5c0c227c3b 更换底部导航icon 2019-12-28 18:37:37 +08:00
a69669a7ca 优化一些UI问题 2019-12-28 18:31:29 +08:00
166e2e341a Merge branch 'dev' of gitlab.ghzhushou.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.
2019-12-28 18:12:16 +08:00
8cb689cc99 修复下载通知分组问题(删除分组内所有通知后会残留分组摘要) 2019-12-28 18:11:07 +08:00
1dd5c5fd40 修复模拟器启动时没有删除旧光环安装包的问题 2019-12-28 17:57:43 +08:00
92719c538e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-28 15:40:33 +08:00
3448dfddef 完成20191228测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/716 2019-12-28 15:40:26 +08:00
b190b31afa 处理文章/答案摘要包含英文双引号时造成的解析问题 2019-12-28 11:38:11 +08:00
083a62ed9d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-28 11:00:18 +08:00
5f0bfd1184 暴力预防下载通知状态改变时无法刷新问题 2019-12-28 11:00:11 +08:00
15bb7d654c 修复在模拟器上进行应用内更新出现的安装界面消失问题 2019-12-27 18:26:23 +08:00
f42278b91f 修复在模拟器上进行应用内更新出现的安装界面消失问题 2019-12-27 18:14:45 +08:00
aa23d515c6 恢复误删的首页启动模式 2019-12-27 18:10:35 +08:00
b3417749ed Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-27 17:34:38 +08:00
4c33977568 完成1226测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/720 2019-12-27 17:34:33 +08:00
1ecd83b6af 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.
2019-12-27 16:33:40 +08:00
b202302a7e 调整隐私弹窗间距 2019-12-27 16:31:51 +08:00
7450edd177 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-27 16:18:58 +08:00
4c7ab844e8 首页视频流页面 2019-12-27 16:18:52 +08:00
fd6581671d 调整首页插件化区域显示规则
修复启动过程中部分数据无法初始化问题
2019-12-27 15:42:35 +08:00
71cc0962d3 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-26 21:07:49 +08:00
9c70d802b5 1225测试问题:二(1.3.4.5.7.8)https://gitlab.ghzs.com/pm/halo-app-issues/issues/724 2019-12-26 21:07:40 +08:00
ed6bec0cfc Merge branch 'dev' of gitlab.ghzhushou.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.
2019-12-26 18:05:38 +08:00
36834cfec7 隐私政策说明(第二期)(动态设置标题)https://gitlab.ghzs.com/pm/halo-app-issues/issues/717 2019-12-26 18:04:38 +08:00
7dfaf45dc2 完成下载管理和板块轮播图的曝光统计 https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2019-12-26 17:49:21 +08:00
5efddb05b3 视频上传封面圆角 2019-12-26 11:56:46 +08:00
f46122787c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-26 11:44:32 +08:00
1b8cde1c91 视频功能优化(基础功能)(二) https://gitlab.ghzs.com/pm/halo-app-issues/issues/715 2019-12-26 11:44:24 +08:00
1694603cd0 完成1225测试问题:1,2,3,5 https://gitlab.ghzs.com/pm/halo-app-issues/issues/719 2019-12-26 11:27:20 +08:00
4243f37126 我的光环页面滑动冲突 2019-12-25 17:58:45 +08:00
63e0b9887c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-25 17:39:18 +08:00
201efd9628 首页优化:视频入口、插件化区域、导航栏按钮(1.2.3.4.5.15.16)https://gitlab.ghzs.com/pm/halo-app-issues/issues/730 2019-12-25 17:39:04 +08:00
c7c29b7ca8 Merge remote-tracking branch 'origin/dev' into dev 2019-12-25 14:08:15 +08:00
0b3fd3a123 处理曝光闪退问题 2019-12-25 14:07:59 +08:00
99e988a0d9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-25 14:07:31 +08:00
eaa3b81e31 修改评论标签显示 2019-12-25 14:07:19 +08:00
dbbf9a846e 修改视频滑动引导 2019-12-25 11:56:06 +08:00
af8b336434 支持插件使用光环进行二次跳转 https://gitlab.ghzs.com/pm/halo-plugin-issues/issues/120 2019-12-25 11:35:00 +08:00
ce84c0f9c9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-25 10:40:12 +08:00
0f8d9cd5d3 隐私政策说明(第二期) https://gitlab.ghzs.com/pm/halo-app-issues/issues/717 2019-12-25 10:40:06 +08:00
cb70e12632 修复已安装页面可能的闪退问题 2019-12-25 09:57:45 +08:00
a5ad403614 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-24 18:02:20 +08:00
e674a8313a 视频详情引导动画 2019-12-24 18:02:14 +08:00
1cef4bb53d 光环助手-意见反馈优化(三) https://gitlab.ghzs.com/pm/halo-app-issues/issues/724 2019-12-24 17:38:48 +08:00
3851aeb790 发表游戏评论支持跳转在线客服&意见反馈(MTA)https://gitlab.ghzs.com/pm/halo-app-issues/issues/723 2019-12-24 16:17:53 +08:00
7680e2e125 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-24 15:43:09 +08:00
f674aa4a79 下载重试增加移动网络重试 2019-12-24 15:41:10 +08:00
be1533a5df 视频播放数据埋点(点击行为、播放行为) 2019-12-24 10:49:26 +08:00
eca3bdd4e5 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-23 18:44:01 +08:00
c885579516 游戏评论对接web编辑器 2019-12-23 18:43:56 +08:00
341d849e29 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-23 18:33:32 +08:00
2bb5c79c38 光环助手V3.7.2-下载管理与下载提示优化(三)https://gitlab.ghzs.com/pm/halo-app-issues/issues/726 2019-12-23 18:33:23 +08:00
fa26e1a17b 完成轮播图数据上报 https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2019-12-23 10:17:19 +08:00
8ed76089eb 完成游戏预约数据上报 https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2019-12-22 20:36:23 +08:00
678418da0b 完成部分曝光数据上报(新首页&安利墙) https://gitlab.ghzs.com/pm/halo-app-issues/issues/734 2019-12-22 18:33:45 +08:00
1c11fc4469 光环助手V3.7.2-下载管理与下载提示优化(一.二.四.七)https://gitlab.ghzs.com/pm/halo-app-issues/issues/726 2019-12-21 18:01:29 +08:00
78f277fd6d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-21 15:37:26 +08:00
5520fd7122 修改 游戏时长记录 弹窗 2019-12-21 15:37:18 +08:00
cb6ce2e14f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-21 15:19:50 +08:00
80933e82eb 限制视频上下滑动频率 2019-12-21 15:19:44 +08:00
e32dce2ef9 视频功能优化(基础功能)(三.四)https://gitlab.ghzs.com/pm/halo-app-issues/issues/715 2019-12-21 14:28:57 +08:00
e252a9ebf8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-20 19:31:59 +08:00
08936a22c8 光环助手-意见反馈优化(二.四.五1)https://gitlab.ghzs.com/pm/halo-app-issues/issues/724 2019-12-20 19:31:46 +08:00
3fea57d05f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-20 14:54:43 +08:00
52ae5fc451 视频详情UI 2019-12-20 14:53:43 +08:00
045dea265d 3.7.1-game tinker base 2019-12-20 10:09:36 +08:00
501282f243 意见反馈增加游戏收录弹窗 2019-12-20 09:53:48 +08:00
998cf70723 游戏库图标增加占位符/预加载
升级fresco库
对DiffUtilAdapter DiffUtil 进行 try catch 处理
2019-12-19 16:33:49 +08:00
1a10fcac71 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-19 15:03:20 +08:00
ee5862eddd 视频预加载 2019-12-19 15:03:12 +08:00
c1527ec37e 增加帮助详情页面 2019-12-19 10:04:21 +08:00
eb112b358e tinker base 3.7.1-game-tab 2019-12-18 17:24:33 +08:00
b860ab912a 修改游戏库显示逻辑 2019-12-18 16:30:15 +08:00
b14ee68882 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-18 12:03:04 +08:00
44065fcb06 意见反馈增加 使用帮助 模块(部分细节尚未优化) https://gitlab.ghzs.com/pm/halo-app-issues/issues/724 2019-12-18 12:02:53 +08:00
ec5305b76f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-18 11:34:25 +08:00
ddfb651d6a 我的光环缓存数据 2019-12-18 11:34:20 +08:00
8a828a3250 修复下载数据(新)插件化更新上报错乱的问题 2019-12-18 10:40:12 +08:00
31f5795e27 我的游戏评论 https://gitlab.ghzs.com/pm/halo-app-issues/issues/719 2019-12-17 17:05:41 +08:00
dbde817b59 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-17 16:49:23 +08:00
83e251492d web端跳转到光环视频相关页面定义host 2019-12-17 16:49:17 +08:00
5fa22c7f5d 我的游戏评论 2019-12-17 16:46:26 +08:00
b4ad18c806 设置增加"流量下载提醒"选项 2019-12-17 16:46:10 +08:00
61eb35cf31 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-17 16:16:29 +08:00
07e54d5b5e 修改 下载/更新 红点提示逻辑 2019-12-17 16:16:20 +08:00
e0c27f721c 修复消费 windowInset 时在部分 4.4 设备上的闪退问题 2019-12-17 11:53:48 +08:00
d2bf6bb211 修复一些闪退问题 2019-12-17 11:33:01 +08:00
e2681494db 切换首页tab更改状态栏颜色 2019-12-17 10:30:12 +08:00
ac1d078681 我的光环页面改版&优化已完成 2019-12-16 17:25:55 +08:00
624d9c1e2d Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-13 18:33:26 +08:00
892cc3cdde 我的光环UI 2019-12-13 18:33:20 +08:00
fd7b9263bf 完成下载按钮支持打开 H5 页面 https://gitlab.ghzs.com/pm/halo-app-issues/issues/727 2019-12-13 15:23:41 +08:00
a9428ddb3b 启动app删除视频缓存文件并添加nomedia文件 2019-12-13 10:42:29 +08:00
319f526e0f 增加视频浏览记录 2019-12-12 18:30:23 +08:00
4755542933 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt
#	app/src/main/java/com/gh/gamecenter/video/detail/VideoAdapter.kt
#	app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt
#	app/src/main/res/layout/layout_video_detail_base.xml
#	app/src/main/res/layout/layout_video_detail_surface.xml
2019-12-12 14:58:40 +08:00
f221e20169 视频详情增加静音、全屏、拖动进度等 2019-12-12 14:45:55 +08:00
a149666d3a 视频投稿支持更换封面图 2019-12-11 16:41:58 +08:00
0ff428b61a Merge branch 'dev_3.7.2' into 'dev'
Dev 3.7.2

See merge request !9
2019-12-11 15:14:19 +08:00
cfedc72955 Merge branch 'dev_3.7.2' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.2 2019-12-11 15:11:30 +08:00
16de588c30 重新整理图片剪裁以便兼容后续视频封面更换 2019-12-11 15:11:21 +08:00
779d907397 Merge branch 'dev_3.7.2' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.2 2019-12-11 15:09:35 +08:00
f91e2e41b6 修改视频详情UI 2019-12-11 15:09:30 +08:00
a04e4874f3 基本完成下载限速功能 https://gitlab.ghzs.com/pm/halo-app-issues/issues/726 2019-12-11 14:54:39 +08:00
d303b67e35 修改我的光环页面 2019-12-11 10:56:27 +08:00
31c0c43d14 Merge branch 'dev_3.7.2' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.2 2019-12-10 18:20:16 +08:00
fafb73d03c 跳转抖音 2019-12-10 18:20:11 +08:00
e4ee4d9efe 实名认证 2019-12-10 18:16:52 +08:00
3a043b2704 发表游戏评论支持跳转在线客服&意见反馈 https://gitlab.ghzs.com/pm/halo-app-issues/issues/723 2019-12-10 17:06:10 +08:00
8c9c7309a5 去除调试入后 2019-12-10 11:35:40 +08:00
09330e9cbf 提高时长统计的准确性 2019-12-10 11:33:42 +08:00
08ad62dc70 Merge branch 'dev_3.7.2' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.2
# Conflicts:
#	app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java
2019-12-09 17:51:24 +08:00
464482a507 光环助手V3.7.2-新增游戏时长功能(玩过页面展示完成,数据上报部分统计不准)https://gitlab.ghzs.com/pm/halo-app-issues/issues/722 2019-12-09 17:49:30 +08:00
d449b1266f 跳转高级认证 2019-12-09 11:31:44 +08:00
6d0c4b18d6 设置页面功能调整顺序 2019-12-09 11:30:32 +08:00
a83d1b5761 Merge branch 'dev_3.7.2' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.2
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java
2019-12-06 16:18:21 +08:00
99d564278e 我的游戏评论 2019-12-06 16:14:36 +08:00
482f45d43f 我的光环页面改版 2019-12-06 16:13:36 +08:00
21335a843a 版本以及API升到3.7.2 2019-12-06 10:21:50 +08:00
1facde123e 3.7.1_tinker-base 2019-12-05 18:31:21 +08:00
d02a527b36 光环助手V3.7.2-新增游戏时长功能(基本完成数据提交部分) https://gitlab.ghzs.com/pm/halo-app-issues/issues/722 2019-12-05 18:10:35 +08:00
8f9d6ed2ce 完成20191202测试汇总的20191205补充 https://gitlab.ghzs.com/pm/halo-app-issues/issues/714 2019-12-05 17:52:25 +08:00
e43902be79 首页下载统计 下载位置补充 2019-12-04 19:27:17 +08:00
0f5f8861a7 修复问答推荐默认排序规则混乱问题 2019-12-04 15:10:17 +08:00
cb08886d27 修复启动图显示问题(与系统底部控制栏重叠) 2019-12-04 14:51:10 +08:00
322ec56787 修复光环助手1202测试问题汇总(20191204的3,4,6) https://gitlab.ghzs.com/pm/halo-app-issues/issues/714 2019-12-04 11:56:14 +08:00
75883e11d8 权限弹窗优化(引导设置 “通知管理” 第二期)https://gitlab.ghzs.com/pm/halo-app-issues/issues/716 2019-12-04 11:54:37 +08:00
60b12a3bdf Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-12-04 11:30:09 +08:00
26a66e3a2b 更换启动图 2019-12-04 11:29:35 +08:00
e86e78a665 添加默认打包渠道号 2019-12-03 16:07:13 +08:00
3ba68abbee 优化首页刷新问题 补充 2019-12-03 15:45:58 +08:00
a46ba32f06 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-03 15:21:25 +08:00
82348b519a 优化首页刷新问题 2019-12-03 15:20:53 +08:00
8315a50d49 绕过广点通SDK初始化限制避免启动耗时过长 2019-12-03 11:50:21 +08:00
dca07831db 新增 徽章中心 MTA事件 2019-12-03 09:51:34 +08:00
d568dd0791 修复邀请回答页面用户名显示越界问题 2019-12-03 09:31:13 +08:00
9dbfc68488 Merge branch '3.7.0_servers_reverse' into dev 2019-12-02 19:34:24 +08:00
0b46e0ef8e 邀请回答徽章位置修改 2019-12-02 18:27:58 +08:00
472604bc15 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-02 17:49:07 +08:00
58a2d38518 修复DownloadItemUtils下载按钮点击回调混乱顺序问题 2019-12-02 17:48:54 +08:00
c91186be8a 修复启动页的虚拟按键显示问题 2019-12-02 17:37:49 +08:00
03235438bc Merge branch 'dev' of gitlab.ghzhushou.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.
2019-12-02 17:18:49 +08:00
d015285f1a 更换启动图 2019-12-02 17:17:42 +08:00
45323a6817 MTA数据补充 2019-12-02 16:59:18 +08:00
bcc8d35654 进入评论MTA数据修改 2019-12-02 16:07:16 +08:00
9137b65f4a 粉丝/关注页面MTA数据 2019-12-02 16:01:29 +08:00
fbc9dac99e 修复安利墙分页问题 2019-12-02 15:41:09 +08:00
c27a6e06ad 更换启动图 2019-12-02 15:03:07 +08:00
07970fcbae Merge branch 'dev' of gitlab.ghzhushou.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.
2019-12-02 00:13:19 +08:00
0b3e250386 优化启动图 2019-12-02 00:11:48 +08:00
13b1ba613d 完成(20191129-1730)测试问题汇总的20191201测试 https://gitlab.ghzs.com/pm/halo-app-issues/issues/712 2019-12-01 23:54:15 +08:00
5a1feb4500 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 23:21:22 +08:00
cc7accbc95 首页轮播图增加预约功能 2019-12-01 23:14:10 +08:00
42a83ea0c5 Merge remote-tracking branch 'origin/dev' into dev 2019-12-01 23:04:13 +08:00
39f84442cd 调整 chucker 编译脚本 2019-12-01 23:04:04 +08:00
047c25b0b7 完成1201-1500测试问题汇总的16,18 https://gitlab.ghzs.com/pm/halo-app-issues/issues/713 2019-12-01 23:02:24 +08:00
045f21beac Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 22:49:31 +08:00
8a64460097 更换启动图 2019-12-01 22:49:20 +08:00
195d039904 完成3.7.1测试问题汇总的9 https://gitlab.ghzs.com/pm/halo-app-issues/issues/713 2019-12-01 21:54:28 +08:00
bcf77433b9 公告评论徽章入口 2019-12-01 21:47:02 +08:00
3a122a7137 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 21:41:18 +08:00
354d286a98 光环助手V3.7.1 RELEASE(20191201-1500)测试问题汇总(1.2.7) https://gitlab.ghzs.com/pm/halo-app-issues/issues/713 2019-12-01 21:41:06 +08:00
bfccc1c9b8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 21:14:26 +08:00
80767c17b2 光环助手V3.7.1 RELEASE(20191201-1500)测试问题汇总(5,8,10) https://gitlab.ghzs.com/pm/halo-app-issues/issues/713 2019-12-01 21:14:17 +08:00
0a9185462e 完成3.7.1测试问题汇总的3 https://gitlab.ghzs.com/pm/halo-app-issues/issues/713 2019-12-01 21:13:58 +08:00
c058d3f8c1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 20:57:05 +08:00
70655da2e7 限制网页标题变化 2019-12-01 20:57:00 +08:00
51f8c15af6 修复微信分享问题 2019-12-01 19:37:43 +08:00
20d6984057 首页轮播图加上占位符,图片加载完成再显示渐变阴影 2019-12-01 17:56:56 +08:00
f26813c137 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 17:26:38 +08:00
e2a265c3c7 光环助手V3.7.1 RELEASE(20191129-1730)测试问题汇总(1.2.3.4.5) https://gitlab.ghzs.com/pm/halo-app-issues/issues/712 2019-12-01 17:26:23 +08:00
e840daa340 禁用 webview 安全浏览 2019-12-01 17:23:37 +08:00
c54df5336d 光环助手V3.7.1 RELEASE(20191129-1730) 测试问题汇总https://gitlab.ghzs.com/pm/halo-app-issues/issues/712 2019-12-01 17:17:47 +08:00
4ec97409a8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 16:04:52 +08:00
31b5568dfa 轮播图初始化时定位到第一张
修复首页评分无法显示问题
2019-12-01 16:04:42 +08:00
10cfc6521d 修改个人主页MTA 2019-12-01 15:01:52 +08:00
bfdbc7fc92 修复单图跳转排行榜与多图跳转不一致的问题 2019-12-01 14:44:44 +08:00
ead332d863 修复安利墙闪退问题 2019-12-01 14:27:44 +08:00
b8fd666e84 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.
2019-12-01 14:20:10 +08:00
fb6e3637de 修复引导图显示异常问题 2019-12-01 14:19:03 +08:00
2db519f9e0 去掉多余的时间戳后缀 2019-12-01 14:10:11 +08:00
f55aeaf3d4 20191201测试https://gitlab.ghzs.com/pm/halo-app-issues/issues/682 2019-12-01 11:59:49 +08:00
2340d4957b 视频上传存草稿/提交防抖 补充 2019-12-01 11:05:25 +08:00
7bed914a92 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.
2019-12-01 11:04:05 +08:00
4b9f86a4bb 修复首页MTA统计异常事件 2019-12-01 11:01:22 +08:00
a1844e15e1 Merge remote-tracking branch 'origin/dev' into dev 2019-12-01 10:39:40 +08:00
148589a6c5 完成光环助手v3.7.1测试汇总的第5点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/711 2019-12-01 10:39:31 +08:00
2902a8b441 视频上传存草稿/提交防抖 2019-12-01 10:39:15 +08:00
b410016fae Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-12-01 10:23:05 +08:00
0d56448bfd 光环助手V3.7.1 DEV(20191129-1730)测试问题汇总(1.2.3) https://gitlab.ghzs.com/pm/halo-app-issues/issues/711 2019-12-01 10:22:55 +08:00
326c292572 评论详情徽章入口 2019-12-01 09:44:04 +08:00
afdaef1a64 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-29 18:27:35 +08:00
9bcd4b8e95 首页安利墙徽章入口 2019-11-29 18:27:30 +08:00
4d455f13b6 Merge remote-tracking branch 'origin/dev' into dev 2019-11-29 18:00:11 +08:00
94eea3aa90 完成光环助手v3.7.1测试汇总的第4点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/711 2019-11-29 18:00:02 +08:00
b00f47dd99 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-29 17:07:49 +08:00
20a4427e08 修改徽章入口问题 2019-11-29 17:07:43 +08:00
3287f31e2c 修复安利墙异常 MTA 异常事件 2019-11-29 17:02:24 +08:00
fbb6b01585 完成对已安装游戏标记为玩过游戏弹窗的排重处理 https://gitlab.ghzs.com/pm/halo-app-issues/issues/696 2019-11-29 16:33:06 +08:00
f07d1b7257 去掉旧引导遮罩 https://gitlab.ghzs.com/pm/halo-app-issues/issues/708 2019-11-29 16:20:22 +08:00
45d2d958a2 客服消息支持跳转至游戏详情评论tab https://gitlab.ghzs.com/pm/halo-app-issues/issues/683 2019-11-29 15:49:13 +08:00
2ba2498f6b Merge remote-tracking branch 'origin/dev' into dev 2019-11-29 15:40:08 +08:00
d76dada9f8 调整安利墙列表标签样式 2019-11-29 15:39:59 +08:00
28b63ee21b Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-29 15:30:07 +08:00
90ea78eb39 首页相关标签颜色修改 2019-11-29 15:29:57 +08:00
0cda0e93f0 完成排行榜1129测试补充的第2点 https://gitlab.ghzs.com/pm/halo-app-issues/issues/699 2019-11-29 15:00:20 +08:00
2e0469f915 完成安利墙1128测试补充的 2~5 https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-29 14:43:15 +08:00
fdfbd23963 修改首页 bottom bar 图标 2019-11-29 10:13:36 +08:00
5f8b11f8e0 首页安利墙snap定位向右偏移4dp 2019-11-28 21:00:58 +08:00
a1df2f6ca6 首页UI调整 2019-11-28 20:34:58 +08:00
1d0d0e40de Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/res/layout/fragment_main.xml
#	app/src/main/res/values/dimens.xml
2019-11-28 19:55:08 +08:00
b3e5144cea 修改首页底部控制台UI
板块推荐入口接入安利墙/开服表
2019-11-28 19:49:32 +08:00
aed74449b0 更换引导图 2019-11-28 18:24:54 +08:00
45dc231024 完成10月第四周优化(8~12, 14) https://gitlab.ghzs.com/pm/halo-app-issues/issues/685 2019-11-28 18:17:13 +08:00
c1a223f120 完成"排行榜"功能1128测试补充 https://gitlab.ghzs.com/pm/halo-app-issues/issues/699 2019-11-28 17:26:51 +08:00
4a926997aa Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-28 16:48:36 +08:00
ae764b95fb DefaultJsApi添加跳转登录页面方法 2019-11-28 16:48:29 +08:00
7bba3f8b4d 游戏评分徽章入口图标优化 2019-11-28 16:47:38 +08:00
b2ad804d3c 微调微信登录结构 2019-11-28 15:29:08 +08:00
c49fa5cd3d 修复游戏预约微信提醒服务1128测试问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/675 2019-11-28 15:11:06 +08:00
92b5e28675 1128测试问题10 11(1)https://gitlab.ghzs.com/pm/halo-app-issues/issues/695 2019-11-28 11:55:03 +08:00
4afa5f6bc6 调整我的光环-微信预约位置 2019-11-28 11:42:10 +08:00
fbdc31aa97 Merge branch 'dev' of gitlab.ghzhushou.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.
2019-11-28 11:22:36 +08:00
4eedfadc22 启动速度优化 2019-11-28 11:21:33 +08:00
3432a6c39f 1128测试问题(10)https://gitlab.ghzs.com/pm/halo-app-issues/issues/695 2019-11-28 10:42:55 +08:00
7e7c2180ce 更换广点通帐号 https://gitlab.ghzs.com/pm/yunying/issues/893 2019-11-28 10:22:33 +08:00
0386446a00 游戏评论编辑去除空行 2019-11-28 10:03:51 +08:00
09853e4187 标记已玩过的数据后页面刷新 2019-11-28 10:02:57 +08:00
40020fa617 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-28 09:39:14 +08:00
cc68c15824 处理空指针闪退 2019-11-28 09:38:48 +08:00
7aa874a0e3 修改问题草稿显示规则(草稿存储以社区ID为唯一标识,同设备可跨账号使用) 2019-11-28 09:38:46 +08:00
8203e5b568 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-27 20:31:44 +08:00
4f54bca286 首页安利墙交互修改
首页轮播图UI修改
首页去除“xxx想玩”
2019-11-27 20:31:31 +08:00
087479325d 完成 20191126测试(4)https://gitlab.ghzs.com/pm/halo-app-issues/issues/682 2019-11-27 18:31:40 +08:00
357b2c2a60 完成 1127测试问题(1-7)https://gitlab.ghzs.com/pm/halo-app-issues/issues/696 2019-11-27 18:16:09 +08:00
e1918b56e2 DownloadProgressBar add slide style 2019-11-27 16:11:49 +08:00
1f31d1e614 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-27 15:43:15 +08:00
f5468c5f11 首页UI间距调整 2019-11-27 15:43:08 +08:00
672cf331ea 评论徽章入口修改 2019-11-27 15:21:37 +08:00
348ad0faed 徽章系统入口及MTA数据统计 2019-11-27 15:02:33 +08:00
ae742547d8 调整安利墙随机逻辑 2019-11-26 17:24:52 +08:00
ff1c01c836 游戏评分增加来源 2019-11-26 16:45:48 +08:00
a645a3c929 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-26 16:15:31 +08:00
37c590400e 修复首页推荐入口有可能出现的闪退问题
修复首页刷新时轮播图动画异常问题
2019-11-26 16:15:21 +08:00
785e2d8cf5 适配启动页在挖孔屏上的状态栏显示 2019-11-26 15:38:39 +08:00
03d25cb102 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-26 15:21:44 +08:00
869dd9ac11 启动页添加启动图标 2019-11-26 15:21:38 +08:00
f647e172bd 调整安利墙下拉刷新进度指示的位置 2019-11-26 15:18:49 +08:00
7069200c6e 更换设置微信提醒图标 2019-11-26 14:26:00 +08:00
c61cfcbed9 优化首页刷新问题
修复轮播图游戏名显示异常问题
2019-11-26 11:38:53 +08:00
67eddc99ef 修复 data 后台数据上报异常 2019-11-26 09:57:15 +08:00
03fd5aaf09 修复部分安利墙页面专题点击闪退问题 2019-11-25 21:04:34 +08:00
31a8f5e5c7 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-25 18:26:12 +08:00
b7c6460c0e 修改评论光标问题 2019-11-25 18:26:07 +08:00
538c096b8f 修复部分安利墙页面的页面显示问题 https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-25 18:13:59 +08:00
d05c738696 标记已安装游戏弹窗 2019-11-25 15:55:45 +08:00
976035da22 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-25 14:58:30 +08:00
d47fd51c7c 20191121测试(1,2)https://gitlab.ghzs.com/pm/halo-app-issues/issues/682 2019-11-25 14:58:20 +08:00
a047c65efd 适配后台游戏类型新增福利游戏 https://gitlab.ghzs.com/pm/halo-app-issues/issues/706 2019-11-25 09:12:53 +08:00
5bbb6b1c89 整理专题详情代码(删除用rows页面实现的排行榜代码) 2019-11-22 18:02:03 +08:00
95432cb591 修改首页下载按钮文案
修复首页刷新时可能会出现的闪退问题
2019-11-22 17:36:37 +08:00
04862e7f22 重新实现首页轮播图自动轮播逻辑 2019-11-22 17:16:29 +08:00
abafd0bb24 首页安利墙优化 2019-11-22 11:45:34 +08:00
aa83617796 专题排行榜 MTA数据统计 2019-11-21 18:14:02 +08:00
a5b8806997 重新实现专题排行榜 https://gitlab.ghzs.com/pm/halo-app-issues/issues/699 2019-11-21 17:53:55 +08:00
7a70c0158e Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-20 15:27:31 +08:00
74f5972874 修复首页断网刷新问题 2019-11-20 15:27:16 +08:00
b01a29d2e9 修改冲突 2019-11-20 12:17:15 +08:00
88bd0dc9f5 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/res/layout/fragment_home.xml
2019-11-20 11:51:58 +08:00
c7b6d44874 对接个人主页徽章接口 2019-11-20 11:51:36 +08:00
8b6e01929b 完成 3.7.1 数据后台数据统计需求 https://gitlab.ghzs.com/pm/halo-app-issues/issues/706 2019-11-20 10:59:02 +08:00
2ecba00d2a 完成3.7.1 MTA数据统计需求 https://gitlab.ghzs.com/pm/halo-app-issues/issues/705 2019-11-20 10:18:02 +08:00
851fcaab13 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-19 17:37:49 +08:00
e1b9504421 修改安利墙游戏标签个数限制 2019-11-19 17:37:41 +08:00
247e8ed6cc 修复安利墙点赞数据刷新不及时的问题 2019-11-19 16:47:57 +08:00
996d1be136 拆分首页横向专题(补充) 2019-11-19 16:25:49 +08:00
a249d4d572 拆分首页横向专题 2019-11-19 16:16:39 +08:00
c91d52d753 优化自动轮播问题 2019-11-19 15:26:39 +08:00
0c37db444a 光环前端优化汇总(2019年10月第4周)(13.15)https://gitlab.ghzs.com/pm/halo-app-issues/issues/685 2019-11-19 10:02:58 +08:00
eb93f1d915 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-18 21:17:53 +08:00
74e6c9b145 轮播图,触控到轮播区域暂停自动轮播
双击底部导航栏时相关列表自动回到顶部
2019-11-18 21:17:47 +08:00
f15e630fd1 网络错误统计过滤初始化请求 2019-11-18 17:23:58 +08:00
01ee84caa8 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-18 16:22:57 +08:00
311a1916d1 搜索工具栏修改 2019-11-18 16:22:50 +08:00
ae43ae1b97 修复安利墙嵌套专题导致顶部图片不跟随滑动的问题 2019-11-18 15:45:18 +08:00
d9814bbb1f 正式环境接口切换至 3.7.1 2019-11-18 11:17:26 +08:00
dba8abacf2 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-15 18:44:57 +08:00
3ee1474535 删除游戏模块原首页相关代码
光环助手V3.7.1-新增游戏库入口管理 https://gitlab.ghzs.com/pm/halo-app-issues/issues/697
2019-11-15 18:44:46 +08:00
8481e923ee 修改 EllipsizeTextView 2019-11-15 18:27:42 +08:00
53cfb0f078 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-15 18:22:23 +08:00
233277f6e8 TextView using Spannable,ellipsize doesn't work 2019-11-15 18:21:55 +08:00
dbd75cb513 光环前端优化汇总(2019年11月第3周)(21) https://gitlab.ghzs.com/pm/halo-app-issues/issues/703 2019-11-15 18:21:02 +08:00
bae14a54a1 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-15 17:26:56 +08:00
9c48afca77 提问草稿规则优化 2019-11-15 17:26:46 +08:00
54ebc460fa 修复微博登录失效的问题 2019-11-15 17:24:50 +08:00
901e9a39f9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-15 17:16:13 +08:00
2ebd12c6db 主题颜色撤回更改 2019-11-15 17:16:05 +08:00
c762529b8b 更换主题颜色 2019-11-15 16:59:36 +08:00
3c371038cf 完成安利墙的旧首页功能 https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-15 16:49:46 +08:00
0350c19c81 分离新首页的旧首页部分 2019-11-15 16:49:15 +08:00
ebace67201 提问问题增加草稿功能 2019-11-15 16:31:20 +08:00
cbe6e2e3bd 光环助手V3.7.1-隐藏评分支持修改(完成) https://gitlab.ghzs.com/pm/halo-app-issues/issues/687 2019-11-15 11:16:48 +08:00
4adefc885b 首页大图游戏设置随机占位符 2019-11-15 09:58:05 +08:00
cade2882e4 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-14 16:52:01 +08:00
8c0f2fd527 补全首页相关的MTA统计 2019-11-14 16:51:53 +08:00
56809d8d66 光环前端优化汇总(2019年11月第3周)(20)https://gitlab.ghzs.com/pm/halo-app-issues/issues/703 2019-11-14 15:54:55 +08:00
14772494be 完成11月第三周测试汇总的 3,4,6,7,8,9 https://gitlab.ghzs.com/pm/halo-app-issues/issues/703 2019-11-14 11:22:49 +08:00
4bbec7344f 首页轮播图增加轮播定时器以及修改相关间距 2019-11-14 10:04:48 +08:00
9907863ef5 首页专题的一些回调由接口改为闭包 2019-11-13 17:33:17 +08:00
adfbe36fdf 调整首页专题合集回调结构 2019-11-13 17:09:28 +08:00
3cfb9ac1c3 完成首页相关的跳转以及部分MTA统计 2019-11-13 17:05:45 +08:00
2004b85a12 完成首页相关的跳转以及部分MTA统计 2019-11-13 17:00:59 +08:00
7dd3b5f122 完成新增"排行榜"功能 https://gitlab.ghzs.com/pm/halo-app-issues/issues/699 2019-11-13 16:31:49 +08:00
c849746a6f 光环助手V3.7.1-个人主页改版(第二期)MTA数据统计 2019-11-13 15:52:50 +08:00
a9582bc295 光环前端优化汇总(2019年11月第3周)(19)https://gitlab.ghzs.com/pm/halo-app-issues/issues/703 2019-11-13 15:06:07 +08:00
fd49defe00 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-13 11:43:12 +08:00
650a24775a 首页新增样式添加下载监听 2019-11-13 11:43:00 +08:00
b62a864a7d 添加安利墙评价内容标签 2019-11-13 09:53:26 +08:00
b76e10bdfc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-12 18:41:17 +08:00
4311205e62 光环前端优化汇总(2019年11月第3周)(11-18) https://gitlab.ghzs.com/pm/halo-app-issues/issues/703 2019-11-12 18:41:12 +08:00
69bc1c971d 首页游戏部分Item的实现抽离到相应的ViewHolder 2019-11-12 17:39:38 +08:00
f13c720bcc 3.7.0-splash tinker base 2019-11-12 16:21:00 +08:00
63f66e9714 更换引导图 2019-11-12 16:14:54 +08:00
25d8ed079c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-12 16:05:03 +08:00
b923714b42 首页接入专题相关的下载监听 2019-11-12 16:04:54 +08:00
178295596a Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-12 14:06:20 +08:00
2e1dae86e0 MTA数据统计 2019-11-12 14:05:08 +08:00
4bb0206d2d 完成安利墙假置顶 https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-12 11:07:38 +08:00
23cda9c121 调整个人主页命名避免撞车 2019-11-12 11:06:17 +08:00
a1d0b59e28 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-11 19:40:31 +08:00
9de8e61b1b 新版首页兼容专题/插件化以及相关部分数据补全 2019-11-11 19:40:18 +08:00
be1188e8e4 安利墙列表更换数据结构 2019-11-11 18:41:43 +08:00
fdaefa52ab 补充安利墙搜索内容为空时的样式 https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-11 18:25:11 +08:00
d667e70b90 完成部分安利墙搜索功能 https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-11 17:45:27 +08:00
6184acc144 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-08 18:21:28 +08:00
6f012dc459 标记已玩过弹窗 2019-11-08 18:21:23 +08:00
94774c674a 首页游戏部分Item的实现抽离到相应的ViewHolder 2019-11-08 17:46:30 +08:00
3bda3354f0 3.7.0-servers_reverse-https tinker base 2019-11-08 15:52:45 +08:00
8a56459375 data host 由http改为https 2019-11-08 15:47:35 +08:00
aeb689648f Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/res/values/colors.xml
2019-11-08 15:34:45 +08:00
761d4c3354 完成部分新版首页 https://gitlab.ghzs.com/pm/halo-app-issues/issues/678 2019-11-08 15:33:15 +08:00
90899e7d1f 整理 SearchActivity 代码 2019-11-08 11:10:52 +08:00
9e9d8b7149 引入 core-ktx 依赖 2019-11-08 11:09:31 +08:00
f774df532c 调整游戏详情页部分样式(细节待微调) https://gitlab.ghzs.com/pm/halo-app-issues/issues/685 2019-11-07 16:58:19 +08:00
d85c4533b7 完成简单的安利墙列表(暂缺首页专题) https://gitlab.ghzs.com/pm/halo-app-issues/issues/680 2019-11-07 16:56:46 +08:00
79aeca832a 更新版本至 3.7.1 2019-11-07 11:00:48 +08:00
50931b1fb6 修改删除评论崩溃 2019-11-07 09:42:46 +08:00
63bd0cdebb Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-06 18:01:19 +08:00
8880d381db 完成光环助手V3.7.1-游戏详情评分优化(前端)https://gitlab.ghzs.com/pm/halo-app-issues/issues/682 2019-11-06 18:00:52 +08:00
4eccd3b2ac Merge remote-tracking branch 'origin/dev' into dev 2019-11-05 17:22:16 +08:00
716ba77d3e 完善微信绑定 2019-11-05 17:22:00 +08:00
4053eec64c Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-05 16:57:36 +08:00
b11463b0f7 首页游戏,用recyclerView重新实现纵向滑动样式 2019-11-05 16:57:28 +08:00
109ada8e8b data 数据接口切换至 https 2019-11-05 16:49:03 +08:00
ab32670b40 3.7.0-servers_reverse tinker base 2019-11-05 10:50:58 +08:00
92f82099b5 总开服表开服/开测页面置换 2019-11-05 10:29:57 +08:00
e41b7434c9 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2019-11-05 09:39:51 +08:00
9c79df6d6e 增加方法让内嵌网页知道是否处于测试环境 2019-11-04 18:18:39 +08:00
fe1f491104 Merge branch 'dev_3.7.1' into 'dev'
Dev 3.7.1

See merge request !8
2019-11-04 18:09:53 +08:00
652bdf9f1d 对接修改评论接口、取消游戏评论点赞 2019-11-04 17:30:49 +08:00
36b13d6d28 游戏评分取消点赞 2019-11-01 15:08:24 +08:00
53b58b63a2 主题修改 2019-11-01 10:51:40 +08:00
6b0f298a2d 移除由引导页进去主页的延迟操作 2019-10-31 18:18:04 +08:00
08bc8bc49e 补充提交遗漏文件 2019-10-31 12:12:23 +08:00
c8b436de94 Merge remote-tracking branch 'origin/dev_3.7.1' into dev_3.7.1 2019-10-31 11:51:00 +08:00
82b6323f72 补充提交遗漏代码 2019-10-31 11:50:49 +08:00
6664bc9e62 fix build error 2019-10-31 11:47:08 +08:00
544dc67d0d Merge branch 'dev_3.7.1' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.1 2019-10-31 11:41:04 +08:00
d55c4d12bc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev_3.7.1
# Conflicts:
#	app/src/main/AndroidManifest.xml
#	app/src/main/java/com/gh/base/ToolBarActivity.java
2019-10-31 11:40:54 +08:00
707bc9bb1a ToolBarActivity和BaseActivity层级更换
设置启动默认闪屏图片(却缺失启动图片,待完成),防止启动时长时间处于无响应状态
2019-10-31 11:34:35 +08:00
41806eab54 基本完成游戏预约微信提醒服务的 APP 部分 https://gitlab.ghzs.com/pm/halo-app-issues/issues/675 2019-10-31 11:12:05 +08:00
443c3bf26a 测试环境接口切换至 3.7.1 2019-10-31 11:09:11 +08:00
7ac6e82624 内嵌网页新增绑定微信类型 2019-10-31 09:54:18 +08:00
87106de6d6 提供更多的 API 供内嵌网页调用 2019-10-30 18:17:18 +08:00
c52d94b003 Merge branch 'dev_3.7.1' of gitlab.ghzs.com:halo/assistant-android into dev 2019-10-30 16:55:37 +08:00
5ac13f2107 调整QQ,微博和微信等第三方登录相关的代码结构 2019-10-30 16:50:48 +08:00
9269548d64 V3.7.1游戏详情评分优化UI 2019-10-30 11:59:06 +08:00
1504 changed files with 61199 additions and 22231 deletions

View File

@ -23,6 +23,10 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
dexOptions {
// jumboMode = true
javaMaxHeapSize "4g"
@ -61,6 +65,8 @@ 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}\""
/**
* Build Time 供区分 jenkins 打包时间用
@ -117,8 +123,6 @@ android {
publish {
dimension "nonsense"
buildConfigField "String", "API_HOST", "\"${API_HOST}\""
buildConfigField "String", "COMMENT_HOST", "\"${COMMENT_HOST}\""
buildConfigField "String", "DATA_HOST", "\"${DATA_HOST}\""
buildConfigField "String", "UMENG_APPKEY", "\"${UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${UMENG_MESSAGE_SECRET}\""
@ -135,8 +139,6 @@ 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}\""
@ -169,7 +171,7 @@ rebuildChannel {
repositories {
flatDir {
dirs 'libs/aars'
dirs 'libs','libs/aars'
}
}
@ -183,6 +185,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,13 +195,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}"
@ -206,6 +210,7 @@ dependencies {
implementation "com.facebook.fresco:fresco:${fresco}"
implementation "com.facebook.fresco:animated-gif:${fresco}"
implementation "com.facebook.fresco:animated-drawable:${fresco}"
implementation "com.squareup.okhttp3:okhttp:${okHttp}"
@ -239,13 +244,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.3'
implementation "com.contrarywind:Android-PickerView:${pickerView}"
implementation "com.scwang.smartrefresh:SmartRefreshLayout:${smartRefreshLayout}"
implementation "net.cachapa.expandablelayout:expandablelayout:${expandableLayout}"
@ -258,27 +263,35 @@ dependencies {
implementation "com.squareup.picasso:picasso:${picasso}"
// for video streaming
implementation "com.shuyu:gsyVideoPlayer-java:$gsyVideo"
implementation "com.shuyu:gsyVideoPlayer-armv7a:$gsyVideo"
implementation "com.shuyu:gsyVideoPlayer-x86:$gsyVideo"
implementation ("com.shuyu:gsyVideoPlayer-java:$gsyVideo",{
exclude module: "gsyvideoplayer-androidvideocache"
})
implementation "com.shuyu:GSYVideoPlayer-exo2:$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("com.github.piasy:BigImageViewer:$bigImageViewer", {
exclude group: 'com.squareup.okhttp3'
})
implementation project(':libraries:LGLibrary')
implementation project(':libraries:MTA')
@ -286,9 +299,9 @@ dependencies {
implementation project(':libraries:TalkingData')
implementation project(':libraries:UmengPush')
// implementation project(':libraries:WechatShare')
implementation project(':libraries:LogHub')
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.

Binary file not shown.

View File

@ -240,4 +240,12 @@
-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.**

View File

@ -30,6 +30,8 @@ public class Injection {
// init stetho
Stetho.initializeWithDefaults(application);
// 监控Bundle大小,预防溢出(需要调试的时候再开启吧!)
// TooLargeTool.startLogging(application);
return true;
}

View File

@ -1,516 +1,647 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
package = "com.gh.gamecenter" >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.gh.gamecenter">
<!-- 允许应用程序访问网络连接 -->
<uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许应用程序写入外部存储如SD卡上写文件 -->
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许应用程序读取扩展存储器 -->
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 允许挂载和反挂载文件系统可移动存储 -->
<uses-permission android:name = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 允许应用程序访问Wi-Fi网络状态信息 -->
<uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许应用程序获取网络信息状态 -->
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许应用程序读取电话状态 -->
<uses-permission android:name = "android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许应用程序获取当前或最近运行的应用 -->
<uses-permission android:name = "android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- 允许访问振动设备 -->
<uses-permission android:name = "android.permission.VIBRATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 允许应用程序改变Wi-Fi连接状态 -->
<uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 允许应用程序打开系统窗口,显示其他应用程序 -->
<uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 修改系统设置的权限 -->
<uses-permission android:name = "android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<!-- bugly with tinker -->
<uses-permission android:name = "android.permission.READ_LOGS" />
<uses-permission android:name = "android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-sdk
tools:overrideLibrary="com.shuyu.gsyvideoplayer,
<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,
com.shuyu.gsyvideoplayer.x86,
com.shuyu.gsy.base,
shuyu.com.androidvideocache"/>
com.google.android.exoplayer2,
tv.danmaku.ijk.media.exo2,
shuyu.com.androidvideocache,
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 android:name = "android.permission.READ_CONTACTS" tools:node = "remove"/>
<uses-permission
android:name="android.permission.READ_CONTACTS"
tools:node="remove" />
<supports-screens
android:anyDensity = "true"
android:largeScreens = "true"
android:normalScreens = "true"
android:resizeable = "true"
android:smallScreens = "true" />
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" />
<!--android:largeHeap = "true"-->
<application
android:name = "com.halo.assistant.TinkerApp"
android:allowBackup = "true"
android:icon = "@mipmap/logo"
android:label = "@string/app_name"
android:resizeableActivity = "true"
android:theme = "@style/AppCompatTheme.APP"
android:name="com.halo.assistant.TinkerApp"
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:largeHeap="true"
tools:targetApi = "n" >
android:resizeableActivity="true"
android:theme="@style/AppCompatTheme.APP"
tools:targetApi="n">
<!--android:launchMode = "singleTask"-->
<activity
android:name = "com.gh.gamecenter.SplashScreenActivity"
android:configChanges = "keyboardHidden|orientation|screenSize"
android:screenOrientation = "portrait"
android:theme = "@style/AppGuideTheme" >
<intent-filter >
<action android:name = "android.intent.action.MAIN" />
android:name="com.gh.gamecenter.SplashScreenActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter >
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity >
</activity>
<activity
android:name = "com.gh.gamecenter.MainActivity"
android:launchMode = "singleTask"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateAlwaysHidden|adjustResize" />
android:name="com.gh.gamecenter.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/AppCompatTheme.APP"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
<activity
android:name = "com.gh.gamecenter.DownloadManagerActivity"
android:launchMode = "singleTask"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.DownloadManagerActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
<!--android:theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" 退出时屏幕抖动 -->
<activity android:name = "com.gh.gamecenter.ViewImageActivity" />
<activity
android:name = "com.gh.gamecenter.SearchActivity"
android:configChanges = "keyboardHidden"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.NewsDetailActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.SettingActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.ConcernActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.subject.SubjectActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.NewsSearchActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
<activity
android:name = "com.gh.gamecenter.GameNewsActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.CropImageActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.WebActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.ShareCardPicActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.ShareCardActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.MessageDetailActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.LibaoActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
<activity
android:name = "com.gh.gamecenter.LibaoDetailActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.ShareGhActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.CleanApkActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.SelectUserIconActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.AboutActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.CommentDetailActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.mygame.MyGameActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.GameDetailActivity"
android:configChanges = "orientation|screenSize|keyboardHidden"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.SuggestSelectActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.SuggestionActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.VoteActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateAlwaysHidden|adjustResize" />
<activity
android:name = "com.gh.gamecenter.ToolBoxActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
<activity android:name="com.gh.gamecenter.ViewImageActivity" />
<activity
android:name = "com.gh.gamecenter.WeiBoShareActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
android:name="com.gh.gamecenter.SearchActivity"
android:configChanges="keyboardHidden"
android:screenOrientation="portrait"
android:theme="@style/AppCompatTheme.APP" />
<activity
android:name = ".category.CategoryDirectoryActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.amway.search.AmwaySearchActivity"
android:configChanges="keyboardHidden"
android:screenOrientation="portrait"
android:theme="@style/AppCompatTheme.APP" />
<activity
android:name = ".category.CategoryListActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.ShellActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.LoginActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
android:name="com.gh.gamecenter.gamedetail.history.HistoryApkListActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.UserInfoActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.NewsDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.UserRegionActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.SettingActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.CollectionActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.ConcernActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.MessageActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.subject.SubjectActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.UserInfoEditActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
android:name="com.gh.gamecenter.NewsSearchActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name = "com.gh.gamecenter.qa.search.AskSearchActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.GameNewsActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.CropImageActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.WebActivity"
android:screenOrientation="portrait" />
<activity
android:name = ".qa.answer.fold.AnswerFoldActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.ShareCardPicActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.answer.edit.AnswerEditActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.ShareCardActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.ConcernInfoActivity"
android:screenOrientation = "portrait" />
android:theme="@style/TransparentStatusBarAndNavigationBar"
android:name="com.gh.gamecenter.MessageDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.InfoActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.LibaoActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name = "com.gh.gamecenter.MessageKeFuActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.LibaoDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.select.CommunitiesSelectActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.ShareGhActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.subject.CommunitySubjectActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.CleanApkActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.MessageInviteActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.SelectUserIconActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.MessageVoteActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.AboutActivity"
android:screenOrientation="portrait" />
<activity
android:name = ".qa.questions.invite.QuestionsInviteActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.CommentDetailActivity"
android:theme="@style/TransparentStatusBarAndNavigationBar"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.myqa.MyAskActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.mygame.MyGameActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.column.order.AskTabOrderActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.GameDetailActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.questions.edit.QuestionEditActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.SuggestionActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.VoteActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
<activity
android:name = "com.gh.gamecenter.servers.add.AddKaiFuActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateHidden" />
android:name="com.gh.gamecenter.ToolBoxActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name = "com.gh.gamecenter.servers.patch.PatchKaifuActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.WeiBoShareActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name = "com.gh.gamecenter.BlockActivity"
android:screenOrientation = "portrait" />
android:name=".category.CategoryDirectoryActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity"
android:screenOrientation = "portrait" />
android:name=".category.CategoryListActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.NetworkDiagnosisActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.LoginActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name = "com.gh.gamecenter.personalhome.fans.FansActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.UserInfoActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.personalhome.followers.FollowersActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.UserRegionActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.personalhome.HomeActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.CollectionActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.article.edit.ArticleEditActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.MessageActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.article.MyArticleActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.UserInfoEditActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name = "com.gh.gamecenter.qa.article.draft.ArticleDraftActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.search.AskSearchActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.article.detail.ArticleDetailActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.draft.CommunityDraftWrapperActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity"
android:screenOrientation = "portrait"
android:windowSoftInputMode = "stateVisible" />
android:name=".qa.answer.fold.AnswerFoldActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.questions.edit.manager.HistoryDetailActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.answer.edit.AnswerEditActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.questions.edit.manager.HistoryActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.ConcernInfoActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.editor.InsertAnswerWrapperActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.InfoActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.editor.GameActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.MessageKeFuActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.editor.InsertArticleWrapperActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.select.CommunitiesSelectActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.gamedetail.rating.RatingReplyActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.subject.CommunitySubjectActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.history.HistoryActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.MessageInviteActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.personalhome.rating.RatingActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.MessageVoteActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.gamedetail.rating.logs.CommentLogsActivity"
android:screenOrientation = "portrait" />
android:name=".qa.questions.invite.QuestionsInviteActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.tag.TagsActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.myqa.MyAskActivity"
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.article.SimpleArticleListActivity"
android:screenOrientation = "portrait" />
android:name="com.gh.gamecenter.qa.column.order.AskTabOrderActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.questions.edit.QuestionEditActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.servers.add.AddKaiFuActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.gh.gamecenter.servers.patch.PatchKaifuActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.BlockActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.amway.AmwayActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.NetworkDiagnosisActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.personalhome.fans.FansActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.personalhome.followers.FollowersActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.personalhome.UserHomeActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.article.edit.ArticleEditActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.article.MyArticleActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.article.draft.ArticleDraftActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.article.detail.ArticleDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.draft.CommunityDraftWrapperActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateVisible" />
<activity
android:name="com.gh.gamecenter.qa.questions.edit.manager.HistoryDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.questions.edit.manager.HistoryActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.editor.InsertAnswerWrapperActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.editor.GameActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.editor.InsertArticleWrapperActivity"
android:screenOrientation="portrait" />
<activity
android:theme="@style/TransparentStatusBarAndNavigationBar"
android:name="com.gh.gamecenter.gamedetail.rating.RatingReplyActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.history.HistoryActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.personalhome.rating.RatingActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.gamedetail.rating.logs.CommentLogsActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.tag.TagsActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.article.SimpleArticleListActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.video.videomanager.VideoManagerActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.video.upload.view.UploadVideoActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.video.game.GameVideoActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.editor.VideoActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.mygame.PlayedGameActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.servers.GameServersActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.game.columncollection.detail.ColumnCollectionDetailActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.game.upload.GameSubmissionActivity"
android:screenOrientation = "portrait"/>
android:screenOrientation="portrait" />
<activity
android:name = "com.gh.gamecenter.qa.comment.CommentActivity"
android:screenOrientation = "portrait"
android:theme = "@style/Theme.Transparent"
android:windowSoftInputMode = "adjustNothing" />
android:name="com.halo.assistant.fragment.user.UserPortraitCropImageActivity"
android:screenOrientation="portrait" />
<activity android:name="com.gh.gamecenter.video.detail.VideoDetailActivity"
android:screenOrientation = "portrait"
android:theme="@style/TransparentStatusBarAndNavigationBar"/>
<activity
android:name="com.gh.gamecenter.HelpAndFeedbackActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.gh.gamecenter.help.HelpDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.comment.CommentActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Transparent"
android:windowSoftInputMode="adjustNothing" />
<activity
android:name="com.gh.gamecenter.video.detail.VideoDetailActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@style/TransparentStatusBarAndNavigationBar" />
<activity
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 = "com.gh.gamecenter.PushProxyActivity"
android:exported = "true"
android:theme = "@android:style/Theme.Translucent" />
android:name="com.gh.gamecenter.PushProxyActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent" />
<activity
android:name = "com.gh.gamecenter.SkipActivity"
android:theme = "@style/Theme.AppCompat.Light.Fullscreen.Transparent" >
<intent-filter >
<data android:scheme = "ghzhushou" />
android:name="com.gh.gamecenter.SkipActivity"
android:theme="@style/Theme.AppCompat.Light.Fullscreen.Transparent">
<intent-filter>
<data android:scheme="ghzhushou" />
<category android:name = "android.intent.category.DEFAULT" />
<action android:name = "android.intent.action.VIEW" />
<category android:name = "android.intent.category.BROWSABLE" />
</intent-filter >
</activity >
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity
android:name = "${applicationId}.wxapi.WXEntryActivity"
android:exported = "true"
android:label = "@string/app_name"
android:launchMode = "singleTop"
android:screenOrientation = "portrait"
android:theme = "@android:style/Theme.Translucent.NoTitleBar" ></activity >
android:name="${applicationId}.wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
<provider
android:name = "androidx.core.content.FileProvider"
android:authorities = "${applicationId}"
android:exported = "false"
android:grantUriPermissions = "true" >
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name = "android.support.FILE_PROVIDER_PATHS"
android:resource = "@xml/provider_paths" />
</provider >
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
<receiver
android:name = "com.gh.gamecenter.receiver.DownloadReceiver"
android:exported = "false" >
<intent-filter >
<action android:name = "com.gh.gamecenter.DOWNLOAD" />
</intent-filter >
</receiver >
android:name="com.gh.gamecenter.receiver.DownloadReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.gh.gamecenter.DOWNLOAD" />
</intent-filter>
</receiver>
<receiver
android:name = "com.gh.gamecenter.receiver.InstallReceiver"
android:exported = "false" >
<intent-filter >
<action android:name = "com.gh.gamecenter.INSTALL" />
</intent-filter >
</receiver >
android:name="com.gh.gamecenter.receiver.InstallReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.gh.gamecenter.INSTALL" />
</intent-filter>
</receiver>
<receiver
android:name = "com.gh.gamecenter.receiver.ActivitySkipReceiver"
android:exported = "true" >
<intent-filter >
<action android:name = "com.gh.gamecenter.ACTIVITYSKIP" />
</intent-filter >
</receiver >
android:name="com.gh.gamecenter.receiver.ActivitySkipReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.gh.gamecenter.ACTIVITYSKIP" />
</intent-filter>
</receiver>
<receiver android:name = "com.gh.gamecenter.receiver.UmengMessageReceiver" >
<intent-filter >
<action android:name = "com.gh.gamecenter.UMENG" />
</intent-filter >
</receiver >
<receiver android:name="com.gh.gamecenter.receiver.UmengMessageReceiver">
<intent-filter>
<action android:name="com.gh.gamecenter.UMENG" />
</intent-filter>
</receiver>
<!--魅族push应用定义消息receiver声明 -->
<receiver android:name = "com.gh.gamecenter.receiver.MeizuPushReceiver" >
<intent-filter >
<receiver android:name="com.gh.gamecenter.receiver.MeizuPushReceiver">
<intent-filter>
<!-- 接收push消息 -->
<action android:name = "com.meizu.flyme.push.intent.MESSAGE" />
<action android:name="com.meizu.flyme.push.intent.MESSAGE" />
<!-- 接收register消息 -->
<action android:name = "com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
<action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
<!-- 接收unregister消息-->
<action android:name = "com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
<action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
<!-- 兼容低版本Flyme3推送服务配置 -->
<action android:name = "com.meizu.c2dm.intent.REGISTRATION" />
<action android:name = "com.meizu.c2dm.intent.RECEIVE" />
<action android:name="com.meizu.c2dm.intent.REGISTRATION" />
<action android:name="com.meizu.c2dm.intent.RECEIVE" />
<category android:name = "${applicationId}" />
</intent-filter >
</receiver >
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
<receiver
android:name = "com.gh.common.im.ImReceiver"
android:enabled = "true" >
<intent-filter android:priority = "2147483647" >
<action android:name = "com.gh.im" />
<action android:name = "action_finish" />
</intent-filter >
</receiver >
android:name="com.gh.common.im.ImReceiver"
android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="com.gh.im" />
<action android:name="action_finish" />
</intent-filter>
</receiver>
<service android:name = "com.gh.base.GHUmengNotificationService" />
<service android:name="com.gh.base.GHUmengNotificationService" />
<!--<service android:name = "com.gh.gamecenter.statistics.AppStaticService" />-->
</application >
<!-- 梦工厂配置 开始 -->
<!--<meta-data
android:name="MGC_APPID"
android:value="1001276" />
</manifest >
<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

@ -2,16 +2,20 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<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>

View File

@ -0,0 +1 @@
{"v":"5.5.9","fr":60,"ip":0,"op":90,"w":1080,"h":202,"nm":"click","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"椭圆形","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204,1455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"椭圆形","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[10]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204,1455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39,"s":[100,100,100]},{"t":49,"s":[110,110,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[36,36],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"圆环","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.531],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.526],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.446],"y":[0]},"t":63,"s":[50]},{"t":82,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[125.951,79.658,0],"ix":2},"a":{"a":0,"k":[205.951,1458.658,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.601,0.601,0.333],"y":[0,0,0]},"t":28,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.528,0.528,0.333],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.526,0.526,0.333],"y":[0,0,0]},"t":48,"s":[120,120,100]},{"t":63,"s":[100,100,100]}],"ix":6}},"ao":0,"w":1080,"h":1920,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"点击手","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.596],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.515],"y":[0]},"t":63,"s":[100]},{"t":83,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.507],"y":[0]},"t":10,"s":[6]},{"t":30,"s":[2]}],"ix":10},"p":{"a":0,"k":[178.982,123.325,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.489,0.489,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"t":30,"s":[90,90,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.33,-8.3],[3.89,0.27],[-4.4,-1.68],[-4.33,-0.67],[-4.08,9.32],[3.33,5.44],[3.39,4.6],[0.87,-3.7],[3.6,-0.86],[1.03,-0.21],[2.34,-0.53],[0.96,1.15],[4.22,5.48],[-1.18,-4.56]],"o":[[1.11,1.71],[-3.89,-0.27],[6.42,2.5],[4.33,0.66],[1.63,-5.32],[-3.34,-5.45],[-1.68,-2.1],[-0.71,3.14],[-3.43,0.95],[-0.57,0.08],[-3.86,1.12],[-3.23,-3.94],[-1.89,-2.28],[2.42,4.64]],"v":[[-5.387,9.698],[-10.717,8.498],[-12.327,15.628],[5.813,21.748],[23.313,11.778],[20.273,-1.202],[11.563,-13.962],[5.393,-12.362],[1.083,-13.722],[-2.087,-9.742],[-5.707,-11.752],[-8.777,-7.572],[-18.297,-20.542],[-23.827,-17.832]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径备份 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"v":"5.6.4","fr":25,"ip":0,"op":35,"w":1080,"h":214,"nm":"点赞","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"椭圆形 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.588],"y":[0]},"t":17,"s":[15]},{"t":20,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[468.04,73.68,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.659,0.659,0.333],"y":[0,0,0]},"t":10,"s":[50,50,100]},{"t":19,"s":[150,150,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":1510,"st":10,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"椭圆形 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.588],"y":[0]},"t":27,"s":[15]},{"t":30,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[468.04,73.68,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.659,0.659,0.333],"y":[0,0,0]},"t":20,"s":[50,50,100]},{"t":28,"s":[140,140,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":1520,"st":20,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"路径备份 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.602],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.663],"y":[0]},"t":24,"s":[100]},{"t":29,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[531.02,129.675,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.514,0.514,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.533,0.533,0.333],"y":[0,0,0]},"t":10,"s":[90,90,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.586,0.586,0.333],"y":[0,0,0]},"t":15,"s":[95,95,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.499,0.499,0.333],"y":[0,0,0]},"t":19,"s":[90,90,100]},{"t":24,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.33,-8.3],[3.89,0.27],[-4.4,-1.68],[-4.33,-0.67],[-4.08,9.32],[3.33,5.44],[3.39,4.6],[0.87,-3.7],[3.6,-0.86],[1.03,-0.21],[2.34,-0.53],[0.96,1.15],[4.22,5.48],[-1.18,-4.56]],"o":[[1.11,1.71],[-3.89,-0.27],[6.42,2.5],[4.33,0.66],[1.63,-5.32],[-3.34,-5.45],[-1.68,-2.1],[-0.71,3.14],[-3.43,0.95],[-0.57,0.08],[-3.86,1.12],[-3.23,-3.94],[-1.89,-2.28],[2.42,4.64]],"v":[[-5.387,9.698],[-10.717,8.498],[-12.327,15.628],[5.813,21.748],[23.313,11.778],[20.273,-1.202],[11.563,-13.962],[5.393,-12.362],[1.083,-13.722],[-2.087,-9.742],[-5.707,-11.752],[-8.777,-7.572],[-18.297,-20.542],[-23.827,-17.832]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径备份 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1500,"st":0,"bm":0}],"markers":[]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"v":"5.5.9","fr":60,"ip":0,"op":120,"w":1080,"h":586,"nm":"上滑","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"手","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.642],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.558],"y":[0]},"t":60,"s":[100]},{"t":71,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.479,"y":0},"t":3,"s":[611,475,0],"to":[0,-62.75,0],"ti":[0,62.75,0]},{"t":40,"s":[611,98.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.78,-12.06],[5.68,0.39],[-6.42,-2.45],[-6.32,-0.97],[-5.95,13.55],[4.87,7.91],[4.94,6.69],[1.26,-5.37],[5.25,-1.25],[1.5,-0.3],[3.4,-0.77],[1.4,1.68],[6.15,7.98],[-1.73,-6.64]],"o":[[1.62,2.49],[-5.68,-0.39],[9.37,3.63],[6.31,0.98],[2.39,-7.74],[-4.87,-7.92],[-2.45,-3.05],[-1.05,4.57],[-4.99,1.39],[-0.83,0.13],[-5.63,1.63],[-4.71,-5.72],[-2.75,-3.31],[3.52,6.76]],"v":[[-7.86,14.26],[-15.64,12.52],[-17.99,22.89],[8.47,31.78],[33.98,17.29],[29.55,-1.59],[16.85,-20.15],[7.86,-17.83],[1.56,-19.8],[-3.05,-14.02],[-8.33,-16.94],[-12.44,-11.045],[-26.761,-30.19],[-34.75,-25.78]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.715],"y":[0]},"t":57,"s":[100]},{"t":67,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[525,228.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.491,"y":0},"t":3,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[24.328,180.5],[-22,180.5],[-22,204.5],[24.328,204.5]],"c":true}]},{"t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[24.328,-207.5],[-22,-207.5],[-22,204.5],[24.328,204.5]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"蒙版 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,1,0.5,0.5,1,0],"ix":9}},"s":{"a":0,"k":[0,-68.5],"ix":5},"e":{"a":0,"k":[0,68.5],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":33,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":3,"op":123,"st":3,"bm":0}],"markers":[]}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"v":"5.5.9","fr":30,"ip":0,"op":20,"w":66,"h":66,"nm":"tab_index","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"椭圆形备份","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.596],"y":[0]},"t":0,"s":[0]},{"t":6,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,40.493,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.54,0.54,0.333],"y":[0,0,0]},"t":4,"s":[80,80,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.555,0.555,0.333],"y":[0,0,0]},"t":9,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.552,0.552,0.333],"y":[0,0,0]},"t":13,"s":[90,90,100]},{"t":16,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[5,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.635],"y":[0]},"t":0,"s":[0]},{"t":8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形备份","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-0.5,"op":59.5,"st":-0.5,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"路径备份","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,32.993,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.508,0.508,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.488,0.488,0.333],"y":[0,0,0]},"t":4,"s":[80,80,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.502,0.502,0.333],"y":[0,0,0]},"t":9,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.534,0.534,0.333],"y":[0,0,0]},"t":13,"s":[95,95,100]},{"t":16,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.24,-1.21],[-1.93,-1.89],[-0.24,-0.57],[0,-0.06],[0,-2.63],[1.76,0],[0,0],[0,1.72],[0,2.63],[-0.24,0.61],[-0.03,0.02],[-1.93,1.89]],"o":[[1.92,1.89],[0.02,0.02],[0.24,0.57],[0,2.63],[0,1.72],[0,0],[-1.76,0],[0,-2.62],[0,-0.07],[0.25,-0.61],[1.92,-1.89],[1.24,-1.21]],"v":[[2.26,-9.09],[8.03,-3.42],[8.76,-2.38],[9,-1.02],[9,6.88],[5.82,10],[-5.82,10],[-9,6.88],[-9,-0.99],[-8.71,-2.38],[-8.01,-3.43],[-2.23,-9.09]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.266,0.638,1,0.5,0.242,0.595,1,1,0.217,0.552,1],"ix":9}},"s":{"a":0,"k":[-4.902,-4.663],"ix":5},"e":{"a":0,"k":[8.159,8.646],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径备份","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}

View File

@ -0,0 +1 @@
{"v":"5.5.9","fr":30,"ip":0,"op":20,"w":66,"h":66,"nm":"tab_video","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 1","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.771],"y":[0]},"t":0,"s":[0]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-3.742,6.835,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[30.937,31.042,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":2,"d":1,"pt":{"a":0,"k":3,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"or":{"a":0,"k":29.286,"ix":7},"os":{"a":0,"k":75,"ix":9},"ix":1,"nm":"多边星形路径 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-20.75,-13.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[102.743,88.578],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"多边星形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.657],"y":[0]},"t":0,"s":[0]},{"t":8,"s":[100]}],"ix":2},"o":{"a":0,"k":-115,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"路径 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33.004,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.508,0.508,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.488,0.488,0.333],"y":[0,0,0]},"t":4,"s":[80,80,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.502,0.502,0.333],"y":[0,0,0]},"t":9,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.534,0.534,0.333],"y":[0,0,0]},"t":13,"s":[95,95,100]},{"t":16,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.16,0.38],[3.22,-0.55],[0.38,-2.16],[-0.55,-3.22],[-2.16,-0.38],[-1.63,0],[-1.61,0.27],[-0.38,2.16],[0.55,3.22]],"o":[[-0.38,-2.16],[-3.22,-0.55],[-2.16,0.38],[-0.55,3.22],[0.38,2.16],[1.61,0.27],[1.63,0],[2.16,-0.38],[0.55,-3.22],[0,0]],"v":[[9.09,-4.86],[4.86,-9.09],[-4.86,-9.09],[-9.09,-4.86],[-9.09,4.86],[-4.86,9.09],[0,9.5],[4.86,9.09],[9.09,4.86],[9.09,-4.86]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.266,0.638,1,0.5,0.242,0.595,1,1,0.217,0.552,1],"ix":9}},"s":{"a":0,"k":[-5.174,-4.43],"ix":5},"e":{"a":0,"k":[8.612,8.214],"ix":6},"t":1,"nm":"Gradient Fill 3","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}

View File

@ -63,6 +63,12 @@ RE.setHtml = function(contents) {
RE.editor.innerHTML = decodeURIComponent(contents.replace(/\+/g, '%20'));
}
// 后续初始化html代码,都用该方法
RE.setHtmlByVideoStatus = function(contents) {
RE.editor.innerHTML = decodeURIComponent(contents.replace(/\+/g, '%20'));
}
// Deprecated
RE.getHtml = function() {
return RE.editor.innerHTML;
}
@ -611,3 +617,25 @@ RE.sendElementNameToNative = function() {
}
}
}
// android function to open link
function customLinkgo(self) {
var datas = self.dataset.datas
// 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);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1,27 +1,29 @@
package com.gh.base;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.Window;
import android.view.WindowManager;
import com.gh.base.fragment.BaseFragment;
import com.gh.common.constant.Constants;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.MtaHelper;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.RunningUtils;
import com.gh.common.util.ShareUtils;
import com.gh.common.util.StringUtils;
import com.gh.common.util.TeaHelper;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.LoginActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SuggestionActivity;
import com.gh.gamecenter.eventbus.EBShowDialog;
import com.gh.gamecenter.suggest.SuggestType;
import com.lightgame.BaseAppCompatActivity;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.Utils;
import com.tencent.tauth.Tencent;
@ -29,31 +31,41 @@ import com.tencent.tauth.Tencent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import butterknife.ButterKnife;
import pub.devrel.easypermissions.EasyPermissions;
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
public abstract class BaseActivity extends BaseToolBarActivity implements EasyPermissions.PermissionCallbacks {
/**
* 只提供基础的服务(EventBus/ButterKnife/Share/GlobalDialog/Permissions)
* <p>
* 需要工具栏的页面请继承{@link ToolBarActivity}
*/
public abstract class BaseActivity extends BaseAppCompatActivity implements EasyPermissions.PermissionCallbacks {
// global dialog key
public final static String DOWNLOAD_HIJACK = "hijack";
public final static String LOGIN_EXCEPTION = "loginException";
public final static String PLUGGABLE = "plugin";
@NonNull
protected String mEntrance;
private boolean mIsPause;
private boolean mIsExistLogoutDialog;
protected final Handler mBaseHandler = new BaseHandler(this);
protected static class BaseHandler extends Handler {
private final WeakReference<BaseActivity> mActivityWeakReference;
BaseHandler(BaseActivity activity) {
@ -82,27 +94,11 @@ public abstract class BaseActivity extends BaseToolBarActivity implements EasyPe
}
}
// 小米沉浸式黑色字体
public void setStatusBarDarkMode(boolean darkmode, Activity activity) {
Class<? extends Window> clazz = activity.getWindow().getClass();
try {
int darkModeFlag = 0;
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
} catch (Exception ignore) {
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarDarkMode(true, this);
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;
@ -115,17 +111,11 @@ public abstract class BaseActivity extends BaseToolBarActivity implements EasyPe
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
if (useEventBus()) EventBus.getDefault().unregister(this);
mBaseHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
@Override
protected boolean onNavigationIconClicked() {
onBackPressed();
return true;
}
public void toast(String msg) {
Utils.toast(this, msg);
}
@ -134,34 +124,40 @@ public abstract class BaseActivity extends BaseToolBarActivity implements EasyPe
toast(getString(msg));
}
public void showShare(String url, String icon, String shareTitle, String shareSummary, ShareUtils.ShareType shareType) {
ShareUtils.getInstance(this).showShareWindows(this, getWindow().getDecorView(), url, icon, shareTitle, shareSummary, shareType);
public void showShare(String url,
String icon,
String shareTitle,
String shareSummary,
ShareUtils.ShareType shareType) {
ShareUtils.getInstance(this).showShareWindows(this,
getWindow().getDecorView(),
url,
icon,
shareTitle,
shareSummary,
shareType);
if (shareType == ShareUtils.ShareType.game || shareType == ShareUtils.ShareType.plugin) {
DataUtils.onEvent(this, "内容分享", shareTitle + shareSummary);
MtaHelper.onEvent("内容分享", "内容分享", shareTitle + shareSummary);
} else {
DataUtils.onEvent(this, "内容分享", shareTitle);
MtaHelper.onEvent("内容分享", "内容分享", shareTitle);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(final EBShowDialog showDialog) {
if (!mIsPause && this.getClass().getName().equals(RunningUtils.getTopActivity(this))) {
if ("hijack".equals(showDialog.getType())) {
DialogUtils.showQqSessionDialog(this, "2586716223");// 建议用户联系客服
} else if ("plugin".equals(showDialog.getType())) {
DialogUtils.showPluginDialog(this, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
if (FileUtils.isEmptyFile(showDialog.getPath())) {
toast(R.string.install_failure_hint);
} else {
startActivity(PackageUtils.getUninstallIntent(BaseActivity.this, showDialog.getPath()));
}
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)
&& this.getClass().getName().equals(RunningUtils.getTopActivity(this))) {
if (DOWNLOAD_HIJACK.equals(showDialog.getType())) {
DialogUtils.showQqSessionDialog(this);// 建议用户联系客服
} else if (PLUGGABLE.equals(showDialog.getType())) {
DialogUtils.showPluginDialog(this, () -> {
if (FileUtils.isEmptyFile(showDialog.getPath())) {
toast(R.string.install_failure_hint);
} else {
startActivity(PackageUtils.getUninstallIntent(BaseActivity.this, showDialog.getPath()));
}
});
} else if ("loginException".equals(showDialog.getType())) {
} else if (LOGIN_EXCEPTION.equals(showDialog.getType())) {
if (mIsExistLogoutDialog) return;
mIsExistLogoutDialog = true;
try {
@ -176,51 +172,72 @@ public abstract class BaseActivity extends BaseToolBarActivity implements EasyPe
"你的账号已在另外一台设备登录多设备-重新登录"))
);
mBaseHandler.postDelayed(() -> mIsExistLogoutDialog = false, 5000);
} catch (JSONException e) {
} catch (Exception e) {
e.printStackTrace();
}
} else if ("notfound".equals(showDialog.getType())) {
DialogUtils.showAlertDialog(this, "下载失败", "下载链接已失效,建议提交反馈"
, "立即反馈", "取消"
, () -> {
SuggestionActivity.startSuggestionActivity(this, SuggestType.gameQuestion,
null, showDialog.getPath() + ",问题反馈:下载链接失效");
}, null);
}
}
}
@Override
protected void onPause() {
TeaHelper.onPause(this);
super.onPause();
mIsPause = true;
if (isFinishing()) {
onFinish();
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment.isAdded() && fragment instanceof BaseFragment) {
((BaseFragment) fragment).onParentActivityFinish();
}
}
}
}
@Override
protected void onResume() {
TeaHelper.onResume(this);
super.onResume();
mIsPause = false;
}
/**
* 此回调可用于确认当前 activity 已经执行了 finish() 方法并处于 isFinishing 状态
*/
protected void onFinish() {
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
}
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
}
protected void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(color);
}
}
/**
* 提供当前 activity 的中文名 (不重载的话为类名)
*/
public String getActivityNameInChinese() {
return getClass().getSimpleName();
}
/**
* @param entrance 上一个页面的链式入口名称
* @param path 当前页面名称
@ -237,8 +254,22 @@ public abstract class BaseActivity extends BaseToolBarActivity implements EasyPe
return StringUtils.buildString(entrance, "+(", path, ")");
}
protected boolean useEventBus() {
return true;
}
protected boolean useButterKnife() {
return true;
}
@Override
protected boolean showDownloadMenu() {
return false;
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

@ -2,15 +2,17 @@ package com.gh.base;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.google.android.material.tabs.TabLayout;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.view.View;
import androidx.annotation.Nullable;
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;
import com.lightgame.view.NoScrollableViewPager;
import java.util.ArrayList;
@ -22,7 +24,7 @@ import butterknife.BindView;
* Created by khy on 15/03/18.
*/
public abstract class BaseActivity_TabLayout extends BaseActivity implements ViewPager.OnPageChangeListener {
public abstract class BaseActivity_TabLayout extends ToolBarActivity implements ViewPager.OnPageChangeListener {
public static final String PAGE_INDEX = "PAGE_INDEX";
@ -44,7 +46,7 @@ public abstract class BaseActivity_TabLayout extends BaseActivity implements Vie
protected abstract void initTabTitleList(List<String> tabTitleList);
protected int provideIndicatorWidth() {
return 65;
return 20;
}
protected View provideTabView(int position, String tabTitle) {
@ -88,11 +90,14 @@ public abstract class BaseActivity_TabLayout extends BaseActivity implements Vie
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,12 +9,15 @@ 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
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
@ -27,9 +30,10 @@ import com.lightgame.utils.Utils
import com.lightgame.view.CheckableImageView
import kotterknife.bindView
abstract class BaseRichEditorActivity : BaseActivity() {
abstract class BaseRichEditorActivity : ToolBarActivity() {
val mRichEditor by bindView<RichEditor>(R.id.rich_editor)
val mDraftBtn by bindView<TextView>(R.id.draft_btn)
private val mEditorFont by bindView<CheckableImageView>(R.id.editor_font)
private val mEditorLink by bindView<CheckableImageView>(R.id.editor_link)
@ -68,7 +72,7 @@ abstract class BaseRichEditorActivity : BaseActivity() {
val game = data?.getParcelableExtra<GameEntity>(GameEntity::class.java.simpleName)
if (game != null) insertData = EditorInsertEntity.transform(game)
}
INSERT_VIDEO_CODE -> {
VideoActivity.INSERT_VIDEO_CODE -> {
val video = data?.getParcelableExtra<MyVideoEntity>(MyVideoEntity::class.java.simpleName)
if (video != null) mRichEditor.insertCustomVideo(video)
return
@ -86,6 +90,10 @@ abstract class BaseRichEditorActivity : BaseActivity() {
mRichEditor.addJavascriptInterface(OnPasteListener(), "onPasteListener")
mRichEditor.addJavascriptInterface(OnCursorChangeListener(), "OnCursorChangeListener")
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,
@ -126,19 +134,30 @@ abstract class BaseRichEditorActivity : BaseActivity() {
R.id.editor_font_bold -> {
mEditorFontBold.isChecked = !mEditorFontBold.isChecked
mRichEditor.setBold()
if (mEditorFontBold.isChecked) {
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-加粗")
}
}
R.id.editor_font_italic -> {
mEditorFontItalic.isChecked = !mEditorFontItalic.isChecked
mRichEditor.setItalic()
if (mEditorFontItalic.isChecked) {
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-斜体")
}
}
R.id.editor_font_strikethrough -> {
mEditorFontStrikeThrough.isChecked = !mEditorFontStrikeThrough.isChecked
mRichEditor.setStrikeThrough()
if (mEditorFontStrikeThrough.isChecked) {
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-删除线")
}
}
R.id.editor_paragraph_h1 -> {
if (mEditorParagraphH1.isChecked) {
mRichEditor.formatBlock()
} else {
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-1级标题")
mRichEditor.setHeading(1)
}
mEditorParagraphH1.isChecked = !mEditorParagraphH1.isChecked
@ -147,6 +166,7 @@ abstract class BaseRichEditorActivity : BaseActivity() {
if (mEditorParagraphH2.isChecked) {
mRichEditor.formatBlock()
} else {
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-2级标题")
mRichEditor.setHeading(2)
}
mEditorParagraphH2.isChecked = !mEditorParagraphH2.isChecked
@ -155,6 +175,7 @@ abstract class BaseRichEditorActivity : BaseActivity() {
if (mEditorParagraphH3.isChecked) {
mRichEditor.formatBlock()
} else {
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-3级标题")
mRichEditor.setHeading(3)
}
mEditorParagraphH3.isChecked = !mEditorParagraphH3.isChecked
@ -163,6 +184,7 @@ abstract class BaseRichEditorActivity : BaseActivity() {
if (mEditorParagraphH4.isChecked) {
mRichEditor.formatBlock()
} else {
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-4级标题")
mRichEditor.setHeading(4)
}
mEditorParagraphH4.isChecked = !mEditorParagraphH4.isChecked
@ -171,21 +193,26 @@ abstract class BaseRichEditorActivity : BaseActivity() {
if (mEditorParagraphQuote.isChecked) {
mRichEditor.formatBlock()
} else {
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-引用")
mRichEditor.setBlockquote()
}
mEditorParagraphQuote.isChecked = !mEditorParagraphQuote.isChecked
}
R.id.editor_link_answer -> {
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-回答")
startActivityForResult(InsertAnswerWrapperActivity.getIntent(this), INSERT_ANSWER_CODE)
}
R.id.editor_link_article -> {
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-文章")
startActivityForResult(InsertArticleWrapperActivity.getIntent(this), INSERT_ARTICLE_CODE)
}
R.id.editor_link_game -> {
startActivityForResult(GameActivity.getIntent(this, "插入游戏"), INSERT_GAME_CODE)
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-游戏")
startActivityForResult(GameActivity.getIntent(this, GameActivity.INSERT_GAME_TITLE), INSERT_GAME_CODE)
}
R.id.editor_link_video -> {
startActivityForResult(VideoActivity.getIntent(this), INSERT_VIDEO_CODE)
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-视频")
startActivityForResult(VideoActivity.getIntent(this), VideoActivity.INSERT_VIDEO_CODE)
}
}
}
@ -231,6 +258,8 @@ abstract class BaseRichEditorActivity : BaseActivity() {
}
}
abstract fun mtaEventName(): String
companion object {
const val ELEMENT_NAME_BOLD = " b "
const val ELEMENT_NAME_ITALIC = " i "
@ -244,6 +273,5 @@ abstract class BaseRichEditorActivity : BaseActivity() {
const val INSERT_ANSWER_CODE = 411
const val INSERT_ARTICLE_CODE = 412
const val INSERT_GAME_CODE = 413
const val INSERT_VIDEO_CODE = 414
}
}

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
@ -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()
@ -140,8 +138,9 @@ class GHUmengNotificationService : UmengMessageService() {
notificationManager.notify(getNotificationTag(context), NOTIFICATION_ID, notification)
} else {
if (UserManager.getInstance().isLoggedIn
&& HALO_MESSAGE_DIALOG == pushData.body?.custom) {
if (UserManager.getInstance().isLoggedIn &&
HALO_MESSAGE_DIALOG == pushData.body?.custom &&
MessageUnreadRepository.unreadLiveData.value != null) {
// 回答了问题或者关注了问题的消息
val msg = gson.fromJson(message, PushMessageEntity::class.java)
val data = msg?.extra?.data

View File

@ -9,15 +9,14 @@ import android.view.View;
* Created by khy on 25/04/18.
*/
public abstract class onDoubleTapListener implements View.OnTouchListener {
public abstract class OnDoubleTapListener implements View.OnTouchListener {
private GestureDetector mGestureDetector;
public onDoubleTapListener(Context context) {
protected OnDoubleTapListener(Context context) {
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
onDoubleTapListener.this.onDoubleTap();
OnDoubleTapListener.this.onDoubleTap();
return true;
}
});
@ -26,7 +25,7 @@ public abstract class onDoubleTapListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
return false;
}
public abstract void onDoubleTap();

View File

@ -2,6 +2,6 @@ package com.gh.base;
import android.view.View;
public interface OnViewClickListener {
void onClick(View v, Object data);
public interface OnViewClickListener<T> {
void onClick(View v, T data);
}

View File

@ -1,15 +1,16 @@
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;
import android.view.MenuInflater;
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;
@ -22,12 +23,13 @@ import com.gh.gamecenter.entity.GameUpdateEntity;
import com.gh.gamecenter.eventbus.EBDownloadStatus;
import com.gh.gamecenter.normal.ToolbarController;
import com.gh.gamecenter.packagehelper.PackageViewModel;
import com.lightgame.BaseAppCompatActivity;
import com.lightgame.OnTitleClickListener;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import androidx.annotation.DrawableRes;
@ -38,14 +40,18 @@ import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
/**
* Created by csheng on 15-10-12.
* 需要用到工具栏的页面使用
* <p>
* 特殊页面请参考{@link BaseActivity}
*/
public abstract class BaseToolBarActivity extends BaseAppCompatActivity implements ToolbarController, Toolbar.OnMenuItemClickListener {
public abstract class ToolBarActivity extends BaseActivity implements ToolbarController, Toolbar.OnMenuItemClickListener {
@Nullable
private PackageViewModel mPackageViewModel;
protected RelativeLayout mToolbarContainer;
protected Toolbar mToolbar;
protected TextView mTitleTv;
@ -56,6 +62,7 @@ public abstract class BaseToolBarActivity extends BaseAppCompatActivity implemen
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarDarkMode(true, this);
initToolbar();
if (showDownloadMenu()) {
@ -64,7 +71,23 @@ public abstract class BaseToolBarActivity extends BaseAppCompatActivity implemen
}
}
// 小米沉浸式黑色字体
@SuppressLint("PrivateApi")
public void setStatusBarDarkMode(boolean darkmode, Activity activity) {
Class<? extends Window> clazz = activity.getWindow().getClass();
try {
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
int darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
} catch (Exception ignore) {
}
}
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) {
@ -171,10 +194,20 @@ public abstract class BaseToolBarActivity extends BaseAppCompatActivity implemen
private void updateDownloadCountHint(List<GameUpdateEntity> updateList) {
if (mDownloadCountHint == null) return;
int count = DownloadManager.getInstance(getApplicationContext()).getDownloadOrUpdateCount(updateList);
if (count != 0) {
String count = DownloadManager.getInstance(getApplicationContext()).getDownloadOrUpdateCount(updateList);
if (count != null) {
mDownloadCountHint.setVisibility(View.VISIBLE);
mDownloadCountHint.setText(String.valueOf(count));
mDownloadCountHint.setText(count);
ViewGroup.LayoutParams params = mDownloadCountHint.getLayoutParams();
if (TextUtils.isEmpty(count)) {
params.width = DisplayUtils.dip2px(6);
params.height = DisplayUtils.dip2px(6);
} else {
params.width = DisplayUtils.dip2px(12);
params.height = DisplayUtils.dip2px(12);
}
mDownloadCountHint.setLayoutParams(params);
} else {
mDownloadCountHint.setVisibility(View.GONE);
}
@ -206,44 +239,25 @@ public abstract class BaseToolBarActivity extends BaseAppCompatActivity implemen
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.menu_download) {
// todo mEntrance set real value
MtaHelper.onEvent("下载管理", "下载管理入口", getActivityNameInChinese());
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(this, "");
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(this, mEntrance);
startActivity(intent);
}
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
return onNavigationIconClicked();
}
return super.onOptionsItemSelected(item);
}
/**
* 提供当前 activity 的中文名 (不重载的话为类名)
*/
public String getActivityNameInChinese() {
return getClass().getSimpleName();
}
protected void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(color);
}
}
protected abstract boolean onNavigationIconClicked();
protected View.OnClickListener provideNavigationItemClickListener() {
return view -> onBackPressed();
}
protected abstract boolean showDownloadMenu();
protected boolean showDownloadMenu() {
return false;
}
@Override
public void hideToolbar(boolean isHide) {
if (mToolbarContainer != null) {
mToolbarContainer.setVisibility(isHide ? View.GONE : View.VISIBLE);
}
}
}

View File

@ -1,12 +1,13 @@
package com.gh.base.fragment;
import android.app.Dialog;
import androidx.lifecycle.Lifecycle;
import android.os.Bundle;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.fragment.app.DialogFragment;
import android.view.KeyEvent;
import androidx.lifecycle.Lifecycle;
import com.gh.common.util.ClickUtils;
import com.gh.gamecenter.R;
@ -27,7 +28,7 @@ public class BaseDialogFragment extends DialogFragment {
final Dialog dialog = new Dialog(getActivity(), R.style.DialogWindowTransparent);
dialog.setCanceledOnTouchOutside(false);
dialog.setOnKeyListener((dialog1, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK && ClickUtils.isFastDoubleClick()) { //会多次响应??
if (keyCode == KeyEvent.KEYCODE_BACK && !ClickUtils.isFastDoubleClick()) {
return onBack();
}
return false;

View File

@ -9,17 +9,12 @@ 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.lifecycle.Lifecycle;
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;
@ -31,12 +26,21 @@ 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 androidx.recyclerview.widget.RecyclerView;
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;
@ -54,7 +58,7 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
protected boolean isEverPause;
@NonNull
protected String mEntrance;
protected String mEntrance = "";
protected final Handler mBaseHandler = new BaseFragment.BaseHandler(this);
@ -140,9 +144,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
@ -253,4 +303,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

@ -10,13 +10,20 @@
package com.gh.base.fragment;
import android.os.Bundle;
import androidx.annotation.IdRes;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Checkable;
import com.gh.gamecenter.fragment.MainWrapperFragment;
import java.util.List;
import androidx.annotation.IdRes;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
/**
* ViewPager 配合ViewGroup Checkable实现双切换<br/>
@ -31,6 +38,8 @@ public abstract class BaseFragment_ViewPager_Checkable extends BaseFragment_View
protected ViewGroup mCheckableGroup;
private int mLastPosition = MainWrapperFragment.INDEX_HOME;
@IdRes
protected abstract int getCheckableGroupId();
@ -68,6 +77,33 @@ public abstract class BaseFragment_ViewPager_Checkable extends BaseFragment_View
@Override
public void onPageSelected(int index) {
onPageChanged(index);
try {
// 补充Viewpager Fragment的生命周期 先调用旧选中 fragment 的 onPause 再当前的 onResume
if (mFragmentsList.size() > mLastPosition) {
Fragment fragment = mFragmentsList.get(mLastPosition);
fragment.onPause();
FragmentManager childFragmentManager = fragment.getChildFragmentManager();
List<Fragment> fragments = childFragmentManager.getFragments();
for (Fragment childFragment : fragments) {
childFragment.onPause();
}
}
if (mFragmentsList.size() > index) {
Fragment fragment = mFragmentsList.get(index);
fragment.onResume();
FragmentManager childFragmentManager = fragment.getChildFragmentManager();
List<Fragment> fragments = childFragmentManager.getFragments();
for (Fragment childFragment : fragments) {
childFragment.onResume();
}
}
mLastPosition = index;
} catch (Exception ignore) {
}
}
@Override

View File

@ -0,0 +1,164 @@
package com.gh.base.fragment
import android.os.Bundle
import com.gh.gamecenter.normal.NormalFragment
import com.lightgame.utils.Utils
/**
* 懒加载(支持多层嵌套)
*/
abstract class BaseLazyFragment : NormalFragment() {
private var mIsFirstVisible = true
private var isViewCreated = false
protected var isSupportVisible = false
/**
* 用于分发可见时间的时候获取 父fragment 是否隐藏
*
* @return true fragment 不可见, false 父 fragment 可见
*/
private val isParentInvisible: Boolean
get() {
val parentFragment = parentFragment
return if (parentFragment is BaseLazyFragment) {
val fragment = parentFragment as BaseLazyFragment?
!fragment!!.isSupportVisible
} else {
false
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
// 对于默认 tab 和 间隔 checked tab 需要等到 isViewCreated = true 后才可以通过此通知用户可见
// 这种情况下第一次可见不是在这里通知 因为 isViewCreated = false 成立,等从别的界面回到这里后会使用 onFragmentResume 通知可见
// 对于非默认 tab mIsFirstVisible = true 会一直保持到选择则这个 tab 的时候,因为在 onActivityCreated 会返回 false
if (isViewCreated) {
if (isVisibleToUser && !isSupportVisible) {
dispatchUserVisibleHint(true)
} else if (!isVisibleToUser && isSupportVisible) {
dispatchUserVisibleHint(false)
}
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
isViewCreated = true
// !isHidden() 默认为 true 在调用 hide show 的时候可以使用
if (!isHidden && userVisibleHint) {
dispatchUserVisibleHint(true)
}
}
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (hidden) {
dispatchUserVisibleHint(false)
} else {
dispatchUserVisibleHint(true)
}
}
override fun onResume() {
super.onResume()
if (!mIsFirstVisible) {
if (!isHidden && !isSupportVisible && userVisibleHint) {
dispatchUserVisibleHint(true)
}
}
}
override fun onPause() {
super.onPause()
// 当前 Fragment 包含子 Fragment 的时候 dispatchUserVisibleHint 内部本身就会通知子 Fragment 不可见
// 子 fragment 走到这里的时候自身又会调用一遍
if (isSupportVisible && userVisibleHint) {
dispatchUserVisibleHint(false)
}
}
/**
* 统一处理 显示隐藏
*
* @param visible
*/
private fun dispatchUserVisibleHint(visible: Boolean) {
//当前 Fragment 是 child 时候 作为缓存 Fragment 的子 fragment getUserVisibleHint = true
//但当父 fragment 不可见所以 currentVisibleState = false 直接 return 掉
// 这里限制则可以限制多层嵌套的时候子 Fragment 的分发
if (visible && isParentInvisible) return
//此处是对子 Fragment 不可见的限制,因为 子 Fragment 先于父 Fragment回调本方法 currentVisibleState 置位 false
// 当父 dispatchChildVisibleState 的时候第二次回调本方法 visible = false 所以此处 visible 将直接返回
if (isSupportVisible == visible) {
return
}
isSupportVisible = visible
if (visible) {
if (mIsFirstVisible && view != null) {
mIsFirstVisible = false
onFragmentFirstVisible()
}
onFragmentResume()
dispatchChildVisibleState(true)
} else {
dispatchChildVisibleState(false)
onFragmentPause()
}
}
/**
* 当前 Fragment 是 child 时候 作为缓存 Fragment 的子 fragment 的唯一或者嵌套 VP 的第一 fragment 时 getUserVisibleHint = true
* 但是由于父 Fragment 还未进入可见状态所以自身也是不可见的, 这个方法可以存在是因为庆幸的是 父 fragment 的生命周期回调总是先于子 Fragment
* 所以在父 fragment 设置完成当前不可见状态后,需要通知子 Fragment 我不可见,你也不可见,
*
*
* 因为 dispatchUserVisibleHint 中判断了 isParentInvisible 所以当 子 fragment 走到了 onActivityCreated 的时候直接 return 掉了
*
*
* 当真正的外部 Fragment 可见的时候,走 setVisibleHint (VP 中)或者 onActivityCreated (hide show) 的时候
* 从对应的生命周期入口调用 dispatchChildVisibleState 通知子 Fragment 可见状态
*
* @param visible
*/
private fun dispatchChildVisibleState(visible: Boolean) {
val childFragmentManager = childFragmentManager
val fragments = childFragmentManager.fragments
if (!fragments.isEmpty()) {
for (child in fragments) {
if (child is BaseLazyFragment && !child.isHidden() && child.getUserVisibleHint()) {
child.dispatchUserVisibleHint(visible)
}
}
}
}
open fun onFragmentFirstVisible() {
//ULog.e("对用户第一次可见")
}
open fun onFragmentResume() {
//ULog.e("对用户可见")
}
open fun onFragmentPause() {
//ULog.e("对用户不可见")
}
override fun onDestroyView() {
super.onDestroyView()
isViewCreated = false
mIsFirstVisible = true
}
}

View File

@ -0,0 +1,152 @@
package com.gh.base.fragment
import android.content.Intent
import android.graphics.Typeface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.CheckedTextView
import android.widget.TextView
import androidx.fragment.app.Fragment
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.halo.assistant.HaloApp
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)
}
override fun onFragmentFirstVisible() {
super.onFragmentFirstVisible()
initFragmentList(mFragmentsList)
initTabTitleList(mTabTitleList)
mViewPager.offscreenPageLimit = mFragmentsList.size
mViewPager.addOnPageChangeListener(this)
mViewPager.adapter = 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 = createDefaultTabCustomView(tabTitle)
tab.customView = tabView
}
initTabStyle(mTabLayout, mCheckedIndex)
}
open fun initTabStyle(tabLayout: TabLayout?, currentItem: Int) { // 默认选择addOnTabSelectedListener不会回调
val tabCount = tabLayout!!.tabCount
if (tabCount > 0) {
val tab = tabLayout.getTabAt(currentItem)
if (tab != null) updateTabStyle(tab, true)
}
tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
updateTabStyle(tab, true)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
updateTabStyle(tab, false)
}
override fun onTabReselected(tab: TabLayout.Tab) {
updateTabStyle(tab, true)
}
})
}
open fun updateTabStyle(tab: TabLayout.Tab, isChecked: Boolean) {
val tabView = tab.customView
if (tabView == null) {
Utils.log("TabLayout->Tab样式不是通用样式,请检查")
return
}
val tabTitle: TextView?
tabTitle = if (tabView is TextView) {
tabView
} else {
tabView.findViewById(R.id.tab_title)
}
if (tabTitle == null) {
Utils.log("TabLayout->Tab样式不是通用样式,请检查")
return
}
tabTitle.typeface = if (isChecked) Typeface.DEFAULT_BOLD else Typeface.DEFAULT
}
// 如果不设置View的话无法动态设置字体样式
open fun createDefaultTabCustomView(title: String?): View {
val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item, null)
val tabTitle = view.findViewById<View>(R.id.tab_title)
if (tabTitle is CheckedTextView) {
tabTitle.text = title
}
return view
}
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

@ -2,14 +2,28 @@ package com.gh.common
import android.os.Handler
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.Executor
import java.util.concurrent.Executors
/**
* APP 线程池管理类
*
* [ioExecutor] 是一个最大线程数固定的线程池,较为繁重的 IO 任务可以交给它
* [uiExecutor] 是主线程的包裹,需要切换至主线程执行可以用它
* [lightWeightIoExecutor] 是一个单线程的线程池,轻量级且需要保证同一线程的 IO 任务可以交给它
*
*/
object AppExecutor {
@JvmStatic
var ioExecutor = Executors.newSingleThreadExecutor()
val uiExecutor by lazy { MainThreadExecutor() }
@JvmStatic
var uiExecutor = MainThreadExecutor()
val lightWeightIoExecutor by lazy { Executors.newSingleThreadExecutor() }
@JvmStatic
val ioExecutor = Executors.newCachedThreadPool() // 用 by lazy 可能影响初始化速度
class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())
@ -24,8 +38,12 @@ object AppExecutor {
}
}
fun runOnIoThread(f: () -> Unit) {
AppExecutor.ioExecutor.execute(f)
fun runOnIoThread(isLightWeightTask: Boolean = false, f: () -> Unit) {
if (isLightWeightTask) {
AppExecutor.lightWeightIoExecutor.execute(f)
} else {
AppExecutor.ioExecutor.execute(f)
}
}
fun runOnUiThread(f: () -> Unit) {

View File

@ -1,15 +1,31 @@
package com.gh.common
import android.annotation.SuppressLint
import android.content.Context
import android.webkit.JavascriptInterface
import androidx.annotation.Keep
import com.gh.base.CurrentActivityHolder
import com.gh.common.util.MtaHelper
import com.gh.common.util.toObject
import com.gh.common.util.*
import com.gh.gamecenter.BuildConfig
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
import com.gh.gamecenter.room.AppDatabase
import com.gh.gamecenter.user.LoginTag
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.JSONObject
import retrofit2.HttpException
import wendu.dsbridge.CompletionHandler
class DefaultJsApi {
class DefaultJsApi(var context: Context) {
@JavascriptInterface
fun isGhzs(msg: Any): String {
@ -28,6 +44,94 @@ class DefaultJsApi {
MtaHelper.onEvent(mtaEvent.name, mtaEvent.key, mtaEvent.value)
}
@JavascriptInterface
fun getUserInfo(msg: Any): String {
return UserManager.getInstance().userInfoEntity.toJson()
}
@JavascriptInterface
fun getUserToken(msg: Any): String {
return if (UserManager.getInstance().isLoggedIn) UserManager.getInstance().loginTokenEntity.accessToken.value else ""
}
@JavascriptInterface
fun login(msg: Any) {
val intent = LoginActivity.getIntent(context, "浏览器")
context.startActivity(intent)
}
@JavascriptInterface
fun refreshUserInfoBadge(msg: Any) {
val userInfoEntity = UserManager.getInstance().userInfoEntity
if (msg.toString().isNotEmpty()) {
val badge = msg.toString().toObject() ?: Badge()
userInfoEntity.badge = badge
} else {
userInfoEntity.badge = null
}
UserManager.getInstance().userInfoEntity = userInfoEntity
AppDatabase.getInstance(context).userInfoDao().updateUserInfo(userInfoEntity)
}
@JavascriptInterface
fun getChannel(msg: Any): String {
return HaloApp.getInstance().channel
}
@JavascriptInterface
fun getAppVersion(msg: Any): String {
return BuildConfig.VERSION_NAME
}
@JavascriptInterface
fun bindWechat(msg: Any, handler: CompletionHandler<Any>) {
context.ifLogin("浏览器") {
LoginHelper.loginWithWechat(object : LoginHelper.LoginCallback {
@SuppressLint("CheckResult")
override fun onLoginSuccess(loginType: LoginTag, jsonContent: JSONObject) {
val wechatLoginInfoMap = hashMapOf<String, String>()
wechatLoginInfoMap["openid"] = jsonContent.getString("openid")
wechatLoginInfoMap["unionid"] = jsonContent.getString("unionid")
wechatLoginInfoMap["access_token"] = jsonContent.getString("access_token")
wechatLoginInfoMap["refresh_token"] = jsonContent.getString("refresh_token")
RetrofitManager.getInstance(HaloApp.getInstance().application)
.api
.postBindWechat(wechatLoginInfoMap.createRequestBody())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : BiResponse<ResponseBody>() {
override fun onSuccess(data: ResponseBody) {
handler.complete(true)
}
override fun onFailure(exception: Exception) {
handler.complete(false)
if (exception is HttpException) {
ErrorHelper.handleError(HaloApp.getInstance().application, exception.response().errorBody()?.string())
}
}
})
}
override fun onLoginFailure(loginType: LoginTag, error: String) {
handler.complete(false)
}
})
}
}
@JavascriptInterface
fun copyText(msg: Any) {
msg.toString().copyTextAndToast()
}
@JavascriptInterface
fun startApp(msg: Any) {
val packageName = msg.toString()
PackageUtils.launchApplicationByPackageName(HaloApp.getInstance().application, packageName)
}
@JavascriptInterface
fun openImage(event: Any) {
@ -47,9 +151,6 @@ class DefaultJsApi {
context?.startActivity(ViewImageActivity.getBase64ViewImageIntent(context, true))
}
@Keep
internal data class MtaEvent(var name: String = "", var key: String = "", var value: String = "")
@Keep
internal data class ImageEvent(var imageList: ArrayList<String> = arrayListOf(), var position: Int = 0)

View File

@ -4,15 +4,18 @@ 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.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.GameDetailActivity
import com.gh.gamecenter.LibaoDetailActivity
import com.gh.gamecenter.NewsDetailActivity
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.*
import com.gh.gamecenter.entity.CommunityEntity
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 DefaultWebViewUrlHandler {
@ -33,7 +36,7 @@ object DefaultWebViewUrlHandler {
when (host) {
"article" -> context.startActivity(NewsDetailActivity.getIntentById(context, id, entrance))
"game" -> GameDetailActivity.startGameDetailActivity(context, id, entrance)
"game" -> GameDetailActivity.startGameDetailActivity(context, id, "libao" == uri.getQueryParameter("to"), entrance)
"column" -> SubjectActivity.startSubjectActivity(context, id, uri.getQueryParameter("name"), false, entrance)
@ -41,7 +44,7 @@ object DefaultWebViewUrlHandler {
"qq" -> try {
DirectUtils.directToQqConversation(context, id)
} catch (e: Exception) {
} catch (e: Throwable) {
Utils.toast(context, "请检查是否已经安装手机QQ")
e.printStackTrace()
}
@ -76,10 +79,18 @@ object DefaultWebViewUrlHandler {
"community" -> {
val community = CommunityEntity()
community.id = id
community.name = uri.getQueryParameter("name")
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" -> {
@ -106,12 +117,80 @@ object DefaultWebViewUrlHandler {
context, typeId, communityId,
entrance, "文章链接")
}
DialogUtils.showLowVersionDialog(context)
}
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, "")
}
EntranceUtils.HOST_VIDEO_MORE -> {
val referer = uri.getQueryParameter("referer") ?: ""
val type = uri.getQueryParameter("type") ?: ""
val act = uri.getQueryParameter("act") ?: ""
val loaction = if (TextUtils.isEmpty(act)) id else VideoDetailContainerViewModel.Location.VIDEO_ACTIVITY.value
directToVideoDetail(context, id, loaction, false, "", entrance, "", referer, type, act)
}
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, "")
}
else -> DialogUtils.showLowVersionDialog(context)
}
return true
}
if ("http" != uri.scheme && "https" != uri.scheme) return true
return false
}
}

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,34 @@ 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)
// 注册小米、华为和魅族通道
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)
pushAgent.onAppStart() // 开启App统计
//友盟推送
val pushAgent = PushAgent.getInstance(mApplication)
//注册推送服务每次调用register方法都会回调该接口
registerDevice()
//注册推送服务每次调用register方法都会回调该接口
runOnIoThread { registerDevice() }
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,10 +6,11 @@ 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
/**
* 统计用户在当前 Fragment 的停留时间,在 onViewDestroy 或 onDestroy 里获取 elapsedTime 即可,单位为秒
* 统计用户在当前 Fragment/Activity 的停留时间,在 onViewDestroy 或 onDestroy 里获取 elapsedTime 即可,单位为秒
*/
class TimeElapsedHelper(val fragment: Fragment?, val activity: Activity?) {
@ -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

@ -0,0 +1,31 @@
package com.gh.common.avoidcallback;
import android.content.Intent;
public class ActivityResultInfo {
private int resultCode;
private Intent data;
public ActivityResultInfo(int resultCode, Intent data) {
this.resultCode = resultCode;
this.data = data;
}
public int getResultCode() {
return resultCode;
}
public void setResultCode(int resultCode) {
this.resultCode = resultCode;
}
public Intent getData() {
return data;
}
public void setData(Intent data) {
this.data = data;
}
}

View File

@ -0,0 +1,48 @@
package com.gh.common.avoidcallback
import android.content.Intent
import android.os.Bundle
import android.util.SparseArray
import androidx.fragment.app.Fragment
import io.reactivex.Observable
import io.reactivex.subjects.PublishSubject
class AvoidOnResultFragment : Fragment() {
private val mSubjects = SparseArray<PublishSubject<ActivityResultInfo>>()
private val mCallbacks = SparseArray<Callback>()
private var requestCode = 1000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
}
fun startForResult(intent: Intent): Observable<ActivityResultInfo> {
val subject = PublishSubject.create<ActivityResultInfo>()
return subject.doOnSubscribe {
mSubjects.put(requestCode, subject)
startActivityForResult(intent, requestCode)
requestCode++
}
}
fun startForResult(intent: Intent, callback: Callback) {
mCallbacks.put(requestCode, callback)
startActivityForResult(intent, requestCode)
requestCode++
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val subject = mSubjects.get(requestCode)
if (subject != null) {
subject.onNext(ActivityResultInfo(resultCode, data))
subject.onComplete()
}
mSubjects.remove(requestCode)
val callback = mCallbacks.get(requestCode)
callback?.onActivityResult(resultCode, data)
mCallbacks.remove(requestCode)
}
}

View File

@ -0,0 +1,64 @@
package com.gh.common.avoidcallback
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import io.reactivex.Observable
class AvoidOnResultManager {
val TAG = "AvoidOnResultManager"
private var mAvoidOnResultFragment: AvoidOnResultFragment
private constructor(activity: AppCompatActivity) {
mAvoidOnResultFragment = getAvoidOnResultFragment(activity)
}
private constructor(fragment: Fragment) : this(fragment.activity as AppCompatActivity)
companion object {
fun getInstance(activity: AppCompatActivity): AvoidOnResultManager {
return AvoidOnResultManager(activity)
}
fun getInstance(fragment: Fragment): AvoidOnResultManager {
return AvoidOnResultManager(fragment)
}
}
private fun getAvoidOnResultFragment(activity: AppCompatActivity): AvoidOnResultFragment {
var avoidOnResultFragment = findAvoidOnResultFragment(activity)
if (avoidOnResultFragment == null) {
avoidOnResultFragment = AvoidOnResultFragment()
val fragmentManager = activity.supportFragmentManager
fragmentManager
.beginTransaction()
.add(avoidOnResultFragment, TAG)
.commitAllowingStateLoss()
fragmentManager.executePendingTransactions()
}
return avoidOnResultFragment
}
private fun findAvoidOnResultFragment(activity: AppCompatActivity): AvoidOnResultFragment? {
return activity.supportFragmentManager.findFragmentByTag(TAG) as? AvoidOnResultFragment
}
fun startForResult(intent: Intent, callback: Callback) {
mAvoidOnResultFragment.startForResult(intent, callback)
}
fun startForResult(clazz: Class<*>, callback: Callback) {
val intent = Intent(mAvoidOnResultFragment.activity, clazz)
mAvoidOnResultFragment.startForResult(intent, callback)
}
fun startForResult(intent: Intent): Observable<ActivityResultInfo> {
return mAvoidOnResultFragment.startForResult(intent)
}
fun startForResult(clazz: Class<*>): Observable<ActivityResultInfo> {
val intent = Intent(mAvoidOnResultFragment.activity, clazz)
return mAvoidOnResultFragment.startForResult(intent)
}
}

View File

@ -0,0 +1,7 @@
package com.gh.common.avoidcallback
import android.content.Intent
interface Callback {
fun onActivityResult(resultCode: Int, data: Intent?)
}

View File

@ -9,20 +9,28 @@ import androidx.annotation.Nullable;
import com.gh.common.util.GsonUtils;
import com.gh.common.util.PackageHelper;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.SPUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.SuggestionActivity;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.EventBus;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
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;
/**
* 需要配置的请使用{@link PreferenceManager#getDefaultSharedPreferences(Context)}
@ -40,6 +48,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";
@ -169,6 +179,9 @@ public class Config {
getPreferences().edit().putString(SETTINGS_KEY, GsonUtils.toJson(settingsEntity)).apply();
mSettingsEntity = settingsEntity;
// 更新 FIX_ARTICLE_KEY 状态
mSettingsEntity.showArticleEntrance();
// 加载完设置后刷新下
PackageHelper.initList();
}
@ -222,6 +235,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());
@ -232,4 +249,29 @@ public class Config {
editor.putBoolean(Config.FIX_PLUGIN_KEY, true);
editor.apply();
}
public static void getGhzsSettings() {
String channel = HaloApp.getInstance().getChannel();
RetrofitManager.getInstance(HaloApp.getInstance().getApplication())
.getApi().getSettings(PackageUtils.getVersionName(), channel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<SettingsEntity>() {
@Override
public void onResponse(SettingsEntity response) {
Config.setSettings(response);
// 意见反馈
SharedPreferences.Editor edit = getPreferences().edit();
edit.putString(SuggestionActivity.SUGGESTION_HINT_TYPE,
GsonUtils.toJson(response.getSuggestion()));
edit.apply();
if (!getPreferences().getBoolean(Config.FIX_DOWNLOAD_KEY, false) && Config.isShow()) {
getPreferences().edit().putBoolean(Config.FIX_DOWNLOAD_KEY, true).apply();
}
EventBus.getDefault().post(new EBReuse("Refresh"));
}
});
}
}

View File

@ -1,5 +1,7 @@
package com.gh.common.constant;
import com.gh.common.util.PackageUtils;
public class Constants {
public static final int SEND_NEWS_FEEDBACK = 0x126;
@ -16,20 +18,74 @@ public class Constants {
public static final String USER_INFO_KEY = "userInfoKey";
public static final String DEVICE_KEY = "deviceKey";
public static final String HAS_REQUESTED_NOTIFICATION_PERMISSIONS = "has_requested_notification_permissions";
public static final String SHOULD_SHOW_VIDEO_MOBILE_WARNING = "should_show_video_mobile_warning";
public static final String GAME_DETAIL_COME_IN = "game_detail_come_in"; // 从游戏详情进入
public static final String XPOSED_INSTALLER_PACKAGE_NAME = "de.robv.android.xposed.installer";
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 SP_SHOWED_NOTIFICATION_HINT = "show_notification_hint";
//引导设置 “通知管理” 引导弹窗
public static final String SP_SHOWED_NOTIFICATION_LOGIN = "show_notification_login_hint";
public static final String SP_SHOWED_NOTIFICATION_QUESTION = "show_notification_question_hint";
public static final String SP_SHOWED_NOTIFICATION_ANSWER = "show_notification_answer_hint";
public static final String SP_SHOWED_NOTIFICATION_ARTICLE = "show_notification_article_hint";
public static final String SP_SHOWED_NOTIFICATION_VIDEO = "show_notification_video_hint";
public static final String SP_SHOWED_NOTIFICATION_RATING = "show_notification_rating_hint";
// 新版本 也要触发一次“通知管理” 引导弹窗
public static final String SP_SHOWED_NOTIFICATION_NEW_VERSION = "show_notification_new_version";
// 今天是否已经触发了 “通知管理” 引导弹窗
public static final String SP_IS_SHOWED_NOTIFICATION_TODAY = "show_is_notification_today";
// v4.0.0已废弃,标记安装的游戏为已玩过弹窗最多取消2次 (https://gitlab.ghzs.com/pm/halo-app-issues/issues/722 调整为版本相关) (不是常量了也放这里好像有点奇怪)
public static final String SP_MARK_INSTALLED_GAME = "mark_installed_game" + PackageUtils.getVersionName();
// 标记安装的游戏为已玩过弹窗(个人主页最多弹一次)
public static final String SP_MARK_INSTALLED_GAME_USER_HOME = "mark_installed_game_user_home" + PackageUtils.getVersionName();
// 标记安装的游戏为已玩过弹窗(我的游戏最多弹一次)
public static final String SP_MARK_INSTALLED_GAME_MY_GAME = "mark_installed_game_my_game" + PackageUtils.getVersionName();
//视频详情滑动引导
public static final String SP_SHOW_SLIDE_GUIDE = "show_slide_guide";
//视频详情点击引导
public static final String SP_SHOW_CLICK_GUIDE = "show_click_guide";
//视频详情双击点赞引导
public static final String SP_SHOW_DOUBLE_CLICK_GUIDE = "show_double_click_guide";
//顶部视频声音状态,重启恢复
public static final String SP_TOP_VIDEO_VOICE = "top_video_voice";
//我的光环提醒设置已读
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 REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
@ -39,6 +95,14 @@ public class Constants {
//输入规则
public static final String INPUT_RULE = "0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ_";
// 微信绑定地址地址
public static final String WECHAT_BIND_ADDRESS_DEV = "https://resource.ghzs.com/page/wechat_dev/index.html#/";
public static final String WECHAT_BIND_ADDRESS = "https://resource.ghzs.com/page/wechat_pro/index.html#/";
// 徽章
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 int DATA_AMOUNT = 20;
@ -54,10 +118,20 @@ public class Constants {
public static final int SEARCH_CD = 5 * 60 * 1000;
//评论 cd间隔
public static final int COMMENT_CD = 60 * 1000;
//我的光环功能分组 cd间隔
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

@ -9,6 +9,7 @@ public class ItemViewType {
public static final int GAME_SLIDE = 1; // 滚动图布局
public static final int GAME_NORMAL = 2; // 正常游戏布局
public static final int GAME_SUBJECT = 19;
public static final int GAME_SUBJECT_SLIDE = 26;
public static final int GAME_TEST = 3; // 测试游戏布局
public static final int GAME_IMAGE = 4; // 游戏大图布局
public static final int NEWS_HEADER = 5; // 新闻头部布局

View File

@ -1,7 +1,11 @@
package com.gh.common.databind;
import android.content.Intent;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@ -12,8 +16,12 @@ import android.widget.TextView;
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;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
@ -21,24 +29,31 @@ import com.gh.common.util.DownloadDialogHelper;
import com.gh.common.util.GameUtils;
import com.gh.common.util.GameViewUtils;
import com.gh.common.util.ImageUtils;
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.PackageUtils;
import com.gh.common.util.PermissionHelper;
import com.gh.common.util.PlatformUtils;
import com.gh.common.util.StringUtils;
import com.gh.common.view.DownloadDialog;
import com.gh.common.util.ReservationHelper;
import com.gh.common.view.DownloadProgressBar;
import com.gh.common.view.DrawableView;
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;
import com.gh.gamecenter.baselist.LoadStatus;
import com.gh.gamecenter.databinding.KaifuAddItemBinding;
import com.gh.gamecenter.databinding.KaifuDetailItemRowBinding;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
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;
@ -49,9 +64,12 @@ 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;
@ -183,6 +201,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) {
@ -192,6 +221,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) {
@ -308,8 +371,14 @@ public class BindingAdapters {
}
// 大图下的进度条
@BindingAdapter({"downloadButton", "traceEvent"})
public static void setDownloadButton(DownloadProgressBar progressBar, GameEntity gameEntity, ExposureEvent traceEvent) {
@BindingAdapter({"downloadButton", "traceEvent", "clickCallBack", "entrance", "location"})
public static void setDownloadButton(DownloadProgressBar progressBar,
GameEntity gameEntity,
ExposureEvent traceEvent,
@Nullable View.OnClickListener clickCallBack,
@Nullable String entrance,
@Nullable String location) {
// 判断是否显示按钮
if (gameEntity != null
&& Config.isShowDownload(gameEntity.getId())
@ -320,15 +389,140 @@ public class BindingAdapters {
return;
}
// 点击事件
progressBar.setOnClickListener(v -> {
if (clickCallBack != null) clickCallBack.onClick(v);
switch (progressBar.getDownloadType()) {
case DOWNLOADING_PLUGIN:
case DOWNLOADING_NORMAL:
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(v.getContext(),
gameEntity.getApk().get(0).getUrl(), entrance);
v.getContext().startActivity(intent);
break;
case NONE:
Utils.toast(v.getContext(), "该游戏已关闭下载");
break;
case NORMAL:
case PLUGIN:
if (gameEntity.getApk().size() == 1) {
ApkEntity apk = gameEntity.getApk().get(0);
DownloadDialogHelper.findAvailableDialogAndShow(v.getContext(), gameEntity, apk,
() -> {
CertificationDialog.showCertificationDialog(v.getContext(), gameEntity, () -> {
DialogUtils.showVersionNumberDialog(v.getContext(), gameEntity, () -> {
DialogUtils.checkDownload(v.getContext(), apk.getSize(),
isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location));
});
});
});
} else {
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:
if (gameEntity.getApk().size() == 1) {
DataUtils.onGameLaunchEvent(v.getContext(), gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location);
PackageUtils.launchApplicationByPackageName(v.getContext(), gameEntity.getApk().get(0).getPackageName());
} else {
DownloadDialog.showDownloadDialog(
v.getContext(),
gameEntity,
traceEvent,
entrance,
location + ":" + gameEntity.getName());
}
break;
case INSTALL_PLUGIN:
case INSTALL_NORMAL:
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);
}
}
break;
case RESERVABLE:
CheckLoginUtils.checkLogin(progressBar.getContext(), "", () -> {
PermissionHelper.checkReadPhoneStatePermissionBeforeAction(progressBar.getContext(), () -> {
ReserveDialogFragment dialogFragment = ReserveDialogFragment.getInstance(gameEntity, () -> {
LogUtils.logReservation(gameEntity, traceEvent);
updateReservation(progressBar, gameEntity);
});
dialogFragment.show(((AppCompatActivity) progressBar.getContext()).getSupportFragmentManager(), "reserve");
});
});
break;
case RESERVED:
if ("download".equals(gameEntity.getReserveStatus())) {
ReservationHelper.showDeleteReservationDialog(progressBar.getContext(), () -> {
ReservationHelper.deleteReservation(gameEntity, () -> {
updateReservation(progressBar, gameEntity);
});
});
} else {
ReservationHelper.showCancelReservationDialog(progressBar.getContext(), () -> {
ReservationHelper.cancelReservation(gameEntity, () -> {
updateReservation(progressBar, gameEntity);
});
});
}
break;
case H5_GAME:
LinkEntity linkEntity = gameEntity.getH5Link();
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));
progressBar.getContext().startActivity(i);
break;
}
});
// 显示预约
if (gameEntity.isReservable()) {
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) {
progressBar.setText("预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVABLE);
} else {
progressBar.setText("已预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVED);
}
return;
}
// 显示下载按钮状态
if (gameEntity.getApk().isEmpty() || gameEntity.getDownloadOffStatus() != null) {
LinkEntity h5LinkEntity = gameEntity.getH5Link();
String offStatus = gameEntity.getDownloadOffStatus();
if (offStatus != null && "dialog".equals(offStatus)) {
progressBar.setText("查看");
if (h5LinkEntity != null) {
if ("play".equals(h5LinkEntity.getType())) {
progressBar.setText("开始玩");
} else {
progressBar.setText("查看");
}
progressBar.setDownloadType(DownloadProgressBar.DownloadType.H5_GAME);
} else {
progressBar.setText("暂无下载");
if (offStatus != null && "dialog".equals(offStatus)) {
progressBar.setText("查看");
} else {
progressBar.setText("暂无");
}
progressBar.setDownloadType(DownloadProgressBar.DownloadType.NONE);
}
progressBar.setDownloadType(DownloadProgressBar.DownloadType.NONE);
} else {
String status = GameUtils.getDownloadBtnText(progressBar.getContext(), gameEntity, PluginLocation.only_game);
switch (status) {
@ -382,61 +576,47 @@ public class BindingAdapters {
}
}
}
// 点击事件
progressBar.setOnClickListener(v -> {
switch (progressBar.getDownloadType()) {
case DOWNLOADING_PLUGIN:
case DOWNLOADING_NORMAL:
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(v.getContext(),
gameEntity.getApk().get(0).getUrl(), "(我的光环:我的游戏)");
v.getContext().startActivity(intent);
break;
case NONE:
Utils.toast(v.getContext(), "该游戏已关闭下载");
break;
case NORMAL:
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));
});
} else {
DownloadDialog.getInstance(v.getContext()).showPopupWindow(v, gameEntity,
"(我的光环:我的游戏)", "我的光环-我的游戏:" + gameEntity.getName(), traceEvent);
}
break;
case LAUNCH_OR_OPEN:
if (gameEntity.getApk().size() == 1) {
DataUtils.onGameLaunchEvent(v.getContext(), gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), "我的光环-我的游戏");
PackageUtils.launchApplicationByPackageName(v.getContext(), gameEntity.getApk().get(0).getPackageName());
} else {
DownloadDialog.getInstance(v.getContext()).showPopupWindow(v, gameEntity,
"(我的光环:我的游戏)", "我的光环-我的游戏:" + gameEntity.getName(), traceEvent);
}
break;
case INSTALL_PLUGIN:
case INSTALL_NORMAL:
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.getPath());
}
}
break;
}
});
}
/*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) {
// 显示预约
if (gameEntity.isReservable()) {
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) {
progressBar.setText("预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVABLE);
} else {
progressBar.setText("已预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVED);
}
}
}
// 开始下载
private static void download(DownloadProgressBar progressBar, GameEntity
gameEntity, ExposureEvent traceEvent, boolean isSubscribe) {
private static void download(DownloadProgressBar progressBar,
GameEntity gameEntity,
ExposureEvent traceEvent,
boolean isSubscribe,
String entrance,
String location) {
String str = progressBar.getText();
String method;
if (str.contains("更新")) {
@ -449,17 +629,16 @@ public class BindingAdapters {
ApkEntity apkEntity = gameEntity.getApk().get(0);
String msg = FileUtils.isCanDownload(progressBar.getContext(), apkEntity.getSize());
if (TextUtils.isEmpty(msg)) {
DataUtils.onGameDownloadEvent(progressBar.getContext(), gameEntity.getName(), apkEntity.getPlatform(), "(我的光环:我的游戏)", "下载开始", method);
ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, apkEntity.getPlatform(), traceEvent, ExposureUtils.DownloadType.DOWNLOAD);
DataUtils.onGameDownloadEvent(progressBar.getContext(), gameEntity.getName(), apkEntity.getPlatform(), entrance, "下载开始", method);
DownloadManager.createDownload(progressBar.getContext(),
apkEntity,
gameEntity,
method,
StringUtils.buildString("(我的光环:我的游戏)"), "我的光环-我的游戏:" + gameEntity.getName(),
entrance,
location + gameEntity.getName(),
isSubscribe,
downloadExposureEvent);
traceEvent);
progressBar.setProgress(0);
progressBar.setDownloadType("插件化".equals(method) ?
@ -469,34 +648,41 @@ 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")
public static void isRefreshing(SwipeRefreshLayout layout, LoadStatus status) {
if (status == LoadStatus.INIT_LOADING) {
layout.setRefreshing(true);
} else {
if (status != LoadStatus.INIT_LOADING && status != LoadStatus.LIST_LOADING) {
layout.setRefreshing(false);
}
}
@ -538,4 +724,33 @@ public class BindingAdapters {
mVideoDuration.setVisibility(View.GONE);
}
}
@BindingAdapter({"setGameTags", "setMaxGameTags"})
public static void setGameTags(TextView view, List<TagStyleEntity> tags, int maxTags) {
if (tags == null) {
view.setText("");
return;
}
int showCount = tags.size() > maxTags ? maxTags : tags.size(); // 最多显示3个
StringBuilder content = new StringBuilder();
for (int i = 0; i < showCount; i++) {
TagStyleEntity tag = tags.get(i);
content.append(tag.getName());
if (i != showCount - 1) content.append("/");
}
Spannable span = new SpannableString(content);
int index = 0;
for (int i = 0; i < showCount; i++) {
TagStyleEntity tag = tags.get(i);
int start = index;
int end = start + tag.getName().length() + ((i != showCount - 1) ? 1 : 0);
index = end;
span.setSpan(new ForegroundColorSpan(Color.parseColor("#" + tag.getColor())),
start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
view.setText(span);
}
}

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

@ -38,7 +38,7 @@ class GameOffServiceDialogFragment : BaseTrackableDialogFragment() {
topMargin = DisplayUtils.dip2px(12f)
}
siteTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
siteTv.setTextColor(ContextCompat.getColor(requireContext(), R.color.theme))
siteTv.setTextColor(ContextCompat.getColor(requireContext(), R.color.theme_font))
siteTv.text = site.text
siteTv.paintFlags = siteTv.paintFlags or Paint.UNDERLINE_TEXT_FLAG
siteTv.setOnClickListener {

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

@ -15,6 +15,7 @@ import butterknife.BindView
import butterknife.ButterKnife
import butterknife.OnClick
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
@ -25,6 +26,7 @@ import com.gh.gamecenter.retrofit.RetrofitManager
import com.lightgame.utils.Utils
import io.reactivex.schedulers.Schedulers
import okhttp3.ResponseBody
import org.json.JSONObject
// 预约弹窗
class ReserveDialogFragment : BaseTrackableDialogFragment() {
@ -48,6 +50,7 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
private var mSuccessCallback: SuccessCallback? = null
private var mGame: GameEntity? = null
private var mGameId: String = ""
private var mGameName: String = ""
@ -83,14 +86,15 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
mViewModel.reservation.observeNonNull(this) {
if (it.success) {
showSuccessDialog(it.withMobile)
showSuccessDialog(it.withMobile, it.boundWechat)
mSuccessCallback?.onSuccess()
HistoryHelper.insertGameEntity(mGame!!)
}
}
dialog?.setCanceledOnTouchOutside(true)
}
private fun showSuccessDialog(withMobile: Boolean) {
private fun showSuccessDialog(withMobile: Boolean, boundWechat: Boolean) {
reserveHintTv.text = "游戏预约成功"
reserveContainer.visibility = View.GONE
reserveCompletedContainer.visibility = View.VISIBLE
@ -100,7 +104,7 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
reserveCompletedContentTv.text = dialogConfig?.htmlContent?.fromHtml()
if (dialogConfig?.text.isNullOrEmpty()
|| dialogConfig?.toLinkEntity()?.link.isNullOrEmpty()) {
|| (dialogConfig?.type == "wechat_bind" && boundWechat)) {
customizableBtn.visibility = View.GONE
} else {
customizableBtn.text = dialogConfig?.text
@ -148,6 +152,7 @@ class ReserveDialogFragment : BaseTrackableDialogFragment() {
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
@ -176,7 +181,12 @@ class ReserveViewModel(application: Application) : AndroidViewModel(application)
.subscribeOn(Schedulers.io())
.subscribe(object : BiResponse<ResponseBody>() {
override fun onSuccess(data: ResponseBody) {
reservation.postValue(Reservation(success = true, withMobile = mobile.isNotEmpty()))
var boundWechat = false
tryWithDefaultCatch {
boundWechat = JSONObject(data.string() ?: "").getBoolean("wechat_bind")
}
reservation.postValue(Reservation(success = true, withMobile = mobile.isNotEmpty(), boundWechat = boundWechat))
ReservationRepository.addReservationToMemoryAndRefresh(gameId)
MtaHelper.onEvent("预约游戏", "预约", gameName)
@ -188,6 +198,5 @@ class ReserveViewModel(application: Application) : AndroidViewModel(application)
})
}
class Reservation(var success: Boolean = false, var withMobile: Boolean = false)
class Reservation(var success: Boolean = false, var withMobile: Boolean = false, var boundWechat: Boolean = false)
}

View File

@ -7,13 +7,14 @@ import android.view.KeyEvent
import com.gh.common.util.MtaHelper
import java.util.concurrent.atomic.AtomicBoolean
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)
open class TrackableDialog(context: Context,
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 @@ class TrackableDialog(context: Context,
setOnCancelListener {
if (mIsCanceledByClickOutsideOfDialog.get()) {
MtaHelper.onEvent(mEvent, mKey, mCancelValue ?: "点击空白")
if (!mValue.isNullOrEmpty()) {
MtaHelper.onEvent(mEvent, "点击空白", mValue)
}
}
}
@ -32,6 +36,9 @@ 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 @@ class TrackableDialog(context: Context,
super.show()
if (mLogShowEvent) {
MtaHelper.onEvent(mEvent, mKey, "出现弹窗")
if (!mValue.isNullOrEmpty()) {
MtaHelper.onEvent(mEvent, "出现弹窗", mValue)
}
}
}

View File

@ -1,9 +1,10 @@
package com.gh.common.exposure
import androidx.room.Entity
import androidx.room.PrimaryKey
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
@ -24,17 +25,18 @@ data class ExposureEvent(
@PrimaryKey
val id: String = UUID.randomUUID().toString()) : Parcelable {
companion object {
fun createEvent(gameEntity: GameEntity?, source: List<ExposureSource>, eTrace: List<ExposureEvent>?, event: ExposureType): ExposureEvent {
@JvmStatic
fun createEvent(gameEntity: GameEntity?, source: List<ExposureSource>, eTrace: List<ExposureEvent>? = null, event: ExposureType = ExposureType.EXPOSURE): ExposureEvent {
return ExposureEvent(
payload = ExposureEntity(gameId = gameEntity?.id,
gameName = gameEntity?.name,
gameName = gameEntity?.name?.removeSuffix(Constants.GAME_NAME_DECORATOR),
sequence = gameEntity?.sequence,
platform = gameEntity?.platform,
downloadType = gameEntity?.downloadType,
downloadCompleteType = gameEntity?.downloadCompleteType),
source = source,
eTrace = eTrace,
event = event)
event = event).apply { gameEntity?.exposureEvent = this }
}
}
}

View File

@ -31,10 +31,10 @@ object ExposureManager {
private val loghubHelper = LoghubHelper.getInstance()
// exposureCache 用来过滤掉具有相同 id 的曝光事件,避免重复发送事件
private val exposureCache = FixedSizeLinkedHashSet<String>(100)
private val exposureSet = hashSetOf<ExposureEvent>()
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() }
private val exposureExecutor = Executors.newSingleThreadExecutor()
@JvmStatic
fun init() {
@ -48,7 +48,7 @@ object ExposureManager {
}
fixedRateTimer(name = "ExposureManager-Store-Checker", initialDelay = 500, period = STORE_FORCE_UPLOAD_PERIOD) {
commitSavedExposureEvent(true)
commitSavedExposureEvents(true)
}
}
@ -57,17 +57,19 @@ object ExposureManager {
*/
fun log(event: ExposureEvent) {
exposureExecutor.execute {
if (!exposureCache.contains(event.id)) {
// Catch `android.database.sqlite.SQLiteFullException: database or disk is full` exception.
try {
try {
if (!exposureCache.contains(event.id)) {
// Catch `android.database.sqlite.SQLiteFullException: database or disk is full` exception.
exposureSet.add(event)
exposureDao.insert(event)
exposureCache.add(event.id)
} catch (e: Exception) {
e.printStackTrace()
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
}
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
} catch (e: Exception) {
e.printStackTrace()
}
}
}
@ -78,24 +80,27 @@ object ExposureManager {
fun log(eventList: List<ExposureEvent>) {
exposureExecutor.execute {
for (event in eventList) {
if (!exposureCache.contains(event.id)) {
// Catch `android.database.sqlite.SQLiteFullException: database or disk is full` exception.
try {
try {
if (!exposureCache.contains(event.id)) {
// Catch `android.database.sqlite.SQLiteFullException: database or disk is full` exception.
exposureSet.add(event)
exposureDao.insert(event)
exposureCache.add(event.id)
} catch (e: Exception) {
e.printStackTrace()
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
}
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
} catch (e: Exception) {
e.printStackTrace()
}
}
commitSavedExposureEvent()
commitSavedExposureEvents()
}
}
fun commitSavedExposureEvent(forced: Boolean = false) {
/**
* @param forced Ignore all restrictions.
*/
fun commitSavedExposureEvents(forced: Boolean = false) {
exposureExecutor.execute {
if (exposureSet.size < STORE_SIZE && !forced || exposureSet.size == 0) return@execute

View File

@ -6,4 +6,4 @@ import kotlinx.android.parcel.Parcelize
@Keep
@Parcelize
data class ExposureSource(var k: String, var v: String): Parcelable
data class ExposureSource(var k: String, var v: String = ""): Parcelable

View File

@ -1,7 +1,12 @@
package com.gh.common.exposure
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
import com.gh.gamecenter.entity.GameEntity
import com.halo.assistant.HaloApp
import java.util.*
object ExposureUtils {
@ -12,6 +17,11 @@ 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.platform = platform
gameEntity.downloadType = downloadType.toString()
val exposureEvent = ExposureEvent.createEvent(gameEntity = gameEntity,
@ -36,7 +46,28 @@ object ExposureUtils {
eTrace = ExposureTraceUtils.appendTrace(traceEvent),
event = ExposureType.DOWNLOAD_COMPLETE)
ExposureManager.log(exposureEvent)
ExposureManager.commitSavedExposureEvent(forced = true)
ExposureManager.commitSavedExposureEvents(forced = true)
}
@JvmStatic
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.PLUGIN_DOWNLOAD
}
} else {
DownloadType.DOWNLOAD
}
}
enum class DownloadType {

View File

@ -17,6 +17,7 @@ data class Meta(
val network: String? = "",
val os: String? = "",
val gid: String? = "",
val oaid: String? = "",
val channel: String? = "",
val appVersion: String? = "",
val userId: String? = "",

View File

@ -35,6 +35,7 @@ object MetaUtil {
network = getNetwork(),
os = getOS(),
gid = HaloApp.getInstance().gid,
oaid = HaloApp.getInstance().oaid,
channel = getChannel(),
appVersion = BuildConfig.VERSION_NAME,
userId = UserManager.getInstance().userId,

View File

@ -7,17 +7,15 @@ import androidx.room.TypeConverters
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.gh.gamecenter.entity.HistoryGameEntity
import com.gh.gamecenter.entity.MyVideoEntity
import com.gh.gamecenter.entity.NewsEntity
import com.gh.gamecenter.qa.entity.AnswerEntity
import com.gh.gamecenter.qa.entity.ArticleEntity
import com.gh.gamecenter.room.converter.*
import com.gh.gamecenter.room.dao.AnswerHistoryDao
import com.gh.gamecenter.room.dao.ArticleHistoryDao
import com.gh.gamecenter.room.dao.GameDao
import com.gh.gamecenter.room.dao.NewsHistoryDao
import com.gh.gamecenter.room.dao.*
import com.halo.assistant.HaloApp
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class], version = 4, exportSchema = false)
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class], version = 5, exportSchema = false)
@TypeConverters(CountConverter::class,
CommunityConverter::class,
TimeConverter::class,
@ -33,6 +31,7 @@ abstract class HistoryDatabase : RoomDatabase() {
abstract fun articleDao(): ArticleHistoryDao
abstract fun newsDao(): NewsHistoryDao
abstract fun gameDao(): GameDao
abstract fun videoHistoryDao(): VideoHistoryDao
companion object {
@ -49,10 +48,17 @@ abstract class HistoryDatabase : RoomDatabase() {
}
}
val MIGRATION_4_5: Migration = object : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE MyVideoEntity(id TEXT NOT NULL PRIMARY KEY,poster TEXT NOT NULL DEFAULT '',url TEXT NOT NULL DEFAULT '',vote INTEGER NOT NULL DEFAULT 0,length INTEGER NOT NULL DEFAULT 0,time INTEGER NOT NULL DEFAULT 0,videoStreamRecord INTEGER NOT NULL DEFAULT 0,status TEXT NOT NULL 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)
.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,32 @@ 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.icon
historyGame.name = updateEntity.name
historyGame.tagStyle = updateEntity.tagStyle
historyGame.tag = updateEntity.tag
return historyGame
}
private fun convertGameEntityToHistoryGameEntity(gameEntity: GameEntity): HistoryGameEntity {
val historyGame = HistoryGameEntity()
@ -70,6 +89,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

@ -2,16 +2,12 @@ package com.gh.common.im
import android.app.Activity
import android.content.Context
import android.os.Build
import androidx.core.view.ViewCompat
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.KeyCharacterMap
import android.view.KeyEvent
import android.view.View
import android.view.ViewConfiguration
import android.widget.RelativeLayout
import androidx.core.view.ViewCompat
import com.gh.common.util.DisplayUtils
import com.gh.gamecenter.R
import kotlinx.android.synthetic.main.view_im_hint.view.*
@ -32,7 +28,7 @@ class ImHintView @JvmOverloads constructor(context: Context, attrs: AttributeSet
val lp = ivContainer.layoutParams as RelativeLayout.LayoutParams
lp.setMargins(0, 0, dp2px(30f), dp2px(106f) + retrieveNavigationHeight())
lp.setMargins(0, 0, dp2px(30f), dp2px(106f) + DisplayUtils.retrieveNavigationHeight(context))
}
fun showDot(show: Boolean) {
@ -46,39 +42,4 @@ class ImHintView @JvmOverloads constructor(context: Context, attrs: AttributeSet
private fun dp2px(dp: Float): Int {
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt()
}
private fun hasSoftKeys(): Boolean {
if (context !is Activity) return false
val hasSoftwareKeys: Boolean
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
val d = (context as Activity).windowManager.defaultDisplay
val realDisplayMetrics = DisplayMetrics()
d.getRealMetrics(realDisplayMetrics)
val realHeight = realDisplayMetrics.heightPixels
val realWidth = realDisplayMetrics.widthPixels
val displayMetrics = DisplayMetrics()
d.getMetrics(displayMetrics)
val displayHeight = displayMetrics.heightPixels
val displayWidth = displayMetrics.widthPixels
hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0
} else {
val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey()
val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK)
hasSoftwareKeys = !hasMenuKey && !hasBackKey
}
return hasSoftwareKeys
}
private fun retrieveNavigationHeight(): Int {
val resources = context.resources
val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
return if (resourceId > 0 && hasSoftKeys()) resources.getDimensionPixelSize(resourceId) else 0
}
}

View File

@ -4,12 +4,13 @@ import android.app.Activity
import android.app.NotificationManager
import android.content.Context
import com.gh.base.CurrentActivityHolder
import com.gh.common.runOnIoThread
import com.gh.common.util.SPUtils
import com.gh.common.util.tryWithDefaultCatch
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.HelpAndFeedbackActivity
import com.gh.gamecenter.MainActivity
import com.gh.gamecenter.MessageActivity
import com.gh.gamecenter.SuggestSelectActivity
import com.gh.gamecenter.manager.UserManager
import com.halo.assistant.HaloApp
import com.m7.imkfsdk.KfStartHelper
@ -69,12 +70,12 @@ object ImManager {
}
@JvmStatic
fun startChatActivity(activity: Activity) {
fun startChatActivity(activity: Activity, inputContent: String? = "", requestCode: Int? = null) {
if (!UserManager.getInstance().userId.isNullOrEmpty()) {
try {
SPUtils.setBoolean(SP_FLOATING_WINDOW_DOT_KEY + UserManager.getInstance().userId, false)
shouldShowFloatingWindowDot = false
val chatHelper = KfStartHelper(activity, UserManager.getInstance().userInfoEntity.icon)
val chatHelper = KfStartHelper(activity, UserManager.getInstance().userInfoEntity.icon, inputContent, requestCode)
chatHelper.initSdkChat(
ImReceiver.UNIQUE_BROADCAST_ACTION,
IM_KEY,
@ -128,7 +129,7 @@ object ImManager {
@JvmStatic
fun sendFeedbackMessage(message: String) {
val fromToMessage = IMMessage.createTxtMessage(message)
HaloApp.getInstance().mainExecutor.execute {
runOnIoThread {
tryWithDefaultCatch {
IMChat.getInstance().sendMessage(fromToMessage, object : ChatListener {
override fun onProgress(p0: Int) {}
@ -152,7 +153,7 @@ object ImManager {
private fun isActivityValid(activity: Activity): Boolean {
return when (activity) {
is MainActivity -> true
is SuggestSelectActivity -> true
is HelpAndFeedbackActivity -> true
is MessageActivity -> true
else -> false
}

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

@ -0,0 +1,21 @@
package com.gh.common.loghub
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = [LoghubEvent::class], version = 1, exportSchema = false)
abstract class LoghubDatabase : RoomDatabase() {
companion object {
private const val DATABASE = "gh_loghub_database"
fun buildDatabase(context: Context): LoghubDatabase {
return Room.databaseBuilder(context, LoghubDatabase::class.java, DATABASE)
.fallbackToDestructiveMigration()
.build()
}
}
abstract fun logHubEventDao(): LoghubEventDao
}

View File

@ -0,0 +1,17 @@
package com.gh.common.loghub
import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.android.parcel.Parcelize
import java.util.*
@Keep
@Parcelize
@Entity(tableName = "loghubEvent")
data class LoghubEvent(@PrimaryKey
val id: String = UUID.randomUUID().toString(),
var time: String,
var content: String,
var logStore: String) : Parcelable

View File

@ -0,0 +1,18 @@
package com.gh.common.loghub
import androidx.room.*
@Dao
interface LoghubEventDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertMany(eventList: List<LoghubEvent>)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(event: LoghubEvent)
@Query("SELECT * FROM LoghubEvent")
fun getAll(): List<LoghubEvent>
@Delete
fun deleteMany(eventList: List<LoghubEvent>)
}

View File

@ -0,0 +1,96 @@
package com.gh.common.loghub
import android.app.Application
import com.aliyun.sls.android.sdk.model.Log
import com.aliyun.sls.android.sdk.model.LogGroup
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 by lazy { hashSetOf<LoghubEvent>() }
private val loghubEventExecutor by lazy { Executors.newSingleThreadExecutor() }
private val loghubEventDao by lazy { LoghubDatabase.buildDatabase(mApplication).logHubEventDao() }
@JvmStatic
fun init(application: Application) {
mApplication = application
loghubEventExecutor.execute {
val eventList = loghubEventDao.getAll()
loghubEventSet.addAll(eventList)
}
fixedRateTimer(name = "Loghub-Event-Checker", initialDelay = 1000, period = STORE_FORCE_UPLOAD_INTERVAL) {
commitSavedLoghubEvents()
}
}
@JvmStatic
fun log(logJson: JSONObject, logStore: String, forcedUpload: Boolean) {
loghubEventExecutor.execute {
try {
val event = LoghubEvent(time = (System.currentTimeMillis() / 1000L).toString(), content = logJson.toString(), 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() {
loghubEventExecutor.execute {
if (loghubEventSet.isEmpty()) return@execute
val exposureList = loghubEventSet.toList()
createLogGroupAndUpload()
loghubEventSet.removeAll(exposureList)
loghubEventDao.deleteMany(exposureList)
}
}
private fun createLogGroupAndUpload() {
val logGroupHashMap = hashMapOf<String, LogGroup>()
for (event in loghubEventSet) {
if (!logGroupHashMap.containsKey(event.logStore)) {
logGroupHashMap[event.logStore] = LogGroup("sls android", "no ip")
}
val log = Log()
// 特殊处理以下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)
}
for ((logStore, logGroup) in logGroupHashMap) {
uploadLogGroup(logGroup, logStore)
}
}
}

View File

@ -1,18 +1,19 @@
package com.gh.common.notifier
import android.animation.*
import android.app.Activity
import android.content.Context
import android.graphics.Path
import android.os.Build
import android.text.TextUtils
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.Log
import android.util.TypedValue
import android.view.*
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.core.view.ViewCompat
import com.gh.common.util.DisplayUtils
import com.gh.common.util.ImageUtils
import com.gh.common.util.doOnEnd
import com.gh.common.util.doOnStart
@ -74,7 +75,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
verticalAnimationOffset = dp2px(100F)
navigationHeight = retrieveNavigationHeight()
navigationHeight = DisplayUtils.retrieveNavigationHeight(context)
rightToLeftPath = Path()
leftToRightPath = Path()
@ -290,41 +291,6 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt()
}
private fun hasSoftKeys(): Boolean {
if (context !is Activity) return false
val hasSoftwareKeys: Boolean
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
val d = (context as Activity).windowManager.defaultDisplay
val realDisplayMetrics = DisplayMetrics()
d.getRealMetrics(realDisplayMetrics)
val realHeight = realDisplayMetrics.heightPixels
val realWidth = realDisplayMetrics.widthPixels
val displayMetrics = DisplayMetrics()
d.getMetrics(displayMetrics)
val displayHeight = displayMetrics.heightPixels
val displayWidth = displayMetrics.widthPixels
hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0
} else {
val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey()
val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK)
hasSoftwareKeys = !hasMenuKey && !hasBackKey
}
return hasSoftwareKeys
}
private fun retrieveNavigationHeight(): Int {
val resources = context.resources
val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
return if (resourceId > 0 && hasSoftKeys()) resources.getDimensionPixelSize(resourceId) else 0
}
interface OnShowNotificationListener {
fun onShow()
}

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

@ -2,12 +2,16 @@ package com.gh.common.util;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import com.gh.common.avoidcallback.Callback;
import com.gh.gamecenter.LoginActivity;
import com.gh.gamecenter.manager.UserManager;
import com.lightgame.utils.Utils;
import org.jetbrains.annotations.Nullable;
/**
* Created by khy on 28/06/17.
*/
@ -19,8 +23,34 @@ public class CheckLoginUtils {
if (listener != null) Utils.toast(context, "需要登录");
LogUtils.login("dialog", null, entrance);
LogUtils.login("activity", null, entrance);
Intent intent = LoginActivity.getIntent(context, entrance);
context.startActivity(intent);
// 有可能App未启动
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putString(EntranceUtils.KEY_TO, LoginActivity.class.getName());
EntranceUtils.jumpActivity(context, bundle);
} else {
if (listener != null) {
listener.onLogin();
}
}
}
public static void checkLogin(final Context context, Bundle nextToBundle, boolean isTriggerNextStep, String entrance, OnLoginListener listener) {
if (!isLogin()) {
if (listener != null) Utils.toast(context, "需要登录");
LogUtils.login("dialog", null, entrance);
LogUtils.login("activity", null, entrance);
// 有可能App未启动
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putString(EntranceUtils.KEY_TO, LoginActivity.class.getName());
EntranceUtils.jumpActivity(context, nextToBundle, bundle, (resultCode, data) -> {
if (isTriggerNextStep && listener != null && isLogin()) {
listener.onLogin();
}
});
} else {
if (listener != null) {
listener.onLogin();

View File

@ -72,11 +72,6 @@ object CommentHelper {
videoId: String? = null,
listener: OnCommentCallBackListener? = null) {
val dialogOptions = ArrayList<String>()
if (commentEntity.me == null || !commentEntity.me?.isCommentOwner!!) {
dialogOptions.add("回复")
}
dialogOptions.add("复制")
dialogOptions.add("投诉")
@ -97,18 +92,6 @@ object CommentHelper {
when (it) {
"管理" -> showControlDialog(context, answerId, articleId, communityId, commentEntity, commentEntity.me!!)
"回复" -> {
context.ifLogin("回答详情-评论-回复") {
if (listener != null) {
listener.onCommentCallback(commentEntity)
} else if (!TextUtils.isEmpty(commentEntity.id)) {
context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, commentEntity.id))
} else {
Utils.toast(context, "缺少关键属性")
}
}
}
"复制" -> copyText(commentEntity.content, context)
"投诉" -> {

View File

@ -1,5 +1,6 @@
package com.gh.common.util;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.ClipboardManager;
import android.content.Context;
@ -12,27 +13,35 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.gh.gamecenter.CommentDetailActivity;
import com.gh.gamecenter.MessageDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.OnCommentCallBackListener;
import com.gh.gamecenter.adapter.viewholder.CommentViewHolder;
import com.gh.gamecenter.entity.CommentEntity;
import com.gh.gamecenter.entity.MeEntity;
import com.gh.gamecenter.entity.UserInfoEntity;
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 org.jetbrains.annotations.NotNull;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
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;
import androidx.core.content.ContextCompat;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import retrofit2.HttpException;
/**
@ -43,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));
@ -60,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));
@ -75,8 +95,6 @@ public class CommentUtils {
public static void showReportDialog(final CommentEntity commentEntity,
final Context context,
final boolean showConversation,
final OnCommentCallBackListener listener,
final String newsId,
final String patch) {
final Dialog dialog = new Dialog(context);
@ -86,11 +104,6 @@ public class CommentUtils {
container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12));
List<String> dialogType = new ArrayList<>();
if (commentEntity.getMe() == null || !commentEntity.getMe().isCommentOwner()) {
dialogType.add("回复");
}
dialogType.add("复制");
dialogType.add("投诉");
@ -116,17 +129,6 @@ public class CommentUtils {
public void onClick(View v) {
dialog.cancel();
switch (reportTv.getText().toString()) {
case "回复":
CheckLoginUtils.checkLogin(context, patch + "-回复", () -> {
if (listener != null) {
listener.onCommentCallback(commentEntity);
} else if (!TextUtils.isEmpty(newsId)) {
context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, newsId));
} else {
Utils.toast(context, "缺少关键属性");
}
});
break;
case "复制":
copyText(commentEntity.getContent(), context);
break;
@ -208,13 +210,13 @@ public class CommentUtils {
public static void postVote(final Context context, final CommentEntity commentEntity,
final TextView commentLikeCountTv, final ImageView commentLikeIv,
final OnVoteListener listener) {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) {
Utils.toast(context, "已经点过赞啦!");
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme_font)) {
ToastUtils.INSTANCE.showToast("已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme));
commentLikeIv.setImageResource(R.drawable.vote_icon_select);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme_font));
commentLikeIv.setImageResource(R.drawable.comment_vote_select);
commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote()));
commentLikeCountTv.setVisibility(View.VISIBLE);
@ -232,7 +234,7 @@ public class CommentUtils {
commentEntity.setVote(commentEntity.getVote() - 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
commentLikeIv.setImageResource(R.drawable.vote_icon_unselect);
commentLikeIv.setImageResource(R.drawable.comment_vote_unselect);
commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote()));
if (commentEntity.getVote() == 0) {
commentLikeCountTv.setVisibility(View.GONE);
@ -246,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();
@ -274,13 +276,13 @@ public class CommentUtils {
entrance = "社区文章详情-评论-点赞";
}
CheckLoginUtils.checkLogin(context, entrance, () -> {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) {
Utils.toast(context, "已经点过赞啦!");
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme_font)) {
ToastUtils.INSTANCE.showToast("已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme));
commentLikeIv.setImageResource(R.drawable.vote_icon_select);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme_font));
commentLikeIv.setImageResource(R.drawable.comment_vote_select);
commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote()));
commentLikeCountTv.setVisibility(View.VISIBLE);
@ -297,7 +299,7 @@ public class CommentUtils {
public void postFailed(Throwable e) {
commentEntity.setVote(commentEntity.getVote() - 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
commentLikeIv.setImageResource(R.drawable.vote_icon_unselect);
commentLikeIv.setImageResource(R.drawable.comment_vote_unselect);
commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote()));
if (commentEntity.getVote() == 0) {
commentLikeCountTv.setVisibility(View.GONE);
@ -311,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();
@ -330,27 +332,46 @@ public class CommentUtils {
public static void setCommentUserView(Context mContext, CommentViewHolder holder, CommentEntity entity) {
MeEntity userDataEntity = entity.getMe();
holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
holder.commentLikeIv.setImageResource(R.drawable.vote_icon_unselect);
holder.commentLikeIv.setImageResource(R.drawable.comment_vote_unselect);
if (userDataEntity == null || !userDataEntity.isCommentOwner()) {
holder.replyLine.setVisibility(View.VISIBLE);
holder.commentReply.setVisibility(View.VISIBLE);
} else {
holder.replyLine.setVisibility(View.GONE);
holder.commentReply.setVisibility(View.GONE);
}
if (entity.getVote() == 0) {
holder.commentLikeCountTv.setVisibility(View.GONE);
} else { // 检查是否已点赞
if (userDataEntity != null && (userDataEntity.isCommentVoted())) {
holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.theme));
holder.commentLikeIv.setImageResource(R.drawable.vote_icon_select);
holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font));
holder.commentLikeIv.setImageResource(R.drawable.comment_vote_select);
}
holder.commentLikeCountTv.setVisibility(View.VISIBLE);
holder.commentLikeCountTv.setText(NumberUtils.transSimpleCount(entity.getVote()));
}
if (entity.getUser().getBadge() != null) {
holder.userBadgeSdv.setVisibility(View.VISIBLE);
holder.badgeNameTv.setVisibility(View.VISIBLE);
ImageUtils.display(holder.userBadgeSdv, entity.getUser().getBadge().getIcon());
holder.badgeNameTv.setText(entity.getUser().getBadge().getName());
} else {
holder.userBadgeSdv.setVisibility(View.GONE);
holder.badgeNameTv.setVisibility(View.GONE);
}
//检查是否是自身评论
UserInfoEntity userInfo = UserManager.getInstance().getUserInfoEntity();
if (userDataEntity != null && userDataEntity.isCommentOwner() && userInfo != null) {
if (entity.getMe() != null && entity.getMe().isContentOwner()) {
holder.commentUserNameTv.setText(userInfo.getName() + "(作者)");
holder.commentAuthorTv.setVisibility(View.VISIBLE);
} else {
holder.commentUserNameTv.setText(userInfo.getName());
holder.commentAuthorTv.setVisibility(View.GONE);
}
holder.commentUserNameTv.setText(userInfo.getName());
if (userInfo.getAuth() != null) {
ImageUtils.display(holder.commentUserBadgeIv, userInfo.getAuth().getIcon());
} else {
@ -359,10 +380,11 @@ public class CommentUtils {
ImageUtils.displayIcon(holder.commentUserIconDv, userInfo.getIcon());
} else {
if (entity.getMe() != null && entity.getMe().isContentOwner()) {
holder.commentUserNameTv.setText(entity.getUser().getName() + "(作者)");
holder.commentAuthorTv.setVisibility(View.VISIBLE);
} else {
holder.commentUserNameTv.setText(entity.getUser().getName());
holder.commentAuthorTv.setVisibility(View.GONE);
}
holder.commentUserNameTv.setText(entity.getUser().getName());
if (entity.getUser().getAuth() != null) {
ImageUtils.display(holder.commentUserBadgeIv, entity.getUser().getAuth().getIcon());
} else {
@ -376,12 +398,42 @@ public class CommentUtils {
}
}
@SuppressLint("CheckResult")
public static void isUserCommentedOnThisGame(String gameId, WeakReference<SimpleCallback<Boolean>> callback) {
RetrofitManager.getInstance(HaloApp.getInstance().getApplication())
.getApi()
.isUserCommentedOnThisGame(UserManager.getInstance().getUserId(), gameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BiResponse<ResponseBody>() {
@Override
public void onSuccess(ResponseBody data) {
SimpleCallback<Boolean> cb = callback.get();
if (cb != null) {
try {
JSONObject object = new JSONObject(data.string());
cb.onCallback(object.getBoolean("status"));
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(@NotNull Exception exception) {
Utils.toast(HaloApp.getInstance().getApplication(), "网络异常");
}
});
}
//复制文字
public static void copyText(String copyContent, Context context) {
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

@ -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.
* 日志上传工具类
@ -68,12 +61,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

@ -238,18 +238,12 @@ public class DataUtils {
}
public static void onError(Context context, Throwable throwable) {
// MTA主动上传错误
//bugly 作为默认处理异常的类库,已经上报了,此处不重复上报
try {
StatService.reportException(context, throwable);
CrashReport.postCatchedException(throwable);
} catch (Exception e) {
}
// //bugly 作为默认处理异常的类库,已经上报了,此处不重复上报
// try {
// CrashReport.postCatchedException(throwable);
// } catch (Exception e) {
// }
//talkingdata
try {
TCAgent.onError(context, throwable);

View File

@ -9,9 +9,11 @@ import com.gh.common.view.DownloadProgressBar;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.DetailViewHolder;
import com.gh.gamecenter.entity.LinkEntity;
import com.gh.gamecenter.entity.PluginLocation;
import com.gh.gamecenter.manager.PackagesManager;
import com.lightgame.download.DownloadEntity;
import com.lightgame.utils.Utils;
/**
* Created by khy on 27/06/17.
@ -21,6 +23,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())
@ -33,10 +36,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 {
@ -47,35 +51,51 @@ public class DetailDownloadUtils {
}
if (viewHolder.gameEntity.getApk().isEmpty() || viewHolder.gameEntity.getDownloadOffStatus() != null) {
if ("dialog".equals(viewHolder.gameEntity.getDownloadOffStatus())) {
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.downloadOffText) ? "查看详情" : viewHolder.downloadOffText);
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NONE_WITH_HINT);
LinkEntity h5LinkEntity = viewHolder.gameEntity.getH5Link();
if (h5LinkEntity != null) {
if ("play".equals(h5LinkEntity.getType())) {
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());
}
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.H5_GAME);
} else {
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.downloadOffText) ? "暂无下载" : viewHolder.downloadOffText);
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NONE);
if ("dialog".equals(viewHolder.gameEntity.getDownloadOffStatus())) {
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.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();
@ -87,6 +107,10 @@ 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;
@ -115,7 +139,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);
@ -130,6 +154,4 @@ public class DetailDownloadUtils {
break;
}
}
}

View File

@ -5,7 +5,12 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.CountDownTimer;
import android.preference.PreferenceManager;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
@ -17,25 +22,49 @@ import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
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.WebActivity;
import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder;
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.halo.assistant.HaloApp;
import com.halo.assistant.fragment.SettingsFragment;
import com.lightgame.adapter.BaseRecyclerAdapter;
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.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
public class DialogUtils {
@ -144,29 +173,33 @@ public class DialogUtils {
}
// 网络劫持时 打开QQ客户端创建临时会话
public static void showQqSessionDialog(final Context context, final String qq) {
public static void showQqSessionDialog(final Context context) {
String qq = "";
if (Config.getSettings() != null && Config.getSettings().getSupport() != null) {
qq = Config.getSettings().getSupport().getQq();
}
String finalQq = qq;
showWarningDialog(context, "警告", "您当前网络环境异常,下载地址可能被运营商恶意替换(网络劫持)" +
"如多次下载失败请联系客服获取正确的下载地址客服QQ" + qq + ""
, "取消", "前往QQ", () -> DirectUtils.directToQqConversation(context, qq), null);
, "取消", "前往QQ", () -> DirectUtils.directToQqConversation(context, finalQq), null);
}
public static void checkDownload(Context context, String size, CheckDownloadCallBack callBack) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
if (!NetworkUtils.isNetworkConnected(context)) {
showNoConnectionDownloadDialog(context, null,
() -> callBack.onResponse(true));
} else if (NetworkUtils.isWifiConnected(context) || filter4GorSize(context, size)) {
} else if (NetworkUtils.isWifiConnected(context)
|| filter4GorSize(context, size)) {
callBack.onResponse(false);
} else if (!preferences.getBoolean(SettingsFragment.getTrafficDownloadHintKey(), true)) {
AppExecutor.getUiExecutor().executeWithDelay(() -> Utils.toast(context, "当前使用移动网络下载,请注意流量消耗"), 500);
callBack.onResponse(false);
} else {
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(context), "出现弹窗提示");
showDownloadDialog(context,
() -> {
callBack.onResponse(false);
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(context), "立即下载");
},
() -> {
callBack.onResponse(true);
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(context), "连上WiFi后自动下载");
});
() -> callBack.onResponse(false),
() -> callBack.onResponse(true));
}
}
@ -178,7 +211,8 @@ public class DialogUtils {
String mb = size.toUpperCase().replaceAll("MB", "").trim();
Float i = Float.valueOf(mb);
if (NetworkUtils.isWifiOr4GConnected(context) && i <= 50) {
Utils.toast(context, "当前使用移动流量下载");
AppExecutor.getUiExecutor().executeWithDelay(() -> Utils.toast(context, "当前使用移动网络下载,请注意流量消耗"), 500);
return true;
}
} catch (Exception e) {
@ -206,14 +240,54 @@ public class DialogUtils {
}
public static void showDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener) {
showWarningDialog(context, "下载提示", "当前正在使用移动网络,立即下载会消耗手机流量", "连上WiFi后自动下载", "立即下载", listener, cancelListener);
context = checkDialogContext(context);
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_download_traffic, null);
View allowOnce = contentView.findViewById(R.id.allow_once);
View allowAlways = contentView.findViewById(R.id.allow_always);
View wifiAuto = contentView.findViewById(R.id.wifi_auto);
Context finalContext = context;
allowOnce.setOnClickListener(v -> {
AppExecutor.getUiExecutor().executeWithDelay(() -> {
Utils.toast(finalContext, "已使用移动网络下载,请注意流量消耗");
}, 500);
listener.onConfirm();
dialog.dismiss();
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "本次允许");
});
wifiAuto.setOnClickListener(v -> {
cancelListener.onCancel();
dialog.dismiss();
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "连上WiFi后自动下载");
});
allowAlways.setOnClickListener(v -> {
PreferenceManager
.getDefaultSharedPreferences(finalContext)
.edit()
.putBoolean(SettingsFragment.getTrafficDownloadHintKey(), false)
.apply();
AppExecutor.getUiExecutor().executeWithDelay(() -> {
// 显示了弹窗以后,即便下面这个 toast 放在 listener.onConfirm 后调用也是显示 listener.onConfirm 里的 toast
// 喷了,延时包治疑难杂症
Utils.toast(finalContext, "已使用移动网络下载,请注意流量消耗");
}, 500);
listener.onConfirm();
dialog.dismiss();
MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "总是允许");
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
public static void showResumeDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener) {
showWarningDialog(context, "下载提示", "当前正在使用移动网络,继续下载会消耗手机流量", "连上WiFi后自动下载", "继续下载", listener, cancelListener);
}
public static void showDownloadDialog(Context context, ConfirmListener listener) {
showWarningDialog(context, "下载提示", "您当前使用的网络为2G/3G/4G开始下载将会消耗移动流量确定下载", listener);
}
@ -224,10 +298,30 @@ public class DialogUtils {
}
public static void showPluginDialog(Context context, final ConfirmListener listener) {
Spanned spanned = Html.fromHtml("您将进行插件化安装以实现插件功能,此过程将"
+ "<font color=\"#ff0000\">卸载</font>" + "当前使用的版本并"
+ "<font color=\"#ff0000\">安装插件版本</font>");
showWarningDialog(context, "插件化安装", spanned, listener);
context = checkDialogContext(context);
MtaHelper.onEvent("插件化", "插件化安装弹窗", "出现弹窗提示");
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_plugin, null);
TextView negativeTv = contentView.findViewById(R.id.dialog_negative);
TextView positiveTv = contentView.findViewById(R.id.dialog_positive);
negativeTv.setOnClickListener(v -> {
dialog.dismiss();
MtaHelper.onEvent("插件化", "插件化安装弹窗", "取消");
});
positiveTv.setOnClickListener(view -> {
if (listener != null) {
listener.onConfirm();
}
dialog.dismiss();
MtaHelper.onEvent("插件化", "插件化安装弹窗", "确认并开始");
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
/**
@ -420,7 +514,7 @@ public class DialogUtils {
contentTv.setText(message);
titleTv.setText(title);
negativeTv.setText(negative);
negativeTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
//negativeTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
positiveTv.setText(positive);
negativeTv.setOnClickListener(new View.OnClickListener() {
@ -563,9 +657,9 @@ public class DialogUtils {
Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
positiveBtn.setTextSize(13);
positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme_font));
negativeBtn.setTextSize(13);
negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.theme_font));
if (mesage != null) {
mesage.setGravity(Gravity.CENTER);
mesage.setTextSize(24);
@ -786,38 +880,82 @@ public class DialogUtils {
return dialog;
}
public static void showPrivacyPolicyDialog(Context context, String title, String content, EmptyCallback callback) {
public static void showPrivacyPolicyDialog(Context context,
@NonNull PrivacyPolicyEntity entity,
EmptyCallback callback) {
final Context activityContext = checkDialogContext(context);
// 区分此 dialog 是点击 dialog 外部取消的还是点击返回取消的
AtomicBoolean isCanceledByClickOutsideOfDialog = new AtomicBoolean(true);
String privacyPolicyContent;
String privacyPolicyTitle = (TextUtils.isEmpty(title)) ? "个人信息保护指引" : title;
if (TextUtils.isEmpty(content)) {
privacyPolicyContent = "光环助手致力于为每位用户提供更安全的互联网环境,我们将依据相关法律法规和技术规范来收集和使用你的个人信息。" +
"<br/>1.为帮助你浏览内容、互动交流、注册认证等,我们需要获取一些必要的信息,以实现完整的功能;" +
"<br/>2.日常使用中,我们可能需要开启 IMEI号码、IMSI号码、定位、相册 等信息的读取权限;" +
"<br/>3.以上信息的读取权限均不会默认开启,只有在运行相关功能或服务时才会明确提示授权,光环助手不会在未经你同意的情况下收集相关信息。";
} else {
privacyPolicyContent = content;
final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_privacy_policy, null);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawableResource(android.R.color.transparent);
WindowManager.LayoutParams params = window.getAttributes();
params.horizontalMargin = 0;
params.width = context.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(40);
int height = context.getResources().getDisplayMetrics().heightPixels - DisplayUtils.dip2px(120);
int maxHeight = DisplayUtils.dip2px(546);
if (height > maxHeight) {
params.height = maxHeight;
} else {
params.height = height;
}
window.setAttributes(params);
}
final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_privacy_policy, null);
TextView contentTv = contentView.findViewById(R.id.dialog_content);
TextView titleTv = contentView.findViewById(R.id.dialog_title);
TextView positiveTv = contentView.findViewById(R.id.dialog_positive);
TextView skipTv = contentView.findViewById(R.id.dialog_skip);
TextView title = contentView.findViewById(R.id.title);
TextView bottomContent = contentView.findViewById(R.id.bottom_content);
TextView topContent = contentView.findViewById(R.id.top_content);
TextView allowButton = contentView.findViewById(R.id.allow_button);
TextView disallowButton = contentView.findViewById(R.id.disallow_button);
TextView linkContent = contentView.findViewById(R.id.link_content);
RecyclerView permissions = contentView.findViewById(R.id.permissions_content);
SpannableStringBuilder skipText = new SpannableStringBuilder("你可以查看完整版的 隐私政策");
permissions.setLayoutManager(new FixLinearLayoutManager(context));
permissions.setAdapter(new BaseRecyclerAdapter(context) {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.privacy_item, parent, false);
return new PrivacyPolicyItemViewHolder(PrivacyItemBinding.bind(view));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof PrivacyPolicyItemViewHolder) {
PrivacyPolicyItemViewHolder viewHolder = (PrivacyPolicyItemViewHolder) holder;
PrivacyItemBinding binding = viewHolder.getBinding();
binding.setData(entity.getPermissions().get(position));
GenericDraweeHierarchy hierarchy = binding.icon.getHierarchy();
if (hierarchy != null) {
if (position == 0) {
hierarchy.setPlaceholderImage(R.drawable.permission_storage);
} else {
hierarchy.setPlaceholderImage(R.drawable.permission_phone_state);
}
}
}
}
@Override
public int getItemCount() {
return entity.getPermissions().size();
}
});
SpannableStringBuilder skipText = new SpannableStringBuilder("查看完整版的隐私政策和用户协议");
skipText.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(ContextCompat.getColor(activityContext, R.color.text_1383EB));
ds.setColor(ContextCompat.getColor(activityContext, R.color.theme_font));
ds.setUnderlineText(false);
}
@ -827,30 +965,47 @@ public class DialogUtils {
Intent intent = WebActivity.getPrivacyPolicyIntent(activityContext);
activityContext.startActivity(intent);
}
}, skipText.length() - 9, skipText.length() - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
skipText.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(ContextCompat.getColor(activityContext, R.color.theme_font));
ds.setUnderlineText(false);
}
@Override
public void onClick(@NonNull View widget) {
MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击用户协议");
activityContext.startActivity(WebActivity.getWebIntent(activityContext));
}
}, skipText.length() - 4, skipText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
title.setText(entity.getTitle());
linkContent.setText(skipText);
linkContent.setMovementMethod(new LinkMovementMethod());
topContent.setText(entity.getTopContent());
bottomContent.setText(entity.getBottomContent());
skipTv.setText(skipText);
skipTv.setMovementMethod(new LinkMovementMethod());
contentTv.setText(Html.fromHtml(privacyPolicyContent));
titleTv.setText(privacyPolicyTitle);
positiveTv.setText("我知道了");
positiveTv.setOnClickListener(view -> {
allowButton.setOnClickListener(view -> {
dialog.dismiss();
MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击我知道了");
callback.onCallback();
MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击同意");
});
dialog.setOnDismissListener(d -> {
callback.onCallback();
disallowButton.setOnClickListener(v -> {
dialog.dismiss();
showPrivacyPolicyDisallowDialog(activityContext, entity, callback);
MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "不同意并退出App");
});
dialog.setOnCancelListener(cd -> {
if (isCanceledByClickOutsideOfDialog.get()) {
MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击空白");
}
});
dialog.setOnKeyListener((dialog1, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
isCanceledByClickOutsideOfDialog.set(false);
@ -861,7 +1016,37 @@ public class DialogUtils {
MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "出现弹窗");
try {
dialog.setCancelable(false);
dialog.show();
} catch (Exception ignored) {
}
}
public static void showPrivacyPolicyDisallowDialog(Context context,
@NonNull PrivacyPolicyEntity entity,
EmptyCallback callback) {
final Context activityContext = checkDialogContext(context);
final Dialog dialog = new Dialog(activityContext, R.style.DialogWindowTransparent);
View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_disallow_privacy_policy, null);
View backButton = contentView.findViewById(R.id.back_button);
View reviewButton = contentView.findViewById(R.id.review_button);
backButton.setOnClickListener(v -> {
MtaHelper.onEvent("隐私政策弹窗", "退出提示弹窗", "退出应用");
dialog.dismiss();
AppManager.getInstance().appExit(activityContext);
});
reviewButton.setOnClickListener(v -> {
MtaHelper.onEvent("隐私政策弹窗", "退出提示弹窗", "再次查看");
dialog.dismiss();
showPrivacyPolicyDialog(activityContext, entity, callback);
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(contentView);
try {
dialog.show();
@ -908,6 +1093,60 @@ public class DialogUtils {
return dialog;
}
public static Dialog showTrackableDialog(Context context,
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);
TextView contentTv = contentView.findViewById(R.id.dialog_content);
TextView titleTv = contentView.findViewById(R.id.dialog_title);
TextView negativeTv = contentView.findViewById(R.id.dialog_negative);
TextView positiveTv = contentView.findViewById(R.id.dialog_positive);
if (message.toString().contains("红包奖励")) {//将红包奖励四个字标红
String str = message.toString().substring(0, message.toString().indexOf("红包奖励")) + "<font color='#FF0000'>红包奖励</font>";
contentTv.setText(Html.fromHtml(str));
} else {
contentTv.setText(message);
}
titleTv.setText(title);
negativeTv.setText(negative);
positiveTv.setText(positive);
negativeTv.setOnClickListener(view -> {
if (clListener != null) {
clListener.onCancel();
}
dialog.dismiss();
});
positiveTv.setOnClickListener(view -> {
if (cmListener != null) {
cmListener.onConfirm();
}
dialog.dismiss();
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
return dialog;
}
public static Dialog fixWebViewKeyboardNotWorking(Activity activity) {
final Dialog dialog = new Dialog(activity, R.style.TransparentDialog);
View view = new View(activity);
@ -923,6 +1162,187 @@ public class DialogUtils {
return dialog;
}
public static Dialog showUsageStatsDialog(Context context, final ConfirmListener cmListener, final CancelListener clListener) {
context = checkDialogContext(context);
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_usage_stats, null);
TextView negativeTv = contentView.findViewById(R.id.dialog_negative);
TextView positiveTv = contentView.findViewById(R.id.dialog_positive);
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
negativeTv.setOnClickListener(view -> {
if (clListener != null) {
clListener.onCancel();
}
dialog.dismiss();
});
positiveTv.setOnClickListener(view -> {
if (cmListener != null) {
cmListener.onConfirm();
}
dialog.dismiss();
});
dialog.setOnDismissListener(dialog1 -> {
if (clListener != null) {
clListener.onCancel();
}
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
return dialog;
}
public static void showDownloadMutexDialog(Context context) {
context = checkDialogContext(context);
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_downlaod_mutex, null);
TextView positive = contentView.findViewById(R.id.dialog_positive);
CountDownTimer timer = new CountDownTimer(6000, 1000) {
public void onTick(long millisUntilFinished) {
positive.setText(("我知道了(" + millisUntilFinished / 1000 + ""));
}
public void onFinish() {
dialog.dismiss();
}
};
timer.start();
positive.setOnClickListener(v -> {
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 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 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();
}
/**
* @param context may be is application context
* @return activity context
@ -936,6 +1356,7 @@ public class DialogUtils {
return context;
}
// currentActivity 是否存在 isDestroyed 的情况?
return AppManager.getInstance().currentActivity();
}

View File

@ -9,17 +9,22 @@ import android.text.TextUtils
import com.gh.base.BaseActivity
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.util.EntranceUtils.*
import com.gh.gamecenter.*
import com.gh.gamecenter.amway.AmwayActivity
import com.gh.gamecenter.category.CategoryDirectoryActivity
import com.gh.gamecenter.download.DownloadFragment.Companion.INDEX_UPDATE
import com.gh.gamecenter.entity.*
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.gamedetail.GameDetailFragment
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.mygame.PlayedGameActivity
import com.gh.gamecenter.personalhome.HomeActivity
import com.gh.gamecenter.personalhome.UserHomeActivity
import com.gh.gamecenter.qa.CommunityFragment
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
import com.gh.gamecenter.qa.article.SimpleArticleListActivity
@ -27,10 +32,14 @@ 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.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.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.lightgame.utils.Util_System_ClipboardManager
import com.lightgame.utils.Utils
import org.greenrobot.eventbus.EventBus
@ -46,27 +55,27 @@ object DirectUtils {
@JvmStatic
fun directToSpecificPage(context: Context, type: String, link: String, text: String? = "", entrance: String? = null, path: String? = null) {
when (type) {
EntranceUtils.HOST_ARTICLE -> directToArticle(context, id = link, entrance = entrance)
HOST_ARTICLE -> directToArticle(context, id = link, entrance = entrance)
EntranceUtils.HOST_GAME -> directToGameDetail(context, id = link, entrance = entrance)
HOST_GAME -> directToGameDetail(context, id = link, entrance = entrance)
EntranceUtils.HOST_GAME_DOWNLOAD -> directToGameDetail(context, id = link, entrance = entrance, autoDownload = true)
HOST_GAME_DOWNLOAD -> directToGameDetail(context, id = link, entrance = entrance, autoDownload = true)
EntranceUtils.HOST_COLUMN -> directToSubject(context, id = link, subjectName = text, entrance = entrance)
HOST_COLUMN -> directToSubject(context, id = link, subjectName = text, entrance = entrance)
EntranceUtils.HOST_QUESTION -> directToQuestionDetail(context, id = link, entrance = entrance, path = path)
HOST_QUESTION -> directToQuestionDetail(context, id = link, entrance = entrance, path = path)
EntranceUtils.HOST_ANSWER -> directToAnswerDetail(context, id = link, entrance = entrance, path = path)
HOST_ANSWER -> directToAnswerDetail(context, id = link, entrance = entrance, path = path)
EntranceUtils.HOST_WEB -> directToWebView(context, url = link, entrance = entrance)
HOST_WEB -> directToWebView(context, url = link, entrance = entrance)
EntranceUtils.HOST_DOWNLOAD -> directToDownloadManagerAndStartDownload(context, gameId = link, packageName = text, entrance = entrance)
HOST_DOWNLOAD -> directToDownloadManagerAndStartDownload(context, gameId = link, packageName = text, entrance = entrance)
EntranceUtils.HOST_UPDATE -> directToDownloadManagerAndStartUpdate(context, gameId = link, packageName = text, entrance = entrance)
HOST_UPDATE -> directToDownloadManagerAndStartUpdate(context, gameId = link, packageName = text, entrance = entrance)
EntranceUtils.HOST_LIBAO -> directToGiftDetail(context, giftId = link, entrance = entrance)
HOST_LIBAO -> directToGiftDetail(context, giftId = link, entrance = entrance)
EntranceUtils.HOST_COMMUNITY -> directToCommunity(context, CommunityEntity(link, text!!))
HOST_COMMUNITY -> directToCommunity(context, CommunityEntity(link, text!!))
}
}
@ -75,37 +84,87 @@ object DirectUtils {
*/
@JvmStatic
fun directToLinkPage(context: Context, linkEntity: LinkEntity, entrance: String, path: String) {
directToLinkPage(context, linkEntity, entrance, path, null)
}
fun directToLinkPage(context: Context, linkEntity: LinkEntity, entrance: String, path: String, exposureEvent: ExposureEvent? = null) {
directToLinkPage(context, linkEntity, entrance, path, exposureEvent, null)
}
// 用于判断是否已经对接相关类型
var directLinkTypes = arrayOf(
"article", "news",
"game",
"column",
"question",
"answer",
"community",
"community_article",
"community_column",
"community_special_column",
"web", "inurl",
"qq", "QQ",
"qqqun",
"tag",
"all_community_article",
"category",
"block",
"column_collection",
"server",
"top_game_comment",
"wechat_bind",
"video")
fun directToLinkPage(context: Context,
linkEntity: LinkEntity,
entrance: String,
path: String,
exposureEvent: ExposureEvent? = null,
unknownCallback: (() -> Unit)?) {
when (linkEntity.type) {
"article", "news" -> {
"article", "news", "文章" -> {
NewsUtils.statNewsViews(context, linkEntity.link) // 统计阅读量
context.startActivity(NewsDetailActivity.getIntentById(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path)))
}
"game" -> GameDetailActivity.startGameDetailActivity(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path))
"game", "游戏" -> {
if (exposureEvent != null) {
GameDetailActivity.startGameDetailActivity(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path), exposureEvent)
} else {
GameDetailActivity.startGameDetailActivity(context, linkEntity.link, BaseActivity.mergeEntranceAndPath(entrance, path))
}
}
"column" -> SubjectActivity.startSubjectActivity(context, linkEntity.link, linkEntity.text, false, BaseActivity.mergeEntranceAndPath(entrance, path))
"column", "游戏专题" -> SubjectActivity.startSubjectActivity(context, linkEntity.link, linkEntity.text, false, BaseActivity.mergeEntranceAndPath(entrance, path))
"question" -> context.startActivity(QuestionsDetailActivity.getIntent(context, linkEntity.link, entrance, path))
"question", "社区问题" -> context.startActivity(QuestionsDetailActivity.getIntent(context, linkEntity.link, entrance, path))
"answer" -> context.startActivity(AnswerDetailActivity.getIntent(context, linkEntity.link, entrance, path))
"answer", "社区回答" -> context.startActivity(AnswerDetailActivity.getIntent(context, linkEntity.link, entrance, path))
"community" -> directToCommunity(context, CommunityEntity(linkEntity.link!!, linkEntity.text!!))
"community", "问答社区" -> directToCommunity(context, CommunityEntity(linkEntity.link!!, linkEntity.text!!))
"community_article" -> context.startActivity(ArticleDetailActivity.getIntent(context, linkEntity.community!!, linkEntity.link!!, entrance, path))
"community_article", "社区文章" -> context.startActivity(ArticleDetailActivity.getIntent(context, linkEntity.community!!, linkEntity.link!!, entrance, path))
"community_column" -> directToCommunityColumn(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))
"web", "inurl" -> directToWebView(context, url = linkEntity.link!!, entrance = BaseActivity.mergeEntranceAndPath(entrance, path))
"web", "inurl", "web链接" -> {
when {
linkEntity.link!!.contains("v.douyin") && PackageHelper.localPackageNameSet.contains("com.ss.android.ugc.aweme") -> {
directDouyin(context, "1402577827140941")
}
else -> directToWebView(context, url = linkEntity.link!!, entrance = BaseActivity.mergeEntranceAndPath(entrance, path))
}
}
"qq" -> directToQqConversation(context, linkEntity.link)
"qq", "QQ" -> directToQqConversation(context, linkEntity.link)
"outurl" -> directToExternalBrowser(context, linkEntity.link!!)
"qqqun" -> directToQqGroup(context, linkEntity.link!!)
"qqqun", "QQ群" -> directToQqGroup(context, linkEntity.link!!)
"tag" -> context.startActivity(TagsActivity.getIntent(context, linkEntity.text!!, entrance, path))
"tag" -> context.startActivity(TagsActivity.getIntent(context, linkEntity.text!!, linkEntity.title, entrance, path))
"all_community_article" -> {
context.startActivity(SimpleArticleListActivity.getIntent(
@ -115,11 +174,11 @@ object DirectUtils {
path))
}
"category" -> {
"category", "分类" -> {
context.startActivity(CategoryDirectoryActivity.getIntent(context, linkEntity.link!!, linkEntity.text!!))
}
"block" -> {
"block", "版块" -> {
context.startActivity(BlockActivity.getIntent(context, SubjectRecommendEntity(
link = linkEntity.link,
text = linkEntity.text,
@ -127,14 +186,72 @@ object DirectUtils {
display = linkEntity.display ?: Display())))
}
"column_collection" -> {
context.startActivity(ColumnCollectionDetailActivity.getIntent(context, linkEntity.link!!, entrance))
"column_collection", "专题合集" -> directToColumnCollection(context, linkEntity.link!!, -1, entrance)
"server", "game_server" -> {
context.startActivity(GameServersActivity.getIntent(context, entrance, path))
}
else -> DialogUtils.showLowVersionDialog(context)
"top_game_comment" -> directToAmway(context, null, entrance, path)
"wechat_bind" -> context.startActivity(WebActivity.getBindWechatIntent(context))
"video", "video_stream" -> directToVideoDetail(context,
videoId = linkEntity.link!!,
fromLocation = VideoDetailContainerViewModel.Location.VIDEO_CHOICENESS.value,
entrance = entrance,
path = path)
"game_video" -> directToGameVideo(context, linkEntity.link ?: "", entrance, path)
"libao" -> directToGiftDetail(context, linkEntity.link ?: "", entrance)
"feedback" -> directToFeedback(context, linkEntity.name, linkEntity.text, entrance)
"qa" -> directToQa(context, linkEntity.text ?: "", linkEntity.link ?: "")
"qa_collection" -> directToQaCollection(context, linkEntity.text ?: "", linkEntity.link
?: "")
"anliwall" -> directToAmway(context, fixedTopAmwayCommentId = null, entrance = entrance, path = path)
//"h5_game_center" -> directLetoGameCenter(context)
"" -> {
// do nothing
}
else -> {
if (unknownCallback != null) {
unknownCallback.invoke()
} else {
DialogUtils.showLowVersionDialog(context)
}
}
}
}
/**
* 跳转至QA
*/
fun directToQa(context: Context, text: String, id: String) {
context.startActivity(QaActivity.getIntent(context, navigationTitle = text, qaId = id))
}
/**
* 跳转至QA合集
*/
fun directToQaCollection(context: Context, text: String, id: String) {
context.startActivity(QaActivity.getIntent(context, navigationTitle = text, qaCollectionId = id))
}
/**
* 跳转至专题合集
*/
@JvmStatic
fun directToColumnCollection(context: Context, id: String, position: Int = -1, entrance: String, columnName: String = "") {
context.startActivity(ColumnCollectionDetailActivity.getIntent(context, id, position, entrance, columnName))
}
/**
* 跳转到新闻详情
*/
@ -147,24 +264,69 @@ object DirectUtils {
jumpActivity(context, bundle)
}
/**
* 跳转至个人主页
*/
@JvmStatic
fun directToHomeActivity(context: Context, userId: String?, entrance: String? = null, path: String? = null) {
context.startActivity(HomeActivity.getIntent(context, userId ?: "", entrance, path))
context.startActivity(UserHomeActivity.getIntent(context, userId ?: "", entrance, path))
}
/**
* 跳转至个人主页
* @param position 定位到某个tab 0游戏评论 1问答 2视频
*/
@JvmStatic
fun directToHomeActivity(context: Context, userId: String?, position: Int, entrance: String? = null, path: String? = null) {
val bundle = Bundle()
bundle.putString(KEY_USER_ID, userId)
bundle.putString(KEY_TO, UserHomeActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
bundle.putString(KEY_PATH, path)
bundle.putInt(KEY_POSITION, position)
jumpActivity(context, bundle)
}
/**
* 回到首页
*/
fun directToMainActivity(context: Context) {
val intent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP }
context.startActivity(intent)
}
/**
* 跳转到游戏详情
*/
@JvmStatic
fun directToGameDetail(context: Context, id: String, entrance: String? = null, autoDownload: Boolean? = null) {
fun directToGameDetail(context: Context, id: String, entrance: String? = null, autoDownload: Boolean? = null, scrollToLibao: Boolean = false) {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, GameDetailActivity::class.java.simpleName)
bundle.putString(KEY_GAMEID, id)
if (scrollToLibao) {
bundle.putInt(KEY_TARGET, GameDetailFragment.INDEX_TRENDES)
bundle.putBoolean(KEY_SCROLL_TO_LIBAO, scrollToLibao)
}
bundle.putBoolean(KEY_AUTO_DOWNLOAD, autoDownload ?: false)
jumpActivity(context, bundle)
}
/**
* 跳转视频流-游戏介绍进入
*/
@JvmStatic
fun directToGameDetailVideoStreaming(context: Context, id: String, entrance: String? = null) {
val bundle = Bundle()
bundle.putString(KEY_TO, GameVideoActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, entrance)
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)
}
// 跳转至用户玩过的游戏
fun directToPlayedGame(context: Context, userId: String, entrance: String = "", path: String = "") {
context.startActivity(PlayedGameActivity.getIntent(context, userId, entrance, path))
@ -184,12 +346,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)
}
@ -282,16 +453,16 @@ object DirectUtils {
context.startActivity(browserIntent)
}
// 跳转 QQ
// 跳转 QQqqNumber 为空选择默认客服 QQ
@JvmStatic
fun directToQqConversation(context: Context, qqNumber: String? = null) {
var qq = qqNumber
if (TextUtils.isEmpty(qq)) {
qq = "2586716223"
qq = Config.getSettings()?.support?.qq ?: "3509629529"
}
if (ShareUtils.isQQClientAvailable(context)) {
// 安装了 QQ 直接调用QQ打开手机QQ进行会话 默认 QQ 号:2586716223
// 安装了 QQ 直接调用QQ打开手机QQ进行会话 默认 QQ 号:3509629529
val chatType: String
if (qq!!.startsWith("400") || qq.startsWith("800")) {
chatType = "crm"
@ -318,6 +489,7 @@ object DirectUtils {
return true
} catch (e: Exception) {
// 未安装手Q或安装的版本不支持
Utils.toast(context, "请安装QQ客户端")
return false
}
}
@ -348,7 +520,22 @@ object DirectUtils {
// 这里换个线程操作是为了做一点延时
AppExecutor.ioExecutor.execute {
EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_GAMEFRAGMENT, 1))
EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_ASK))
EventBus.getDefault().post(EBReuse(CommunityFragment.EB_RETRY_PAGE))
}
}
@JvmStatic
fun directToCommunity(context: Context) {
if (MainActivity::class.java.name != RunningUtils.getTopActivity(context)) {
val intent = Intent(context, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
context.startActivity(intent)
}
// 这里换个线程操作是为了做一点延时
AppExecutor.ioExecutor.execute {
EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_ASK))
EventBus.getDefault().post(EBReuse(CommunityFragment.EB_RETRY_PAGE))
}
}
@ -382,18 +569,151 @@ object DirectUtils {
* @param fromLocation 可见 [VideoDetailContainerViewModel.Location]
*/
@JvmStatic
fun directToVideoDetail(context: Context, videoId: String, fromLocation: String, showComment: Boolean = false, entrance: String? = null, path: 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 = "") {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, VideoDetailActivity::class.java.name)
bundle.putString(KEY_PATH, path)
bundle.putString(KEY_ID, videoId)
bundle.putString(KEY_GAMEID, gameId)
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)
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
*/
@JvmStatic
fun directToAmway(context: Context, fixedTopAmwayCommentId: String? = null, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, AmwayActivity::class.java.name)
bundle.putString(KEY_ID, fixedTopAmwayCommentId)
bundle.putString(KEY_PATH, path)
jumpActivity(context, bundle)
}
/**
* 跳转至徽章墙
*/
@JvmStatic
fun directToBadgeWall(context: Context, userId: String?, name: String?, icon: String?) {
context.startActivity(WebActivity.getBadgeCenterIntent(context, userId, name, icon))
}
/**
* 跳转至上传视频
*/
@JvmStatic
fun directToVideoManager(context: Context, linkEntity: VideoLinkEntity, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_PATH, path)
bundle.putParcelable(VideoLinkEntity::class.java.simpleName, linkEntity)
bundle.putString(KEY_TO, VideoManagerActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
jumpActivity(context, bundle)
}
/**
* 跳转视频合集
*/
@JvmStatic
fun directToGameVideo(context: Context, gameId: String, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_PATH, path)
bundle.putString(KEY_TO, GameVideoActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
bundle.putString(KEY_GAMEID, gameId)
// context.startActivity(GameVideoActivity.getIntent(context, gameId, entrance, path))
jumpActivity(context, bundle)
}
@JvmStatic
fun directDouyin(context: Context, userId: String) {
if (PackageHelper.localPackageNameSet.contains("com.ss.android.ugc.aweme")) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("snssdk1128://user/profile/$userId"))
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
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? = "") {
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? = "") {
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)
}
}

View File

@ -1,11 +1,19 @@
package com.gh.common.util;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
@ -17,7 +25,7 @@ import java.lang.reflect.Method;
import androidx.core.content.ContextCompat;
public class DisplayUtils {
/**
* 根据手机的分辨率从 dip(像素) 的单位 转成为 px
*/
@ -25,7 +33,7 @@ public class DisplayUtils {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dip
*/
@ -33,19 +41,19 @@ public class DisplayUtils {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 根据手机的分辨率从 dip(像素) 的单位 转成为 px
*/
public static int dip2px(float dpValue) {
final float scale = HaloApp.getInstance()
.getApplication()
.getResources()
.getDisplayMetrics().density;
.getApplication()
.getResources()
.getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 将px值转换为sp值保证文字大小不变
*
@ -57,7 +65,7 @@ public class DisplayUtils {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将sp值转换为px值保证文字大小不变
*
@ -69,7 +77,7 @@ public class DisplayUtils {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
/**
* 获取状态栏的高度
*
@ -79,7 +87,7 @@ public class DisplayUtils {
public static int getStatusBarHeight(Resources resources) {
return getInternalDimensionSize(resources, "status_bar_height");
}
public static int getInternalDimensionSize(Resources res, String key) {
int result = 0;
int resourceId = res.getIdentifier(key, "dimen", "android");
@ -88,7 +96,7 @@ public class DisplayUtils {
}
return result;
}
public static void transparentStatusBar(Activity activity) {
//make full transparent statusBar
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
@ -96,15 +104,15 @@ public class DisplayUtils {
}
if (Build.VERSION.SDK_INT >= 19) {
activity.getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
}
}
public static void transparentStatusAndNavigation(Activity activity) {
//make full transparent statusBar
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
@ -112,8 +120,8 @@ public class DisplayUtils {
}
if (Build.VERSION.SDK_INT >= 19) {
activity.getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false);
@ -121,7 +129,7 @@ public class DisplayUtils {
activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
}
private static void setWindowFlag(Activity activity, final int bits, boolean on) {
Window win = activity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
@ -132,14 +140,12 @@ public class DisplayUtils {
}
win.setAttributes(winParams);
}
public static void setLightStatusBar(Activity activity, boolean lightStatusBar) {
boolean isMIUI = setMIUIStatusBarStyle(activity, lightStatusBar);
if (!isMIUI) {
public static void setLightStatusBar(Activity activity, boolean lightStatusBar, boolean isKeepLowVersionMiui) {
if (!isMiuiOs()) {
Window window = activity.getWindow();
View decor = window.getDecorView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (lightStatusBar) {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
@ -149,46 +155,149 @@ public class DisplayUtils {
} else {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
} else {
setMIUIStatusBarStyle(activity, lightStatusBar, isKeepLowVersionMiui);
}
}
private static boolean setMIUIStatusBarStyle(Activity activity, boolean lightStatusBar) {
boolean result = false;
Window window = activity.getWindow();
if (window != null) {
Class clazz = window.getClass();
try {
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(window, lightStatusBar ? darkModeFlag : 0, darkModeFlag);//状态栏透明且黑色字体
result = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && lightStatusBar) {
//开发版 7.7.13 及以后版本采用了系统API旧方法无效但不会报错所以两个方式都要加上
activity.getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
} catch (Exception e) {
// do nothing
}
}
return result;
}
public static void setStatusBarColor(Activity activity, int color, boolean lightStatusBar) {
public static void setLightStatusBar(Activity activity, boolean lightStatusBar) {
setLightStatusBar(activity, lightStatusBar, true);
}
private static void setMIUIStatusBarStyle(Activity activity, boolean lightStatusBar, boolean isKeepLowVersionMiui) {
Window window = activity.getWindow();
if (window != null) {
View decor = window.getDecorView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (lightStatusBar) {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
} else {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
if (isKeepLowVersionMiui) {
Class clazz = window.getClass();
try {
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(window, lightStatusBar ? darkModeFlag : 0, darkModeFlag);//状态栏透明且黑色字体
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && lightStatusBar) {
//开发版 7.7.13 及以后版本采用了系统API旧方法无效但不会报错所以两个方式都要加上
activity.getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
} catch (Exception e) {
// do nothing
}
}
}
}
public static void setStatusBarColor(Activity activity, int color, boolean lightStatusBar) {
Window window = activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(ContextCompat.getColor(activity,color));
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) {
setLightStatusBar(activity,lightStatusBar);
setLightStatusBar(activity, lightStatusBar);
}
}
private static boolean isMiuiOs() {
String property = getSystemProperty("ro.miui.ui.version.name", "");
return !TextUtils.isEmpty(property);
}
private static String getSystemProperty(String key, String defaultValue) {
try {
@SuppressLint("PrivateApi") Class<?> clz = Class.forName("android.os.SystemProperties");
Method method = clz.getMethod("get", String.class, String.class);
return (String) method.invoke(clz, key, defaultValue);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
public static int retrieveNavigationHeight(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
return (resourceId > 0 && hasSoftKeys(context)) ? resources.getDimensionPixelSize(resourceId) : 0;
}
//判断导航栏是否显示
public static boolean isNavigationBarShow(Activity activity) {
ViewGroup vp = (ViewGroup) activity.getWindow().getDecorView();
for (int i = 0; i < vp.getChildCount(); i++) {
View child = vp.getChildAt(i);
if (child.getId() != -1 && "navigationBarBackground".equals(activity.getResources().getResourceEntryName(child.getId())) && child.getMeasuredHeight() != 0) {
return true;
}
}
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 boolean hasSoftKeys(Context context) {
if (!(context instanceof Activity)) return false;
boolean hasSoftwareKeys;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Display d = ((Activity) context).getWindowManager().getDefaultDisplay();
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
d.getRealMetrics(realDisplayMetrics);
int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);
int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;
hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0;
} else {
boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
hasSoftwareKeys = !hasMenuKey && !hasBackKey;
}
return hasSoftwareKeys;
}
}

View File

@ -1,6 +1,7 @@
package com.gh.common.util;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Message;
import android.text.TextUtils;
@ -8,17 +9,21 @@ 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.download.DownloadManager;
import com.gh.download.dialog.DownloadDialog;
import com.gh.gamecenter.DownloadManagerActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.WebActivity;
import com.gh.gamecenter.adapter.viewholder.GameViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.LinkEntity;
import com.gh.gamecenter.entity.PluginLocation;
import com.gh.gamecenter.manager.PackagesManager;
import com.lightgame.download.DownloadConfig;
@ -35,6 +40,9 @@ import androidx.collection.ArrayMap;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
/**
* todo 下载判断不能以按钮文案为判断条件,否则按钮文案修改时又要修改判断逻辑
*/
public class DownloadItemUtils {
// 更新下载进度条
@ -122,20 +130,20 @@ 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);
}
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);
}
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder,
boolean isShowPlatform, PluginLocation pluginLocation, boolean hideDownloadBtnIfNoAvailableContent) {
// 控制是否显示下载按钮
if (!Config.isShowDownload(gameEntity.getId()) || context.getString(R.string.app_name).equals(gameEntity.getName())) {
@ -144,12 +152,6 @@ 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);
@ -167,21 +169,37 @@ public class DownloadItemUtils {
return;
}
if (gameEntity.getApk().isEmpty() || gameEntity.getDownloadOffStatus() != null) {
if (gameEntity.getApk().isEmpty()
|| 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);
String offStatus = gameEntity.getDownloadOffStatus();
if ("dialog".equals(offStatus)) {
holder.gameDownloadBtn.setText("查看");
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.white));
if (h5LinkEntity != null) {
if ("play".equals(h5LinkEntity.getType())) {
holder.gameDownloadBtn.setText("开始玩");
} else {
holder.gameDownloadBtn.setText("查看");
}
holder.gameDownloadBtn.setClickable(true);
} else {
holder.gameDownloadBtn.setText("暂无");
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.button_gray));
holder.gameDownloadBtn.setBackgroundResource(R.drawable.news_detail_comment);
if ("dialog".equals(offStatus)) {
holder.gameDownloadBtn.setText("查看");
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.white));
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
} else {
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);
}
holder.gameDownloadBtn.setClickable(false);
} else if (gameEntity.getApk().size() == 1) {
updateNormalItem(context, holder, gameEntity, isShowPlatform, pluginLocation);
} else {
@ -318,10 +336,10 @@ 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);
}
}
}
@ -367,20 +385,26 @@ public class DownloadItemUtils {
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) {
downloadBtn.setOnClickListener(v -> {
CheckLoginUtils.checkLogin(context, entrance, () -> {
PermissionHelper.checkReadPhoneStatePermissionBeforeAction(context, () -> {
ReserveDialogFragment dialogFragment = ReserveDialogFragment.getInstance(
gameEntity,
() -> adapter.notifyItemChanged(position)
);
dialogFragment.show(((AppCompatActivity) context).getSupportFragmentManager(), "reserve");
});
if (clickCallback != null) {
clickCallback.onCallback();
}
PermissionHelper.checkReadPhoneStatePermissionBeforeAction(context, () -> {
ReserveDialogFragment dialogFragment = ReserveDialogFragment.getInstance(
gameEntity,
() -> {
LogUtils.logReservation(gameEntity, traceEvent);
adapter.notifyItemChanged(position);
}
);
dialogFragment.show(((AppCompatActivity) context).getSupportFragmentManager(), "reserve");
});
});
});
} else {
downloadBtn.setOnClickListener(v -> {
if (clickCallback != null) {
clickCallback.onCallback();
}
if ("download".equals(gameEntity.getReserveStatus())) {
ReservationHelper.showDeleteReservationDialog(context, () -> {
ReservationHelper.deleteReservation(gameEntity, () -> {
@ -399,13 +423,27 @@ public class DownloadItemUtils {
return;
}
if (gameEntity.getApk().size() == 1) {
if (gameEntity.getApk().size() == 0 && gameEntity.getH5Link() != null) {
downloadBtn.setOnClickListener(v -> {
MtaHelper.onEvent("H5页面", "入口", "列表页_" + gameEntity.getName());
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);
context.startActivity(i);
});
} else if (gameEntity.getApk().size() == 1) {
downloadBtn.setOnClickListener(v -> {
EmptyCallback clickRunnable = () -> {
onNormalClick(context, downloadBtn, gameEntity, position, adapter, entrance, location, traceEvent);
if (clickCallback != null) {
clickCallback.onCallback();
}
onNormalClick(context, downloadBtn, gameEntity, position, adapter, entrance, location, traceEvent);
};
// 启动不需要请求存储权限
@ -417,11 +455,20 @@ public class DownloadItemUtils {
});
} else {
downloadBtn.setOnClickListener(v -> {
if (clickCallback != null) {
clickCallback.onCallback();
}
PermissionHelper.checkStoragePermissionBeforeAction(context, () -> {
DownloadDialog.getInstance(context).showPopupWindow(v, gameEntity, entrance, location, traceEvent);
if (clickCallback != null) {
clickCallback.onCallback();
}
CertificationDialog.showCertificationDialog(context, gameEntity, () -> {
DialogUtils.showVersionNumberDialog(context, gameEntity, () -> {
DownloadDialog.showDownloadDialog(
v.getContext(),
gameEntity,
traceEvent,
entrance,
location);
});
});
});
});
}
@ -452,19 +499,38 @@ 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.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.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))) {
@ -500,16 +566,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));
// DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading");
DeviceRemindDialog.Companion.showDeviceRemindDialog(context, gameEntity);
} else {
Utils.toast(context, msg);
}
@ -522,16 +585,12 @@ 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);
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
// DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading");
} else {
Utils.toast(context, msg);
}
@ -551,18 +610,20 @@ public class DownloadItemUtils {
gameEntity.getEntryMap().remove(apkEntity.getPlatform());
}
adapter.notifyItemChanged(position);
} else if (PackageUtils.isCanPluggable(apkEntity)) {
DialogUtils.showPluginDialog(context, () -> context.startActivity(PackageUtils.getUninstallIntent(context, path)));
} else {
PackageUtils.launchSetup(context, path);
PackageUtils.launchSetup(context, downloadEntity);
}
}
}
//更新
private static void update(Context context, GameEntity gameEntity, String entrance, String location,
boolean isSubscribe, @Nullable ExposureEvent traceEvent) {
DataUtils.onGameUpdateEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), "下载开始");
ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, gameEntity.getApk().get(0).getPlatform(), traceEvent, ExposureUtils.DownloadType.UPDATE);
DownloadManager.createDownload(context, gameEntity, "更新", entrance, location, isSubscribe, downloadExposureEvent);
private static void update(Context context, GameEntity gameEntity, String entrance, String location, boolean isSubscribe, @Nullable ExposureEvent traceEvent) {
ApkEntity apkEntity = gameEntity.getApk().get(0);
DataUtils.onGameUpdateEvent(context, gameEntity.getName(), apkEntity.getPlatform(), "下载开始");
DownloadManager.createDownload(context, gameEntity, "更新", entrance, location, isSubscribe, traceEvent);
}
}

View File

@ -0,0 +1,161 @@
package com.gh.common.util
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.core.app.NotificationCompat
import com.gh.common.AppExecutor
import com.gh.common.constant.Constants
import com.gh.gamecenter.R
import com.halo.assistant.HaloApp
import com.lightgame.download.DownloadEntity
import com.lightgame.download.DownloadStatus
object DownloadNotificationHelper {
private const val DOWNLOAD_GROUP_KEY = "download_group_key"
private const val DOWNLOAD_CHANNEL_ID = "download"
private const val DOWNLOAD_NOTIFICATION_FOLD_ID = 889
private const val DOWNLOAD_NOTIFICATION_ID = 888
private const val PROGRESS_MAX = 100
const val ACTION_INSTALL = "com.gh.gamecenter.INSTALL"
const val ACTION_DOWNLOAD = "com.gh.gamecenter.DOWNLOAD"
private val mNotifyMap: MutableMap<String, Long> = mutableMapOf()
private fun getNotificationManager(): NotificationManager {
return HaloApp.getInstance().application.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
}
@JvmStatic
@Synchronized
fun addOrUpdateDownloadNotification(entity: DownloadEntity) {
var requireUpdateNotificationGroupDelay = false
val notificationManager = getNotificationManager()
val downloadNotificationId = (entity.gameId + entity.packageName).hashCode()
val intent = Intent()
if (entity.status == DownloadStatus.done) {
intent.putExtra(EntranceUtils.KEY_DATA, entity.toJson())
intent.putExtra(EntranceUtils.KEY_PATH, entity.path)
intent.action = ACTION_INSTALL
} else {
intent.action = ACTION_DOWNLOAD
}
val pendingIntent = PendingIntent.getBroadcast(HaloApp.getInstance().application,
downloadNotificationId,
intent,
PendingIntent.FLAG_UPDATE_CURRENT)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// importance == IMPORTANCE_DEFAULT 时每次更新都会触发震动
val channel = NotificationChannel(DOWNLOAD_CHANNEL_ID, DOWNLOAD_CHANNEL_ID, NotificationManager.IMPORTANCE_LOW)
notificationManager.createNotificationChannel(channel)
}
val whenTime = 1000 * 60 * (System.currentTimeMillis() / 1000 / 60)
val builder = NotificationCompat.Builder(HaloApp.getInstance().application, DOWNLOAD_CHANNEL_ID)
.setContentTitle(entity.name)
.setSmallIcon(R.mipmap.logo)
.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("暂停中")
}
when {
entity.status == DownloadStatus.done -> {
builder.setSortKey("A")
builder.setOngoing(true) // 垃圾华为 sortKey 不起效 priority 也不起效,要将下载完成任务的通知置顶只能设置为 ongoing喷了
}
entity.status == DownloadStatus.downloading -> builder.setSortKey("B")
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)
} 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 常驻
AppExecutor.uiExecutor.executeWithDelay(Runnable { updateNotificationGroup() }, 100)
} else {
updateNotificationGroup()
}
}
private fun updateNotificationGroup() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val notificationManager = getNotificationManager()
val activeNotifications = notificationManager.activeNotifications
var downloadNotificationSize = 0
var downloadGroupNotificationSize = 0
for (activeNotification in activeNotifications) {
if (activeNotification.id == DOWNLOAD_NOTIFICATION_ID) {
downloadNotificationSize++
}
if (activeNotification.id == DOWNLOAD_NOTIFICATION_FOLD_ID) {
downloadGroupNotificationSize++
}
}
if (downloadNotificationSize == 0 && downloadGroupNotificationSize != 0) {
// 删除组可能会把组内所有通知一并删除
notificationManager.cancel(DOWNLOAD_NOTIFICATION_FOLD_ID)
} else if (downloadNotificationSize != 0 && downloadGroupNotificationSize == 0) {
val groupBuilder = NotificationCompat.Builder(HaloApp.getInstance().application, DOWNLOAD_CHANNEL_ID)
.setSmallIcon(R.mipmap.logo)
.setGroup(DOWNLOAD_GROUP_KEY)
.setGroupSummary(true)
.setStyle(NotificationCompat.BigTextStyle().bigText("下载任务"))
val groupNotification = groupBuilder.build()
groupNotification.flags = groupNotification.flags or Notification.FLAG_NO_CLEAR
notificationManager.notify(DOWNLOAD_NOTIFICATION_FOLD_ID, groupNotification)
}
}
}
@JvmStatic
fun initDownloadNotification(downloadTasks: MutableList<DownloadEntity>) {
for (downloadTask in downloadTasks) {
addOrUpdateDownloadNotification(downloadTask)
}
}
}

View File

@ -0,0 +1,260 @@
package com.gh.common.util
import android.content.pm.PackageManager
import android.os.Build
import android.preference.PreferenceManager
import com.gh.base.BaseActivity
import com.gh.common.constant.Constants
import com.gh.common.exposure.ExposureUtils
import com.gh.download.DownloadManager
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.R
import com.gh.gamecenter.SuggestionActivity
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.SimpleGameEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.eventbus.EBShowDialog
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.gh.gamecenter.suggest.SuggestType
import com.halo.assistant.HaloApp
import com.halo.assistant.fragment.SettingsFragment
import com.lightgame.download.DataWatcher
import com.lightgame.download.DownloadEntity
import com.lightgame.download.DownloadStatus
import com.lightgame.download.FileUtils
import com.lightgame.utils.AppManager
import com.lightgame.utils.Util_System_Phone_State
import com.lightgame.utils.Utils
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import okhttp3.MediaType
import okhttp3.RequestBody
import org.greenrobot.eventbus.EventBus
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) {
val gameId = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER)
val downloadManager = DownloadManager.getInstance(HaloApp.getInstance().application)
if (downloadEntity.status != DownloadStatus.downloading) {
LogUtils.uploadDownloadEvent(downloadEntity)
}
if (DownloadStatus.hijack == downloadEntity.status) {
// 链接被劫持
processHijack(downloadEntity)
val nameAndPlatform = (downloadEntity.name + ":"
+ PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
MtaHelper.onEvent("下载劫持",
"游戏名字", nameAndPlatform,
"网络状态", DeviceUtils.getNetwork(mApplication))
return
} else if (DownloadStatus.notfound == downloadEntity.status) {
// 404 Not Found
// 删除任务
downloadEntity.status = DownloadStatus.cancel
downloadManager.cancel(downloadEntity.url)
Utils.toast(mApplication, "该链接已失效!请联系管理员。")
MtaHelper.onEventWithBasicDeviceInfo("下载失败弹窗",
"游戏", downloadEntity.name,
"平台", downloadEntity.platform)
DialogUtils.showAlertDialog(AppManager.getInstance().currentActivity(), "下载失败", "下载链接已失效,建议提交反馈", "立即反馈", "取消", {
SuggestionActivity.startSuggestionActivity(AppManager.getInstance().currentActivity(),
SuggestType.gameQuestion, "notfound",
StringUtils.buildString(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)
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("软件更新", "下载完成")
tryWithDefaultCatch {
// 会有 ActivityNotFoundException 异常catch 掉不管了
mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path, true))
}
DataLogUtils.uploadUpgradeLog(mApplication, "install") //上传更新安装数据
} else {
statDoneEvent(downloadEntity)
val platform = PlatformUtils.getInstance(mApplication)
.getPlatformName(downloadEntity.platform)
if (platform != null) {
when {
downloadEntity.isPluggable -> // 弹出插件化提示框
EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path))
downloadEntity.isPlugin -> Utils.toast(mApplication, downloadEntity.name + " - " + platform + " - 下载完成")
else -> Utils.toast(mApplication, downloadEntity.name + " - 下载完成")
}
} else {
Utils.toast(mApplication, downloadEntity.name + " - 下载完成")
}
if (!downloadEntity.isPluggable) {
// 是否是自动安装
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.cancel(downloadEntity.url)
} else {
if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path)) {
downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES"
tryWithDefaultCatch {
mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path))
}
} else {
// 弹出卸载提示框
EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path))
}
}
}
}
// 统计下载完成
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))
}
}
if (downloadEntity.status == DownloadStatus.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)
}
}
}
// 添加观察者
DownloadManager.getInstance(mApplication).addObserver(dataWatcher)
}
// 统计下载完成事件
private fun statDoneEvent(downloadEntity: DownloadEntity) {
var type: ExposureUtils.DownloadType
val platform = PlatformUtils.getInstance(HaloApp.getInstance().application).getPlatformName(downloadEntity.platform)
val kv1 = HashMap<String, Any>()
kv1["版本"] = platform
kv1["状态"] = "下载完成"
kv1["用户机型"] = Build.MODEL
kv1["设备IMEI"] = Util_System_Phone_State.getDeviceId(HaloApp.getInstance().application)
kv1["网络状态"] = DeviceUtils.getNetwork(HaloApp.getInstance().application)
kv1["光环助手版本"] = BuildConfig.VERSION_NAME
if (downloadEntity.isUpdate) {
type = ExposureUtils.DownloadType.UPDATE
if (downloadEntity.isPlugin) {
type = ExposureUtils.DownloadType.PLUGIN_UPDATE
}
DataUtils.onEvent(mApplication, "游戏更新", downloadEntity.name, kv1)
} else {
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)
if (downloadEntity.isPluggable) {
val kv3 = HashMap<String, Any>()
kv3["下载"] = "下载完成"
kv3["版本"] = downloadEntity.platform
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))
}
ExposureUtils.logADownloadCompleteExposureEvent(
GameEntity(id = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER), mName = downloadEntity.name.removeSuffix(Constants.GAME_NAME_DECORATOR)),
downloadEntity.platform,
downloadEntity.exposureTrace,
type)
DataCollectionUtils.uploadDownload(mApplication, downloadEntity, "完成")
}
private fun processHijack(downloadEntity: DownloadEntity) {
// 删除任务
downloadEntity.status = DownloadStatus.cancel
DownloadManager.getInstance(mApplication).cancel(downloadEntity.url)
// 弹出提示框
EventBus.getDefault().post(EBShowDialog(BaseActivity.DOWNLOAD_HIJACK))
// 记录链接被劫持
DataCollectionUtils.uploadHijack(mApplication, downloadEntity)
// 上传劫持log
DataLogUtils.uploadHijack(mApplication, downloadEntity)
}
// 统计下载
private fun uploadData(id: String, platform: String?) {
val params = HashMap<String, String>()
params["game"] = id
params["platform"] = platform ?: ""
val body = RequestBody.create(MediaType.parse("application/json"),
JSONObject(params).toString())
RetrofitManager.getInstance(mApplication).api.postDownload(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Response())
}
}

View File

@ -4,6 +4,10 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.gh.common.avoidcallback.AvoidOnResultManager;
import com.gh.common.avoidcallback.Callback;
import com.gh.gamecenter.MainActivity;
import com.gh.gamecenter.NormalActivity;
import com.gh.gamecenter.SplashScreenActivity;
@ -18,13 +22,25 @@ import com.gh.gamecenter.normal.NormalFragment;
public class EntranceUtils {
public static final String KEY_TO = "to";
public static final String KEY_NEXT_TO = "next_to";
public static final String KEY_NEWSID = "newsId";
public static final String KEY_GAMEID = "gameId";
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 HOST_ARTICLE = "article";
public static final String HOST_UPLOAD_VIDEO = "upload_video";//上传视频
public static final String HOST_VIDEO_SINGLE = "video_single";//指定视频-不能划动
public static final String HOST_VIDEO_MORE = "video_more";//指定视频-能划动
public static final String HOST_VIDEO_STREAMING_HOME = "video_streaming_home";//视频流-首页
public static final String HOST_VIDEO_STREAMING_DESC = "video_streaming_desc";//视频流-游戏介绍进入
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_COMMUNITY_ARTICLE = "community_article";
public static final String HOST_COMMUNITY_COLUMN = "community_column";
public static final String HOST_GAME = "game";
@ -32,6 +48,7 @@ public class EntranceUtils {
public static final String HOST_COLUMN = "column";
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_DOWNLOAD = "download";
public static final String HOST_UPDATE = "update";
public static final String HOST_LIBAO = "libao";
@ -46,7 +63,9 @@ public class EntranceUtils {
public static final String KEY_TYPE = "type";
public static final String KEY_LINK = "link";
public static final String KEY_NAME = "name";
public static final String KEY_POSITION = "position";
public static final String KEY_ENTRANCE = "entrance";
public static final String KEY_ENTRANCE_LINK = "entrance_link";
public static final String KEY_TARGET = "target";
public static final String ENTRANCE_BROWSER = "(浏览器)";
public static final String ENTRANCE_WELCOME = "(启动弹窗)";
@ -65,11 +84,13 @@ public class EntranceUtils {
public static final String KEY_LOCATION = "location";
public static final String KEY_CURRENTITEM = "currentItem";
public static final String KEY_COMMENTID = "commentId";
public static final String KEY_SHOW_KEYBOARD_IF_NEEDED = "show_key_board_if_needed";
public static final String KEY_PATH = "path";
public static final String KEY_OUTER_INFO = "outerInfo";
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";
@ -97,6 +118,7 @@ public class EntranceUtils {
public static final String KEY_CATEGORY_INIT_TITLE = "category_init_title";
public static final String KEY_BLOCK_DATA = "blockData";
public static final String KEY_ASK_TAG = "askTag";
public static final String KEY_SCROLL_TO_LIBAO = "libao";
public static final String KEY_ASK_COLUMN_TAG = "askColumnTag";
public static final String KEY_COMMUNITY_ID = "community_id";
public static final String KEY_COMMUNITY_NAME = "community_name";
@ -120,10 +142,28 @@ public class EntranceUtils {
public static final String KEY_VIDEO_ID = "videoId";
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";
public static final String KEY_OPEN_VIDEO_STREAMING = "openVideoStreaming";
public static final String KEY_REFERER = "referer";
public static final String KEY_UUID = "uuid";
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_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 void jumpActivity(Context context, Bundle bundle) {
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
//TODO 把其他类似的跳转启动逻辑也处理掉
if (RunningUtils.isRunning(context)
@ -146,4 +186,34 @@ 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)
&& MainActivity.class.getName().equals(RunningUtils.getBaseActivity(context))) {
// 应用正在运行,前台或后台
String to = bundle.getString(KEY_TO);
Class<?> clazz = ClassUtils.forName(to);
if (clazz == null) clazz = MainActivity.class;
if (NormalFragment.class.isAssignableFrom(clazz)) { // 兼容NormalFragment
NormalActivity.startFragmentNewTask(context, (Class<? extends NormalFragment>) clazz, bundle);
} else {
Intent intent1 = new Intent(context, clazz);
//TODO:添加FLAG_ACTIVITY_NEW_TASK会导致一跳转页面callback就被调用
//intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtras(bundle);
AvoidOnResultManager.Companion.getInstance((AppCompatActivity) context)
.startForResult(intent1, callback);
}
} else {
// 应用未在运行
if (nextToBundle != null) {
bundle.putBundle(KEY_NEXT_TO, nextToBundle);
}
context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle));
}
}
}

View File

@ -1,6 +1,7 @@
package com.gh.common.util
import android.content.Context
import com.gh.common.constant.Config
import com.gh.gamecenter.R
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.entity.ErrorEntity
@ -22,6 +23,10 @@ object ErrorHelper {
customizedHandler: (code: Int) -> Boolean) {
val errorEntity = errorString?.toObject<ErrorEntity>()
if (customizedHandler(errorEntity?.code ?: 0)) {
return
}
if (errorEntity == null) {
Utils.toast(context, R.string.post_failure_hint)
return
@ -32,11 +37,7 @@ object ErrorHelper {
return
}
if (customizedHandler(errorEntity.code ?: 0)) {
return
} else {
handleError(context, showHighPriorityHint, errorEntity)
}
handleError(context, showHighPriorityHint, errorEntity)
}
/**
@ -110,11 +111,15 @@ object ErrorHelper {
403016 -> Utils.toast(context, "标签内容可能包含敏感信息,请修改后再提交")
403018 -> Utils.toast(context, R.string.comment_failed_unable)
403070 -> Utils.toast(context, "请勿重复提交~")
403073 -> Utils.toast(context, "标题可能包含敏感词,请修改后再提交")
403073 -> Utils.toast(context, "标题违规,请重新编辑")
403074 -> Utils.toast(context, "该微信号(${errorEntity.data?.nickname})已绑定")
403078 -> Utils.toast(context, "已点赞")
403072 -> Utils.toast(context, R.string.comment_failed_userblocked)
403082 -> Utils.toast(context, "作者已关闭评论")
403020 -> if (showHighPriorityHint) {
DialogUtils.showAlertDialog(context,
"限制提醒",
"提醒",
"提问过于频繁,请先休息一下哦",
"知道了", null, null, null)
} else {
@ -141,7 +146,7 @@ object ErrorHelper {
val dialogContext = DialogUtils.checkDialogContext(context)
DialogUtils.showAlertDialog(dialogContext,
"提示",
"你因违反《光环助手评论规则》,已被禁言,如有疑问$bannedType请联系客服QQ3467475980",
"你因违反《光环助手评论规则》,已被禁言$bannedType如有疑问,请联系客服QQ${Config.getSettings()?.support?.qq}",
"去看看", "关闭", {
dialogContext.startActivity(WebActivity.getCommentRulesIntent(dialogContext))
}, null)

View File

@ -1,5 +1,6 @@
package com.gh.common.util
import android.animation.Animator
import android.content.ClipboardManager
import android.content.Context
import android.text.Editable
@ -12,12 +13,14 @@ import android.view.View
import android.widget.PopupWindow
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.*
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.constant.Config
import com.gh.common.constant.Constants
@ -26,9 +29,13 @@ import com.gh.gamecenter.R
import com.google.gson.reflect.TypeToken
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import okhttp3.MediaType
import okhttp3.RequestBody
import java.net.URI
import java.util.concurrent.TimeUnit
import kotlin.math.abs
/**
@ -79,6 +86,21 @@ fun ViewPager.addOnPageChangeListener(onSelected: ((position: Int) -> Unit)? = n
addOnPageChangeListener(listener)
}
fun ViewPager.addOnScrollStateChanged(onStateChanged: ((state: Int) -> Unit)? = null) {
val listener = object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
}
override fun onPageScrollStateChanged(state: Int) {
onStateChanged?.invoke(state)
}
}
addOnPageChangeListener(listener)
}
/**
* RecyclerView Extensions
*/
@ -201,6 +223,29 @@ inline fun tryWithDefaultCatch(action: (() -> Unit)) {
}
}
/**
* 只在正式版本进行 try catch 操作
*
* 对于个别偶发的异常尽量不要做暴力的 try catch 处理
*/
inline fun tryCatchInRelease(action: (() -> Unit)) {
try {
action.invoke()
} catch (e: Throwable) {
if (BuildConfig.DEBUG) throw e
else e.printStackTrace()
}
}
/**
* 在 debug 状态下抛出异常
*/
fun throwExceptionInDebug(message: String = "", predicate: Boolean = true) {
if (predicate && BuildConfig.DEBUG) {
throw RuntimeException(message)
}
}
/**
* String related
*/
@ -208,6 +253,11 @@ fun String.fromHtml(): Spanned {
return HtmlCompat.fromHtml(this, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
// 将双引号换成单引号避免 JSON 解析异常 ( escape 后会有其它异常,暂时先替换成单引号了)
fun String.eliminateDoubleQuote(): String {
return this.replace("\"", "'")
}
// 去掉文章/答案的插入内容
fun String.removeInsertedContent(): String {
val textRegex = "(?s)<div class=\"gh-internal-content content-right\".*?</div>"
@ -239,7 +289,7 @@ 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 {
@ -247,6 +297,16 @@ fun Map<String, String>.createRequestBody(): RequestBody {
return RequestBody.create(MediaType.parse("application/json"), json)
}
fun Map<String, Any>.createRequestBodyAny(): RequestBody {
val json = GsonUtils.toJson(this)
return RequestBody.create(MediaType.parse("application/json"), json)
}
fun Any.toRequestBody(): RequestBody {
val json = GsonUtils.toJson(this)
return RequestBody.create(MediaType.parse("application/json"), json)
}
// 对在浏览器(WebView)显示的路径进行转码
fun String.decodeURI(): String {
return URI(null, null, this, null).rawPath
@ -270,8 +330,9 @@ fun Float.px2dip(): Int {
/**
* PopupWindow 自动适配方向
* 弹出与锚点右对齐
*/
fun PopupWindow.showAutoOrientation(anchorView: View, distanceY: Int = 0) {
fun PopupWindow.showAutoOrientation(anchorView: View, distanceY: Int = 0, distanceX: Int = 0) {
val windowPos = IntArray(2)
val anchorLoc = IntArray(2)
// 获取锚点View在屏幕上的左上角坐标位置
@ -279,21 +340,18 @@ fun PopupWindow.showAutoOrientation(anchorView: View, distanceY: Int = 0) {
val anchorHeight = anchorView.height + distanceY
// 获取屏幕的高宽
val screenHeight = anchorView.context.resources.displayMetrics.heightPixels
val screenWidth = anchorView.context.resources.displayMetrics.widthPixels
// 测量contentView
contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
// 计算contentView的高宽
val windowHeight = contentView.measuredHeight
val windowWidth = contentView.measuredWidth
// 判断需要向上弹出还是向下弹出显示
val isNeedShowUp = screenHeight - anchorLoc[1] - anchorHeight < windowHeight
if (isNeedShowUp) {
windowPos[0] = screenWidth - windowWidth
windowPos[1] = anchorLoc[1] - windowHeight
} else {
windowPos[0] = screenWidth - windowWidth
windowPos[1] = anchorLoc[1] + anchorHeight
}
windowPos[1] = if (isNeedShowUp) {
anchorLoc[1] - windowHeight
} else anchorLoc[1] + anchorHeight
windowPos[0] = anchorLoc[0] - windowWidth + anchorView.width - distanceX
animationStyle = R.style.popwindow_option_anim_style
showAtLocation(anchorView, Gravity.TOP or Gravity.START, windowPos[0], windowPos[1])
@ -353,10 +411,10 @@ fun FragmentActivity.checkStoragePermissionBeforeAction(action: (() -> Unit)) {
/**
* TextView related.
*/
fun TextView.setTextWithHighlightedTextWrappedInsideWrapper(text: String,
fun TextView.setTextWithHighlightedTextWrappedInsideWrapper(text: CharSequence,
wrapper: String = Constants.DEFAULT_TEXT_WRAPPER,
@ColorRes
highlightColorId: Int = R.color.theme,
highlightColorId: Int = R.color.theme_font,
copyClickedText: Boolean = false,
highlightedTextClickListener: (() -> Unit)? = null) {
TextHelper.highlightTextThatIsWrappedInsideWrapper(this, text, wrapper, highlightColorId, object : SimpleCallback<String> {
@ -385,7 +443,7 @@ fun TextView.setTextChangedListener(action: (s: CharSequence, start: Int, before
}
fun Int.toColor(): Int {
return HaloApp.getInstance().application.resources.getColor(this)
return ContextCompat.getColor(HaloApp.getInstance().application, this)
}
fun Int.toResString(): String {
@ -403,6 +461,22 @@ fun SimpleDraweeView.display(url: String) {
ImageUtils.display(this, url)
}
/**
* 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 {
Utils.log("Block one useless sub process method call.")
}
}
/**
* 测试用包裹
*/
@ -416,4 +490,76 @@ inline fun testChannelOnly(f: () -> Unit) {
if (HaloApp.getInstance().channel == Config.DEFAULT_CHANNEL) {
f()
}
}
/**
* 倒计时单位s
*/
inline fun countDownTimer(
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 < timeInSeconds) {
block.invoke(false, timeInSeconds - it)
} else {
block.invoke(true, 0)
if (subscribe != null && !subscribe!!.isDisposed) {
subscribe?.dispose()
}
}
}
return subscribe
}
/**
* 正计时
* @start 起始时间
*/
inline fun countUpTimer(
start: Long,
period: Long = 1000,
crossinline block: (millisUntilFinished: Long) -> Unit
): Disposable {
var startTime = start
return Observable.interval(0, period, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
startTime += period
block.invoke(startTime)
}
}
/**
* 计时器(注意不需要的时候要取消订阅)
*/
inline fun rxTimer(interval: Long, crossinline block: (times: Long) -> Unit): Disposable {
return Observable.interval(0, interval, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
block.invoke(it)
}
}
fun LottieAnimationView.doOnAnimationEnd(action: () -> Unit) {
this.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {
}
override fun onAnimationEnd(animation: Animator?) {
action.invoke()
}
override fun onAnimationCancel(animation: Animator?) {
}
override fun onAnimationStart(animation: Animator?) {
}
})
}

View File

@ -82,11 +82,70 @@ object GameRepositoryHelper {
return null
}
fun replaceInstalledApp(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 isThisPositionAdded = false
// 检查是否已安装该游戏里同包名的 APK
for (apk in game.getApk()) {
if (PackageHelper.validLocalPackageNameSet.contains(apk.packageName)) {
// 将该位置的游戏标记为需要替换
positionOfTheGameToReplaceList.add(index)
isThisPositionAdded = true
break
}
}
// 若此游戏所包含的 apk 没有已安装,那么再检查是否已安装有预设相关包名
if (!isThisPositionAdded) {
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 {
// 若该补充游戏已经存在关联关系,判定为非唯一
for (relatedId in game.relatedGameIds!!) {
gameIdList.contains(relatedId)
return false
if (gameIdList.contains(relatedId)) {
return false
}
}
for (apk in game.getApk()) {
// 检查本地是否已安装该游戏,已过滤那部分框架服务的包名

View File

@ -2,7 +2,6 @@ package com.gh.common.util;
import android.content.Context;
import android.graphics.Color;
import androidx.core.content.ContextCompat;
import android.text.TextUtils;
import android.widget.TextView;
@ -10,6 +9,8 @@ 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;
@ -18,8 +19,11 @@ import com.gh.gamecenter.manager.PackagesManager;
import com.lightgame.download.DownloadEntity;
import com.lightgame.download.DownloadStatus;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.Nullable;
public class GameUtils {
@ -52,13 +56,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));
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);
}
}
@ -66,6 +70,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; // 可更新数量
@ -102,7 +110,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())) {
@ -117,18 +125,59 @@ 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();
@ -148,7 +197,51 @@ public class GameUtils {
gameUpdateEntity.setBrief(gameEntity.getBrief());
gameUpdateEntity.setPlugin(apkEntity.getPlugin());
gameUpdateEntity.setDownload(gameEntity.getDownload());
gameUpdateEntity.setIndexPlugin(gameEntity.getIndexPlugin());
gameUpdateEntity.setPluginDesc(gameEntity.getPluginDesc());
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

@ -3,7 +3,6 @@ package com.gh.common.util;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import androidx.core.content.ContextCompat;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.View;
@ -11,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;
@ -31,17 +33,35 @@ import java.util.TimeZone;
*/
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()) {
if (tagStyle == null || tagStyle.isEmpty()) {
// 没有数据的话默认不显示
// TagStyleEntity tagEntity = new TagStyleEntity();
// tagEntity.setName("官方版");
// labelLayout.addView(getNewGameTagView(context, tagEntity, 0));
} else {
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;
}
}
}
}
public static void setLabelList(Context context, LinearLayout labelLayout, String tagType, List<TagStyleEntity> tagStyle) {
labelLayout.removeAllViews();
if (tagStyle == null || tagStyle.isEmpty()) {
labelLayout.addView(getGameTagView(context, "官方版", 0, tagType, null));
} else {
for (int i = 0, size = tag.size(); i < size; i++) {
for (int i = 0; i < tagStyle.size() - 1; i++) {
View view;
if (i == size - 1) {
view = getGameTagView(context, tag.get(i), 0, tagType, tagStyle.size() > i ? tagStyle.get(i) : null);
if (i == tagStyle.size() - 1) {
view = getGameTagView(context, tagStyle.get(i).getName(), 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);
view = getGameTagView(context, tagStyle.get(i).getName(), DisplayUtils.dip2px(context, 8), tagType, tagStyle.size() > i ? tagStyle.get(i) : null);
}
if (view != null) {
labelLayout.addView(view);
@ -53,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

@ -8,6 +8,8 @@ import org.json.JSONObject
/**
* 广点通辅助类 [https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/403]
*
* 更换帐号 [https://gitlab.ghzs.com/pm/yunying/issues/893]
*/
object GdtHelper {
@ -21,7 +23,7 @@ object GdtHelper {
const val PLATFORM = "PLATFORM"
fun init(application: Application) {
GDTAction.init(application, "1108222478", "0b2bb2b971c8221be45a8454f05a0b1f")
GDTAction.init(application, "1110071928", "7fe03caa04ed382e9dce401312b1d0ae")
}
fun logAction(type: String) {

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