Compare commits

...

1106 Commits

Author SHA1 Message Date
8c0773aab2 fix:模拟器下载流程修复20221027测试反馈 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2125 2022-10-28 14:35:36 +08:00
e596de766a Merge remote-tracking branch 'origin/dev' into feature-issues2125 2022-10-27 14:36:36 +08:00
12c3605db8 fix:规范修改 2022-10-27 11:44:37 +08:00
ea51827ed6 Merge branch 'feature-issues2049' into 'dev'
feat:【光环助手V5.15.0】登录相关优化(20221025需求补充) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049#note_175003

See merge request halo/android/assistant-android!371
2022-10-27 11:39:40 +08:00
ff4a78ae93 feat:【光环助手V5.15.0】登录相关优化(20221025需求补充) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049#note_175003 2022-10-27 11:39:40 +08:00
4201d0abd3 fix:规范修改 2022-10-27 11:30:40 +08:00
3a0daea1fb fix:修改 2022-10-27 11:18:22 +08:00
19ff2a1fb7 Merge branch 'feature-issues2132' into 'dev'
fix:【光环助手V5.15.0】前端优化汇总10月第3周(7) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2132

See merge request halo/android/assistant-android!370
2022-10-27 11:11:22 +08:00
2efd0e8bc9 fix:【光环助手V5.15.0】前端优化汇总10月第3周(7) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2132 2022-10-27 11:11:22 +08:00
17e4923c98 fix修改私有变量命名规范 2022-10-27 10:39:37 +08:00
1a2c90cfb0 fix:合并冲突 2022-10-27 10:37:46 +08:00
6dca8cf33c !format: 全局格式化代码 2022-10-26 18:16:47 +08:00
322774fc78 fix:【光环助手V5.15.0】登录相关优化(1024UI测试问题) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049#note_174815 2022-10-26 16:59:25 +08:00
8128aa603c fix:【光环助手V5.15.0】前端优化汇总10月第1周(1026UI测试问题 正文第7点) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114#note_175286 2022-10-26 16:36:05 +08:00
06c084a1ec feat:模拟器游戏埋点 2022-10-26 16:29:53 +08:00
b05fb22e42 fix: 【光环助手V5.15.0】前端优化汇总10月第1周(1026UI测试问题第1点(1-3)、第10点(1)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-26 16:00:40 +08:00
2ab9b175e9 fix: 【光环助手V5.15.0】前端优化汇总10月第1周(1026UI测试问题第1点(1-3)、第10点(1)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-26 15:51:39 +08:00
930fc88183 merge 2022-10-26 11:30:14 +08:00
e8dec7d101 Merge remote-tracking branch 'origin/dev' into feature-issues2125 2022-10-26 11:20:46 +08:00
28fcd20186 fix:模拟器下载流程修改 2022-10-26 11:06:20 +08:00
f37b3a9729 feat:【光环助手V5.15.0】登录相关优化(优化代码) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-26 09:52:10 +08:00
d8483686d2 Merge remote-tracking branch 'origin/dev' into feature-issues2125
# Conflicts:
#	app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt
2022-10-25 17:40:55 +08:00
cb67b4f01e Merge branch 'dev' into 'feature-issues2125'
# Conflicts:
#   app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt
2022-10-25 09:31:16 +00:00
236ecb9f4f fix:解决冲突 2022-10-25 17:26:46 +08:00
1e9f17bba5 feat: 【光环助手V5.15.0】前端优化汇总10月第1周(11) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-25 17:25:26 +08:00
877335f47b fix:解决冲突 2022-10-25 17:21:07 +08:00
676b81b649 feat: 模拟器下载流程调整 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2125 2022-10-25 17:03:41 +08:00
f95365c6ba fix:【光环助手V5.15.0】个人主页新增显示用户ID(1025测试) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2069#note_174911 2022-10-25 16:20:31 +08:00
97022f19f6 Merge remote-tracking branch 'origin/release' into dev 2022-10-25 16:08:15 +08:00
9f60dd7c55 Merge branch 'hotfix-v5.14.0-630-dark_mode_fixes' into 'release'
fix: 修复在原生系统上部分 UI 组件不能响应深色模式状态变更的问题

See merge request halo/android/assistant-android!366
2022-10-25 16:07:29 +08:00
0124fa4d8e fix: 修复在原生系统上部分 UI 组件不能响应深色模式状态变更的问题 2022-10-25 16:06:02 +08:00
e3eef66884 refactor: 移除废弃的旧问答相关代码和资源 https://git.shanqu.cc/halo/android/assistant-android/-/issues/89 2022-10-25 14:48:07 +08:00
56395bc6fa feat:【光环助手V5.15.0】数据后台-新增活动相关数据统计展示 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2053 2022-10-25 14:46:19 +08:00
7f2fd57d43 feat:【光环助手V5.15.0】数据后台-新增活动相关数据统计展示 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2053 2022-10-25 14:40:08 +08:00
fb6d96e79d feat: 下载请求添加 referer https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2134 2022-10-25 11:34:55 +08:00
369edbe04e fit:【光环助手V5.15.0】前端优化汇总10月第2周(4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2121 2022-10-25 11:09:07 +08:00
2a56165424 Merge branch 'hotfix-v5.14.0-630-update' into 'release'
fix: 修复更新弹窗进度失效的问题

See merge request halo/android/assistant-android!365
2022-10-25 10:24:08 +08:00
48b8c46cdf fix: 修复更新弹窗进度失效的问题 2022-10-25 10:22:17 +08:00
6b33a0a2ff feat:【光环助手V5.15.0】前端优化汇总10月第2周(1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2121 2022-10-24 18:33:44 +08:00
b38d90b107 feat:【光环助手V5.15.0】登录相关优化(更换压缩图片) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-24 17:28:58 +08:00
896f43246b feat:【光环助手V5.15.0】登录相关优化(处理一键登录图片资源找不到问题) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-24 17:06:15 +08:00
b5e3d3a03e Merge branch 'hotfix-v5.14.0-630-dark_mode' into 'release'
fix: 修复正式包暗色模式被禁用的问题

See merge request halo/android/assistant-android!364
2022-10-24 16:29:56 +08:00
65fc3e6304 fix: 修复正式包暗色模式被禁用的问题 2022-10-24 16:19:34 +08:00
3f895d2cc3 feat:【光环助手V5.15.0】登录相关优化(处理点击登录闪退问题) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049#note_174795 2022-10-24 16:00:53 +08:00
58cebe900e feat:【光环助手V5.15.0】登录相关优化(更新一键登录混淆规则) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-24 15:26:06 +08:00
ecf003bd84 feat:【光环助手V5.15.0】登录相关优化(移除邀请码) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049#note_174795 2022-10-24 15:02:55 +08:00
7c2dae7125 feat:【光环助手V5.15.0】登录相关优化(更换压缩后的图) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-24 11:50:42 +08:00
8451a776dd Revert "ci: 升级 didi booster"
This reverts commit 5e9dc881d5.
2022-10-24 10:45:50 +08:00
2cb91a7917 feat:【光环助手V5.15.0】登录相关优化(处理逻辑问题) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-23 20:20:52 +08:00
4d9b53420f feat:【光环助手V5.15.0】登录相关优化(处理夜间模式UI) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-23 19:48:17 +08:00
82300e4b4e feat:【光环助手V5.15.0】登录相关优化 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2049 2022-10-21 18:41:15 +08:00
5e9dc881d5 ci: 升级 didi booster 2022-10-21 17:55:52 +08:00
1a1ed4a159 Merge remote-tracking branch 'origin/dev-5.15.0' into dev-5.15.0 2022-10-21 17:40:34 +08:00
b9d6dfc83a !refactor: 删除废弃的论坛选择页面代码 2022-10-21 17:39:50 +08:00
fbc1ccf886 Revert "build: 修改 buildSrc AGP版本为7.2.2"
This reverts commit 28d983dc00.
2022-10-21 17:17:50 +08:00
f33b699723 !refactor: 完全解耦光能模块,默认不添加到依赖中,移除旧版我的光环页面代码,清理无用资源 2022-10-21 16:58:20 +08:00
a970db9ca1 ci: 邮件包恢复使用 AndResguard 2022-10-21 11:02:19 +08:00
28d983dc00 build: 修改 buildSrc AGP版本为7.2.2 2022-10-20 18:19:23 +08:00
24193a6456 fix:清除gid修改 2022-10-20 17:28:10 +08:00
bb264496cc feat:在debug下 设置-》清除缓存处添加一个清除gid 2022-10-20 17:16:54 +08:00
11b75a9c52 Merge branch 'dev' into dev-5.15.0 2022-10-20 16:36:39 +08:00
eebc531707 Merge remote-tracking branch 'origin/release' into dev 2022-10-20 16:34:19 +08:00
5f5dc8e50f Merge branch 'hotfix-v5.13.5-615-activity_finish_error' into 'release'
fix: 修复设置中设置不保留 activity 时,返回单个 activity 会造成整个应用退出的问题

See merge request halo/android/assistant-android!363
2022-10-20 16:33:51 +08:00
017188a409 fix: 修复设置中设置不保留 activity 时,返回单个 activity 会造成整个应用退出的问题 2022-10-20 16:32:35 +08:00
f23ac762e2 fix: 修改板块通用链接标题间距错误问题 2022-10-20 11:38:38 +08:00
829991571e feat:【光环助手V5.15.0】前端优化汇总10月第1周(3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-19 16:52:04 +08:00
af01bd6990 Merge branch 'hotfix-v5.12.8-598-game_detail_subtitle' into 'release'
fix: 修复游戏详情副标题出现的闪退问题

See merge request halo/android/assistant-android!362
2022-10-19 14:58:21 +08:00
1150be4f52 fix: 修复游戏详情副标题出现的闪退问题 2022-10-19 14:41:12 +08:00
c685df4fd7 Merge branch 'hotfix-v5.13.5-615-content_provider_crash' into 'release'
fix: 捕抓实名认证 ContentProvider 闪退并上报至 Sentry

See merge request halo/android/assistant-android!360
2022-10-19 14:08:12 +08:00
f8d372207e fix: 捕抓实名认证 ContentProvider 闪退并上报至 Sentry 2022-10-19 14:07:17 +08:00
83358fab7d Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-10-19 12:01:47 +08:00
6ac1465329 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-10-19 11:58:40 +08:00
596b5603cf chore: 版本更新至 5.13.5 2022-10-18 17:43:15 +08:00
e0cd733d63 fix: 修复畅玩下载的问题 2022-10-18 17:42:03 +08:00
1d53a12082 fix:【光环助手V5.15.0】前端优化汇总10月第2周(2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2121 2022-10-18 13:53:34 +08:00
7f12dc09a0 chore: 版本更新至 5.13.4 2022-10-18 10:50:02 +08:00
7254db3c0e Merge branch 'hotfix-v5.13.3-613-notification_crash' into 'release'
fix: 修复 Android 10 以上设备应用处于后台时点击任务栏无法安装游戏的问题,修复下载完成时通知栏通知更新偶发的闪退问题

See merge request halo/android/assistant-android!359
2022-10-18 10:36:25 +08:00
5de5d07bca fix: 修复 Android 10 以上设备应用处于后台时点击任务栏无法安装游戏的问题,修复下载完成时通知栏通知更新偶发的闪退问题 2022-10-18 09:58:12 +08:00
3442602ff8 Merge branch 'hotfix-v5.13.3-613-web_crash' into 'release'
修改加载web页面闪退问题

See merge request halo/android/assistant-android!358
2022-10-17 18:00:01 +08:00
a57e4caa22 fix: 修改加载web页面闪退问题 2022-10-17 17:55:51 +08:00
05006d91b5 Merge branch 'hotfix-5.13.3-613_home_index_out_of_bounds' into 'release'
修改首页数组越界问题

See merge request halo/android/assistant-android!357
2022-10-17 17:20:44 +08:00
cfd67f3160 fix: 修改首页数组越界问题 2022-10-17 16:54:37 +08:00
a66c6daa82 ci: jenkins 编译脚本不再指定 submodule 分支 2022-10-17 14:22:23 +08:00
73818acb9f Merge branch 'feature-issues86' into 'dev-5.15.0'
新增本地 mock 接口返回数据

See merge request halo/android/assistant-android!353
2022-10-17 13:56:46 +08:00
ebbbc618b9 新增本地 mock 接口返回数据 2022-10-17 13:56:46 +08:00
5a560869d3 feat: 【光环助手V5.15.0】前端优化汇总10月第1周(1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-17 11:25:39 +08:00
81c3381d94 Merge remote-tracking branch 'origin/dev' into dev-5.15.0 2022-10-17 09:41:55 +08:00
f0b7cdda32 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-10-17 09:39:14 +08:00
72c5c844fc Merge remote-tracking branch 'origin/legacy-release' into release 2022-10-14 17:04:19 +08:00
e405be9deb fix: 获取下载目录添加存储权限检测 2022-10-14 17:02:31 +08:00
752f79ad65 fix: 版本更新至 5.13.3 2022-10-14 14:59:26 +08:00
e377a52e74 Merge remote-tracking branch 'origin/legacy-release' into release 2022-10-14 14:54:50 +08:00
91c343a02b Merge branch 'hotfix-v5.12.8-598-update' into 'legacy-release'
fix: 修复因为没有授予存储权限导致应用内更新失效的问题

See merge request halo/android/assistant-android!356
2022-10-14 14:53:18 +08:00
1fbc834597 fix: 修复因为没有授予存储权限导致应用内更新失效的问题 2022-10-14 14:50:51 +08:00
9251ade73c fix: 修复部分 tab 的文字没有跟随深色模式变更的问题 2022-10-13 17:20:25 +08:00
d759ec2d66 Merge branch 'feature-upgrade_dependencies' into dev-5.15.0 2022-10-13 16:25:10 +08:00
22053f5c7f refactor: 【光环助手V5.15.0】详细信息板块相关调整(删除无用条件判断) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2048 2022-10-13 16:18:07 +08:00
ab968673e1 feat: 【光环助手V5.15.0】详细信息板块相关调整 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2048 2022-10-13 16:09:05 +08:00
bec06b63c7 fix: 修复系统切换浅色/深色模式时的闪退问题 2022-10-13 15:06:06 +08:00
8efe5ec460 Merge remote-tracking branch 'origin/dev' into dev-5.15.0 2022-10-13 14:06:23 +08:00
025e72101f fix: 【光环助手V5.15.0】前端优化汇总10月第1周(17,18) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-13 14:01:55 +08:00
bd1887baad Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-10-13 14:01:13 +08:00
082e9b376a Merge remote-tracking branch 'origin/legacy-release' into release 2022-10-13 14:00:23 +08:00
5014eda3f2 Merge branch 'hotfix-v5.12.8-598_block_navigation_not_display' into 'legacy-release'
修复板块导航栏不显示问题

See merge request halo/android/assistant-android!355
2022-10-13 13:46:53 +08:00
1b4852ae0c fix: 修复板块导航栏不显示问题 2022-10-13 12:13:01 +08:00
52a23f5bde Merge branch 'hotfix-v5.13.1-611-check_webview_is_available' into 'release'
修改模拟器不能显示网页的问题

See merge request halo/android/assistant-android!354
2022-10-13 11:48:03 +08:00
baae314d85 fix: 修改模拟器不能显示网页的问题 2022-10-13 11:34:32 +08:00
85372416c0 fix: 【光环助手V5.15.0】前端优化汇总10月第1周(17,18) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-13 10:41:59 +08:00
6d8908fe57 fix: 修复游戏详情页暗色模式切换时的闪退 2022-10-13 09:48:16 +08:00
4d0d9c0b48 fix: 修复切换暗色模式时有机率卡死的问题 2022-10-12 17:58:14 +08:00
a68782203b fix:【光环助手V5.15.0】前端优化汇总10月第1周(7、8) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-12 17:47:08 +08:00
2fcfaf2ccd feat: 【光环助手V5.15.0】前端优化汇总10月第1周(10) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-12 16:14:41 +08:00
d58a6df56a Merge branch 'dev-5.15.0' of git.shanqu.cc:halo/android/assistant-android into dev-5.15.0 2022-10-12 15:49:44 +08:00
2f8a783565 feat: 【光环助手V5.15.0】前端优化汇总10月第1周(2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-12 15:49:38 +08:00
9234a2f4ee fix: 修复判断是否使用浏览器安装偶发的闪退 2022-10-12 14:52:42 +08:00
662dd88be7 feat: 【光环助手V5.15.0】前端优化汇总10月第1周(11) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-12 14:28:58 +08:00
ba64292b76 fix: 修复判断是否使用浏览器安装偶发的闪退 2022-10-12 14:09:01 +08:00
6fd43dd61b chore: 版本更新至 5.13.2 2022-10-12 13:52:24 +08:00
4ce7eee8eb feat: 【光环助手V5.15.0】前端优化汇总10月第1周(10) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-12 11:44:02 +08:00
e3c2711b64 Merge remote-tracking branch 'origin/dev' into dev-5.15.0
# Conflicts:
#	dependencies.gradle
2022-10-12 11:34:51 +08:00
e00df4a066 fix: 【光环助手V5.15.0】前端优化汇总10月第1周(16) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-12 11:33:38 +08:00
9764c2ce1a fix: 修复双列卡片专题跳转游戏详情无法下载游戏的问题 2022-10-12 11:14:19 +08:00
f588c2d981 Merge remote-tracking branch 'origin/release' into dev 2022-10-12 11:07:44 +08:00
e5dad8a8ce Merge remote-tracking branch 'origin/legacy-release' into release 2022-10-12 11:01:07 +08:00
3818160a5e Merge branch 'hotfix-v5.12.7-597-double_card_list_gamedetail' into 'legacy-release'
fix: 修复双列专题跳转游戏详情无法下载的问题

See merge request halo/android/assistant-android!352
2022-10-12 10:52:00 +08:00
2367a0bf8a fix: 修复双列专题跳转游戏详情无法下载的问题 2022-10-12 10:51:00 +08:00
b2e728331a fix: 修复设置页面一键修复按钮可能错误显示的问题 2022-10-12 10:04:58 +08:00
7af3233152 chore: 版本更新至 5.15.0 2022-10-11 17:36:28 +08:00
243ad6afb1 fix: 处理合并异常 2022-10-11 17:28:29 +08:00
0c3a063d86 fix: 修复暗色模式启动时的判断异常问题 2022-10-11 17:28:10 +08:00
558aa9a09e fix:【光环助手V5.15.0】前端优化汇总10月第1周(4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-11 16:34:05 +08:00
33c9a2e90b Merge branch 'feature-issues2114' into 'dev-5.15.0'
fix:前端优化汇总10月第1周第五点 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114

See merge request halo/android/assistant-android!351
2022-10-11 16:28:57 +08:00
e618a0d5fd Merge branch 'hotfix-v5.12.7-597-certification' into 'legacy-release'
fix: 修复获取存储权限后 gid 并未同时更新的问题

See merge request halo/android/assistant-android!350
2022-10-11 15:39:28 +08:00
ccc97a93da fix: 修复获取存储权限后 gid 并未同时更新的问题 2022-10-11 15:38:27 +08:00
3e16f59dc5 build: 分拆主 app proguard 配置文件到各子 module 的 proguard 配置文件中 https://git.shanqu.cc/halo/android/assistant-android/-/issues/84 2022-10-11 15:09:04 +08:00
c9993de3ca Merge branch 'hotfix-v5.12.7-597-read_installed_list_permission' into 'legacy-release'
feat: 【光环助手V5.15.0】前端优化汇总10月第1周(14, 15)

See merge request halo/android/assistant-android!349
2022-10-11 14:56:00 +08:00
e3c140e5fd feat: 【光环助手V5.15.0】前端优化汇总10月第1周(14, 15) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114#note_172887 2022-10-11 14:54:32 +08:00
b2f6d111a7 fix:前端优化汇总10月第1周第五点 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-11 11:11:04 +08:00
ea03e7a73f fix: 修复部分 span 文字在深色模式启用时显示异常的问题 2022-10-11 11:06:38 +08:00
c08f268b04 feat: 【光环助手V5.14.0】关于夜间模式的特殊处理 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2106 2022-10-10 17:24:54 +08:00
f6423cb7ff feat:【光环助手V5.15.0】个人主页新增显示用户ID(1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2069 2022-10-10 16:56:16 +08:00
89f00d7412 feat: 【光环助手V5.15.0】前端优化汇总10月第1周(9) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2114 2022-10-10 16:50:33 +08:00
68061d96ed refactor!: 移除 flutter 相关代码 2022-10-10 14:51:05 +08:00
388c11b173 Merge remote-tracking branch 'origin/release' into dev 2022-10-10 11:16:26 +08:00
ced7202d04 Merge remote-tracking branch 'origin/legacy-release' into release
# Conflicts:
#	module_login/src/main/java/com/gh/gamecenter/login/utils/LoginHelper.kt
2022-10-10 11:11:32 +08:00
07c7d37d3d Merge branch 'hotfix-v5.12.7-597-qq_sdk' into 'legacy-release'
fix: 修复升级 QQ SDK 后无法使用的问题

See merge request halo/android/assistant-android!348
2022-10-10 11:09:02 +08:00
030c10c6cc fix: 修复升级 QQ SDK 后无法使用的问题 2022-10-10 11:06:52 +08:00
16162a6944 build: 升级编译环境 https://git.shanqu.cc/halo/android/assistant-android/-/issues/85 2022-10-10 10:55:20 +08:00
5b9879e8a0 fix: typo 2022-10-10 09:26:48 +08:00
99446c7b74 fix: 处理合并冲突 2022-10-09 17:46:42 +08:00
077b865b81 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java
#	app/src/main/java/com/gh/gamecenter/setting/VideoSettingFragment.kt
#	app/src/main/java/com/halo/assistant/HaloApp.java
#	dependencies.gradle
2022-10-09 17:36:11 +08:00
e1a95a241a fix: 处理合并冲突 2022-10-09 17:31:08 +08:00
50e15fa79a Merge remote-tracking branch 'origin/legacy-release' into release
# Conflicts:
#	app/src/main/java/com/halo/assistant/HaloApp.java
#	module_login/src/main/java/com/gh/gamecenter/login/utils/LoginHelper.kt
2022-10-09 17:20:32 +08:00
933c3c4fce Merge branch 'hotfix-v5.12.7-597-privacy-policy' into 'legacy-release'
处理部分隐私相关问题

See merge request halo/android/assistant-android!347
2022-10-09 16:45:33 +08:00
2a79c9cddd fix: 禁用 WorkManager ,减少非必要权限 2022-10-09 16:43:26 +08:00
7d6fb3e815 fix: 处理 SonarQube 问题 2022-10-09 16:29:48 +08:00
1c95a6b968 fix: 修复初次启动时会多次获取已安装列表的问题 2022-10-09 11:29:55 +08:00
23c7a741cc fix: 处理 gson 序列化问题 2022-10-09 10:05:43 +08:00
46bdc4e4f7 Merge branch 'hotfix-v5.12.7-597-privacy_policy' into 'legacy-release'
处理部分隐私相关问题

See merge request halo/android/assistant-android!346
2022-10-08 17:23:56 +08:00
f41836615d fix: 停用一键登录提前初始化功能 2022-10-08 17:17:04 +08:00
d883b29cde fix: 移除下载前临时创建文件的测试代码 2022-10-08 17:06:03 +08:00
d36055276d fix: 移除普通日志中的 rom 检查上报,移除模拟器检测 2022-10-08 17:04:18 +08:00
e0c1d8169d fix: 更新 gid/sentry 依赖 2022-10-08 17:03:02 +08:00
c18945113c fix: 更新 QQ 登录 SDK 2022-10-08 17:02:13 +08:00
6ec3d21994 fix: 修复资讯中心评论详情页面不兼容深色模式的问题 2022-10-08 14:47:27 +08:00
add6b2bc5e Merge branch 'hotfix-v5.13.1-611-vector_crash' into 'release'
fix: 修复5.0以下系统出现的矢量图闪退问题

See merge request halo/android/assistant-android!345
2022-10-08 14:37:10 +08:00
936c793ddf fix: 修复5.0以下系统出现的矢量图闪退问题 2022-10-08 14:32:48 +08:00
bb08a845fc fix: 修复视频播放设置选择图标错误显示的问题 2022-10-08 14:03:05 +08:00
a36c2085ef Merge branch 'hotfix-5.12.7-597-vector_crash' into 'legacy-release'
fix: 修复5.0以下系统出现的矢量图闪退问题

See merge request halo/android/assistant-android!344
2022-10-08 13:39:30 +08:00
d7e0de88d7 fix: 修复5.0以下系统出现的矢量图闪退问题 2022-10-08 11:59:17 +08:00
931213dc82 Merge branch 'pack-v5.12.X-privacy_policy' into 'legacy-release'
调整用户隐私相关内容

See merge request halo/android/assistant-android!343
2022-10-08 10:44:19 +08:00
11c7959b38 fix: 处理 SonarQube 问题 2022-09-30 16:25:31 +08:00
4989debca5 fix: 修复我的光环活动位轮播垂直滑动时用户信息区域无法伸缩的问题 2022-09-30 16:04:42 +08:00
082a5fbff8 fix:【光环助手V5.14.0】发布内容需手机号验证(UI测试问题 2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2054#note_171946 2022-09-30 10:00:47 +08:00
396bfbf52d fix: 处理 SonarQube 问题 2022-09-29 17:45:01 +08:00
c4ad84d0c6 fix: 处理 SonarQube 问题 2022-09-29 17:29:53 +08:00
b2dc318257 chore: 版本更新至 5.13.1 2022-09-29 17:04:24 +08:00
d28595afdd fix: 处理合并冲突 2022-09-29 17:04:04 +08:00
c2cd7b6f8a Merge remote-tracking branch 'origin/pack-v5.12.X-privacy_policy' into release
# Conflicts:
#	app/src/main/java/com/gh/common/util/DirectUtils.kt
#	app/src/main/java/com/gh/gamecenter/SkipActivity.java
#	app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescFragment.kt
#	dependencies.gradle
#	module_login/src/main/java/com/gh/gamecenter/login/utils/QuickLoginHelper.kt
#	module_login/src/main/java/com/gh/gamecenter/login/view/LoginFragment.java
2022-09-29 16:55:26 +08:00
da997ad544 fix:【光环助手V5.14.0】前端优化汇总9月第4周(31) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-29 16:16:07 +08:00
f374f105ce fix:【光环助手V5.14.0】前端优化汇总9月第4周(31-32) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-29 16:01:57 +08:00
48459c84e1 fix: 隐私弹窗链接跳转至外部浏览器打开 2022-09-29 15:17:39 +08:00
8f72f80788 fix: 避免隐私政策通过前获取 rom 信息 2022-09-29 14:57:48 +08:00
fef66248ea fix: 处理 SonarQube 问题 2022-09-29 14:21:54 +08:00
d3e499696f fix: 处理 SonarQube 问题 2022-09-29 13:52:55 +08:00
4631d4daeb Merge remote-tracking branch 'origin/dev' into dev 2022-09-29 11:53:12 +08:00
9bdf69e9a6 fix:暂时取消个人主页显示用户ID(需求已改到下个版本) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2069 2022-09-29 11:52:56 +08:00
861b8312e1 Merge remote-tracking branch 'origin/dev' into dev 2022-09-29 11:49:13 +08:00
c4763ea342 fix:修复WebView首次加载重置深色模式的问题 2022-09-29 11:46:50 +08:00
ff0dcfd7e1 fix: 测试包添加 ANR 上报 2022-09-29 11:39:41 +08:00
6c558a1a17 fix: 更新 ci 脚本 2022-09-29 11:27:04 +08:00
e0870b875f Merge remote-tracking branch 'origin/dev-5.14.0' into dev 2022-09-29 11:10:12 +08:00
dae502bf55 Merge remote-tracking branch 'origin/release' into dev 2022-09-29 10:56:55 +08:00
7e26003698 fix:【光环助手V5.14.0】前端优化汇总9月第4周(30) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-29 10:35:41 +08:00
7a5e27cffa fix:【光环助手V5.14.0】游戏评分相关优化(0928测试 2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_172175 2022-09-28 21:47:21 +08:00
0711d72f6d fix:视频tab-视频流-评论面板缺省页修改 2022-09-28 21:45:19 +08:00
07331efffb fix:【光环助手V5.14.0】游戏评分相关优化(0928测试 17) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_171941 2022-09-28 21:19:54 +08:00
585acb9bae fix:【光环助手V5.14.0】前端优化汇总9月第4周(26-27) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-28 21:10:52 +08:00
13e9ba4f48 fix: 移除 android.permission.GET_TASKS 权限 2022-09-28 21:00:03 +08:00
9434d7f9ba fix:通用无内容 页面,隐藏第二行文案 2022-09-28 20:52:40 +08:00
11643b9be0 fix:【光环助手V5.14.0】游戏评分相关优化(0928测试 2、7、18) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_171941 2022-09-28 20:47:18 +08:00
2bec88c130 fix:修改深色模式下负向浅色按钮的背景 2022-09-28 20:28:52 +08:00
ef9fd9d256 fix:【光环助手V5.14.0】前端优化汇总9月第4周(20-29) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-28 19:57:43 +08:00
580e86c148 fix:【光环助手V5.14.0】游戏评分相关优化(0928UI补充 1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_172008 2022-09-28 16:24:46 +08:00
9ff97dde77 fix:【光环助手V5.14.0】前端优化汇总9月第4周(19) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-28 16:20:28 +08:00
207b650c34 fix:【光环助手V5.14.0】我的光环页面改版(0928补充问题1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2062 2022-09-28 16:18:24 +08:00
1ce7cd8ee3 fix:【光环助手V5.14.0】发布内容需手机号验证(UI测试问题 1、0928测试 2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2054#note_171969 2022-09-28 15:38:51 +08:00
b015d76004 fix:【光环助手V5.14.0】前端优化汇总9月第4周(17-18) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-28 15:35:24 +08:00
5f622d894d fix:【光环助手V5.14.0】我的光环页面改版(0927测试3-4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2062 2022-09-28 14:50:32 +08:00
faffbbfa87 chore: 版本更新至 5.12.8 2022-09-28 14:45:39 +08:00
d494957880 feat: 移除启动时的权限弹窗,移除读取手机信息的权限 2022-09-28 14:42:12 +08:00
c37b299ab7 fix:【光环助手V5.14.0】前端优化汇总9月第4周(16) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-28 14:24:39 +08:00
41331d23a0 fix:【光环助手V5.14.0】游戏评分相关优化(0927UI测试) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_171619 2022-09-28 13:57:15 +08:00
5e3a38f52d fix:【光环助手V5.14.0】前端优化汇总9月第4周(11-15) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098 2022-09-28 10:17:20 +08:00
21c8f4cf62 fix:【光环助手V5.14.0】游戏评分相关优化(0926测试 16、18) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_171613 2022-09-27 18:31:29 +08:00
fb08bc59be fix:【光环助手V5.14.0】游戏评分相关优化(0926测试 1、7、8) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063#note_171613 2022-09-27 17:32:29 +08:00
680590e6c2 fix:【光环助手V5.14.0】前端优化汇总9月第4周(2-10) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2098
fix:【光环助手V5.14.0】前端优化汇总9月第3周(4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2086
2022-09-27 15:32:04 +08:00
ee169b55c5 fix:【光环助手V5.14.0】前端优化汇总9月第2周 (8-3、8-4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2079 2022-09-27 11:25:30 +08:00
d3caa5d66c fix:【光环助手V5.14.0】我的光环页面改版(0927补充) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2062 2022-09-27 11:13:30 +08:00
c195be5137 fix: 修改更新弹窗内存泄露问题 2022-09-27 10:56:13 +08:00
40ce144fee feat:【光环助手V5.14.0】发布内容需手机号验证 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2054 2022-09-27 10:53:38 +08:00
ba2fd87b21 fix:我的光环-帮助与反馈 按钮颜色修改 2022-09-27 10:50:28 +08:00
0e385e193f fix:论坛搜索结果左间距修改 2022-09-26 15:58:36 +08:00
341eabee27 fix: 修复 Android 10 以上设备应用处于后台时点击任务栏无法安装游戏的问题 2022-09-26 15:56:57 +08:00
091948cdd1 Merge branch 'hotfix-v5.12.7-597-crashes' into 'release'
Hotfix v5.12.7 597 crashes

See merge request halo/android/assistant-android!342
2022-09-26 15:00:46 +08:00
a2d439e207 fix: typo 2022-09-26 15:00:13 +08:00
b2a1ce54a3 fix:【光环助手V5.14.0】我的光环页面改版(0923UI测试问题1、4、7、10) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2062 2022-09-26 14:22:59 +08:00
1d96e1f92d fix: 还原在工作线程处理视频日志 2022-09-26 12:01:16 +08:00
42fd666ba0 Merge branch 'feature-issues2061' into 'dev-5.14.0'
fix:修改接口返回404时使用通用数据异常的缺省页

See merge request halo/android/assistant-android!341
2022-09-26 11:52:27 +08:00
2aeaecfaf3 fix: 修改接口返回404时使用通用数据异常的缺省页 2022-09-26 11:52:26 +08:00
44d039658e feat: 【光环助手V5.15.0】数据后台-内容数据展示优化(新增埋点) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2059 2022-09-26 11:42:26 +08:00
90a8cce831 fix: 提高触发 WorkManager 的阈值,规避因为空间不足导致的各种奇怪闪退 2022-09-26 11:36:56 +08:00
9bf019530d fix: 修复游戏下载完成后将状态改为查看引起的点击闪退 2022-09-26 11:31:42 +08:00
fd933f9d59 fix:【光环助手V5.14.0】我的光环页面改版(0923UI测试问题1-9,0923测试1、2、5) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2062 2022-09-26 11:29:43 +08:00
176dc4fe02 fix: 使用工作线程调用日志上报方法,避免部分性能较差设备 ANR 2022-09-26 11:20:43 +08:00
739413f450 fix: 修复首页列表分页刷新时偶发的数组越界问题 2022-09-26 09:53:22 +08:00
1b5a62e018 fix: 修复页面重建后切换深色模式,首页可能会闪退的问题 2022-09-26 09:49:00 +08:00
6bf74b4e03 fix: 整理基类代码,默认开启页面深色模式自动简单适配 2022-09-26 09:46:03 +08:00
537e59759b feat:【光环助手V5.14.0】游戏评分相关优化(修改字段) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063 2022-09-23 16:30:19 +08:00
13f937dc0e fix: 修改游戏详情最新开服数组越界问题 2022-09-23 15:37:03 +08:00
e3f0c2bb11 fix: 修复部分居中警告按钮点击以后死循环调用的问题 2022-09-23 15:11:24 +08:00
2eabc52aa7 fix: 修复深色模式切换时 window 和导航栏颜色没有变更的问题 2022-09-23 14:56:16 +08:00
cf8615c6c3 style: 整理首页推荐列表代码 2022-09-23 14:12:16 +08:00
ab7bcc2b14 Merge remote-tracking branch 'origin/dev-5.14.0' into dev-5.14.0 2022-09-22 17:34:00 +08:00
99b0010784 feat:【光环助手V5.14.0】游戏评分相关优化(前端部分) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2063 2022-09-22 17:33:05 +08:00
4af170d4fa fix: 修复首页列表加载分页时自动滚动的问题 2022-09-22 17:30:31 +08:00
c45d4b5e19 feat:【光环助手V5.14.0】我的光环页面改版 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2062 2022-09-22 15:58:49 +08:00
9fca1f1551 fix: 修复通用合集 1-2 样式在列表复用时出现高度不一致的问题 2022-09-22 15:41:19 +08:00
b8662e24a0 fix: 修复首页安利墙栏目滚动时高度异常抖动的问题 2022-09-22 15:32:57 +08:00
ad1bee4b56 Merge remote-tracking branch 'origin/dev' into dev-5.14.0
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListFragment.kt
2022-09-22 10:54:36 +08:00
69597a83a4 fix: 处理合并冲突 2022-09-22 10:53:04 +08:00
45a0f6fa1f Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt
#	dependencies.gradle
2022-09-22 10:46:04 +08:00
18ee571604 perf: 优化首页轮播图区域上下滑动时的性能 2022-09-22 10:44:41 +08:00
d50615633f feat:【光环助手V5.14.0】前端优化汇总9月第3周(2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2086 2022-09-22 09:49:52 +08:00
7e8702363c fix: 修复首页列表分页刷新时偶发的数组越界问题 2022-09-21 16:20:58 +08:00
f02032dd47 fix: 优化双列通用合集专题的性能 2022-09-21 16:20:28 +08:00
f486b3aba9 build: 升级leakcanary版本至2.9.1 2022-09-21 14:22:17 +08:00
9afa8ad61b fix: 修改部分页面背景颜色使其适配深色模式 2022-09-21 11:37:17 +08:00
63f315e294 chore: 版本更新至 5.12.7 2022-09-21 11:33:30 +08:00
9debcdf55b fix:【光环助手V5.14.0】前端优化汇总9月第3周(6) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2086 2022-09-21 11:19:09 +08:00
130cb68b83 Merge branch 'hotfix-v5.12.6-596-simulator_install_error' into 'release'
fix: 修复模拟器下载完成后无法调起安装页面的问题

See merge request halo/android/assistant-android!340
2022-09-21 11:17:21 +08:00
4895bf694b fix: 修复模拟器下载完成后无法调起安装页面的问题 2022-09-21 11:16:33 +08:00
414aaeb5ea fix:【光环助手V5.14.0】前端优化汇总9月第3周(4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2086 2022-09-20 17:44:23 +08:00
b0d1204341 fix: 优化首页双列专题的性能 2022-09-19 17:44:58 +08:00
9d76bcc06e format: 全局更改APP夜间模式相关名称的代码为深色模式 2022-09-19 15:32:26 +08:00
9e79b0d37e Merge branch 'hotfix-v5.12.6-596-vector_crash' into 'release'
fix: 修复5.0以下系统出现的矢量图闪退问题

See merge request halo/android/assistant-android!339
2022-09-19 14:56:50 +08:00
44c1f26f88 fix: 修复5.0以下系统出现的矢量图闪退问题 2022-09-19 14:48:16 +08:00
4be0ea9a96 fix: 修复双列卡片在夜间模式边缘存在锯齿的问题 2022-09-19 10:09:50 +08:00
61d16a9b50 Merge branch 'feature-issues2061' into 'dev-5.14.0'
fix:修改缺省页UI遗漏的id

See merge request halo/android/assistant-android!338
2022-09-19 09:05:37 +08:00
848b41ea76 fix:修改缺省页UI遗漏的id 2022-09-16 17:53:31 +08:00
2bd3990404 fix: 修复部分页面顶部下载按钮红点和数字显示不正确的问题 2022-09-16 16:51:56 +08:00
552da837c1 Merge remote-tracking branch 'origin/dev-5.14.0' into dev-5.14.0 2022-09-16 16:30:54 +08:00
192b1db9c9 fix: 修复首页轮播图不可见时仍然在自动滚动的问题 2022-09-16 16:29:10 +08:00
0d06701e0d chore: 版本更新至 5.12.6 2022-09-16 13:45:25 +08:00
943956c1b7 Merge branch 'hotfix-v5.12.5-595-temp_post_fixed_top' into 'release'
feat: 【光环助手】游戏业务临时需求 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2087

See merge request halo/android/assistant-android!337
2022-09-16 11:50:56 +08:00
5a47e4f87b feat: 【光环助手】游戏业务临时需求 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2087 2022-09-16 11:49:46 +08:00
731cdab9df Merge branch 'hotfix-v5.12.5-595-notification_crash' into 'release'
fix: 捕抓通知栏跳转的闪退

See merge request halo/android/assistant-android!336
2022-09-16 10:17:26 +08:00
f714beadab fix: 捕抓通知栏跳转的闪退 2022-09-16 10:15:59 +08:00
d9d7e713ba fix: 【光环助手V5.14.0】数据后台—搜索词统计 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2057 2022-09-15 17:21:01 +08:00
249b5ac876 perf: 响应系统低内存时的回调 2022-09-15 17:09:50 +08:00
14d961ed07 feat:【光环助手V5.14.0】个人主页新增显示用户ID(完成UI) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2069 2022-09-15 15:12:33 +08:00
3315686440 Merge branch 'feature-isuess2056' into 'dev-5.14.0'
fix:论坛搜索优化  https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2056

See merge request halo/android/assistant-android!334
2022-09-14 17:50:58 +08:00
bea3cdeacb Merge branch 'feature-isuess2055' into 'dev-5.14.0'
fix:修复热门内容标题显示问题

See merge request halo/android/assistant-android!335
2022-09-14 17:50:43 +08:00
1d10028353 fix:【光环助手V5.14.0】前端优化汇总9月第2周
(4-8) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2079
2022-09-14 17:47:56 +08:00
ee6f53ac92 fix:代码格式化 2022-09-14 17:45:10 +08:00
cdfda0d175 fix: 【光环助手V5.14.0】数据后台—搜索词统计 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2057 2022-09-14 17:24:13 +08:00
c6dbd167c9 Merge branch 'feature-issues2061' into 'dev-5.14.0'
feat:缺省页UI优化  https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2061

See merge request halo/android/assistant-android!330
2022-09-14 17:12:18 +08:00
b404bb91f9 fix:修复热门内容标题显示问题 2022-09-14 15:34:21 +08:00
a2488fe0c7 Merge branch 'dev-5.14.0' into feature-isuess2056 2022-09-14 14:40:26 +08:00
7602e27ac5 fix:删除无用布局,资源 2022-09-14 14:38:43 +08:00
6d21a5e8ae Merge branch 'feature-isuess2055' into 'dev-5.14.0'
社区搜索优化,新增热门内容

See merge request halo/android/assistant-android!332
2022-09-14 13:48:16 +08:00
77a1ae68ce fix:社区搜索优化,新增热门内容修改 https://git.shanqu.cc/halo/android/assistant-android/-/merge_requests/332 2022-09-14 11:49:01 +08:00
ccbacf6d37 fix:论坛搜索优化 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2056 2022-09-14 11:17:59 +08:00
d32ab37358 Merge branch 'hotfix-v5.12.5-595-crashes' into 'release'
Hotfix v5.12.5 595 crashes

See merge request halo/android/assistant-android!333
2022-09-14 11:16:29 +08:00
2f14607b03 fix: 修复插件跳转内容为空时的闪退 2022-09-14 10:47:52 +08:00
be599a24fd fix: 修复定期上报曝光事件时的闪退问题 2022-09-14 10:47:32 +08:00
c7ab3339f8 fix: 修复畅玩管理页面打开时快速切换 tab 触发的闪退 2022-09-14 10:46:11 +08:00
33c408d7e5 fix:社区搜索优化,新增热门内容补充 2022-09-14 10:37:21 +08:00
774f97261f fix:缺省页UI优化补充 2022-09-13 17:41:08 +08:00
55e7193149 feat:社区搜索优化,新增热门内容 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2055 2022-09-13 15:16:55 +08:00
76dedfbbc8 chore: 版本更新至 5.12.5 2022-09-13 13:47:59 +08:00
bfe6849ad2 Merge branch 'hotfix-v5.12.4-594-vector_crash' into 'release'
fix: 修复5.0以下系统出现的矢量图闪退问题

See merge request halo/android/assistant-android!331
2022-09-13 11:48:15 +08:00
b23e5ea441 fix: 修复5.0以下系统出现的矢量图闪退问题 2022-09-13 11:38:33 +08:00
d17bb2ac83 feat: 【光环助手V5.14.0】数据后台—搜索词统计 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2057 2022-09-13 11:28:01 +08:00
70cc9bbcb6 feat:缺省页UI优化(我的游戏页面补充) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2061 2022-09-13 10:14:53 +08:00
7ed1a37801 fix: 【光环助手V5.14.0】前端优化汇总9月第2周(1,2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2079 2022-09-13 10:07:03 +08:00
c30a2cca6d feat:缺省页UI优化 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2061 2022-09-13 09:55:53 +08:00
2c8dbf2554 Merge branch 'hotfix-v5.12.4-594-more_feedback_jump' into 'release'
feat: 补充新的畅玩反馈跳转

See merge request halo/android/assistant-android!329
2022-09-13 09:38:04 +08:00
6eb37b7e52 feat: 补充新的畅玩反馈跳转 2022-09-09 18:02:09 +08:00
9a55cc297a Merge remote-tracking branch 'origin/dev' into dev-5.14.0 2022-09-09 16:25:32 +08:00
2bbe148971 fix: 处理合并冲突 2022-09-09 16:25:04 +08:00
986d41d0c3 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/java/com/gh/common/FixedRateJobHelper.kt
#	app/src/main/java/com/gh/common/databind/BindingAdapters.java
#	app/src/main/java/com/gh/common/util/DetailDownloadUtils.java
#	app/src/main/java/com/gh/common/util/DialogUtils.java
#	app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java
#	app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt
#	dependencies.gradle
2022-09-09 16:02:17 +08:00
07a72bce77 Merge remote-tracking branch 'origin/dev-5.14.0' into dev-5.14.0 2022-09-09 15:52:20 +08:00
8384464066 perf: 微调横向专题的代码 2022-09-09 15:51:59 +08:00
1e96f3e11b fix: 版本更新至 5.12.4 2022-09-09 11:30:10 +08:00
21f99df976 feat:【光环助手V5.14.0】数据后台—新增社区点击转化统计 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2058 2022-09-08 17:35:27 +08:00
cb087fb5fb Merge branch 'hotfix-v5.12.3-593-vgame_gamedetail_switch' into 'release'
fix: 修复关闭畅玩功能的游戏详情仍然显示畅玩游戏跳转按钮的问题

See merge request halo/android/assistant-android!328
2022-09-08 17:34:34 +08:00
db03b55850 fix: 修复关闭畅玩功能的游戏详情仍然显示畅玩游戏跳转按钮的问题 2022-09-08 17:33:36 +08:00
457f050948 chore: 版本更新为 5.14.0 2022-09-08 16:49:54 +08:00
f4afda913e Merge branch 'hotfix-v5.12.3-593-game_collection_square_skeleton' into 'release'
fix: 修复游戏单广场骨架屏不能沉浸状态栏的问题

See merge request halo/android/assistant-android!327
2022-09-08 09:39:01 +08:00
2300695607 fix: 修复游戏单广场骨架屏不能沉浸状态栏的问题 2022-09-08 09:33:29 +08:00
32c318cc61 Merge branch 'hotfix-v5.12.3-593-install_hint' into 'release'
fix: 修复游戏下载时多次调用显示安装引导方法的问题

See merge request halo/android/assistant-android!326
2022-09-08 09:28:57 +08:00
7fd5a37b4c Merge branch 'feature-issues1933' into 'release'
【光环助手V_5.11.0】国际服游戏下载弹窗优化

See merge request halo/android/assistant-android!325
2022-09-08 09:22:16 +08:00
a805e56a7c Merge branch 'release' into feature-issues1933
# Conflicts:
#	app/src/main/java/com/gh/common/databind/BindingAdapters.java
#	app/src/main/java/com/gh/common/filter/RegionSetting.kt
#	app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt
#	app/src/main/java/com/gh/common/util/DetailDownloadUtils.java
#	app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java
#	dependencies.gradle
2022-09-07 19:11:20 +08:00
7679c750cf fix: 修复游戏下载时多次调用显示安装引导方法的问题 2022-09-07 18:04:00 +08:00
5440a1faf5 Merge branch 'feature-issues2047' into 'release'
feat:【光环助手】国际服游戏合规调整方案(需求变动)...

See merge request halo/android/assistant-android!324
2022-09-07 17:43:20 +08:00
ce840cf33e feat:【光环助手】国际服游戏合规调整方案(需求变动) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2047#note_169012 2022-09-07 17:41:00 +08:00
82fc7d01fc chore: 版本更新至 5.11.4 2022-09-07 17:30:58 +08:00
37a2c5171d fix: 【光环助手V_5.11.0】国际服游戏下载弹窗优化(20220907需求补充) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1933 2022-09-07 17:30:06 +08:00
b72f751dc0 Merge branch 'hotfix-v5.12.3-593-wrong_toast' into 'release'
fix: 修复异常的畅玩 toast 提示

See merge request halo/android/assistant-android!323
2022-09-07 15:48:11 +08:00
fa740bacb3 fix: 修复异常的畅玩 toast 提示 2022-09-07 15:44:27 +08:00
22e92cdaf6 Merge branch 'feature-issues2047' into 'release'
feat:【光环助手】国际服游戏合规调整方案 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2047

See merge request halo/android/assistant-android!322
2022-09-06 17:32:04 +08:00
ac72abe105 feat:【光环助手】国际服游戏合规调整方案 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2047 2022-09-06 17:29:32 +08:00
aaa2c6330e chore: 版本更新至 5.12.3 2022-09-06 17:03:31 +08:00
c338bf4f00 Merge branch 'hotfix-v5.12.2-592-download_crash' into 'release'
fix: 尝试修复启动下载服务异常...

See merge request halo/android/assistant-android!321
2022-09-06 17:02:39 +08:00
aec874b3e0 fix: 尝试修复启动下载服务异常 https://sentry.shanqu.cc/organizations/lightgame/issues/203713/?project=22&query=dist%3A592&sort=freq&statsPeriod=14d 2022-09-06 16:30:17 +08:00
dc3f3240c6 fix: 修复游戏单广场骨架屏不能沉浸状态栏的问题 2022-09-05 14:58:53 +08:00
a3ddf54afc chore: 版本更新至 5.12.2 2022-09-05 10:37:12 +08:00
d840fab316 Merge branch 'hotfix-v5.12.1-591-homepage_crash' into 'release'
fix: 修复首页下载更新页面偶发的多线程操作闪退

See merge request halo/android/assistant-android!320
2022-09-05 10:20:51 +08:00
125701534d fix: 修复首页下载更新页面偶发的多线程操作闪退 2022-09-05 10:19:29 +08:00
be85ba6c47 Merge branch 'hotfix-v5.12.1-591-home_video_crash' into 'release'
修复首页列表数据更新导致播放视频数组越界问题

See merge request halo/android/assistant-android!319
2022-09-05 10:13:29 +08:00
bcba6c4230 fix: 修复首页列表数据更新导致播放视频数组越界问题 2022-09-05 10:10:50 +08:00
453ca0ceea Merge branch 'hotfix-v5.12.1-591-crashes' into 'release'
Hotfix v5.12.1 591 crashes

See merge request halo/android/assistant-android!318
2022-09-02 11:14:40 +08:00
dc4e345ea8 fix: 多线程上报日志导致的闪退 2022-09-02 11:12:58 +08:00
946bd39fb6 fix: 修复首页列表更新数组越界闪退 2022-09-02 10:06:57 +08:00
83610a98f4 Merge branch 'hotfix-v5.12.1-591-download_crash' into 'release'
fix: 尝试修复启动下载服务时的闪退

See merge request halo/android/assistant-android!317
2022-09-01 16:28:18 +08:00
e21d8a5ac5 fix: 尝试修复启动下载服务时的闪退 2022-09-01 16:27:30 +08:00
3b2f5c6749 Merge remote-tracking branch 'origin/dev-5.13.0' into dev 2022-09-01 15:20:36 +08:00
43c840cd94 chore: 版本更新至 5.12.1 2022-09-01 15:19:21 +08:00
9f7b1acef9 Merge branch 'hotfix-v5.12.0-590-crashes' into 'release'
fix v5.12.0 crashes

See merge request halo/android/assistant-android!316
2022-09-01 15:15:11 +08:00
08ac765e9c fix: 修复多线程操作下载数据引起的闪退 2022-09-01 15:12:34 +08:00
15a3624e55 fix: 修复下载完成游戏时多线程操作日志造成的闪退 2022-09-01 15:12:09 +08:00
ce16ad471b fix: 修复安装游戏时获取不到版本的闪退 2022-09-01 15:11:41 +08:00
c20a9e86d0 Merge branch 'hotfix-v5.12.0-590-home_index_out_of_bounds' into 'release'
修改首页可能出现的数组越界问题

See merge request halo/android/assistant-android!315
2022-09-01 15:09:30 +08:00
8e068684e0 fix: 修改首页可能出现的数组越界问题 2022-09-01 14:45:13 +08:00
31d8a442a3 fix: 修复下载实例快照列表为空时的闪退 2022-09-01 13:58:43 +08:00
f534216009 fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(0831UI测试问题 3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011#note_167425 2022-08-31 20:40:39 +08:00
2a808e3ac9 fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(0831UI测试问题 3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011#note_167425 2022-08-31 20:07:44 +08:00
42f5cbe9a4 fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(测试问题 1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011#note_167665 2022-08-31 18:30:05 +08:00
d1e87d552d fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(0831UI测试问题 3、0831测试 3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011 2022-08-31 15:30:33 +08:00
fa457fa337 fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(0831UI测试问题) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011#note_167425 2022-08-31 10:17:23 +08:00
5dd0734aad fix: 修复正式包畅玩链接不正确的问题 2022-08-30 18:13:59 +08:00
fa2c86c3f1 fix: 修复畅玩配置加载失败触发的闪退问题 2022-08-30 17:55:35 +08:00
1753224cc4 build: 正式包畅玩开关默认改为开启状态 2022-08-30 17:18:02 +08:00
e3cece6654 fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(UI优化) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011 2022-08-30 17:11:45 +08:00
f01e79d303 fix: 微调帖子详情页UI 2022-08-30 16:09:11 +08:00
5d89a2c26d fix:【光环助手V5.13.0】游戏搜索功能优化(第9期)(UI优化) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011 2022-08-30 15:57:07 +08:00
2ff948dab1 fix: 缓存畅玩游戏游玩时间和占用空间,修复畅玩游戏 newIntent 时 tab 定位不生效的问题 2022-08-30 15:33:47 +08:00
ebe560bc2b Merge remote-tracking branch 'origin/dev' into dev-5.13.0
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt
#	app/src/main/res/layout/home_game_item.xml
2022-08-30 14:16:21 +08:00
7dd0bdfd73 Merge remote-tracking branch 'origin/release' into dev 2022-08-30 14:10:14 +08:00
af3797afc7 feature:【光环助手V5.13.0】游戏搜索功能优化(第9期)(前端部分) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2011 2022-08-30 14:02:46 +08:00
0821f00584 fix: 添加畅玩备份完整性校验,避免数据异常 2022-08-30 13:46:09 +08:00
163a1a7f1f fix: 修复回调 onNewIntent 回到畅玩游戏管理列表无法正常刷新的问题 2022-08-29 18:04:23 +08:00
02b9d15134 feat: 添加畅玩广场的跳转 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2000#note_166886 2022-08-29 14:17:54 +08:00
4ab2a23840 feat: 添加畅玩广场的跳转 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2000#note_166886 2022-08-29 10:20:43 +08:00
2f35f07ba0 fix: 修复定时日志上报可能触发的多线程操作闪退 2022-08-26 16:56:47 +08:00
76cfda2df1 fix: 修复曝光事件序列化时可能出现死循环卡死的问题 2022-08-26 16:10:59 +08:00
fc705578b7 Merge branch 'hotfix-v5.11.3-573-game_detail_crash' into 'release'
fix: 修复游戏详情页面的闪退

See merge request halo/android/assistant-android!314
2022-08-25 16:12:39 +08:00
c6c544f699 feat: 邮件包添加最近代码变更弹窗 https://git.shanqu.cc/halo/android/assistant-android/-/issues/79 2022-08-25 15:58:45 +08:00
ec96fc3258 fix: 修复游戏详情页面的闪退 2022-08-25 15:53:02 +08:00
bfa0b7bd11 Merge branch 'hotfix-v5.11.3-573-crashes' into 'release'
fix: 修复游戏详情页面、查看大图页面的闪退

See merge request halo/android/assistant-android!313
2022-08-25 14:41:01 +08:00
26fc068d29 fix: 修复游戏详情页面、查看大图页面的闪退 2022-08-25 14:36:59 +08:00
a035418ff9 fix: 【光环助手V5.13.0】评论 新增 IP属地展示(0825UI测试1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2008 2022-08-25 14:19:14 +08:00
c40b1f5391 fix: 【光环助手V5.13.0】评论 新增 IP属地展示(0825测试反馈1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2008 2022-08-25 11:29:50 +08:00
848d3f27bd feat: 邮件包添加最近代码变更弹窗 https://git.shanqu.cc/halo/android/assistant-android/-/issues/79 2022-08-25 11:08:26 +08:00
676011eef3 Merge branch 'hotfix-v5.11.3-573-forum_detail_crash' into 'release'
fix: 修复论坛详情页点击标题栏页面吸顶时的闪退问题

See merge request halo/android/assistant-android!312
2022-08-25 11:04:14 +08:00
3319fd29de fix: 修复论坛详情页点击标题栏页面吸顶时的闪退问题 2022-08-25 11:03:18 +08:00
d3233c379f fix: 【光环助手V5.13.0】通用链接内容合集优化(0825UI测试问题1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2010 2022-08-25 10:58:25 +08:00
eb7c5d6285 fix:【光环助手V5.13.0】前端优化汇总8月第1周(4 修改评论时间显示规则) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2014#note_166462 2022-08-25 09:57:58 +08:00
b32bb19051 fix: 【光环助手V5.13.0】评论新增IP属地展示(补充问题2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2008 2022-08-25 09:42:43 +08:00
5a7001dd66 fix: 修复部分设备不能获取已安装应用列表的问题 2022-08-24 17:36:12 +08:00
bdeb0c79eb fix: 【光环助手V5.13.0】客户端内部需求(修改错误webview提示UI,通过接口配置链接下载) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2029 2022-08-24 11:12:53 +08:00
bb29702db8 fix:【光环助手V5.13.0】前端优化汇总8月第2周(3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2026 2022-08-24 10:02:20 +08:00
4138f2861c Merge branch 'feature-issues2014-buried-point' into 'dev-5.13.0'
fix:修复点击我的游戏-预约Tab位置是 按钮 时,没有上报事件

See merge request halo/android/assistant-android!311
2022-08-24 09:48:40 +08:00
33050a7c94 fix:修复点击我的游戏-预约Tab位置是 按钮 时,没有上报事件 2022-08-24 09:32:33 +08:00
4fef613390 fix: 【光环助手V5.13.0】评论 新增 IP属地展示(0822测试3,4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2008 2022-08-22 16:44:46 +08:00
15565281a9 fix: 【光环助手V5.13.0】评论 新增 IP属地展示(0822测试反馈1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2008 2022-08-22 15:49:21 +08:00
39d3c4d3c8 fix: 修复未安装畅玩游戏在列表中会找不到的问题 2022-08-19 17:59:52 +08:00
443c8d7eaf fix: 修复备份畅玩游戏异常, 2022-08-19 17:53:52 +08:00
0195af422c fix: 【光环助手V5.13.0】前端优化汇总8月第3周(1、2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2032 2022-08-19 17:31:29 +08:00
7d05d42e14 fix: 【光环助手V5.13.0】前端优化汇总8月第3周(4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2032 2022-08-19 11:11:42 +08:00
322da11319 style: 添加项目相关的 editorConfig 2022-08-19 10:47:01 +08:00
b46da2751b Merge remote-tracking branch 'origin/dev' into dev 2022-08-19 10:45:44 +08:00
4999ba6563 style: 添加项目相关的 editorConfig 2022-08-19 10:45:32 +08:00
5b3aec8e19 fix: 【光环助手V5.13.0】前端优化汇总8月第3周(3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2032 2022-08-19 10:27:15 +08:00
6cc2f3af26 fix: 修复社区-论坛-热门论坛的Item需要点击两次才能跳转的问题 2022-08-18 14:23:23 +08:00
3a4b3326e7 fix: 移除首页最近在玩列表的冗余刷新代码 2022-08-18 11:39:08 +08:00
51c75947c9 fix: 移除首页部分冗余代码 2022-08-18 11:38:32 +08:00
19bb89b6f1 fix: 修复首页列表刷新时偶发的异常闪烁问题 2022-08-18 11:31:10 +08:00
6e2ec70434 fix: 修改首页游戏卡片标题布局样式 2022-08-17 18:43:09 +08:00
793f2f241a fix: 清理畅玩管理冗余代码 2022-08-17 17:59:44 +08:00
72f3d4a379 fix: 修复畅玩游戏管理页面lottie开关动画闪退问题 2022-08-17 17:48:48 +08:00
6b6a7dd81e fix: 修复畅玩游戏管理页面lottie开关动画闪退问题 2022-08-17 17:45:50 +08:00
ffa4257eb4 fix: 重构下载按钮的实现 (修复我的游戏-预约tab列表下载按钮不显示文字的问题) https://git.shanqu.cc/halo/android/assistant-android/-/issues/75 2022-08-17 17:31:57 +08:00
22c06286c2 fix: 修改首页游戏卡片下载按钮不会根据下载状态变更显示样式问题 2022-08-17 16:57:00 +08:00
1d600f370a Merge branch 'feature-issues2014-buried-point' into 'dev-5.13.0'
feat:新增我的光环-我的游戏相关数据埋点

See merge request halo/android/assistant-android!310
2022-08-17 16:35:37 +08:00
ac3788541b feat:新增我的光环-我的游戏相关数据埋点 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2014 2022-08-17 16:09:22 +08:00
015418b56a fix: 处理合并冲突 2022-08-17 16:06:25 +08:00
9c066431b4 Merge remote-tracking branch 'origin/dev' into dev-5.13.0
# Conflicts:
#	app/src/main/java/com/gh/common/util/DetailDownloadUtils.java
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityFragment.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt
2022-08-17 15:57:56 +08:00
3f2b59aecf fix: 【光环助手V5.12.0】同步正式环境后测试问题汇总(5) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2021 2022-08-17 15:48:51 +08:00
1c3d78dc17 fix: 移除旧的下载更新页面相关代码 2022-08-17 15:39:12 +08:00
9fc9f0362f refactor: 1.积分模块单独运行时使用新包名; 2.积分模块登录支持不授权登录 2022-08-17 15:12:07 +08:00
ee131da96b Merge branch 'dev-5.13.0' of git.shanqu.cc:halo/android/assistant-android into dev-5.13.0 2022-08-17 11:27:49 +08:00
843a2f8831 fix: 处理合并冲突 2022-08-17 11:27:30 +08:00
cfb48c07ff feat: 【光环助手V5.13.0】评论 新增 IP属地展示 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2008 2022-08-17 11:17:34 +08:00
3952139324 chore: 更新 assistant_flutter 依赖 2022-08-17 11:16:36 +08:00
d9665a8464 fix: 修复应用启动时没有安装畅玩助手也会出发连接尝试的问题 2022-08-17 10:46:36 +08:00
b4d44d6e0a fix: 处理合并冲突 2022-08-17 10:42:39 +08:00
bba8261d97 Merge remote-tracking branch 'origin/dev-5.13.0' into dev-5.13.0
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailAdapter.kt
#	app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt
2022-08-17 10:24:17 +08:00
134df71aba Merge branch 'feature-module_login' into dev-5.13.0
# Conflicts:
#	app/src/main/java/com/gh/common/constant/Config.java
#	app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt
#	app/src/main/java/com/gh/common/util/DirectUtils.kt
#	app/src/main/java/com/gh/common/util/DownloadObserver.kt
#	app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt
#	app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java
#	app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListFragment.kt
#	app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt
#	app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListFragment.kt
#	app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt
#	app/src/main/java/com/gh/gamecenter/game/GameFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionPosterFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditViewModel.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyViewModel.kt
#	app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt
#	app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt
#	app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt
#	app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt
#	app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListFragment.kt
#	app/src/main/java/com/gh/gamecenter/subject/SubjectListFragment.kt
#	app/src/main/java/com/gh/gamecenter/tag/TagsListFragment.kt
#	app/src/main/java/com/halo/assistant/HaloApp.java
#	module_login/src/main/java/com/gh/gamecenter/login/user/UserManager.java
#	module_login/src/main/java/com/gh/gamecenter/login/utils/LoginHelper.kt
2022-08-17 10:22:47 +08:00
0752813c09 fix: 修复畅玩配置为空时的闪退 2022-08-16 17:33:37 +08:00
28744ce9ce fix: 修复畅玩游戏更新无法在列表显示进度的问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2027 2022-08-16 17:07:33 +08:00
1aadf7bd38 fix: 修改判断webview是否可用 2022-08-16 14:28:31 +08:00
4a7e0a8b4d Merge branch 'feature-webview_abi_error' into dev-5.13.0 2022-08-16 14:01:07 +08:00
9780aa532a fix: 【光环助手V5.12.0】同步正式环境后测试问题汇总(5) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2021 2022-08-16 10:02:02 +08:00
2920ca4975 fix: 修复申请权限后闪退问题 2022-08-15 16:12:08 +08:00
c20f92f2cc refactor: 组件化积分相关功能(可单独运行积分模块) https://git.shanqu.cc/halo/android/assistant-android/-/issues/73 2022-08-15 15:55:06 +08:00
9c2c4562aa refactor: 组件化积分相关功能(可单独运行积分模块) https://git.shanqu.cc/halo/android/assistant-android/-/issues/73 2022-08-15 15:49:42 +08:00
96d10703c7 style: 删除无用代码 2022-08-15 15:26:23 +08:00
b58baf565c fix: 修复首页游戏大图卡片副标题超长时与下载按钮重叠的问题 2022-08-15 15:15:22 +08:00
1a3f0f87d5 feat: 尝试避免安装错误版本 WebView 的用户闪退 https://git.shanqu.cc/halo/android/assistant-android/-/issues/78 2022-08-15 15:14:17 +08:00
9ce4ff54ba Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/AndroidManifest.xml
2022-08-15 14:02:48 +08:00
a6605e6044 Merge branch 'fix_content_provider' into 'release'
本地实名认证插入数据库改为contentProvider插入,并在Manifest加入queries

See merge request halo/android/assistant-android!306
2022-08-15 14:01:24 +08:00
61f77a6fcc fix:本地实名认证插入数据库改为contentProvider插入,并在Manifest加入queries 2022-08-15 11:32:02 +08:00
d39755efe6 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-08-15 10:45:01 +08:00
ddf7d6f94d Merge branch 'hotfix-v5.11.3-573-crashes' into 'release'
Hotfix v5.11.3 573 crashes

See merge request halo/android/assistant-android!305
2022-08-15 10:42:49 +08:00
17ad25aff3 fix: 修复游戏详情页点击关闭下载的下载按钮会闪退的问题 2022-08-15 10:00:42 +08:00
b169ce66b4 fix: 修复部分设备获取已安装信息时会闪退的问题 2022-08-15 09:56:10 +08:00
c0e34b3edb fix: 修复下载路径为空时调用下载触发的闪退 2022-08-15 09:53:30 +08:00
7936cb2b9f feat: 预检查 Webview 是否安装/安装错误ABI 2022-08-13 16:45:19 +08:00
2bf662ee27 fix: 修复首页游戏大图卡片副标题超长时与下载按钮重叠的问题 2022-08-11 16:00:59 +08:00
a0c1a14987 refactor: 组件化积分相关功能 https://git.shanqu.cc/halo/android/assistant-android/-/issues/73 2022-08-11 14:50:23 +08:00
ab01fac150 feat: 重构下载按钮的实现 https://git.shanqu.cc/halo/android/assistant-android/-/issues/75 2022-08-11 11:17:50 +08:00
2ce35ab8a5 feat: 【光环助手V5.13.0】通用链接内容合集优化 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2010 2022-08-11 10:34:46 +08:00
50db76ce70 chore: 版本更新至 5.11.3 2022-08-11 09:41:37 +08:00
30cb1b8f87 Merge branch 'hotfix-v5.11.2-572-vertical_scroll_issue' into 'release'
fix: 修复横向列表滚动专题更新数据时会自动往左切换的问题

See merge request halo/android/assistant-android!304
2022-08-11 09:40:19 +08:00
470256411d fix: 修复横向列表滚动专题更新数据时会自动往左切换的问题 2022-08-11 09:39:24 +08:00
364f089d75 Merge branch 'feature-issues2016-v5.11.2' into 'release'
隐私弹窗修改 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2016

See merge request halo/android/assistant-android!303
2022-08-10 17:31:52 +08:00
fc0c710172 Merge branch 'hotfix-v5.11.2-572-wrong_image_url' into 'release'
fix: 修复部分图片可能因为 jpegConfig 为空而导致加载失败的问题

See merge request halo/android/assistant-android!302
2022-08-10 11:03:50 +08:00
18314347de fix: 修复部分图片可能因为 jpegConfig 为空而导致加载失败的问题 2022-08-10 11:03:50 +08:00
87b9ff7054 feat: 【光环助手】隐私弹窗修改 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2016 2022-08-10 10:11:34 +08:00
a4c7aa6338 fix: 修复资讯详情闪退问题 2022-08-09 16:42:34 +08:00
8d6628404c fix: 修改专区短链接使用webview打开 2022-08-09 16:26:32 +08:00
e383abf942 Merge branch 'dev-5.13.0-issues74' into 'dev-5.13.0'
fix:曝光上报使用对象池来复用 ExposureEvent

See merge request halo/android/assistant-android!300
2022-08-09 14:43:30 +08:00
d0c9c0f2f5 fix:曝光上报使用对象池来复用 ExposureEvent 2022-08-09 14:43:29 +08:00
f2ebc7796f Merge branch 'hotfix-v5.11.2-572-game_subtitle_crash' into 'release'
fix: 修复游戏副标题闪退问题

See merge request halo/android/assistant-android!301
2022-08-09 11:18:55 +08:00
6e6b107a80 fix: 修复游戏副标题闪退问题 2022-08-09 11:12:05 +08:00
4d29ff8752 feat: 更新微博 SDK (避免初始化获取 MAC 地址) 2022-08-09 11:09:00 +08:00
56226b8620 Merge branch 'hotfix-v5.11.2-572_suggestion_crash' into 'release'
修复意见反馈闪退问题

See merge request halo/android/assistant-android!299
2022-08-09 10:01:38 +08:00
240d3ea304 fix: 修复意见反馈闪退问题 2022-08-09 09:56:01 +08:00
e9ca19fa41 chore: 版本更新至 5.13.0 2022-08-08 17:29:11 +08:00
821d21a2e1 Merge remote-tracking branch 'origin/dev' into dev-5.13.0 2022-08-08 17:27:40 +08:00
9009567226 feat: 更新微博 SDK (避免初始化获取 MAC 地址) 2022-08-08 17:25:25 +08:00
6506012d78 fix:【光环助手V5.13.0】前端优化汇总8月第1周(4、8) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2014 2022-08-08 17:11:44 +08:00
cc4b685a28 refactor: 优化下载点击事件的死亡嵌套回调 https://git.shanqu.cc/halo/android/assistant-android/-/issues/77 2022-08-08 16:50:46 +08:00
5d21f4e29f feat: 畅玩游戏发布相关准备 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2000 2022-08-08 15:38:27 +08:00
e84973f0e6 fix: 【光环助手V5.13.0】前端优化汇总8月第1周(2,3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2014 2022-08-08 12:05:33 +08:00
a997f77584 fix:【光环助手V5.13.0】前端优化汇总8月第1周(5) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2014 2022-08-08 10:43:54 +08:00
b70fb261d4 Merge branch 'hotfix-v5.11.2-572-skeleton_crash' into 'release'
fix: 修复懒加载列表页更新骨架屏出现闪退的问题

See merge request halo/android/assistant-android!298
2022-08-04 15:09:07 +08:00
cbef1095d6 fix: 修复懒加载列表页更新骨架屏出现闪退的问题 2022-08-04 15:01:15 +08:00
e3f6d64fa9 refactor: 组件化登录功能 https://git.shanqu.cc/halo/android/assistant-android/-/issues/73 2022-08-04 11:28:24 +08:00
6f5f72194a feat: 移除 log 线程,取消本地 log 数据库(由 loghub sdk 实现) 2022-08-03 16:15:16 +08:00
8ff396e05b feat: 调整主 IO 线程池的核心数和最大数 2022-08-03 15:16:00 +08:00
6fa4bf75bf fix: 【光环助手V5.12.0】首页内容列表优化(0802测试5) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1949 2022-08-02 16:25:38 +08:00
9c11f7f70e fix: 处理部分 SonarQube 问题 2022-08-02 16:22:45 +08:00
c8cd753022 feat: Android 8.0 以下设备停用畅玩游戏 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/2000 2022-08-02 16:21:01 +08:00
12d94c7d0a Merge remote-tracking branch 'origin/dev' into dev 2022-08-02 15:05:21 +08:00
d1159c30d1 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-08-02 14:59:01 +08:00
8b241ec569 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(UI测试问题汇总0802补充3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-08-02 14:46:01 +08:00
07f68f050b fix: 调整部分 sentry 日志 2022-08-02 13:59:40 +08:00
f8c61b5d53 feat: 添加全局畅玩游戏功能开关 2022-08-02 13:45:37 +08:00
791bf000ef Merge branch 'hotfix-v5.11.2-572-image_viewer' into 'release'
fix: 修复帖子评论查看大图进入动画位置异常

See merge request halo/android/assistant-android!297
2022-08-02 11:45:15 +08:00
515a34ecf9 Merge remote-tracking branch 'origin/dev' into dev 2022-08-02 11:13:16 +08:00
3e74b39b45 fix: 修复畅玩游戏安装完成后会取消相同包名游戏下载任务的问题(20220729需求补充:测试反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1955 2022-08-02 11:13:11 +08:00
c3eba42b17 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(UI测试问题汇总0802补充2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-08-02 10:41:12 +08:00
13ab6f7b38 fix: 修复畅玩游戏下载进度状态同步问题(20220729需求补充:测试反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1955 2022-08-01 17:45:29 +08:00
7ee9913964 fix: 修复帖子评论查看大图进入动画位置异常 2022-08-01 17:27:29 +08:00
96f0c03ff2 chore: 版本更新至 5.11.2 2022-08-01 15:37:12 +08:00
7c3f91c296 Merge branch 'feature-issues1292-v5.11.1' into 'release'
Feature issues1292 简单适配华为无应用列表读取权限的情况

See merge request halo/android/assistant-android!296
2022-08-01 15:31:08 +08:00
cd9d0b5456 Merge remote-tracking branch 'origin/dev' into feature-issues1801-v5.12.0 2022-08-01 15:14:23 +08:00
cb4b83ddb4 fix: 更新 LGLibrary 依赖 2022-08-01 15:10:17 +08:00
449836cbd0 fix: 处理合并冲突 2022-08-01 15:08:56 +08:00
a028639138 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(UI测试问题汇总1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-08-01 14:58:07 +08:00
c34e5f0a3d Merge remote-tracking branch 'origin/dev' into feature-issues1801-v5.12.0
# Conflicts:
#	app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/entity/NewGameDetailEntity.kt
#	app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt
#	app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt
#	app/src/main/res/layout/fragment_forum_home.xml
#	libraries/LGLibrary
2022-08-01 14:50:48 +08:00
06f008d577 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(0727测试4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-08-01 11:49:39 +08:00
08a7491fa7 feat: 修复畅玩游戏和普通游戏同一下载地址回引起错误回调的问题 2022-08-01 11:17:28 +08:00
faa9d50426 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(0729测试1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-08-01 10:20:45 +08:00
493a444990 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(0729测试1-2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-07-29 15:51:49 +08:00
596cc4ca15 feat: 移除无安装权限启动弹窗 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1994 2022-07-29 15:34:09 +08:00
a14ea13dd7 fix: 移除无用文件 2022-07-29 11:27:19 +08:00
0cfce764ff Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
#	libraries/LGLibrary
2022-07-29 11:19:32 +08:00
6c0f7f8cb3 fix: 移除无用资源文件 2022-07-29 11:17:13 +08:00
4ce17aa6a3 feat: 移除 x86 架构支持,捕抓 RenderScript 异常 2022-07-29 10:48:14 +08:00
c58db04155 fix: 修复在那无下载的游戏打开详情页闪退的问题 2022-07-28 17:42:04 +08:00
c47ab8fc41 Merge remote-tracking branch 'origin/release' into feature-issues1801 2022-07-28 17:37:04 +08:00
6c88782635 feat: 完成获取应用列表权限相关处理 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1292 2022-07-28 16:55:44 +08:00
1ae905b0b4 fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(0727测试2、8(3)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-07-28 15:11:45 +08:00
d0dc009906 Merge remote-tracking branch 'origin/dev' into dev 2022-07-28 14:39:44 +08:00
99ffde9b67 fix: 【光环助手V5.12.0】首页内容列表优化(0728测试1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1949 2022-07-28 14:31:35 +08:00
3d56da3b6f fix:【光环助手V5.12.0】游戏详情新增“内容卡片”功能(0727测试2-4、8(3)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-07-28 14:31:20 +08:00
dc3ae1d36d fix: 【光环助手V5.12.0】版块内容列表优化(0727测试2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1948 2022-07-28 09:22:31 +08:00
4e9d5357c8 fix:【光环助手V5.12.0】新增 发布内容需实名认证(0727测试2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1982 2022-07-27 16:23:15 +08:00
a1d182a82c fix: 【光环助手V5.12.0】游戏专题功能优化(0727UI测试问题2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950 2022-07-27 13:59:03 +08:00
6efe9328b1 fix: 【光环助手V5.12.0】版块内容列表优(0727测试1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1948 2022-07-27 11:43:56 +08:00
lyr
e8645cd717 fix:【光环助手V5.12.0】游戏专题功能优化(0727UI测试问题 1)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950#note_161351 2022-07-27 11:19:27 +08:00
7792574f20 Merge remote-tracking branch 'origin/feature-issues1801' into feature-issues1801 2022-07-26 16:38:44 +08:00
54131d507b fix: 修复普通游戏下载进度更新频率也提高的问题 2022-07-26 16:38:16 +08:00
5609a95382 feat:【光环助手V5.12.0】游戏详情新增“内容卡片”功能 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-07-26 14:05:31 +08:00
3ab3229580 fix:安装完畅玩游戏 新增插入当前是否是测试包依据 2022-07-26 11:06:37 +08:00
8d1f300241 fix:安装完畅玩游戏 新增插入当前接口环境 2022-07-26 10:00:00 +08:00
d00f50bcf8 feat: 【光环助手V5.12.0】违规管理整合 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1946 2022-07-25 15:48:20 +08:00
624fb934e4 Merge branch 'hotfix-v5.11.1-571-vector_crash' into 'release'
fix: 修复5.0以下系统设置矢量图闪退的问题

See merge request halo/android/assistant-android!295
2022-07-22 17:08:04 +08:00
965b6b3f66 fix: 修复5.0以下系统设置矢量图闪退的问题 2022-07-22 16:51:24 +08:00
f98726fa18 feat: 【光环助手V5.12.0】首页内容列表优化 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1949 2022-07-22 16:11:52 +08:00
495070a14e feat: 添加畅玩助手隐私政策跳转地址 2022-07-22 15:14:55 +08:00
e8b00cc87f Merge remote-tracking branch 'origin/release' into feature-issues1801
# Conflicts:
#	app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt
#	libraries/LGLibrary
2022-07-22 14:19:53 +08:00
6823f27ff3 Merge branch 'hotfix-v5.11.1-571-welcomdialog_display_issue' into 'release'
fix: 修复首页弹窗重复弹出的问题

See merge request halo/android/assistant-android!294
2022-07-22 11:54:34 +08:00
c0b561cb78 fix: 修复首页弹窗重复弹出的问题 2022-07-22 11:53:55 +08:00
d02bdf9a8a feat:【光环助手V5.12.0】新增 发布内容需实名认证 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1982 2022-07-22 11:07:20 +08:00
7029c170a4 feat:游戏数据插入畅玩助手ContentProvider URI修改 2022-07-22 11:05:15 +08:00
6afe9b2f3c feat: 将安装好的畅玩游戏数据插入到畅玩助手 2022-07-22 09:32:28 +08:00
54c9850014 Merge branch 'hotfix-v5.11.1-571-home_focus_issue' into 'release'
fix: 修复首页有新内容样式时下拉刷新会获取焦点产生滑动偏移的问题

See merge request halo/android/assistant-android!293
2022-07-21 17:04:46 +08:00
3123045a91 fix: 修复首页有新内容样式时下拉刷新会获取焦点产生滑动偏移的问题 2022-07-21 16:57:37 +08:00
16614ac2d1 feat: 更频繁地备份畅玩数据库 2022-07-21 16:22:42 +08:00
74fda1fc17 feat: ToastUtils 的 toast 默认切换到主线程执行 2022-07-21 16:18:43 +08:00
563d9123c8 fix: 【光环助手V5.12.0】端内兼容适配短链接(0720测试反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1945 2022-07-20 19:44:34 +08:00
lyr
8af97a44c8 feat:【光环助手V5.12.0】搜索管理功能优化(前端部分 1)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1951 2022-07-20 18:07:16 +08:00
75e032b1f9 feat:【光环助手v5.12.0】前端优化汇总7月第3周(7)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1976 2022-07-20 15:12:08 +08:00
lyr
7786a1b2a6 feat:【光环助手v5.12.0】前端优化汇总7月第3周(6)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1976 2022-07-19 16:56:40 +08:00
abd854ac3b fix: 【光环助手V5.12.0】端内兼容适配短链接(0718测试反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1945 2022-07-19 15:03:34 +08:00
lyr
96d60fefd4 fix:【光环助手V5.12.0】社区相关优化-第八期(第2点 长按时间修改为1秒) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1943#note_159827 2022-07-19 13:47:32 +08:00
681c26a6a3 Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-07-19 10:00:04 +08:00
ef72119a48 fix: 提交遗漏的代码 2022-07-19 09:59:49 +08:00
lyr
051371b0d8 feat:【光环助手V5.12.0】游戏专题功能优化(前端部分 1(优化列表Item刷新逻辑)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950 2022-07-19 09:39:12 +08:00
lyr
2d5420efec feat:【光环助手V5.12.0】游戏专题功能优化(前端部分 1(增加列表Item刷新逻辑)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950 2022-07-18 18:34:54 +08:00
59cc581645 fix: 【光环助手V5.12.0】端内兼容适配短链接(0718测试反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1945 2022-07-18 17:07:48 +08:00
140012e000 chore: 版本更新至 5.11.1 2022-07-18 16:38:44 +08:00
dd29cd586f Merge remote-tracking branch 'origin/legacy-release' into release
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/SearchActivity.kt
#	app/src/main/java/com/gh/gamecenter/SuggestionActivity.java
#	dependencies.gradle
2022-07-18 16:12:02 +08:00
lyr
cbc65e4ccd fix:【光环助手V5.10.0】畅玩助手数据埋点(20220713测试补充 1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1872#note_159670 2022-07-18 14:41:37 +08:00
lyr
5f337e3905 chore: 更新Loghub SDK至2.6.4 2022-07-18 13:56:34 +08:00
20eb18d3f0 feat: 【光环助手V5.12.0】版块内容列表优化(2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1948 2022-07-18 10:28:59 +08:00
e6191e8c37 feat: 【光环助手V5.12.0】版块内容列表优化(1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1948 2022-07-15 18:09:56 +08:00
lyr
47b0361401 feat:【光环助手V5.12.0】社区相关优化-第八期(3(优化逻辑)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1943 2022-07-15 17:36:04 +08:00
lyr
d4a9f2ab41 feat:【光环助手V5.12.0】游戏专题功能优化(前端部分 1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950 2022-07-15 14:58:16 +08:00
8088627de3 Merge branch 'hotfix-v5.10.4-554-crash_log_feedback' into 'legacy-release'
fix: 修复反馈的闪退记录有机率不能上报到后台的问题

See merge request halo/android/assistant-android!292
2022-07-15 14:32:50 +08:00
1042ed675f fix: 修复反馈的闪退记录有机率不能上报到后台的问题 2022-07-15 14:31:37 +08:00
cad0233509 Merge branch 'hotfix-v5.10.4-554-crashes' into 'legacy-release'
fix: 修复游戏详情副标题、查看大图页面的闪退问题

See merge request halo/android/assistant-android!291
2022-07-15 11:17:39 +08:00
bbf20c20a2 fix: 修复游戏详情副标题、查看大图页面的闪退问题 2022-07-15 10:42:18 +08:00
5e662ef5fe Merge branch 'hotfix-v5.10.4-554-generic_crashs' into 'legacy-release'
捕抓一些非关键异常

See merge request halo/android/assistant-android!290
2022-07-15 10:41:19 +08:00
01830c7e81 fix: 捕抓插入数据库异常 2022-07-15 10:39:26 +08:00
dd2116a12b fix: 捕抓跳转 QQ 反馈的异常 2022-07-15 10:39:02 +08:00
lyr
89ead6b348 feat:【光环助手V5.12.0】搜索管理功能优化(前端部分 2)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1951 2022-07-15 09:13:03 +08:00
5f014f6f6b feat: 【光环助手V5.12.0】首页加载速度优化(整合接口) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1919 2022-07-14 16:13:07 +08:00
772d5de3d9 Merge branch 'hotfix-v5.10.4-554-libao_crash' into 'legacy-release'
修改礼包搜索闪退问题

See merge request halo/android/assistant-android!289
2022-07-14 10:15:48 +08:00
8f55051748 fix: 修改礼包搜索闪退问题 2022-07-14 10:12:40 +08:00
e8553116b6 fix:【夜间模式】UI测试调整问题汇总(7月第1周)(0706补充15)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-13 17:38:13 +08:00
b16fcb6725 fix: 修复点击下载完成启动悬浮窗无法启动游戏的问题 2022-07-13 17:09:16 +08:00
lyr
e42fb2ab66 fix:【光环助手V5.12.0】游戏专题功能优化(修改专题默认显示下载按钮的值) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950 2022-07-13 16:45:37 +08:00
32574ba33a fix: 【光环助手V5.12.0】端内兼容适配短链接(0713测试反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1945 2022-07-13 16:40:29 +08:00
lyr
1a734c32a4 feat:【光环助手V5.12.0】游戏专题功能优化(前端部分(大致完成)) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1950 2022-07-13 16:35:36 +08:00
764e6bb6fb fix:【夜间模式】UI测试调整问题汇总(7月第1周)(0706补充15)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-13 15:08:07 +08:00
d695eefbe8 fix: 修复畅玩管理页的页面刷新问题 2022-07-13 14:59:51 +08:00
b0491f48d6 chore: 版本更新至 5.12.0 2022-07-13 14:03:53 +08:00
15885fa6b0 fix:【夜间模式】UI测试调整问题汇总(7月第1周)(0706补充13、15、16)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-13 11:56:21 +08:00
00f90d3617 fix: block focus 避免更新时出现奇怪滚动 2022-07-13 10:10:32 +08:00
47beb3eeb2 fix: 移除冗余刷新 2022-07-12 17:35:24 +08:00
e41b6e4430 feat: 【光环助手V5.12.0】端内兼容适配短链接 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1945 2022-07-12 17:07:10 +08:00
f72095efc1 fix: 修复未安装畅玩更新重复进入时出现错误提示的问题 2022-07-12 16:52:03 +08:00
163ffd9308 Merge branch 'hotfix-v5.11.0-570-game_detail_scroll_top_crash' into 'release'
fix:修复游戏详情页点击标题栏回到顶部时的数组越界问题

See merge request halo/android/assistant-android!288
2022-07-12 15:40:42 +08:00
762c43bd6f fix: 修复重新下载取消任务时会触发异常安装的问题,修复未下载完成的任务也可能触发安装的问题 2022-07-12 15:39:00 +08:00
lyr
0660e132aa fix:修复游戏详情页点击标题栏回到顶部时的数组越界问题 2022-07-12 15:24:09 +08:00
aa0f27c61b ci: suppress SonarQube 问题 2022-07-12 10:59:40 +08:00
adb6691818 曝光统计添加毫秒时间戳字段 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1953 2022-07-12 10:49:20 +08:00
b0f2d3f068 chore: 版本更新至 5.10.4 2022-07-11 14:36:43 +08:00
a25cd0a07f Merge branch 'hotfix-v5.10.3-553-download_red_dot_and_input_keyboard' into 'legacy-release'
fix: 还原 LG Library, 处理首页红点问题, 处理进入搜索页的软键盘唤起问题

See merge request halo/android/assistant-android!287
2022-07-11 14:34:46 +08:00
1fc43ca588 fix: 还原 LG Library, 处理首页红点问题, 处理进入搜索页的软键盘唤起问题 2022-07-11 14:31:45 +08:00
lyr
c1fd2e48db feat:【光环助手V5.12.0】社区相关优化-第八期(1、2、3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1943 2022-07-11 14:24:50 +08:00
3ed5795205 fix:【夜间模式】UI测试调整问题汇总(7月第1周)(0706补充)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-11 10:16:23 +08:00
2be268b2e6 Merge branch 'hotfix-v5.11.0-570-image_viewer' into 'release'
fix: 修复游戏详情查看大图动画位置出现异常的问题

See merge request halo/android/assistant-android!286
2022-07-08 16:48:28 +08:00
8f5aee3a8c fix: 修复游戏详情查看大图动画位置出现异常的问题 2022-07-08 16:45:48 +08:00
f11f391940 Merge remote-tracking branch 'origin/dev' into dev-5.12.0
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/teenagermode/TeenagerModeActivity.kt
2022-07-08 15:14:01 +08:00
ad12b3f9ef build: 补充编译时需要移除的夜间模式资源位置 2022-07-08 14:53:01 +08:00
7bf56cc342 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-07-08 14:05:13 +08:00
176d4dd940 fix: 版本更新至 5.10.3 2022-07-08 13:36:55 +08:00
8756144018 fix:【夜间模式】UI测试调整问题汇总(7月第1周)(第6点遗漏)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-08 11:57:39 +08:00
dfba5cdf99 fix:【夜间模式】UI测试调整问题汇总(7月第1周)(第6点遗漏)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-08 11:57:39 +08:00
3deb83ac8d fix:【夜间模式】UI测试调整问题汇总(7月第1周)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-08 11:57:38 +08:00
e7c4ffdd8a Merge remote-tracking branch 'origin/release' into dev 2022-07-08 11:51:47 +08:00
05747c2ecf Merge branch 'hotfix-v5.10.2-552-provider-crash' into 'release'
fix: contentProvider部分机型闪退

See merge request halo/android/assistant-android!285
2022-07-08 11:50:08 +08:00
3241ff9935 fix: contentProvider部分机型闪退 2022-07-08 11:49:39 +08:00
6e40349f20 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-07-08 11:31:43 +08:00
0675eab81a Merge branch 'hotfix-v5.10.2-552-crashes' into 'release'
fix: 修复游戏详情副标题、查看大图页面的闪退问题

See merge request halo/android/assistant-android!284
2022-07-08 11:30:13 +08:00
8c9b1371dc fix: 修复游戏详情副标题、查看大图页面的闪退问题 2022-07-08 11:24:50 +08:00
e6daee0faf Merge branch 'hotfix-v5.10.2-552-fix_download_hint' into 'release'
fix: 修复首页红点更新异常

See merge request halo/android/assistant-android!283
2022-07-08 11:03:15 +08:00
45d8e5a869 fix: 修复首页红点更新异常 2022-07-08 11:02:30 +08:00
f4d16ff8f9 Merge branch 'cherry-pick-919db31e-2' into 'feature-issues1801'
fix:修复升级Loghub数据库时未添加默认值的错误

See merge request halo/android/assistant-android!282
2022-07-08 09:30:23 +08:00
lyr
28266cd06d fix:修复升级Loghub数据库时未添加默认值的错误
(cherry picked from commit 919db31ec3)
2022-07-08 09:29:39 +08:00
1c0b8b1382 Merge branch 'cherry-pick-919db31e' into 'dev-5.12.0'
fix:修复升级Loghub数据库时未添加默认值的错误

See merge request halo/android/assistant-android!281
2022-07-08 09:29:09 +08:00
lyr
35506c75f5 fix:修复升级Loghub数据库时未添加默认值的错误
(cherry picked from commit 919db31ec3)
2022-07-08 09:28:48 +08:00
lyr
919db31ec3 fix:修复升级Loghub数据库时未添加默认值的错误 2022-07-08 09:28:07 +08:00
f716712f14 Merge branch 'hotfix-v5.10.2-552-disk_full_crash' into 'release'
fix:修复下载添加Worker时因手机可用存储空间不足导致的闪退问题

See merge request halo/android/assistant-android!280
2022-07-07 18:21:59 +08:00
lyr
30a110e83b fix:修复下载添加Worker时因手机可用存储空间不足导致的闪退问题 2022-07-07 18:18:07 +08:00
c62dd66ad7 fix: 修复因混淆后导致的类型转换错误问题 2022-07-07 16:23:38 +08:00
ff876a55ba fix: 全局替换fragment的tag为xx.class.java.name 2022-07-07 16:22:09 +08:00
c084f786f9 Merge remote-tracking branch 'origin/feature-issues1801' into feature-issues1801 2022-07-07 16:18:18 +08:00
5e36bd7955 style: 整理首页最近在玩代码 2022-07-07 16:18:10 +08:00
8b00b1bb2a Merge branch 'hotfix-v5.10.2-552-class_cast_error' into 'release'
修复因混淆后导致的类型转换错误问题

See merge request halo/android/assistant-android!279
2022-07-07 15:32:04 +08:00
923bdc1639 fix: 修复因混淆后导致的类型转换错误问题 2022-07-07 15:18:22 +08:00
lyr
36e99a4a7e fix:【光环助手V5.10.0】畅玩助手数据埋点(埋点字段使用平铺方式上传) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1872#note_157925 2022-07-07 14:27:59 +08:00
e0f5a668ab Merge branch 'cherry-pick-78d5d4b3-2' into 'feature-issues1801'
feat:升级Loghub数据库

See merge request halo/android/assistant-android!278
2022-07-07 14:16:27 +08:00
lyr
6f01610d10 feat:升级Loghub数据库
(cherry picked from commit 78d5d4b39f)
2022-07-07 14:16:00 +08:00
b94c1eedfa Merge branch 'cherry-pick-78d5d4b3' into 'dev-5.12.0'
feat:升级Loghub数据库

See merge request halo/android/assistant-android!277
2022-07-07 14:15:31 +08:00
lyr
2747857db3 feat:升级Loghub数据库
(cherry picked from commit 78d5d4b39f)
2022-07-07 14:14:11 +08:00
0b1991e34d Merge branch 'hotfix-v5.10.2-552-toolbox' into 'release'
fix:修复工具箱页面回到前台时出现空白的最近使用列表的问题

See merge request halo/android/assistant-android!276
2022-07-07 14:13:24 +08:00
lyr
78d5d4b39f feat:升级Loghub数据库 2022-07-07 14:09:20 +08:00
83199b6a4e fix:修复工具箱页面回到前台时出现空白的最近使用列表的问题 2022-07-07 14:07:35 +08:00
0b51155177 fix: 尝试提高下载回调刷新频率 2022-07-07 11:36:49 +08:00
32f583825a fix: 修复畅玩游戏管理在玩页更新不及时的问题 2022-07-07 11:33:51 +08:00
14e2784ab8 fix: 修复畅玩安装异常时无任何反馈的问题 2022-07-07 11:19:22 +08:00
d2b2f5e306 fix: 修复畅玩管理下载页进入时多次刷新的问题 2022-07-07 11:18:57 +08:00
d78de995b2 Merge branch 'cherry-pick-040de6d4-2' into 'feature-issues1801'
feat:增加平铺埋点功能

See merge request halo/android/assistant-android!275
2022-07-07 10:31:16 +08:00
lyr
ad4ca04db3 feat:增加平铺埋点功能
(cherry picked from commit 040de6d458)
2022-07-07 10:30:12 +08:00
36e246fd30 Merge branch 'cherry-pick-040de6d4' into 'dev-5.12.0'
feat:增加平铺埋点功能

See merge request halo/android/assistant-android!274
2022-07-07 10:28:35 +08:00
lyr
59e913c529 feat:增加平铺埋点功能
(cherry picked from commit 040de6d458)
2022-07-07 10:27:36 +08:00
lyr
040de6d458 feat:增加平铺埋点功能 2022-07-07 10:26:29 +08:00
66d0dba9c6 fix: 修复详情页底栏高度异常的问题 2022-07-06 17:45:58 +08:00
877490ce01 fix: 优化畅玩游戏管理的列表数据显示逻辑 2022-07-06 17:45:58 +08:00
cf12312d97 feat: 使用独立的数据库来存已安装的畅玩游戏 2022-07-06 17:45:58 +08:00
1e7edd9e85 fix: 修复首页和专题列表页切换页面频繁闪烁的问题 2022-07-06 17:45:58 +08:00
3bd4427348 fix!: 修复畅玩游戏的更新问题 (修改了通用的下载功能,可能会有其它次生 bug) 2022-07-06 17:45:58 +08:00
18013fe582 fix: 补充处理部分遗漏的下载状态 2022-07-06 17:45:58 +08:00
ebb22d8d13 fix: 修复畅玩工具更新不及时的问题 2022-07-06 17:45:58 +08:00
20161e6ca1 fix: 合并冲突 2022-07-06 17:45:58 +08:00
68d32ae429 fix: 修复更新畅玩游戏有概率出现重复更新的问题 2022-07-06 17:45:58 +08:00
5a377913bb fix: 修复非插件更新会丢失角标的问题 2022-07-06 17:45:58 +08:00
lyr
8e5ceb1e0e feat:【光环助手V5.10.0】畅玩助手数据埋点 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1872 2022-07-06 17:45:58 +08:00
034db094e1 fix: 修复因为获取已安装列表异常造成的任务重下问题 2022-07-06 17:45:58 +08:00
541ebe8a29 fix: 修复进入畅玩游戏管理页面过慢的问题 2022-07-06 17:45:58 +08:00
8114e2a74a fix: 修复首页最近在玩的排序问题 2022-07-06 17:45:58 +08:00
27350c5c70 fix: 修复游戏详情页点击更新与其它位置点击更新效果不一样的问题 2022-07-06 17:45:58 +08:00
2c3a395b50 fix: 修复畅玩空间和畅玩游戏的更新问题
feat: 添加暴力的畅玩游戏备份/恢复逻辑
2022-07-06 17:45:58 +08:00
983bbfc309 fix: 修复下载状态更新不及时的问题 2022-07-06 17:45:57 +08:00
d4a651ce63 fix: 编译异常 2022-07-06 17:45:57 +08:00
c091a47900 fix: 微调 UI 2022-07-06 17:45:57 +08:00
a488608969 fix: 调整游戏详情页按钮文案 2022-07-06 17:45:57 +08:00
e715a46285 fix: 修复部分位置无法触发畅玩游戏丢失重下载的问题 2022-07-06 17:45:57 +08:00
f9a2d56acc fix: 调整畅玩游戏下载完成弹窗高度 2022-07-06 17:45:57 +08:00
dc8280c025 fix: 修复最近在玩区域闪烁的问题 2022-07-06 17:45:57 +08:00
4e53b1fb91 fix: 修复更新判断异常和首页最近在玩的排序问题 2022-07-06 17:45:57 +08:00
0af479e441 fix: 修复误判断造成的重复下载问题 2022-07-06 17:45:57 +08:00
559164ebce fix: 修复部分 UI 问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1923#note_154774 2022-07-06 17:45:57 +08:00
9f694085fd fix: 修复部分逻辑问题和 UI 问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1923#note_155241 2022-07-06 17:45:57 +08:00
b5c897170b fix: 畅玩服务连接异常问题 2022-07-06 17:45:57 +08:00
72926f5046 fix: 修复部分 UI 问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1923#note_155108 2022-07-06 17:45:57 +08:00
ee21dbc643 fix: 修复部分代码问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1923#note_154823 2022-07-06 17:45:57 +08:00
0f9b3c94f0 fix: 修复部分 UI 问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1923#note_154774 2022-07-06 17:45:57 +08:00
36704af531 feat: UI 细节完善 2022-07-06 17:45:57 +08:00
6ae44c34d1 fix: 修复首页更新不及时的问题 2022-07-06 17:45:57 +08:00
dce756e53f feat: 添加假的畅玩安装页面 2022-07-06 17:45:57 +08:00
c4035d319e feat: 将畅玩存储权限检测移到安装时 2022-07-06 17:45:57 +08:00
f37200f902 feat: 畅玩游戏绕过浏览器下载判断 2022-07-06 17:45:57 +08:00
3dc65fb415 fix: 修复畅玩助手下载进度显示异常 2022-07-06 17:45:57 +08:00
c646251b34 feat: 支持点击通知栏跳转畅玩下载管理页面 2022-07-06 17:45:57 +08:00
eb1def1768 feature: 完成管理页简单的下载按钮样式 2022-07-06 17:45:57 +08:00
27471cbf61 fix: 修复首页最近在玩 item 样式点击后不更新的问题 2022-07-06 17:45:57 +08:00
e59e1c1e65 feat: 对接畅玩反馈接口 2022-07-06 17:45:57 +08:00
1eeec1c89b feat: 实现畅玩游戏更新 2022-07-06 17:45:57 +08:00
90e947b65d fix: 游戏列表 item 样式显示异常 2022-07-06 17:45:57 +08:00
a96fe9144a 切换到 64 位畅玩空间 2022-07-06 17:45:57 +08:00
4d06707fab feat: 完成首页最近在玩简单的排序 2022-07-06 17:45:57 +08:00
ab202abe0a feat: 首页简单对接下载进度 2022-07-06 17:45:57 +08:00
56c1dbb6cb fix: 处理合并冲突 2022-07-06 17:45:57 +08:00
83afd7448f 添加简单首页列表项占位 2022-07-06 17:45:57 +08:00
477ffa0c33 添加简单首页列表项 2022-07-06 17:45:57 +08:00
57668ec97d 合并未接入防沉迷的代码 2022-07-06 17:45:57 +08:00
26b0f33f1c 添加简单的更新控制 2022-07-06 17:45:57 +08:00
8e0dcd74e5 补充启动(畅玩)的判断代码 2022-07-06 17:45:57 +08:00
88842de6c7 完成粗暴的安装启动流程 2022-07-06 17:45:57 +08:00
b0647bf3a9 合并 5.10.0 代码 2022-07-06 17:45:57 +08:00
7837318390 首页添加最近在玩占位代码 2022-07-06 17:45:57 +08:00
c7143a6f89 完成简陋的首页最近畅玩 item UI & 调整原有错误的颜色命名 2022-07-06 17:45:57 +08:00
97219323d3 添加部分简陋的 UI 2022-07-06 17:45:57 +08:00
417633b623 调整部分点击逻辑 2022-07-06 17:45:56 +08:00
2f35e6ac56 rebase to 5.10.0 分支 2022-07-06 17:45:56 +08:00
331e4fc410 对接部分接口 2022-07-06 17:45:56 +08:00
25768d8cae 完成粗糙的畅玩游戏详情 UI 2022-07-06 17:45:56 +08:00
9d00e53b73 添加畅玩管理页 2022-07-06 17:45:56 +08:00
3ef9a38342 添加游戏加载完成提醒浮窗工具类 2022-07-06 17:45:56 +08:00
898f72a218 简单对接空间助手接口 2022-07-06 17:45:56 +08:00
49091b7a72 添加简单的交互工具类 2022-07-06 17:45:09 +08:00
670f840be1 添加简单的 V 空间工具类 2022-07-06 17:45:09 +08:00
92cab5ae6a 添加 VSPACE submodule 2022-07-06 17:45:09 +08:00
614a57580c 添加 vspace submodule 2022-07-06 17:45:09 +08:00
ba763e9d9c fix:【夜间模式】UI测试调整问题汇总(7月第1周)(第6点遗漏)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-06 15:11:39 +08:00
928bb54f27 fix:【夜间模式】UI测试调整问题汇总(7月第1周)(第6点遗漏)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-06 14:54:30 +08:00
db1da76ff6 fix: 【光环助手V5.11.0】同步正式相关问题汇总(0706反馈) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1958 2022-07-06 13:52:30 +08:00
425fcf0554 fix: 修复5.0以下系统夜间模式切换浮窗按钮显示不正常的问题 2022-07-06 11:05:10 +08:00
89c2a58914 fix:【夜间模式】UI测试调整问题汇总(7月第1周)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1957 2022-07-06 09:31:56 +08:00
850b80688a fix:修复矢量图在5.0以下系统造成的闪退 2022-07-06 09:23:19 +08:00
60d5f1244e fix: 【光环助手V5.11.0】同步正式相关问题汇总(3) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1958 2022-07-05 17:22:32 +08:00
lyr
979081dd7b fix:【光环助手V5.11.0】同步正式相关问题汇总(2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1958 2022-07-05 11:49:09 +08:00
9348f324d0 chore: 版本更新至 5.10.2 2022-07-04 15:36:31 +08:00
0b2148b105 perf: 移除无用的速度限制代码 2022-07-04 11:59:55 +08:00
427e219677 Merge remote-tracking branch 'origin/release' into dev 2022-07-01 15:32:28 +08:00
d0abf6c536 fix:修复浏览器安装变量未初始化造成的闪退 2022-07-01 15:27:20 +08:00
efbaa821a1 Merge branch 'hotfix-v5.10.1-551-browser_install_crash' into 'release'
fix:修复浏览器安装变量未初始化造成的闪退

See merge request halo/android/assistant-android!273
2022-07-01 15:26:21 +08:00
72d96dae47 fix:修复浏览器安装变量未初始化造成的闪退 2022-07-01 15:24:14 +08:00
9f53652a00 fix:【夜间模式】UI测试调整问题汇总(6月第1周)(0630测试问题汇总) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1901
【夜间模式】UI测试调整问题汇总(6月第2周)(0630测试问题汇总) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1915
2022-07-01 15:19:23 +08:00
7c8670d82c Merge remote-tracking branch 'origin/release' into dev 2022-07-01 14:13:02 +08:00
lyr
fb26e77c78 fix: 修复社区首页获取顶部背景宽高为0的问题 2022-07-01 14:12:21 +08:00
75e7b6620d feat: 添加实名认证页面跳转 scheme 2022-07-01 12:02:40 +08:00
cfd9e61ad2 fix: 处理合并冲突 2022-07-01 11:58:18 +08:00
7d922f9620 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt
#	app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java
#	dependencies.gradle
2022-07-01 11:34:26 +08:00
05bd26605b Merge branch 'hotfix-v5.10.0-551-browser_install' into 'release'
fix:修复某些机型端口占用导致浏览器安装失败的问题

See merge request halo/android/assistant-android!272
2022-06-30 15:16:10 +08:00
a91af5035d fix:修复某些机型端口占用导致浏览器安装失败的问题 2022-06-30 15:12:43 +08:00
e5de70af66 feat: 【光环助手V_5.11.0】国际服游戏下载弹窗优化 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1933 2022-06-30 11:06:12 +08:00
3f7996f523 处理 SonarQube 问题 2022-06-29 13:49:44 +08:00
78b0c2e1cd fix:【夜间模式】UI测试调整问题汇总(6月第2周)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1915 2022-06-29 11:06:06 +08:00
b0047717bf 处理 SonarQube 问题 2022-06-27 09:39:33 +08:00
4f1a18479e fix:【光环助手V5.11.0】多版本下载面板-求版本优化(UI测试问题汇总1-2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1893 2022-06-24 15:07:38 +08:00
3df078bbd6 fix:【光环助手V5.11.0】前端优化汇总6月第3周(8) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-24 13:57:30 +08:00
d841dc635a fix: 修复外部 url 跳转反馈页闪退问题 2022-06-24 12:01:34 +08:00
ea0633e903 fix:【光环助手V5.11.0】多版本下载面板-求版本优化(0622测试1) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1893 2022-06-23 17:51:50 +08:00
cc34fc3a29 fix: 【光环助手V5.11.0】前端优化汇总6月第3周(9-12) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-23 10:24:04 +08:00
3144c49764 fix:【光环助手V5.11.0】前端优化汇总6月第3周(8) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-22 16:20:12 +08:00
lyr
45cc25e873 fix:【光环助手V5.11.0】前端优化汇总6月第3周(7(1))https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-22 14:46:35 +08:00
0fba6239ce Merge branch 'cherry-pick-eb91e53a' into 'dev'
fix:修复社区-论坛滑动轮播图闪退问题

See merge request halo/android/assistant-android!271
2022-06-22 14:25:26 +08:00
lyr
9eb1bc5f4d fix:修复社区-论坛滑动轮播图闪退问题
(cherry picked from commit eb91e53a7b)
2022-06-22 14:24:34 +08:00
56e5fb6a40 fix:【光环助手V5.11.0】多版本下载面板-求版本优化(上传进度改为显示真实进度) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1893 2022-06-22 11:38:24 +08:00
lyr
4b343e0185 fix:【光环助手V5.11.0】前端优化汇总6月第3周(6) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-21 16:19:17 +08:00
4bcc0bc961 fix: 修改游戏-评论详情底部的阴影显示异常 2022-06-20 16:41:07 +08:00
lyr
952a56508a fix:【光环助手V5.11.0】前端优化汇总6月第3周(1)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-20 16:34:48 +08:00
47583a1837 feat: 【光环助手V5.11.0】前端优化汇总6月第3周(4) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1928 2022-06-20 15:37:12 +08:00
09a357c1c2 fix: 修复无法切换测试环境和正式环境的问题 2022-06-20 15:18:01 +08:00
73c5da28d3 fix:【光环助手V5.11.0】多版本下载面板-求版本优化(0617测试2) https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1893 2022-06-20 14:04:57 +08:00
9f7514079a Merge branch 'release' of git.shanqu.cc:halo/android/assistant-android into release 2022-06-17 17:36:50 +08:00
8c1f8dd5ec Merge branch 'hotfix-v5.10.0-550-video_comment_ui' into 'release'
修改视频流评论页面无数据显示问题

See merge request halo/android/assistant-android!269
2022-06-17 17:36:12 +08:00
93ce3fcfc8 修改视频流评论页面无数据显示问题 2022-06-17 17:32:55 +08:00
5e11211b4c chore: 版本更新至 5.10.1 2022-06-17 13:53:45 +08:00
a12199f847 Merge branch 'legacy-release-rebase' into 'release'
合并 5.9.x 代码变更

See merge request halo/android/assistant-android!268
2022-06-16 14:48:45 +08:00
64a70c5ab3 fix: 合并冲突 2022-06-16 14:45:18 +08:00
lyr
27a7474c92 1.V5.9.2UI问题 https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1922;
2.fix:修复社区-论坛滑动轮播图闪退问题
2022-06-16 13:59:54 +08:00
eba6b4b660 fix: 修复 OAID 获取异常造成推广包接口失效问题 2022-06-16 13:59:39 +08:00
1ea147d43d feat: 实名认证功能 https://git.shanqu.cc/pm/halo-plugin-issues/-/issues/221 2022-06-16 13:59:39 +08:00
084169db8f Merge branch 'hotfix-release-forum_banner_crash' into 'release'
fix:修复社区-论坛滑动轮播图闪退问题

See merge request halo/android/assistant-android!267
2022-06-16 10:02:41 +08:00
lyr
eb91e53a7b fix:修复社区-论坛滑动轮播图闪退问题 2022-06-16 10:01:31 +08:00
29b31d64e7 fix:【夜间模式】UI测试调整问题汇总(6月第1周)https://git.shanqu.cc/pm/halo/halo-app-issues/-/issues/1901 2022-06-15 17:59:46 +08:00
d5a2b9f705 refactor: 整理闪屏页代码 2022-06-15 15:57:37 +08:00
b34134d9ed fix: 处理部分引导页代码 warning 2022-06-15 09:58:30 +08:00
8d0719f642 perf: 移除首页无用的 MTA 停留时长统计代码 2022-06-15 09:53:50 +08:00
22a09f2775 Merge branch 'hotfix-v5.10.0-550-oaid_null_pointer' into 'release'
fix: 修复 oaid 获取为空时的接口问题

See merge request halo/android/assistant-android!263
2022-06-14 13:46:43 +08:00
ead2f04bd3 fix: 修复 oaid 获取为空时的接口问题 2022-06-14 13:45:24 +08:00
bed6b9190f Merge branch 'hotfix-v5.10.0-550_crashes' into 'release'
修改sentry上的闪退问题

See merge request halo/android/assistant-android!262
2022-06-14 10:58:11 +08:00
d95519252d fix: 修改sentry上的闪退问题 2022-06-14 10:51:35 +08:00
aa21a8b9af build: 暂时关闭 AndResguard 2022-06-14 10:26:25 +08:00
d099181247 chore: 版本更新至 5.11.0 2022-06-14 10:07:56 +08:00
622accea9a Merge remote-tracking branch 'origin/dev' into dev-5.11.0 2022-06-14 10:00:15 +08:00
00627842a6 fix: 合并冲突 2022-06-14 09:38:38 +08:00
198d3d7159 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionBannerAdapter.kt
#	dependencies.gradle
2022-06-14 09:22:31 +08:00
lyr
c6352aa901 【光环助手v5.11.0】论坛详情页相关优化(1)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1880 2022-06-13 17:03:21 +08:00
lyr
f15abb14e2 【光环助手v5.11.0】论坛详情页相关优化(2、3)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1880 2022-06-13 16:23:12 +08:00
e3c2d9509a feat:【光环助手V5.11.0】多版本下载面板-求版本优化(遗漏) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1893 2022-06-13 14:58:54 +08:00
93515bdc17 feat:【光环助手V5.11.0】多版本下载面板-求版本优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1893 2022-06-13 11:11:07 +08:00
56ca7631ad feat:【光环助手V5.11.0】多版本下载面板-求版本优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1893 2022-06-13 10:51:47 +08:00
lyr
bde31622b4 fix:修复消息中心页面重建后变空白了问题 2022-06-13 10:18:42 +08:00
00825e7d8e fix: 修复实名认证页面以 X 结尾的身份证号无法去敏的问题 2022-06-13 09:56:33 +08:00
lyr
fb5bbeada6 【光环助手V5.10.0】同步正式环境后测试问题汇总(15)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1900 2022-06-10 11:27:51 +08:00
lyr
6a8757d152 【光环助手V5.10.0】同步正式环境后测试问题汇总(12)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1900 2022-06-09 18:09:13 +08:00
f9c32c3bb7 fix:【光环助手V5.10.0】同步正式环境后测试问题汇总(第5点)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1900 2022-06-09 16:38:38 +08:00
5ca0e26775 fix:【光环助手V5.10.0】同步正式环境后测试问题汇总(第5点测试)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1900 2022-06-09 10:49:36 +08:00
b87138bf58 feat: 【光环助手v5.11.0】外链分享旧链接替换 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1902 2022-06-09 10:20:49 +08:00
lyr
89563a17ea 【光环助手V5.10.0】同步正式环境后测试问题汇总(0608测试反馈第8点)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1900#note_152656 2022-06-09 10:05:48 +08:00
lyr
931903490a 【光环助手V5.10.0】同步正式环境后测试问题汇总(6)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1900 2022-06-08 16:20:58 +08:00
lyr
4fc2e2a0f0 【光环助手V5.10.0】同步正式环境后测试问题汇总(6、8) 2022-06-08 11:37:01 +08:00
a0180b78d7 build: 修改升级至 AGP7 以后字节码插桩优化不可用 https://git.shanqu.cc/halo/android/assistant-android/-/issues/71 2022-06-07 15:28:20 +08:00
ddbf2a9fba Merge branch 'feature-agp7' into 'dev-5.11.0'
perf: 更新 AGP 到最新的 7.X

See merge request halo/android/assistant-android!259
2022-06-06 14:43:01 +08:00
84fe77c6ac docs: 把 Commit message 规范添加到 README 2022-06-06 14:34:25 +08:00
74455c40a1 fix: 测试用渠道选择异常 2022-06-06 14:30:34 +08:00
9a106534fb fix: 测试用渠道选择异常 2022-06-06 14:29:42 +08:00
eed764b16e Merge branch 'new-issues-66' into 'dev'
优化渠道获取的相关代码

See merge request halo/android/assistant-android!258
2022-06-06 13:46:31 +08:00
3a652b4d4f 优化渠道获取的相关代码 https://git.shanqu.cc/halo/android/assistant-android/-/issues/66 2022-06-06 13:46:31 +08:00
3c18ed9a31 Merge branch 'hotfix-v5.9.1-533-minor_ui_tuned' into 'release'
修复游戏详情页下载区域阴影显示异常

See merge request halo/android/assistant-android!257
2022-06-06 10:31:15 +08:00
f02621d564 修复游戏详情页下载区域阴影显示异常 2022-06-06 10:29:13 +08:00
443f7b29c9 【光环助手V5.10.0】游戏副标题相关需求(20220602UI测试补充) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-06-02 20:54:21 +08:00
b926af3b67 为详情页面添加业务 ID (修复businessId为空造成的闪退) https://git.shanqu.cc/halo/android/assistant-android/-/issues/68 2022-06-02 18:10:30 +08:00
f288688951 【光环助手V5.10.0】游戏副标题相关需求(20220602UI测试补充) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-06-02 18:09:30 +08:00
8b78054a05 更新至 AGP7 2022-06-02 17:04:01 +08:00
90e802c03b 处理 SonarQube 问题 2022-06-02 15:08:11 +08:00
lyr
16c091d77a 处理SonarQube问题 2022-06-02 10:29:08 +08:00
abb76e1d4d 修复点开第三方登录页闪退的问题 2022-06-02 09:35:57 +08:00
lyr
0e8cb56b2b 处理SonarQube问题 2022-06-01 17:37:49 +08:00
db51af9493 修复无网络时启动的闪退问题 2022-06-01 17:20:46 +08:00
650734ee9f 修复测试包无法切换至测试环境的问题 2022-06-01 17:20:15 +08:00
a7cd598bba 【光环助手V5.10.0】游戏副标题相关需求(20220601测试补充) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-06-01 15:51:12 +08:00
5cff7337d6 添加简陋的日夜间模式切换浮窗 2022-06-01 15:22:03 +08:00
d592b1104e 修复 BaseActivity 部分测试代码会出现在正式包的问题 2022-06-01 15:07:39 +08:00
4d1411e5a1 Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-06-01 13:50:04 +08:00
0afefdffb6 将BUILD_TIME、IS_NIGHT_MODE_ON移动到module_common/build.gradle中 2022-06-01 11:56:42 +08:00
fdbdd1bd02 处理SonarQube问题 2022-06-01 11:06:52 +08:00
7bef39e71a 处理SonarQube问题 2022-06-01 10:22:34 +08:00
7e237d963b 【光环助手V5.10.0】游戏副标题相关需求(20220531UI测试 遗漏) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-06-01 10:10:14 +08:00
b7d1a989ce 【光环助手V5.10.0】游戏副标题相关需求(20220531UI测试2、测试反馈补充) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-31 21:51:29 +08:00
30a3cb6b35 【光环助手V5.10.0】游戏副标题相关需求(20220531UI测试2、测试反馈补充) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-31 21:16:48 +08:00
lyr
924a3e6698 【光环助手v5.10.0】消息中心-新增评论详情页(0531新增优化) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829#note_151082 2022-05-31 19:31:32 +08:00
587237ab51 为详情页面添加业务 ID (修改为onActivityStarted时记录当前activity) https://git.shanqu.cc/halo/android/assistant-android/-/issues/68 2022-05-31 17:46:32 +08:00
79f04baae2 【光环助手V5.10.0】游戏副标题相关需求(20220531UI测试1-2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-31 17:38:34 +08:00
lyr
8df30d586b 【光环助手v5.10.0】消息中心-新增评论详情页(同步游戏单类型右上角选项操作逻辑) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829 2022-05-31 17:12:44 +08:00
lyr
db536c7a9b 优化游戏单详情页面网络错误显示 2022-05-31 17:06:49 +08:00
221447d6d2 【光环助手V5.10.0】游戏副标题相关需求(20220531测试反馈1-2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-31 16:46:38 +08:00
7995f14050 为详情页面添加业务 ID https://git.shanqu.cc/halo/android/assistant-android/-/issues/68 2022-05-31 16:09:10 +08:00
b340397716 【光环助手V5.10.0】游戏副标题相关需求(修复游戏搜索不显示副标题的问题) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-31 15:30:14 +08:00
lyr
83d0f14c6a 【光环助手v5.10.0】消息中心-新增评论详情页(优化右上角选项操作逻辑) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829 2022-05-31 15:09:07 +08:00
lyr
4de770ede8 【光环助手v5.10.0】消息通知相关优化(【光环助手v5.10.0】消息通知相关优化-UI测试问题汇总) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830#note_150071 2022-05-31 12:52:52 +08:00
084ba2208a 修复游戏详情页下载区域阴影显示异常 2022-05-31 11:58:19 +08:00
ae3da941eb 【光环助手v5.10.0】前端优化汇总5月第3周(8) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-31 11:56:26 +08:00
f9bcb1c559 【光环助手V5.10.0】前端优化汇总5月第2周(0527UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1845 2022-05-31 11:44:32 +08:00
lyr
97a37ef4ed 【光环助手v5.10.0】前端优化汇总5月第3周 (19) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858#note_150514 2022-05-31 09:23:43 +08:00
lyr
0706096792 【光环助手v5.10.0】前端优化汇总5月第3周 (UI测试 11.遗留、16) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858#note_150721 2022-05-30 17:49:06 +08:00
005ec81929 【光环助手V5.10.0】游戏副标题相关需求 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-30 17:11:01 +08:00
lyr
7671e0b4e1 【光环助手v5.10.0】前端优化汇总5月第3周 (15) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858#note_150514 2022-05-30 15:58:09 +08:00
lyr
7daee24e10 【光环助手v5.10.0】前端优化汇总5月第3周 (UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858#note_150514 2022-05-30 15:40:08 +08:00
1bd2b462c3 Merge branches 'dev' and 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-30 14:32:48 +08:00
8fb2b1c829 版本更新至 5.9.1 2022-05-30 11:53:00 +08:00
1ce24661ad 【光环助手V5.10.0】游戏单活动:游戏单征集计划vol.1(首页视频广告添加上报入口)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1779 2022-05-30 11:51:40 +08:00
lyr
33fa255fd4 【光环助手v5.10.0】消息中心-新增评论详情页(0525测试反馈 1 / 0526测试反馈 2 / 0527测试反馈 6) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829 2022-05-30 11:45:50 +08:00
lyr
64371f3b9a 【光环助手v5.10.0】消息中心-新增评论详情页(0524测试反馈 1) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829#note_149715 2022-05-30 09:46:42 +08:00
lyr
8e00b1c67e 【光环助手v5.10.0】前端优化汇总5月第3周 (10-18 除15点) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-27 18:43:30 +08:00
0b56e19da6 【光环助手V5.10.0】游戏副标题相关需求 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1839 2022-05-27 18:34:14 +08:00
0ea7edb60e 【光环助手V5.10.0】前端优化汇总5月第2周(0527UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1845 2022-05-27 18:31:22 +08:00
84b876394d Merge branch 'hotfix-v5.9.0-532-crashes' into 'release'
修复首页游戏单轮播引发的一些闪退

See merge request halo/android/assistant-android!256
2022-05-27 18:27:22 +08:00
3fb031c329 修复首页游戏单轮播引发的一些闪退 2022-05-27 18:25:22 +08:00
f3f51c5344 revert commit 375b1e4b 2022-05-27 18:18:46 +08:00
e4267336b8 Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-27 18:13:41 +08:00
4885abbb32 修改首页有多个论坛tab导致跳转错误 2022-05-27 18:13:36 +08:00
e46afac397 Merge branch 'hotfix-v5.9.0-532-crashes' into 'release'
修复首页游戏单安利墙引发的一些闪退

See merge request halo/android/assistant-android!255
2022-05-27 17:46:49 +08:00
fdf2c80667 修复首页游戏单安利墙引发的一些闪退 2022-05-27 17:34:01 +08:00
f994b03d06 【光环助手V5.10.0】游戏单活动:游戏单征集计划vol.1(0527测试2)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1779 2022-05-27 17:16:18 +08:00
fd59e3b838 处理合并冲突 2022-05-27 16:23:23 +08:00
c7d5dbb59c Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2022-05-27 16:08:57 +08:00
120e98a81f Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	app/src/main/java/com/gh/common/util/NewLogUtils.kt
2022-05-27 10:27:14 +08:00
8964ce704c 【光环助手V5.10.0】游戏单活动:游戏单征集计划vol.1(0526测试1、3)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1779 2022-05-26 16:59:57 +08:00
lyr
15f2fe8e63 【光环助手v5.10.0】消息通知相关优化(埋点部分) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830 2022-05-26 16:57:30 +08:00
lyr
3500da75fa 删除多余代码 2022-05-26 15:55:02 +08:00
lyr
26f45d343b 【光环助手v5.10.0】消息中心-赞同/邀请消息通知样式优化(完善展示) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1831#note_149932 2022-05-26 15:15:45 +08:00
lyr
1582f449bd 【光环助手v5.10.0】消息中心-新增评论详情页(完善右上角选项) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829 2022-05-26 15:13:05 +08:00
a195ea9889 【光环助手V5.10.0】游戏单活动:游戏单征集计划vol.1(增加js获取入口方法)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1779 2022-05-26 12:00:11 +08:00
0712dfc3be Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-26 11:19:19 +08:00
56946a1212 【光环助手V5.10.0】数据埋点需求(0526测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1835 2022-05-26 11:09:13 +08:00
d9fcdbb7c4 Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-25 18:14:00 +08:00
lyr
521e8fead8 【光环助手v5.10.0】消息中心-新增评论详情页(0524测试反馈 7、8) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829#note_149715 2022-05-25 18:10:23 +08:00
a8fa9e50cc 【光环助手V5.10.0】数据埋点需求(0524测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1835 2022-05-25 16:21:26 +08:00
lyr
b7d3eb308b 【光环助手v5.10.0】消息通知相关优化(区分普通帖/视频贴的评论回复和评论回复的回复) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830#note_149103 2022-05-25 10:41:54 +08:00
lyr
2c712da2b9 【光环助手v5.10.0】消息通知相关优化(区分普通帖/视频贴的评论回复和评论回复的回复) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830#note_149103 2022-05-25 10:40:03 +08:00
lyr
dfffaf0f15 【光环助手v5.10.0】消息中心-赞同/邀请消息通知样式优化(邀请部分) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1831 2022-05-25 10:29:06 +08:00
054061a4f7 【光环助手V5.10.0】游戏库功能优化(0524测试2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1834 2022-05-25 09:08:33 +08:00
lyr
ed28614abb 【光环助手v5.10.0】消息通知相关优化(修改评论消息的父评论的图片展示和点赞消息的图片展示) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830 2022-05-24 19:07:38 +08:00
lyr
30f2cfd32d 【光环助手v5.10.0】消息中心-赞同/邀请消息通知样式优化(点赞部分) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1831 2022-05-24 18:13:33 +08:00
d12a1037a2 版本更新至 5.9.0-532 2022-05-24 17:51:10 +08:00
1ded43174a Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-24 17:49:33 +08:00
e21769eea8 修改游戏库tab显示问题 2022-05-24 15:13:36 +08:00
lyr
1c4ca0e1bc 【光环助手v5.10.0】消息通知相关优化(评论列表仅首次进入时接口增加"top_comment_id"参数) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830 2022-05-24 14:14:07 +08:00
lyr
dbd3530019 【光环助手v5.10.0】评论回复相关优化(一)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1847 2022-05-24 10:53:18 +08:00
38d1646fc0 处理部分 SonarQube 问题 2022-05-24 10:22:09 +08:00
lyr
4a9a955841 【光环助手v5.10.0】个人主页-回答跳转优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1827 2022-05-23 18:56:51 +08:00
71d5207ecd Merge branch 'cherry-pick-7a86e44b' into 'dev'
【光环助手v5.10.0】消息通知相关优化(除埋点外完成) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830

See merge request halo/android/assistant-android!254
2022-05-23 16:56:09 +08:00
lyr
d45538d1f9 【光环助手v5.10.0】消息通知相关优化(除埋点外完成) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830
(cherry picked from commit 7a86e44be127f91c42e02a6bd4adf2b0b04af22a)
2022-05-23 16:46:14 +08:00
44e5b218e3 模块/组件化前期改造 https://git.shanqu.cc/halo/android/assistant-android/-/issues/64 2022-05-23 16:07:46 +08:00
0e0689a90e Merge remote-tracking branch 'origin/dev-5.10.0' into dev 2022-05-23 11:42:27 +08:00
670d0100c8 Merge remote-tracking branch 'origin/dev' into dev 2022-05-23 11:38:34 +08:00
cf2de0449e 处理部分 SonarQube 问题 2022-05-23 11:38:29 +08:00
ec9797e932 模块/组件化前期改造 https://git.shanqu.cc/halo/android/assistant-android/-/issues/64 2022-05-23 11:33:38 +08:00
04f2312e03 处理 SonarQube 问题 2022-05-23 11:32:33 +08:00
e57d15d650 Merge remote-tracking branch 'origin/dev-5.10.0' into dev
# Conflicts:
#	app/src/main/java/com/gh/common/view/RichEditor.java
#	app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt
2022-05-23 10:47:18 +08:00
c99b5d9940 【光环助手V5.10.0】前端优化汇总5月第2周(2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1845 2022-05-23 10:35:22 +08:00
056400d4d1 Merge branch 'dev' into 'release'
累积变更

See merge request halo/android/assistant-android!253
2022-05-21 16:02:02 +08:00
26cbdeaf2d Merge branch 'feature-issues1865' into 'release'
【合规相关】单机游戏内实名校验功能(3) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1865

See merge request halo/android/assistant-android!252
2022-05-21 15:58:45 +08:00
6a5f7f8284 【合规相关】单机游戏内实名校验功能(3) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1865 2022-05-21 15:57:23 +08:00
lyr
7f68763047 【光环助手v5.10.0】消息通知相关优化(处理评论字段冲突) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830 2022-05-20 19:00:15 +08:00
lyr
6a1503d8c9 【光环助手v5.10.0】消息通知相关优化(大致完成) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830 2022-05-20 18:50:55 +08:00
c05dfebf1b 模块/组件化前期改造(解耦ToolBarActivity) https://git.shanqu.cc/halo/android/assistant-android/-/issues/64 2022-05-20 17:00:50 +08:00
6401711f7e 修复无法切换测试环境和正式环境的问题 2022-05-20 16:56:04 +08:00
f272e486f8 【光环助手v5.10.0】前端优化汇总5月第3周(9) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-20 11:40:29 +08:00
lyr
b815a17747 1.【光环助手v5.10.0】消息通知相关优化(完成UI和部分跳转) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1830
2.【光环助手v5.10.0】消息中心-新增评论详情页(大致完成) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1829
2022-05-19 18:49:50 +08:00
dec1deada9 【光环助手V5.10.0】数据埋点需求 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1835 2022-05-19 18:27:47 +08:00
aa580c27cc 【光环助手V5.10.0】游戏单活动:游戏单征集计划vol.1(增加跳转创建游戏单加入重复游戏的判断)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1779 2022-05-19 18:10:00 +08:00
375b1e4b4a 【光环助手V5.10.0】更新通用模块的跳转链接类型 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1838 2022-05-19 16:37:03 +08:00
f9ebb5342c 【光环助手V5.10.0】数据埋点需求 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1835 2022-05-19 16:07:26 +08:00
7b0514c055 处理 SonarQube 问题 2022-05-19 15:18:00 +08:00
909e7f33a8 Merge branch 'hotfix-v5.9.0-531-night_mode_switch' into 'release'
关闭遗漏的夜间模式切换代码

See merge request halo/android/assistant-android!251
2022-05-19 11:54:24 +08:00
677511b119 关闭遗漏的夜间模式切换代码 2022-05-19 11:52:57 +08:00
26a2605cd7 Merge branch 'hotfix-v5.9.0-530-crash' into 'release'
修复首页未初始化时切换日夜间模式导致的闪退

See merge request halo/android/assistant-android!250
2022-05-19 11:21:20 +08:00
b02f650a34 修复首页未初始化时切换日夜间模式导致的闪退 2022-05-19 11:19:25 +08:00
b661337133 【光环助手V5.10.0】游戏单活动:游戏单征集计划vol.1(实现跳转创建游戏单页面自动添加活动标签、加入对应游戏)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1779 2022-05-18 17:53:19 +08:00
d73e246538 修复组件化导致的一些问题 2022-05-18 16:44:56 +08:00
e1d82e7fbd 版本更新至 5.9.0-531 2022-05-18 16:21:44 +08:00
4263f53315 【光环助手v5.10.0】前端优化汇总5月第3周(6) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-18 15:14:17 +08:00
f235959372 Merge branch 'hotfix-v5.9.0-530-fragment_resume_crash' into 'release'
修复特殊场景下 fragment 恢复页面时的闪退

See merge request halo/android/assistant-android!249
2022-05-18 15:13:09 +08:00
7bc6655b99 修复特殊场景下 fragment 恢复页面时的闪退 2022-05-18 15:12:24 +08:00
7ecc227df5 修复从其他页面返回首页搜索栏变成深色的问题 2022-05-18 11:49:25 +08:00
3046d33f91 Merge branch 'hotfix-v5.9.0-530-crash' into 'release'
修复游戏单安利墙轮播发生的闪退问题,修复从其他页面返回首页搜索栏变成深色的问题

See merge request halo/android/assistant-android!248
2022-05-18 11:45:28 +08:00
a32829fd0d 【光环助手v5.10.0】前端优化汇总5月第3周(6) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-18 11:45:25 +08:00
4819bf3ddf 修复从其他页面返回首页搜索栏变成深色的问题 2022-05-18 11:15:12 +08:00
c2e02d356d 修复游戏单安利墙轮播发生的闪退问题 2022-05-18 11:09:23 +08:00
94cc44c277 Merge branch 'dev-5.10.0' of git.shanqu.cc:halo/android/assistant-android into dev-5.10.0 2022-05-17 17:34:28 +08:00
116702f7f0 模块/组件化前期改造 https://git.shanqu.cc/halo/android/assistant-android/-/issues/64 2022-05-17 17:34:21 +08:00
dafaeef184 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/MainActivity.java
#	app/src/main/java/com/halo/assistant/fragment/SettingsFragment.kt
#	dependencies.gradle
2022-05-17 17:10:54 +08:00
a9917c9201 Merge branch 'hotfix-v5.8.1-512-game_list_outofbounds_crash' into 'release'
修复游戏库横向滑动专题数量为空时会闪退的问题

See merge request halo/android/assistant-android!247
2022-05-17 14:44:24 +08:00
c0b61822c0 修复游戏库横向滑动专题数量为空时会闪退的问题 2022-05-17 14:29:15 +08:00
cb54a0e780 添加简单的日夜间模式切换测试按钮 2022-05-17 11:41:12 +08:00
0d44d4e54a 补充启动页的简单的夜间模式适配 2022-05-17 11:40:30 +08:00
3db6d1288d 调整移除夜间模式的脚本 2022-05-17 10:25:31 +08:00
a16a16cbdf 【光环助手V5.10.0】视频模板活动问题汇总(4) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1852 2022-05-16 16:57:26 +08:00
1bb240c964 日夜间模式的切换(修复首页排行榜tab、新分类2.0tab日夜间模式切换没有变色的问题) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-16 16:38:21 +08:00
a1be8352f0 【光环助手V5.10.0】游戏库功能优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1834 2022-05-16 15:09:03 +08:00
lyr
5ef4f1d14c 【光环助手v5.10.0】前端优化汇总5月第3周(2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-16 14:35:51 +08:00
lyr
6330e004ba 日夜间模式的切换(光能中心页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-16 11:33:34 +08:00
44bed82f08 【光环助手v5.10.0】前端优化汇总5月第3周(4) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-16 10:23:54 +08:00
0decb62237 【光环助手v5.10.0】前端优化汇总5月第3周(5) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-16 09:36:55 +08:00
e9b170503b 日夜间模式的切换(修复分类、新分类、新分类2.0部分列表Item在日夜模式切换时未刷新颜色问题) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-14 22:17:27 +08:00
lyr
ccd6a866dc 日夜间模式的切换(开服表页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-13 19:07:06 +08:00
1ae37710ca 【光环助手5.10.0】论坛主页热度值展示优化(5.13测试反馈) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1856 2022-05-13 18:14:14 +08:00
202c546922 删除部分无用代码 2022-05-13 16:22:50 +08:00
d2f5d35403 删除部分无用代码 2022-05-13 15:51:29 +08:00
44c2219753 模块/组件化前期改造 https://git.shanqu.cc/halo/android/assistant-android/-/issues/64 2022-05-13 15:34:22 +08:00
cdedea5002 【光环助手v5.10.0】前端优化汇总5月第3周(1) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-13 14:39:42 +08:00
88c4ebe5a0 Merge branch 'hotfix-v5.8.1-512-databinding' into 'release'
修复移除databinding引发的问题

See merge request halo/android/assistant-android!246
2022-05-13 14:38:26 +08:00
c627bfb994 删除部分无用代码 2022-05-13 14:13:16 +08:00
10cbcdd768 【光环助手v5.10.0】前端优化汇总5月第3周(1) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1858 2022-05-13 14:12:51 +08:00
5e7b0dd169 【光环助手5.10.0】论坛主页热度值展示优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1856 2022-05-13 10:09:17 +08:00
lyr
8ae7ef421c 日夜间模式的切换(我的游戏页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-12 16:56:09 +08:00
96b92d9212 删除无用代码 2022-05-12 16:19:17 +08:00
e6f9beeace Merge branch 'feature-modular' into 'dev-5.10.0'
处理编译问题

See merge request halo/android/assistant-android!245
2022-05-12 15:52:27 +08:00
f4f4807ce8 处理编译问题 2022-05-12 15:38:22 +08:00
f1d52fdc80 Merge branch 'dev-5.10.0' into feature-modular
# Conflicts:
#	app/src/main/java/com/gh/common/util/QuickLoginHelper.kt
#	app/src/main/java/com/gh/common/view/ConfigFilterView.kt
#	app/src/main/java/com/gh/gamecenter/AboutActivity.java
#	app/src/main/java/com/gh/gamecenter/CollectionActivity.java
#	app/src/main/java/com/gh/gamecenter/ConcernInfoActivity.java
#	app/src/main/java/com/gh/gamecenter/DownloadManagerActivity.java
#	app/src/main/java/com/gh/gamecenter/HelpAndFeedbackActivity.kt
#	app/src/main/java/com/gh/gamecenter/InfoActivity.java
#	app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java
#	app/src/main/java/com/gh/gamecenter/MessageActivity.java
#	app/src/main/java/com/gh/gamecenter/MessageInviteActivity.java
#	app/src/main/java/com/gh/gamecenter/MessageKeFuActivity.java
#	app/src/main/java/com/gh/gamecenter/MessageVoteActivity.java
#	app/src/main/java/com/gh/gamecenter/QaActivity.kt
#	app/src/main/java/com/gh/gamecenter/SettingActivity.kt
#	app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java
#	app/src/main/java/com/gh/gamecenter/SuggestionActivity.java
#	app/src/main/java/com/gh/gamecenter/WebActivity.kt
#	app/src/main/java/com/gh/gamecenter/catalog/CatalogActivity.kt
#	app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListActivity.kt
#	app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListFragment.kt
#	app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectAdapter.kt
#	app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
#	app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
#	app/src/main/java/com/gh/gamecenter/category/CategoryDirectoryActivity.kt
#	app/src/main/java/com/gh/gamecenter/category/CategoryListActivity.kt
#	app/src/main/java/com/gh/gamecenter/category/NewCategoryHorizontalAdapter.kt
#	app/src/main/java/com/gh/gamecenter/category2/CategoryDirectoryAdapter.kt
#	app/src/main/java/com/gh/gamecenter/category2/CategoryV2Activity.kt
#	app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt
#	app/src/main/java/com/gh/gamecenter/forum/list/ForumListActivity.kt
#	app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorActivity.kt
#	app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListActivity.kt
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt
#	app/src/main/java/com/gh/gamecenter/game/columncollection/detail/ColumnCollectionDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/game/commoncollection/detail/CommonCollectionDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/game/upload/GameSubmissionActivity.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/choose/AddSearchGameFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/choose/AddUserPlayedGameFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/choose/ChooseGamesAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/choose/ChooseGamesFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/mine/MyGameCollectionFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/ChooseGameCollectionCoverTypeDialog.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/ChooseGameCollectionDefaultCoverDialog.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/tag/GameCollectionTagAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/tag/GameCollectionTagSelectFragment.kt
#	app/src/main/java/com/gh/gamecenter/help/HelpContainerFragment.kt
#	app/src/main/java/com/gh/gamecenter/help/HelpQaAdapter.kt
#	app/src/main/java/com/gh/gamecenter/help/HelpQaCategoryFragment.kt
#	app/src/main/java/com/gh/gamecenter/help/QaFeedbackDialogFragment.kt
#	app/src/main/java/com/gh/gamecenter/history/HistoryActivity.kt
#	app/src/main/java/com/gh/gamecenter/libao/LibaoFragment.java
#	app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java
#	app/src/main/java/com/gh/gamecenter/personal/DeliveryInfoActivity.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewActivity.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/background/PersonalityBackgroundFragment.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderActivity.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/fans/FansActivity.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/followers/FollowersActivity.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserGameFragment.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/rating/RatingActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/article/detail/comment/ArticleDetailCommentFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/article/draft/ArticleDraftActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt
#	app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/editor/GameActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/editor/InsertGameCollectionWrapperActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/editor/InsertVideoWrapperActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/editor/LocalMediaActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskActivity.java
#	app/src/main/java/com/gh/gamecenter/qa/questions/draft/QuestionDraftActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteActivity.java
#	app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt
#	app/src/main/java/com/gh/gamecenter/security/BindPhoneActivity.kt
#	app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt
#	app/src/main/java/com/gh/gamecenter/security/SecurityActivity.kt
#	app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingActivity.kt
#	app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt
#	app/src/main/java/com/gh/gamecenter/setting/VideoSettingActivity.kt
#	app/src/main/java/com/gh/gamecenter/setting/VideoSettingFragment.kt
#	app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt
#	app/src/main/java/com/gh/gamecenter/tag/TagsActivity.kt
#	app/src/main/java/com/gh/gamecenter/toolbox/ToolBoxBlockActivity.kt
#	app/src/main/java/com/gh/gamecenter/toolbox/ToolBoxItemAdapter.kt
#	app/src/main/java/com/gh/gamecenter/video/VideoItemViewHolder.kt
#	app/src/main/java/com/gh/gamecenter/video/data/VideoDataFragment.kt
#	app/src/main/java/com/gh/gamecenter/video/game/GameVideoFragment.kt
#	app/src/main/java/com/gh/gamecenter/video/label/VideoLabelAdapter.kt
#	app/src/main/res/layout/activity_background_clip.xml
#	app/src/main/res/layout/community_answer_item.xml
#	app/src/main/res/layout/user_history_item.xml
#	app/src/main/res/values-night/colors.xml
#	app/src/main/res/values/colors.xml
#	app/src/main/res/values/strings.xml
#	module_common/src/main/java/com/gh/gamecenter/common/base/fragment/BaseDialogFragment.java
#	module_common/src/main/java/com/gh/gamecenter/common/utils/NightModeUtils.kt
#	module_core/src/main/java/com/gh/gamecenter/core/AppExecutor.kt
2022-05-12 11:10:46 +08:00
lyr
1002e4b808 日夜间模式的切换(模拟器游戏页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 18:18:55 +08:00
2d651572d0 日夜间模式的切换(修复首页tab日夜间模式切换变色异常) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 17:55:52 +08:00
lyr
5af3894ae3 日夜间模式的切换(模拟器游戏页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 17:42:09 +08:00
lyr
2d5a363215 日夜间模式的切换(账号与安全页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 16:20:27 +08:00
7afbfb30a2 【光环助手V5.10.0】视频模板活动问题汇总(2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1852 2022-05-11 15:47:35 +08:00
lyr
a15dd256f0 日夜间模式的切换(浏览记录页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 15:13:09 +08:00
090a567887 版本更新至 5.8.1 2022-05-11 15:09:05 +08:00
e55faee9fe Merge branch 'hotfix-v5.8.0-511-setting_crash' into 'release'
修复快速进出设置界面可能的闪退问题

See merge request halo/android/assistant-android!244
2022-05-11 15:07:29 +08:00
362e34be8a 修复快速进出设置界面可能的闪退问题 2022-05-11 15:06:08 +08:00
9d4c6f660a 内联 getter 方法,移除重复初始化赋值 2022-05-11 14:34:23 +08:00
bf1e5586b0 Merge branch 'hotfix-v5.8.0-511-xapk_unzip_permission_on_android_s' into 'release'
修复 XAPK 在 Android 12 授权后无法解压的问题

See merge request halo/android/assistant-android!243
2022-05-11 14:28:47 +08:00
bad10158bd 修复 XAPK 在 Android 12 授权后无法解压的问题 2022-05-11 14:21:47 +08:00
lyr
21fa841e3a 日夜间模式的切换(帮助与反馈页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 11:48:49 +08:00
5cc58e2182 Merge branch 'hotfix-v5.8.0-511_webpage_portrait' into 'release'
修改打开网页会变为横屏问题

See merge request halo/android/assistant-android!242
2022-05-11 11:47:30 +08:00
lyr
fb4e38e50f 日夜间模式的切换(账号与安全页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-11 11:46:36 +08:00
fd836137a5 修改打开网页会变为横屏问题 2022-05-11 11:05:18 +08:00
lyr
9628af4168 日夜间模式的切换(账号与安全页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-10 16:01:11 +08:00
e59b4b42cf 游戏评论页日夜间模式 2022-05-10 14:34:46 +08:00
64ae5d02fb 日夜间模式的切换(视频、我的收藏部分) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-10 10:47:15 +08:00
lyr
029a12c481 日夜间模式的切换(旧分类页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-10 10:31:40 +08:00
3fc4d9276d 日夜间模式更新状态栏底色替换为Extensions方法 2022-05-09 18:31:35 +08:00
531e11748d Merge remote-tracking branch 'origin/dev' into dev-5.10.0 2022-05-09 17:50:49 +08:00
b122e460cc 补充夜间模式开关控制 2022-05-09 17:50:26 +08:00
8f99db1841 Merge remote-tracking branch 'origin/dev-5.10.0' into dev-5.10.0 2022-05-09 17:42:45 +08:00
7bd779b8e3 日夜间模式的切换(社区帖子部分) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-09 17:31:02 +08:00
e5cffac98a Merge remote-tracking branch 'origin/dev' into dev-5.10.0 2022-05-09 17:08:30 +08:00
3b29fcbef7 处理顶部 toolbar 图标存在毛刺的问题 2022-05-09 17:01:30 +08:00
9f60a2ba86 调整编译脚本 2022-05-09 16:49:35 +08:00
8df7b3d9ee 编译脚本添加关闭夜间模式入口 2022-05-09 16:40:57 +08:00
e2040f9a2d 添加夜间模式功能全局控制开关 2022-05-09 16:36:36 +08:00
lyr
8a8184a4a9 日夜间模式的切换(新分类2.0页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-09 15:36:37 +08:00
lyr
373cec9ff2 日夜间模式的切换(新分类2.0页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-09 15:19:42 +08:00
2938e843f0 版本升级为 5.10.0 2022-05-09 14:15:17 +08:00
eaba77b3a7 【光环助手V5.10.0】前端优化汇总5月第2周(3) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1845 2022-05-09 11:57:36 +08:00
e39cd494b5 日夜间模式的切换(用户中心部分) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-09 11:49:38 +08:00
lyr
877acf54f4 日夜间模式的切换(新分类页面-优化) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-07 18:31:45 +08:00
a31d7a06f7 修复ToolbarActivity空指针闪退 2022-05-07 18:26:56 +08:00
f52937830b 新增Extensions方法 2022-05-07 18:25:00 +08:00
b5202cc931 日夜间模式的切换(资讯页面、工具箱、设置页面 补充) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-07 17:14:47 +08:00
dd2bfbc53f 日夜间模式的切换(游戏板块部分) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-07 16:48:01 +08:00
d2f3cdadf6 修改游戏详情图片重复刷新问题 2022-05-07 16:04:32 +08:00
73a88f9099 Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-07 15:45:50 +08:00
a86c957872 日夜间模式的切换(社区论坛部分) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-07 15:45:45 +08:00
lyr
45588a2580 日夜间模式的切换(新分类页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-07 15:39:03 +08:00
3b55269319 Merge remote-tracking branch 'origin/release' into dev 2022-05-07 15:18:17 +08:00
01966a87ec 移除废弃的广点通部分代码 2022-05-07 15:18:05 +08:00
b4a8e5c68d 日夜间模式的切换(游戏单部分) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-07 14:17:18 +08:00
aeb7842299 正式包移除夜间模式功能 2022-05-07 09:55:42 +08:00
lyr
e0bcf947bf 【光环助手V5.9.0】新社区7期-论坛详情页优化(增加标签字体颜色字段)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1789#note_146539 2022-05-06 20:53:09 +08:00
30bf685962 日夜间模式的切换(专题页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-06 20:48:17 +08:00
1e6fa023dc Merge branch 'dev' of git.shanqu.cc:halo/android/assistant-android into dev 2022-05-06 20:42:44 +08:00
b5920fc409 【光环助手V5.9.0】新社区7期-新增视频模板活动优化(后台)(22020506测试反馈1) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1796 2022-05-06 20:42:35 +08:00
16ceb7115e Merge remote-tracking branch 'origin/dev' into dev 2022-05-06 18:29:57 +08:00
279ed66270 处理 SonarQube 问题 2022-05-06 18:28:56 +08:00
lyr
9bfa8a33c8 【光环助手V5.9.0】后台优化汇总4月第3周(16)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1802#note_146500 2022-05-06 18:24:57 +08:00
99bd4da08a 处理合并异常 2022-05-06 18:00:13 +08:00
4824814981 Merge remote-tracking branch 'origin/dev-5.9.0' into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/teenagermode/TeenagerModeFragment.kt
#	app/src/main/java/com/gh/gamecenter/toolbox/ToolBoxItemAdapter.kt
2022-05-06 17:50:41 +08:00
10237d2fde 日夜间模式的切换(搜索页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65
日夜间模式的切换(搜索页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65
2022-05-06 17:30:50 +08:00
c1b236080e Merge remote-tracking branch 'origin/dev-5.9.0' into dev-5.9.0 2022-05-06 15:18:04 +08:00
83d16a16b8 日夜间模式的切换(搜索页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-05-06 15:08:58 +08:00
52ccffb97a 添加简单的日夜间模式 View 颜色切换辅助方法 2022-05-06 15:08:45 +08:00
lyr
9ed9e22df4 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(0427UI测试问题汇总 2)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-05-06 11:30:55 +08:00
lyr
82fcde1245 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(0505UI测试问题汇总)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794#note_146206 2022-05-05 16:08:41 +08:00
lyr
eab945acfc 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(0427UI测试问题汇总 遗留2、7)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-05-05 15:25:24 +08:00
lyr
d3ed6d750b 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(微调活动主页UI) 2022-05-05 10:59:51 +08:00
963e8da89c Merge branch 'dev-5.9.0' into feature-modular
# Conflicts:
#	app/src/main/java/com/gh/base/BaseActivity_TabLayout.java
#	app/src/main/java/com/gh/common/dialog/PrivacyDialogFragment.kt
#	app/src/main/java/com/gh/common/dialog/WelcomeDialog.kt
#	app/src/main/java/com/gh/common/util/EntranceUtils.java
#	app/src/main/java/com/gh/common/view/FlexLinearLayout.kt
#	app/src/main/java/com/gh/common/view/WelcomeDialog.kt
#	app/src/main/java/com/gh/gamecenter/AboutActivity.java
#	app/src/main/java/com/gh/gamecenter/DownloadManagerActivity.java
#	app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java
#	app/src/main/java/com/gh/gamecenter/MessageActivity.java
#	app/src/main/java/com/gh/gamecenter/SettingActivity.kt
#	app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java
#	app/src/main/java/com/gh/gamecenter/SuggestionActivity.java
#	app/src/main/java/com/gh/gamecenter/catalog/BannerAdapter.kt
#	app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogFragment.kt
#	app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt
#	app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListFragment.kt
#	app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java
#	app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingFragment.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyActivity.kt
#	app/src/main/java/com/gh/gamecenter/gamedetail/rating/logs/CommentLogsActivity.kt
#	app/src/main/java/com/gh/gamecenter/home/HomeRecommendItemViewHolder.kt
#	app/src/main/java/com/gh/gamecenter/info/ConcernFragment.java
#	app/src/main/java/com/gh/gamecenter/info/StrategyDialogAdapter.java
#	app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java
#	app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java
#	app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java
#	app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java
#	app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java
#	app/src/main/java/com/gh/gamecenter/libao/LibaoFragment.java
#	app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java
#	app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt
#	app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt
#	app/src/main/java/com/gh/gamecenter/libao/LibaoSearchFragment.java
#	app/src/main/java/com/gh/gamecenter/personal/NewPersonalFunctionGroupAdapter.kt
#	app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt
#	app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt
#	app/src/main/java/com/gh/gamecenter/setting/VideoSettingFragment.kt
#	app/src/main/java/com/gh/gamecenter/suggest/SuggestSelectGameAdapter.java
#	app/src/main/java/com/gh/gamecenter/tag/TagsActivity.kt
#	app/src/main/java/com/gh/gamecenter/teenagermode/PasswordSettingFragment.kt
#	app/src/main/java/com/gh/gamecenter/teenagermode/TeenagerModeFragment.kt
#	app/src/main/java/com/gh/gamecenter/toolbox/ToolBoxBlockAdapter.kt
#	app/src/main/res/layout/fragment_forum.xml
#	app/src/main/res/values-night/colors.xml
#	app/src/main/res/values-night/styles.xml
#	app/src/main/res/values/colors.xml
#	app/src/main/res/values/styles.xml
#	module_common/src/main/java/com/gh/gamecenter/common/base/fragment/BaseFragment_TabLayout.java
#	module_core/src/main/java/com/gh/gamecenter/core/utils/DisplayUtils.java
2022-05-05 10:24:37 +08:00
lyr
bb4878eab4 【光环助手V5.9.0】新社区7期-论坛主页优化(0427UI测试 遗留问题)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-05-05 10:11:37 +08:00
lyr
53d8444c85 Merge remote-tracking branch 'origin/dev-5.9.0' into dev-5.9.0 2022-04-29 18:30:24 +08:00
lyr
7db009a3cd 【光环助手V5.9.0】新社区7期-论坛详情页优化(0427UI测试)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1789 2022-04-29 18:30:20 +08:00
4932fc2d7b 日夜间模式的切换 https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-04-29 18:24:17 +08:00
ca55ac02b7 日夜间模式的切换(礼包页面) https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-04-29 16:27:14 +08:00
lyr
c535ffb2e0 【光环助手V5.9.0】新社区7期-论坛主页优化 (0427UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-04-29 11:27:39 +08:00
9c6eb22d9d 【光环助手V5.9.0】游戏单新增[活动标签]功能(0429测试1)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-29 10:35:13 +08:00
lyr
9ec6ec0281 【光环助手V5.9.0】新社区7期-论坛主页优化 (0427测试反馈 3) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-04-28 17:10:05 +08:00
lyr
327441e62b 【光环助手V5.9.0】新社区7期-论坛主页优化(0427测试反馈 3)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-04-28 17:04:27 +08:00
lyr
ae3f07a3ee 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化 (活动Tab图片使用svg实现) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-28 16:49:43 +08:00
f967e1f283 日夜间模式的切换 https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-04-28 16:17:29 +08:00
ba1308c568 修复创建游戏单使用草稿时无法选择活动标签的问题 2022-04-28 15:13:13 +08:00
ec1c5713ad 【光环助手V5.9.0】新社区7期-内容(帖子、视频帖、提问帖)详情页优化(0428UI测试1,2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1795 2022-04-28 14:30:34 +08:00
15adc93340 Merge remote-tracking branch 'origin/dev-5.9.0' into dev-5.9.0 2022-04-28 09:53:05 +08:00
c9b27f6ebe 【光环助手V5.9.0】游戏实名认证提示及其他相关优化(0427UI测试2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1785 2022-04-28 09:52:49 +08:00
cff7f7d2e2 修改社区帖子评论作者标签显示错误 2022-04-28 09:52:28 +08:00
cb5d0c4840 修改游戏评论详情点赞图片大小 2022-04-27 18:43:32 +08:00
dea6abe399 修改游戏评论页评论、点赞图标大小 2022-04-27 18:35:07 +08:00
lyr
20c792d4fa 【光环助手V5.9.0】新社区7期-论坛主页优化(0427测试反馈 1、2) 2022-04-27 18:27:03 +08:00
lyr
b8cbd5a0fb Merge remote-tracking branch 'origin/dev-5.9.0' into dev-5.9.0 2022-04-27 18:07:40 +08:00
lyr
0a34f23e62 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化 (0427UI测试问题汇总) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-27 18:07:17 +08:00
7413b4e4ac 【光环助手V5.9.0】游戏实名认证提示及其他相关优化(0427UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1785 2022-04-27 18:04:52 +08:00
d2025c32c9 【光环助手V5.9.0】新社区7期-内容(帖子、视频帖、提问帖)详情页优化(0427UI测试2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1795 2022-04-27 17:10:21 +08:00
5c5dd35409 Merge branch 'dev-5.9.0' of git.shanqu.cc:halo/android/assistant-android into dev-5.9.0 2022-04-27 16:45:54 +08:00
b509e9046e 游戏详情日夜间模式切换 https://git.shanqu.cc/halo/android/assistant-android/-/issues/65 2022-04-27 16:45:48 +08:00
lyr
46e99434c9 【光环助手V5.9.0】新社区7期-论坛详情页优化(0427UI测试)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1789 2022-04-27 16:11:36 +08:00
b6ff94aed3 光环助手V5.9.0】新社区7期-内容(帖子、视频帖、提问帖)详情页优化(0427UI测试1) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1795 2022-04-27 14:21:19 +08:00
25e0bd19bc 【光环助手V5.9.0】游戏实名认证提示及其他相关优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1785 2022-04-27 11:39:24 +08:00
lyr
fe5b398fad 【光环助手V5.9.0】新社区7期-论坛主页优化(0426UI测试问题汇总)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-04-27 11:30:39 +08:00
lyr
417ed1401e 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(0426UI测试问题汇总)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-27 10:38:14 +08:00
48698f06cd 【光环助手V5.9.0】游戏实名认证提示及其他相关优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1785 2022-04-26 18:37:16 +08:00
b70a7eaf8b 【光环助手V5.9.0】游戏库新增[导航栏]功能(20220426UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1783 2022-04-26 17:01:27 +08:00
lyr
ad86d7bbcc 【光环助手V5.9.0】前端优化汇总4月第5周(2)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1820 2022-04-26 15:56:53 +08:00
lyr
a2eb550099 【光环助手V5.9.0】游戏库新增[导航栏]功能(0426测试)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1783 2022-04-26 15:37:59 +08:00
lyr
e736855a4a 【光环助手V5.9.0】游戏库新增[导航栏]功能(数据埋点第4点-40425测试)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1783#note_145069 2022-04-26 11:48:53 +08:00
0b49f531ac 【光环助手V5.9.0】游戏单新增[轮播图]功能(0426补充)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1781 2022-04-26 10:08:59 +08:00
lyr
c36f4d9abf 【光环助手V5.9.0】新社区7期-论坛主页优化(优化顶部轮播图)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-04-25 18:01:08 +08:00
lyr
db72b0a5c9 【光环助手V5.9.0】游戏库新增[导航栏]功能(数据埋点 4)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1783 2022-04-25 17:11:30 +08:00
lyr
b19d21fc39 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(二(1))https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-25 15:37:53 +08:00
lyr
2d172d70ad 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(一(2))https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-25 14:24:57 +08:00
7f419a2ce7 Merge branch 'dev-5.9.0' into feature-modular
# Conflicts:
#	app/src/main/java/com/gh/common/util/EntranceUtils.java
#	app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java
#	app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectFragment.java
#	app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectViewHolder.java
#	app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt
2022-04-25 11:53:45 +08:00
cc434771c0 修复游戏单只有单个轮播图仍然自动轮播的问题 2022-04-25 10:03:58 +08:00
f5a9502261 【光环助手V5.9.0】游戏单新增[活动标签]功能(0424UI测试内容1)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-24 18:07:31 +08:00
c48d970b0a 【光环助手V5.9.0】游戏单新增[轮播图]功能(0422测试2、0424UI测试内容1)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1781 2022-04-24 17:49:08 +08:00
9a53c7a84e 【光环助手V5.9.0】游戏单新增[活动标签]功能(0424UI测试内容1)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-24 17:46:38 +08:00
ce17ae2d2b 【光环助手V5.9.0】新社区7期-内容(帖子、视频帖、提问帖)详情页优化(0424UI测试) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1795 2022-04-24 17:22:38 +08:00
lyr
d97f65e9b3 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(一(1))https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-24 16:31:34 +08:00
33af47b01b Merge branch 'dev-5.9.0' into feature-modular
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityFragment.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/ForumViewModel.kt
#	app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt
#	app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditViewModel.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt
#	app/src/main/java/com/gh/gamecenter/qa/article/MyArticleAdapter.kt
#	app/src/main/res/layout/community_answer_item.xml
#	app/src/main/res/layout/fragment_game_collection_square.xml
#	app/src/main/res/values-night/colors.xml
#	app/src/main/res/values/attrs.xml
#	app/src/main/res/values/colors.xml
2022-04-24 15:35:57 +08:00
9f1f3a2d66 【光环助手V5.9.0】新社区7期-内容(帖子、视频帖、提问帖)详情页优化(1) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1795 2022-04-24 14:24:08 +08:00
4c9609ba52 【光环助手V5.9.0】游戏单新增[活动标签]功能(0422测试1)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-24 11:58:11 +08:00
lyr
edc326ff3c 【光环助手V5.9.0】新社区7期-论坛主页优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792 2022-04-24 10:34:45 +08:00
lyr
819beb779c 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(一(2)) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794 2022-04-22 09:53:59 +08:00
de31dcaf0b 【光环助手V5.9.0】游戏单新增[轮播图]功能 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1781 2022-04-21 16:29:23 +08:00
587c217b7c 修改游戏库导航栏小红点显示逻辑问题 2022-04-21 10:08:09 +08:00
b03e86f903 上传遗漏文件 2022-04-20 23:18:15 +08:00
ea80942937 【光环助手V5.9.0】新社区7期-推荐信息页&个人主页&活动主页优化(一(2)(大部分)、三) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1794
【光环助手V5.9.0】新社区7期-论坛主页优化(UI部分(因后端未出接口)) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1792
2022-04-20 23:13:40 +08:00
06153cbf58 【光环助手V5.9.0】游戏库新增[导航栏]功能(曝光数据埋点) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1783 2022-04-20 17:08:11 +08:00
0b94f777a2 【光环助手V5.9.0】游戏库新增[导航栏]功能 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1783 2022-04-20 11:00:36 +08:00
ed80533198 【光环助手V5.9.0】游戏单新增[活动标签]功能(修复数据库迁移闪退) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-18 15:24:34 +08:00
4b5c741ff9 【光环助手V5.9.0】游戏单新增[活动标签]功能(修复编辑游戏单丢失活动标签的问题) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-18 12:02:23 +08:00
7a89ef3e74 处理一些合并后导包错误问题 2022-04-18 10:06:38 +08:00
10b696f78d Merge branch 'dev-5.9.0' into feature-modular
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/forum/detail/ForumTopLinkAdapter.kt
#	app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt
#	app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt
#	app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt
#	app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt
#	app/src/main/res/values-night/colors.xml
#	app/src/main/res/values/colors.xml
2022-04-18 09:53:20 +08:00
0e9f267117 版本更新至 5.9.0 2022-04-18 09:35:26 +08:00
02bb977cc0 【光环助手V5.9.0】游戏单新增[活动标签]功能(修改活动标签说明字段) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-15 15:48:07 +08:00
c4a89b9302 【光环助手V5.9.0】游戏单新增[活动标签]功能 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-15 14:44:33 +08:00
edcb4a949e 【光环助手V5.9.0】新社区7期-新增视频模板活动优化(后台)https://git.shanqu.cc/pm/halo-app-issues/-/issues/1796 2022-04-14 14:57:38 +08:00
a5c113e527 Merge remote-tracking branch 'origin/dev-5.9.0' into dev-5.9.0 2022-04-13 16:50:22 +08:00
048bdbc367 【光环助手V5.9.0】游戏单新增[活动标签]功能(UI部分) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1780 2022-04-13 16:49:14 +08:00
1e287f56e2 【光环助手V5.9.0】新社区7期-论坛详情页优化 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1789 2022-04-13 14:57:57 +08:00
2aacab80a6 【光环助手V5.9.0】新社区7期-内容(帖子、视频帖、提问帖)详情页优化(2) https://git.shanqu.cc/pm/halo-app-issues/-/issues/1795 2022-04-13 10:15:20 +08:00
e9ac9aab7f 模块/组件化前期改造 https://git.shanqu.cc/halo/android/assistant-android/-/issues/64 2022-04-09 19:48:45 +08:00
a052f981c5 Merge branch 'feature-night_mode_test' into dev-5.9.0 2022-04-06 18:14:55 +08:00
021886c3cb 实现游戏单广场、安利墙、我的光环夜间模式切换颜色 2022-04-02 18:01:42 +08:00
a406127cda 统一纯白、纯黑色值 2022-04-02 15:31:13 +08:00
f761715ebd 实现夜间模式切换首页tab和搜索栏颜色
实现游戏库夜间模式切换颜色
2022-04-01 15:28:30 +08:00
9303f534d9 修改夜间模式配色 2022-03-31 11:06:07 +08:00
0ef0ed7c50 Merge branch 'dev' into feature-night_mode_test 2022-03-30 11:36:34 +08:00
220fd340ce Merge branch 'dev' into feature-night_mode_test 2022-03-29 10:17:30 +08:00
d0ad110d9e Merge branch 'dev' into feature-night_mode_test
# Conflicts:
#	app/src/main/res/layout/questions_history_detail.xml
2022-03-28 17:40:17 +08:00
006f71def7 Merge remote-tracking branch 'origin/feature-night_mode_test' into feature-night_mode_test 2022-03-17 17:16:24 +08:00
047dc9a7ae 调研日/夜间模式切换的实现 https://git.shanqu.cc/halo/android/assistant-android/-/issues/60 2022-03-17 17:13:16 +08:00
01eb074df1 优化底部导航栏显示
添加注释
2022-03-14 17:27:36 +08:00
f6473b0e5e Merge branch 'dev-5.8.0' into feature-night_mode_test 2022-03-14 17:11:51 +08:00
e244797e7d 调研日/夜间模式切换的实现 https://git.shanqu.cc/halo/android/assistant-android/-/issues/60 2022-03-14 17:00:28 +08:00
89f8aebefe Merge branch 'dev-5.8.0' into feature-night_mode_test
# Conflicts:
#	app/src/main/res/layout/activity_ask_column_detail.xml
#	app/src/main/res/layout/activity_background_clip.xml
#	app/src/main/res/layout/activity_kaifu_patch.xml
#	app/src/main/res/layout/activity_rating_edit.xml
#	app/src/main/res/layout/activity_video_game.xml
#	app/src/main/res/layout/activity_video_uplaod.xml
#	app/src/main/res/layout/ask_search_question_item.xml
#	app/src/main/res/layout/catalog_header_item.xml
#	app/src/main/res/layout/catalog_image_item.xml
#	app/src/main/res/layout/commodity_item.xml
#	app/src/main/res/layout/common_collection_detail_one_item.xml
#	app/src/main/res/layout/common_collection_detail_two_item.xml
#	app/src/main/res/layout/common_collection_image_text_item.xml
#	app/src/main/res/layout/common_collection_item.xml
#	app/src/main/res/layout/community_follow_item.xml
#	app/src/main/res/layout/community_select_opened_item.xml
#	app/src/main/res/layout/daily_task_item.xml
#	app/src/main/res/layout/dialog_download_link.xml
#	app/src/main/res/layout/dialog_upload_schedule.xml
#	app/src/main/res/layout/download_dialog_installed_item.xml
#	app/src/main/res/layout/download_dialog_item.xml
#	app/src/main/res/layout/followers_or_fans_item.xml
#	app/src/main/res/layout/forum_search_content_list.xml
#	app/src/main/res/layout/fragment_answer_detail.xml
#	app/src/main/res/layout/fragment_answer_edit.xml
#	app/src/main/res/layout/fragment_background_preview.xml
#	app/src/main/res/layout/fragment_forum_detail.xml
#	app/src/main/res/layout/fragment_forum_video_detail.xml
#	app/src/main/res/layout/fragment_game_collection_poster.xml
#	app/src/main/res/layout/fragment_main_home.xml
#	app/src/main/res/layout/fragment_search_default.xml
#	app/src/main/res/layout/game_collection_detail_image_item.xml
#	app/src/main/res/layout/game_collection_item.xml
#	app/src/main/res/layout/game_head_item.xml
#	app/src/main/res/layout/game_image_item.xml
#	app/src/main/res/layout/game_image_slide_item.xml
#	app/src/main/res/layout/game_viewpager_item.xml
#	app/src/main/res/layout/home_amway_item.xml
#	app/src/main/res/layout/home_game_item.xml
#	app/src/main/res/layout/home_recommend_item.xml
#	app/src/main/res/layout/home_slide_list_item.xml
#	app/src/main/res/layout/item_article_detail_comment.xml
#	app/src/main/res/layout/item_forum_video.xml
#	app/src/main/res/layout/item_game_libao.xml
#	app/src/main/res/layout/item_my_game_collection.xml
#	app/src/main/res/layout/local_video_item.xml
#	app/src/main/res/layout/novice_task_item.xml
#	app/src/main/res/layout/rating_comment_item.xml
#	app/src/main/res/layout/rating_reply_item.xml
#	app/src/main/res/layout/set_wait_dialog.xml
#	app/src/main/res/layout/stairs_comment_item.xml
2022-03-11 11:41:46 +08:00
52eca3b1ab 调研日/夜间模式切换的实现 https://git.shanqu.cc/halo/android/assistant-android/-/issues/60 2022-03-11 11:18:26 +08:00
3625 changed files with 86514 additions and 61158 deletions

555
.editorconfig Normal file
View File

@ -0,0 +1,555 @@
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = false
max_line_length = 120
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = false
ij_smart_tabs = false
ij_visual_guides = none
ij_wrap_on_typing = false
[*.java]
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = true
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = true
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_records = true
ij_java_align_multiline_resources = true
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_align_types_in_multi_catch = true
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = off
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = off
ij_java_assignment_wrap = off
ij_java_binary_operation_sign_on_next_line = false
ij_java_binary_operation_wrap = off
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 0
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 1
ij_java_blank_lines_around_method = 1
ij_java_blank_lines_around_method_in_interface = 1
ij_java_blank_lines_before_class_end = 0
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 0
ij_java_block_brace_style = end_of_line
ij_java_block_comment_add_space = false
ij_java_block_comment_at_first_column = true
ij_java_builder_methods = none
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = off
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = false
ij_java_class_annotation_wrap = split_into_lines
ij_java_class_brace_style = end_of_line
ij_java_class_count_to_use_import_on_demand = 99
ij_java_class_names_in_javadoc = 1
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
ij_java_do_while_brace_force = never
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = true
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = false
ij_java_enum_constants_wrap = off
ij_java_extends_keyword_wrap = off
ij_java_extends_list_wrap = off
ij_java_field_annotation_wrap = split_into_lines
ij_java_finally_on_new_line = false
ij_java_for_brace_force = never
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = off
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = never
ij_java_imports_layout = $android.**,$androidx.**,$com.**,$junit.**,$net.**,$org.**,$java.**,$javax.**,$*,|,android.**,|,androidx.**,|,com.**,|,junit.**,|,net.**,|,org.**,|,java.**,|,javax.**,|,*,|
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 2
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 2
ij_java_keep_blank_lines_in_declarations = 2
ij_java_keep_builder_methods_indents = false
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = false
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = false
ij_java_keep_simple_lambdas_in_one_line = false
ij_java_keep_simple_methods_in_one_line = false
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_add_space_on_reformat = false
ij_java_line_comment_at_first_column = true
ij_java_method_annotation_wrap = split_into_lines
ij_java_method_brace_style = end_of_line
ij_java_method_call_chain_wrap = off
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = off
ij_java_modifier_list_wrap = false
ij_java_multi_catch_types_wrap = normal
ij_java_names_count_to_use_import_on_demand = 99
ij_java_new_line_after_lparen_in_annotation = false
ij_java_new_line_after_lparen_in_record_header = false
ij_java_parameter_annotation_wrap = off
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_record_components_wrap = normal
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = off
ij_java_rparen_on_new_line_in_annotation = false
ij_java_rparen_on_new_line_in_record_header = false
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = false
ij_java_space_before_catch_keyword = true
ij_java_space_before_catch_left_brace = true
ij_java_space_before_catch_parentheses = true
ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
ij_java_space_before_finally_keyword = true
ij_java_space_before_finally_left_brace = true
ij_java_space_before_for_left_brace = true
ij_java_space_before_for_parentheses = true
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = true
ij_java_space_before_if_parentheses = true
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = true
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = true
ij_java_space_before_switch_parentheses = true
ij_java_space_before_synchronized_left_brace = true
ij_java_space_before_synchronized_parentheses = true
ij_java_space_before_try_left_brace = true
ij_java_space_before_try_parentheses = true
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = true
ij_java_space_before_while_left_brace = true
ij_java_space_before_while_parentheses = true
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
ij_java_spaces_around_annotation_eq = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
ij_java_spaces_around_lambda_arrow = true
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = true
ij_java_spaces_around_relational_operators = true
ij_java_spaces_around_shift_operators = true
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = off
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = off
ij_java_throws_list_wrap = off
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = off
ij_java_visibility = public
ij_java_while_brace_force = never
ij_java_while_on_new_line = false
ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[.editorconfig]
ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false
ij_editorconfig_space_after_comma = true
ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
ij_continuation_indent_size = 4
ij_xml_align_attributes = false
ij_xml_align_text = false
ij_xml_attribute_wrap = normal
ij_xml_block_comment_add_space = false
ij_xml_block_comment_at_first_column = true
ij_xml_keep_blank_lines = 2
ij_xml_keep_indents_on_empty_lines = false
ij_xml_keep_line_breaks = false
ij_xml_keep_line_breaks_in_text = true
ij_xml_keep_whitespaces = false
ij_xml_keep_whitespaces_around_cdata = preserve
ij_xml_keep_whitespaces_inside_cdata = false
ij_xml_line_comment_at_first_column = true
ij_xml_space_after_tag_name = false
ij_xml_space_around_equals_in_attribute = false
ij_xml_space_inside_empty_tag = true
ij_xml_text_wrap = normal
ij_xml_use_custom_settings = true
[{*.gant,*.groovy,*.gy}]
ij_groovy_align_group_field_declarations = false
ij_groovy_align_multiline_array_initializer_expression = false
ij_groovy_align_multiline_assignment = false
ij_groovy_align_multiline_binary_operation = false
ij_groovy_align_multiline_chained_methods = false
ij_groovy_align_multiline_extends_list = false
ij_groovy_align_multiline_for = true
ij_groovy_align_multiline_list_or_map = true
ij_groovy_align_multiline_method_parentheses = false
ij_groovy_align_multiline_parameters = true
ij_groovy_align_multiline_parameters_in_calls = false
ij_groovy_align_multiline_resources = true
ij_groovy_align_multiline_ternary_operation = false
ij_groovy_align_multiline_throws_list = false
ij_groovy_align_named_args_in_map = true
ij_groovy_align_throws_keyword = false
ij_groovy_array_initializer_new_line_after_left_brace = false
ij_groovy_array_initializer_right_brace_on_new_line = false
ij_groovy_array_initializer_wrap = off
ij_groovy_assert_statement_wrap = off
ij_groovy_assignment_wrap = off
ij_groovy_binary_operation_wrap = off
ij_groovy_blank_lines_after_class_header = 0
ij_groovy_blank_lines_after_imports = 1
ij_groovy_blank_lines_after_package = 1
ij_groovy_blank_lines_around_class = 1
ij_groovy_blank_lines_around_field = 0
ij_groovy_blank_lines_around_field_in_interface = 0
ij_groovy_blank_lines_around_method = 1
ij_groovy_blank_lines_around_method_in_interface = 1
ij_groovy_blank_lines_before_imports = 1
ij_groovy_blank_lines_before_method_body = 0
ij_groovy_blank_lines_before_package = 0
ij_groovy_block_brace_style = end_of_line
ij_groovy_block_comment_add_space = false
ij_groovy_block_comment_at_first_column = true
ij_groovy_call_parameters_new_line_after_left_paren = false
ij_groovy_call_parameters_right_paren_on_new_line = false
ij_groovy_call_parameters_wrap = off
ij_groovy_catch_on_new_line = false
ij_groovy_class_annotation_wrap = split_into_lines
ij_groovy_class_brace_style = end_of_line
ij_groovy_class_count_to_use_import_on_demand = 5
ij_groovy_do_while_brace_force = never
ij_groovy_else_on_new_line = false
ij_groovy_enable_groovydoc_formatting = true
ij_groovy_enum_constants_wrap = off
ij_groovy_extends_keyword_wrap = off
ij_groovy_extends_list_wrap = off
ij_groovy_field_annotation_wrap = split_into_lines
ij_groovy_finally_on_new_line = false
ij_groovy_for_brace_force = never
ij_groovy_for_statement_new_line_after_left_paren = false
ij_groovy_for_statement_right_paren_on_new_line = false
ij_groovy_for_statement_wrap = off
ij_groovy_if_brace_force = never
ij_groovy_import_annotation_wrap = 2
ij_groovy_imports_layout = *,|,javax.**,java.**,|,$*
ij_groovy_indent_case_from_switch = true
ij_groovy_indent_label_blocks = true
ij_groovy_insert_inner_class_imports = false
ij_groovy_keep_blank_lines_before_right_brace = 2
ij_groovy_keep_blank_lines_in_code = 2
ij_groovy_keep_blank_lines_in_declarations = 2
ij_groovy_keep_control_statement_in_one_line = true
ij_groovy_keep_first_column_comment = true
ij_groovy_keep_indents_on_empty_lines = false
ij_groovy_keep_line_breaks = true
ij_groovy_keep_multiple_expressions_in_one_line = false
ij_groovy_keep_simple_blocks_in_one_line = false
ij_groovy_keep_simple_classes_in_one_line = true
ij_groovy_keep_simple_lambdas_in_one_line = true
ij_groovy_keep_simple_methods_in_one_line = true
ij_groovy_label_indent_absolute = false
ij_groovy_label_indent_size = 0
ij_groovy_lambda_brace_style = end_of_line
ij_groovy_layout_static_imports_separately = true
ij_groovy_line_comment_add_space = false
ij_groovy_line_comment_add_space_on_reformat = false
ij_groovy_line_comment_at_first_column = true
ij_groovy_method_annotation_wrap = split_into_lines
ij_groovy_method_brace_style = end_of_line
ij_groovy_method_call_chain_wrap = off
ij_groovy_method_parameters_new_line_after_left_paren = false
ij_groovy_method_parameters_right_paren_on_new_line = false
ij_groovy_method_parameters_wrap = off
ij_groovy_modifier_list_wrap = false
ij_groovy_names_count_to_use_import_on_demand = 3
ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
ij_groovy_parameter_annotation_wrap = off
ij_groovy_parentheses_expression_new_line_after_left_paren = false
ij_groovy_parentheses_expression_right_paren_on_new_line = false
ij_groovy_prefer_parameters_wrap = false
ij_groovy_resource_list_new_line_after_left_paren = false
ij_groovy_resource_list_right_paren_on_new_line = false
ij_groovy_resource_list_wrap = off
ij_groovy_space_after_assert_separator = true
ij_groovy_space_after_colon = true
ij_groovy_space_after_comma = true
ij_groovy_space_after_comma_in_type_arguments = true
ij_groovy_space_after_for_semicolon = true
ij_groovy_space_after_quest = true
ij_groovy_space_after_type_cast = true
ij_groovy_space_before_annotation_parameter_list = false
ij_groovy_space_before_array_initializer_left_brace = false
ij_groovy_space_before_assert_separator = false
ij_groovy_space_before_catch_keyword = true
ij_groovy_space_before_catch_left_brace = true
ij_groovy_space_before_catch_parentheses = true
ij_groovy_space_before_class_left_brace = true
ij_groovy_space_before_closure_left_brace = true
ij_groovy_space_before_colon = true
ij_groovy_space_before_comma = false
ij_groovy_space_before_do_left_brace = true
ij_groovy_space_before_else_keyword = true
ij_groovy_space_before_else_left_brace = true
ij_groovy_space_before_finally_keyword = true
ij_groovy_space_before_finally_left_brace = true
ij_groovy_space_before_for_left_brace = true
ij_groovy_space_before_for_parentheses = true
ij_groovy_space_before_for_semicolon = false
ij_groovy_space_before_if_left_brace = true
ij_groovy_space_before_if_parentheses = true
ij_groovy_space_before_method_call_parentheses = false
ij_groovy_space_before_method_left_brace = true
ij_groovy_space_before_method_parentheses = false
ij_groovy_space_before_quest = true
ij_groovy_space_before_record_parentheses = false
ij_groovy_space_before_switch_left_brace = true
ij_groovy_space_before_switch_parentheses = true
ij_groovy_space_before_synchronized_left_brace = true
ij_groovy_space_before_synchronized_parentheses = true
ij_groovy_space_before_try_left_brace = true
ij_groovy_space_before_try_parentheses = true
ij_groovy_space_before_while_keyword = true
ij_groovy_space_before_while_left_brace = true
ij_groovy_space_before_while_parentheses = true
ij_groovy_space_in_named_argument = true
ij_groovy_space_in_named_argument_before_colon = false
ij_groovy_space_within_empty_array_initializer_braces = false
ij_groovy_space_within_empty_method_call_parentheses = false
ij_groovy_spaces_around_additive_operators = true
ij_groovy_spaces_around_assignment_operators = true
ij_groovy_spaces_around_bitwise_operators = true
ij_groovy_spaces_around_equality_operators = true
ij_groovy_spaces_around_lambda_arrow = true
ij_groovy_spaces_around_logical_operators = true
ij_groovy_spaces_around_multiplicative_operators = true
ij_groovy_spaces_around_regex_operators = true
ij_groovy_spaces_around_relational_operators = true
ij_groovy_spaces_around_shift_operators = true
ij_groovy_spaces_within_annotation_parentheses = false
ij_groovy_spaces_within_array_initializer_braces = false
ij_groovy_spaces_within_braces = true
ij_groovy_spaces_within_brackets = false
ij_groovy_spaces_within_cast_parentheses = false
ij_groovy_spaces_within_catch_parentheses = false
ij_groovy_spaces_within_for_parentheses = false
ij_groovy_spaces_within_gstring_injection_braces = false
ij_groovy_spaces_within_if_parentheses = false
ij_groovy_spaces_within_list_or_map = false
ij_groovy_spaces_within_method_call_parentheses = false
ij_groovy_spaces_within_method_parentheses = false
ij_groovy_spaces_within_parentheses = false
ij_groovy_spaces_within_switch_parentheses = false
ij_groovy_spaces_within_synchronized_parentheses = false
ij_groovy_spaces_within_try_parentheses = false
ij_groovy_spaces_within_tuple_expression = false
ij_groovy_spaces_within_while_parentheses = false
ij_groovy_special_else_if_treatment = true
ij_groovy_ternary_operation_wrap = off
ij_groovy_throws_keyword_wrap = off
ij_groovy_throws_list_wrap = off
ij_groovy_use_flying_geese_braces = false
ij_groovy_use_fq_class_names = false
ij_groovy_use_fq_class_names_in_javadoc = true
ij_groovy_use_relative_indents = false
ij_groovy_use_single_class_imports = true
ij_groovy_variable_annotation_wrap = off
ij_groovy_while_brace_force = never
ij_groovy_while_on_new_line = false
ij_groovy_wrap_chain_calls_after_dot = false
ij_groovy_wrap_long_lines = false
[{*.kt,*.kts,*.main.kts}]
ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false
ij_kotlin_align_multiline_extends_list = false
ij_kotlin_align_multiline_method_parentheses = false
ij_kotlin_align_multiline_parameters = true
ij_kotlin_align_multiline_parameters_in_calls = false
ij_kotlin_allow_trailing_comma = false
ij_kotlin_allow_trailing_comma_on_call_site = false
ij_kotlin_assignment_wrap = normal
ij_kotlin_blank_lines_after_class_header = 0
ij_kotlin_blank_lines_around_block_when_branches = 0
ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
ij_kotlin_block_comment_add_space = false
ij_kotlin_block_comment_at_first_column = true
ij_kotlin_call_parameters_new_line_after_left_paren = true
ij_kotlin_call_parameters_right_paren_on_new_line = true
ij_kotlin_call_parameters_wrap = on_every_item
ij_kotlin_catch_on_new_line = false
ij_kotlin_class_annotation_wrap = split_into_lines
ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL
ij_kotlin_continuation_indent_for_chained_calls = false
ij_kotlin_continuation_indent_for_expression_bodies = false
ij_kotlin_continuation_indent_in_argument_lists = false
ij_kotlin_continuation_indent_in_elvis = false
ij_kotlin_continuation_indent_in_if_conditions = false
ij_kotlin_continuation_indent_in_parameter_lists = false
ij_kotlin_continuation_indent_in_supertype_lists = false
ij_kotlin_else_on_new_line = false
ij_kotlin_enum_constants_wrap = off
ij_kotlin_extends_list_wrap = normal
ij_kotlin_field_annotation_wrap = split_into_lines
ij_kotlin_finally_on_new_line = false
ij_kotlin_if_rparen_on_new_line = true
ij_kotlin_import_nested_classes = false
ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
ij_kotlin_keep_blank_lines_before_right_brace = 2
ij_kotlin_keep_blank_lines_in_code = 2
ij_kotlin_keep_blank_lines_in_declarations = 2
ij_kotlin_keep_first_column_comment = true
ij_kotlin_keep_indents_on_empty_lines = false
ij_kotlin_keep_line_breaks = true
ij_kotlin_lbrace_on_next_line = false
ij_kotlin_line_comment_add_space = false
ij_kotlin_line_comment_add_space_on_reformat = false
ij_kotlin_line_comment_at_first_column = true
ij_kotlin_method_annotation_wrap = split_into_lines
ij_kotlin_method_call_chain_wrap = normal
ij_kotlin_method_parameters_new_line_after_left_paren = true
ij_kotlin_method_parameters_right_paren_on_new_line = true
ij_kotlin_method_parameters_wrap = on_every_item
ij_kotlin_name_count_to_use_star_import = 5
ij_kotlin_name_count_to_use_star_import_for_members = 3
ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.**
ij_kotlin_parameter_annotation_wrap = off
ij_kotlin_space_after_comma = true
ij_kotlin_space_after_extend_colon = true
ij_kotlin_space_after_type_colon = true
ij_kotlin_space_before_catch_parentheses = true
ij_kotlin_space_before_comma = false
ij_kotlin_space_before_extend_colon = true
ij_kotlin_space_before_for_parentheses = true
ij_kotlin_space_before_if_parentheses = true
ij_kotlin_space_before_lambda_arrow = true
ij_kotlin_space_before_type_colon = false
ij_kotlin_space_before_when_parentheses = true
ij_kotlin_space_before_while_parentheses = true
ij_kotlin_spaces_around_additive_operators = true
ij_kotlin_spaces_around_assignment_operators = true
ij_kotlin_spaces_around_equality_operators = true
ij_kotlin_spaces_around_function_type_arrow = true
ij_kotlin_spaces_around_logical_operators = true
ij_kotlin_spaces_around_multiplicative_operators = true
ij_kotlin_spaces_around_range = false
ij_kotlin_spaces_around_relational_operators = true
ij_kotlin_spaces_around_unary_operator = false
ij_kotlin_spaces_around_when_arrow = true
ij_kotlin_use_custom_formatting_for_modifiers = true
ij_kotlin_variable_annotation_wrap = off
ij_kotlin_while_on_new_line = false
ij_kotlin_wrap_elvis_expressions = 1
ij_kotlin_wrap_expression_body_functions = 1
ij_kotlin_wrap_first_method_in_call_chain = false

View File

@ -38,7 +38,6 @@ send_sonar_report:
dependencies: [] #禁止传递来的artifact
script:
- group=`echo $CI_PROJECT_PATH | sed 's#/#-#g'`
- docker login -u "${HARBOR_REGISTRY_USERNAME}" -p "${HARBOR_REGISTRY_PASSWORD}" "${HARBOR_REGISTRY}"
- docker run -e PROJECTKEY=$group -e EMAIL=$GITLAB_USER_EMAIL --name send-email --rm hub.shanqu.cc/platform/send-sonar-report:latest
only:
- dev

9
.gitmodules vendored
View File

@ -2,6 +2,9 @@
path = libraries/LGLibrary
url = git@git.shanqu.cc:android/common-library.git
branch = master
[submodule "assistant_flutter"]
path = assistant_flutter
url = git@git.shanqu.cc:halo/android/flutter-module.git
[submodule "vspace-bridge"]
path = vspace-bridge
url = git@git.shanqu.cc:cwzs/android/vspace-bridge.git
[submodule "module_common/src/debug/assets/assistant-android-mock"]
path = module_common/src/debug/assets/assistant-android-mock
url = git@git.shanqu.cc:halo/android/assistant-android-mock.git

View File

@ -12,12 +12,13 @@
2. 尽量使 View 在被销毁之后仍能恢复状态,处理方式可参考 [保存界面状态](https://developer.android.com/topic/libraries/architecture/saving-states)
3. 尽量参考原有文件结构及命名规范,即以 大模块 - 小模块 的形式生成包关系
4. 遵循最小改动原则,在提交代码前务必先检查变动的代码,尽量以可控的变动规模来构成一个 commit ,以便日后追踪问题
5. 代码规范可参考 [AOSP Java 风格](https://source.android.com/setup/contribute/code-style)
6. 尽量使用 Kotlin 来写新文件
7. 尽量不要使用 DataBinding
8. Commit 前请确保不带入非项目必须文件,可手动修改 [.gitignore](https://stackoverflow.com/questions/8527597/how-do-i-ignore-files-in-a-directory-in-git) 文件忽略
9. 优先使用 ViewBinding 获取 View 对象
10. No AsyncTask!
5. Commit message 提交规范可参考 [Conventional Commits](https://www.conventionalcommits.org/zh-hans/v1.0.0/)
6. 代码规范可参考 [AOSP Java 风格](https://source.android.com/setup/contribute/code-style)
7. 尽量使用 Kotlin 来写新文件
8. 不要使用 DataBinding
9. Commit 前请确保不带入非项目必须文件,可手动修改 [.gitignore](https://stackoverflow.com/questions/8527597/how-do-i-ignore-files-in-a-directory-in-git) 文件忽略
10. 优先使用 ViewBinding 获取 View 对象
11. No AsyncTask!
### 公用部分

View File

@ -43,21 +43,14 @@ android {
}
defaultConfig {
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex: 'com.gh.EventBusIndex']
}
}
ndk {
// 如果不添加 `arm64` 调用系统的 PackageManager 的方法读取安装包信息的时候会出现 native 层闪退,草
// 加了 `arm64` 以后部分 5.0 的设备会报用错 so 的问题,
// couldn't find DSO to load: libimagepipeline.so caused by: dlopen failed: "/data/data/com.gh.gamecenter/lib-main/libimagepipeline.so" is 64-bit instead of 32-bit result: 0
// 以 OPPO R7PLUS 为例,明明设备是骁龙 615ARMv8-64 bit 的设备却不支持 arm64 的 abi限制了只使用 java 后还是报错,只有 5.05.1 设备无法复现 : (
// 惊了
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
// x86 本来是为了模拟器用户使用 RenderScript 用的,但是其实用到 RenderScript 的人本来就不多 (一天不到 100),用模拟器的人就更少了
// 加了 x86 反而会导致用户没法使用微博登录,因为微博没有提供 x86 的 SO ...
// 还会增大 APK 体积,所以还是去掉吧。数据可见 https://sentry.shanqu.cc/organizations/lightgame/issues/144232/?project=22
abiFilters "armeabi-v7a", "arm64-v8a"
}
renderscriptTargetApi 18
@ -79,17 +72,11 @@ android {
*/
buildConfigField "String", "API_HOST", "\"${API_HOST}\""
buildConfigField "String", "NEW_API_HOST", "\"${NEW_API_HOST}\""
buildConfigField "String", "VAPI_HOST", "\"${VAPI_HOST}\""
buildConfigField "String", "WECHAT_APPID", "\"${WECHAT_APPID}\""
buildConfigField "String", "WECHAT_SECRET", "\"${WECHAT_SECRET}\""
buildConfigField "String", "TENCENT_APPID", "\"${TENCENT_APPID}\""
buildConfigField "String", "WEIBO_APPKEY", "\"${WEIBO_APPKEY}\""
buildConfigField "String", "QUICK_LOGIN_APPID", "\"${QUICK_LOGIN_APPID}\""
buildConfigField "String", "QUICK_LOGIN_APPKEY", "\"${QUICK_LOGIN_APPKEY}\""
/**
* Build Time 供区分 jenkins 打包时间用
*/
buildConfigField "long", "BUILD_TIME", "0"
}
// gradle 2.2以上默认同时启用v1和v2优先用于Android N
@ -104,6 +91,12 @@ android {
}
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.name)
}
}
buildTypes {
debug {
debuggable true
@ -134,7 +127,7 @@ android {
variantFilter { variant ->
def names = variant.flavors*.name
def isDebugType = variant.buildType.name == "debug"
if ((names.contains("tea") || name.contains("gdt")) && isDebugType) {
if ((names.contains("tea")) && isDebugType) {
setIgnore(true)
}
}
@ -143,17 +136,14 @@ android {
sourceSets {
publish {
java.srcDirs = ['src/main/java']
java.srcDirs = ['src/main/java', "src/default/java"]
}
internal {
java.srcDirs = ['src/main/java']
java.srcDirs = ['src/main/java', "src/default/java"]
}
tea {
java.srcDirs = ['src/main/java', 'src/tea/java']
}
gdt {
java.srcDirs = ['src/main/java', 'src/gdt/java']
}
}
productFlavors {
@ -164,14 +154,20 @@ android {
buildConfigField "String", "DEV_API_HOST", "\"${DEV_API_HOST}\""
buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_DEV_API_HOST}\""
buildConfigField "String", "DEV_VAPI_HOST", "\"${DEV_VAPI_HOST}\""
buildConfigField "String", "QUICK_LOGIN_APPID", "\"${DEV_QUICK_LOGIN_APPID}\""
buildConfigField "String", "QUICK_LOGIN_APPKEY", "\"${DEV_QUICK_LOGIN_APPKEY}\""
}
// publish release host˛
// publish release host
publish {
dimension "env"
buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\""
buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\""
buildConfigField "String", "DEV_VAPI_HOST", "\"${VAPI_HOST}\""
buildConfigField "String", "QUICK_LOGIN_APPID", "\"${QUICK_LOGIN_APPID}\""
buildConfigField "String", "QUICK_LOGIN_APPKEY", "\"${QUICK_LOGIN_APPKEY}\""
}
tea {
@ -179,21 +175,12 @@ android {
buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\""
buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\""
buildConfigField "String", "DEV_VAPI_HOST", "\"${VAPI_HOST}\""
buildConfigField "String", "QUICK_LOGIN_APPID", "\"${QUICK_LOGIN_APPID}\""
buildConfigField "String", "QUICK_LOGIN_APPKEY", "\"${QUICK_LOGIN_APPKEY}\""
manifestPlaceholders.put("APPLOG_SCHEME", "rangersapplog.byAx6uYt".toLowerCase())
}
gdt {
dimension "env"
buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\""
buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\""
}
}
lintOptions {
// For flutter release build, see https://github.com/flutter/flutter/issues/58247
checkReleaseBuilds false
}
}
@ -206,88 +193,44 @@ repositories {
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
gdtImplementation fileTree(include: ['*.jar', '*.aar'], dir: 'src/gdt/libs')
teaImplementation fileTree(include: ['*.jar', '*.aar'], dir: 'src/tea/libs')
testImplementation 'junit:junit:4.12'
debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakcanary}"
debugImplementation "com.squareup.okhttp3:logging-interceptor:${okHttp}"
debugImplementation "com.squareup.leakcanary:leakcanary-android-process:${leakcanary}"
// debugImplementation "com.gu.android:toolargetool:${toolargetool}" // 需要使用调试时才启用
debugImplementation "com.github.nichbar:WhatTheStack:${whatTheStack}"
debugImplementation "io.github.didi.dokit:dokitx:${dokit}"
implementation "androidx.core:core-ktx:${core}"
implementation "androidx.fragment:fragment-ktx:${fragment}"
implementation "androidx.multidex:multidex:${multiDex}"
implementation "androidx.appcompat:appcompat:${appCompat}"
implementation "androidx.cardview:cardview:${cardView}"
implementation "androidx.annotation:annotation:${annotation}"
implementation "androidx.constraintlayout:constraintlayout:${constraintLayout}"
implementation "androidx.recyclerview:recyclerview:${recyclerView}"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifeCycle"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifeCycle"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifeCycle"
implementation "androidx.lifecycle:lifecycle-extensions:$lifeCycleExtensions"
implementation "androidx.room:room-runtime:${room}"
implementation "androidx.room:room-rxjava2:${room}"
implementation "androidx.core:core-ktx:${ktx}"
implementation "androidx.viewpager2:viewpager2:${viewpager2}"
implementation "androidx.webkit:webkit:${webkit}"
kapt "androidx.room:room-compiler:${room}"
implementation "com.google.android.material:material:${material}"
implementation "androidx.multidex:multidex:${multiDex}"
implementation "androidx.fragment:fragment-ktx:${fragment}"
implementation "androidx.annotation:annotation:${annotation}"
implementation "androidx.viewpager2:viewpager2:${viewpager2}"
kapt "androidx.room:room-compiler:${room}"
implementation "com.kyleduo.switchbutton:library:${switchButton}"
implementation "com.facebook.fresco:fresco:${fresco}"
implementation "com.facebook.fresco:animated-gif-lite:${fresco}"
implementation "com.facebook.fresco:animated-drawable:${fresco}"
implementation "com.facebook.fresco:animated-webp:${fresco}"
implementation "com.facebook.fresco:webpsupport:${fresco}"
implementation "com.squareup.okhttp3:okhttp:${okHttp}"
implementation "com.leon.channel:helper:${apkChannelPackage}"
implementation "com.squareup.retrofit2:retrofit:${retrofit}"
implementation "com.squareup.retrofit2:converter-gson:${retrofit}" // include gson 2.7
implementation "com.squareup.retrofit2:adapter-rxjava2:${retrofit}"
implementation "com.j256.ormlite:ormlite-android:${ormlite}"
implementation "com.j256.ormlite:ormlite-core:${ormlite}"
implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}"
implementation "org.greenrobot:eventbus:${eventbus}"
kapt "org.greenrobot:eventbus-annotation-processor:${eventbusApt}"
implementation "io.reactivex.rxjava2:rxjava:${rxJava2}"
implementation "io.reactivex.rxjava2:rxandroid:${rxAndroid2}"
implementation "com.jakewharton.rxbinding2:rxbinding:${rxBinding2}"
implementation "com.google.zxing:core:${zxing}"
implementation "com.google.zxing:android-core:${zxing}"
implementation "com.daimajia.swipelayout:library:${swipeLayout}"
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:${pickerView}"
implementation "com.scwang.smartrefresh:SmartRefreshLayout:${smartRefreshLayout}"
implementation "net.cachapa.expandablelayout:expandablelayout:${expandableLayout}"
// 用于比较 versionName 是大于小于或等于
implementation "com.g00fy2:versioncompare:${versioncompare}"
implementation "top.zibin:Luban:${luban}"
implementation "com.squareup.picasso:picasso:${picasso}"
// for video streaming
implementation("com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-java:$gsyVideo", {
exclude module: "gsyvideoplayer-androidvideocache"
@ -295,59 +238,40 @@ dependencies {
})
implementation "com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-exo_player2:$gsyVideo"
implementation "androidx.work:work-runtime:${workManager}"
// implementation "androidx.work:work-runtime:${workManager}"
implementation "com.llew.huawei:verifier:${verifier}"
implementation "com.github.tbruyelle:rxpermissions:${rxPermissions}"
implementation "com.lg:skeleton:${skeleton}"
implementation "com.tencent.mm.opensdk:wechat-sdk-android-without-mta:${mta}"
implementation "com.github.nichbar:AndroidRomChecker:${romChecker}"
debugImplementation "com.github.nichbar.chucker:library:${chucker}"
releaseImplementation "com.github.nichbar.chucker:library-no-op:${chucker}"
teaImplementation "com.bytedance.applog:RangersAppLog-Lite-cn:${bytedanceApplog}"
implementation "com.aliyun.dpa:oss-android-sdk:${oss}"
implementation "com.airbnb.android:lottie:${lottie}"
implementation "net.lingala.zip4j:zip4j:${zip4j}"
implementation "io.sentry:sentry-android:4.3.0"
implementation("com.github.piasy:BigImageViewer:${bigImageViewer}", {
exclude group: 'com.squareup.okhttp3'
exclude group: 'androidx.swiperefreshlayout'
exclude group: 'com.github.bumptech.glide'
exclude group: 'com.facebook.fresco'
})
implementation "com.github.PhilJay:MPAndroidChart:${chart}"
implementation "com.lahm.library:easy-protector-release:${easyProtector}"
implementation "com.github.hsiafan:apk-parser:${apkParser}"
implementation "org.nanohttpd:nanohttpd:${nanohttpd}"
implementation "com.aliyun.openservices:aliyun-log-android-sdk:${aliyunLog}"
implementation "com.lg:easyfloat:${easyFloat}"
implementation "io.github.florent37:shapeofview:${shapeOfView}"
implementation "io.github.sinaweibosdk:core:${weiboSDK}"
implementation "com.lg:apksig:${apksig}"
implementation "com.lg:gid:${gid}"
implementation "com.louiscad.splitties:splitties-fun-pack-android-base-with-views-dsl:${splitties}"
compileOnly "com.github.axen1314.lancet:lancet-base:${lancet_version}"
kapt "com.alibaba:arouter-compiler:$arouterVersion"
implementation project(':libraries:LGLibrary')
implementation project(':libraries:QQShare')
implementation project(':libraries:Matisse')
implementation project(':vspace-bridge:vspace')
implementation (project(':module_common')) {
exclude group: 'androidx.swiperefreshlayout'
}
implementation(project(':module_login')) {
exclude group: 'androidx.swiperefreshlayout'
}
// 默认不接入光能模块,提高编译速度
// debugImplementation(project(':module_energy')) {
// exclude group: 'androidx.swiperefreshlayout'
// }
}
File propFile = file('sign.properties')
if (propFile.exists()) {
@ -438,36 +362,14 @@ andResGuard {
"R.drawable.bg_notification_reserve_game_style_2",
"R.drawable.bg_notification_video_style_1",
"R.drawable.bg_notification_video_style_2",
"R.drawable.ic_search_no_1",
"R.drawable.ic_search_no_2",
"R.drawable.ic_search_no_3",
"R.drawable.ic_search_no_4",
"R.drawable.ic_search_no_5",
"R.drawable.ic_search_no_6",
"R.drawable.ic_search_no_7",
"R.drawable.ic_search_no_8",
"R.drawable.ic_search_no_9",
"R.drawable.ic_search_no_10",
"R.drawable.ic_search_no_11",
"R.drawable.ic_search_no_12",
"R.drawable.ic_search_no_13",
"R.drawable.ic_search_no_14",
"R.drawable.ic_search_no_15",
"R.drawable.ic_search_no_16",
"R.drawable.ic_search_no_17",
"R.drawable.ic_search_no_18",
"R.drawable.ic_search_no_19",
"R.drawable.ic_search_no_20",
"R.drawable.ic_recommend_activity",
"R.drawable.ic_recommend_discount",
"R.drawable.ic_recommend_function",
"R.drawable.ic_recommend_gift",
"R.drawable.ic_recommend_role",
"R.drawable.login_btn_bg",
"R.drawable.ic_quick_login_check",
"R.drawable.ic_quick_login_uncheck",
"R.anim.anim_auth_in",
"R.anim.anim_auth_out",
"R.drawable.download_button_normal_style",
"R.drawable.ic_selector_selected",
"R.drawable.ic_selector_default",
"R.id.download_speed",
"R.id.download_percentage",
"R.id.comment",
@ -478,6 +380,9 @@ andResGuard {
"R.id.bottomShareTv",
"R.id.recommendStarPref",
"R.id.recommendStar",
"R.id.iv_vmode_badge",
"R.id.tv_vmode",
"R.id.iv_vmode",
"R.drawable.help_search_delete",
"R.drawable.suggest_type_normal",
"R.drawable.suggest_type_crash",

Binary file not shown.

View File

@ -1,271 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Android\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#--------- remove logs start ----------------
-assumenosideeffects class com.lightgame.config.CommonDebug {
private static String getLogTag(...);
private static String getMethodName();
public static void logMethodName(...);
public static void logParams(...);
public static void logFields(...);
public static void logMethodWithParams(...);
}
#-assumenosideeffects class com.lightgame.config.CommonDebug {*;}
#-dontoptimize
#--------- remove logs end ----------------
-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod
-dontwarn InnerClasses
# OrmLite uses reflection
-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }
-dontwarn com.j256.**
#okhttp3
-dontwarn com.squareup.okhttp3.**
-dontwarn okio.**
-keep class com.squareup.okhttp3.** { *;}
# stetho
-keep class com.facebook.stetho.** { *; }
-dontwarn com.facebook.stetho.**
# Retrofit 2.2
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions
# Retrofit 2.X
## https://square.github.io/retrofit/ ##
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
# rxjava
-keep class rx.schedulers.Schedulers {
public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
public <methods>;
}
-keep class rx.schedulers.TestScheduler {
public <methods>;
}
-keep class rx.schedulers.Schedulers {
public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
long producerNode;
long consumerNode;
}
-dontwarn rx.internal.util.**
## AutoScrollViewPager
-keep class cn.trinea.android.** { *; }
-keepclassmembers class cn.trinea.android.** { *; }
-dontwarn cn.trinea.android.**
## butterknife
# Retain generated class which implement Unbinder.
#-keep public class * implements butterknife.Unbinder { public <init>(**, android.view.View); }
#
## Prevent obfuscation of types which use ButterKnife annotations since the simple name
## is used to reflectively look up the generated ViewBinding.
#-keep class butterknife.*
#-keepclasseswithmembernames class * { @butterknife.* <methods>; }
#-keepclasseswithmembernames class * { @butterknife.* <fields>; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepnames class * { @butterknife.InjectView *;}
-dontwarn butterknife.Views$InjectViewProcessor
-dontwarn com.gc.materialdesign.views.**
# eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
# weiboSdk
-keep class com.sina.weibo.sdk.** { *; }
-dontwarn android.webkit.WebView
-dontwarn android.webkit.WebViewClient
# app models
-keep class com.gh.common.view.** {*;}
-keep class com.gh.gamecenter.db.info.** {*;}
-keep class com.gh.gamecenter.entity.** {*;}
-keep class com.gh.gamecenter.qa.entity.** {*;}
-keep class com.gh.gamecenter.retrofit.** {*;}
-keep class com.gh.gamecenter.eventbus.** {*;}
-keep class com.gh.gamecenter.video.detail.** {*;}
-keep class * extends rx.Subscriber
#---------------------------------webview------------------------------------
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String);
}
#----------------------------------------------------------------------------
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers enum * { *; }
##---------------End: proguard configuration for Gson ----------
# ------ bugly ---------
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
# easypermission
-keepclassmembers class * {
@pub.devrel.easypermissions.AfterPermissionGranted <methods>;
}
# 重命名文件为SourceFile再配合mapping符号表可以拿到真实的类名
-renamesourcefileattribute SourceFile
# 保留源文件行号
-keepattributes SourceFile,LineNumberTable
-ignorewarnings
-keep @androidx.annotation.Keep class *
-keepclassmembers class ** {
@androidx.annotation.Keep *;
}
-keep class com.gh.loghub.** { *; }
### greenDAO 3
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
-keep class org.greenrobot.greendao.** { *; }
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
-dontwarn rx.**
-dontwarn org.greenrobot.greendao.rx.**
-dontwarn org.greenrobot.greendao.**
### fastJson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
-keepattributes Signature
-keepattributes Annotation
### 广点通
-dontwarn com.qq.gdt.action.**
-keep class com.qq.gdt.action.** {*;}
### AndroidX
-keep class androidx.core.app.CoreComponentFactory { *; }
#阿里云上传
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
#视频相关
-keep class com.shuyu.gsyvideoplayer.video.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.video.**
-keep class com.shuyu.gsyvideoplayer.video.base.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.video.base.**
-keep class com.shuyu.gsyvideoplayer.utils.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.utils.**
-keep class tv.danmaku.ijk.** { *; }
-dontwarn tv.danmaku.ijk.**
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
#穿山甲
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.pgl.sys.ces.* {*;}
-keep class com.gyf.immersionbar.* {*;}
-dontwarn com.gyf.immersionbar.**
-keep class com.taobao.securityjni.**{*;}
-keep class com.taobao.wireless.security.**{*;}
-keep class com.ut.secbody.**{*;}
-keep class com.taobao.dp.**{*;}
-keep class com.alibaba.wireless.security.**{*;}
-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}
-keep class com.gh.gamecenter.GdtHelper { *; }
-keep class com.gh.gamecenter.TeaHelper { *; }

View File

@ -1,26 +1,6 @@
#--------- remove logs start ----------------
-assumenosideeffects class com.lightgame.config.CommonDebug {
private static String getLogTag(...);
private static String getMethodName();
public static void logMethodName(...);
public static void logParams(...);
public static void logFields(...);
public static void logMethodWithParams(...);
}
-assumenosideeffects class com.lightgame.utils.Utils {
public static void log(...);
}
#--------- remove logs end ----------------
#--------- remove useless mtahelper class --------
-assumenosideeffects class com.gh.common.util.MtaHelper {
public static void onEvent(...);
public static void onEventWithTime(...);
public static void onEventWithBasicDeviceInfo(...);
}
#--------- remove useless mta class end ----
# inline getter method
-allowaccessmodification
# TODO Dicard sourceFile in final release build but remain in internal build.
-renamesourcefileattribute SourceFile
@ -36,31 +16,6 @@
-keepclassmembers interface com.j256.* { *; }
-dontwarn com.j256.**
### AutoScrollViewPager
-keep class cn.trinea.android.* { *; }
-keepclassmembers class cn.trinea.android.* { *; }
-dontwarn cn.trinea.android.**
### eventbus
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
### Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
### weiboSdk
-keep class com.sina.weibo.sdk.** { *; }
-dontwarn android.webkit.WebView
-dontwarn android.webkit.WebViewClient
### wechatSdk
### TODO 这里用 com.tencent.*{*;} 不起效?但其它地方可以?
-keep class com.tencent.**{*;}
### app models
-keep class com.gh.common.view.* {*;}
-keep class com.gh.gamecenter.db.info.* {*;}
@ -71,38 +26,10 @@
-keep class com.gh.gamecenter.video.detail.* {*;}
-keep class com.gh.gamecenter.home.gamecollection.* {*;}
###
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String);
}
### easypermission
-keepclassmembers class * {
@pub.devrel.easypermissions.AfterPermissionGranted <methods>;
}
# TODO What's this ?
-ignorewarnings
### Keep Annotation
-keep @androidx.annotation.Keep class *
-keepclassmembers class * {
@androidx.annotation.Keep *;
}
### 广点通
-dontwarn com.qq.gdt.action.**
-keep class com.qq.gdt.action.* {*;}
### 阿里云上传
-keep class com.alibaba.sdk.android.oss.* { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
### 视频相关
-keep class com.shuyu.gsyvideoplayer.video.* { *; }
-dontwarn com.shuyu.gsyvideoplayer.video.**
@ -120,33 +47,12 @@
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class com.alibaba.sdk.android.*{*;}
-keep class com.ut.*{*;}
-keep class com.ta.*{*;}
### GDT & TEA
-keep class com.gh.gamecenter.GdtHelper { *; }
### TEA
-keep class com.gh.gamecenter.TeaHelper { *; }
### 阿里云日志
-keep class com.aliyun.sls.android.producer.* { *; }
-keep interface com.aliyun.sls.android.producer.* { *; }
### 中国移动一键登录
-dontwarn com.cmic.sso.sdk.**
-keep class com.cmic.sso.sdk.* { *; }
### EasyFloat
-keep class com.lzf.easyfloat.* {*;}
### 避免 WebChromeClient 被混淆
-keepclassmembers class * extends android.webkit.WebChromeClient{
public void openFileChooser(...);
}
### emoji4j
-keep class emoji4j.* {*;}
### dokit
-keep class com.didichuxing.** {*;}

View File

@ -0,0 +1,26 @@
package com.gh.gamecenter.provider
import android.app.Application
import android.text.TextUtils
import com.gh.gamecenter.common.constant.Config
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.utils.PackageFlavorHelper
import com.gh.gamecenter.core.utils.SPUtils
import com.leon.channel.helper.ChannelReaderUtil
class ChannelProviderImp : ChannelProvider {
override fun getChannelStr(application: Application): String {
var channel = ChannelReaderUtil.getChannel(application)
if (channel == null || TextUtils.isEmpty(channel.trim())) {
channel = if (PackageFlavorHelper.IS_TEST_FLAVOR) {
Config.DEFAULT_CHANNEL
} else {
Config.DEFAULT_CHANNEL_FOR_RELEASE
}
}
if (PackageFlavorHelper.IS_TEST_FLAVOR) {
channel = SPUtils.getString(Constants.SP_TEST_FLAVOR_CHANNEL, channel)
}
return channel
}
}

View File

@ -1,77 +0,0 @@
package com.gh.gamecenter
import android.app.Application
import android.text.TextUtils
import android.util.Log
import com.gh.common.util.ToastUtils
import com.lightgame.utils.Utils
import com.qq.gdt.action.GDTAction
import org.json.JSONObject
/**
* 广点通辅助类 [https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/403]
*
* 更换帐号 [https://gitlab.ghzs.com/pm/yunying/issues/893]
*/
object GdtHelper {
const val NETWORK_TYPE = "NETWORK_TYPE"
const val PAGE_TYPE = "PAGE_TYPE"
const val CONTENT_TYPE = "CONTENT_TYPE"
const val CONTENT_ID = "CONTENT_ID"
const val KEYWORD = "KEYWORD"
const val GAME_ID = "GAME_ID"
const val SCORE = "SCORE"
const val PLATFORM = "PLATFORM"
@JvmStatic
fun init(application: Application, channel: String) {
if (shouldUseGdtHelper()) {
if (channel == "GH_728") {
GDTAction.init(application, "1111012969", "9d3d9da5b0948a317c03d08f14d445dc")
} else if (channel == "GH_729") {
GDTAction.init(application, "1111013063", "f53dabf458a356b101d99fc4069eb7f1")
} else if (channel == "GH_765") {
GDTAction.init(application, "1111327925", "588d503f0990f98f9b2394fbb795c570")
} else {
GDTAction.init(application, "1110680399", "f5ddaafbf520d7d7385499232a408d0a")
}
}
Utils.log("init GdtHelper")
}
// fun logAction(type: String) {
// if (shouldUseGdtHelper()) {
// GDTAction.logAction(type)
// Utils.log("GDT", type)
// }
// }
@JvmStatic
fun logAction(type: String, vararg kv: String?) {
try {
val actionParam = JSONObject()
for (i in kv.indices) {
if (i % 2 != 0) {
val key = kv[i - 1]
val value = kv[i]
if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) {
actionParam.put(key, value)
}
}
}
Utils.log("GDT", "$type + [${kv.joinToString(" , ")}]")
GDTAction.logAction(type, actionParam)
} catch (e: Exception) {
e.printStackTrace()
}
}
// TODO 确认开启的渠道条件
private fun shouldUseGdtHelper(): Boolean {
return true
//
// val channel = HaloApp.getInstance().channel
// return !(TextUtils.isEmpty(channel) || channel.contains("GDT".toLowerCase(Locale.CHINA)))
}
}

View File

@ -3,6 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.gh.gamecenter">
<queries>
<package android:name="com.gh.gamecenter" />
</queries>
<!-- 允许应用程序访问网络连接 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许应用程序写入外部存储如SD卡上写文件 -->
@ -13,10 +16,6 @@
<uses-permission android:name="android.permission.ACCESS_WIFI_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.GET_TASKS" />
<!-- 允许访问振动设备 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 允许应用程序改变Wi-Fi连接状态 -->
@ -25,8 +24,11 @@
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 允许应用程序快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- 应用安装相关 -->
<uses-permission android:name="com.android.permission.GET_INSTALLED_APPS" />
<!-- 前台服务权限-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
@ -56,6 +58,14 @@
android:name="android.permission.READ_CONTACTS"
tools:node="remove" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
tools:node="remove" />
<uses-permission
android:name="android.permission.GET_TASKS"
tools:node="remove" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
@ -70,7 +80,6 @@
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:largeHeap="true"
android:networkSecurityConfig="@xml/network_security_config"
android:resizeableActivity="true"
android:theme="@style/AppCompatTheme.APP"
tools:replace="android:name,android:allowBackup"
@ -165,7 +174,8 @@
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.WebActivity" />
android:name="com.gh.gamecenter.WebActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.SingletonWebActivity"
@ -256,11 +266,6 @@
android:name=".category.CategoryListActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.LoginActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.gh.gamecenter.UserInfoActivity"
android:screenOrientation="portrait" />
@ -286,10 +291,6 @@
android:name="com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name=".qa.answer.fold.AnswerFoldActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.answer.edit.AnswerEditActivity"
android:screenOrientation="portrait" />
@ -375,10 +376,6 @@
android:name="com.gh.gamecenter.qa.article.detail.ArticleDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.article.detail.comment.ArticleDetailCommentActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.draft.CommunityDraftWrapperActivity"
android:screenOrientation="portrait" />
@ -512,10 +509,6 @@
android:name=".video.poster.PosterClipActivity"
android:screenOrientation="portrait" />
<activity
android:name=".forum.select.ForumSelectActivity"
android:screenOrientation="portrait" />
<activity
android:name=".forum.detail.ForumDetailActivity"
android:screenOrientation="portrait" />
@ -569,19 +562,6 @@
android:name=".forum.search.ForumOrUserSearchActivity"
android:screenOrientation="portrait" />
<activity
android:name=".energy.EnergyCenterActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
<activity
android:name=".energy.EnergyHouseActivity"
android:screenOrientation="portrait" />
<activity
android:name=".personal.NewPersonalActivity"
android:screenOrientation="portrait" />
<activity
android:name=".qa.questions.draft.QuestionDraftActivity"
android:screenOrientation="portrait" />
@ -650,14 +630,6 @@
android:name=".gamecollection.detail.GameCollectionPosterActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.cmic.sso.sdk.activity.LoginAuthActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Dialog" />
<activity
android:name=".home.skip.PackageSkipActivity"
android:screenOrientation="portrait" />
@ -732,11 +704,34 @@
android:screenOrientation="portrait" />
<activity
android:name="${applicationId}.wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
android:name="com.gh.vspace.VDownloadManagerActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.vspace.VSpaceLoadingActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.qa.subject.CommunitySubjectActivity"
android:screenOrientation="portrait" />
<activity
android:name=".qa.comment.NewCommentDetailActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.gh.gamecenter.mypost.MyPostActivity"
android:screenOrientation="portrait" />
<activity
android:name=".VerifyPhoneActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BbsCertificationActivity"
android:screenOrientation="portrait" />
<!-- <activity-->
<!-- android:name="${applicationId}.douyinapi.DouYinEntryActivity"-->
@ -755,16 +750,22 @@
</provider>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
android:name="com.gh.gamecenter.provider.GhContentProvider"
android:authorities="${applicationId}.provider"
android:enabled="true"
android:exported="true" />
<!-- <provider-->
<!-- android:name="androidx.startup.InitializationProvider"-->
<!-- android:authorities="${applicationId}.androidx-startup"-->
<!-- android:exported="false"-->
<!-- tools:node="merge">-->
<!-- &lt;!&ndash; If you are using androidx.startup to initialize other components &ndash;&gt;-->
<!-- <meta-data-->
<!-- android:name="androidx.work.WorkManagerInitializer"-->
<!-- android:value="androidx.startup"-->
<!-- tools:node="remove" />-->
<!-- </provider>-->
<receiver
android:name="com.gh.gamecenter.receiver.DownloadReceiver"

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"v":"5.9.1","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-关闭","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[87,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[31,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[33,33,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"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":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[6.5,6.5]},{"t":18,"s":[4.5,4.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":40,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,4]},{"t":18,"s":[1.5,6]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":20,"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":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[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":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0.156862750649,0.533333361149,0.878431379795,1]},{"t":18,"s":[1,1,1,1]}],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[8]}],"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"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":37,"st":0,"bm":0}],"markers":[]}

View File

@ -0,0 +1 @@
{"v":"5.9.1","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-关闭","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[87,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[31,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[33,33,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"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":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[6.5,6.5]},{"t":18,"s":[4.5,4.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":40,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,4]},{"t":18,"s":[1.5,6]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"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":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[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":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0.141176477075,0.588235318661,1,1]},{"t":18,"s":[0.933333337307,0.933333337307,0.933333337307,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"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":37,"st":0,"bm":0}],"markers":[]}

View File

@ -1 +0,0 @@
{"v":"5.6.9","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-打开","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[33,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[89,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[87,33,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":[16,16],"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":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,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":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[4.5,4.5]},{"t":18,"s":[6.5,6.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.966666666667,0.966666666667,0.966666666667,0.420000005762],"ix":3},"o":{"a":0,"k":40,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,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":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,6]},{"t":18,"s":[1.5,4]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"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":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"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":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sy":[{"c":{"a":0,"k":[0,0,0,1],"ix":2},"o":{"a":0,"k":5,"ix":3},"a":{"a":0,"k":120,"ix":5},"s":{"a":0,"k":1,"ix":8},"d":{"a":0,"k":0,"ix":6},"ch":{"a":0,"k":100,"ix":7},"bm":{"a":0,"k":5,"ix":1},"no":{"a":0,"k":0,"ix":9},"ty":2,"nm":"内阴影"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0.933332979679,0.933332979679,0.933332979679,1]},{"t":18,"s":[0.141176477075,0.588235318661,1,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"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":37,"st":0,"bm":0}],"markers":[]}

View File

@ -0,0 +1 @@
{"v":"5.9.1","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-打开","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[33,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[89,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[87,33,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"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":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[4.5,4.5]},{"t":18,"s":[6.5,6.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":40,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,6]},{"t":18,"s":[1.5,4]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":20,"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":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"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":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[1,1,1,1]},{"t":18,"s":[0.156862750649,0.533333361149,0.878431379795,1]}],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[8]},{"t":18,"s":[100]}],"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"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":37,"st":0,"bm":0}],"markers":[]}

View File

@ -0,0 +1 @@
{"v":"5.9.1","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-打开","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[33,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[89,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[87,33,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"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":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[4.5,4.5]},{"t":18,"s":[6.5,6.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":40,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,6]},{"t":18,"s":[1.5,4]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"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":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"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":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0.933332979679,0.933332979679,0.933332979679,1]},{"t":18,"s":[0.141176477075,0.588235318661,1,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"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":37,"st":0,"bm":0}],"markers":[]}

View File

@ -280,12 +280,8 @@ RE.replaceAllDfImage = function(imgRuleFlag, gifRuleFlag) {
i--;
} else {
if(img.src.indexOf(".gif") > 0) {
if(gifRuleFlag.indexOf(",default") > 0) {
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
img.src = img.src.split("?")[0] + gifRuleFlag
}
img.src = img.src.split("?")[0] + gifRuleFlag
} else {
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
img.src = img.src.split("?")[0] + imgRuleFlag
}
}
@ -301,7 +297,7 @@ RE.hideShowBigPic = function() {
var img = imgs[i];
var imageClassName = img.className;
if (imageClassName == "image-link" || img.className == "poster") continue;
if(img.src.indexOf(",thumbnail") > 0 && img.src.indexOf(".gif") == -1) {
if (img.src.indexOf(".gif") == -1) {
j++;
}
}
@ -327,7 +323,6 @@ RE.replaceDfImageByUrl = function(imgUrl, imgRuleFlag, gifRuleFlag) {
var imageClassName = img.className;
if (imageClassName == "image-link" || img.className == "poster") continue;
if (img.src.indexOf(imgUrl) != -1) {
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
if(img.src.indexOf(".gif") > 0) {
img.src = img.src.split("?")[0] + gifRuleFlag
} else {

View File

@ -1,134 +0,0 @@
package com.gh.base;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Looper;
import android.preference.PreferenceManager;
import android.util.Log;
import com.gh.common.constant.Config;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.gamecenter.SplashScreenActivity;
import com.lightgame.config.CommonDebug;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.AppManager;
import com.lightgame.utils.Utils;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeoutException;
import io.sentry.Sentry;
public class AppUncaughtHandler implements UncaughtExceptionHandler {
private Context mContext;
public AppUncaughtHandler(Context context) {
// 获取系统默认的UncaughtException处理器
mContext = context;
}
@Override
public void uncaughtException(Thread t, Throwable e) {
if (("FinalizerWatchdogDaemon").equals(t.getName())
&& e instanceof TimeoutException) {
// ignore timeoutException
// detail can be found in this didi tech blog post https://mp.weixin.qq.com/s?__biz=MzU1ODEzNjI2NA==&mid=2247487185&idx=2&sn=cf2d9e10053f625bde0f61d246f14870&source=41#wechat_redirect
} else {
new Thread(() -> {
Looper.prepare();
Utils.toast(mContext.getApplicationContext(), "\"光环助手\"发生错误");
Looper.loop();
});
saveLocalLog(mContext, e);
restart(mContext);
Sentry.captureException(e);
}
}
public static void restart(final Context context) {
// S450 这机器会无限重启循环 : (
if ("S450".equals(Build.MODEL)) return;
// 防止重复奔溃导致助手一直重启20秒内不做处理
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
long curTime = System.currentTimeMillis();
long time = sp.getLong("last_restart_time", 0);
if (curTime - time > 20 * 1000) {
sp.edit().putLong("last_restart_time", curTime).apply();
Intent intent = new Intent(context, SplashScreenActivity.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
// 退出程序并重启
AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, curTime + 3000, restartIntent); // 1秒钟后重启应用
}
//error restart
// System.exit(2);
AppManager.getInstance().finishAllActivity();
}
// 保存log到本地
public static void saveLocalLog(Context context, Throwable ex) {
String errorMsg = Log.getStackTraceString(ex);
Config.setExceptionMsg(errorMsg);
// 保存到本地
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault());
File file = new File(FileUtils.getLogPath(context.getApplicationContext(),
format.format(new Date()) + "_gh_assist" + ".log"));
FileWriter writer = null;
try {
file.createNewFile();
writer = new FileWriter(file);
writer.write(errorMsg);
writer.flush();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 下次应用启动再上报
*
* @param context
* @param throwable
*/
public static void reportException(Context context, Throwable throwable) {
CommonDebug.logMethodWithParams(context, "ERRMSG", throwable);
// 上传错误数据
try {
DataCollectionUtils.uploadError(context, Log.getStackTraceString(throwable));
} catch (Exception e) {
}
DataUtils.onError(context, throwable);
}
}

View File

@ -1,448 +0,0 @@
package com.gh.base;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcel;
import android.os.TransactionTooLargeException;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import com.gh.base.fragment.BaseFragment;
import com.gh.common.constant.Constants;
import com.gh.common.tracker.IBusiness;
import com.gh.common.util.DialogHelper;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.EnvHelper;
import com.gh.common.util.PackageFlavorHelper;
import com.gh.common.util.ExtensionsKt;
import com.gh.common.util.MtaHelper;
import com.gh.common.util.NetworkUtils;
import com.gh.common.util.PackageInstaller;
import com.gh.common.util.QuickLoginHelper;
import com.gh.common.util.RunningUtils;
import com.gh.common.util.SPUtils;
import com.gh.common.util.ShareUtils;
import com.gh.common.util.StringUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.LoginActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SplashScreenActivity;
import com.gh.gamecenter.eventbus.EBShowDialog;
import com.lightgame.BaseAppCompatActivity;
import com.lightgame.download.DownloadEntity;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.Utils;
import com.tencent.tauth.Tencent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONObject;
import java.lang.ref.WeakReference;
import java.util.List;
import kotlin.Pair;
import pub.devrel.easypermissions.EasyPermissions;
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
/**
* 只提供基础的服务(EventBus/ButterKnife/Share/GlobalDialog/Permissions)
* <p>
* 需要工具栏的页面请继承{@link ToolBarActivity}
*/
public abstract class BaseActivity extends BaseAppCompatActivity implements EasyPermissions.PermissionCallbacks, IBusiness {
// global dialog key
public final static String DOWNLOAD_HIJACK = "hijack";
public final static String LOGIN_EXCEPTION = "loginException";
public final static String PLUGGABLE = "plugin";
public final static String SIGNATURE_CONFLICT = "signature_conflict";
public final static int ID_ROOT_INDICATOR = 999;
public final int MAX_BUNDLE_SIZE = 300;
@NonNull
protected String mEntrance;
private boolean mIsExistLogoutDialog;
public long startPageTime = 0;
protected final Handler mBaseHandler = new BaseHandler(this);
protected static class BaseHandler extends Handler {
private final WeakReference<BaseActivity> mActivityWeakReference;
BaseHandler(BaseActivity activity) {
mActivityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
BaseActivity activity = mActivityWeakReference.get();
if (activity != null) activity.handleMessage(msg);
}
}
protected void handleMessage(Message msg) {
}
//接收QQ或者QQ空间分享回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ExtensionsKt.tryCatchInRelease(() -> {
if (requestCode == com.tencent.connect.common.Constants.REQUEST_QQ_SHARE
|| requestCode == com.tencent.connect.common.Constants.REQUEST_QZONE_SHARE) {
Tencent.onActivityResultData(requestCode, resultCode, data, ShareUtils.getInstance(this).QqShareListener);
}
return null;
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (useEventBus()) EventBus.getDefault().register(this);
mEntrance = getIntent().getStringExtra(KEY_ENTRANCE);
if (TextUtils.isEmpty(mEntrance)) {
mEntrance = Constants.ENTRANCE_UNKNOWN;
}
if (BuildConfig.DEBUG) {
Utils.log("ACTIVITY_ENTRANCE -> " + mEntrance);
}
disableAutofill();
if (savedInstanceState != null) {
String xapkUnzipActivity = SPUtils.getString(Constants.SP_XAPK_UNZIP_ACTIVITY);
String xapkUrl = SPUtils.getString(Constants.SP_XAPK_URL);
Utils.log("页面重建了--" + xapkUnzipActivity + "--" + xapkUrl);
if (this.getClass().isAssignableFrom(SplashScreenActivity.class)) {
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "");
SPUtils.setString(Constants.SP_XAPK_URL, "");
return;
}
if (this.getClass().getName().equals(xapkUnzipActivity) && !TextUtils.isEmpty(xapkUrl)) {
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntityByUrl(xapkUrl);
if (downloadEntity != null) {
PackageInstaller.install(this, downloadEntity, false);
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "");
SPUtils.setString(Constants.SP_XAPK_URL, "");
}
}
}
}
@Override
protected void onResume() {
super.onResume();
startPageTime = System.currentTimeMillis();
}
@SuppressWarnings("ConstantConditions")
@Override
public void setContentView(View view) {
if (!(this instanceof SplashScreenActivity) && PackageFlavorHelper.IS_TEST_FLAVOR) {
view = getRootViewWithEnvIndicator(view);
}
super.setContentView(view);
}
@Override
protected void onDestroy() {
if (useEventBus()) EventBus.getDefault().unregister(this);
mBaseHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
public void toast(String msg) {
Utils.toast(this, msg);
}
public void toast(int msg) {
toast(getString(msg));
}
public void showShare(String url,
String icon,
String shareTitle,
String shareSummary,
ShareUtils.ShareEntrance shareEntrance, String id) {
ShareUtils.getInstance(this).showShareWindows(this,
getWindow().getDecorView(),
url,
icon,
shareTitle,
shareSummary,
shareEntrance, id);
if (shareEntrance == ShareUtils.ShareEntrance.game || shareEntrance == ShareUtils.ShareEntrance.plugin) {
MtaHelper.onEvent("内容分享", "内容分享", shareTitle + shareSummary);
} else {
MtaHelper.onEvent("内容分享", "内容分享", shareTitle);
}
}
/**
* 关闭 editText 自动填充帐号 (我们也用不上),开启的时候有小概率出发 TimeoutException
*/
private void disableAutofill() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getWindow().getDecorView().setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
}
}
private View getRootViewWithEnvIndicator(View view) {
RelativeLayout screenRootView = new RelativeLayout(this);
screenRootView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
LinearLayout ll = new LinearLayout(this);
TextView tv = new TextView(this);
String envText = "正式环境";
tv.setBackground(ContextCompat.getDrawable(this, R.color.theme));
if (EnvHelper.isDevEnv()) {
envText = "测试环境";
tv.setBackground(ContextCompat.getDrawable(this, R.color.theme_red));
}
tv.setText(envText);
tv.setGravity(Gravity.CENTER);
tv.setTextColor(Color.WHITE);
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
tv.measure(0, 0);
tv.setAlpha(0.15F);
tv.setId(ID_ROOT_INDICATOR);
int height = tv.getMeasuredHeight();
int width = tv.getMeasuredWidth();
tv.setPadding(DisplayUtils.dip2px(20), 0, DisplayUtils.dip2px(20), 0);
ll.setTranslationX(DisplayUtils.dip2px(20));
ll.setRotation(45);
ll.addView(tv);
ll.setPadding(0, (width - height) / 2, 0, (width - height) / 2);
if (BuildConfig.DEBUG) {
tv.setOnLongClickListener(v -> {
EntranceUtils.saveShortcut(this.getClass().getName(), getIntent().getExtras());
return true;
});
}
screenRootView.addView(view);
screenRootView.addView(ll);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) ll.getLayoutParams();
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
return screenRootView;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(final EBShowDialog showDialog) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)
&& this.getClass().getName().equals(RunningUtils.getTopActivity(this))) {
if (DOWNLOAD_HIJACK.equals(showDialog.getType())) {
DialogUtils.showQqSessionDialog(this);// 建议用户联系客服
} else if (PLUGGABLE.equals(showDialog.getType())) {
DialogHelper.showPluginDialog(this, () -> {
if (FileUtils.isEmptyFile(showDialog.getPath())) {
toast(R.string.install_failure_hint);
} else {
PackageInstaller.uninstall(BaseActivity.this, showDialog.getPath());
}
return null;
});
} else if (SIGNATURE_CONFLICT.equals(showDialog.getType())) {
DialogHelper.showSignatureConflictDialog(this, () -> {
PackageInstaller.uninstall(BaseActivity.this, showDialog.getPath());
return null;
});
} else if (LOGIN_EXCEPTION.equals(showDialog.getType())) {
if (mIsExistLogoutDialog) return;
mIsExistLogoutDialog = true;
try {
JSONObject object = new JSONObject(showDialog.getPath());
JSONObject device = object.getJSONObject("device");
String model = device.getString("model");
DialogHelper.showCenterDialog(this, "你的账号已在另外一台设备登录"
, StringUtils.buildString("", model, "")
, "知道了", "重新登录"
, () -> {}
, () -> {
if (SPUtils.getBoolean(Constants.SP_HAS_GET_PHONE_INFO) || NetworkUtils.isOpenMobileData(BaseActivity.this)) {
QuickLoginHelper.startLogin(BaseActivity.this, "你的账号已在另外一台设备登录多设备-重新登录");
} else {
startActivity(LoginActivity.getIntent(BaseActivity.this,
"你的账号已在另外一台设备登录多设备-重新登录"));
}
}
);
mBaseHandler.postDelayed(() -> mIsExistLogoutDialog = false, 5000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
onFinish();
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment.isAdded() && fragment instanceof BaseFragment) {
((BaseFragment) fragment).onParentActivityFinish();
}
}
}
}
/**
* 此回调可用于确认当前 activity 已经执行了 finish() 方法并处于 isFinishing 状态
*/
protected void onFinish() {
}
@Override
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 当前页面名称
* @return 完整的链式入口名称
*/
public static String mergeEntranceAndPath(String entrance, String path) {
if (TextUtils.isEmpty(entrance) && TextUtils.isEmpty(path)) return "";
if (TextUtils.isEmpty(entrance) && !TextUtils.isEmpty(path)) {
return StringUtils.buildString("(", path, ")");
}
if (!TextUtils.isEmpty(entrance) && TextUtils.isEmpty(path)) {
return entrance;
}
return StringUtils.buildString(entrance, "+(", path, ")");
}
protected boolean useEventBus() {
return true;
}
@Override
public Resources getResources() {
Resources resources = super.getResources();
if (resources.getConfiguration().fontScale != 1.0f) {
Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1.0f;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
/**
* ActivityThread每次调用onSaveInstanceState时outState大小都会累加最终会导致{@link TransactionTooLargeException}异常
* 解决方案判断每次获取到的outState大小当达到300k时手动clear掉
*/
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
if (preventRecreateFragmentByFragmentManager()) {
outState = discardFragmentFromSaveInstanceState(outState);
}
long bundleSize = getBundleSize(outState);
if (bundleSize > MAX_BUNDLE_SIZE * 1024) {
outState.clear();
}
}
/**
* 是否停用 Activity 重建时 FragmentManager 根据 saveState 自动重建保存的 Fragment 的功能
*/
protected boolean preventRecreateFragmentByFragmentManager() {
return false;
}
private Bundle discardFragmentFromSaveInstanceState(Bundle outState) {
if (outState != null) {
outState.remove("android:support:fragments");
}
return outState;
}
private long getBundleSize(Bundle bundle) {
long dataSize;
Parcel obtain = Parcel.obtain();
try {
obtain.writeBundle(bundle);
dataSize = obtain.dataSize();
} finally {
obtain.recycle();
}
return dataSize;
}
@Override
public Pair<String, String> getBusinessId() {
return null;
}
}

View File

@ -14,12 +14,16 @@ import android.widget.CheckBox
import android.widget.FrameLayout
import android.widget.TextView
import androidx.lifecycle.Observer
import com.gh.common.AppExecutor
import com.gh.common.runOnIoThread
import com.gh.common.util.*
import com.gh.common.util.DialogUtils
import com.gh.common.util.NewLogUtils
import com.gh.common.view.RichEditor
import com.gh.gamecenter.CropImageActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.activity.ToolBarActivity
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.core.runOnIoThread
import com.gh.gamecenter.core.utils.*
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.qa.editor.*
import com.gh.gamecenter.qa.entity.AnswerEntity
@ -37,6 +41,7 @@ import org.json.JSONArray
import org.json.JSONObject
import java.io.File
// TODO: 移动到module_bbs模块
abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarActivity(),
KeyboardHeightObserver, UploadVideoListener {
@ -108,7 +113,8 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
}
}
INSERT_GAME_COLLECTION_CODE -> {
val gameCollectionEntity = data?.getParcelableExtra<GamesCollectionEntity>(GamesCollectionEntity::class.java.simpleName)
val gameCollectionEntity =
data?.getParcelableExtra<GamesCollectionEntity>(GamesCollectionEntity::class.java.simpleName)
if (gameCollectionEntity != null) {
mRichEditor.focusEditor()
insertData = EditorInsertEntity.transform(gameCollectionEntity)
@ -119,7 +125,9 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
if (data != null) mViewModel.uploadPic(data)
}
INSERT_MEDIA_VIDEO_CODE -> {
val localVideoList = data?.getParcelableArrayListExtra<LocalVideoEntity>(LocalVideoEntity::class.java.name) ?: arrayListOf()
val localVideoList =
data?.getParcelableArrayListExtra<LocalVideoEntity>(LocalVideoEntity::class.java.name)
?: arrayListOf()
if (localVideoList.isNotEmpty()) {
mRichEditor.focusEditor()
uploadVideo(localVideoList)
@ -205,6 +213,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mViewModel.setUploadVideoListener(this)
mKeyboardHeightProvider = KeyboardHeightProvider(this)
mRichEditor.post { mKeyboardHeightProvider?.start() }
mRichEditor.enableForceDark(DarkModeUtils.isDarkModeOn(this))
// 防止个别手机在Js里无法获取粘贴内容
mRichEditor.addJavascriptInterface(OnPasteListener(), "onPasteListener")
mRichEditor.addJavascriptInterface(OnCursorChangeListener(), "OnCursorChangeListener")
@ -735,6 +744,14 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
abstract fun provideViewModel(): VM
abstract fun getVideoGuideKey(): String
override fun isAutoResetViewBackgroundEnabled(): Boolean = true
override fun onDarkModeChanged() {
super.onDarkModeChanged()
updateStatusBarColor(R.color.background_white, R.color.background_white)
mRichEditor.enableForceDark(DarkModeUtils.isDarkModeOn(this))
}
companion object {
const val ELEMENT_NAME_BOLD = " b "
const val ELEMENT_NAME_ITALIC = " i "

View File

@ -9,15 +9,16 @@ import android.text.TextUtils
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import com.gh.base.fragment.WaitingDialogFragment
import com.gh.common.runOnUiThread
import com.gh.common.util.*
import com.gh.gamecenter.common.base.fragment.WaitingDialogFragment
import com.gh.gamecenter.core.runOnUiThread
import com.gh.gamecenter.R
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.utils.*
import com.gh.gamecenter.entity.ErrorEntity
import com.gh.gamecenter.entity.LocalVideoEntity
import com.gh.gamecenter.entity.QuoteCountEntity
import com.gh.gamecenter.qa.BbsType
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.common.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.gh.gamecenter.retrofit.service.ApiService
import com.gh.gamecenter.video.upload.OnUploadListener
@ -40,6 +41,7 @@ import kotlin.collections.find
import kotlin.collections.forEach
import kotlin.collections.set
// TODO: 移动到module_bbs模块
abstract class BaseRichEditorViewModel(application: Application) : AndroidViewModel(application) {
val mApi: ApiService = RetrofitManager.getInstance().api
val processDialog = MediatorLiveData<WaitingDialogFragment.WaitingDialogData>()
@ -189,7 +191,8 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo
fun uploadPoster(picturePath: String) {
processDialog.postValue(WaitingDialogFragment.WaitingDialogData("封面上传中...", true))
uploadImageSubscription =
UploadImageUtils.compressAndUploadImage(UploadImageUtils.UploadType.poster,
UploadImageUtils.compressAndUploadImage(
UploadImageUtils.UploadType.poster,
picturePath,
false,
object : UploadImageUtils.OnUploadImageListener {
@ -308,7 +311,8 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo
return
}
uploadImageSubscription =
UploadImageUtils.compressAndUploadImage(UploadImageUtils.UploadType.poster,
UploadImageUtils.compressAndUploadImage(
UploadImageUtils.UploadType.poster,
localVideoPoster,
false,
object : UploadImageUtils.OnUploadImageListener {

View File

@ -0,0 +1,86 @@
package com.gh.base
import android.view.Gravity
import androidx.appcompat.app.AppCompatActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.utils.DarkModeUtils
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.PackageFlavorHelper
import com.gh.gamecenter.common.utils.dip2px
import com.lzf.easyfloat.EasyFloat
import com.lzf.easyfloat.enums.ShowPattern
import com.lzf.easyfloat.enums.SidePattern
object DarkModeSwitchHelper {
fun showDarkModeSwitchFloatingView(activity: AppCompatActivity) {
if (PackageFlavorHelper.IS_TEST_FLAVOR) {
EasyFloat.with(activity)
.setLayout(R.layout.layout_day_mode_night_mode_switch)
.setTag("night_mode_switch_floating_view")
.setAnimator(null)
.setGravity(Gravity.TOP.xor(Gravity.END), 0, 114F.dip2px())
.setSidePattern(SidePattern.RESULT_SIDE)
.setDragEnable(true)
.setShowPattern(ShowPattern.CURRENT_ACTIVITY)
.registerCallback {
createResult { _, _, view ->
view?.setOnClickListener {
showDarkModeSwitchDialog(activity)
}
}
}
.show()
}
}
fun dismissDarkModeSwitchFloatingView() {
if (PackageFlavorHelper.IS_TEST_FLAVOR) {
EasyFloat.dismiss("night_mode_switch_floating_view")
}
}
private fun showDarkModeSwitchDialog(activity: AppCompatActivity) {
if (PackageFlavorHelper.IS_TEST_FLAVOR) {
//切换深色模式
var mode = "普通模式"
var positive = "跟随系统模式"
var negative = "深色模式"
if (DarkModeUtils.isFollowSystemDarkModeFromSp()) {
mode = "跟随系统模式"
positive = "普通模式"
negative = "深色模式"
} else if (DarkModeUtils.isAppDarkModeEnabledFromSp()) {
mode = "深色模式"
positive = "跟随系统模式"
negative = "普通模式"
}
DialogHelper.showDialog(
context = activity,
title = "选择模式",
content = "当前为 $mode",
confirmText = positive,
cancelText = negative,
confirmClickCallback = {
if (DarkModeUtils.isFollowSystemDarkModeFromSp()) {
DarkModeUtils.updateAppDarkModeStatusToSp(false)
DarkModeUtils.updateFollowSystemDarkModeToSp(false)
} else {
DarkModeUtils.updateFollowSystemDarkModeToSp(true)
}
DarkModeUtils.initDarkMode()
},
cancelClickCallback = {
if (DarkModeUtils.isFollowSystemDarkModeFromSp()) {
DarkModeUtils.updateAppDarkModeStatusToSp(true)
} else {
DarkModeUtils.updateAppDarkModeStatusToSp(!DarkModeUtils.isAppDarkModeEnabledFromSp())
}
DarkModeUtils.updateFollowSystemDarkModeToSp(false)
DarkModeUtils.initDarkMode()
},
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
)
}
}
}

View File

@ -0,0 +1,112 @@
package com.gh.base
import android.os.Bundle
import android.text.TextUtils
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.gh.download.DownloadManager
import com.gh.gamecenter.DownloadManagerActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.activity.ToolBarActivity
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.utils.viewModelProvider
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.core.utils.SPUtils.getBoolean
import com.gh.gamecenter.entity.GameUpdateEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.packagehelper.PackageViewModel
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
// TODO:移动到module_download模块中
abstract class DownloadToolbarActivity : ToolBarActivity() {
private var mDownloadCountHint: TextView? = null
private var mPackageViewModel: PackageViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!getBoolean(Constants.SP_TEENAGER_MODE) && showDownloadMenu()) {
mPackageViewModel = viewModelProvider(PackageViewModel.Factory())
mPackageViewModel?.filterSameUpdateLiveData?.observe(this) { updateList: List<GameUpdateEntity> ->
updateDownloadCountHint(updateList)
}
}
}
override fun setToolbarMenu(res: Int) {
// 青少年模式下要隐藏下载按钮
if (getBoolean(Constants.SP_TEENAGER_MODE) && res == R.menu.menu_download) return
super.setToolbarMenu(res)
}
override fun inflateMenu(res: Int) {
super.inflateMenu(res)
if (showDownloadMenu()) {
createDownloadMenu(res)
}
}
private fun createDownloadMenu(res: Int) {
if (res != R.menu.menu_download) {
menuInflater.inflate(R.menu.menu_download, mActionMenuView.menu)
}
if (mPackageViewModel != null) {
updateDownloadCountHint(mPackageViewModel?.filterSameUpdateLiveData?.value)
}
val downloadMenuView = mActionMenuView.menu.findItem(R.id.menu_download).actionView
mDownloadCountHint = downloadMenuView?.findViewById(R.id.menu_download_count_hint)
}
override fun onMenuItemClick(item: MenuItem?): Boolean {
if (item!!.itemId == R.id.menu_download) {
// MtaHelper.onEvent("下载管理", "下载管理入口", getActivityNameInChinese());
val intent = DownloadManagerActivity.getDownloadMangerIntent(this, mEntrance)
startActivity(intent)
return true
}
return super.onMenuItemClick(item)
}
private fun updateDownloadCountHint(updateList: List<GameUpdateEntity>?) {
if (mDownloadCountHint == null) return
val count = DownloadManager.getInstance().getDownloadOrUpdateCount(updateList)
if (count != null) {
mDownloadCountHint!!.visibility = View.VISIBLE
mDownloadCountHint!!.text = count
val params = mDownloadCountHint!!.layoutParams
if (TextUtils.isEmpty(count)) {
params.width = DisplayUtils.dip2px(6f)
params.height = DisplayUtils.dip2px(6f)
} else {
params.width = DisplayUtils.dip2px(12f)
params.height = DisplayUtils.dip2px(12f)
}
mDownloadCountHint!!.layoutParams = params
} else {
mDownloadCountHint!!.visibility = View.GONE
}
}
protected open fun showDownloadMenu(): Boolean {
return false
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMainThread(status: EBDownloadStatus?) {
if (!getBoolean(Constants.SP_TEENAGER_MODE) && showDownloadMenu() && mPackageViewModel != null) {
updateDownloadCountHint(mPackageViewModel?.filterSameUpdateLiveData?.value)
}
}
override fun onDarkModeChanged() {
super.onDarkModeChanged()
if (showDownloadMenu() && getMenuItem(R.id.menu_download) != null) {
(getMenuItem(R.id.menu_download).actionView?.findViewById(R.id.menu_download_iv) as ImageView).setImageResource(
R.drawable.toolbar_download
)
}
}
}

View File

@ -1,229 +0,0 @@
//package com.gh.base
//
//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 android.os.Bundle
//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.*
//import com.gh.gamecenter.R
//import com.gh.gamecenter.entity.PushEntity
//import com.gh.gamecenter.entity.PushMessageEntity
//import com.gh.gamecenter.entity.PushMessageUnreadEntity
//import com.gh.gamecenter.entity.PushNotificationEntity
//import com.gh.gamecenter.manager.UserManager
//import com.gh.gamecenter.message.MessageUnreadRepository
//import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
//import com.gh.gamecenter.receiver.UmengMessageReceiver
//import com.gh.gamecenter.receiver.UmengMessageReceiver.Companion.TYPE_CLICK
//import com.gh.gamecenter.receiver.UmengMessageReceiver.Companion.TYPE_REMOVE
//import com.gh.gamecenter.retrofit.Response
//import com.gh.gamecenter.retrofit.RetrofitManager
//import com.google.gson.Gson
//import com.umeng.message.UmengMessageService
//import io.reactivex.android.schedulers.AndroidSchedulers
//import io.reactivex.schedulers.Schedulers
//import okhttp3.MediaType
//import okhttp3.RequestBody
//import okhttp3.ResponseBody
//import org.android.agoo.common.AgooConstants
//import org.json.JSONObject
//import retrofit2.HttpException
//import java.util.*
//
//class GHUmengNotificationService : UmengMessageService() {
//
// companion object {
// const val ACTION_UMENG = "com.gh.gamecenter.UMENG"
// const val MESSAGE_FROM_SYSTEM = "message_from_system"
// const val HALO_MESSAGE_DIALOG = "HALO_MESSAGE_DIALOG"
// const val HALO_MESSAGE_CENTER = "HALO_MESSAGE_CENTER"
// const val ANSWER = "answer"
// const val FOLLOW_QUESTION = "follow_question"
// const val NOTIFICATION_ID = 2015
// const val DISPLAY_TYPE_NOTIFICATION = "notification"
// const val DISPLAY_TYPE_CUSTOM = "custom"
// const val MESSAGE_ID = "message_id"
// const val NOTIFICATION_MESSAGE_ID = "notification_message_id" // 通知中心消息 ID
// const val PUSH_ID = "push_id"
// }
//
// val notificationTags = arrayOf("GH_UMENG_TAG_1", "GH_UMENG_TAG_2", "GH_UMENG_TAG_3")
// val gson = Gson()
//
// override fun onMessage(context: Context, intent: Intent) {
// val message = intent.getStringExtra(AgooConstants.MESSAGE_BODY)
// val isMessageFromSystem = intent.getBooleanExtra(MESSAGE_FROM_SYSTEM, false)
//
// try {
// val pushData = message.toObject<PushEntity>()
// pushData?.let { handlePushData(context, it, message, isMessageFromSystem) }
// } catch (e: Exception) {
// e.printStackTrace()
// }
// }
//
// private fun handlePushData(context: Context, pushData: PushEntity, message: String, isMessageFromSystem: Boolean) {
// val notificationManager = context.applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//
// if (pushData.displayType == DISPLAY_TYPE_NOTIFICATION) {
// // 其它类型的透传信息
// // 显示到通知栏
// val msg = message.toObject<PushNotificationEntity>()
// val data = msg?.extra?.data
//
// // 系统推送(非自定义信息),直接处理跳转
// if (isMessageFromSystem) {
// val intent = Intent()
// intent.setClass(context, UmengMessageReceiver::class.java)
// intent.putExtra(EntranceUtils.KEY_DATA, data?.link)
// intent.putExtra(EntranceUtils.KEY_TYPE, UmengMessageReceiver.DIRECT_ONLY)
// intent.putExtra(EntranceUtils.KEY_MESSAGE, message)
// intent.putExtra(NOTIFICATION_MESSAGE_ID, data?.messageId)
// context.sendBroadcast(intent)
// return
// }
//
// // 用户未登录的情况下不生成消息中心通知,避免用户掉登录了还收到跳转至消息中心的通知
// if (data != null
// && data.link?.link == "system"
// && !UserManager.getInstance().isLoggedIn) {
// return
// }
//
// val clickIntent = Intent()
// val removeIntent = Intent()
//
// clickIntent.setClass(context, UmengMessageReceiver::class.java)
// clickIntent.putExtra(EntranceUtils.KEY_DATA, data?.link)
// clickIntent.putExtra(EntranceUtils.KEY_MESSAGE, message)
// clickIntent.putExtra(MESSAGE_ID, msg?.msgId)
// clickIntent.putExtra(PUSH_ID, data?.pushId)
// clickIntent.putExtra(NOTIFICATION_MESSAGE_ID, data?.messageId)
// clickIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_CLICK)
//
// removeIntent.setClass(context, UmengMessageReceiver::class.java)
// removeIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_REMOVE)
// removeIntent.putExtra(EntranceUtils.KEY_MESSAGE, message)
//
// val clickPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(),
// clickIntent, PendingIntent.FLAG_UPDATE_CURRENT)
//
// val deletePendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt() + 1,
// removeIntent, PendingIntent.FLAG_UPDATE_CURRENT)
//
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// val channel = NotificationChannel("Halo_Push", "Halo_Push", NotificationManager.IMPORTANCE_DEFAULT)
// notificationManager.createNotificationChannel(channel)
// }
//
// val notification = NotificationCompat.Builder(context, "Halo_Push")
// .setSmallIcon(R.drawable.ic_notification)
// .setTicker(pushData.body?.ticker)
// .setContentTitle(pushData.body?.title)
// .setContentText(pushData.body?.text?.fromHtml())
// .setContentIntent(clickPendingIntent)
// .setDeleteIntent(deletePendingIntent)
// .build()
// notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL
//
// notificationManager.notify(getNotificationTag(context), NOTIFICATION_ID, notification)
// } else {
// 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
//
// val type = if (ANSWER == data?.type) {
// "回答了你的问题"
// } else {
// "回答了你关注的问题"
// }
//
// val userName = StringUtils.shrinkStringWithDot(data?.userEntity?.name, 8)
// val displayText = userName + type
//
// if (Notifier.isActivityValid(CurrentActivityHolder.getCurrentActivity()) &&
// Notifier.shouldShowNotifier(data?.answer?.id + displayText)) {
// Notifier.create(CurrentActivityHolder.getCurrentActivity())
// .setText(displayText)
// .setDuration(5000)
// .setIcon(data?.userEntity?.icon)
// .setOnClickListener(View.OnClickListener {
// val bundle = Bundle()
// bundle.putString(EntranceUtils.KEY_ANSWER_ID, data?.answer?.id)
// bundle.putString(EntranceUtils.KEY_ENTRANCE, EntranceUtils.ENTRANCE_UMENG)
// bundle.putString(EntranceUtils.KEY_TO, AnswerDetailActivity::class.java.name)
// EntranceUtils.jumpActivity(context, bundle)
//
// MtaHelper.onEvent("消息弹窗", type, "Does not contains any parameter.")
//
// // 标记已读
// val jsonObject = JSONObject()
// jsonObject.put("type", type)
// val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString())
//
// RetrofitManager.getInstance().api.postMessageRead(UserManager.getInstance().userId, data?.id, body)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(object : Response<ResponseBody>() {
// override fun onResponse(response: ResponseBody?) {
// super.onResponse(response)
// MessageUnreadRepository.loadMessageUnreadData()
// }
//
// override fun onFailure(e: HttpException?) {
// e?.printStackTrace()
// }
// })
// Notifier.hide()
// })
// .show(false)
// Notifier.tagNotifierAsShowed(data?.answer?.id + displayText)
// }
// } else if (HALO_MESSAGE_CENTER == pushData.body?.custom) {
// // 消息中心逻辑
// val msg = gson.fromJson(message, PushMessageUnreadEntity::class.java)
// val data = msg?.extra?.data
// data?.let { MessageUnreadRepository.loadMessageUnreadData() }
// }
// }
// }
//
// /**
// * 规则:最多三条消息,以旧换新
// *
// * @return NotificationTag
// */
// private fun getNotificationTag(context: Context): String {
// val sp = PreferenceManager.getDefaultSharedPreferences(context)
// val edit = sp.edit()
//
// val timeTagMap = HashMap<Long, String>()
// for (tag in notificationTags) {
// val time = sp.getLong(tag, 0)
// if (time == 0L) {
// edit.putLong(tag, System.currentTimeMillis()).apply()
// return tag
// } else {
// timeTagMap[time] = tag
// }
// }
//
// val minTime = Collections.min(timeTagMap.keys)
// val tag = timeTagMap[minTime]
// edit.putLong(tag, System.currentTimeMillis()).apply()
// return if (TextUtils.isEmpty(tag)) notificationTags[0] else tag!!
// }
//}

View File

@ -3,37 +3,35 @@ package com.gh.base
import android.app.Activity
import android.app.Application
import android.os.Bundle
import com.gh.common.notifier.Notifier
import com.gh.common.util.DataUtils
import androidx.appcompat.app.AppCompatActivity
import com.gh.common.util.FloatingBackViewManager
import com.gh.download.DownloadManager
import com.gh.gamecenter.MainActivity
import com.gh.gamecenter.SplashScreenActivity
import com.gh.gamecenter.energy.EnergyCenterActivity
import com.gh.gamecenter.common.utils.PackageFlavorHelper
import com.gh.gamecenter.forum.detail.ForumDetailActivity
import com.gh.gamecenter.forum.list.ForumListActivity
import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity
import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity
import com.gh.vspace.VHelper
import com.halo.assistant.HaloApp
import com.lightgame.utils.AppManager
// TODO移动到对应的模块
class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
AppManager.getInstance().addActivity(activity)
// do nothing
}
override fun onActivityStarted(activity: Activity) {
GlobalActivityManager.currentActivity = activity
}
override fun onActivityResumed(activity: Activity) {
CurrentActivityHolder.activitySet.add(activity)
// 判断是否需要显示或隐藏返回小浮窗
if (FloatingBackViewManager.getType().isNotEmpty()) {
if (activity is EnergyCenterActivity
if ((activity::class.java.name == "EnergyCenterActivity")
&& FloatingBackViewManager.getType() == FloatingBackViewManager.TYPE_TASK
) {
FloatingBackViewManager.disableBackView()
@ -47,7 +45,6 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks {
}
if (HaloApp.isUserAcceptPrivacyPolicy(activity)) {
DataUtils.onResume(activity)
// FIXME 这里应该只是部分Activity需要
try {
// 初始化gameMap
@ -58,6 +55,14 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks {
e.printStackTrace()
}
}
if (PackageFlavorHelper.IS_TEST_FLAVOR && activity is AppCompatActivity) {
DarkModeSwitchHelper.showDarkModeSwitchFloatingView(activity)
}
if (activity is AppCompatActivity && activity !is SplashScreenActivity) {
VHelper.showFeedbackDialogIfLastSuccessfulLaunchedGameExitUnexpectedly(activity)
}
}
private fun shouldShowActivityBackView(activity: Activity): Boolean {
@ -70,28 +75,22 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks {
}
override fun onActivityPaused(activity: Activity) {
CurrentActivityHolder.activitySet.remove(activity)
FloatingBackViewManager.dismissBackView()
if (HaloApp.isUserAcceptPrivacyPolicy(activity)) {
DataUtils.onPause(activity)
}
if (activity.isFinishing) {
AppManager.getInstance().finishActivity(activity)
if (PackageFlavorHelper.IS_TEST_FLAVOR && activity is AppCompatActivity) {
DarkModeSwitchHelper.dismissDarkModeSwitchFloatingView()
}
}
override fun onActivityStopped(activity: Activity) {
Notifier.hide()
// do nothing
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
// do nothing
}
override fun onActivityDestroyed(activity: Activity) {
AppManager.getInstance().finishActivity(activity)
// do nothing
}
}

View File

@ -0,0 +1,14 @@
package com.gh.base
import android.app.Activity
import java.lang.ref.WeakReference
object GlobalActivityManager {
private var mCurrentActivityWeakRef: WeakReference<Activity>? = null
var currentActivity: Activity?
get() = mCurrentActivityWeakRef?.get()
set(activity) {
mCurrentActivityWeakRef = WeakReference<Activity>(activity)
}
}

View File

@ -1,5 +0,0 @@
package com.gh.common
object Base64ImageHolder {
var image: String = ""
}

View File

@ -8,22 +8,35 @@ import android.webkit.JavascriptInterface
import androidx.annotation.Keep
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import com.gh.base.CurrentActivityHolder
import com.gh.common.constant.Constants
import com.gh.common.loghub.LoghubUtils
import com.gh.common.tracker.Tracker
import com.gh.common.util.*
import com.gh.common.view.dsbridge.CompletionHandler
import com.gh.common.util.LogUtils
import com.gh.gamecenter.*
import com.gh.gamecenter.energy.EnergyCenterActivity
import com.gh.gamecenter.energy.EnergyHouseActivity
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.common.callback.BiCallback
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.entity.NotificationUgc
import com.gh.gamecenter.common.loghub.LoghubUtils
import com.gh.gamecenter.common.tracker.Tracker
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.view.dsbridge.CompletionHandler
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.core.runOnIoThread
import com.gh.gamecenter.core.runOnUiThread
import com.gh.gamecenter.core.utils.CurrentActivityHolder
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.core.utils.MtaHelper
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.energy.EnergyBridge
import com.gh.gamecenter.entity.MtaEvent
import com.gh.gamecenter.help.QaFeedbackDialogFragment
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.login.entity.Badge
import com.gh.gamecenter.login.user.LoginTag
import com.gh.gamecenter.login.view.LoginActivity
import com.gh.gamecenter.login.user.UserManager
import com.gh.gamecenter.personalhome.border.AvatarBorderActivity
import com.gh.gamecenter.security.BindPhoneActivity
import com.gh.gamecenter.user.LoginTag
import com.gh.gamecenter.user.UserRepository
import com.gh.gamecenter.login.user.UserRepository
import com.gh.gamecenter.login.utils.LoginHelper
import com.gh.gamecenter.login.utils.QuickLoginHelper
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import org.json.JSONObject
@ -32,7 +45,7 @@ import java.io.File
import java.io.FileOutputStream
import java.util.*
class DefaultJsApi(var context: Context) {
class DefaultJsApi(var context: Context, val entrance: String = "") {
private var mLoginHandler: CompletionHandler<Any>? = null
@ -115,7 +128,7 @@ class DefaultJsApi(var context: Context) {
WechatBindHelper.bindWechat(wechatLoginInfoMap, object : BiCallback<Boolean, Boolean> {
override fun onFirst(first: Boolean) {
EnergyTaskHelper.postEnergyTask("bind_wechat")
EnergyBridge.postEnergyTask("bind_wechat")
handler.complete(true)
}
@ -181,7 +194,7 @@ class DefaultJsApi(var context: Context) {
fun openBase64Image(event: Any) {
val context = CurrentActivityHolder.getCurrentActivity()
Base64ImageHolder.image = event.toString()
ImageViewerActivity.base64Image = event.toString()
context?.startActivity(ImageViewerActivity.getBase64Intent(context, true))
}
@ -207,7 +220,7 @@ class DefaultJsApi(var context: Context) {
@JavascriptInterface
fun updateRegulationTestStatus(msg: Any) {
if (msg.toString().toLowerCase(Locale.getDefault()) == "pass") {
EnergyTaskHelper.postEnergyTask("finish_etiquette_exam")
EnergyBridge.postEnergyTask("finish_etiquette_exam")
SPUtils.setString(Constants.SP_REGULATION_TEST_PASS_STATUS, "pass")
}
}
@ -232,7 +245,7 @@ class DefaultJsApi(var context: Context) {
fun shareBase64Image(event: Any) {
val imageShareEvent = event.toString().toObject() ?: ImageShareEvent()
val context = CurrentActivityHolder.getCurrentActivity()
Base64ImageHolder.image = imageShareEvent.image.run {
ImageViewerActivity.base64Image = imageShareEvent.image.run {
if (this.startsWith("data:image/png;base64")) this.split(",")[1] else this
}
MessageShareUtils.getInstance(context).shareFromWeb(context, imageShareEvent.type)
@ -243,7 +256,7 @@ class DefaultJsApi(var context: Context) {
val inviteEvent = event.toString().toObject() ?: InviteFriendsEvent()
val context = CurrentActivityHolder.getCurrentActivity()
if ("poster" == inviteEvent.type) {
Base64ImageHolder.image = inviteEvent.poster.run {
ImageViewerActivity.base64Image = inviteEvent.poster.run {
if (this.startsWith("data:image/png;base64")) this.split(",")[1] else this
}
MessageShareUtils.getInstance(context).shareInviteFriends(context, inviteEvent.way)
@ -278,22 +291,22 @@ class DefaultJsApi(var context: Context) {
@JavascriptInterface
fun openInNewWebview(url: Any) {
runOnUiThread { DirectUtils.directToWebView(context, url.toString(), "内部网页") }
runOnUiThread { DirectUtils.directToWebView(context, url.toString(), entrance.ifBlank { "内部网页" }) }
}
@JavascriptInterface
fun postWearBadgeTask(msg: Any) {
EnergyTaskHelper.postEnergyTask("wear_badge")
EnergyBridge.postEnergyTask("wear_badge")
}
@JavascriptInterface
fun startEnergyCenter(msg: Any) {
context.startActivity(EnergyCenterActivity.getIntent(context))
context.startActivity(EnergyBridge.getEnergyCenterIntent(context))
}
@JavascriptInterface
fun startEnergyHouse(msg: Any) {
context.startActivity(EnergyHouseActivity.getIntent(context))
context.startActivity(EnergyBridge.getEnergyHouseIntent(context, null))
}
@JavascriptInterface
@ -358,7 +371,8 @@ class DefaultJsApi(var context: Context) {
runOnIoThread {
val base64String = base64StringData.replace("data:image/png;base64", "")
tryWithDefaultCatch {
val imageFile = File(HaloApp.getInstance().cacheDir.absolutePath + File.separator + System.currentTimeMillis() + ".png")
val imageFile =
File(HaloApp.getInstance().cacheDir.absolutePath + File.separator + System.currentTimeMillis() + ".png")
val decodedString = Base64.decode(base64String, Base64.DEFAULT)
val bos = BufferedOutputStream(FileOutputStream(imageFile))
bos.write(decodedString)
@ -385,7 +399,7 @@ class DefaultJsApi(var context: Context) {
@JavascriptInterface
fun openInNewFullWebview(url: Any) {
runOnUiThread { DirectUtils.directToFullScreenWebPage(context, url.toString(), true) }
runOnUiThread { DirectUtils.directToFullScreenWebPage(context, url.toString(), true, entrance) }
}
@JavascriptInterface
@ -420,6 +434,11 @@ class DefaultJsApi(var context: Context) {
GameActivityDownloadHelper.postExposureEvent(gameActivityEvent)
}
@JavascriptInterface
fun getEntrance(msg: Any): String {
return entrance
}
@Keep
internal data class ImageEvent(var imageList: ArrayList<String> = arrayListOf(), var position: Int = 0)
@ -447,10 +466,4 @@ class DefaultJsApi(var context: Context) {
var activityId: String = "",
var platform: String = ""
)
@Keep
data class GameActivityTaskEvent(
var gameId: String = "",
var activityId: String = "",
)
}

View File

@ -5,8 +5,8 @@ import android.content.Intent
import android.net.Uri
import android.text.TextUtils
import android.util.Base64
import com.gh.base.CurrentActivityHolder
import com.gh.common.constant.Constants
import com.gh.gamecenter.core.utils.CurrentActivityHolder
import com.gh.gamecenter.common.constant.Constants
import com.gh.common.util.*
import com.gh.common.util.DirectUtils.directToFeedback
import com.gh.common.util.DirectUtils.directToGameDetailVideoStreaming
@ -15,11 +15,18 @@ import com.gh.common.util.DirectUtils.directToGameVideo
import com.gh.common.util.DirectUtils.directToLegacyVideoDetail
import com.gh.common.util.DirectUtils.directToLinkPage
import com.gh.common.util.DirectUtils.directToQa
import com.gh.common.util.GsonUtils.gson
import com.gh.gamecenter.core.utils.GsonUtils.gson
import com.gh.gamecenter.LibaoDetailActivity
import com.gh.gamecenter.MainActivity
import com.gh.gamecenter.NewsDetailActivity
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.entity.CommunityEntity
import com.gh.gamecenter.common.entity.LinkEntity
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.EnvHelper
import com.gh.gamecenter.core.utils.ToastUtils
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.gamecollection.publish.GameCollectionEditActivity
import com.gh.gamecenter.qa.BbsType
@ -32,7 +39,7 @@ import java.nio.charset.Charset
object DefaultUrlHandler {
@JvmStatic
fun interceptUrl(context: Context, url: String, entrance: String) : Boolean {
fun interceptUrl(context: Context, url: String, entrance: String): Boolean {
return interceptUrl(context, url, entrance, false)
}
@ -67,7 +74,13 @@ object DefaultUrlHandler {
entrance = entrance
)
"column" -> SubjectActivity.startSubjectActivity(context, id, uri.getQueryParameter("name"), false, entrance)
"column" -> SubjectActivity.startSubjectActivity(
context,
id,
uri.getQueryParameter("name"),
false,
entrance
)
"libao" -> context.startActivity(LibaoDetailActivity.getIntentById(context, id, entrance))
@ -78,7 +91,7 @@ object DefaultUrlHandler {
e.printStackTrace()
}
EntranceUtils.HOST_QQ_QUN -> {
EntranceConsts.HOST_QQ_QUN -> {
val key = uri.getQueryParameter("key")
if (!DirectUtils.directToQqGroup(context, key)) {
Utils.toast(context, "请检查是否已经安装手机QQ")
@ -86,7 +99,7 @@ object DefaultUrlHandler {
}
"inurl" -> {
DirectUtils.directToWebView(context, uri.getQueryParameter("url") ?: "")
DirectUtils.directToWebView(context, uri.getQueryParameter("url") ?: "", entrance)
}
"outurl" -> {
@ -103,6 +116,8 @@ object DefaultUrlHandler {
}
"question" -> DirectUtils.directToQuestionDetail(context, id, entrance, "文章链接")
"real_name" -> DirectUtils.directToRealName(context)
"community" -> {
val community = CommunityEntity()
community.id = id
@ -146,7 +161,7 @@ object DefaultUrlHandler {
)
}
}
EntranceUtils.HOST_UPLOAD_VIDEO -> {
EntranceConsts.HOST_UPLOAD_VIDEO -> {
val titleParameter = uri.getQueryParameter("title")
val title = if (titleParameter.isNullOrEmpty()) "" else "#$titleParameter#"
val categoryId = uri.getQueryParameter("category_id") ?: ""
@ -157,16 +172,29 @@ object DefaultUrlHandler {
val tagActivityName = uri.getQueryParameter("tagActivityName") ?: ""
val linkEntity = VideoLinkEntity(title, categoryId, link, tagActivityId, tagActivityName)
val simpleGameEntity = SimpleGameEntity(gameId, gameName)
CheckLoginUtils.checkLogin(context, null, true, EntranceUtils.ENTRANCE_BROWSER) {
DirectUtils.directToVideoManager(context, linkEntity, simpleGameEntity, EntranceUtils.ENTRANCE_BROWSER, "")
CheckLoginUtils.checkLogin(context, null, true, EntranceConsts.ENTRANCE_BROWSER) {
DirectUtils.directToVideoManager(
context,
linkEntity,
simpleGameEntity,
EntranceConsts.ENTRANCE_BROWSER,
""
)
}
}
EntranceUtils.HOST_USERHOME -> {
EntranceConsts.HOST_USERHOME -> {
val position = uri.getQueryParameter("position")
val subtype = uri.getQueryParameter("sub_type") ?: ""
DirectUtils.directToHomeActivity(context, id, subtype, if (position.isNullOrEmpty()) -1 else position.toInt(), entrance, "")
DirectUtils.directToHomeActivity(
context,
id,
subtype,
if (position.isNullOrEmpty()) -1 else position.toInt(),
entrance,
""
)
}
EntranceUtils.HOST_VIDEO_MORE -> {
EntranceConsts.HOST_VIDEO_MORE -> {
val referer = uri.getQueryParameter("referer") ?: ""
val type = uri.getQueryParameter("type") ?: ""
val act = uri.getQueryParameter("act") ?: ""
@ -198,48 +226,48 @@ object DefaultUrlHandler {
sectionName
)
}
EntranceUtils.HOST_VIDEO_DETAIL -> {
EntranceConsts.HOST_VIDEO_DETAIL -> {
DirectUtils.directToVideoDetail(context, id, entrance, path)
}
EntranceUtils.HOST_VIDEO_SINGLE -> {
EntranceConsts.HOST_VIDEO_SINGLE -> {
val referer = uri.getQueryParameter("referer") ?: ""
DirectUtils.directToVideoDetail(
context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value,
false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer
)
}
EntranceUtils.HOST_VIDEO_STREAMING_HOME -> {
EntranceConsts.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 -> {
EntranceConsts.HOST_VIDEO_STREAMING_DESC -> {
directToGameDetailVideoStreaming(context, id, entrance)
}
EntranceUtils.HOST_VIDEO_COLLECTION -> {
EntranceConsts.HOST_VIDEO_COLLECTION -> {
directToGameVideo(context, id, entrance, "")
}
EntranceUtils.HOST_CATEGORY -> {
EntranceConsts.HOST_CATEGORY -> {
val title = uri.getQueryParameter("title")
DirectUtils.directCategoryDirectory(context, id, title ?: "", entrance, "")
}
EntranceUtils.HOST_COLUMN_COLLECTION -> {
EntranceConsts.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)
EntranceConsts.HOST_COLUMN -> {
DirectUtils.directToSubject(context, id, uri.getQueryParameter(EntranceConsts.KEY_NAME), entrance)
}
EntranceUtils.HOST_COMMUNITY_QUESTION_LABEL_DETAIL -> {
EntranceConsts.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 -> {
EntranceConsts.HOST_COMMUNITY_COLUMN_DETAIL -> {
val community = CommunityEntity()
community.id = uri.getQueryParameter("community_id") ?: ""
community.name = uri.getQueryParameter("community_name") ?: ""
@ -247,42 +275,42 @@ object DefaultUrlHandler {
DirectUtils.directAskColumnDetail(context, columnId, community, entrance, "")
}
EntranceUtils.HOST_BLOCK -> {
EntranceConsts.HOST_BLOCK -> {
val name = uri.getQueryParameter("name")
?: ""
val entity = SubjectRecommendEntity(link = id, name = name, text = name)
DirectUtils.directToBlock(context, entity, entrance)
}
EntranceUtils.HOST_SERVER_BLOCK -> {
EntranceConsts.HOST_SERVER_BLOCK -> {
DirectUtils.directToGameServers(context, entrance = entrance, path = "")
}
EntranceUtils.HOST_AMWAY_BLOCK -> {
EntranceConsts.HOST_AMWAY_BLOCK -> {
DirectUtils.directToAmway(context, entrance = entrance, path = "")
}
EntranceUtils.HOST_HELP -> {
EntranceConsts.HOST_HELP -> {
val name = uri.getQueryParameter("name")
?: ""
DirectUtils.directToQa(context, name, id)
}
EntranceUtils.HOST_HELP_COLLECTION -> {
EntranceConsts.HOST_HELP_COLLECTION -> {
val name = uri.getQueryParameter("name")
?: ""
DirectUtils.directToQaCollection(context, name, id)
}
EntranceUtils.HOST_GAME_UPLOAD -> {
EntranceConsts.HOST_GAME_UPLOAD -> {
DirectUtils.directGameUpload(context, entrance = entrance, path = "")
}
EntranceUtils.HOST_GAME_ZONE -> {
EntranceConsts.HOST_GAME_ZONE -> {
val zoneUrl = uri.getQueryParameter("url") ?: ""
DirectUtils.directGameZone(context, id, zoneUrl, entrance)
}
EntranceUtils.HOST_LINK -> {
EntranceConsts.HOST_LINK -> {
try {
val dataString = uri.getQueryParameter("data")
if (!TextUtils.isEmpty(dataString)) {
@ -296,45 +324,46 @@ object DefaultUrlHandler {
}
}
EntranceUtils.HOST_GAME_NEWS -> {
EntranceConsts.HOST_GAME_NEWS -> {
DirectUtils.directToGameNews(
context,
uri.getQueryParameter(EntranceUtils.KEY_GAME_ID),
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
uri.getQueryParameter(EntranceConsts.KEY_GAME_ID),
uri.getQueryParameter(EntranceConsts.KEY_GAME_NAME),
entrance
);
}
EntranceUtils.HOST_GAME_CALENDAR -> {
directToGameServerCalendar(context, uri.getQueryParameter(EntranceUtils.KEY_GAME_ID))
EntranceConsts.HOST_GAME_CALENDAR -> {
directToGameServerCalendar(context, uri.getQueryParameter(EntranceConsts.KEY_GAME_ID))
}
EntranceUtils.HOST_HISTORY_APK -> {
DirectUtils.directToHistoryApk(context, uri.getQueryParameter(EntranceUtils.KEY_GAME_ID))
EntranceConsts.HOST_HISTORY_APK -> {
DirectUtils.directToHistoryApk(context, uri.getQueryParameter(EntranceConsts.KEY_GAME_ID))
}
EntranceUtils.HOST_FORUM_DETAIL -> {
EntranceConsts.HOST_FORUM_DETAIL -> {
DirectUtils.directForumDetail(context, id, entrance)
}
EntranceUtils.HOST_GAME_RATING_DETAIL -> {
EntranceConsts.HOST_GAME_RATING_DETAIL -> {
DirectUtils.directToGameRatingDetail(
context,
uri.getQueryParameter(EntranceUtils.KEY_GAME_ID),
uri.getQueryParameter(EntranceUtils.KEY_COMMENT_ID),
EntranceUtils.ENTRANCE_BROWSER
uri.getQueryParameter(EntranceConsts.KEY_GAME_ID),
uri.getQueryParameter(EntranceConsts.KEY_COMMENT_ID),
EntranceConsts.ENTRANCE_BROWSER
)
}
EntranceUtils.HOST_FORUM -> {
val position = uri.getQueryParameter(EntranceUtils.KEY_POSITION)?.toInt()
EntranceConsts.HOST_FORUM -> {
val position = uri.getQueryParameter(EntranceConsts.KEY_POSITION)?.toInt()
DirectUtils.directToForum(context, position ?: 0)
}
EntranceUtils.HOST_UPLOAD_VIDEO_NEW -> {
EntranceConsts.HOST_UPLOAD_VIDEO_NEW -> {
val activityName = uri.getQueryParameter("activity_name") ?: ""
val activityId = uri.getQueryParameter("activity_id") ?: ""
val original = uri.getQueryParameter("original") ?: ""
val forumName = uri.getQueryParameter("forum_name") ?: ""
val forumId = uri.getQueryParameter("forum_id") ?: ""
val forumIcon = uri.getQueryParameter("forum_icon") ?: ""
@ -343,11 +372,21 @@ object DefaultUrlHandler {
val gameName = uri.getQueryParameter("game_name") ?: ""
val icon = uri.getQueryParameter("game_icon") ?: ""
val iconSubscript = uri.getQueryParameter("game_icon_subscript") ?: ""
val gameEntity = if (forumType == BbsType.OFFICIAL_BBS.value) {
GameEntity(id = gameId, mName = gameName, mIcon = icon, mIconSubscript = iconSubscript)
val gameEntity =
if (forumType == BbsType.OFFICIAL_BBS.value && gameId.isNotEmpty() && gameName.isNotEmpty() && icon.isNotEmpty()) {
GameEntity(id = gameId, mName = gameName, mIcon = icon, mIconSubscript = iconSubscript)
} else null
val activityLabelEntity = if (activityId.isNotEmpty() && activityName.isNotEmpty()) {
ActivityLabelEntity(
id = activityId,
name = activityName,
original = original.ifEmpty { "false" }.toBoolean()
)
} else null
val activityLabelEntity = ActivityLabelEntity(id = activityId, name = activityName)
val communityEntity = CommunityEntity(id = forumId, name = forumName, icon = forumIcon)
val communityEntity =
if (forumId.isNotEmpty() && forumName.isNotEmpty() && forumIcon.isNotEmpty()) {
CommunityEntity(id = forumId, name = forumName, icon = forumIcon)
} else null
context.startActivity(
VideoPublishActivity.getIntent(
@ -356,46 +395,54 @@ object DefaultUrlHandler {
gameEntity,
activityLabelEntity,
forumType,
false,
disableForumSelection = false,
isFromCommunityActivity = true,
entrance,
""
)
)
}
EntranceUtils.HOST_SUGGESTION -> {
val platform = uri.getQueryParameter(EntranceUtils.KEY_PLATFORM)
EntranceConsts.HOST_SUGGESTION -> {
val platform = uri.getQueryParameter(EntranceConsts.KEY_PLATFORM)
val platformName = PlatformUtils.getInstance(context).getPlatformName(platform)
val gameId = uri.getQueryParameter(EntranceUtils.KEY_GAMEID)
val packageMd5 = uri.getQueryParameter(EntranceUtils.KEY_PACKAGE_MD5)
val isQaFeedback = uri.getQueryParameter(EntranceUtils.KEY_IS_QA_FEEDBACK) == "true"
val gameId = uri.getQueryParameter(EntranceConsts.KEY_GAMEID)
val packageMd5 = uri.getQueryParameter(EntranceConsts.KEY_PACKAGE_MD5)
val isQaFeedback = uri.getQueryParameter(EntranceConsts.KEY_IS_QA_FEEDBACK) == "true"
val content = if (TextUtils.isEmpty(gameId) || TextUtils.isEmpty(packageMd5)) String.format(
"%s-%s-V%s",
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
uri.getQueryParameter(EntranceConsts.KEY_GAME_NAME),
if (TextUtils.isEmpty(platformName)) platform else platformName,
uri.getQueryParameter(EntranceUtils.KEY_VERSION)
uri.getQueryParameter(EntranceConsts.KEY_VERSION)
) else String.format(
"%s-%s-V%s\n游戏ID%s\n游戏包MD5%s\n",
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
uri.getQueryParameter(EntranceConsts.KEY_GAME_NAME),
if (TextUtils.isEmpty(platformName)) platform else platformName,
uri.getQueryParameter(EntranceUtils.KEY_VERSION), gameId, packageMd5
uri.getQueryParameter(EntranceConsts.KEY_VERSION), gameId, packageMd5
)
val qaId = uri.getQueryParameter("qa_id") ?: ""
val qaContentId = uri.getQueryParameter(EntranceUtils.KEY_QA_CONTENT_ID) ?: ""
val qaTitle = uri.getQueryParameter(EntranceUtils.KEY_QA_TITLE)
val qaContentId = uri.getQueryParameter(EntranceConsts.KEY_QA_CONTENT_ID) ?: ""
val qaTitle = uri.getQueryParameter(EntranceConsts.KEY_QA_TITLE)
if (!TextUtils.isEmpty(qaId)) {
directToQa(context, qaTitle, qaId)
} else {
directToFeedback(context, content, null, isQaFeedback, qaContentId, EntranceUtils.ENTRANCE_BROWSER)
directToFeedback(
context,
content,
null,
isQaFeedback,
qaContentId,
EntranceConsts.ENTRANCE_BROWSER
)
}
}
EntranceUtils.HOST_HELP_AND_FEEDBACK -> {
EntranceConsts.HOST_HELP_AND_FEEDBACK -> {
val position = uri.getQueryParameter("position") ?: ""
DirectUtils.directToHelpAndFeedback(context, position.toInt())
}
EntranceUtils.HOST_HELP_DETAIL -> {
EntranceConsts.HOST_HELP_DETAIL -> {
var url = uri.getQueryParameter("url")
if (!url.isNullOrEmpty()) {
context.startActivity(WebActivity.getIntent(context, url, false))
@ -408,20 +455,39 @@ object DefaultUrlHandler {
val id = uri.getQueryParameter("id")
val name = uri.getQueryParameter("name")
val qaCollectionId = uri.getQueryParameter("collection_id")
context.startActivity(WebActivity.getIntent(context, "$url$id", name, true, !qaCollectionId.isNullOrEmpty()))
context.startActivity(
WebActivity.getIntent(
context,
"$url$id",
name,
true,
!qaCollectionId.isNullOrEmpty()
)
)
}
}
EntranceUtils.HOST_GAME_COLLECTION_DETAIL -> {
EntranceConsts.HOST_GAME_COLLECTION_DETAIL -> {
DirectUtils.directToGameCollectionDetail(context, id, entrance)
}
EntranceUtils.HOST_GAME_COLLECTION_SQUARE -> {
EntranceConsts.HOST_GAME_COLLECTION_SQUARE -> {
DirectUtils.directToGameCollectionSquare(context, entrance)
}
EntranceUtils.HOST_GAME_COLLECTION_EDIT -> {
context.startActivity(GameCollectionEditActivity.getIntent(context, entrance))
EntranceConsts.HOST_GAME_COLLECTION_EDIT -> {
val activityId = uri.getQueryParameter("activity_id") ?: ""
val activityName = uri.getQueryParameter("activity_name") ?: ""
val gameId = uri.getQueryParameter("game_id") ?: ""
context.startActivity(
GameCollectionEditActivity.getIntent(
context,
activityId,
activityName,
gameId,
entrance
)
)
}
else -> {
@ -485,6 +551,13 @@ object DefaultUrlHandler {
@JvmStatic
fun transformNormalScheme(context: Context, url: String, entrance: String): Boolean {
val b = transformNewNormalScheme(context, url, entrance)
if (b) return b
return transformOldNormalScheme(context, url, entrance)
}
@JvmStatic
fun transformOldNormalScheme(context: Context, url: String, entrance: String): Boolean {
val uri = Uri.parse(url)
if (uri.host == "www.ghzs666.com"
|| uri.host == "www.ghzs.com"
@ -496,9 +569,14 @@ object DefaultUrlHandler {
uri.path?.apply {
when {
contains("game") -> {
val gameId = uri.getQueryParameter("gameId") ?: uri.pathSegments.last()
?: ""
DirectUtils.directToGameDetail(context, gameId, entrance, autoDownload = false, traceEvent = null)
val gameId = uri.getQueryParameter("gameId") ?: uri.pathSegments.last() ?: ""
DirectUtils.directToGameDetail(
context,
gameId,
entrance,
autoDownload = false,
traceEvent = null
)
}
contains("question") -> {
val questionId = split("/")[2]
@ -515,7 +593,8 @@ object DefaultUrlHandler {
var type = ""
var typeId = ""
val split =
replace("/communities", "").replace("/bbs", "").replace(".html", "").split("/".toRegex()).dropLastWhile { it.isEmpty() }
replace("/communities", "").replace("/bbs", "").replace(".html", "").split("/".toRegex())
.dropLastWhile { it.isEmpty() }
.toTypedArray()
for (text in split) {
if (TextUtils.isEmpty(communityId)) {
@ -563,6 +642,55 @@ object DefaultUrlHandler {
return false
}
@JvmStatic
fun transformNewNormalScheme(context: Context, url: String, entrance: String): Boolean {
val uri = Uri.parse(url)
if (uri.host == "www.ghzs666.com"
|| uri.host == "www.ghzs.com"
|| uri.host == "ask.ghzs.com"
|| uri.host == "m.ghzs.com"
|| uri.host == "m.ghzs666.com"
|| uri.host == "dev-bbs-mobile.ghzs.com"
) {
Utils.log(uri.path)
uri.path?.apply {
val splits = split("/")
when {
//https://m.ghzs666.com/bbs/thread-帖子ID
splits.size >= 3 && splits[1] == "bbs" && splits[2].startsWith("thread-") -> {
val articleId = splits[2].substring(7)
DirectUtils.directToCommunityArticle(
context, articleId, "",
entrance, "文章链接"
)
}
//https://m.ghzs666.com/article/文章ID
splits.size >= 3 && splits[1] == "article" -> {
val articleId = splits[2]
DirectUtils.directToArticle(context, articleId, entrance)
}
//https://m.ghzs666.com/column/专题ID
splits.size >= 3 && splits[1] == "column" -> {
val columnId = splits[2]
DirectUtils.directToSubject(context, columnId, "", entrance)
}
//https://m.ghzs666.com/zone/游戏ID
splits.size >= 3 && splits[1] == "zone" -> {
DirectUtils.directToWebView(context, url, entrance)
}
//https://m.ghzs666.com/bbs/video-视频ID
splits.size >= 3 && splits[1] == "bbs" && splits[2].startsWith("video-") -> {
val videoId = splits[2].substring(6)
DirectUtils.directToVideoDetail(context, videoId, entrance)
}
else -> return false
}
}
return true
}
return false
}
/**
* 将 url 转换为 LinkEntity (实际只有 type 和 link 两个字段,仅供日志,不保证能用)
*/

View File

@ -2,13 +2,14 @@ package com.gh.common
import com.gh.common.exposure.ExposureManager
import com.gh.common.filter.RegionSettingHelper
import com.gh.common.loghub.LoghubUtils
import com.gh.common.util.doOnMainProcessOnly
import com.gh.common.util.tryCatchInRelease
import com.gh.gamecenter.common.loghub.LoghubUtils
import com.gh.gamecenter.common.utils.doOnMainProcessOnly
import com.gh.gamecenter.common.utils.tryCatchInRelease
import com.gh.common.videolog.VideoRecordUtils
import com.gh.download.DownloadDataHelper
import com.gh.gamecenter.entity.TimeEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.common.retrofit.Response
import com.gh.gamecenter.core.runOnUiThread
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import io.reactivex.schedulers.Schedulers
@ -36,18 +37,22 @@ object FixedRateJobHelper {
// 时间校对10分钟一次
if ((mExecuteCount * CHECKER_PERIOD) % TIME_PERIOD == 0L) {
RetrofitManager.getInstance().api.time
.subscribeOn(Schedulers.io())
.subscribe(object : Response<TimeEntity>() {
override fun onResponse(response: TimeEntity?) {
val serverTime = response?.time
serverTime?.let { timeDeltaBetweenServerAndClient = it * 1000 - System.currentTimeMillis() }
.subscribeOn(Schedulers.io())
.subscribe(object : Response<TimeEntity>() {
override fun onResponse(response: TimeEntity?) {
val serverTime = response?.time
serverTime?.let {
timeDeltaBetweenServerAndClient = it * 1000 - System.currentTimeMillis()
}
})
}
})
}
// 提交曝光数据
if ((mExecuteCount * CHECKER_PERIOD) % EXPOSURE_PERIOD == 0L) {
ExposureManager.commitSavedExposureEvents(true)
runOnUiThread {
ExposureManager.commitSavedExposureEvents(true)
}
}
// 分片检测下载进度
@ -60,7 +65,9 @@ object FixedRateJobHelper {
// 提交普通 loghub 数据
if ((mExecuteCount * CHECKER_PERIOD) % LOGHUB_PERIOD == 0L) {
LoghubUtils.commitSavedLoghubEvents()
runOnUiThread {
LoghubUtils.commitSavedLoghubEvents(true)
}
}
// 更新游戏屏蔽信息

View File

@ -1,39 +0,0 @@
//package com.gh.common
//
//import android.content.BroadcastReceiver
//import android.content.Context
//import android.content.Intent
//import com.gh.common.im.ImManager
//import com.gh.gamecenter.manager.UserManager
//import com.gh.gamecenter.retrofit.RetrofitManager
//import com.halo.assistant.HaloApp
//import com.m7.imkfsdk.chat.ChatActivity
//import io.reactivex.schedulers.Schedulers
//
///**
// * 可使用 [LocalBroadcastManager] 来进行简单的模块间消息通知
// */
//
//class LocalBroadcastReceiver : BroadcastReceiver() {
//
// override fun onReceive(context: Context?, intent: Intent?) {
// intent?.let {
// when (intent.action) {
// ChatActivity.ACTION_DISMISS_FLOATING_WINDOW -> {
// ImManager.dismissFloatingWindow()
//
// RetrofitManager.getInstance().api.postImEnding(UserManager.getInstance().userId)
// .subscribeOn(Schedulers.io())
// .subscribe()
// }
//
// ChatActivity.ACTION_HIDE_UNREAD_DOT -> {
// ImManager.updateShouldShowFloatingWindowDot(false)
// }
//
// else -> return
// }
// }
// }
//
//}

View File

@ -1,117 +0,0 @@
package com.gh.common
import android.annotation.SuppressLint
import com.gh.gamecenter.entity.AliasEntity
import com.halo.assistant.HaloApp
object PushManager {
var deviceToken: String? = ""
private var mPreviousAlias: AliasEntity? = null
private var mApplication = HaloApp.getInstance().application
const val SP_PUSH_ALIAS = "push_alias"
@JvmStatic
fun init(channel: String) {
// tryWithDefaultCatch {
// //初始化友盟推送
// UMConfigure.init(mApplication, Config.UMENG_APPKEY, channel, UMConfigure.DEVICE_TYPE_PHONE, Config.UMENG_MESSAGE_SECRET)
//
// val pushAgent = PushAgent.getInstance(mApplication)
//
// runOnIoThread { registerDevice() }
//
// // 注册小米、华为和魅族通道
// MiPushRegistar.register(mApplication, Config.MIPUSH_APPID, Config.MIPUSH_APPKEY)
// HuaWeiRegister.register(mApplication)
// MeizuRegister.register(mApplication, BuildConfig.MEIZUPUSH_APPID, BuildConfig.MEIZUPUSH_APPKEY)
//
// val aliasInSp = PreferenceManager.getDefaultSharedPreferences(mApplication).getString(SP_PUSH_ALIAS, "")
// mPreviousAlias = aliasInSp?.toObject()
//
// if (mPreviousAlias == null) {
// getAndSetAlias()
// }
//
// // 完全自定义处理(透传)
// pushAgent.setPushIntentServiceClass(GHUmengNotificationService::class.java)
// }
}
private fun registerDevice() {
// PushAgent.getInstance(mApplication).register(object : IUmengRegisterCallback {
// override fun onSuccess(dToken: String) {
// //注册成功会返回device token
// deviceToken = dToken
// getAndSetAlias()
// Utils.log("deviceToken::$dToken")
// }
//
// override fun onFailure(s: String, s1: String) {
// Utils.log("deviceToken::" + "注册失败")
// }
// })
}
@SuppressLint("CheckResult")
@JvmStatic
fun getAndSetAlias() {
// if (deviceToken.isNullOrEmpty()) {
// registerDevice()
// return
// }
//
// val meta = MetaUtil.getMeta()
//
// val jsonObject = JSONObject()
// jsonObject.put("device_token", deviceToken)
// jsonObject.put("imei", meta.imei)
// jsonObject.put("android_id", meta.android_id)
// jsonObject.put("model", meta.model)
// jsonObject.put("manufacturer", meta.manufacturer)
// jsonObject.put("os", meta.os)
// jsonObject.put("os_version", meta.android_version)
// jsonObject.put("mac", meta.mac)
// jsonObject.put("gid", meta.gid)
//
// val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString())
//
// RetrofitManager.getInstance().api.getAlias(body)
// .subscribeOn(Schedulers.io())
// .subscribe(
// { setAlias(it) },
// { it.printStackTrace() }
// )
}
@JvmStatic
fun setAlias(alias: AliasEntity) {
// val pushAgent = PushAgent.getInstance(mApplication)
//
// mPreviousAlias = alias
// PreferenceManager.getDefaultSharedPreferences(mApplication).edit {
// putString(SP_PUSH_ALIAS, mPreviousAlias?.toJson())
// }
//
// pushAgent.setAlias(alias.alias, alias.aliasType) { b, s ->
// Utils.log("注册别名 $b + $s")
// }
}
@JvmStatic
fun deleteAlias() {
// val pushAgent = PushAgent.getInstance(mApplication)
//
// mPreviousAlias?.let {
// pushAgent.deleteAlias(it.alias, it.aliasType) { b, s ->
// Utils.log("删除别名 $b + $s")
// }
// }
// PreferenceManager.getDefaultSharedPreferences(mApplication).edit {
// putString(SP_PUSH_ALIAS, "")
// }
// mPreviousAlias = null
}
}

View File

@ -0,0 +1,21 @@
package com.gh.common.chain
import android.content.Context
import com.gh.download.server.BrowserInstallHelper
import com.gh.gamecenter.core.utils.EmptyCallback
import com.gh.gamecenter.entity.GameEntity
class BrowserInstallHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
BrowserInstallHelper.showBrowserInstallHintDialog(context, gameEntity.isVGame(), object : EmptyCallback {
override fun onCallback() {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
})
}
}

View File

@ -0,0 +1,18 @@
package com.gh.common.chain
import android.content.Context
import com.gh.common.dialog.CertificationDialog
import com.gh.gamecenter.entity.GameEntity
class CertificationHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
CertificationDialog.showCertificationDialog(context, gameEntity) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
}

View File

@ -0,0 +1,28 @@
package com.gh.common.chain
class ChainBuilder {
private val handlers: MutableList<ChainHandler> = ArrayList()
private var processEndCallback: ((Any?) -> Unit)? = null
fun setProcessEndCallback(callback: (Any?) -> Unit): ChainBuilder {
processEndCallback = callback
return this
}
fun addHandler(handler: ChainHandler): ChainBuilder {
handlers.add(handler)
return this
}
fun buildHandlerChain(): ChainHandler? {
for (i in handlers.indices) {
handlers[i].processEndCallback = processEndCallback
if (i + 1 < handlers.size) {
handlers[i].setNext(handlers[i + 1])
}
}
return if (handlers.isEmpty()) null else handlers[0]
}
}

View File

@ -0,0 +1,24 @@
package com.gh.common.chain
import android.content.Context
import com.gh.gamecenter.entity.GameEntity
abstract class ChainHandler {
private var next: ChainHandler? = null
var processEndCallback: ((Any?) -> Unit)? = null
fun setNext(next: ChainHandler?) {
this.next = next
}
fun getNext(): ChainHandler? {
return next
}
fun hasNext(): Boolean {
return next != null
}
abstract fun handleRequest(context: Context, gameEntity: GameEntity)
}

View File

@ -0,0 +1,21 @@
package com.gh.common.chain
import android.content.Context
import com.gh.common.util.DialogUtils
import com.gh.gamecenter.common.utils.safelyGetInRelease
import com.gh.gamecenter.entity.GameEntity
class CheckDownloadHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
val apk = gameEntity.getApk().safelyGetInRelease(0) ?: return
DialogUtils.checkDownload(context, apk.size) { isSubscribe: Boolean ->
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(isSubscribe)
}
}
}
}

View File

@ -0,0 +1,21 @@
package com.gh.common.chain
import android.content.Context
import com.gh.gamecenter.common.utils.PermissionHelper
import com.gh.gamecenter.core.utils.EmptyCallback
import com.gh.gamecenter.entity.GameEntity
class CheckStoragePermissionHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
PermissionHelper.checkStoragePermissionBeforeAction(context, object : EmptyCallback {
override fun onCallback() {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
})
}
}

View File

@ -0,0 +1,23 @@
package com.gh.common.chain
import android.content.Context
import com.gh.common.util.DownloadDialogHelper
import com.gh.gamecenter.common.utils.safelyGetInRelease
import com.gh.gamecenter.core.utils.EmptyCallback
import com.gh.gamecenter.entity.GameEntity
class DownloadDialogHelperHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
val apk = gameEntity.getApk().safelyGetInRelease(0) ?: return
DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, object : EmptyCallback {
override fun onCallback() {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
})
}
}

View File

@ -0,0 +1,19 @@
package com.gh.common.chain
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment
class GamePermissionHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
GamePermissionDialogFragment.show((context as AppCompatActivity), gameEntity, gameEntity.info) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
}

View File

@ -0,0 +1,18 @@
package com.gh.common.chain
import android.content.Context
import com.gh.common.util.DialogUtils
import com.gh.gamecenter.entity.GameEntity
class OverseaDownloadHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
DialogUtils.showOverseaDownloadDialog(context, gameEntity) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
}

View File

@ -0,0 +1,19 @@
package com.gh.common.chain
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import com.gh.common.dialog.PackageCheckDialogFragment
import com.gh.gamecenter.entity.GameEntity
class PackageCheckHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
PackageCheckDialogFragment.show((context as AppCompatActivity), gameEntity) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
}

View File

@ -0,0 +1,35 @@
package com.gh.common.chain
import android.content.Context
import com.gh.common.simulator.NewSimulatorGameManager
import com.gh.common.simulator.SimulatorGameManager
import com.gh.gamecenter.entity.GameEntity
class UpdateNewSimulatorHandler: ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
if (SimulatorGameManager.isSimulatorGame(gameEntity)) {
if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(context)) {
NewSimulatorGameManager.showUpdateNewsSimulator(context) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
else{
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
}
}
}
else{
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
}
}
}
}

View File

@ -0,0 +1,18 @@
package com.gh.common.chain
import android.content.Context
import com.gh.gamecenter.entity.GameEntity
import com.gh.vspace.VHelper
class ValidateVSpaceHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
VHelper.validateVSpaceBeforeAction(context, gameEntity, true) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
}

View File

@ -0,0 +1,18 @@
package com.gh.common.chain
import android.content.Context
import com.gh.common.util.DialogUtils
import com.gh.gamecenter.entity.GameEntity
class VersionNumberHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
DialogUtils.showVersionNumberDialog(context, gameEntity) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
}
}
}

View File

@ -1,27 +1,33 @@
package com.gh.common.constant;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import com.gh.common.util.EnvHelper;
import com.gh.common.util.GsonUtils;
import androidx.annotation.Nullable;
import com.gh.gamecenter.common.utils.DarkModeUtils;
import com.gh.gamecenter.common.utils.EnvHelper;
import com.gh.gamecenter.common.constant.Constants;
import com.gh.gamecenter.core.utils.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.core.utils.SPUtils;
import com.gh.gamecenter.entity.GameGuidePopupEntity;
import com.gh.gamecenter.entity.NewSettingsEntity;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.retrofit.BiResponse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.common.eventbus.EBReuse;
import com.gh.gamecenter.entity.SimulatorEntity;
import com.gh.gamecenter.entity.VSetting;
import com.gh.gamecenter.common.retrofit.BiResponse;
import com.gh.gamecenter.common.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.gh.vspace.VHelper;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Utils;
@ -33,8 +39,6 @@ import java.io.IOException;
import java.util.List;
import java.util.Locale;
import androidx.annotation.Nullable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
@ -44,10 +48,7 @@ public class Config {
// 这个 API_HOST 在测试包里会随着选择的环境切换,正式包里会一直保持正式 host
public static final String API_HOST = EnvHelper.getHost();
public static final String NEW_API_HOST = EnvHelper.getNewHost();
/**
* 需要配置的请使用{@link PreferenceManager#getDefaultSharedPreferences(Context)}
*/
public static final String VAPI_HOST = EnvHelper.getVHost();
// Third-Party confs
public static final String WECHAT_APPID = BuildConfig.WECHAT_APPID;
@ -59,13 +60,14 @@ public class Config {
// http://www.ghzs666.com/article/${articleId}.html
public static final String URL_ARTICLE = "http://www.ghzs666.com/article/"; // ghzs/ghzs666 统一
public static final String DEFAULT_CHANNEL = "GH_TEST3";
public static final String DEFAULT_CHANNEL_FOR_RELEASE = "GH_LOST"; // 正式包的缺省渠道,避免因渠道丢失而回落到测试渠道
private static String SETTINGS_KEY = "settingsKey";
private static final String SETTINGS_KEY = "settingsKey";
private static SettingsEntity mSettingsEntity;
private static NewSettingsEntity mNewSettingsEntity;
private static NewSettingsEntity.NightMode mNightModeSetting;
private static SimulatorEntity mNewSimulatorEntity;
private static VSetting mVSetting;
private static GameGuidePopupEntity mGameGuidePopupEntity;
private static SharedPreferences mDefaultSharedPreferences;
@ -93,13 +95,6 @@ public class Config {
return false;
}
public static String getExceptionMsg() {
return getPreferences().getString("errMsg", null);
}
public static void setExceptionMsg(String errMsg) {
SPUtils.setString(getPreferences(), "errMsg", errMsg); //先用apply(),保存不了再用commit() 9.0机型保存不了信息
}
public static boolean isShowDownload(String gameId) {
@ -125,6 +120,17 @@ public class Config {
return false;
}
/**
* 是否启用畅玩游戏
*/
public static boolean isVGameEnabled() {
if (getSettings() == null) {
return false;
}
return !"off".equals(getSettings().getGameSmooth());
}
public static boolean isShowPlugin(String gameId) {
SharedPreferences preferences = getPreferences();
@ -190,11 +196,15 @@ public class Config {
getPreferences().edit().putString(SETTINGS_KEY, GsonUtils.toJson(settingsEntity)).apply();
mSettingsEntity = settingsEntity;
// 更新 FIX_ARTICLE_KEY 状态
// 更新设置状态
mSettingsEntity.showArticleEntrance();
mSettingsEntity.showCommunityEntrance();
// 加载完设置后刷新下
PackageHelper.initList();
// 初始化畅玩相关的东西
VHelper.init(HaloApp.getInstance());
}
@Nullable
@ -212,6 +222,29 @@ public class Config {
return mSettingsEntity;
}
//新模拟器
@Nullable
public static SimulatorEntity getNewSimulatorEntitySetting() {
if (mNewSimulatorEntity != null) {
return mNewSimulatorEntity;
} else if (mNewSettingsEntity != null && mNewSettingsEntity.getSimulator() != null) {
return mNewSettingsEntity.getSimulator();
} else {
return null;
}
}
@Nullable
public static NewSettingsEntity.NightMode getNightModeSetting() {
if (mNightModeSetting != null) {
return mNightModeSetting;
} else if (mNewSettingsEntity != null && mNewSettingsEntity.getNightMode() != null) {
return mNewSettingsEntity.getNightMode();
} else {
return null;
}
}
@Nullable
public static NewSettingsEntity getNewSettingsEntity() {
if (mNewSettingsEntity == null) {
@ -227,6 +260,21 @@ public class Config {
return mNewSettingsEntity;
}
@Nullable
public static VSetting getVSettingEntity() {
if (mVSetting == null) {
try {
String json = SPUtils.getString(Constants.SP_V_SETTINGS);
if (!TextUtils.isEmpty(json)) {
mVSetting = GsonUtils.fromJson(json, VSetting.class);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return mVSetting;
}
@Nullable
public static GameGuidePopupEntity getGameGuidePopupEntity() {
return mGameGuidePopupEntity;
@ -255,7 +303,7 @@ public class Config {
public static SharedPreferences getPreferences() {
if (mDefaultSharedPreferences == null) {
mDefaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
mDefaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
}
return mDefaultSharedPreferences;
@ -270,13 +318,6 @@ public class Config {
return false;
}
public static boolean isGameDomeSwitchOpen() {
return getSettings() != null && getSettings().getGameDomeSwitch().equals("on");
}
public static boolean isPermissionPopupSwitchOpen() {
return getSettings() != null && getSettings().getPermissionPopupSwitch().equals("on");
}
public static void fixHideFunction() {
SharedPreferences preferences = PreferenceManager.
getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
@ -323,10 +364,51 @@ public class Config {
@Override
public void onSuccess(NewSettingsEntity data) {
mNewSettingsEntity = data;
if (mNightModeSetting != null) {
mNewSettingsEntity.setNightMode(mNightModeSetting);
}
SPUtils.setString(Constants.SP_NEW_SETTINGS, GsonUtils.toJson(data));
}
});
if (mVSetting == null) {
RetrofitManager.getInstance()
.getVApi().getSettings(BuildConfig.VERSION_NAME)
.subscribeOn(Schedulers.io())
.subscribe(new BiResponse<VSetting>() {
@Override
public void onSuccess(VSetting data) {
mVSetting = data;
SPUtils.setString(Constants.SP_V_SETTINGS, GsonUtils.toJson(data));
}
});
}
if (mNightModeSetting == null && mNewSimulatorEntity == null) {
RetrofitManager.getInstance()
.getNewApi().getNewSettings(PackageUtils.getGhVersionName(), channel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BiResponse<NewSettingsEntity>() {
@Override
public void onSuccess(NewSettingsEntity data) {
mNightModeSetting = data.getNightMode();
mNewSimulatorEntity = data.getSimulator();
if (HaloApp.getInstance().isNewForThisVersion && mNightModeSetting != null && mNightModeSetting.getInstall()) {
DarkModeUtils.INSTANCE.updateFollowSystemDarkModeToSp(true);
DarkModeUtils.INSTANCE.updateAppDarkModeStatusToSp(true);
DarkModeUtils.INSTANCE.initDarkMode();
}
if (mNewSettingsEntity != null) {
mNewSettingsEntity.setSimulator(mNewSimulatorEntity);
mNewSettingsEntity.setNightMode(mNightModeSetting);
SPUtils.setString(Constants.SP_NEW_SETTINGS, GsonUtils.toJson(data));
}
}
});
}
RetrofitManager.getInstance()
.getApi().getGameGuidePopup(Build.MANUFACTURER, Build.VERSION.RELEASE, Build.MODEL, channel, BuildConfig.VERSION_NAME)
.subscribeOn(Schedulers.io())

View File

@ -13,10 +13,10 @@ import android.widget.PopupWindow
import androidx.core.content.ContextCompat
import androidx.databinding.BindingAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import com.gh.base.OnViewClickListener
import com.gh.common.util.dip2px
import com.gh.common.util.toDrawable
import com.gh.common.view.BugFixedPopupWindow
import com.gh.gamecenter.common.callback.OnViewClickListener
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.toDrawable
import com.gh.gamecenter.common.view.BugFixedPopupWindow
import com.gh.gamecenter.R
import com.gh.gamecenter.databinding.KaifuAddItemBinding
import com.gh.gamecenter.databinding.LayoutAddKaifuPopupBinding
@ -67,7 +67,7 @@ object AddKaiFuBindingAdapter {
binding.kaifuAddServerName.hint = "点击填写"
}
}
binding.kaifuAddFirstName.addTextChangedListener(object :TextWatcher{
binding.kaifuAddFirstName.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
@ -77,7 +77,7 @@ object AddKaiFuBindingAdapter {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (!s.isNullOrEmpty()){
if (!s.isNullOrEmpty()) {
popupWindow?.dismiss()
}
}
@ -87,8 +87,8 @@ object AddKaiFuBindingAdapter {
})
if (i == list.size - 1) {
binding.kaifuAddTime.background = R.drawable.bg_add_kaifu_bottom_left.toDrawable()
binding.kaifuAddServerName.background = R.drawable.bg_add_kaifu_bottom_right.toDrawable()
binding.kaifuAddTime.background = R.drawable.bg_add_kaifu_bottom_left.toDrawable(view.context)
binding.kaifuAddServerName.background = R.drawable.bg_add_kaifu_bottom_right.toDrawable(view.context)
}
}
}
@ -104,12 +104,14 @@ object AddKaiFuBindingAdapter {
val format = SimpleDateFormat(pattern, Locale.CHINA)
view.setText(format.format(time * 1000))
if (position == 0) {
view.append(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Html.fromHtml(
String.format(
"<font color='#2496FF'>%1\$s</font>",
"&nbsp+"
), Html.FROM_HTML_MODE_LEGACY
) else Html.fromHtml(String.format("<font color='#2496FF'>%1\$s</font>", "&nbsp+")))
view.append(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Html.fromHtml(
String.format(
"<font color='#2496FF'>%1\$s</font>",
"&nbsp+"
), Html.FROM_HTML_MODE_LEGACY
) else Html.fromHtml(String.format("<font color='#2496FF'>%1\$s</font>", "&nbsp+"))
)
}
}
}

View File

@ -19,55 +19,65 @@ import androidx.core.content.ContextCompat;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.OnViewClickListener;
import com.gh.common.chain.BrowserInstallHandler;
import com.gh.common.chain.CertificationHandler;
import com.gh.common.chain.ChainBuilder;
import com.gh.common.chain.ChainHandler;
import com.gh.common.chain.CheckDownloadHandler;
import com.gh.common.chain.DownloadDialogHelperHandler;
import com.gh.common.chain.GamePermissionHandler;
import com.gh.common.chain.OverseaDownloadHandler;
import com.gh.common.chain.PackageCheckHandler;
import com.gh.common.chain.ValidateVSpaceHandler;
import com.gh.common.chain.VersionNumberHandler;
import com.gh.common.constant.Config;
import com.gh.common.dialog.CertificationDialog;
import com.gh.common.dialog.PackageCheckDialogFragment;
import com.gh.common.exposure.ExposureEvent;
import com.gh.common.filter.RegionSetting;
import com.gh.common.filter.RegionSettingHelper;
import com.gh.common.history.HistoryHelper;
import com.gh.common.repository.ReservationRepository;
import com.gh.common.simulator.SimulatorDownloadManager;
import com.gh.common.simulator.SimulatorGameManager;
import com.gh.common.util.CheckLoginUtils;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.DownloadDialogHelper;
import com.gh.common.util.ExtensionsKt;
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.PackageInstaller;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.PlatformUtils;
import com.gh.common.util.RealNameHelper;
import com.gh.common.util.ReservationHelper;
import com.gh.common.view.DownloadProgressBar;
import com.gh.common.view.DrawableView;
import com.gh.common.view.DownloadButton;
import com.gh.common.view.GameIconView;
import com.gh.download.DownloadManager;
import com.gh.download.dialog.DownloadDialog;
import com.gh.download.server.BrowserInstallHelper;
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.common.baselist.LoadStatus;
import com.gh.gamecenter.common.callback.OnViewClickListener;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.ImageUtils;
import com.gh.gamecenter.common.utils.DarkModeUtils;
import com.gh.gamecenter.common.view.DrawableView;
import com.gh.gamecenter.core.utils.DisplayUtils;
import com.gh.gamecenter.core.utils.MtaHelper;
import com.gh.gamecenter.core.utils.NumberUtils;
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.common.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.common.eventbus.EBReuse;
import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment;
import com.gh.gamecenter.manager.PackagesManager;
import com.gh.gamecenter.qa.entity.CommunityVideoEntity;
import com.gh.vspace.VDownloadManagerActivity;
import com.gh.vspace.VHelper;
import com.lightgame.download.DownloadEntity;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.Utils;
@ -331,7 +341,7 @@ public class BindingAdapters {
}
// 大图下的进度条
public static void setDownloadButton(DownloadProgressBar progressBar,
public static void setDownloadButton(DownloadButton progressBar,
GameEntity gameEntity,
ExposureEvent traceEvent,
@Nullable View.OnClickListener clickCallBack,
@ -354,62 +364,77 @@ public class BindingAdapters {
// 点击事件
progressBar.setOnClickListener(v -> {
if (clickCallBack != null) clickCallBack.onClick(v);
switch (progressBar.getDownloadType()) {
switch (progressBar.getButtonStyle()) {
case DOWNLOADING_PLUGIN:
case DOWNLOADING_NORMAL:
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(v.getContext(),
gameEntity.getApk().get(0).getUrl(), entrance);
v.getContext().startActivity(intent);
if (gameEntity.isVGame()) {
v.getContext().startActivity(VDownloadManagerActivity.getIntent(v.getContext(), true));
} else {
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);
DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.getUrl());
if (gameEntity.getSimulator() != null) {
boolean isInstalled = PackageUtils.isInstalledFromAllPackage(v.getContext(), gameEntity.getSimulator().getApk().getPackageName());
if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(gameEntity) && !isInstalled) {
SimulatorDownloadManager.getInstance().showDownloadDialog(v.getContext(), gameEntity.getSimulator(),
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.getId(), gameEntity.getName(), null);
return;
final RegionSetting.GameH5Download gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(gameEntity.getId());
if (gameH5Download != null) {
DialogUtils.showGameH5DownloadDialog(v.getContext(), gameEntity, gameH5Download);
} else {
if (gameEntity.getApk().size() == 1) {
ApkEntity apk = gameEntity.getApk().get(0);
DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.getUrl());
if (gameEntity.getSimulator() != null) {
boolean isInstalled = PackageUtils.isInstalledFromAllPackage(v.getContext(), gameEntity.getSimulator().getApk().getPackageName());
if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(gameEntity) && !isInstalled) {
SimulatorDownloadManager.getInstance().showDownloadDialog(v.getContext(), gameEntity.getSimulator(),
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.getId(), gameEntity.getName(), null);
return;
}
}
ChainBuilder builder = new ChainBuilder();
builder.addHandler(new ValidateVSpaceHandler());
builder.addHandler(new GamePermissionHandler());
builder.addHandler(new BrowserInstallHandler());
builder.addHandler(new PackageCheckHandler());
builder.addHandler(new DownloadDialogHelperHandler());
builder.addHandler(new CertificationHandler());
builder.addHandler(new VersionNumberHandler());
builder.addHandler(new OverseaDownloadHandler());
builder.addHandler(new CheckDownloadHandler());
builder.setProcessEndCallback(o -> {
download(progressBar, gameEntity, traceEvent, (boolean) o, entrance, location);
return null;
});
final ChainHandler chainHandler = builder.buildHandlerChain();
if (chainHandler != null) {
chainHandler.handleRequest(v.getContext(), gameEntity);
}
} else {
ChainBuilder builder = new ChainBuilder();
builder.addHandler(new GamePermissionHandler());
builder.addHandler(new CertificationHandler());
builder.addHandler(new VersionNumberHandler());
builder.setProcessEndCallback(o -> {
DownloadDialog.showDownloadDialog(
v.getContext(),
gameEntity,
traceEvent,
entrance,
location + ":" + gameEntity.getName());
return null;
});
final ChainHandler chainHandler = builder.buildHandlerChain();
if (chainHandler != null) {
chainHandler.handleRequest(v.getContext(), gameEntity);
}
}
RealNameHelper.checkIfAuth(v.getContext(), gameEntity, () -> {
GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> {
BrowserInstallHelper.showBrowserInstallHintDialog(v.getContext(), () -> {
PackageCheckDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, () -> {
DownloadDialogHelper.findAvailableDialogAndShow(v.getContext(), gameEntity, apk, () -> {
CertificationDialog.showCertificationDialog(v.getContext(), gameEntity, () -> {
DialogUtils.showVersionNumberDialog(v.getContext(), gameEntity, () -> {
DialogUtils.showOverseaDownloadDialog(v.getContext(), gameEntity, () -> {
DialogUtils.checkDownload(v.getContext(), apk.getSize(),
isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location));
});
});
});
});
});
});
});
});
} else {
RealNameHelper.checkIfAuth(v.getContext(), gameEntity, () -> {
GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> {
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:
@ -428,7 +453,12 @@ public class BindingAdapters {
}
return;
}
DataUtils.onGameLaunchEvent(v.getContext(), gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location);
if (gameEntity.isVGame()) {
VHelper.installOrLaunch((AppCompatActivity) v.getContext(), gameEntity.getApk().get(0).getPackageName());
return;
}
PackageUtils.launchApplicationByPackageName(v.getContext(), gameEntity.getApk().get(0).getPackageName());
} else {
DownloadDialog.showDownloadDialog(
@ -442,20 +472,25 @@ public class BindingAdapters {
case INSTALL_PLUGIN:
case INSTALL_NORMAL:
if (gameEntity.getApk().size() == 1) {
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshotByUrl(gameEntity.getApk().get(0).getUrl());
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity);
String packageName = gameEntity.getApk().get(0).getPackageName();
if (gameEntity.isVGame()) {
VHelper.installOrLaunch(v.getContext(), packageName);
return;
}
if (downloadEntity != null) {
PackageInstaller.install(v.getContext(), downloadEntity);
}
}
break;
case RESERVABLE:
RealNameHelper.checkIfAuth(v.getContext(), gameEntity, () -> {
GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> {
CheckLoginUtils.checkLogin(progressBar.getContext(), "", () -> {
ReservationHelper.reserve(v.getContext(), gameEntity.getId(), () -> {
LogUtils.logReservation(gameEntity, traceEvent);
updateReservation(progressBar, gameEntity);
});
GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> {
CheckLoginUtils.checkLogin(progressBar.getContext(), "", () -> {
ReservationHelper.reserve(v.getContext(), gameEntity.getId(), () -> {
LogUtils.logReservation(gameEntity, traceEvent);
updateReservation(progressBar, gameEntity);
});
});
});
@ -499,10 +534,10 @@ public class BindingAdapters {
if (gameEntity.isReservable()) {
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) {
progressBar.setText("预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVABLE);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVABLE);
} else {
progressBar.setText("已预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVED);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVED);
}
return;
}
@ -517,17 +552,17 @@ public class BindingAdapters {
} else {
progressBar.setText("查看");
}
progressBar.setDownloadType(DownloadProgressBar.DownloadType.H5_GAME);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.H5_GAME);
} else {
if (offStatus != null && "dialog".equals(offStatus)) {
progressBar.setText("查看");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.NONE);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.NONE);
} else if ("updating".equals(offStatus)) {
progressBar.setText("更新中");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.UPDATING);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.UPDATING);
} else {
progressBar.setText("暂无");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.NONE);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.NONE);
}
}
@ -535,14 +570,14 @@ public class BindingAdapters {
String status = GameUtils.getDownloadBtnText(progressBar.getContext(), gameEntity, PluginLocation.only_game);
switch (status) {
case "插件化":
progressBar.setDownloadType(DownloadProgressBar.DownloadType.PLUGIN);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.PLUGIN);
break;
case "打开":
case "启动":
progressBar.setDownloadType(DownloadProgressBar.DownloadType.LAUNCH_OR_OPEN);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN);
break;
default:
progressBar.setDownloadType(DownloadProgressBar.DownloadType.NORMAL);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.NORMAL);
break;
}
progressBar.setText(status);
@ -550,7 +585,7 @@ public class BindingAdapters {
// 显示下载过程状态
if (gameEntity.getApk().size() == 1) {
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshotByUrl(gameEntity.getApk().get(0).getUrl());
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity);
if (downloadEntity != null) {
progressBar.setProgress((int) (downloadEntity.getPercent() * 10));
switch (downloadEntity.getStatus()) {
@ -561,18 +596,18 @@ public class BindingAdapters {
case waiting:
progressBar.setText(R.string.downloading);
if (downloadEntity.isPluggable() && PackagesManager.INSTANCE.isInstalled(downloadEntity.getPackageName())) {
progressBar.setDownloadType(DownloadProgressBar.DownloadType.DOWNLOADING_PLUGIN);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN);
} else {
progressBar.setDownloadType(DownloadProgressBar.DownloadType.DOWNLOADING_NORMAL);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL);
}
break;
case done:
progressBar.setText(R.string.install);
if (downloadEntity.isPluggable()
&& PackagesManager.INSTANCE.isInstalled(downloadEntity.getPackageName())) {
progressBar.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_PLUGIN);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_PLUGIN);
} else {
progressBar.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_NORMAL);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL);
}
break;
case cancel:
@ -580,6 +615,8 @@ public class BindingAdapters {
case notfound:
case uncertificated:
case unqualified:
case unavailable:
case banned:
break;
default:
break;
@ -592,9 +629,9 @@ public class BindingAdapters {
* 当页面完全重建时若存在重建的DialogFragment则需要手动恢复该DialogFragment之前配置的回调(因为DialogFragment重建时只会从arguments中获取之前的配置内容
* 而arguments无法传递回调)或者dismiss该DialogFragment
*/
private static void restoreDialogFragment(DownloadProgressBar progressBar) {
private static void restoreDialogFragment(DownloadButton progressBar) {
GamePermissionDialogFragment gamePermissionDialogFragment =
((GamePermissionDialogFragment) ((AppCompatActivity) progressBar.getContext()).getSupportFragmentManager().findFragmentByTag(GamePermissionDialogFragment.class.getSimpleName()));
((GamePermissionDialogFragment) ((AppCompatActivity) progressBar.getContext()).getSupportFragmentManager().findFragmentByTag(GamePermissionDialogFragment.class.getName()));
if (gamePermissionDialogFragment != null) {
gamePermissionDialogFragment.dismissAllowingStateLoss();
}
@ -618,28 +655,28 @@ public class BindingAdapters {
}*/
private static void updateReservation(DownloadProgressBar progressBar, GameEntity gameEntity) {
private static void updateReservation(DownloadButton progressBar, GameEntity gameEntity) {
// 显示预约
if (gameEntity.isReservable()) {
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) {
progressBar.setText("预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVABLE);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVABLE);
} else {
progressBar.setText("已预约");
progressBar.setDownloadType(DownloadProgressBar.DownloadType.RESERVED);
progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVED);
}
}
}
// 开始下载
private static void download(DownloadProgressBar progressBar,
private static void download(DownloadButton progressBar,
GameEntity gameEntity,
ExposureEvent traceEvent,
boolean isSubscribe,
String entrance,
String location) {
String str = progressBar.getText();
String str = progressBar.getText().toString();
String method;
if (str.contains("更新")) {
method = "更新";
@ -651,8 +688,6 @@ 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(), entrance, "下载开始", method);
DownloadManager.createDownload(progressBar.getContext(),
apkEntity,
gameEntity,
@ -663,8 +698,8 @@ public class BindingAdapters {
traceEvent);
progressBar.setProgress(0);
progressBar.setDownloadType("插件化".equals(method) ?
DownloadProgressBar.DownloadType.DOWNLOADING_PLUGIN : DownloadProgressBar.DownloadType.DOWNLOADING_NORMAL);
progressBar.setButtonStyle("插件化".equals(method) ?
DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN : DownloadButton.ButtonStyle.DOWNLOADING_NORMAL);
} else {
Utils.toast(progressBar.getContext(), msg);
}
@ -695,15 +730,16 @@ public class BindingAdapters {
tagStyle.add(typeTag);
} else {
TagStyleEntity typeTag = new TagStyleEntity();
boolean isDarkModeOn = DarkModeUtils.INSTANCE.isDarkModeOn(layout.getContext());
typeTag.setName(test.getType() != null ? test.getType() : "");
typeTag.setBackground("FFF3E0");
typeTag.setColor("FA8500");
typeTag.setBackground("1AFFA142");
typeTag.setColor(isDarkModeOn ? "EB9238" : "FFA142");
tagStyle.add(typeTag);
TagStyleEntity timeTag = new TagStyleEntity();
timeTag.setName(GameViewUtils.getGameTestDate(test.getStart()));
timeTag.setBackground("E0FFF9");
timeTag.setColor("00A887");
timeTag.setBackground("1A06CEA8");
timeTag.setColor(isDarkModeOn ? "07A385" : "06CEA8");
tagStyle.add(timeTag);
}
} else {
@ -776,7 +812,7 @@ public class BindingAdapters {
public static void setCommunityVideoDuration(TextView mVideoDuration, List<CommunityVideoEntity> videos) {
if (videos != null && videos.size() > 0) {
CommunityVideoEntity videoEntity = videos.get(0);
mVideoDuration.setBackground(DrawableView.getOvalDrawable(R.color.black_alpha_80, 999F));
mVideoDuration.setBackground(DrawableView.getOvalDrawable(R.color.black_alpha_50, 999F));
mVideoDuration.setText(videoEntity.getDuration());
mVideoDuration.setVisibility(View.VISIBLE);
} else {

View File

@ -6,13 +6,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import com.gh.base.fragment.BaseDialogFragment
import com.gh.common.util.DirectUtils
import com.gh.common.util.EntranceUtils
import com.gh.common.util.SpanBuilder
import com.gh.common.util.dip2px
import com.gh.common.view.CustomLinkMovementMethod
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.fragment.BaseDialogFragment
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.view.CustomLinkMovementMethod
import com.gh.gamecenter.core.utils.SpanBuilder
import com.gh.gamecenter.databinding.DialogApplyModeratorBinding
@ -27,7 +27,7 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() {
requireArguments().run {
mGroupNumber = getString(KEY_GROUP_NUMBER) ?: ""
mGroupKey = getString(KEY_GROUP_KEY) ?: ""
mParentTag = getString(EntranceUtils.KEY_PARENT_TAG) ?: ""
mParentTag = getString(EntranceConsts.KEY_PARENT_TAG) ?: ""
}
}
@ -45,7 +45,13 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() {
val startText = "版主考核群:"
val text = "$startText$mGroupNumber\n感谢你对论坛建设的支持\n请加入版主考核群并联系群主进行版主资格考核"
binding.desTv.text = SpanBuilder(text)
.click(startText.length, startText.length + mGroupNumber.length, R.color.theme_font,true) {
.click(
requireContext(),
startText.length,
startText.length + mGroupNumber.length,
R.color.theme_font,
true
) {
DirectUtils.directToQqGroup(
requireContext(),
mGroupKey
@ -83,11 +89,11 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() {
arguments = Bundle().apply {
putString(KEY_GROUP_NUMBER, number)
putString(KEY_GROUP_KEY, key)
putString(EntranceUtils.KEY_PARENT_TAG, tag)
putString(EntranceConsts.KEY_PARENT_TAG, tag)
}
}.show(
activity.supportFragmentManager,
PrivacyDialogFragment::class.java.simpleName
ApplyModeratorDialogFragment::class.java.name
)
}
}

View File

@ -14,22 +14,31 @@ 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.gamecenter.common.avoidcallback.AvoidOnResultManager
import com.gh.gamecenter.common.avoidcallback.Callback
import com.gh.gamecenter.common.constant.Constants
import com.gh.common.util.*
import com.gh.gamecenter.R
import com.gh.gamecenter.ShellActivity
import com.gh.gamecenter.common.callback.ConfirmListener
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.core.utils.GsonUtils
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.entity.AuthDialogEntity
import com.gh.gamecenter.entity.AuthDialogLevel
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.login.user.UserManager
import com.google.gson.reflect.TypeToken
import com.halo.assistant.fragment.user.UserInfoEditFragment
import com.lightgame.utils.AppManager
class CertificationDialog(context: Context, private val authDialogEntity: AuthDialogEntity, val gameId: String, val listener: DialogUtils.ConfirmListener) :
Dialog(context, R.style.GhAlertDialog) {
class CertificationDialog(
context: Context,
private val authDialogEntity: AuthDialogEntity,
val gameId: String,
val listener: ConfirmListener
) :
Dialog(context, R.style.GhAlertDialog) {
private lateinit var view: View
private lateinit var detailedDesTv: TextView
@ -115,8 +124,10 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi
private fun gotoLoginPage() {
val currentActivity = AppManager.getInstance().currentActivity() ?: return
CheckLoginUtils.checkLogin(currentActivity as AppCompatActivity,
null, true, "实名认证弹窗") {
CheckLoginUtils.checkLogin(
currentActivity as AppCompatActivity,
null, true, "实名认证弹窗"
) {
if (UserManager.getInstance().isAuth) {
listener.onConfirm()
dismiss()
@ -134,7 +145,7 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi
context,
ShellActivity.Type.REAL_NAME_INFO,
).apply {
putExtra(EntranceUtils.KEY_GAME_ID, gameId)
putExtra(EntranceConsts.KEY_GAME_ID, gameId)
}, object : Callback {
override fun onActivityResult(resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK && data != null) {
@ -152,7 +163,7 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi
companion object {
@JvmStatic
fun showCertificationDialog(context: Context, game: GameEntity, listener: DialogUtils.ConfirmListener) {
fun showCertificationDialog(context: Context, game: GameEntity, listener: ConfirmListener) {
//1.先判断是否登录 是执行2 否执行3
//2.判断是否实名认证 是终止 否执行3
//3.判断是否需要弹出认证弹窗接口
@ -168,7 +179,7 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi
}
@SuppressLint("CheckResult")
private fun authDialog(context: Context, game: GameEntity, listener: DialogUtils.ConfirmListener) {
private fun authDialog(context: Context, game: GameEntity, listener: ConfirmListener) {
var authDialog: AuthDialogEntity? = null
if (game.authDialog != null) {
authDialog = game.authDialog

View File

@ -8,7 +8,6 @@ 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
@ -19,10 +18,14 @@ 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.gamecenter.common.constant.Constants
import com.gh.download.DownloadManager
import com.gh.gamecenter.R
import com.gh.gamecenter.core.utils.GsonUtils
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.common.utils.countDownTimer
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.common.utils.ImageUtils
import com.gh.gamecenter.databinding.DialogDeviceRemindBinding
import com.gh.gamecenter.entity.DeviceDialogEntity
import com.gh.gamecenter.entity.GameEntity
@ -37,7 +40,8 @@ import java.lang.ref.WeakReference
/**
* 设备提醒弹窗
*/
class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val gameEntity: GameEntity) : Dialog(context, R.style.GhAlertDialog) {
class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val gameEntity: GameEntity) :
Dialog(context, R.style.GhAlertDialog) {
private val mBinding: DialogDeviceRemindBinding by lazy { DialogDeviceRemindBinding.inflate(layoutInflater) }
private var currentPage = 0
private var mSlideLooperInterval = 3000L
@ -49,8 +53,7 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
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)
val autoInstall = SPUtils.getBoolean(AUTO_INSTALL_SP_KEY, true)
if (autoInstall) {
dismiss()
}
@ -76,7 +79,8 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
val type = object : TypeToken<List<DeviceDialogEntity>>() {}.type
val entities = GsonUtils.gson.fromJson<List<DeviceDialogEntity>>(datas, type)
//1.判断设备是否匹配
val entity = entities.find { it.manufacturer.toLowerCase().startsWith(Build.MANUFACTURER.toLowerCase()) }
val entity =
entities.find { it.manufacturer.toLowerCase().startsWith(Build.MANUFACTURER.toLowerCase()) }
?: return Pair(false, null)
//2.判断游戏不含剔除标签
gameEntity.tagStyle.forEach {
@ -187,7 +191,9 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
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)) {}
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

View File

@ -10,18 +10,16 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.text.HtmlCompat
import com.gh.base.fragment.BaseDialogFragment
import com.gh.gamecenter.common.base.fragment.BaseDialogFragment
import com.gh.common.util.DirectUtils
import com.gh.common.util.dip2px
import com.gh.common.util.toColor
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.toColor
import com.gh.gamecenter.R
import com.gh.gamecenter.databinding.DialogGameOffServiceBinding
import com.gh.gamecenter.entity.GameEntity
// 游戏关闭下载弹窗
class GameOffServiceDialogFragment
// : BaseTrackableDialogFragment()
: BaseDialogFragment() {
class GameOffServiceDialogFragment : BaseDialogFragment() {
private var mDialog: GameEntity.Dialog? = null
private var mBinding: DialogGameOffServiceBinding? = null
@ -33,9 +31,9 @@ class GameOffServiceDialogFragment
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return DialogGameOffServiceBinding
.inflate(inflater)
.apply { mBinding = this }
.root
.inflate(inflater)
.apply { mBinding = this }
.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -54,16 +52,19 @@ class GameOffServiceDialogFragment
notEmptySite.forEachIndexed { index, site ->
val siteTv = TextView(context)
siteTv.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply {
siteTv.layoutParams = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
topMargin = 24F.dip2px()
if (index == notEmptySite.size - 1) bottomMargin = 8F.dip2px()
}
siteTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14F)
siteTv.setTextColor(R.color.theme_font.toColor())
siteTv.setTextColor(R.color.theme_font.toColor(requireContext()))
siteTv.text = site.text
siteTv.paintFlags = siteTv.paintFlags or Paint.UNDERLINE_TEXT_FLAG
siteTv.setOnClickListener {
// MtaHelper.onEvent("游戏下载状态按钮", getKey(), site.text)
// MtaHelper.onEvent("游戏下载状态按钮", getKey(), site.text)
DirectUtils.directToWebView(requireContext(), site.url, "(关闭下载弹窗)")
dismissAllowingStateLoss()
}
@ -78,14 +79,6 @@ class GameOffServiceDialogFragment
return super.onCreateDialog(savedInstanceState).apply { setCanceledOnTouchOutside(true) }
}
// override fun getEvent(): String {
// return "游戏下载状态按钮"
// }
//
// override fun getKey(): String {
// return "查看详情弹窗"
// }
companion object {
const val KEY_DIALOG = "dialog"

View File

@ -13,20 +13,25 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import com.airbnb.lottie.LottieAnimationView
import com.gh.common.constant.Config
import com.gh.common.constant.Constants
import com.gh.common.util.*
import com.gh.common.util.PermissionHelper.INSTALL_PERMISSION_CODE
import com.gh.common.xapk.XapkInstaller
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.fragment.BaseDialogFragment
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.utils.PermissionHelper
import com.gh.gamecenter.common.utils.PermissionHelper.INSTALL_PERMISSION_CODE
import com.gh.gamecenter.common.utils.getExtension
import com.gh.gamecenter.common.utils.goneIf
import com.gh.gamecenter.core.utils.SPUtils
import com.lightgame.download.DownloadEntity
import com.lightgame.utils.Utils
import kotlin.random.Random
class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
class InstallPermissionDialogFragment : BaseDialogFragment() {
lateinit var mView: View
var isXapk = false
var url: String = ""
var mCallBack: (() -> Unit)? = null
var mCallBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mView = inflater.inflate(R.layout.dialog_install_permission, null, false)
@ -54,18 +59,15 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
}
closeTv.setOnClickListener {
MtaHelper.onEvent(getEvent(), getKey(), "文案样式_点击以后再说")
if (isXapk) {
mCallBack?.invoke()
mCallBack?.invoke(false)
}
dismiss()
}
closeIv.setOnClickListener {
MtaHelper.onEvent(getEvent(), getKey(), "图标样式_点击关闭")
dismiss()
}
activateTv.setOnClickListener {
MtaHelper.onEvent(getEvent(), getKey(), if (randomNumber == 0) "文案样式_点击立即开启" else "图标样式_点击立即开启")
PermissionHelper.toInstallPermissionSetting(requireActivity())
if (isXapk) {
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, requireActivity().javaClass.name)
@ -77,44 +79,47 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) {
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "")
SPUtils.setString(Constants.SP_XAPK_URL, "")
mCallBack?.invoke()
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "")
SPUtils.setString(Constants.SP_XAPK_URL, "")
}
mCallBack?.invoke(true)
dismiss()
}
}
override fun getEvent(): String = "安装引导弹窗"
override fun getKey(): String = "引导弹窗"
companion object {
@JvmStatic
fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: (() -> Unit)?) {
fun show(
activity: AppCompatActivity,
downloadEntity: DownloadEntity,
callBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)?
) {
val isXapk = XapkInstaller.XAPK_EXTENSION_NAME == downloadEntity.path.getExtension()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
callBack?.invoke()
callBack?.invoke(false)
return
}
val haveInstallPermission = activity.packageManager.canRequestPackageInstalls()
if (haveInstallPermission) {
callBack?.invoke()
callBack?.invoke(false)
return
}
if (isXapk) {
val xapkUnzipVersions = Config.getSettings()?.permissionPopupAppliedVersions?.xapkUnzip
if (xapkUnzipVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) {
callBack?.invoke()
callBack?.invoke(false)
return
}
} else {
val installVersions = Config.getSettings()?.permissionPopupAppliedVersions?.install
if (installVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) {
callBack?.invoke()
callBack?.invoke(false)
return
}
}
var installPermissionDialogFragment = activity.supportFragmentManager.findFragmentByTag(InstallPermissionDialogFragment::class.java.simpleName) as? InstallPermissionDialogFragment
var installPermissionDialogFragment =
activity.supportFragmentManager.findFragmentByTag(InstallPermissionDialogFragment::class.java.name) as? InstallPermissionDialogFragment
if (installPermissionDialogFragment != null) {
installPermissionDialogFragment.mCallBack = callBack
installPermissionDialogFragment.isXapk = isXapk
@ -128,7 +133,10 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
this.isXapk = isXapk
this.url = downloadEntity.url
}
installPermissionDialogFragment.show(activity.supportFragmentManager, InstallPermissionDialogFragment::class.java.simpleName)
installPermissionDialogFragment.show(
activity.supportFragmentManager,
InstallPermissionDialogFragment::class.java.name
)
}
}
}

View File

@ -0,0 +1,172 @@
package com.gh.common.dialog
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextPaint
import android.text.style.ClickableSpan
import android.view.*
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentTransaction
import com.gh.common.util.DirectUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.common.base.fragment.BaseDialogFragment
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.view.CustomLinkMovementMethod
import com.gh.gamecenter.databinding.DialogPrivacyProtocolNewBinding
import com.gh.gamecenter.entity.DialogEntity
import splitties.bundle.put
class NewPrivacyPolicyDialogFragment : BaseDialogFragment() {
private var mCallBack: ((isSuccess: Boolean) -> Unit)? = null
private val mBinding by lazy { DialogPrivacyProtocolNewBinding.inflate(layoutInflater) }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return mBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
updateView()
}
private fun updateView() {
val contentText = SpannableStringBuilder(
"1.您可以通过《光环助手隐私政策》以及《儿童隐私保护声明》,了解我们如何收集、使用、存储、保护、对外提供您的个人信息以及您享有的权利\n" +
"2.您可以通过《接入第三方SDK目录》了解本产品接入的第三方SDK的具体信息\n" +
"3.您可以通过《应用权限列表》了解权限申请与使用情况说明\n" +
"4.如果您是14周岁以下的未成年人您需要和您监护人一起仔细阅读《儿童隐私保护声明》并在征得您监护人同意后使用我们的产品、服务或向我们提供信息"
)
val privacyPolicyText = "《光环助手隐私政策》"
val childrenPrivacyPolicyText = "《儿童隐私保护声明》"
val thirdPartySdkText = "《接入第三方SDK目录》"
val permissionListText = "《应用权限列表》"
val hypertextList = arrayListOf(
privacyPolicyText,
childrenPrivacyPolicyText,
thirdPartySdkText,
permissionListText
)
val positionListPairList = arrayListOf<Pair<Int, Int>>()
for (hypertext in hypertextList) {
var start = 0
var index = 0
while (index != -1) {
index = contentText.indexOf(hypertext, start)
start = index + hypertext.length
if (index != -1) {
positionListPairList.add(Pair(index, start))
}
}
}
for (hypertextPositionPair in positionListPairList) {
contentText.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
val privacyPolicyUrl = requireContext().getString(R.string.privacy_policy_url)
val childrenPrivacyPolicyUrl = requireContext().getString(R.string.children_policy_url)
val thirdPartySdkUrl = requireContext().getString(R.string.sdk_list_url)
val permissionListUrl = requireContext().getString(R.string.permission_and_usage_url)
val selectedUrl =
when (contentText.substring(hypertextPositionPair.first, hypertextPositionPair.second)) {
privacyPolicyText -> privacyPolicyUrl
childrenPrivacyPolicyText -> childrenPrivacyPolicyUrl
thirdPartySdkText -> thirdPartySdkUrl
permissionListText -> permissionListUrl
else -> ""
}
DirectUtils.directToExternalBrowser(requireContext(), selectedUrl)
}
}, hypertextPositionPair.first, hypertextPositionPair.second, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
mBinding.contentTv.movementMethod = CustomLinkMovementMethod.getInstance()
mBinding.contentTv.text = contentText
mBinding.refuseTv.setOnClickListener {
mCallBack?.invoke(false)
dismissAllowingStateLoss()
}
mBinding.agreeTv.setOnClickListener {
mCallBack?.invoke(true)
dismissAllowingStateLoss()
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val createDialog = super.onCreateDialog(savedInstanceState)
createDialog.setCanceledOnTouchOutside(false)
createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener {
override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true
}
return false
}
})
val window = createDialog.window
window?.setGravity(Gravity.CENTER)
return createDialog
}
override fun onStart() {
super.onStart()
val width = 300F.dip2px()
val height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog?.window?.setLayout(width, height)
}
companion object {
const val KEY_DATA = "data"
@JvmStatic
fun show(
activity: FragmentActivity,
privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity? = null,
callBack: ((isSuccess: Boolean) -> Unit)?
) {
var privacyDialogFragment =
activity.supportFragmentManager.findFragmentByTag(NewPrivacyPolicyDialogFragment::class.java.name) as? NewPrivacyPolicyDialogFragment
if (privacyDialogFragment != null) {
privacyDialogFragment.mCallBack = callBack
val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction()
transaction.show(privacyDialogFragment)
transaction.commit()
} else {
privacyDialogFragment = NewPrivacyPolicyDialogFragment().apply {
mCallBack = callBack
}
}
privacyDialogFragment.arguments = Bundle().apply {
put(KEY_DATA, privacyPolicyEntity)
}
privacyDialogFragment.show(
activity.supportFragmentManager,
NewPrivacyPolicyDialogFragment::class.java.name
)
}
}
}

View File

@ -15,17 +15,24 @@ import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gh.base.BaseRecyclerViewHolder
import com.gh.common.constant.Constants
import com.gh.common.util.*
import com.gh.common.view.CustomLinkMovementMethod
import com.gh.common.util.DirectUtils
import com.gh.common.util.LogUtils
import com.gh.common.util.PackageUtils
import com.gh.download.DownloadManager
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
import com.gh.gamecenter.common.callback.ConfirmListener
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.entity.LinkEntity
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.view.CustomLinkMovementMethod
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.core.utils.SpanBuilder
import com.gh.gamecenter.databinding.FragmentPackageCheckBinding
import com.gh.gamecenter.databinding.PackageCheckItemBinding
import com.gh.gamecenter.entity.DetectionObjectEntity
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.LinkEntity
import com.gh.gamecenter.entity.PackageDialogEntity
import com.gh.gamecenter.eventbus.EBPackage
import com.halo.assistant.HaloApp
@ -52,7 +59,7 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
private var mAdapter: PackageCheckAdapter? = null
private var mAllInstalledPackages = PackageUtils.getInstalledPackages(HaloApp.getInstance().application, 0)
var gameEntity: GameEntity? = null
var callBack: DialogUtils.ConfirmListener? = null
var callBack: ConfirmListener? = null
private val dataWatcher = object : DataWatcher() {
override fun onDataChanged(downloadEntity: DownloadEntity) {
@ -63,9 +70,14 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
if (detectionObject.packages.contains(packageName)) {
val packageLink = gameEntity?.packageDialog?.links?.find { it.buttonLink }
LogUtils.uploadPackageCheck(
"pkg_check_pop_download", if (DownloadStatus.add == downloadEntity.status) "下载开始" else "下载完成",
gameEntity, packageLink?.text ?: "", packageLink?.title
?: "", downloadEntity.gameId, downloadEntity.getMetaExtra(Constants.GAME_NAME)
"pkg_check_pop_download",
if (DownloadStatus.add == downloadEntity.status) "下载开始" else "下载完成",
gameEntity,
packageLink?.text ?: "",
packageLink?.title
?: "",
downloadEntity.gameId,
downloadEntity.getMetaExtra(Constants.GAME_NAME)
)
}
}
@ -101,10 +113,21 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
val spanBuilder = SpanBuilder(it.linkHintText).build()
it.links.forEachIndexed { index, link ->
val linkSpan = SpanBuilder(link.title ?: "").click(
0, (link.title
?: "").length, R.color.theme_font, true
requireContext(),
0,
(link.title ?: "").length,
R.color.theme_font,
true
) {
LogUtils.uploadPackageCheck("pkg_check_pop_click", "点击链接", gameEntity, link.text, link.title, "", "")
LogUtils.uploadPackageCheck(
"pkg_check_pop_click",
"点击链接",
gameEntity,
link.text,
link.title,
"",
""
)
DirectUtils.directToLinkPage(requireContext(), link, "包名检测弹窗", "")
}.build()
spanBuilder.append(linkSpan)
@ -161,7 +184,15 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
packageLink = entity.links.find { it.buttonLink }
}
if (packageLink != null) {
LogUtils.uploadPackageCheck("pkg_check_pop_click", "点击前往下载", gameEntity, packageLink.text, packageLink.title, "", "")
LogUtils.uploadPackageCheck(
"pkg_check_pop_click",
"点击前往下载",
gameEntity,
packageLink.text,
packageLink.title,
"",
""
)
DirectUtils.directToLinkPage(requireContext(), packageLink, "包名检测弹窗", "")
}
}
@ -314,11 +345,12 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
}
}
class PackageCheckViewHolder(val binding: PackageCheckItemBinding) : BaseRecyclerViewHolder<DetectionObjectEntity>(binding.root)
class PackageCheckViewHolder(val binding: PackageCheckItemBinding) :
BaseRecyclerViewHolder<DetectionObjectEntity>(binding.root)
companion object {
@JvmStatic
fun show(activity: AppCompatActivity, gameEntity: GameEntity, callBack: DialogUtils.ConfirmListener) {
fun show(activity: AppCompatActivity, gameEntity: GameEntity, callBack: ConfirmListener) {
val packageDialogEntity = gameEntity.packageDialog
if (packageDialogEntity == null) {
callBack.onConfirm()
@ -346,12 +378,12 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
if (!activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) return
var dialogFragment =
activity.supportFragmentManager.findFragmentByTag(PackageCheckDialogFragment::class.java.simpleName) as? PackageCheckDialogFragment
activity.supportFragmentManager.findFragmentByTag(PackageCheckDialogFragment::class.java.name) as? PackageCheckDialogFragment
if (dialogFragment == null) {
dialogFragment = PackageCheckDialogFragment()
dialogFragment.gameEntity = gameEntity
dialogFragment.callBack = callBack
dialogFragment.show(activity.supportFragmentManager, PackageCheckDialogFragment::class.java.simpleName)
dialogFragment.show(activity.supportFragmentManager, PackageCheckDialogFragment::class.java.name)
} else {
dialogFragment.gameEntity = gameEntity
dialogFragment.callBack = callBack
@ -361,7 +393,10 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
}
}
private fun checkDetectionsInstalled(allInstalledPackages: List<PackageInfo>, packages: ArrayList<String>): Boolean {
private fun checkDetectionsInstalled(
allInstalledPackages: List<PackageInfo>,
packages: ArrayList<String>
): Boolean {
var isPackagesInstalled = false
packages.forEach { packageName ->
val isInstalled = allInstalledPackages.find { it.packageName == packageName } != null
@ -374,7 +409,10 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
}
fun isAllPackageInstalled(allInstalledPackages: List<PackageInfo>, packageDialogEntity: PackageDialogEntity): Boolean {
fun isAllPackageInstalled(
allInstalledPackages: List<PackageInfo>,
packageDialogEntity: PackageDialogEntity
): Boolean {
var isAllInstalled = true
packageDialogEntity.detectionObjects.forEach loop@{ obj ->
if (!checkDetectionsInstalled(allInstalledPackages, obj.packages)) {

View File

@ -1,157 +0,0 @@
package com.gh.common.dialog
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextPaint
import android.text.method.ScrollingMovementMethod
import android.text.style.ClickableSpan
import android.view.*
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentTransaction
import com.gh.base.fragment.BaseDialogFragment
import com.gh.common.util.dip2px
import com.gh.common.view.CustomLinkMovementMethod
import com.gh.gamecenter.R
import com.gh.gamecenter.WebActivity
class PrivacyDialogFragment : BaseDialogFragment() {
// private val mLocalPrivacyHtml = "file:///android_asset/privacy_policies.html"
// private val mLocalRegulationHtml = "file:///android_asset/user_regulation.html"
var containerView: View? = null
var mCallBack: ((isSuccess: Boolean) -> Unit)? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
containerView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_privacy_protocol, null, false)
return containerView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// val mWebViewPrivacy = containerView?.findViewById<WebView>(R.id.webView)
// val mWebViewRegulation = containerView?.findViewById<WebView>(R.id.webView2)
//
// mWebViewPrivacy?.isHorizontalScrollBarEnabled = false
// mWebViewRegulation?.isHorizontalScrollBarEnabled = false
val contentTv = containerView?.findViewById<TextView>(R.id.contentTv)
val descTv = containerView?.findViewById<TextView>(R.id.descTv)
contentTv?.movementMethod = ScrollingMovementMethod()
val skipText = SpannableStringBuilder("查看完整版的隐私政策和用户协议")
skipText.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true)
context?.startActivity(intent)
}
}, skipText.length - 9, skipText.length - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
skipText.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.disclaimer_url), true)
context?.startActivity(intent)
}
}, skipText.length - 4, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
descTv?.movementMethod = CustomLinkMovementMethod()
descTv?.text = skipText
// val mWebViewPrivacy = containerView?.findViewById<WebView>(R.id.webView)
//
// mWebViewPrivacy?.isHorizontalScrollBarEnabled = false
//
// val settingsArrayList = arrayListOf(mWebViewPrivacy?.settings, mWebViewRegulation?.settings)
//
// for (settings in settingsArrayList) {
// settings?.javaScriptEnabled = true
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// settings?.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
// }
// // 避免提示网页有害信息不能访问
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// settings?.safeBrowsingEnabled = false
// }
//
// // 适配大于屏幕宽度的页面
// settings?.useWideViewPort = true
// settings?.loadWithOverviewMode = true
// settings?.domStorageEnabled = true
//
// // 自适应屏幕
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// settings?.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
// }
// }
// mWebViewPrivacy?.webViewClient = client
// mWebViewRegulation?.webViewClient = client
containerView?.findViewById<View>(R.id.refuseTv)?.setOnClickListener {
mCallBack?.invoke(false)
dismissAllowingStateLoss()
}
containerView?.findViewById<View>(R.id.agreeTv)?.setOnClickListener {
mCallBack?.invoke(true)
dismissAllowingStateLoss()
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val createDialog = super.onCreateDialog(savedInstanceState)
createDialog.setCanceledOnTouchOutside(false)
createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener {
override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true
}
return false
}
})
val window = createDialog.window
window?.setGravity(Gravity.CENTER)
return createDialog
}
override fun onStart() {
super.onStart()
val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px()
val height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog?.window?.setLayout(width, height)
}
companion object {
@JvmStatic
fun show(activity: AppCompatActivity, callBack: ((isSuccess: Boolean) -> Unit)?) {
var privacyDialogFragment = activity.supportFragmentManager.findFragmentByTag(PrivacyDialogFragment::class.java.simpleName) as? PrivacyDialogFragment
if (privacyDialogFragment != null) {
privacyDialogFragment.mCallBack = callBack
val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction()
transaction.show(privacyDialogFragment)
transaction.commit()
} else {
privacyDialogFragment = PrivacyDialogFragment().apply {
mCallBack = callBack
}
privacyDialogFragment.show(activity.supportFragmentManager, PrivacyDialogFragment::class.java.simpleName)
}
}
}
}

View File

@ -0,0 +1,195 @@
package com.gh.common.dialog
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextPaint
import android.text.method.ScrollingMovementMethod
import android.text.style.ClickableSpan
import android.view.*
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentTransaction
import com.gh.gamecenter.R
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.common.base.fragment.BaseDialogFragment
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.fromHtml
import com.gh.gamecenter.common.view.CustomLinkMovementMethod
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.databinding.DialogPrivacyProtocolBinding
import com.gh.gamecenter.entity.DialogEntity
import com.lightgame.utils.AppManager
import splitties.bundle.put
class PrivacyPolicyDialogFragment : BaseDialogFragment() {
private var mCallBack: ((isSuccess: Boolean) -> Unit)? = null
private val mBinding by lazy { DialogPrivacyProtocolBinding.inflate(layoutInflater) }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return mBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mBinding.contentTv.movementMethod = ScrollingMovementMethod()
val privacyPolicyEntity = arguments?.get(KEY_DATA) as? DialogEntity.PrivacyPolicyEntity
if (privacyPolicyEntity == null) {
showPreLaunchStyle()
} else {
showUpdatedStyle(privacyPolicyEntity)
}
}
private fun showUpdatedStyle(privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity) {
mBinding.titleIv.visibility = View.VISIBLE
mBinding.privacyTitleTv.text = "光环助手《隐私协议》更新"
mBinding.contentTv.text = privacyPolicyEntity.content.fromHtml()
val skipText = SpannableStringBuilder("查看隐私政策详情")
skipText.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
val intent =
WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true)
context?.startActivity(intent)
}
}, skipText.length - 6, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
mBinding.descTv.movementMethod = CustomLinkMovementMethod()
mBinding.descTv.text = skipText
if (privacyPolicyEntity.alertType == "INFORM") {
mBinding.refuseTv.visibility = View.GONE
mBinding.agreeTv.text = "我知道了"
mBinding.agreeTv.setOnClickListener {
SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, privacyPolicyEntity.id)
mCallBack?.invoke(true)
dismissAllowingStateLoss()
}
} else {
mBinding.refuseTv.text = "不同意退出"
mBinding.agreeTv.text = "同意"
mBinding.refuseTv.setOnClickListener {
dismissAllowingStateLoss()
AppManager.getInstance().finishAllActivity()
}
mBinding.agreeTv.setOnClickListener {
SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, privacyPolicyEntity.id)
mCallBack?.invoke(true)
dismissAllowingStateLoss()
}
}
}
private fun showPreLaunchStyle() {
val skipText = SpannableStringBuilder("查看完整版的隐私政策和用户协议")
skipText.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
val intent =
WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true)
context?.startActivity(intent)
}
}, skipText.length - 9, skipText.length - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
skipText.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.disclaimer_url), true)
context?.startActivity(intent)
}
}, skipText.length - 4, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
mBinding.descTv.movementMethod = CustomLinkMovementMethod()
mBinding.descTv.text = skipText
mBinding.refuseTv.setOnClickListener {
mCallBack?.invoke(false)
dismissAllowingStateLoss()
}
mBinding.agreeTv.setOnClickListener {
mCallBack?.invoke(true)
dismissAllowingStateLoss()
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val createDialog = super.onCreateDialog(savedInstanceState)
createDialog.setCanceledOnTouchOutside(false)
createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener {
override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true
}
return false
}
})
val window = createDialog.window
window?.setGravity(Gravity.CENTER)
return createDialog
}
override fun onStart() {
super.onStart()
val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px()
val height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog?.window?.setLayout(width, height)
}
companion object {
const val KEY_DATA = "data"
@JvmStatic
fun show(
activity: FragmentActivity,
privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity? = null,
callBack: ((isSuccess: Boolean) -> Unit)?
) {
var privacyDialogFragment =
activity.supportFragmentManager.findFragmentByTag(PrivacyPolicyDialogFragment::class.java.name) as? PrivacyPolicyDialogFragment
if (privacyDialogFragment != null) {
privacyDialogFragment.mCallBack = callBack
val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction()
transaction.show(privacyDialogFragment)
transaction.commit()
} else {
privacyDialogFragment = PrivacyPolicyDialogFragment().apply {
mCallBack = callBack
}
}
privacyDialogFragment.arguments = Bundle().apply {
put(KEY_DATA, privacyPolicyEntity)
}
privacyDialogFragment.show(
activity.supportFragmentManager,
PrivacyPolicyDialogFragment::class.java.name
)
}
}
}

View File

@ -1,4 +1,4 @@
package com.gh.common.view
package com.gh.common.dialog
import android.os.Bundle
import android.view.LayoutInflater
@ -6,12 +6,13 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gh.base.BaseRecyclerViewHolder
import com.gh.base.fragment.BaseDialogFragment
import com.gh.common.util.ImageUtils
import com.gh.common.util.fromHtml
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
import com.gh.gamecenter.common.base.fragment.BaseDialogFragment
import com.gh.gamecenter.common.utils.ImageUtils
import com.gh.gamecenter.common.utils.fromHtml
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.view.FixLinearLayoutManager
import com.gh.gamecenter.databinding.DialogReserveBinding
import com.gh.gamecenter.databinding.DialogReserveItemBinding
import com.gh.gamecenter.entity.SimpleGameEntity

View File

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

View File

@ -1,61 +0,0 @@
package com.gh.common.exposure
import androidx.room.TypeConverter
import com.gh.common.exposure.meta.Meta
import com.gh.common.util.GsonUtils
import java.util.*
import kotlin.collections.ArrayList
class ExposureConverters {
@TypeConverter
fun convertPayload2String(any: ExposureEntity): String {
return GsonUtils.toJson(any)
}
@TypeConverter
fun convertString2Payload(string: String): ExposureEntity {
return GsonUtils.fromJson(string, ExposureEntity::class.java)
}
@TypeConverter
fun convertSource2String(sourceList: List<ExposureSource>): String {
return GsonUtils.toJson(sourceList)
}
@TypeConverter
fun convertString2Source(sourceList: String): List<ExposureSource> {
return ArrayList(Arrays.asList(GsonUtils.fromJson(sourceList, Array<ExposureSource>::class.java))) as List<ExposureSource>
}
@TypeConverter
fun convertETrace2String(sourceList: List<ExposureEvent>?): String {
return GsonUtils.toJson(sourceList)
}
@TypeConverter
fun convertStringToETrace(sourceList: String): List<ExposureEvent> {
return ArrayList(Arrays.asList(GsonUtils.fromJson(sourceList, Array<ExposureEvent>::class.java))) as List<ExposureEvent>
}
@TypeConverter
fun convertExposeType2String(exposureType: ExposureType): String {
return exposureType.toString()
}
@TypeConverter
fun convertStringToExposeType(exposureType: String): ExposureType {
return ExposureType.valueOf(exposureType)
}
@TypeConverter
fun convertMeta2String(any: Meta): String {
return GsonUtils.toJson(any)
}
@TypeConverter
fun convertString2Meta(string: String): Meta {
return GsonUtils.fromJson(string, Meta::class.java)
}
}

View File

@ -1,23 +0,0 @@
package com.gh.common.exposure
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import android.content.Context
@TypeConverters(ExposureConverters::class)
@Database(entities = [ExposureEvent::class], version = 1, exportSchema = false)
abstract class ExposureDatabase : RoomDatabase() {
companion object {
private const val DATABASE = "exposure_database"
fun buildDatabase(context: Context): ExposureDatabase {
return Room.databaseBuilder(context, ExposureDatabase::class.java, DATABASE)
.fallbackToDestructiveMigration()
.build()
}
}
abstract fun logHubEventDao(): ExposureEventDao
}

View File

@ -2,34 +2,135 @@ package com.gh.common.exposure
import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.gh.common.constant.Constants
import com.gh.common.exposure.meta.Meta
import com.gh.common.exposure.meta.MetaUtil
import com.gh.common.exposure.time.TimeUtil
import com.gh.common.util.getFirstElementDividedByDivider
import com.gh.download.server.BrowserInstallHelper
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.entity.ExposureEntity
import com.gh.gamecenter.common.exposure.meta.Meta
import com.gh.gamecenter.common.exposure.meta.MetaUtil
import com.gh.gamecenter.common.utils.getFirstElementDividedByDivider
import com.gh.gamecenter.entity.GameEntity
import com.lightgame.download.DownloadEntity
import com.lightgame.utils.Utils
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import java.util.*
import kotlin.collections.ArrayList
@Keep
@Parcelize
@Entity(tableName = "exposureEvent")
data class ExposureEvent(
var payload: ExposureEntity,
val source: List<ExposureSource>,
var source: List<ExposureSource>,
var eTrace: List<ExposureEvent>? = arrayListOf(),
val event: ExposureType,
var event: ExposureType,
val meta: Meta = MetaUtil.getMeta(),
val time: Int = TimeUtil.currentTime(),
var time: Int = TimeUtil.currentTime(),
var timeInMillisecond: Long = System.currentTimeMillis(),
@PrimaryKey
val id: String = UUID.randomUUID().toString()
var id: String = UUID.randomUUID().toString(),
) : Parcelable {
@Transient
@IgnoredOnParcel
var next: ExposureEvent? = null
@Transient
@IgnoredOnParcel
var flags = 0
private fun initExposureEventData(
gameEntity: GameEntity?,
source: List<ExposureSource>,
eTrace: List<ExposureEvent>? = null,
event: ExposureType = ExposureType.EXPOSURE
) {
this.payload = ExposureEntity(
gameId = gameEntity?.id?.getFirstElementDividedByDivider(DownloadEntity.GAME_ID_DIVIDER),
gameName = eTrace?.firstOrNull()?.payload?.gameName
?: gameEntity?.name?.removeSuffix(Constants.GAME_NAME_DECORATOR),
gameVersion = eTrace?.firstOrNull()?.payload?.gameVersion
?: gameEntity?.gameVersion,
subjectId = eTrace?.firstOrNull()?.payload?.subjectId
?: gameEntity?.subjectId
?: gameEntity?.subjectData?.id,
isMirrorData = eTrace?.firstOrNull()?.payload?.isMirrorData
?: gameEntity?.shouldUseMirrorInfo() ?: false,
isWebDownload = BrowserInstallHelper.isUseBrowserToInstallEnabled() && BrowserInstallHelper.shouldUseBrowserToInstall(), // 实时的值,不用从 eTrace 里取
sequence = eTrace?.firstOrNull()?.payload?.sequence ?: gameEntity?.sequence,
outerSequence = eTrace?.firstOrNull()?.payload?.outerSequence
?: gameEntity?.outerSequence,
platform = eTrace?.firstOrNull()?.payload?.platform ?: gameEntity?.platform,
downloadType = gameEntity?.downloadType,
downloadCompleteType = gameEntity?.downloadCompleteType,
displayType = eTrace?.firstOrNull()?.payload?.displayType
?: gameEntity?.displayContent,
isPlatformRecommend = gameEntity?.isPlatformRecommend,
// ugly
welcomeDialogId = gameEntity?.welcomeDialogId
?: eTrace?.firstOrNull()?.payload?.welcomeDialogId,
welcomeDialogLinkTitle = gameEntity?.welcomeDialogTitle
?: eTrace?.firstOrNull()?.payload?.welcomeDialogLinkTitle
)
this.id = UUID.randomUUID().toString()
this.timeInMillisecond = System.currentTimeMillis()
this.time = TimeUtil.currentTime()
this.source = source
this.eTrace = eTrace
this.event = event
this.also {
it.payload.categoryId = eTrace?.firstOrNull()?.payload?.categoryId
it.payload.categoryV2Id = eTrace?.firstOrNull()?.payload?.categoryV2Id
it.payload.testServerId = eTrace?.firstOrNull()?.payload?.testServerId
it.payload.blockId = eTrace?.firstOrNull()?.payload?.blockId
it.payload.setContainerInfo(
eTrace?.firstOrNull()?.payload?.containerId ?: gameEntity?.containerId,
eTrace?.firstOrNull()?.payload?.containerType ?: gameEntity?.containerType
)
it.payload.sourcePage = eTrace?.firstOrNull()?.payload?.sourcePage
it.payload.sourcePageId = eTrace?.firstOrNull()?.payload?.sourcePageId
it.payload.sourcePageName = eTrace?.firstOrNull()?.payload?.sourcePageName
gameEntity?.exposureEvent = it
}
}
fun recycle() {
if (inUse()) {
Utils.log(
EXPOSURE_EVENT_LOG_TAG,
"This ExposureEvent $this cannot be recycled because it is still in use."
)
return
}
recycleUnchecked()
}
private fun recycleUnchecked() {
this.flags = FLAG_IN_USE
synchronized(sPoolSync) {
if (sPoolSize < EXPOSURE_EVENT_MAX_POOL_SIZE) {
next = sPool
sPool = this
sPoolSize++
Utils.log(EXPOSURE_EVENT_LOG_TAG, "This ExposureEvent $this Recycled")
}
}
}
private fun inUse(): Boolean {
return flags == FLAG_IN_USE
}
companion object {
private val sPoolSync = Any()
private var sPool: ExposureEvent? = null
private var sPoolSize: Int = 0
private const val EXPOSURE_EVENT_MAX_POOL_SIZE: Int = 300
private const val FLAG_IN_USE = 1
private const val EXPOSURE_EVENT_LOG_TAG = "ExposureEvent"
@JvmStatic
fun createEvent(
@ -41,54 +142,33 @@ data class ExposureEvent(
if (gameEntity?.getApk()?.size == 1) {
gameEntity.gameVersion = gameEntity.getApk().elementAtOrNull(0)?.version ?: ""
}
return ExposureEvent(
payload = ExposureEntity(
gameId = gameEntity?.id?.getFirstElementDividedByDivider(DownloadEntity.GAME_ID_DIVIDER),
gameName = eTrace?.firstOrNull()?.payload?.gameName
?: gameEntity?.name?.removeSuffix(Constants.GAME_NAME_DECORATOR),
gameVersion = eTrace?.firstOrNull()?.payload?.gameVersion
?: gameEntity?.gameVersion,
subjectId = eTrace?.firstOrNull()?.payload?.subjectId
?: gameEntity?.subjectId
?: gameEntity?.subjectData?.id,
isMirrorData = eTrace?.firstOrNull()?.payload?.isMirrorData
?: gameEntity?.shouldUseMirrorInfo() ?: false,
isWebDownload = BrowserInstallHelper.isUseBrowserToInstallEnabled() && BrowserInstallHelper.shouldUseBrowserToInstall(), // 实时的值,不用从 eTrace 里取
sequence = eTrace?.firstOrNull()?.payload?.sequence ?: gameEntity?.sequence,
outerSequence = eTrace?.firstOrNull()?.payload?.outerSequence
?: gameEntity?.outerSequence,
platform = eTrace?.firstOrNull()?.payload?.platform ?: gameEntity?.platform,
downloadType = gameEntity?.downloadType,
downloadCompleteType = gameEntity?.downloadCompleteType,
displayType = eTrace?.firstOrNull()?.payload?.displayType
?: gameEntity?.displayContent,
isPlatformRecommend = gameEntity?.isPlatformRecommend,
// ugly
welcomeDialogId = gameEntity?.welcomeDialogId
?: eTrace?.firstOrNull()?.payload?.welcomeDialogId,
welcomeDialogLinkTitle = gameEntity?.welcomeDialogTitle
?: eTrace?.firstOrNull()?.payload?.welcomeDialogLinkTitle
),
synchronized(sPoolSync) {
if (sPool != null) {
val exposureEvent = sPool
sPool = exposureEvent?.next
exposureEvent?.next = null
exposureEvent?.flags = 0
sPoolSize--
exposureEvent?.initExposureEventData(gameEntity, source, eTrace, event)
Utils.log(
EXPOSURE_EVENT_LOG_TAG,
"ExposureEvent 对象 $this 正在被循环使用, 当前对象池数量还有 $sPoolSize"
)
return exposureEvent!!
}
}
Utils.log(
EXPOSURE_EVENT_LOG_TAG,
"new ExposureEvent 对象"
)
val exposureEvent = ExposureEvent(
payload = ExposureEntity(),
source = source,
eTrace = eTrace,
event = event
).also {
it.payload.categoryId = eTrace?.firstOrNull()?.payload?.categoryId
it.payload.categoryV2Id = eTrace?.firstOrNull()?.payload?.categoryV2Id
it.payload.testServerId = eTrace?.firstOrNull()?.payload?.testServerId
it.payload.blockId = eTrace?.firstOrNull()?.payload?.blockId
it.payload.setContainerInfo(
eTrace?.firstOrNull()?.payload?.containerId ?: gameEntity?.containerId,
eTrace?.firstOrNull()?.payload?.containerType ?: gameEntity?.containerType
)
it.payload.sourcePage = eTrace?.firstOrNull()?.payload?.sourcePage
it.payload.sourcePageId = eTrace?.firstOrNull()?.payload?.sourcePageId
it.payload.sourcePageName = eTrace?.firstOrNull()?.payload?.sourcePageName
gameEntity?.exposureEvent = it
}
)
exposureEvent.initExposureEventData(gameEntity, source, eTrace, event)
return exposureEvent
}
@JvmStatic

View File

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

View File

@ -11,26 +11,32 @@ import io.reactivex.functions.Consumer
*/
class ExposureListener(var fragment: Fragment, var exposable: IExposable) : RecyclerView.OnScrollListener() {
val throttleBus: ExposureThrottleBus by lazy { ExposureThrottleBus(Consumer { commitExposure(it) }, Consumer(Throwable::printStackTrace)) }
val throttleBus: ExposureThrottleBus by lazy {
ExposureThrottleBus(
Consumer { commitExposure(it) },
Consumer(Throwable::printStackTrace)
)
}
var layoutManager: LinearLayoutManager? = null
var visibleState: ExposureThrottleBus.VisibleState? = null
init {
fragment.fragmentManager?.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
if (fragment == f) {
visibleState?.let { commitExposure(it) }
throttleBus.clear()
}
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
if (fragment == f) {
visibleState?.let { commitExposure(it) }
throttleBus.clear()
}
}
override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) {
if (fragment == f) {
fragment.fragmentManager?.unregisterFragmentLifecycleCallbacks(this)
}
override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) {
if (fragment == f) {
fragment.fragmentManager?.unregisterFragmentLifecycleCallbacks(this)
}
}, false)
}
}, false
)
}
/**
@ -43,7 +49,8 @@ class ExposureListener(var fragment: Fragment, var exposable: IExposable) : Recy
if (layoutManager == null) layoutManager = recyclerView.layoutManager as LinearLayoutManager
layoutManager?.run {
visibleState = ExposureThrottleBus.VisibleState(findFirstVisibleItemPosition(), findLastVisibleItemPosition())
visibleState =
ExposureThrottleBus.VisibleState(findFirstVisibleItemPosition(), findLastVisibleItemPosition())
throttleBus.postVisibleState(visibleState!!)
}
}

View File

@ -1,13 +1,11 @@
package com.gh.common.exposure
import com.aliyun.sls.android.producer.Log
import com.gh.common.loghub.LoghubHelper
import com.gh.common.util.toJson
import com.gh.common.util.tryWithDefaultCatch
import com.gh.gamecenter.BuildConfig
import com.halo.assistant.HaloApp
import com.gh.gamecenter.common.loghub.LoghubHelper
import com.gh.gamecenter.common.utils.FixedSizeLinkedHashSet
import com.gh.gamecenter.common.utils.toJson
import com.lightgame.utils.Utils
import java.util.concurrent.ExecutorService
/**
* A handful tool for committing logs to aliyun loghub.
@ -25,40 +23,17 @@ object ExposureManager {
// exposureCache 用来过滤掉具有相同 id 的曝光事件,避免重复发送事件
private val exposureSet by lazy { hashSetOf<ExposureEvent>() }
private var exposureExecutor: ExecutorService? = null
private val exposureCache by lazy { FixedSizeLinkedHashSet<String>(300) }
private val exposureDao by lazy { ExposureDatabase.buildDatabase(HaloApp.getInstance().application).logHubEventDao() }
@JvmStatic
fun init(excutor: ExecutorService) {
exposureExecutor = excutor
exposureExecutor?.execute {
tryWithDefaultCatch {
val eventList = exposureDao.getAll()
exposureSet.addAll(eventList)
}
}
}
/**
* Log a single exposure event.
*/
fun log(event: ExposureEvent) {
exposureExecutor?.execute {
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)
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
}
} catch (e: Exception) {
e.printStackTrace()
}
if (!exposureCache.contains(event.id)) {
exposureSet.add(event)
exposureCache.add(event.id)
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
}
}
@ -66,51 +41,37 @@ object ExposureManager {
* Log a collection of exposure event.
*/
fun log(eventList: List<ExposureEvent>) {
exposureExecutor?.execute {
for (event in eventList) {
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)
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
}
} catch (e: Exception) {
e.printStackTrace()
}
for (event in eventList) {
if (!exposureCache.contains(event.id)) {
exposureSet.add(event)
exposureCache.add(event.id)
} else {
Utils.log("Exposure", "遇到重复曝光事件,自动过滤 ${event.id} - ${event.payload.gameName}")
}
commitSavedExposureEvents()
}
commitSavedExposureEvents()
}
/**
* @param forced Ignore all restrictions.
* @param forcedUpload Ignore all restrictions.
*/
fun commitSavedExposureEvents(forced: Boolean = false) {
exposureExecutor?.execute {
tryWithDefaultCatch {
// TODO 初始化 loghubHelper 去掉这个 tryCatch 块
if (exposureSet.size < STORE_SIZE && !forced || exposureSet.size == 0) return@execute
fun commitSavedExposureEvents(forcedUpload: Boolean = false) {
if (exposureSet.size < STORE_SIZE && !forcedUpload || exposureSet.size == 0) return
val exposureList = exposureSet.toList()
uploadExposures(exposureList)
uploadExposures(exposureSet.toList(), forcedUpload)
Utils.log("Exposure", "提交了${exposureList.size}条曝光记录")
exposureSet.removeAll(exposureList)
exposureDao.deleteMany(exposureList)
}
}
Utils.log("Exposure", "提交了${exposureSet.size}条曝光记录")
exposureSet.clear()
}
private fun eliminateMultipleBrackets(jsonWithMultipleBracket: String): String {
return jsonWithMultipleBracket.replace("[[", "[").replace("]]", "]")
}
private fun uploadExposures(eventList: List<ExposureEvent>) {
private fun uploadExposures(eventList: List<ExposureEvent>, forced: Boolean) {
eventList.forEach {
LoghubHelper.uploadLog(buildLog(it), LOG_STORE)
LoghubHelper.uploadLog(buildLog(it), LOG_STORE, forced)
it.recycle()
}
}
@ -120,25 +81,13 @@ object ExposureManager {
putContent("event", event.event.toString())
putContent("source", eliminateMultipleBrackets(event.source.toJson()))
putContent("meta", event.meta.toJson())
putContent("e-traces", if (event.eTrace != null) {
eliminateMultipleBrackets(event.eTrace?.toJson() ?: "")
} else "")
putContent("real_millisecond", event.timeInMillisecond.toString())
putContent(
"e-traces", if (event.eTrace != null) {
eliminateMultipleBrackets(event.eTrace?.toJson() ?: "")
} else ""
)
logTime = event.time.toLong()
}
class FixedSizeLinkedHashSet<T>(var maxSize: Int) : LinkedHashSet<T>() {
override fun add(element: T): Boolean {
if (size == maxSize) {
pop()
}
return super.add(element);
}
private fun pop() {
if (size > 0) {
remove(iterator().next())
}
}
}
}

View File

@ -6,4 +6,4 @@ import kotlinx.parcelize.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

@ -23,10 +23,10 @@ class ExposureThrottleBus(var onSuccess: Consumer<VisibleState>, var onError: Co
* throttleWithTimeout() to pass a visibleState event with a delay and drop current event if another event arrives before the timeout.
*/
val disposable = mPublishSubject
.distinctUntilChanged()
.throttleWithTimeout(THRESHOLD_TIME, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.subscribe(onSuccess, onError)
.distinctUntilChanged()
.throttleWithTimeout(THRESHOLD_TIME, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.subscribe(onSuccess, onError)
mCompositeDisposable.add(disposable)
}

View File

@ -3,15 +3,17 @@ package com.gh.common.exposure
import android.text.TextUtils
import com.g00fy2.versioncompare.Version
import com.gh.common.util.PackageUtils
import com.gh.common.util.toObject
import com.gh.gamecenter.common.utils.FixedSizeLinkedHashSet
import com.gh.gamecenter.common.utils.toObject
import com.gh.gamecenter.entity.ApkEntity
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.manager.PackagesManager
import com.halo.assistant.HaloApp
import com.lightgame.download.DownloadEntity
object ExposureUtils {
private val mDownloadCompleteTraceEventIdSet = ExposureManager.FixedSizeLinkedHashSet<String>(3)
private val mDownloadCompleteTraceEventIdSet = FixedSizeLinkedHashSet<String>(3)
@JvmStatic
fun logADownloadExposureEvent(
@ -74,44 +76,44 @@ object ExposureUtils {
exposureEvent.payload.host = host
exposureEvent.payload.path = path
ExposureManager.log(exposureEvent)
ExposureManager.commitSavedExposureEvents(forced = true)
ExposureManager.commitSavedExposureEvents(forcedUpload = true)
}
@JvmStatic
fun getDownloadType(apkEntity: ApkEntity, gameId: String): DownloadType {
return if (PackageUtils.isInstalled(
fun getDownloadType(apkEntity: ApkEntity, gameId: String, isVGame: Boolean): DownloadType {
return when {
isVGame -> getVGameDownloadType(apkEntity, gameId)
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.getVersionNameByPackageName(
apkEntity.packageName
)
)
) {
DownloadType.UPDATE
} else {
DownloadType.DOWNLOAD
}
}
} else {
if (!TextUtils.isEmpty(apkEntity.ghVersion)) {
DownloadType.PLUGIN_DOWNLOAD
} else {
DownloadType.UPDATE
}
}
} else {
DownloadType.DOWNLOAD
) -> getInstallDownloadType(apkEntity, gameId)
else -> DownloadType.DOWNLOAD
}
}
private fun getVGameDownloadType(apkEntity: ApkEntity, gameId: String): DownloadType {
return when {
PackagesManager.isCanUpdate(gameId, apkEntity.packageName) -> DownloadType.FUN_UPDATE
else -> DownloadType.FUN_DOWNLOAD
}
}
private fun getInstallDownloadType(apkEntity: ApkEntity, gameId: String): DownloadType {
return when {
PackageUtils.isSignedByGh(
HaloApp.getInstance().application,
apkEntity.packageName
) -> getUpdateDownloadType(apkEntity, gameId)
!TextUtils.isEmpty(apkEntity.ghVersion) -> DownloadType.PLUGIN_DOWNLOAD
else -> DownloadType.UPDATE
}
}
private fun getUpdateDownloadType(apkEntity: ApkEntity, gameId: String): DownloadType {
return when {
PackageUtils.isCanUpdate(apkEntity, gameId) -> DownloadType.PLUGIN_UPDATE
Version(apkEntity.version).isHigherThan(PackageUtils.getVersionNameByPackageName(apkEntity.packageName)) -> DownloadType.UPDATE
else -> DownloadType.DOWNLOAD
}
}
@ -142,6 +144,10 @@ object ExposureUtils {
PLUGIN_UPDATE,
PLUGIN_DOWNLOAD
PLUGIN_DOWNLOAD,
FUN_DOWNLOAD,
FUN_UPDATE
}
}

View File

@ -1,26 +0,0 @@
package com.gh.common.exposure.meta
import android.os.Parcelable
import androidx.annotation.Keep
import kotlinx.parcelize.Parcelize
@Keep
@Parcelize
data class Meta(
val mac: String? = "",
val jnfj: String? = "",
val model: String? = "",
val manufacturer: String? = "",
val dia: String? = "",
val android_sdk: Int? = -1,
val android_version: String? = "",
val network: String? = "",
val os: String? = "",
val gid: String? = "",
val oaid: String? = "",
val channel: String? = "",
val appVersion: String? = "",
val userId: String? = "",
val exposureVersion: String? = "",
val rom: String? = ""
) : Parcelable

View File

@ -5,17 +5,46 @@ import com.google.gson.annotations.SerializedName
@Keep
data class RegionSetting(
@SerializedName("game_mirror")
var mirrorGameIdSet: HashSet<String>,
@SerializedName("game_block")
var filterGameIdSet: HashSet<String>,
@SerializedName("channel_control")
var channelControl: ChannelControl) {
@SerializedName("game_mirror")
var mirrorGameIdSet: HashSet<String>,
@SerializedName("game_block")
var filterGameIdSet: HashSet<String>,
@SerializedName("channel_control")
var channelControl: ChannelControl,
@SerializedName("game_h5_download")
var gameH5DownloadList: List<GameH5Download>,
@SerializedName("game_special_download")
var gameSpecialDownloadInfoList: List<GameSpecialDownloadInfo>
) {
@Keep
data class ChannelControl(
@SerializedName("game_category")
var gameCategory: String,
@SerializedName("effect")
var effect: Boolean)
@SerializedName("game_category")
var gameCategory: String,
@SerializedName("effect")
var effect: Boolean
)
@Keep
data class GameH5Download(
@SerializedName("game_id")
var gameId: String,// 游戏id
@SerializedName("h5_link")
var h5Link: String,// 网页链接
@SerializedName("download_link")
var downloadLink: String,// 下载链接
@SerializedName("button_text")
var buttonText: String,// 按钮文案
)
data class GameSpecialDownloadInfo(
@SerializedName("game_id")
var gameId: String = "",
@SerializedName("bbs_id")
var bbsId: String = "",
@SerializedName("top_id")
var topId: String = "",
@SerializedName("hint_text")
var hintText: String = ""
)
}

View File

@ -1,14 +1,14 @@
package com.gh.common.filter
import android.annotation.SuppressLint
import com.gh.common.constant.Constants
import com.gh.common.util.SPUtils
import com.gh.common.util.debounceActionWithInterval
import com.gh.common.util.toJson
import com.gh.common.util.toObject
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.common.utils.debounceActionWithInterval
import com.gh.gamecenter.common.utils.toJson
import com.gh.gamecenter.common.utils.toObject
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.common.retrofit.BiResponse
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import io.reactivex.functions.Function
@ -19,6 +19,8 @@ object RegionSettingHelper {
private var mChannelControl: RegionSetting.ChannelControl? = null
private var mFilterGameIdSet: HashSet<String>? = hashSetOf()
private var mDisplayMirrorIfoGameIdSet: HashSet<String>? = hashSetOf()
private var mGameH5DownloadList: List<RegionSetting.GameH5Download>? = listOf()
private var mGameSpecialDownloadInfoList: List<RegionSetting.GameSpecialDownloadInfo>? = listOf()
private const val SP_SETTING = "region_setting"
@ -31,6 +33,12 @@ object RegionSettingHelper {
return mFilterGameIdSet?.contains(gameId) ?: false
}
fun shouldThisGameShowSpecialDownload(gameId: String) =
mGameSpecialDownloadInfoList?.any { it.gameId == gameId } ?: false
@JvmStatic
fun getGameSpecialDownloadInfo(gameId: String) = mGameSpecialDownloadInfoList?.find { it.gameId == gameId }
@JvmStatic
fun filterGame(list: List<GameEntity>?): ArrayList<GameEntity> {
if (list == null) return arrayListOf()
@ -58,27 +66,33 @@ object RegionSettingHelper {
}
}
@JvmStatic
fun getGameH5DownloadByGameId(gameId: String): RegionSetting.GameH5Download? {
if (mGameH5DownloadList.isNullOrEmpty()) return null
return mGameH5DownloadList!!.find { it.gameId == gameId }
}
@SuppressLint("CheckResult")
@JvmStatic
fun getRegionSetting() {
debounceActionWithInterval(R.string.app_name, 5000) {
// 使用默认的 Schdulers.io() 可能会触发 OOM
RetrofitManager.getInstance()
.api
.getRegionSetting(HaloApp.getInstance().channel)
.subscribeOn(Schedulers.io())
.subscribe(object : BiResponse<RegionSetting>() {
override fun onSuccess(data: RegionSetting) {
updateSettingsInMemory(data)
SPUtils.setString(SP_SETTING, data.toJson())
}
.api
.getRegionSetting(HaloApp.getInstance().channel)
.subscribeOn(Schedulers.io())
.subscribe(object : BiResponse<RegionSetting>() {
override fun onSuccess(data: RegionSetting) {
updateSettingsInMemory(data)
SPUtils.setString(SP_SETTING, data.toJson())
}
override fun onFailure(exception: Exception) {
SPUtils.getString(SP_SETTING)?.toObject<RegionSetting>()?.let {
updateSettingsInMemory(it)
}
override fun onFailure(exception: Exception) {
SPUtils.getString(SP_SETTING)?.toObject<RegionSetting>()?.let {
updateSettingsInMemory(it)
}
})
}
})
}
}
@ -86,6 +100,8 @@ object RegionSettingHelper {
mFilterGameIdSet = data.filterGameIdSet
mDisplayMirrorIfoGameIdSet = data.mirrorGameIdSet
mChannelControl = data.channelControl
mGameH5DownloadList = data.gameH5DownloadList
mGameSpecialDownloadInfoList = data.gameSpecialDownloadInfoList
}
/**

View File

@ -16,23 +16,30 @@ import com.gh.gamecenter.room.converter.*
import com.gh.gamecenter.room.dao.*
import com.halo.assistant.HaloApp
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class, GamesCollectionEntity::class], version = 10, exportSchema = false)
@TypeConverters(CountConverter::class,
CommunityConverter::class,
TimeConverter::class,
AnswerUserConverter::class,
ThumbnailConverter::class,
TagStyleListConverter::class,
StringArrayListConverter::class,
ListStringConverter::class,
CommunityVideoConverter::class,
UserConverter::class,
ImageInfoConverter::class,
VideoInfoConverter::class,
QuestionsConverter::class,
MeConverter::class,
SimpleGameListConverter::class,
TagInfoListConverter::class)
@Database(
entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class, GamesCollectionEntity::class],
version = 11,
exportSchema = false
)
@TypeConverters(
CountConverter::class,
CommunityConverter::class,
TimeConverter::class,
AnswerUserConverter::class,
ThumbnailConverter::class,
TagStyleListConverter::class,
StringArrayListConverter::class,
ListStringConverter::class,
CommunityVideoConverter::class,
UserConverter::class,
ImageInfoConverter::class,
VideoInfoConverter::class,
QuestionsConverter::class,
MeConverter::class,
SimpleGameListConverter::class,
TagInfoListConverter::class,
ActivityLabelListConverter::class
)
abstract class HistoryDatabase : RoomDatabase() {
@ -108,22 +115,34 @@ abstract class HistoryDatabase : RoomDatabase() {
val MIGRATION_9_10: Migration = object : Migration(9, 10) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE GamesCollectionEntity (id TEXT NOT NULL PRIMARY KEY, tags TEXT, games TEXT, title TEXT NOT NULL, intro TEXT NOT NULL, cover TEXT NOT NULL, display TEXT NOT NULL, stamp TEXT NOT NULL, count TEXT, user TEXT, me TEXT, orderTag INTEGER NOT NULL)"
database.execSQL(
"CREATE TABLE GamesCollectionEntity (id TEXT NOT NULL PRIMARY KEY, tags TEXT, games TEXT, title TEXT NOT NULL, intro TEXT NOT NULL, cover TEXT NOT NULL, display TEXT NOT NULL, stamp TEXT NOT NULL, count TEXT, user TEXT, me TEXT, orderTag INTEGER NOT NULL)"
)
}
}
val MIGRATION_10_11: Migration = object : Migration(10, 11) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("Alter TABLE GamesCollectionEntity add activityTags TEXT DEFAULT ''")
}
}
val instance by lazy {
Room.databaseBuilder(HaloApp.getInstance().application, HistoryDatabase::class.java, "USER_TRACK_HISTORY_DATABASE")
.addMigrations(MIGRATION_2_3)
.addMigrations(MIGRATION_3_4)
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.addMigrations(MIGRATION_6_7)
.addMigrations(MIGRATION_7_8)
.addMigrations(MIGRATION_8_9)
.addMigrations(MIGRATION_9_10)
.build()
Room.databaseBuilder(
HaloApp.getInstance().application,
HistoryDatabase::class.java,
"USER_TRACK_HISTORY_DATABASE"
)
.addMigrations(MIGRATION_2_3)
.addMigrations(MIGRATION_3_4)
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.addMigrations(MIGRATION_6_7)
.addMigrations(MIGRATION_7_8)
.addMigrations(MIGRATION_8_9)
.addMigrations(MIGRATION_9_10)
.addMigrations(MIGRATION_10_11)
.build()
}
}

View File

@ -1,10 +1,10 @@
package com.gh.common.history
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.common.util.tryCatchInRelease
import com.gh.gamecenter.common.utils.clearHtmlFormatCompletely
import com.gh.gamecenter.common.utils.removeInsertedContent
import com.gh.gamecenter.common.utils.removeVideoContent
import com.gh.gamecenter.common.utils.tryCatchInRelease
import com.gh.gamecenter.core.runOnIoThread
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.qa.entity.AnswerDetailEntity
import com.gh.gamecenter.qa.entity.AnswerEntity
@ -26,7 +26,11 @@ object HistoryHelper {
fun insertGamesCollectionEntity(gamesCollectionDetailEntity: GamesCollectionDetailEntity) {
val gamesCollectionEntity = convertGamesCollectionDetailToGamesCollection(gamesCollectionDetailEntity)
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.gamesCollectionDao().addGamesCollection(gamesCollectionEntity) } }
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.gamesCollectionDao().addGamesCollection(gamesCollectionEntity)
}
}
}
@JvmStatic
@ -78,27 +82,47 @@ object HistoryHelper {
@JvmStatic
fun deleteNewsEntity(newsId: String) {
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.newsDao().deleteNews(NewsEntity().apply { id = newsId }) } }
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.newsDao().deleteNews(NewsEntity().apply { id = newsId })
}
}
}
@JvmStatic
fun deleteGameEntity(gameId: String) {
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.gameDao().deleteGame(HistoryGameEntity(id = gameId)) } }
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.gameDao().deleteGame(HistoryGameEntity(id = gameId))
}
}
}
@JvmStatic
fun deleteArticleEntity(articleId: String) {
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.articleDao().deleteArticle(ArticleEntity(id = articleId)) } }
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.articleDao().deleteArticle(ArticleEntity(id = articleId))
}
}
}
@JvmStatic
fun deleteAnswerEntity(answerId: String) {
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.answerDao().deleteAnswer(AnswerEntity().apply { primaryKey = answerId }) } }
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.answerDao().deleteAnswer(AnswerEntity().apply { primaryKey = answerId })
}
}
}
@JvmStatic
fun deleteVideoEntity(videoId: String) {
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.videoHistoryDao().deleteVideo(MyVideoEntity().apply { id = videoId }) } }
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.videoHistoryDao().deleteVideo(MyVideoEntity().apply { id = videoId })
}
}
}
@JvmStatic
@ -108,7 +132,12 @@ object HistoryHelper {
@JvmStatic
fun deleteGamesCollectionEntity(gameCollectionId: String) {
runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.gamesCollectionDao().deleteGamesCollection(GamesCollectionEntity(id = gameCollectionId)) }}
runOnIoThread {
tryCatchInRelease {
HistoryDatabase.instance.gamesCollectionDao()
.deleteGamesCollection(GamesCollectionEntity(id = gameCollectionId))
}
}
}
@ -121,7 +150,9 @@ object HistoryHelper {
val articleEntity = ArticleEntity()
articleEntity.id = articleDetailEntity.id
articleEntity.brief = articleDetailEntity.content.removeVideoContent().removeInsertedContent().clearHtmlFormatCompletely().replace(" +".toRegex(), " ")
articleEntity.brief =
articleDetailEntity.content.removeVideoContent().removeInsertedContent().clearHtmlFormatCompletely()
.replace(" +".toRegex(), " ")
articleEntity.count = articleDetailEntity.count
articleDetailEntity.community.id = articleDetailEntity.communityId
articleEntity.community = articleDetailEntity.community
@ -146,7 +177,9 @@ object HistoryHelper {
answerEntity.vote = answerDetailEntity.vote
answerEntity.user = answerDetailEntity.user
answerEntity.orderTag = System.currentTimeMillis()
answerEntity.brief = answerDetailEntity.content.removeVideoContent().removeInsertedContent().clearHtmlFormatCompletely().replace(" +".toRegex(), " ")
answerEntity.brief =
answerDetailEntity.content.removeVideoContent().removeInsertedContent().clearHtmlFormatCompletely()
.replace(" +".toRegex(), " ")
answerEntity.time = answerDetailEntity.time
answerEntity.images = answerDetailEntity.images
answerEntity.imagesInfo = answerDetailEntity.imagesInfo
@ -160,6 +193,7 @@ object HistoryHelper {
gamesCollectionEntity.id = gamesCollectionDetailEntity.id
gamesCollectionEntity.tags = gamesCollectionDetailEntity.tags
gamesCollectionEntity.activityTags = gamesCollectionDetailEntity.activityTags
gamesCollectionDetailEntity.games?.take(3)?.map { it.toSimpleGame() }?.run {
gamesCollectionEntity.games = ArrayList(this)
}
@ -175,7 +209,8 @@ object HistoryHelper {
id = id ?: "",
name = name ?: "",
icon = icon ?: "",
badge = badge)
badge = badge
)
}
gamesCollectionEntity.me = gamesCollectionDetailEntity.me

View File

@ -1,67 +0,0 @@
//package com.gh.common.im
//
//import android.app.Activity
//import androidx.core.view.ViewCompat
//import android.view.View
//import android.view.ViewGroup
//
//object ImHintHelper {
//
// @JvmStatic
// fun show(activity: Activity?) {
// activity?.let {
// var hintView = retrieveHintViewFromActivity(it)
// if (hintView == null) {
// hintView = ImHintView(it)
// hintView.showDot(ImManager.shouldShowFloatingWindowDot)
//
// val decorView = it.window.decorView as ViewGroup
// it.runOnUiThread {
// decorView.addView(hintView)
// }
// } else {
// hintView.showDot(ImManager.shouldShowFloatingWindowDot)
// }
// }
// }
//
// @JvmStatic
// fun dismiss(activity: Activity?) {
// activity?.let {
// clearCurrent(it)
// }
// }
//
// private fun retrieveHintViewFromActivity(activity: Activity?) : ImHintView? {
// (activity?.window?.decorView as? ViewGroup)?.let {
// for (i in 0..it.childCount) {
// val childView = if (it.getChildAt(i) is ImHintView) it.getChildAt(i) as ImHintView else null
// if (childView != null && childView.windowToken != null) {
// return childView
// }
// }
// return null
// }
// return null
// }
//
// private fun clearCurrent(activity: Activity?) {
// (activity?.window?.decorView as? ViewGroup)?.let {
// for (i in 0..it.childCount) {
// val childView = if (it.getChildAt(i) is ImHintView) it.getChildAt(i) as ImHintView else null
// if (childView != null && childView.windowToken != null) {
// ViewCompat.animate(childView).alpha(0f).withEndAction(getRemoveViewRunnable(childView))
// }
// }
// }
// }
//
// private fun getRemoveViewRunnable(childView: View?): Runnable {
// return Runnable {
// childView?.let {
// (childView.parent as? ViewGroup)?.removeView(childView)
// }
// }
// }
//
//}

View File

@ -1,45 +0,0 @@
//package com.gh.common.im
//
//import android.app.Activity
//import android.content.Context
//import android.util.AttributeSet
//import android.util.TypedValue
//import android.view.View
//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.*
//
//class ImHintView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0)
// : RelativeLayout(context, attrs, defStyle) {
//
// init {
// inflate(context, R.layout.view_im_hint, this)
//
// ViewCompat.setTranslationZ(this, Integer.MAX_VALUE.toFloat() - 1)
//
// ivContainer.setOnClickListener {
// if (context is Activity) {
// ImManager.startChatActivity(context)
// ImManager.removeNotification()
// }
// }
//
// val lp = ivContainer.layoutParams as RelativeLayout.LayoutParams
//
// lp.setMargins(0, 0, dp2px(30f), dp2px(106f) + DisplayUtils.retrieveNavigationHeight(context))
// }
//
// fun showDot(show: Boolean) {
// if (show) {
// unreadDot.visibility = View.VISIBLE
// } else {
// unreadDot.visibility = View.GONE
// }
// }
//
// private fun dp2px(dp: Float): Int {
// return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt()
// }
//}

View File

@ -1,145 +0,0 @@
package com.gh.common.im
import android.app.Activity
import com.gh.gamecenter.HelpAndFeedbackActivity
import com.gh.gamecenter.MainActivity
import com.gh.gamecenter.MessageActivity
object ImManager {
const val IM_KEY = "893be270-9c75-11e8-a344-212975ba32b9"
const val SP_FLOATING_WINDOW_KEY = "IM_FLOATING_WINDOW"
const val SP_FLOATING_WINDOW_DOT_KEY = "IM_FLOATING_WINDOW_DOT"
var shouldShowFloatingWindow = false
var shouldShowFloatingWindowDot = false
// 记录当前用户 ID 避免重复初始化
var currentUserId = ""
@JvmStatic
fun attachIm() {
// try {
// if (UserManager.getInstance().userInfoEntity != null &&
// currentUserId != UserManager.getInstance().userId) {
// currentUserId = UserManager.getInstance().userId
// MoorUtils.init(HaloApp.getInstance().application)
// Utils.init(HaloApp.getInstance().application)
// IMChatManager.getInstance().init(
// HaloApp.getInstance().application,
// ImReceiver.UNIQUE_BROADCAST_ACTION,
// IM_KEY,
// UserManager.getInstance().userInfoEntity?.name + "(" + UserManager.getInstance().userId + ")",
// UserManager.getInstance().userId)
//
// shouldShowFloatingWindow = SPUtils.getBoolean(SP_FLOATING_WINDOW_KEY + UserManager.getInstance().userId)
// shouldShowFloatingWindowDot = SPUtils.getBoolean(SP_FLOATING_WINDOW_DOT_KEY + UserManager.getInstance().userId)
// updateFloatingWindow()
// }
// } catch (e: Exception) {
// e.printStackTrace()
// }
}
@JvmStatic
fun detachIm() {
// try {
// IMChatManager.getInstance().quitSDk()
// shouldShowFloatingWindow = false
// updateFloatingWindow()
// removeNotification()
// } catch (e: Exception) {
// e.printStackTrace()
// }
}
@JvmStatic
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, inputContent, requestCode)
// chatHelper.initSdkChat(
// ImReceiver.UNIQUE_BROADCAST_ACTION,
// IM_KEY,
// UserManager.getInstance().userInfoEntity?.name + "(" + UserManager.getInstance().userId + ")"
// + "[" + BuildConfig.VERSION_NAME + "]",
// UserManager.getInstance().userId)
// } catch (e: Exception) {
// e.printStackTrace()
// }
// }
}
@JvmStatic
fun showFloatingWindow() {
updateShouldShowFloatingWindow(true)
updateShouldShowFloatingWindowDot(true)
updateFloatingWindow()
}
@JvmStatic
fun dismissFloatingWindow() {
updateShouldShowFloatingWindow(false)
updateShouldShowFloatingWindowDot(false)
updateFloatingWindow()
}
@JvmStatic
fun removeNotification() {
// val notificationManager = HaloApp.getInstance().application?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// notificationManager.cancel(ImReceiver.NOTIFICATION_ID)
}
@JvmStatic
fun updateFloatingWindow() {
// try {
// CurrentActivityHolder.getCurrentActivity()?.let {
// if (isActivityValid(it)) {
// if (shouldShowFloatingWindow) {
// ImHintHelper.show(it)
// } else {
// ImHintHelper.dismiss(it)
// removeNotification()
// }
// }
// }
// } catch (e: Exception) {
// e.printStackTrace()
// }
}
@JvmStatic
fun sendFeedbackMessage(message: String) {
// val fromToMessage = IMMessage.createTxtMessage(message)
// runOnIoThread {
// tryWithDefaultCatch {
// IMChat.getInstance().sendMessage(fromToMessage, object : ChatListener {
// override fun onProgress(p0: Int) {}
// override fun onSuccess() {}
// override fun onFailed() {}
// })
// }
// }
}
fun updateShouldShowFloatingWindow(show: Boolean) {
// SPUtils.setBoolean(SP_FLOATING_WINDOW_KEY + UserManager.getInstance().userId, show)
// shouldShowFloatingWindow = show
}
fun updateShouldShowFloatingWindowDot(show: Boolean) {
// SPUtils.setBoolean(SP_FLOATING_WINDOW_DOT_KEY + UserManager.getInstance().userId, show)
// shouldShowFloatingWindowDot = show
}
private fun isActivityValid(activity: Activity): Boolean {
return when (activity) {
is MainActivity -> true
is HelpAndFeedbackActivity -> true
is MessageActivity -> true
else -> false
}
}
}

View File

@ -1,68 +0,0 @@
package com.gh.common.im
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
class ImReceiver : BroadcastReceiver() {
companion object {
const val UNIQUE_BROADCAST_ACTION = "com.gh.im"
const val NOTIFICATION_ID: Int = 987321
}
var notificationManager: NotificationManager? = null
override fun onReceive(context: Context?, intent: Intent?) {
// 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()
// }
// }
// }
}
}

View File

@ -1,21 +0,0 @@
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

@ -1,17 +0,0 @@
package com.gh.common.loghub
import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.parcelize.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

@ -1,18 +0,0 @@
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

@ -1,110 +0,0 @@
package com.gh.common.loghub
import android.app.Application
import androidx.annotation.Keep
import com.aliyun.sls.android.producer.Log
import com.gh.common.exposure.ExposureEntity
import com.gh.common.exposure.meta.Meta
import com.gh.common.util.tryWithDefaultCatch
import org.json.JSONObject
import java.util.concurrent.ExecutorService
object LoghubUtils {
private const val STORE_SIZE = 100
private lateinit var mApplication: Application
private val loghubEventSet by lazy { hashSetOf<LoghubEvent>() }
private var loghubEventExecutor: ExecutorService? = null
private val loghubEventDao by lazy { LoghubDatabase.buildDatabase(mApplication).logHubEventDao() }
@JvmStatic
fun init(application: Application, executor: ExecutorService) {
mApplication = application
loghubEventExecutor = executor
loghubEventExecutor?.execute {
tryWithDefaultCatch {
val eventList = loghubEventDao.getAll()
loghubEventSet.addAll(eventList)
}
}
}
@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()
}
}
}
@JvmStatic
fun log(jsonString: String, logStore: String, forcedUpload: Boolean) {
loghubEventExecutor?.execute {
try {
val event = LoghubEvent(time = (System.currentTimeMillis() / 1000L).toString(), content = jsonString, logStore = logStore)
loghubEventSet.add(event)
loghubEventDao.insert(event)
} catch (e: Exception) {
e.printStackTrace()
}
if (forcedUpload || loghubEventSet.size >= STORE_SIZE) {
commitSavedLoghubEvents()
}
}
}
fun commitSavedLoghubEvents() {
loghubEventExecutor?.execute {
// TODO 初始化 loghubHelper 去掉这个 tryCatch 块
tryWithDefaultCatch {
if (loghubEventSet.isEmpty()) return@execute
val exposureList = loghubEventSet.toList()
uploadEvents()
loghubEventSet.removeAll(exposureList)
loghubEventDao.deleteMany(exposureList)
}
}
}
private fun uploadEvents() {
for (event in loghubEventSet) {
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)
}
LoghubHelper.uploadLog(log, event.logStore)
}
}
}
@Keep
data class SimpleLogContainerEntity(
var event: String? = null,
var action: String? = null,
var meta: Meta? = null,
var payload: ExposureEntity? = null,
var timestamp: Long? = 0)

View File

@ -1,170 +0,0 @@
package com.gh.common.notifier
import android.app.Activity
import androidx.core.view.ViewCompat
import android.view.View
import android.view.ViewGroup
import com.gh.common.util.SPUtils
import com.gh.gamecenter.*
import java.lang.ref.WeakReference
@Suppress("DEPRECATION")
class Notifier private constructor() {
companion object {
private var activityWeakReference: WeakReference<Activity>? = null
private const val SP_VIEWED_NOTIFIER = "viewed_notifier"
/**
* 根据内容决定是否显示 Notifier
*/
@JvmStatic
fun shouldShowNotifier(content: String): Boolean {
val viewedNotifierCollection = SPUtils.getString(SP_VIEWED_NOTIFIER)
return !viewedNotifierCollection.contains(content)
}
/**
* 标记相应内容的 Notifier 已经显示过了
*/
@JvmStatic
fun tagNotifierAsShowed(content: String) {
val viewedNotifierCollection = SPUtils.getString(SP_VIEWED_NOTIFIER)
if (viewedNotifierCollection.length > 3000) {
SPUtils.setString(SP_VIEWED_NOTIFIER, content)
} else {
SPUtils.setString(SP_VIEWED_NOTIFIER, viewedNotifierCollection + content)
}
}
@JvmStatic
fun create(activity: Activity?): Notifier {
if (activity == null) {
throw IllegalArgumentException("Activity cannot be null!")
}
val notifier = Notifier()
// Hide current NotifierView, if one is active
clearCurrent(activity)
notifier.setActivity(activity)
notifier.notifierView = NotifierView(activity)
return notifier
}
@JvmStatic
fun isActivityValid(activity: Activity?): Boolean {
if (activity == null) return false
return when (activity) {
is MessageActivity -> false
is DownloadManagerActivity -> false
is CleanApkActivity -> false
is SplashScreenActivity -> false
else -> isNotExistInActivity(activity)
}
}
@JvmStatic
fun isNotExistInActivity(activity: Activity?): Boolean {
if (activity == null) return false
(activity.window?.decorView as? ViewGroup)?.let {
//Find all NotifierView Views in Parent layout
for (i in 0..it.childCount) {
val childView = if (it.getChildAt(i) is NotifierView) it.getChildAt(i) as NotifierView else null
if (childView != null && childView.windowToken != null) {
return false
}
}
}
return true
}
/**
* Cleans up the currently showing notifierView view, if one is present
*
* @param activity The current Activity
*/
@JvmStatic
fun clearCurrent(activity: Activity?) {
(activity?.window?.decorView as? ViewGroup)?.let {
//Find all NotifierView Views in Parent layout
for (i in 0..it.childCount) {
val childView = if (it.getChildAt(i) is NotifierView) it.getChildAt(i) as NotifierView else null
if (childView != null && childView.windowToken != null) {
ViewCompat.animate(childView).alpha(0f).withEndAction(getRemoveViewRunnable(childView))
}
}
}
}
@JvmStatic
fun hide() {
activityWeakReference?.get()?.let { clearCurrent(it) }
}
private fun getRemoveViewRunnable(childView: NotifierView?): Runnable {
return Runnable {
childView?.let {
(childView.parent as? ViewGroup)?.removeView(childView)
}
}
}
}
private var notifierView: NotifierView? = null
private val activityDecorView: ViewGroup?
get() {
var decorView: ViewGroup? = null
activityWeakReference?.get()?.let {
decorView = it.window.decorView as ViewGroup
}
return decorView
}
fun show(showVerticalTranslateAnimation: Boolean, delay: Long? = 0): NotifierView? {
activityWeakReference?.get()?.let {
it.runOnUiThread {
activityDecorView?.postDelayed({
notifierView?.showVerticalTranslateAnimation = showVerticalTranslateAnimation
activityDecorView?.addView(notifierView)
}, delay!!)
}
}
return notifierView
}
fun setIcon(url: String?): Notifier {
url?.let { notifierView?.setIcon(it) }
return this
}
fun setText(text: String?): Notifier {
notifierView?.setText(text)
return this
}
fun setDuration(time: Long): Notifier {
notifierView?.duration = time
return this
}
fun setOnClickListener(onClickListener: View.OnClickListener): Notifier {
notifierView?.findViewById<View>(R.id.cardView)?.setOnClickListener(onClickListener)
return this
}
private fun setActivity(activity: Activity) {
activityWeakReference = WeakReference(activity)
}
}

View File

@ -1,312 +0,0 @@
package com.gh.common.notifier
import android.animation.*
import android.content.Context
import android.graphics.Path
import android.text.TextUtils
import android.util.AttributeSet
import android.util.Log
import android.util.TypedValue
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.core.view.ViewCompat
import com.facebook.drawee.view.SimpleDraweeView
import com.gh.common.util.DisplayUtils
import com.gh.common.util.ImageUtils
import com.gh.common.util.doOnEnd
import com.gh.common.util.doOnStart
import com.gh.gamecenter.R
class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0)
: FrameLayout(context, attrs, defStyle) {
companion object {
const val SCALE_MINI = 0.2F
const val SCALE_DEFAULT = 1F
const val DEFAULT_DURATION = 500L
}
var onShowListener: OnShowNotificationListener? = null
var onHideListener: OnHideNotificationListener? = null
lateinit var expandAnimator: ValueAnimator
lateinit var shrinkAnimator: ValueAnimator
lateinit var translateUpAnimator: ObjectAnimator
lateinit var translateDownAnimator: ObjectAnimator
lateinit var translateToLeftAnimator: ObjectAnimator
lateinit var translateToRightAnimator: ObjectAnimator
lateinit var zoomInAnimator: ObjectAnimator
lateinit var zoomOutAnimator: ObjectAnimator
var showAnimatorSet: AnimatorSet
var hideAnimatorSet: AnimatorSet
var rightToLeftPath: Path
var leftToRightPath: Path
var veryRight: Float = 0F
var veryBottom: Float = 0F
var centerX: Float = 0F
var navigationHeight = 0
var textWidth: Int = 0
var cardViewWidth: Int = 0
var verticalAnimationOffset: Int = 0
var duration = DEFAULT_DURATION
var showVerticalTranslateAnimation: Boolean = true
private var mCardView: CardView
private var mContentTv: TextView
private var mIconIv: SimpleDraweeView
init {
inflate(context, R.layout.view_notifier, this)
ViewCompat.setTranslationZ(this, Integer.MAX_VALUE.toFloat())
mCardView = findViewById(R.id.cardView)
mContentTv = findViewById(R.id.tvText)
mIconIv = findViewById(R.id.ivIcon)
mCardView.scaleX = SCALE_MINI
mCardView.scaleY = SCALE_MINI
verticalAnimationOffset = dp2px(100F)
navigationHeight = DisplayUtils.retrieveNavigationHeight(context)
rightToLeftPath = Path()
leftToRightPath = Path()
showAnimatorSet = AnimatorSet()
hideAnimatorSet = AnimatorSet()
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
centerX = (left + right - cardViewWidth) / 2F
// TODO Provide method to change these absolute offset.
val r = right - dp2px(72F).toFloat()
val b = bottom - dp2px(145F).toFloat() - navigationHeight
// Only set
if (veryRight != r || veryBottom != b) {
veryRight = r
veryBottom = b
rightToLeftPath.moveTo(r, b)
rightToLeftPath.lineTo(centerX, b)
leftToRightPath.moveTo(centerX, b)
leftToRightPath.lineTo(r, b)
initAnimator()
}
}
private fun initAnimator() {
expandAnimator = ValueAnimator.ofFloat(0F, 1F)
expandAnimator.duration = DEFAULT_DURATION
expandAnimator.addUpdateListener { a ->
val progress = a?.animatedValue as Float
mContentTv.width = (textWidth * progress).toInt()
}
expandAnimator.doOnEnd {
enableSwipeToDismiss()
shrinkAfterDelay()
}
shrinkAnimator = ValueAnimator.ofFloat(1F, 0F)
shrinkAnimator.duration = DEFAULT_DURATION
shrinkAnimator.addUpdateListener { a ->
val progress = a?.animatedValue as Float
mContentTv.width = (textWidth * progress).toInt()
}
shrinkAnimator.doOnEnd {
val lp = FrameLayout.LayoutParams(mCardView.layoutParams)
lp.gravity = Gravity.NO_GRAVITY
mCardView.layoutParams = lp
disableSwipeToDismiss()
}
translateToLeftAnimator = ObjectAnimator.ofFloat(mCardView, "translationX", veryRight, centerX)
translateToLeftAnimator.duration = DEFAULT_DURATION
translateToLeftAnimator.doOnEnd {
onShowListener?.onShow()
val lp = FrameLayout.LayoutParams(mCardView.layoutParams)
lp.gravity = Gravity.CENTER_HORIZONTAL
mCardView.layoutParams = lp
mCardView.translationX = 0f
expandAnimator.start()
}
translateToRightAnimator = ObjectAnimator.ofFloat(mCardView, "translationX", centerX, veryRight)
translateToRightAnimator.duration = DEFAULT_DURATION
translateUpAnimator = ObjectAnimator.ofFloat(mCardView, "translationY", veryBottom + verticalAnimationOffset, veryBottom)
translateUpAnimator.duration = DEFAULT_DURATION
translateUpAnimator.doOnStart { mCardView.translationX = veryRight }
translateDownAnimator = ObjectAnimator.ofFloat(mCardView, "translationY", veryBottom, veryBottom + verticalAnimationOffset)
translateDownAnimator.duration = DEFAULT_DURATION
zoomInAnimator = ObjectAnimator.ofPropertyValuesHolder(mCardView, PropertyValuesHolder.ofFloat("scaleX", SCALE_DEFAULT),
PropertyValuesHolder.ofFloat("scaleY", SCALE_DEFAULT))
zoomInAnimator.duration = DEFAULT_DURATION
zoomInAnimator.doOnStart { mCardView.translationX = veryRight }
zoomInAnimator.doOnStart { mCardView.translationY = veryBottom }
zoomOutAnimator = ObjectAnimator.ofPropertyValuesHolder(mCardView, PropertyValuesHolder.ofFloat("scaleX", SCALE_MINI),
PropertyValuesHolder.ofFloat("scaleY", SCALE_MINI))
zoomOutAnimator.duration = DEFAULT_DURATION
zoomOutAnimator.doOnEnd { removeFromParent() }
if (showVerticalTranslateAnimation) {
showAnimatorSet.play(translateUpAnimator).with(zoomInAnimator).before(translateToLeftAnimator)
} else {
showAnimatorSet.play(zoomInAnimator).before(translateToLeftAnimator)
}
showAnimatorSet.start()
}
private fun enableSwipeToDismiss() {
mCardView?.setOnTouchListener(SwipeDismissTouchListener(mCardView, object : SwipeDismissTouchListener.DismissCallbacks {
override fun canDismiss(): Boolean {
return true
}
override fun onDismiss(view: View) {
removeFromParent()
}
override fun onTouch(view: View, touch: Boolean) {
// Ignore.
}
}))
}
private fun disableSwipeToDismiss() {
mCardView?.setOnTouchListener(null)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
showAnimatorSet.cancel()
hideAnimatorSet.cancel()
try {
removeAllListeners(expandAnimator,
shrinkAnimator,
translateUpAnimator,
translateDownAnimator,
translateToLeftAnimator,
translateToRightAnimator)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun removeAllListeners(vararg ts: Animator) {
for (a in ts) {
a.removeAllListeners()
if (a is ValueAnimator) {
a.removeAllUpdateListeners()
}
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
performClick()
return super.onTouchEvent(event)
}
private fun shrinkAfterDelay() {
postDelayed({ shrink() }, duration)
}
private fun shrink() {
shrinkAnimator.doOnEnd { hide() }
shrinkAnimator.start()
}
private fun removeFromParent() {
clearAnimation()
visibility = View.GONE
postDelayed(object : Runnable {
override fun run() {
try {
if (parent == null) {
Log.e(javaClass.simpleName, "getParent() returning Null")
} else {
try {
(parent as ViewGroup).removeView(this@NotifierView)
onHideListener?.onHide()
} catch (ex: Exception) {
Log.e(javaClass.simpleName, "Cannot remove from parent layout")
}
}
} catch (ex: Exception) {
Log.e(javaClass.simpleName, Log.getStackTraceString(ex))
}
}
}, 100)
}
fun setText(text: String?) {
if (!TextUtils.isEmpty(text)) {
mContentTv.text = text
mContentTv.measure(0, 0)
textWidth = mContentTv.measuredWidth
mContentTv.width = 0
mCardView.measure(0, 0)
cardViewWidth = mCardView.measuredWidth
}
}
fun hide() {
if (showVerticalTranslateAnimation) {
hideAnimatorSet.play(translateDownAnimator).with(zoomOutAnimator).after(translateToRightAnimator)
} else {
hideAnimatorSet.play(zoomOutAnimator).after(translateToRightAnimator)
}
hideAnimatorSet.start()
}
fun setIcon(url: String) {
ImageUtils.display(mIconIv, url)
}
private fun dp2px(dp: Float): Int {
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt()
}
interface OnShowNotificationListener {
fun onShow()
}
interface OnHideNotificationListener {
fun onHide()
}
}

View File

@ -1,238 +0,0 @@
package com.gh.common.notifier
/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Modifications Copyright (C) 2017 David Kwon
*/
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.os.Build
import androidx.annotation.RequiresApi
import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.View
import android.view.ViewConfiguration
/**
* A [View.OnTouchListener] that makes any [View] dismissable when the
* user swipes (drags her finger) horizontally across the view.
*
* @param view The view to make dismissable.
* @param callbacks The callback to trigger when the user has indicated that she would like to
* dismiss this view.
*/
class SwipeDismissTouchListener(
private val mView: View,
private val mCallbacks: DismissCallbacks) : View.OnTouchListener {
// Cached ViewConfiguration and system-wide constant values
private val mSlop: Int
private val mMinFlingVelocity: Int
private val mAnimationTime: Long
private var mViewWidth = 1 // 1 and not 0 to prevent dividing by zero
// Transient properties
private var mDownX: Float = 0.toFloat()
private var mDownY: Float = 0.toFloat()
private var mSwiping: Boolean = false
private var mSwipingSlop: Int = 0
private var mVelocityTracker: VelocityTracker? = null
private var mTranslationX: Float = 0.toFloat()
init {
val vc = ViewConfiguration.get(mView.context)
mSlop = vc.scaledTouchSlop
mMinFlingVelocity = vc.scaledMinimumFlingVelocity * 16
mAnimationTime = mView.context.resources.getInteger(
android.R.integer.config_shortAnimTime).toLong()
}
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR1)
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
// offset because the view is translated during swipe
motionEvent.offsetLocation(mTranslationX, 0f)
if (mViewWidth < 2) {
mViewWidth = mView.width
}
when (motionEvent.actionMasked) {
MotionEvent.ACTION_DOWN -> {
mDownX = motionEvent.rawX
mDownY = motionEvent.rawY
if (mCallbacks.canDismiss()) {
mVelocityTracker = VelocityTracker.obtain()
mVelocityTracker!!.addMovement(motionEvent)
}
mCallbacks.onTouch(view, true)
return false
}
MotionEvent.ACTION_UP -> {
mVelocityTracker?.run {
val deltaX = motionEvent.rawX - mDownX
this.addMovement(motionEvent)
this.computeCurrentVelocity(1000)
val velocityX = this.xVelocity
val absVelocityX = Math.abs(velocityX)
val absVelocityY = Math.abs(this.yVelocity)
var dismiss = false
var dismissRight = false
if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) {
dismiss = true
dismissRight = deltaX > 0
} else if (mMinFlingVelocity <= absVelocityX && absVelocityY < absVelocityX && mSwiping) {
// dismiss only if flinging in the same direction as dragging
dismiss = velocityX < 0 == deltaX < 0
dismissRight = this.xVelocity > 0
}
if (dismiss) {
// dismiss
mView.animate()
.translationX((if (dismissRight) mViewWidth else -mViewWidth).toFloat())
.alpha(0f)
.setDuration(mAnimationTime)
.setListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
performDismiss()
}
})
} else if (mSwiping) {
// cancel
mView.animate()
.translationX(0f)
.alpha(1f)
.setDuration(mAnimationTime)
.setListener(null)
mCallbacks.onTouch(view, false)
}
this.recycle()
mVelocityTracker = null
mTranslationX = 0f
mDownX = 0f
mDownY = 0f
mSwiping = false
}
}
MotionEvent.ACTION_CANCEL -> {
mVelocityTracker?.run {
mView.animate()
.translationX(0f)
.alpha(1f)
.setDuration(mAnimationTime)
.setListener(null)
this.recycle()
mVelocityTracker = null
mTranslationX = 0f
mDownX = 0f
mDownY = 0f
mSwiping = false
}
}
MotionEvent.ACTION_MOVE -> {
mVelocityTracker?.run {
this.addMovement(motionEvent)
val deltaX = motionEvent.rawX - mDownX
val deltaY = motionEvent.rawY - mDownY
if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) {
mSwiping = true
mSwipingSlop = if (deltaX > 0) mSlop else -mSlop
mView.parent.requestDisallowInterceptTouchEvent(true)
// Cancel listview's touch
val cancelEvent = MotionEvent.obtain(motionEvent)
cancelEvent.action = MotionEvent.ACTION_CANCEL or (motionEvent.actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT)
mView.onTouchEvent(cancelEvent)
cancelEvent.recycle()
}
if (mSwiping) {
mTranslationX = deltaX
mView.translationX = deltaX - mSwipingSlop
// TODO: use an ease-out interpolator or such
mView.alpha = Math.max(0f, Math.min(1f,
1f - 2f * Math.abs(deltaX) / mViewWidth))
return true
}
}
}
else -> {
view.performClick()
return false
}
}
return false
}
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
private fun performDismiss() {
// Animate the dismissed view to zero-height and then fire the dismiss callback.
// This triggers layout on each animation frame; in the future we may want to do something
// smarter and more performant.
val lp = mView.layoutParams
val originalHeight = mView.height
val animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime)
animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
mCallbacks.onDismiss(mView)
// Reset view presentation
mView.alpha = 1f
mView.translationX = 0f
lp.height = originalHeight
mView.layoutParams = lp
}
})
animator.addUpdateListener { valueAnimator ->
lp.height = valueAnimator.animatedValue as Int
mView.layoutParams = lp
}
animator.start()
}
/**
* The callback interface used by [SwipeDismissTouchListener] to inform its client
* about a successful dismissal of the view for which it was created.
*/
interface DismissCallbacks {
/**
* Called to determine whether the view can be dismissed.
*
* @return boolean The view can dismiss.
*/
fun canDismiss(): Boolean
/**
* Called when the user has indicated they she would like to dismiss the view.
*
* @param view The originating [View]
*/
fun onDismiss(view: View)
/**
* Called when the user touches the view or release the view.
*
* @param view The originating [View]
* @param touch The view is being touched.
*/
fun onTouch(view: View, touch: Boolean)
}
}

View File

@ -0,0 +1,18 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.ActivationHelper
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IActivationProvider
@Route(path = RouteConsts.provider.activation, name = "ActivationHelper暴露服务")
class ActivationProviderImpl : IActivationProvider {
override fun init(context: Context?) {
// Do nothing
}
override fun sendActivationInfo() {
ActivationHelper.sendActivationInfo()
}
}

View File

@ -0,0 +1,55 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.gamecenter.R
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IAppProvider
import com.halo.assistant.HaloApp
@Route(path = RouteConsts.provider.app, name = "Application暴露服务")
class AppProviderImpl : IAppProvider {
override fun init(context: Context?) {
// Do nothing
}
override fun getAppName(): String {
return HaloApp.getInstance().getString(R.string.app_name)
}
override fun getGid(): String {
return HaloApp.getInstance().gid ?: ""
}
override fun refreshGid() {
HaloApp.getInstance().refreshGid()
}
override fun getOaid(): String {
return HaloApp.getInstance().oaid ?: ""
}
override fun getChannel(): String {
return HaloApp.getInstance().channel ?: ""
}
override fun getUserAgent(): String {
return HaloApp.getInstance().userAgent ?: ""
}
override fun getServerUserMark(): String {
return HaloApp.getInstance().serverUserMark ?: ""
}
override fun getDeviceRamSize(): Long {
return HaloApp.getInstance().deviceRamSize
}
override fun getTemporaryLocalDeviceId(): String {
return HaloApp.getInstance().temporaryLocalDeviceId ?: ""
}
override fun isUserAcceptPrivacyPolicy(context: Context): Boolean {
return HaloApp.isUserAcceptPrivacyPolicy(context)
}
}

View File

@ -0,0 +1,34 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IBuildConfigProvider
@Route(path = RouteConsts.provider.buildConfig, name = "BuildConfig暴露服务")
class BuildConfigImpl : IBuildConfigProvider {
override fun init(context: Context?) {
// Do nothing
}
override fun getApplicationId(): String = BuildConfig.APPLICATION_ID
override fun getVersionName(): String = BuildConfig.VERSION_NAME
override fun getExposureVersion(): String = BuildConfig.EXPOSURE_VERSION
override fun isDebug(): Boolean = BuildConfig.DEBUG
override fun getApiHost(): String = BuildConfig.API_HOST
override fun getDevApiHost(): String = BuildConfig.DEV_API_HOST
override fun getNewApiHost(): String = BuildConfig.NEW_API_HOST
override fun getNewDevApiHost(): String = BuildConfig.NEW_DEV_API_HOST
override fun getVApiHost(): String = BuildConfig.VAPI_HOST
override fun getVDevApiHost(): String = BuildConfig.DEV_VAPI_HOST
}

View File

@ -0,0 +1,18 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.CheckLoginUtils
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.ICheckLoginProvider
@Route(path = RouteConsts.provider.checkLogin, name = "CheckLoginUtils暴露服务")
class CheckLoginProviderImpl : ICheckLoginProvider {
override fun checkLogin(context: Context, entrance: String, action: (() -> Unit)?) {
CheckLoginUtils.checkLogin(context, entrance, action)
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,78 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.constant.Config
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IConfigProvider
@Route(path = RouteConsts.provider.config, name = "Config暴露服务")
class ConfigProviderImpl : IConfigProvider {
override fun getTencentAppId(): String {
return Config.TENCENT_APPID
}
override fun getWechatAppId(): String {
return Config.WECHAT_APPID
}
override fun getWechatSecret(): String {
return Config.WECHAT_SECRET
}
override fun getUploadLimitSize(): Long {
return Config.getSettings()?.image?.uploadLimitSize ?: 0L
}
override fun getSize(): Int {
return Config.getSettings()?.image?.size ?: 0
}
override fun getRatio(): Int {
return Config.getSettings()?.image?.ratio ?: 0
}
override fun getQuality(): Int {
return Config.getSettings()?.image?.quality ?: 0
}
override fun getGif(): String {
return Config.getSettings()?.image?.oss?.gif ?: ""
}
override fun getJpeg(): String {
return Config.getSettings()?.image?.oss?.jpeg ?: ""
}
override fun getWebp(): String {
return Config.getSettings()?.image?.oss?.webp ?: ""
}
override fun getGitThumb(): String {
return Config.getSettings()?.image?.oss?.gitThumb ?: ""
}
override fun getGifWaterMark(): String {
return Config.getSettings()?.image?.oss?.gifWaterMark ?: ""
}
override fun getQQ(): String {
return Config.getSettings()?.support?.qq ?: ""
}
override fun getQuickLoginAppId(): String {
return Config.QUICK_LOGIN_APPID
}
override fun getQuickLoginAppKey(): String {
return Config.QUICK_LOGIN_APPKEY
}
override fun getWeiboAppKey(): String {
return Config.WEIBO_APPKEY
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,20 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.DataUtils
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IDataUtilsProvider
import com.halo.assistant.HaloApp
@Route(path = RouteConsts.provider.dataUtils, name = "DataUtils暴露服务")
class DataUtilsProviderImpl : IDataUtilsProvider {
override fun getDeviceCertification() {
DataUtils.getDeviceCertification(HaloApp.getInstance().gid)
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,24 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.DefaultUrlHandler
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IDefaultUrlHandlerProvider
@Route(path = RouteConsts.provider.defaultUrlHandler, name = "DefaultUrlHandler暴露服务")
class DefaultUrlHandlerProviderImpl : IDefaultUrlHandlerProvider {
override fun interceptUrl(
context: Context,
url: String,
entrance: String,
bringAppToFront: Boolean
): Boolean {
return DefaultUrlHandler.interceptUrl(context, url, entrance, bringAppToFront)
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,28 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.DialogUtils
import com.gh.gamecenter.common.callback.CancelListener
import com.gh.gamecenter.common.callback.ConfirmListener
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IDialogUtilsProvider
@Route(path = RouteConsts.provider.dialogUtils, name = "DialogUtils暴露服务")
class DialogUtilsProviderImpl : IDialogUtilsProvider {
override fun showRegulationTestDialog(context: Context, confirm: () -> Unit, cancel: () -> Unit) {
DialogUtils.showRegulationTestDialog(context, object : ConfirmListener {
override fun onConfirm() {
confirm.invoke()
}
}, object : CancelListener {
override fun onCancel() {
cancel.invoke()
}
})
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,55 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.DirectUtils
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IDirectProvider
@Route(path = RouteConsts.provider.directUtils, name = "DirectUtils暴露服务")
class DirectProviderImpl : IDirectProvider {
override fun directToWebView(context: Context, url: String, entrance: String?) {
DirectUtils.directToWebView(context, url, entrance)
}
override fun directToRegulationTestPage(context: Context) {
DirectUtils.directToRegulationTestPage(context)
}
override fun directToQqConversation(context: Context, qq: String) {
DirectUtils.directToQqConversation(context, qq)
}
override fun directToCommodityDetail(context: Context, commodityId: String) {
DirectUtils.directToCommodityDetail(context, commodityId)
}
override fun directToEnergyRecord(context: Context) {
DirectUtils.directToEnergyRecord(context)
}
override fun directToEnergyRulePage(context: Context) {
DirectUtils.directToEnergyRulePage(context)
}
override fun directToInviteFriends(context: Context) {
DirectUtils.directToInviteFriends(context)
}
override fun directToExchangeRulePage(context: Context) {
DirectUtils.directToExchangeRulePage(context)
}
override fun directToExchangeCommodityPage(context: Context) {
DirectUtils.directToExchangeCommodityPage(context)
}
override fun directToLotteryParadisePage(context: Context) {
DirectUtils.directToLotteryParadisePage(context)
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,25 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.download.DownloadManager
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IDownloadManagerProvider
import com.lightgame.download.DownloadEntity
@Route(path = RouteConsts.provider.downloadManager, name = "DownloadManager暴露服务")
class DownloadManagerProviderImpl : IDownloadManagerProvider {
override fun getDownloadEntityByUrl(url: String): DownloadEntity? {
return DownloadManager.getInstance().getDownloadEntityByUrl(url)
}
override fun resumeAllInvisiblePendingTask() {
DownloadManager.getInstance().resumeAllInvisiblePendingTask()
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,23 @@
package com.gh.common.provider
import android.content.Context
import android.os.Bundle
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IEntranceUtilsProvider
@Route(path = RouteConsts.provider.entranceUtils, name = "EntranceUtils暴露服务")
class EntranceUtilsProviderImpl : IEntranceUtilsProvider {
override fun jumpActivity(context: Context, bundle: Bundle) {
EntranceUtils.jumpActivity(context, bundle)
}
override fun saveShortcut(activityName: String, bundle: Bundle?) {
EntranceUtils.saveShortcut(activityName, bundle)
}
override fun init(context: Context?) {
// Do nothing
}
}

View File

@ -0,0 +1,28 @@
package com.gh.common.provider
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.ErrorHelper
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IErrorHelperProvider
import retrofit2.HttpException
@Route(path = RouteConsts.provider.errorHelper, name = "ErrorHelper暴露服务")
class ErrorHelperProviderImpl : IErrorHelperProvider {
override fun handleError(
context: Context,
errorString: String?,
showHighPriorityHint: Boolean
) {
ErrorHelper.handleError(context, errorString, showHighPriorityHint)
}
override fun handleLoginError(context: Context, httpException: HttpException?) {
ErrorHelper.handleLoginError(context, httpException)
}
override fun init(context: Context?) {
// Do nothing
}
}

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