Compare commits

...

217 Commits

Author SHA1 Message Date
49a610deee feat: 动态java方法注册 2023-10-11 19:41:28 +08:00
61f43d53b2 feat: 文章详情WebView预加载 2023-10-11 15:52:35 +08:00
0dcf5d2097 Merge branch 'fix/GHZS-3596' into 'dev'
fix: 【光环助手】APP内图片显示问题 https://jira.shanqu.cc/browse/GHZS-3596

See merge request halo/android/assistant-android!1375
2023-10-09 15:08:09 +08:00
32e584c04c Merge remote-tracking branch 'origin/dev' into dev-5.32.0
# Conflicts:
#	dependencies.gradle
2023-10-09 10:45:04 +08:00
f726a4629f chore: 版本更新至 5.31.1 2023-10-09 10:40:01 +08:00
fbe29d82be fix: 【光环助手】APP内图片显示问题 https://jira.shanqu.cc/browse/GHZS-3596 2023-10-08 16:54:13 +08:00
a6c2254db3 Merge branch 'fix/GHZS-3600' into 'dev'
fix: 光环助手使用微信登录问题 https://jira.shanqu.cc/browse/GHZS-3600

See merge request halo/android/assistant-android!1374
2023-10-08 16:16:21 +08:00
3d4977dc87 Merge branch 'feature-GHZS-3462' into 'dev-5.32.0'
feat: 帖子加载问题优化—客户端 https://jira.shanqu.cc/browse/GHZS-3462

See merge request halo/android/assistant-android!1373
2023-10-08 16:14:05 +08:00
4d0fda6157 feat: 帖子加载问题优化—客户端 https://jira.shanqu.cc/browse/GHZS-3462 2023-10-08 16:14:05 +08:00
34fb8ccf93 fix: 光环助手使用微信登录问题 https://jira.shanqu.cc/browse/GHZS-3600 2023-10-08 16:07:48 +08:00
49b9c3a135 Merge branch 'release' into 'dev'
Release

See merge request halo/android/assistant-android!1372
2023-10-08 09:23:54 +08:00
bc04dcc94b Merge branch 'feature-article-detail-comment-no-data' into 'dev'
feat: 文章详情评论列表缺省图修改

See merge request halo/android/assistant-android!1371
2023-10-08 09:16:48 +08:00
eb0bba47f9 feat: 文章详情评论列表缺省图修改 2023-10-08 09:16:48 +08:00
9ba4e9c2cf Merge branch 'fix/GHZS-3532' into 'dev'
fix:【光环助手】同步正式环境问题-帮助视频问题 https://jira.shanqu.cc/browse/GHZS-3532

See merge request halo/android/assistant-android!1370
2023-10-07 14:06:48 +08:00
3a69bb4452 fix:【光环助手】同步正式环境问题-帮助视频问题 https://jira.shanqu.cc/browse/GHZS-3532 2023-10-07 14:06:48 +08:00
0581ebf409 Merge branch 'hotfix/v5.30.6-956/vivo_culprit' into 'release'
fix: 特殊处理 vivo 设备获取已安装列表权限的异常问题

See merge request halo/android/assistant-android!1369
2023-09-27 15:11:30 +08:00
44607a9039 fix: 特殊处理 vivo 设备获取已安装列表权限的异常问题 2023-09-27 15:06:23 +08:00
00db8c00c6 Merge branch 'feature-GHZS-3528' into 'dev'
fix 【光环助手】同步正式环境问题—帖子详情页相关问题 https://jira.shanqu.cc/browse/GHZS-3528

See merge request halo/android/assistant-android!1367
2023-09-26 11:14:31 +08:00
c64713117e fix 【光环助手】同步正式环境问题—帖子详情页相关问题 https://jira.shanqu.cc/browse/GHZS-3528 2023-09-26 11:14:31 +08:00
28e28d0775 feat: 畅玩游戏启动中转页面内容调整—客户端 https://jira.shanqu.cc/browse/CWZS-101 2023-09-26 09:33:09 +08:00
6f53a67554 feat: 畅玩游戏启动中转页面内容调整—客户端 https://jira.shanqu.cc/browse/CWZS-101 2023-09-26 09:33:09 +08:00
f2b965b447 Merge branch 'fix/GHZS-3513' into 'dev'
fix:【光环助手】同步正式环境问题-新游开测相关 https://jira.shanqu.cc/browse/GHZS-3513

See merge request halo/android/assistant-android!1365
2023-09-21 10:18:58 +08:00
0ae4f745ee fix:【光环助手】同步正式环境问题-新游开测相关 https://jira.shanqu.cc/browse/GHZS-3513 2023-09-21 10:10:05 +08:00
bcfd9cdfef Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2023-09-20 16:32:53 +08:00
94ffe5a86f chore: 版本更新至 5.30.6 2023-09-20 11:03:34 +08:00
c3ddd28bad Merge branch 'pack/v5.29.2-932/remove_storage_permission_and_change_to_v5.30.4-954_rebased' into 'release'
feat: 合规代码合并 https://jira.shanqu.cc/browse/GHZS-3510

See merge request halo/android/assistant-android!1364
2023-09-20 11:01:41 +08:00
eab8bc846c feat: 合规代码合并 https://jira.shanqu.cc/browse/GHZS-3510 2023-09-20 11:01:41 +08:00
05268442f8 Merge branch 'fix/GHZS-3500' into 'dev-5.32.0'
fix: 求版本下载跳转问题 https://jira.shanqu.cc/browse/GHZS-2674

See merge request halo/android/assistant-android!1362
2023-09-20 10:42:45 +08:00
55521e6f29 fix: 求版本下载跳转问题 https://jira.shanqu.cc/browse/GHZS-2674 2023-09-20 10:42:45 +08:00
db5b09cc11 Merge branch 'feature-GHZS-3493' into 'dev-5.32.0'
fix: 插件求版本相关优化—0915测试 https://jira.shanqu.cc/browse/GHZS-3493

See merge request halo/android/assistant-android!1361
2023-09-19 10:51:12 +08:00
b0922b4c29 fix: 插件求版本相关优化—0915测试 https://jira.shanqu.cc/browse/GHZS-3493 2023-09-19 10:51:12 +08:00
455ed32ac6 Merge branch 'hotfix/v5.30.3-953/GHZS-3484' into 'dev'
修复普通微信登录也会触发 QQ 小游戏的微信登录异常 toast 问题

See merge request halo/android/assistant-android!1360
2023-09-18 09:39:47 +08:00
fd92979481 fix: 微信登录提示问题 https://jira.shanqu.cc/browse/GHZS-3484 2023-09-18 09:39:47 +08:00
3d322b29c1 Merge branch 'hotfix/v5.30.3-953/GHZS-3484' into 'release'
修复普通微信登录也会触发 QQ 小游戏的微信登录异常 toast 问题

See merge request halo/android/assistant-android!1359
2023-09-18 09:34:12 +08:00
dcfc2f44cb fix: 微信登录提示问题 https://jira.shanqu.cc/browse/GHZS-3484 2023-09-18 09:34:12 +08:00
b809ae6687 Merge branch 'fix/GHZS-3452' into 'dev-5.32.0'
fix: 开发者中心及其配套优化—0912测试(2) https://jira.shanqu.cc/browse/GHZS-3452

See merge request halo/android/assistant-android!1358
2023-09-15 09:42:17 +08:00
c575e589ae fix: 开发者中心及其配套优化—0912测试(2) https://jira.shanqu.cc/browse/GHZS-3452 2023-09-15 09:30:57 +08:00
2af47af681 Merge branch 'feat/GHZS-3437' into 'dev-5.32.0'
feat: 游戏下载增加文件格式 https://jira.shanqu.cc/browse/GHZS-3437

See merge request halo/android/assistant-android!1354
2023-09-14 17:12:49 +08:00
b1228bdd2a feat: 游戏下载增加文件格式 https://jira.shanqu.cc/browse/GHZS-3437 2023-09-14 17:12:49 +08:00
4008c7fa4d Merge branch 'feature-GHZS-3424-patch-2' into 'dev'
fix: 神策数据埋点第二期-0914测试...

See merge request halo/android/assistant-android!1357
2023-09-14 17:08:30 +08:00
f2d714280b fix: 神策数据埋点第二期-0914测试... 2023-09-14 17:08:30 +08:00
6862609bba Merge branch 'release' into 'dev'
Release

See merge request halo/android/assistant-android!1356
2023-09-14 16:31:22 +08:00
3afae78477 Merge branch 'hotfix/GHZS-3479' into 'release'
fix:【光环助手】通用内容合集首页显示问题 https://jira.shanqu.cc/browse/GHZS-3479

See merge request halo/android/assistant-android!1355
2023-09-14 16:26:20 +08:00
b03df595bc fix:【光环助手】通用内容合集首页显示问题 https://jira.shanqu.cc/browse/GHZS-3479 2023-09-14 16:15:52 +08:00
c6f0825fb5 Merge branch 'feature-GHZS-3432-patch-1' into 'dev'
fix: 神策数据埋点第二期—0912测试...

See merge request halo/android/assistant-android!1353
2023-09-14 09:08:08 +08:00
cbc2902613 fix: 神策数据埋点第二期—0912测试... 2023-09-14 09:08:08 +08:00
db725a417d Merge branch 'chen/202309/fix-upload-archive-crash' into 'dev'
存档上传bug

See merge request halo/android/assistant-android!1352
2023-09-13 12:09:08 +08:00
4270924d0f fix:登陆光环账号,然后断网,在光环助手游戏详情页上传存档,有的手机是上传存档弹窗一闪而过没有任何提示,有的手机是弹窗一闪而过后提示‘当前页面未捕获的异常....’ 2023-09-13 11:58:57 +08:00
69fc206377 Merge branch 'feature-GHZs-3038-patch' into 'dev'
fix: 帖子详情页UI优化 https://jira.shanqu.cc/browse/GHZS-3038

See merge request halo/android/assistant-android!1350
2023-09-13 11:07:47 +08:00
8468ec45c2 fix: 帖子详情页UI优化 https://jira.shanqu.cc/browse/GHZS-3038 2023-09-13 11:07:47 +08:00
256a4c2b0a Merge branch 'feature-GHZS-3424-patch' into 'dev'
feat: 【光环助手】帖子详情页UI优化 https://jira.shanqu.cc/browse/GHZS-3038

See merge request halo/android/assistant-android!1349
2023-09-12 17:37:46 +08:00
7d01e47c26 feat: 【光环助手】帖子详情页UI优化 https://jira.shanqu.cc/browse/GHZS-3038 2023-09-12 17:37:46 +08:00
5814f468b3 Merge branch 'feature-GHZS-3432-patch' into 'dev'
fix: 神策数据埋点第二期—0907测试(2) https://jira.shanqu.cc/browse/GHZS-3432

See merge request halo/android/assistant-android!1348
2023-09-12 16:24:01 +08:00
a5730e0ffd fix: 神策数据埋点第二期—0907测试(2) https://jira.shanqu.cc/browse/GHZS-3432 2023-09-12 16:24:00 +08:00
0dfd87db25 Merge branch 'feature-GHZS-3420' into 'dev'
fix: 帖子详情页UI优化—0906UI测试 https://jira.shanqu.cc/browse/GHZS-3420

See merge request halo/android/assistant-android!1347
2023-09-12 14:49:18 +08:00
31aa16f155 fix: 帖子详情页UI优化—0906UI测试 https://jira.shanqu.cc/browse/GHZS-3420 2023-09-12 14:49:18 +08:00
b22c6b9a5b Merge branch 'feature-GHZS-3432' into 'dev'
fix: 神策数据埋点第二期—0907测试(2) https://jira.shanqu.cc/browse/GHZS-3432

See merge request halo/android/assistant-android!1344
2023-09-12 14:46:11 +08:00
ffae0d1b1d Merge branch 'dev' into 'dev-5.32.0'
Dev

See merge request halo/android/assistant-android!1346
2023-09-12 13:59:06 +08:00
5d8a31c725 Merge branch 'release' into 'dev'
Release

See merge request halo/android/assistant-android!1345
2023-09-12 13:58:25 +08:00
1c35982db0 Merge branch 'feature-GHZS-qq-game-crash' into 'release'
fix: 修复QQ小游戏调用stopAllMiniApp方法Context为空导致的崩溃问题

See merge request halo/android/assistant-android!1343
2023-09-12 13:46:54 +08:00
52f71dc79e fix: 修复QQ小游戏调用stopAllMiniApp方法Context为空导致的崩溃问题 2023-09-12 13:46:53 +08:00
f1c0155379 fix: 神策数据埋点第二期—0907测试(2) https://jira.shanqu.cc/browse/GHZS-3432 2023-09-12 11:38:30 +08:00
19dc23d98a Merge branch 'fix/GHZS-3434' into 'dev'
fix: 首页推荐入口数据上报问题 https://jira.shanqu.cc/browse/GHZS-3434

See merge request halo/android/assistant-android!1342
2023-09-12 11:00:30 +08:00
69c82ec0e6 fix: 首页推荐入口数据上报问题 https://jira.shanqu.cc/browse/GHZS-3434 2023-09-12 11:00:29 +08:00
b1a9d96c3b Merge branch 'fix/GHZS-3426' into 'dev'
fix: 神策数据埋点第二期—0907测试(1)(0911测试) https://jira.shanqu.cc/browse/GHZS-3426

See merge request halo/android/assistant-android!1340
2023-09-11 17:45:22 +08:00
a88500576f Merge branch 'hotfix/home_game_collection_refresh' into 'release'
fix: 修复首页/版块在特定情况下显示空白的问题

See merge request halo/android/assistant-android!1341
2023-09-11 17:45:05 +08:00
058eaf0a4a fix: 修复首页/版块在特定情况下显示空白的问题 2023-09-11 17:10:40 +08:00
1b326a0515 fix: 神策数据埋点第二期—0907测试(1)(0911测试) https://jira.shanqu.cc/browse/GHZS-3426 2023-09-11 15:44:02 +08:00
3fc1fd821a Merge branch 'feature/GHZS-3408' into 'dev-5.32.0'
feat: 开发者中心及配套优化—客户端 https://jira.shanqu.cc/browse/GHZS-3408

See merge request halo/android/assistant-android!1339
2023-09-11 09:55:00 +08:00
b3af44cc4c feat: 开发者中心及配套优化—客户端 https://jira.shanqu.cc/browse/GHZS-3408 2023-09-11 09:49:25 +08:00
44c1711be7 Merge branch 'fix/GHZS-3426' into 'dev'
fix: 神策数据埋点第二期—0907测试(1) https://jira.shanqu.cc/browse/GHZS-3426

See merge request halo/android/assistant-android!1338
2023-09-08 16:19:21 +08:00
c616df87ea fix: 神策数据埋点第二期—0907测试(1) https://jira.shanqu.cc/browse/GHZS-3426 2023-09-08 16:11:02 +08:00
dd7072eea4 Merge branch 'feature-GHZS-3412' into 'dev-5.32.0'
feat: 插件求版本相关优化—0905测试 https://jira.shanqu.cc/browse/GHZS-3412

See merge request halo/android/assistant-android!1337
2023-09-08 15:55:50 +08:00
4ee463f03e feat: 插件求版本相关优化—0905测试 https://jira.shanqu.cc/browse/GHZS-3412 2023-09-08 15:55:49 +08:00
d3dc31eeaf Update README.md 2023-09-08 15:27:26 +08:00
08b364a626 Merge branch 'fix/GHZS-3421' into 'dev'
fix: 右下悬浮窗优化-新增悬浮窗展开交互—0907测试(补充) https://jira.shanqu.cc/browse/GHZS-3421

See merge request halo/android/assistant-android!1336
2023-09-08 14:59:40 +08:00
9e6d1e5fbd fix: 右下悬浮窗优化-新增悬浮窗展开交互—0907测试(补充) https://jira.shanqu.cc/browse/GHZS-3421 2023-09-08 14:59:40 +08:00
75a21ee04e Merge branch 'feature-GHZS-3424' into 'dev'
feat: 帖子详情页UI优化—0907UI测试 https://jira.shanqu.cc/browse/GHZS-3424

See merge request halo/android/assistant-android!1335
2023-09-08 13:59:49 +08:00
27d13d4ce9 feat: 帖子详情页UI优化—0907UI测试 https://jira.shanqu.cc/browse/GHZS-3424 2023-09-08 13:59:49 +08:00
16526ddfbd Merge branch 'feature/GHZS-3346' into 'dev-5.32.0'
feat: 插件管理功能优化(第2期)—客户端 https://jira.shanqu.cc/browse/GHZS-3346

See merge request halo/android/assistant-android!1334
2023-09-08 11:20:21 +08:00
d6e676300e feat: 插件管理功能优化(第2期)—客户端 https://jira.shanqu.cc/browse/GHZS-3346 2023-09-08 11:15:30 +08:00
7852972e01 feat: 插件管理功能优化(第2期)—客户端 https://jira.shanqu.cc/browse/GHZS-3346 2023-09-08 11:15:22 +08:00
6ff76ea1ed Merge branch 'fix/help_video' into 'dev'
修复帮助视频相关问题

See merge request halo/android/assistant-android!1333
2023-09-07 18:05:18 +08:00
39d51ceeb3 fix: 处理帮助视频全屏播放时全面屏手势与进度条冲突导致无法拖动进度条的问题 2023-09-07 17:49:54 +08:00
00fc6e447c fix: 修复帮助视频上报埋点数据异常的问题 2023-09-07 16:23:22 +08:00
76fff608ed Merge branch 'fix/GHZS-3421' into 'dev'
fix: 右下悬浮窗优化-新增悬浮窗展开交互—0907测试 https://jira.shanqu.cc/browse/GHZS-3421

See merge request halo/android/assistant-android!1332
2023-09-07 11:03:51 +08:00
460409ac30 fix: 右下悬浮窗优化-新增悬浮窗展开交互—0907测试 https://jira.shanqu.cc/browse/GHZS-3421 2023-09-07 10:57:45 +08:00
80403e1684 Merge remote-tracking branch 'origin/dev' into dev-5.32.0 2023-09-07 10:30:53 +08:00
ef32fd946b Merge branch 'feature-GHZS-3373-patch-1' into 'dev'
feat: 帖子详情页UI优化—0901UI测试-客户端 https://jira.shanqu.cc/browse/GHZS-3373

See merge request halo/android/assistant-android!1331
2023-09-07 09:50:49 +08:00
23d57c8bbd feat: 帖子详情页UI优化—0901UI测试-客户端 https://jira.shanqu.cc/browse/GHZS-3373 2023-09-07 09:50:49 +08:00
c46b93769d Merge branch 'fix/GHZS-3415' into 'dev'
fix: 意见反馈页面改版—0906UI测试 https://jira.shanqu.cc/browse/GHZS-3415

See merge request halo/android/assistant-android!1330
2023-09-06 17:52:07 +08:00
2305229919 fix: 意见反馈页面改版—0906UI测试 https://jira.shanqu.cc/browse/GHZS-3415 2023-09-06 17:48:39 +08:00
0e9453b1b2 Merge branch 'fix/floating_window_api_crash' into 'dev'
fix: 修复右下悬浮窗接口结构未同步造成的闪退

See merge request halo/android/assistant-android!1329
2023-09-06 16:58:32 +08:00
420290bc87 fix: 修复右下悬浮窗接口结构未同步造成的闪退 2023-09-06 16:55:43 +08:00
91be2cea1d Merge branch 'fix/GHZS-3415' into 'dev'
fix: 意见反馈页面改版—0906UI测试 https://jira.shanqu.cc/browse/GHZS-3415

See merge request halo/android/assistant-android!1328
2023-09-06 15:52:13 +08:00
4dc3a8edc3 fix: 意见反馈页面改版—0906UI测试 https://jira.shanqu.cc/browse/GHZS-3415 2023-09-06 15:27:43 +08:00
5ba9c74583 Merge branch 'feature-GHZS-3373' into 'dev'
feat: 帖子详情页UI优化—0901UI测试-Web前端 https://jira.shanqu.cc/browse/GHZS-3374

See merge request halo/android/assistant-android!1326
2023-09-06 11:38:43 +08:00
a694e401d3 feat: 帖子详情页UI优化—0901UI测试-Web前端 https://jira.shanqu.cc/browse/GHZS-3374 2023-09-06 11:38:43 +08:00
a6cb0b9fa0 Merge branch 'fix/feedback' into 'dev'
fix: 修改意见反馈页面文案

See merge request halo/android/assistant-android!1327
2023-09-06 11:34:26 +08:00
9b599fd28d fix: 修改意见反馈页面文案 2023-09-06 11:33:10 +08:00
f04fecc11e Merge branch 'feature-GHZS-3373' into 'dev'
feat: 帖子详情页UI优化—0901UI测试-客户端 https://jira.shanqu.cc/browse/GHZS-3373

See merge request halo/android/assistant-android!1323
2023-09-06 10:05:54 +08:00
471e28099b Merge branch 'fix/GHZS-3371' into 'dev'
fix: 意见反馈页面改版—0901UI测试(4) https://jira.shanqu.cc/browse/GHZS-3371

See merge request halo/android/assistant-android!1325
2023-09-05 17:31:44 +08:00
5a3031ae87 fix: 意见反馈页面改版—0901UI测试(4) https://jira.shanqu.cc/browse/GHZS-3371 2023-09-05 17:30:30 +08:00
1421f27bd3 Merge branch 'fix/GHZS-3371' into 'dev'
fix: 意见反馈页面改版—0901UI测试(2) https://jira.shanqu.cc/browse/GHZS-3371

See merge request halo/android/assistant-android!1324
2023-09-05 16:12:51 +08:00
e9e152eeee fix: 意见反馈页面改版—0901UI测试(2) https://jira.shanqu.cc/browse/GHZS-3371 2023-09-05 16:01:31 +08:00
aae6904e4b feat: 帖子详情页UI优化—0901UI测试-客户端 https://jira.shanqu.cc/browse/GHZS-3373 2023-09-05 16:00:36 +08:00
db7fbe057e Merge remote-tracking branch 'origin/dev' into dev-5.32.0 2023-09-05 14:35:39 +08:00
042508e8e6 Merge branch 'release' into dev
# Conflicts:
#	dependencies.gradle
2023-09-05 14:35:09 +08:00
af5736f54d Merge branch 'fix/GHZS-3371' into 'dev'
fix: 意见反馈页面改版—0901UI测试(1-2) https://jira.shanqu.cc/browse/GHZS-3371

See merge request halo/android/assistant-android!1322
2023-09-05 14:21:11 +08:00
56816fa682 fix: 意见反馈页面改版—0901UI测试(1-2) https://jira.shanqu.cc/browse/GHZS-3371 2023-09-05 14:17:47 +08:00
05e0609f94 Merge branch 'fix/GHZS-3382' into 'dev'
fix: 帮助与反馈页面改版—0904测试 https://jira.shanqu.cc/browse/GHZS-3382

See merge request halo/android/assistant-android!1320
2023-09-05 14:05:25 +08:00
7a080851ae Merge branch 'feature-GHZS-3276-patch-2' into 'dev'
feat: 游戏详情-开服日历表-反馈优化—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3276

See merge request halo/android/assistant-android!1321
2023-09-05 13:56:46 +08:00
e1ce989d43 feat: 游戏详情-开服日历表-反馈优化—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3276 2023-09-05 13:56:46 +08:00
6e00a0c2a6 fix: 帮助与反馈页面改版—0904测试 https://jira.shanqu.cc/browse/GHZS-3382 2023-09-05 10:19:58 +08:00
71318fa9ef chore: 版本更新至 5.30.3 2023-09-05 10:03:01 +08:00
05b4896d6e Merge branch 'feature-GHZS-sentry-327680' into 'release'
fix: 修复QQ小游戏Activity未校验导致的BUG

See merge request halo/android/assistant-android!1319
2023-09-05 10:02:07 +08:00
7f40e45ef2 fix: 修复QQ小游戏Activity未校验导致的BUG 2023-09-05 10:02:07 +08:00
2928c59b87 Merge branch 'fix/help_and_feedback_help_video' into 'dev'
fix: 修复帮助视频轮播显示问题

See merge request halo/android/assistant-android!1318
2023-09-04 17:58:39 +08:00
ceb2442f3f fix: 修复帮助视频轮播显示问题 2023-09-04 17:56:43 +08:00
cec684c325 Merge branch 'fix/GHZS-3361' into 'dev'
fix: 帮助与反馈页面改版—0831测试(特殊处理【与我相关】接口内容) https://jira.shanqu.cc/browse/GHZS-3361

See merge request halo/android/assistant-android!1317
2023-09-04 16:23:31 +08:00
b5e4bf772b fix: 帮助与反馈页面改版—0901UI测试(8) https://jira.shanqu.cc/browse/GHZS-3370 2023-09-04 15:08:11 +08:00
9f3fe9e30d fix: 帮助与反馈页面改版—0831测试(特殊处理【与我相关】接口内容) https://jira.shanqu.cc/browse/GHZS-3361 2023-09-04 14:53:54 +08:00
c7174bbaec Merge branch 'fix/help_and_feedback_swipe_refresh' into 'dev'
fix: 修复帮助与反馈页面左右滑动会触发下拉刷新的问题

See merge request halo/android/assistant-android!1316
2023-09-04 11:53:42 +08:00
de013e0129 fix: 修复帮助与反馈页面左右滑动会触发下拉刷新的问题 2023-09-04 11:51:30 +08:00
412ea87668 Merge branch 'hotfix/v5.30.2-952/sql_crashes' into 'release'
fix: 捕抓卸载畅玩游戏时的数据库闪退问题...

See merge request halo/android/assistant-android!1315
2023-09-04 11:23:33 +08:00
dc40f81ff2 fix: 捕抓卸载畅玩游戏时的数据库闪退问题 https://sentry.shanqu.cc/organizations/lightgame/issues/299251/events/0dd11c01f5a5465face2b6849e5cffc4/?project=22 2023-09-04 11:15:14 +08:00
25c849ccad Merge branch 'fix/GHZS-3371' into 'dev'
fix: 意见反馈页面改版—UI测试 https://jira.shanqu.cc/browse/GHZS-3371

See merge request halo/android/assistant-android!1314
2023-09-04 10:26:54 +08:00
927c846bcb Merge branch 'fix/GHZS-3361' into 'dev'
fix: 帮助与反馈页面改版—0831测试 https://jira.shanqu.cc/browse/GHZS-3361

See merge request halo/android/assistant-android!1313
2023-09-04 10:26:40 +08:00
fcd13ba8b0 fix: 意见反馈页面改版—UI测试 https://jira.shanqu.cc/browse/GHZS-3371 2023-09-04 10:23:48 +08:00
bccd161762 Merge branch 'feature-GHZS-3276-patch-1' into 'dev'
feat: 【光环助手】游戏详情-开服日历表-反馈优化 https://jira.shanqu.cc/browse/GHZS-3049

See merge request halo/android/assistant-android!1312
2023-09-04 10:05:55 +08:00
776dfddc34 feat: 【光环助手】游戏详情-开服日历表-反馈优化 https://jira.shanqu.cc/browse/GHZS-3049 2023-09-04 10:05:55 +08:00
b31b529ca7 Merge branch 'feature-GHZS-3367' into 'dev'
feat: 帖子详情页UI优化—0831测试 https://jira.shanqu.cc/browse/GHZS-3367

See merge request halo/android/assistant-android!1311
2023-09-04 09:40:19 +08:00
1cc2f5387a feat: 帖子详情页UI优化—0831测试 https://jira.shanqu.cc/browse/GHZS-3367 2023-09-02 21:38:19 +08:00
5c79a01cc6 fix: 帮助与反馈页面改版—UI测试 https://jira.shanqu.cc/browse/GHZS-3370 2023-09-01 18:01:06 +08:00
1e3704c1ed fix: 帮助与反馈页面改版—0831测试 https://jira.shanqu.cc/browse/GHZS-3361 2023-09-01 14:17:17 +08:00
41340f7333 Merge branch 'feature-GHZS-3295' into 'dev-5.32.0'
feat: 插件求版本相关优化—客户端 https://jira.shanqu.cc/browse/GHZS-3295

See merge request halo/android/assistant-android!1310
2023-09-01 11:45:18 +08:00
e73fc09d9b feat: 插件求版本相关优化—客户端 https://jira.shanqu.cc/browse/GHZS-3295 2023-09-01 11:35:50 +08:00
d593c54262 Merge branch 'hotfix/v5.30.2-952/number-format-issue' into 'release'
fix: 修复在部分语言设备上解压 XAPK 文件时的闪退问题...

See merge request halo/android/assistant-android!1309
2023-09-01 11:18:29 +08:00
b1e5d48098 fix: 修复在部分语言设备上解压 XAPK 文件时的闪退问题 https://sentry.shanqu.cc/organizations/lightgame/issues/318692/?project=22&query=NumberFormatException&statsPeriod=14d 2023-09-01 11:10:21 +08:00
f9d652d629 Merge branch 'fix/floating_window_issue' into 'dev'
fix: 修复右下悬浮窗及启动弹窗的一些显示问题

See merge request halo/android/assistant-android!1308
2023-08-31 17:05:54 +08:00
0a61d29f37 fix: 修复右下悬浮窗及启动弹窗的一些显示问题 2023-08-31 16:50:14 +08:00
f8ce9ffc90 Merge branch 'fix/GHZS-3358' into 'dev'
fix: 意见反馈页面改版-0830测试 https://jira.shanqu.cc/browse/GHZS-3358

See merge request halo/android/assistant-android!1306
2023-08-31 10:59:25 +08:00
42366a8591 fix: 意见反馈页面改版-0830测试 https://jira.shanqu.cc/browse/GHZS-3358 2023-08-31 10:53:52 +08:00
5dbf29a09d Merge branch 'feature-GHZS-3276-patch' into 'dev'
feat: 游戏详情-开服日历表-反馈优化—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3276

See merge request halo/android/assistant-android!1305
2023-08-31 10:53:41 +08:00
9621a62ed6 feat: 游戏详情-开服日历表-反馈优化—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3276 2023-08-31 10:37:27 +08:00
07f320db27 Merge remote-tracking branch 'origin/release' into dev
# Conflicts:
#	dependencies.gradle
2023-08-31 10:20:25 +08:00
285ec88d01 Merge branch 'feature-GHZS-3168' into 'dev'
feat: 帖子详情页UI优化—客户端 https://jira.shanqu.cc/browse/GHZS-3168

See merge request halo/android/assistant-android!1303
2023-08-31 09:26:01 +08:00
1f86e7b32d feat: 帖子详情页UI优化—客户端 https://jira.shanqu.cc/browse/GHZS-3168 2023-08-30 18:00:09 +08:00
df6c87eed2 Merge branch 'fix/GHZS-3064' into 'dev'
fix: 修复帮助与反馈页面帮助视频轮播与下拉刷新的滑动冲突

See merge request halo/android/assistant-android!1302
2023-08-30 17:08:00 +08:00
2894a964ea fix: 修复帮助与反馈页面帮助视频轮播与下拉刷新的滑动冲突 2023-08-30 17:06:35 +08:00
421baf2889 Merge branch 'fix/GHZS-3315' into 'dev'
fix: 重构首页弹窗类功能的显示(调整通知权限弹窗的回调)

See merge request halo/android/assistant-android!1300
2023-08-30 15:32:46 +08:00
040901f9df fix: 重构首页弹窗类功能的显示(调整通知权限弹窗的回调) 2023-08-30 15:28:24 +08:00
2d9af85b62 Merge branch 'fix/home_game_collection_carousel_crash' into 'dev'
fix: 修复首页游戏单轮播数组越界闪退

See merge request halo/android/assistant-android!1297
2023-08-30 14:36:12 +08:00
35c71c70c9 fix: 修复首页游戏单轮播数组越界闪退 2023-08-30 14:23:47 +08:00
70e63ed8e3 Merge branch 'fix/GHZS-3286' into 'dev-5.32.0'
fix: 单机插件更新跳转—客户端 https://jira.shanqu.cc/browse/GHZS-3286

See merge request halo/android/assistant-android!1296
2023-08-30 11:32:38 +08:00
b7a36074ed fix: 单机插件更新跳转—客户端 https://jira.shanqu.cc/browse/GHZS-3286 2023-08-30 11:08:31 +08:00
0cb7e4c9a1 Merge branch 'fix/window_animation' into 'dev'
fix: 优化右下悬浮窗的隐藏动画

See merge request halo/android/assistant-android!1295
2023-08-30 10:55:50 +08:00
152b9add80 fix: 优化右下悬浮窗的隐藏动画 2023-08-30 10:52:22 +08:00
ab27ca5256 Merge branch 'fix/compose_setting' into 'dev'
fix: 修复compose设置模块编译问题

See merge request halo/android/assistant-android!1294
2023-08-29 17:35:37 +08:00
90545415ae fix: 修复compose设置模块编译问题 2023-08-29 17:31:55 +08:00
8018517207 Merge branch 'feature/GHZS-3172' into 'dev'
feat: 神策数据埋点第二期(1)—客户端 https://jira.shanqu.cc/browse/GHZS-3172

See merge request halo/android/assistant-android!1293
2023-08-29 15:40:15 +08:00
c79128d6f4 feat: 神策数据埋点第二期(1)—客户端 https://jira.shanqu.cc/browse/GHZS-3172 2023-08-29 15:40:15 +08:00
141d179a64 chore: 版本个更新至 5.32.0 2023-08-29 14:12:07 +08:00
0a9471fc2e Merge remote-tracking branch 'origin/dev' into dev-5.31.0 2023-08-29 14:06:47 +08:00
ce3d594a4e Merge branch 'feat/GHZS-3182' into 'dev-5.31.0'
feat: 神策数据埋点第二期(3) https://jira.shanqu.cc/browse/GHZS-3182

See merge request halo/android/assistant-android!1291
2023-08-29 10:50:58 +08:00
553f84daa1 feat: 神策数据埋点第二期(3) https://jira.shanqu.cc/browse/GHZS-3182 2023-08-29 10:35:40 +08:00
70f782cb5c Merge branch 'fix/GHZS-3325' into 'dev-5.31.0'
fix: 右下悬浮窗优化-0828测试 https://jira.shanqu.cc/browse/GHZS-3325

See merge request halo/android/assistant-android!1290
2023-08-29 10:25:53 +08:00
28725ae76f fix: 右下悬浮窗优化-0828测试 https://jira.shanqu.cc/browse/GHZS-3325 2023-08-29 10:17:38 +08:00
b0972f1a80 Merge branch 'feature/GHZS-3064' into 'dev-5.31.0'
帮助与反馈页面改版&意见反馈页面改版

See merge request halo/android/assistant-android!1283
2023-08-28 14:06:09 +08:00
585660e52d 帮助与反馈页面改版&意见反馈页面改版 2023-08-28 14:06:09 +08:00
20998852b6 fix: 处理合并冲突 2023-08-25 16:57:53 +08:00
929a2c4d29 Merge remote-tracking branch 'origin/dev' into dev-5.31.0
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java
#	app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt
2023-08-25 16:38:27 +08:00
f0fd323107 Merge branch 'fix/floating_window_animation' into 'dev-5.31.0'
fix: 修复右下悬浮窗展开和收起的动画显示问题

See merge request halo/android/assistant-android!1287
2023-08-25 16:34:50 +08:00
00892e831a fix: 修复右下悬浮窗展开和收起的动画显示问题 2023-08-25 16:34:15 +08:00
a55fcdcb28 Merge branch 'feat/GHZS-3081' into 'dev-5.31.0'
feat: 右下悬浮窗优化-新增悬浮窗展开交互 https://jira.shanqu.cc/browse/GHZS-3081

See merge request halo/android/assistant-android!1285
2023-08-24 18:03:20 +08:00
548a34c66d feat: 右下悬浮窗优化-新增悬浮窗展开交互 https://jira.shanqu.cc/browse/GHZS-3081 2023-08-24 17:28:36 +08:00
55f51284c8 Merge branch 'feature-GHZS-3255' into 'dev-5.31.0'
feat: 插件化相关弹窗埋点补充—0817测试 https://jira.shanqu.cc/browse/GHZS-3255

See merge request halo/android/assistant-android!1282
2023-08-24 15:06:07 +08:00
079dac80f8 feat: 插件化相关弹窗埋点补充—0817测试 https://jira.shanqu.cc/browse/GHZS-3255 2023-08-24 15:06:07 +08:00
b33fee6ec0 Merge branch 'feature-GHZS-3276' into 'dev-5.31.0'
feat: 游戏详情-开服日历表-反馈优化—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3276

See merge request halo/android/assistant-android!1281
2023-08-24 09:55:43 +08:00
2c1fdae6c7 feat: 游戏详情-开服日历表-反馈优化—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3276 2023-08-24 09:55:43 +08:00
6a935b18e8 Merge branch 'fix/GHZS-3274' into 'dev-5.31.0'
fix: 新游开测相关功能优化(第二期)—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3274

See merge request halo/android/assistant-android!1280
2023-08-22 15:40:13 +08:00
91c363fb55 fix: 新游开测相关功能优化(第二期)—0822UI测试 https://jira.shanqu.cc/browse/GHZS-3274 2023-08-22 15:38:46 +08:00
e1a65c5fce Merge branch 'fix/GHZS-3248' into 'dev-5.31.0'
fix: 新游开测相关功能优化(第二期)—0817测试 https://jira.shanqu.cc/browse/GHZS-3248

See merge request halo/android/assistant-android!1277
2023-08-17 16:39:02 +08:00
9fd6ce4e74 fix: 新游开测相关功能优化(第二期)—0817测试 https://jira.shanqu.cc/browse/GHZS-3248 2023-08-17 16:37:33 +08:00
46df9cdccc Merge branch 'fix/GHZS-3248' into 'dev-5.31.0'
fix: 新游开测相关功能优化(第二期)—0817测试 https://jira.shanqu.cc/browse/GHZS-3248

See merge request halo/android/assistant-android!1275
2023-08-17 16:34:37 +08:00
339665f90f fix: 新游开测相关功能优化(第二期)—0817测试 https://jira.shanqu.cc/browse/GHZS-3248 2023-08-17 16:29:33 +08:00
96d9d05eb9 Merge branch 'fix/config_error' into 'dev-5.31.0'
fix: 修复阿里云OSS图片数据处理字段使用错误问题 https://jira.shanqu.cc/browse/GHZS-3113

See merge request halo/android/assistant-android!1274
2023-08-17 14:04:14 +08:00
b1c848a7a6 fix: 修复阿里云OSS图片数据处理字段使用错误问题 2023-08-17 14:03:32 +08:00
eb4d84bb48 Merge branch 'feat/GHZS-3113' into 'dev-5.31.0'
feat: 阿里云OSS图片数据处理 https://jira.shanqu.cc/browse/GHZS-3113

See merge request halo/android/assistant-android!1273
2023-08-17 11:44:25 +08:00
04f72091e4 feat: 阿里云OSS图片数据处理 https://jira.shanqu.cc/browse/GHZS-3113 2023-08-17 11:34:54 +08:00
5d21d62140 Merge branch 'feature-GHZS-3163' into 'dev-5.31.0'
feat:插件化相关弹窗埋点补充—客户端 https://jira.shanqu.cc/browse/GHZS-3163

See merge request halo/android/assistant-android!1272
2023-08-17 10:34:59 +08:00
0a7b646779 feat:插件化相关弹窗埋点补充—客户端 https://jira.shanqu.cc/browse/GHZS-3163 2023-08-17 10:22:44 +08:00
9f9a675f04 Merge branch 'feature/GHZS-3176' into 'dev-5.31.0'
feat: 新游开测相关功能优化(第二期)—客户端 https://jira.shanqu.cc/browse/GHZS-3176

See merge request halo/android/assistant-android!1270
2023-08-16 17:35:23 +08:00
238220548a feat: 新游开测相关功能优化(第二期)—客户端 https://jira.shanqu.cc/browse/GHZS-3176 2023-08-16 17:18:18 +08:00
dfc023a0cd Merge branch 'feat/GHZS-3161' into 'dev-5.31.0'
feat: 帖子发布图片数量限制开放 https://jira.shanqu.cc/browse/GHZS-3161

See merge request halo/android/assistant-android!1268
2023-08-16 15:57:28 +08:00
cbd9a5708b feat: 帖子发布图片数量限制开放 https://jira.shanqu.cc/browse/GHZS-3161 2023-08-16 15:56:50 +08:00
8b0a639196 Merge branch 'feature-GHZS-3063' into 'dev-5.31.0'
feat:游戏详情-开服日历表-反馈优化—客户端 https://jira.shanqu.cc/browse/GHZS-3063

See merge request halo/android/assistant-android!1266
2023-08-16 15:14:43 +08:00
75f164249f feat:游戏详情-开服日历表-反馈优化—客户端 https://jira.shanqu.cc/browse/GHZS-3063 2023-08-16 15:01:48 +08:00
fd72f01b1d Merge branch 'feature/GHZS-3238' into 'dev-5.31.0'
feat: 游戏专区配置相关优化—客户端 https://jira.shanqu.cc/browse/GHZS-3238

See merge request halo/android/assistant-android!1265
2023-08-16 14:24:34 +08:00
c17a55e33c feat: 游戏专区配置相关优化—客户端 https://jira.shanqu.cc/browse/GHZS-3238 2023-08-16 14:13:36 +08:00
1aded5ecf4 Merge branch 'refactor/main_dialog' into 'dev-5.31.0'
refactor: 重构首页弹窗显示逻辑

See merge request halo/android/assistant-android!1262
2023-08-16 11:45:02 +08:00
d86dc7a03c feat: 重构首页弹窗显示逻辑 2023-08-16 11:06:47 +08:00
9741334c2e Merge branch 'feature-GHZS-3181' into 'dev-5.31.0'
feat: 神策数据埋点第二期(2)—客户端 https://jira.shanqu.cc/browse/GHZS-3181

See merge request halo/android/assistant-android!1259
2023-08-15 16:07:19 +08:00
48f762140b feat: 神策数据埋点第二期(2)—客户端 https://jira.shanqu.cc/browse/GHZS-3181 2023-08-15 16:07:18 +08:00
eba7f31b32 Merge remote-tracking branch 'origin/dev' into dev-5.31.0 2023-08-15 15:07:40 +08:00
38d91af306 Merge branch 'dev' into dev-5.31.0 2023-08-14 10:22:13 +08:00
f2bf3df304 Merge branch 'feat/GHZS-3099' into 'dev-5.31.0'
feat: 安装方式管理-增加模糊匹配功能 https://jira.shanqu.cc/browse/GHZS-3099

See merge request halo/android/assistant-android!1250
2023-08-10 10:34:15 +08:00
c2b46ea5f2 feat: 安装方式管理-增加模糊匹配功能 https://jira.shanqu.cc/browse/GHZS-3099 2023-08-10 10:28:22 +08:00
f12c0f8066 Merge branch 'feat/GHZS-3140' into 'dev-5.31.0'
feat: 资讯文章-下载按钮相关优化 https://jira.shanqu.cc/browse/GHZS-3165

See merge request halo/android/assistant-android!1248
2023-08-09 14:51:16 +08:00
5f158f74e8 feat: 资讯文章-下载按钮相关优化 https://jira.shanqu.cc/browse/GHZS-3165 2023-08-09 14:42:11 +08:00
503376edc2 Merge branch 'fix/GHZS-3136' into 'dev-5.31.0'
fix:【光环助手】图片视图规范化 https://jira.shanqu.cc/browse/GHZS-3136

See merge request halo/android/assistant-android!1246
2023-08-09 10:32:11 +08:00
7490617191 fix:【光环助手】图片视图规范化 https://jira.shanqu.cc/browse/GHZS-3136 2023-08-09 10:24:27 +08:00
13949e86c4 Merge remote-tracking branch 'origin/dev' into dev-5.31.0 2023-08-08 10:10:07 +08:00
1207d53314 Merge branch 'fix/GHZS-3097' into 'dev-5.31.0'
feat: 平板适配相关优化 https://jira.shanqu.cc/browse/GHZS-3097

See merge request halo/android/assistant-android!1242
2023-08-07 17:54:48 +08:00
f02b232589 feat: 平板适配相关优化 https://jira.shanqu.cc/browse/GHZS-3097 2023-08-07 17:38:58 +08:00
d61abd1174 Merge remote-tracking branch 'origin/dev' into dev-5.31.0 2023-08-02 11:27:14 +08:00
a460ae0788 chore: 版本更新至 5.31.0 2023-08-02 11:01:15 +08:00
581 changed files with 21119 additions and 3725 deletions

View File

@ -71,8 +71,7 @@ android_build:
exit_codes: 137
only:
- dev
- dev-5.29.0
- dev-5.30.0
- dev-5.32.0
# 代码检查
sonarqube_analysis:
@ -103,8 +102,7 @@ sonarqube_analysis:
exit_codes: 137
only:
- dev
- dev-5.29.0
- dev-5.30.0
- dev-5.32.0
## 发送简易检测结果报告
send_sonar_report:
@ -122,8 +120,7 @@ send_sonar_report:
exit_codes: 137
only:
- dev
- dev-5.29.0
- dev-5.30.0
- dev-5.32.0
oss-upload&send-email:
tags:
@ -155,5 +152,4 @@ oss-upload&send-email:
- /usr/local/bin/python /ci-android-mail.py
only:
- dev
- dev-5.29.0
- dev-5.30.0
- dev-5.32.0

View File

@ -30,14 +30,7 @@
### git 版本管理
本项目使用简化版的 git flow 来管理分支,细节请看 [光环安卓简单 git 规范](https://git.ghzs.com/halo/android/assistant-android/-/wikis/%E5%85%89%E7%8E%AF%E5%AE%89%E5%8D%93%E7%AE%80%E5%8D%95-git-%E8%A7%84%E8%8C%83)
### API 环境配置
本项目使用 Build Variants 来切换 API 环境
* internal 为测试环境
* publish 为正式环境
本项目使用简化版的 git flow 来管理分支,细节请看 [光环安卓简单 git 规范](https://git.shanqu.cc/halo/android/assistant-android/-/wikis/%E5%85%89%E7%8E%AF%E5%AE%89%E5%8D%93%E7%AE%80%E5%8D%95-git-%E8%A7%84%E8%8C%83)
### 图片资源配置
@ -53,14 +46,3 @@
* 本项目使用了微信的 [AndResGuard](https://github.com/shwenzhang/AndResGuard) 作为资源混淆压缩方案,新增需要使用 `getIdentifier` 获取的资源文件时需要添加至白名单
* 本项目默认使用 R8 作为混淆工具,往 proguard-rules.txt 添加 proguard 新配置项时请检查可用性(如语法等)
### APK打包配置
> 打内部测试包:`./scripts/test_build.sh`
> 打邮件测试包:`./scripts/jenkins_build.sh`
### TODO
* 把原有 EventBus 的消息 Type 统一到一个文件内
* 将实现细节从 View(Fragment、Activity) 剥离并以 MVVM 结构改造
* 重构 MainActivity

View File

@ -337,7 +337,10 @@ dependencies {
implementation(project(':module_core_feature')) {
exclude group: 'androidx.swiperefreshlayout'
}
implementation(project(':module_feedback')) {
// implementation(project(':module_feedback')) {
// exclude group: 'androidx.swiperefreshlayout'
// }
implementation(project(':feature:new_feedback',)) {
exclude group: 'androidx.swiperefreshlayout'
}
implementation(project(':module_sensors_data')) {

View File

@ -275,7 +275,7 @@
<activity
android:name="com.gh.gamecenter.VoteActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.gh.gamecenter.WeiBoShareActivity"

View File

@ -205,14 +205,17 @@ RE.setOutdent = function() {
RE.setJustifyLeft = function() {
document.execCommand('justifyLeft', false, null);
RE.enabledEditingItems()
}
RE.setJustifyCenter = function() {
document.execCommand('justifyCenter', false, null);
RE.enabledEditingItems()
}
RE.setJustifyRight = function() {
document.execCommand('justifyRight', false, null);
RE.enabledEditingItems()
}
RE.setBlockquote = function() {
@ -227,6 +230,16 @@ RE.insertImage = function(url) {
RE.insertHTML(html);
}
// 设置分割线
RE.insertHorizontalRule = function() {
document.execCommand('insertHorizontalRule', false, null);
}
// 设置编辑器默认换行符
RE.setDefaultParagraphSeparator = function(separator) {
document.execCommand('defaultParagraphSeparator', false, separator);
}
// 替换成缩略图
RE.replaceTbImage = function(imgRuleFlag, gifRuleFlag) {
var imgs = document.getElementsByTagName("img");
@ -339,9 +352,9 @@ RE.ImageClickListener = function() {
var img = imgs[i];
var imageClassName = img.className;
if (imageClassName == "image-link"|| img.className == "poster") continue;
window.imagelistener.imageArr(img.src);
window.NativeCallBack.invokeMethod("imageArr", img.src);
img.onclick = function() {
window.imagelistener.imageClick(this.src);
window.NativeCallBack.invokeMethod("imageClick", this.src);
}
}
}
@ -574,6 +587,10 @@ document.addEventListener("selectionchange", function(e) {
RE.sendElementNameToNative()
});
document.addEventListener("selectionchange", function(e) {
RE.enabledEditingItems(e)
});
RE.recursion = function(dom) {
var parenDom = dom.parentElement
if (parenDom && parenDom instanceof Element &&
@ -616,7 +633,6 @@ RE.sendElementNameToNative = function() {
// android function to open link
function customLinkgo(self) {
var datas = self.dataset.datas
// console.log(datas)
window.OnLinkClickListener.onClick(datas)
}

View File

@ -30,7 +30,6 @@ body {
}
#editor {
display: table-cell;
outline: 0px solid transparent;
background-repeat: no-repeat;
background-position: center;

View File

@ -23,6 +23,7 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.activity.BaseActivity
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.retrofit.BiResponse
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.provider.IBeiziAdProvider
@ -33,7 +34,6 @@ import com.gh.gamecenter.core.utils.TimeUtils.getToday
import com.gh.gamecenter.entity.AdConfig
import com.gh.gamecenter.entity.StartupAdEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent.Companion.createEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
@ -60,6 +60,9 @@ object AdDelegateHelper {
private val mGameSearchAdList: ArrayList<AdConfig> by lazy { arrayListOf() }
private var mVGameLaunchAd: AdConfig? = null
val vGameLaunchAd: AdConfig?
get() = mVGameLaunchAd
private const val AD_SDK_CSJ = "穿山甲"
private const val AD_SDK_BEIZI = "倍孜"
private const val AD_TYPE_SDK = "third_party_ads" // 第三方 SDK 广告

View File

@ -57,11 +57,16 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
private lateinit var mEditorFontItalic: CheckableImageView
private lateinit var mEditorFontStrikeThrough: CheckableImageView
private lateinit var mEditorFontUnderline: CheckableImageView
private lateinit var mEditorParagraphDivider: CheckableImageView
private lateinit var mEditorParagraphH1: CheckableImageView
private lateinit var mEditorParagraphH2: CheckableImageView
private lateinit var mEditorParagraphH3: CheckableImageView
private lateinit var mEditorParagraphH4: CheckableImageView
private lateinit var mEditorParagraphQuote: CheckableImageView
private lateinit var mEditorAlignLeft: CheckableImageView
private lateinit var mEditorAlignCenter: CheckableImageView
private lateinit var mEditorAlignRight: CheckableImageView
private lateinit var mEditorAlignContainer: View
private lateinit var mEditorFontContainer: View
private lateinit var mEditorParagraphContainer: View
private lateinit var mEditorLinkContainer: View
@ -97,6 +102,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mRichEditor.insertCustomStyleLink(insertData)
}
}
INSERT_ARTICLE_CODE -> {
val article =
data?.getParcelableExtra<ArticleEntity>(ArticleEntity::class.java.simpleName)
@ -106,6 +112,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mRichEditor.insertCustomStyleLink(insertData)
}
}
INSERT_GAME_CODE -> {
val game = data?.getParcelableExtra<GameEntity>(GameEntity::class.java.simpleName)
if (game != null) {
@ -114,6 +121,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mRichEditor.insertCustomStyleLink(insertData)
}
}
INSERT_GAME_COLLECTION_CODE -> {
val gameCollectionEntity =
data?.getParcelableExtra<GamesCollectionEntity>(GamesCollectionEntity::class.java.simpleName)
@ -123,9 +131,11 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mRichEditor.insertCustomStyleLink(insertData)
}
}
REQUEST_CODE_IMAGE -> {
if (data != null) mViewModel.uploadPic(data)
}
INSERT_MEDIA_VIDEO_CODE -> {
val localVideoList =
data?.getParcelableArrayListExtra<LocalVideoEntity>(LocalVideoEntity::class.java.name)
@ -135,12 +145,14 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
uploadVideo(localVideoList)
}
}
REQUEST_CODE_IMAGE_CROP -> {
val imagePath = data?.getStringExtra(CropImageActivity.RESULT_CLIP_PATH)
if (!imagePath.isNullOrEmpty()) {
mViewModel.uploadPoster(imagePath)
}
}
INSERT_VIDEO_CODE -> {
val videoEntity = data?.getParcelableExtra<MyVideoEntity>(MyVideoEntity::class.java.simpleName)
if (videoEntity != null) {
@ -194,7 +206,12 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mEditorParagraphH2 = findViewById(R.id.editor_paragraph_h2)
mEditorParagraphH3 = findViewById(R.id.editor_paragraph_h3)
mEditorParagraphH4 = findViewById(R.id.editor_paragraph_h4)
mEditorParagraphDivider = findViewById(R.id.editor_paragraph_divider)
mEditorParagraphQuote = findViewById(R.id.editor_paragraph_quote)
mEditorAlignLeft = findViewById(R.id.editor_align_left)
mEditorAlignCenter = findViewById(R.id.editor_align_center)
mEditorAlignRight = findViewById(R.id.editor_align_right)
mEditorAlignContainer = findViewById(R.id.editor_align_container)
mEditorFontContainer = findViewById(R.id.editor_font_container)
mEditorParagraphContainer = findViewById(R.id.editor_paragraph_container)
mEditorLinkContainer = findViewById(R.id.editor_link_container)
@ -241,6 +258,13 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mRichEditor.hasFocus()
} else false
}
mRichEditor.setOnDecorationChangeListener { _, types ->
mEditorAlignLeft.isChecked = types.contains(RichEditor.Type.JUSTIFYLEFT)
mEditorAlignCenter.isChecked = types.contains(RichEditor.Type.JUSTIFYCENTER)
mEditorAlignRight.isChecked = types.contains(RichEditor.Type.JUSTIFYRIGHT)
}
mOriginalCb.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
mOriginalTipsContainer.alpha = 0f
@ -325,6 +349,9 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-下滑线")
}
}
mEditorParagraphDivider.setOnClickListener {
mRichEditor.insertDivider()
}
mEditorParagraphH1.setOnClickListener {
if (mEditorParagraphH1.isChecked) {
mRichEditor.formatBlock()
@ -370,6 +397,27 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
}
mEditorParagraphQuote.isChecked = !mEditorParagraphQuote.isChecked
}
mEditorAlignLeft.setOnClickListener {
if (!mEditorAlignLeft.isChecked) {
mRichEditor.setAlignLeft()
MtaHelper.onEvent(mtaEventName(), "文本对齐选项", "文本对齐选项-靠左")
mEditorAlignLeft.isChecked = !mEditorAlignLeft.isChecked
}
}
mEditorAlignCenter.setOnClickListener {
if (!mEditorAlignCenter.isChecked) {
mRichEditor.setAlignCenter()
MtaHelper.onEvent(mtaEventName(), "文本对齐选项", "文本对齐选项-靠中")
mEditorAlignCenter.isChecked = !mEditorAlignCenter.isChecked
}
}
mEditorAlignRight.setOnClickListener {
if (!mEditorAlignRight.isChecked) {
mRichEditor.setAlignRight()
MtaHelper.onEvent(mtaEventName(), "文本对齐选项", "文本对齐选项-靠右")
mEditorAlignRight.isChecked = !mEditorAlignRight.isChecked
}
}
findViewById<View>(R.id.editor_link_answer).setOnClickListener {
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-回答")
startActivityForResult(
@ -449,25 +497,22 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
return
}
try {
PermissionHelper.checkStoragePermissionBeforeAction(this,
object : EmptyCallback {
override fun onCallback() {
val maxChooseCount = if (videoCount + 3 <= MAX_MEDIA_COUNT) 3 else MAX_MEDIA_COUNT - videoCount
startActivityForResult(
LocalMediaActivity.getIntent(
this@BaseRichEditorActivity,
LocalMediaActivity.ChooseType.VIDEO,
maxChooseCount,
if (mtaEventName() == "提问帖") "发提问帖" else "发帖子"
), INSERT_MEDIA_VIDEO_CODE
)
NewLogUtils.logChooseMedia(
"view_media",
if (mtaEventName() == "提问帖") "提问帖" else "帖子",
"视频"
)
}
})
PermissionHelper.checkStoragePermissionBeforeAction(this) {
val maxChooseCount = if (videoCount + 3 <= MAX_MEDIA_COUNT) 3 else MAX_MEDIA_COUNT - videoCount
startActivityForResult(
LocalMediaActivity.getIntent(
this@BaseRichEditorActivity,
LocalMediaActivity.ChooseType.VIDEO,
maxChooseCount,
if (mtaEventName() == "提问帖") "发提问帖" else "发帖子"
), INSERT_MEDIA_VIDEO_CODE
)
NewLogUtils.logChooseMedia(
"view_media",
if (mtaEventName() == "提问帖") "提问帖" else "帖子",
"视频"
)
}
} catch (e: Exception) {
toast(R.string.media_image_hint)
e.printStackTrace()
@ -482,18 +527,16 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
return
}
try {
PermissionHelper.checkStoragePermissionBeforeAction(this, object : EmptyCallback {
override fun onCallback() {
val maxChooseCount = if (imageCount + 10 <= MAX_IMAGE_COUNT) 10 else MAX_IMAGE_COUNT - imageCount
val intent = LocalMediaActivity.getIntent(
this@BaseRichEditorActivity,
LocalMediaActivity.ChooseType.IMAGE,
maxChooseCount,
if (mtaEventName() == "提问帖") "发提问帖" else "发帖子"
)
startActivityForResult(intent, REQUEST_CODE_IMAGE)
}
})
PermissionHelper.checkStoragePermissionBeforeAction(this) {
val maxChooseCount = if (imageCount + 10 <= MAX_IMAGE_COUNT) 10 else MAX_IMAGE_COUNT - imageCount
val intent = LocalMediaActivity.getIntent(
this@BaseRichEditorActivity,
LocalMediaActivity.ChooseType.IMAGE,
maxChooseCount,
if (mtaEventName() == "提问帖") "发提问帖" else "发帖子"
)
startActivityForResult(intent, REQUEST_CODE_IMAGE)
}
} catch (e: Exception) {
toast(R.string.media_image_hint)
e.printStackTrace()
@ -516,6 +559,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
mEditorFontContainer.visibility = if (mEditorFont.isChecked) View.VISIBLE else View.GONE
mEditorParagraphContainer.visibility =
if (mEditorFont.isChecked) View.VISIBLE else View.GONE
mEditorAlignContainer.visibility = if (mEditorFont.isChecked) View.VISIBLE else View.GONE
mEditorLinkContainer.visibility = View.GONE
mTagsContainer.visibility = View.GONE
mIsExtendedKeyboardShow = mEditorFont.isChecked
@ -537,6 +581,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
if (mEditorLink.isChecked) View.VISIBLE else View.GONE
mEditorLinkContainer.visibility = if (mEditorLink.isChecked) View.VISIBLE else View.GONE
mEditorFontContainer.visibility = View.GONE
mEditorAlignContainer.visibility = View.GONE
mEditorParagraphContainer.visibility = View.GONE
mTagsContainer.visibility = View.GONE
mIsExtendedKeyboardShow = mEditorLink.isChecked
@ -776,7 +821,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
const val INSERT_VIDEO_CODE = 415
const val MAX_INPUT_TEXT_NUM = 10000
const val MAX_MEDIA_COUNT = 20
const val MAX_IMAGE_COUNT = 35
const val MAX_IMAGE_COUNT = 70
const val REQUEST_CODE_IMAGE = 120
const val INSERT_MEDIA_VIDEO_CODE = 121

View File

@ -24,10 +24,12 @@ import com.gh.gamecenter.common.callback.BiCallback
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.common.entity.NotificationUgc
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.loghub.LoghubUtils
import com.gh.gamecenter.common.provider.IHelpAndFeedbackProvider
import com.gh.gamecenter.common.tracker.Tracker
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.utils.NewFlatLogUtils
import com.gh.gamecenter.common.view.dsbridge.CompletionHandler
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.core.runOnIoThread
@ -39,7 +41,6 @@ import com.gh.gamecenter.eventbus.EBPackage
import com.gh.gamecenter.feature.entity.Badge
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.login.user.LoginTag
import com.gh.gamecenter.login.user.UserManager
import com.gh.gamecenter.login.user.UserRepository
@ -535,6 +536,18 @@ class DefaultJsApi(
val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(url, null, false)
?: DownloadManager.getInstance().getDownloadEntitySnapshot(vUrl, null, false)
NewFlatLogUtils.logGameInstall(
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
trigger = "主动安装"
)
SensorsBridge.trackInstallGameClick(
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
action = "主动安装"
)
downloadEntity?.let {
PackageInstaller.install(context, it, showUnzipToast = false)
}

View File

@ -350,7 +350,8 @@ object DefaultUrlHandler {
}
EntranceConsts.HOST_FORUM_DETAIL -> {
DirectUtils.directForumDetail(context, id, entrance)
val sectionId = uri.getQueryParameter("section_id") ?: ""
DirectUtils.directForumDetailSection(context, id, sectionId, entrance)
}
EntranceConsts.HOST_GAME_RATING_DETAIL -> {
@ -438,17 +439,17 @@ object DefaultUrlHandler {
directToFeedback(
context,
content,
null,
isQaFeedback,
qaContentId,
isPlugin = false,
isSmoothGame = false,
EntranceConsts.ENTRANCE_BROWSER
)
}
}
EntranceConsts.HOST_HELP_AND_FEEDBACK -> {
val position = uri.getQueryParameter("position") ?: ""
DirectUtils.directToHelpAndFeedback(context, position.toInt())
DirectUtils.directToHelpAndFeedback(context)
}
EntranceConsts.HOST_HELP_DETAIL -> {
@ -489,12 +490,13 @@ object DefaultUrlHandler {
val activityName = uri.getQueryParameter("activity_name") ?: ""
val gameId = uri.getQueryParameter("game_id") ?: ""
context.startActivity(
GameCollectionEditActivity.getIntent(
GameCollectionEditActivity.getCreateIntent(
context,
activityId,
activityName,
gameId,
entrance
entrance,
"其他"
)
)
}

View File

@ -11,6 +11,7 @@ class BrowserInstallHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
BrowserInstallHelper.showBrowserInstallHintDialog(
context,
gameEntity,
gameEntity.isVGame() || gameEntity.isSplitXApk()
) {
if (hasNext()) {

View File

@ -9,7 +9,7 @@ class CheckDownloadHandler : ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
val apk = gameEntity.getApk().safelyGetInRelease(0) ?: return
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name) { isSubscribe: Boolean ->
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name, gameEntity.categoryChinese) { isSubscribe: Boolean ->
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {

View File

@ -2,20 +2,22 @@ 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.feature.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)
}
PermissionHelper.checkStoragePermissionBeforeAction(
context,
gameEntity.id,
gameEntity.name ?: "",
gameEntity.categoryChinese
) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {
processEndCallback?.invoke(null)
}
})
}
}
}

View File

@ -10,7 +10,7 @@ class UpdateNewSimulatorHandler: ChainHandler() {
override fun handleRequest(context: Context, gameEntity: GameEntity) {
if (SimulatorGameManager.isSimulatorGame(gameEntity)) {
if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(context)) {
NewSimulatorGameManager.showUpdateNewsSimulator(context) {
NewSimulatorGameManager.showUpdateNewsSimulator(context, gameEntity) {
if (hasNext()) {
getNext()?.handleRequest(context, gameEntity)
} else {

View File

@ -3,6 +3,7 @@ package com.gh.common.chain
import android.content.Context
import com.gh.gamecenter.R
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.toResString
import com.gh.gamecenter.feature.entity.GameEntity
@ -19,13 +20,42 @@ class VersionNumberHandler : ChainHandler() {
if (!gameEntity.isShowVersionNumber()) {
confirmCallback.invoke()
} else {
SensorsBridge.trackGameDemoDialogShow(
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
DialogHelper.showGuideDialog(
context,
"温馨提示",
gameEntity.getVersionNumberString(),
"继续下载",
R.string.cancel.toResString(),
{ confirmCallback.invoke() },
{
confirmCallback.invoke()
SensorsBridge.trackGameDemoDialogClick(
buttonName = "继续下载",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
cancelClickCallback = {
SensorsBridge.trackGameDemoDialogClick(
buttonName = R.string.cancel.toResString(),
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
touchOutsideCallback = {
SensorsBridge.trackGameDemoDialogClick(
buttonName = "关闭弹窗",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
extraConfig = DialogHelper.Config(titleIcon = R.drawable.ic_dialog_tips)
)
}

View File

@ -13,14 +13,14 @@ import android.widget.PopupWindow
import androidx.core.content.ContextCompat
import androidx.databinding.BindingAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import com.gh.gamecenter.R
import com.gh.gamecenter.common.callback.OnViewClickListener
import com.gh.gamecenter.common.databinding.LayoutPopupContainerBinding
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
import com.gh.gamecenter.databinding.LayoutPopupContainerBinding
import com.gh.gamecenter.feature.entity.ServerCalendarEntity
import com.gh.gamecenter.servers.add.AddKaiFuPopupAdapter
import java.text.SimpleDateFormat

View File

@ -64,6 +64,8 @@ import com.gh.gamecenter.common.eventbus.EBReuse;
import com.gh.gamecenter.common.utils.DarkModeUtils;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.ImageUtils;
import com.gh.gamecenter.common.utils.NewFlatLogUtils;
import com.gh.gamecenter.common.utils.SensorsBridge;
import com.gh.gamecenter.common.view.DrawableView;
import com.gh.gamecenter.core.utils.DisplayUtils;
import com.gh.gamecenter.core.utils.MtaHelper;
@ -398,7 +400,7 @@ public class BindingAdapters {
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);
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.getId(), gameEntity.getName(), gameEntity.getCategoryChinese(), null);
return;
}
}
@ -483,6 +485,19 @@ public class BindingAdapters {
case INSTALL_PLUGIN:
case INSTALL_NORMAL:
if (gameEntity.getApk().size() == 1) {
NewFlatLogUtils.INSTANCE.logGameInstall(
gameEntity.getId(),
gameEntity.getName() != null ? gameEntity.getName() : "",
"主动安装"
);
SensorsBridge.trackInstallGameClick(
gameEntity.getId(),
gameEntity.getName() != null ? gameEntity.getName() : "",
"主动安装"
);
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity);
if (gameEntity.isVGame()) {

View File

@ -1,6 +1,7 @@
package com.gh.common.dialog
import android.app.Activity.RESULT_OK
import android.content.DialogInterface
import android.content.Intent
import android.os.Build
import android.os.Bundle
@ -18,13 +19,10 @@ 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.*
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 : BaseDialogFragment() {
@ -34,8 +32,11 @@ class InstallPermissionDialogFragment : BaseDialogFragment() {
var url: String = ""
var gameId: String = ""
var gameName: String = ""
var gameType: String = ""
var mCallBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)? = null
private var dismissByTouchInside = false
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mView = inflater.inflate(R.layout.dialog_install_permission, null, false)
return mView
@ -55,6 +56,12 @@ class InstallPermissionDialogFragment : BaseDialogFragment() {
if (isXapk) NewFlatLogUtils.logXApkInstallPermissionDialogShowed(gameId, gameName)
SensorsBridge.trackInstallPermissionDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameType
)
val randomNumber = if (isXapk) 1 else Random.nextInt(2)
closeTv.goneIf(randomNumber == 0)
closeIv.goneIf(randomNumber != 0)
@ -64,18 +71,38 @@ class InstallPermissionDialogFragment : BaseDialogFragment() {
}
closeTv.setOnClickListener {
dismissByTouchInside = true
if (isXapk) {
NewFlatLogUtils.logXApkInstallPermissionDialogClick("尝试解压", false, gameId, gameName)
mCallBack?.invoke(false)
}
SensorsBridge.trackInstallPermissionDialogClick(
buttonName = "尝试解压",
gameId = gameId,
gameName = gameName,
gameType = gameType
)
dismiss()
}
closeIv.setOnClickListener {
dismissByTouchInside = true
if (isXapk) NewFlatLogUtils.logXApkInstallPermissionDialogClick("关闭", false, gameId, gameName)
SensorsBridge.trackInstallPermissionDialogClick(
buttonName = "关闭",
gameId = gameId,
gameName = gameName,
gameType = gameType
)
dismiss()
}
activateTv.setOnClickListener {
NewFlatLogUtils.logXApkInstallPermissionDialogClick("立即开启", false, gameId, gameName)
SensorsBridge.trackInstallPermissionDialogClick(
buttonName = "立即开启",
gameId = gameId,
gameName = gameName,
gameType = gameType
)
PermissionHelper.toInstallPermissionSetting(requireActivity())
if (isXapk) {
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, requireActivity().javaClass.name)
@ -84,9 +111,23 @@ class InstallPermissionDialogFragment : BaseDialogFragment() {
}
}
override fun onDismiss(dialog: DialogInterface) {
if (!dismissByTouchInside) {
SensorsBridge.trackInstallPermissionDialogClick(
buttonName = "关闭弹窗",
gameId = gameId,
gameName = gameName,
gameType = gameType
)
}
super.onDismiss(dialog)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) {
dismissByTouchInside = true
NewFlatLogUtils.logXApkInstallPermissionDialogClick("立即开启", true, gameId, gameName)
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
@ -136,6 +177,7 @@ class InstallPermissionDialogFragment : BaseDialogFragment() {
installPermissionDialogFragment.url = downloadEntity.url
installPermissionDialogFragment.gameId = downloadEntity.gameId
installPermissionDialogFragment.gameName = downloadEntity.name
installPermissionDialogFragment.gameType = downloadEntity.categoryChinese
val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction()
transaction.show(installPermissionDialogFragment)
transaction.commit()
@ -146,6 +188,7 @@ class InstallPermissionDialogFragment : BaseDialogFragment() {
this.url = downloadEntity.url
this.gameId = downloadEntity.gameId
this.gameName = downloadEntity.name
this.gameType = downloadEntity.categoryChinese
}
installPermissionDialogFragment.show(
activity.supportFragmentManager,

View File

@ -2,6 +2,7 @@ package com.gh.common.dialog
import android.animation.ValueAnimator
import android.content.Context
import android.content.DialogInterface
import android.content.pm.PackageInfo
import android.os.Bundle
import android.view.LayoutInflater
@ -11,6 +12,7 @@ import android.view.animation.LinearInterpolator
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.LinearLayoutManager
@ -61,6 +63,8 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
var gameEntity: GameEntity? = null
var callBack: ConfirmListener? = null
private var mDismissByTouchInside = false
private val dataWatcher = object : DataWatcher() {
override fun onDataChanged(downloadEntity: DownloadEntity) {
val packageName = downloadEntity.packageName
@ -90,6 +94,11 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
EventBus.getDefault().register(this)
gameEntity?.let {
LogUtils.uploadPackageCheck("pkg_check_pop_click", "出现弹窗", it, "", "", "", "")
SensorsBridge.trackPkgCheckDialogShow(
gameId = it.id,
gameName = it.name ?: "",
gameType = it.categoryChinese
)
}
}
@ -128,6 +137,18 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
"",
""
)
SensorsBridge.trackPkgCheckDialogClick(
buttonName = "点击链接",
gameId = gameEntity?.id ?: "",
gameName = gameEntity?.name ?: "",
gameType = gameEntity?.categoryChinese ?: "",
isNotPrompt = if (binding.noRemindAgainCb.isVisible) {
binding.noRemindAgainCb.isChecked
} else null,
linkId = link.link ?: "",
linkType = link.type ?: "",
linkText = link.linkText ?: ""
)
DirectUtils.directToLinkPage(requireContext(), link, "包名检测弹窗", "")
}.build()
spanBuilder.append(linkSpan)
@ -176,6 +197,7 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
}
val isAllPackageInstalled = isAllPackageInstalled(mAllInstalledPackages, entity)
if (isAllPackageInstalled) {
mDismissByTouchInside = true
callBack?.onConfirm()
dismissAllowingStateLoss()
} else {
@ -193,6 +215,15 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
"",
""
)
SensorsBridge.trackPkgCheckDialogClick(
buttonName = "点击前往下载",
gameId = gameEntity?.id ?: "",
gameName = gameEntity?.name ?: "",
gameType = gameEntity?.categoryChinese ?: "",
isNotPrompt = if (binding.noRemindAgainCb.isVisible) {
binding.noRemindAgainCb.isChecked
} else null
)
DirectUtils.directToLinkPage(requireContext(), packageLink, "包名检测弹窗", "")
}
}
@ -206,6 +237,19 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
saveRecord(entity)
LogUtils.uploadPackageCheck("pkg_check_pop_click", "不再提示", gameEntity, "", "", "", "")
}
mDismissByTouchInside = true
SensorsBridge.trackPkgCheckDialogClick(
buttonName = binding.cancelTv.text.toString(),
gameId = gameEntity?.id ?: "",
gameName = gameEntity?.name ?: "",
gameType = gameEntity?.categoryChinese ?: "",
isNotPrompt = if (binding.noRemindAgainCb.isVisible) {
binding.noRemindAgainCb.isChecked
} else null
)
dismissAllowingStateLoss()
}
}
@ -300,6 +344,21 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
DownloadManager.getInstance().removeObserver(dataWatcher)
}
override fun onDismiss(dialog: DialogInterface) {
if (!mDismissByTouchInside) {
SensorsBridge.trackPkgCheckDialogClick(
buttonName = "关闭弹窗",
gameId = gameEntity?.id ?: "",
gameName = gameEntity?.name ?: "",
gameType = gameEntity?.categoryChinese ?: "",
isNotPrompt = if (binding.noRemindAgainCb.isVisible) {
binding.noRemindAgainCb.isChecked
} else null
)
}
super.onDismiss(dialog)
}
//安装、卸载事件
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMainThread(busFour: EBPackage) {

View File

@ -62,17 +62,17 @@ object ExposureUtils {
host: String? = "unknown",
path: String? = "unknown",
downloadType: DownloadType
) {
): ExposureEvent? {
val gameEntity = entity.copy()
gameEntity.platform = platform
gameEntity.downloadCompleteType = downloadType.toString()
val traceEvent = trace?.toObject<ExposureEvent>()
if (TextUtils.isEmpty(entity.id)) return
if (TextUtils.isEmpty(entity.id)) return null
// 避免生成 trace 相同的下载完成事件,根据日志看下载完成的同一秒有可能生成两条
if (mDownloadCompleteTraceEventIdSet.contains(traceEvent?.id)) {
return
return null
}
traceEvent?.payload?.gameId?.let { mDownloadCompleteTraceEventIdSet.add(it) }
@ -91,6 +91,8 @@ object ExposureUtils {
ExposureManager.log(exposureEvent)
ExposureManager.commitSavedExposureEvents(forcedUpload = true)
return exposureEvent
}
@JvmStatic

View File

@ -0,0 +1,134 @@
package com.gh.common.prioritychain
import android.app.Activity
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.FrameLayout
import com.gh.common.util.NewFlatLogUtils
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.fragment.BaseFragment
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.view.BugFixedPopupWindow
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.databinding.PopupAccelerateNotificationBinding
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.fragment.MainWrapperViewModel
class AccelerateNotificationHandler(priority: Int) : PriorityChainHandler(priority) {
private var mActivity: Activity? = null
private var mBaseHandler: BaseFragment.BaseHandler? = null
private var mGameList: List<GameEntity>? = null
private var mViewModel: MainWrapperViewModel? = null
/**
* 提前预处理显示弹窗的内容
*/
fun doPreProcess(
activity: Activity,
baseHandler: BaseFragment.BaseHandler,
gameEntityList: List<GameEntity>?,
viewModel: MainWrapperViewModel
) {
mActivity = activity
mGameList = gameEntityList
mBaseHandler = baseHandler
mViewModel = viewModel
if (getStatus() == STATUS_PENDING) {
if (gameEntityList == null) {
processNext()
} else {
onProcess()
}
} else {
if (gameEntityList == null) {
updateStatus(STATUS_INVALID)
} else {
updateStatus(STATUS_VALID)
}
}
}
override fun onProcess() {
when (getStatus()) {
STATUS_VALID -> {
val accelerateSet =
HashSet(SPUtils.getStringSet(Constants.SP_ACCELERATE_NOTIFICATION_POP_UP_SET))
if (!mGameList.isNullOrEmpty() && !accelerateSet.contains(mGameList!![0].messageId)) {
showAccelerateNotificationPopupWindow(mActivity!!, mViewModel, mBaseHandler, mGameList!![0]) {
processNext()
}
accelerateSet.add(mGameList!![0].messageId)
SPUtils.setStringSet(Constants.SP_ACCELERATE_NOTIFICATION_POP_UP_SET, accelerateSet)
} else {
processNext()
}
}
STATUS_INVALID -> {
processNext()
}
}
}
companion object {
fun showAccelerateNotificationPopupWindow(
activity: Activity,
viewModel: MainWrapperViewModel?,
baseHandler: BaseFragment.BaseHandler?,
gameEntity: GameEntity?,
dismissCallback: (() -> Unit)?
) {
val binding: PopupAccelerateNotificationBinding =
PopupAccelerateNotificationBinding.inflate(LayoutInflater.from(activity))
if (gameEntity != null) {
binding.gameIconView.displayGameIcon(gameEntity)
binding.gameNameTv.text = gameEntity.name
binding.root.setOnClickListener {
NewFlatLogUtils.logMessageInformClickPluginVersion(
gameEntity.id,
gameEntity.name!!
)
if (gameEntity.messageId.isNotEmpty()) {
// 把对应系统消息设为已读
viewModel?.postMessageRead(gameEntity.messageId)
}
GameDetailActivity.startGameDetailActivity(
context = activity,
gameId = gameEntity.id,
entrance = "首页插件上架弹窗",
defaultTab = -1,
isSkipGameComment = false,
scrollToLibao = false,
openVideoStreaming = false,
openPlatformWindow = true,
traceEvent = null
)
}
}
BugFixedPopupWindow(
binding.root,
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT
).apply {
isTouchable = true
isFocusable = true
isOutsideTouchable = true
animationStyle = R.style.popup_window_ease_in_and_out_anim_style
showAtLocation(
activity.window.decorView,
Gravity.TOP,
0,
DisplayUtils.getStatusBarHeight(activity.resources) + DisplayUtils.dip2px(42f)
)
setOnDismissListener {
dismissCallback?.invoke()
}
baseHandler?.postDelayed({ dismiss() }, 5000)
}
}
}
}

View File

@ -0,0 +1,86 @@
package com.gh.common.prioritychain
import androidx.recyclerview.widget.RecyclerView
import com.alibaba.android.arouter.launcher.ARouter
import com.gh.gamecenter.common.base.fragment.BaseLazyFragment
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.core.provider.IFloatingWindowProvider
import com.gh.gamecenter.feature.entity.WelcomeDialogEntity
import com.gh.gamecenter.floatingwindow.FloatingWindowEntity
import com.gh.gamecenter.fragment.WelcomeDialogFragment
import com.lightgame.utils.Utils
class FloatingWindowHandler(priority: Int) : PriorityChainHandler(priority) {
private var mFragment: BaseLazyFragment? = null
private var mRecyclerView: RecyclerView? = null
private var mWindowList: ArrayList<FloatingWindowEntity>? = null
fun setData(windowList: ArrayList<FloatingWindowEntity>?) {
mWindowList = windowList
if (mFragment != null) {
preProcess()
}
}
fun setView(
fragment: BaseLazyFragment,
recyclerView: RecyclerView
) {
mFragment = fragment
mRecyclerView = recyclerView
if (mWindowList != null) {
preProcess()
}
}
private fun preProcess() {
Utils.log(TAG, "FloatingWindowHandler preProcess windowSize is -> ${mWindowList?.size}")
if (getStatus() == STATUS_PENDING) {
if (!mWindowList.isNullOrEmpty()) {
onProcess()
} else {
processNext()
}
} else {
if (!mWindowList.isNullOrEmpty()) {
updateStatus(STATUS_VALID)
} else {
updateStatus(STATUS_INVALID)
}
}
}
override fun onProcess() {
when (getStatus()) {
STATUS_VALID -> {
val floatingWindowProvider =
ARouter.getInstance().build(RouteConsts.provider.floatingwindow)
.navigation() as? IFloatingWindowProvider<WelcomeDialogEntity>
// 强校验所有条件均通过才能显示
if (floatingWindowProvider == null || mFragment == null || mFragment?.isAdded == false || mRecyclerView == null) {
processNext()
return
}
floatingWindowProvider.showFloatingWindowOnly(
mFragment!!,
mRecyclerView!!,
mWindowList!!,
) {
val welcomeDialog = WelcomeDialogFragment.getInstance(it, true, mFragment)
welcomeDialog.show(mFragment!!.childFragmentManager, "WelcomeDialog")
}
}
STATUS_INVALID -> {
processNext()
}
}
}
}

View File

@ -0,0 +1,44 @@
package com.gh.common.prioritychain
import com.gh.gamecenter.fragment.HomeSearchToolWrapperFragment
class HomePushHandler(priority: Int): PriorityChainHandler(priority) {
private var mHomeFragment: HomeSearchToolWrapperFragment? = null
/**
* 提前预处理显示弹窗的内容
*/
fun doPreProcess(homeFragment: HomeSearchToolWrapperFragment?, shouldShow: Boolean) {
mHomeFragment = homeFragment
if (getStatus() == STATUS_PENDING) {
if (shouldShow && homeFragment != null) {
onProcess()
} else {
processNext()
}
} else {
if (shouldShow && homeFragment != null) {
updateStatus(STATUS_VALID)
} else {
updateStatus(STATUS_INVALID)
}
}
}
override fun onProcess() {
when (getStatus()) {
STATUS_VALID -> {
// 目前首页下拉二楼是首页最后一个弹窗类的东西,还没实现回调,如果有其它要在它后面弹出的,需要自行在它的实现结果后添加回调
mHomeFragment?.popUpHomePushIfNeeded {
processNext()
}
}
STATUS_INVALID -> {
processNext()
}
}
}
}

View File

@ -0,0 +1,20 @@
package com.gh.common.prioritychain
import com.gh.gamecenter.common.entity.NotificationUgc
import com.gh.gamecenter.common.utils.NotificationHelper
import com.gh.gamecenter.login.user.UserManager
class NotificationPermissionDialogHandler(priority: Int) : PriorityChainHandler(priority) {
override fun onProcess() {
// 仅登录后再启动光环时请求一次权限
if (UserManager.getInstance().isLoggedIn) {
NotificationHelper.showNotificationHintDialog(NotificationUgc.LOGIN) {
processNext()
}
} else {
processNext()
}
}
}

View File

@ -0,0 +1,22 @@
package com.gh.common.prioritychain
import java.util.*
import java.util.concurrent.PriorityBlockingQueue
class PriorityChain {
private val mHandlerQueue: Queue<PriorityChainHandler> = PriorityBlockingQueue()
fun addHandler(handler: PriorityChainHandler) {
mHandlerQueue.add(handler.also {
it.setPriorityChain(this)
})
}
fun start() {
mHandlerQueue.poll()?.process(mHandlerQueue)
}
fun isHandlerQueueEmpty() = mHandlerQueue.isEmpty()
}

View File

@ -0,0 +1,71 @@
package com.gh.common.prioritychain
import com.lightgame.utils.Utils
import java.util.*
abstract class PriorityChainHandler(private val mPriority: Int) : Comparable<PriorityChainHandler> {
private var mStatus = STATUS_UNKNOWN
private var mQueue: Queue<PriorityChainHandler>? = null
private var mPriorityChain: PriorityChain? = null
/**
* 获取当前 handler 的状态
* - 等待结果返回 STATUS_PENDING
* - 无需执行 STATUS_INVALID
* - 可执行 STATUS_VALID
* - 未知 STATUS_UNKNOWN
*/
fun getStatus(): Int = mStatus
fun updateStatus(status: Int) {
Utils.log(TAG, "${javaClass.simpleName} updateStatus $status")
mStatus = status
}
fun setPriorityChain(priorityChain: PriorityChain) {
mPriorityChain = priorityChain
}
fun process(queue: Queue<PriorityChainHandler>) {
Utils.log(TAG, "${javaClass.simpleName} process $mStatus")
mQueue = queue
// 若当前 handler 未经处理,将其状态改为 pending
if (mStatus == STATUS_UNKNOWN) {
updateStatus(STATUS_PENDING)
}
onProcess()
}
/**
* 执行相关功能的地方
*/
abstract fun onProcess()
/**
* 分发给下一个 handler 处理
*/
fun processNext() {
Utils.log(TAG, "${javaClass.simpleName} processNext $mStatus")
mQueue?.poll()?.process(mQueue!!)
}
override fun compareTo(other: PriorityChainHandler): Int {
return (mPriority - other.mPriority)
}
companion object {
internal const val STATUS_PENDING = 0
internal const val STATUS_INVALID = 1
internal const val STATUS_VALID = 2
internal const val STATUS_UNKNOWN = 3
const val TAG = "PriorityChainHandler"
}
}

View File

@ -0,0 +1,47 @@
package com.gh.common.prioritychain
import androidx.fragment.app.FragmentActivity
import com.gh.common.dialog.PrivacyPolicyDialogFragment
import com.gh.gamecenter.entity.DialogEntity
class PrivacyPolicyDialogHandler(priority: Int) : PriorityChainHandler(priority) {
private var mActivity: FragmentActivity? = null
private var mPrivacyPolicyEntity: DialogEntity.PrivacyPolicyEntity? = null
/**
* 提前预处理显示弹窗的内容
*/
fun doPreProcess(fragmentActivity: FragmentActivity, privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity?) {
mActivity = fragmentActivity
mPrivacyPolicyEntity = privacyPolicyEntity
if (getStatus() == STATUS_PENDING) {
if (privacyPolicyEntity == null) {
processNext()
} else {
onProcess()
}
} else {
if (privacyPolicyEntity == null) {
updateStatus(STATUS_INVALID)
} else {
updateStatus(STATUS_VALID)
}
}
}
override fun onProcess() {
when(getStatus()) {
STATUS_VALID -> {
PrivacyPolicyDialogFragment.show(mActivity!!, mPrivacyPolicyEntity) { _: Boolean? ->
processNext()
}
}
STATUS_INVALID -> {
processNext()
}
}
}
}

View File

@ -0,0 +1,52 @@
package com.gh.common.prioritychain
import androidx.fragment.app.Fragment
import com.gh.common.dialog.ReserveDialog
import com.gh.gamecenter.common.entity.SimpleGameEntity
import com.gh.gamecenter.message.MessageUnreadRepository
class ReserveDialogHandler(priority: Int) : PriorityChainHandler(priority) {
private var mFragment: Fragment? = null
private var mReserveData: List<SimpleGameEntity>? = null
/**
* 提前预处理显示弹窗的内容
*/
fun doPreProcess(fragment: Fragment, reserveData: List<SimpleGameEntity>?) {
mFragment = fragment
mReserveData = reserveData
if (getStatus() == STATUS_PENDING) {
if (reserveData.isNullOrEmpty()) {
processNext()
} else {
onProcess()
}
} else {
if (reserveData.isNullOrEmpty()) {
updateStatus(STATUS_INVALID)
} else {
updateStatus(STATUS_VALID)
}
}
}
override fun onProcess() {
when (getStatus()) {
STATUS_VALID -> {
val reserveDialog = ReserveDialog.getInstance(mReserveData!!)
reserveDialog.setOnDismissListener {
MessageUnreadRepository.loadMessageUnreadData()
processNext()
}
reserveDialog.show(mFragment!!.childFragmentManager, "reserveDialog")
}
STATUS_INVALID -> {
processNext()
}
}
}
}

View File

@ -0,0 +1,17 @@
package com.gh.common.prioritychain
import android.content.Context
import com.gh.gamecenter.manager.UpdateManager
class UpdateDialogHandler(context: Context, priority: Int) : PriorityChainHandler(priority) {
private val mUpdateManager = UpdateManager.getInstance(context)
override fun onProcess() {
mUpdateManager.checkUpdate(true, null)
mUpdateManager.setDismissCallback {
processNext()
}
}
}

View File

@ -0,0 +1,79 @@
package com.gh.common.prioritychain
import android.graphics.Bitmap
import androidx.fragment.app.Fragment
import com.gh.gamecenter.common.callback.BiCallback
import com.gh.gamecenter.common.utils.ImageUtils
import com.gh.gamecenter.feature.entity.WelcomeDialogEntity
import com.gh.gamecenter.fragment.MainWrapperViewModel
import com.gh.gamecenter.fragment.WelcomeDialogFragment
import com.halo.assistant.HaloApp
class WelcomeDialogHandler(priority: Int): PriorityChainHandler(priority) {
private var mFragment: Fragment? = null
private var mWelcomeDialogEntity: WelcomeDialogEntity? = null
fun doPreProcess(fragment: Fragment, welcomeDialogEntity: WelcomeDialogEntity?) {
mFragment = fragment
mWelcomeDialogEntity = welcomeDialogEntity
val preLoadClosure = {
// 判断启动本次应用是否已经弹窗,不是的话弹启动弹窗
if (HaloApp.get(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false) == null) {
HaloApp.put(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false)
ImageUtils.getBitmap(mWelcomeDialogEntity!!.icon, object : BiCallback<Bitmap, Boolean> {
override fun onFirst(first: Bitmap) {
if (getStatus() == STATUS_PENDING) {
updateStatus(STATUS_VALID)
onProcess()
} else {
updateStatus(STATUS_VALID)
}
}
override fun onSecond(second: Boolean) {
processNext()
}
})
} else {
processNext()
}
}
if (getStatus() == STATUS_PENDING) {
if (welcomeDialogEntity == null) {
processNext()
} else {
preLoadClosure.invoke()
}
} else {
if (welcomeDialogEntity == null) {
updateStatus(STATUS_INVALID)
} else {
preLoadClosure.invoke()
}
}
}
override fun onProcess() {
when (getStatus()) {
STATUS_VALID -> {
if (mFragment == null || !mFragment!!.isAdded) {
updateStatus(STATUS_INVALID)
processNext()
} else {
val welcomeDialog = WelcomeDialogFragment.getInstance(mWelcomeDialogEntity)
welcomeDialog.setOnDismissListener {
processNext()
}
welcomeDialog.show(mFragment!!.childFragmentManager, "WelcomeDialog")
}
}
STATUS_INVALID -> {
processNext()
}
}
}
}

View File

@ -56,6 +56,22 @@ class ConfigProviderImpl : IConfigProvider {
return Config.getSettings()?.image?.oss?.gifWaterMark ?: ""
}
override fun getVideoSnapshotSuffix(): String {
return Config.getSettings()?.image?.oss?.snapshot ?: ""
}
override fun getImageCropSuffix(): String {
return Config.getSettings()?.image?.oss?.crop ?: ""
}
override fun getImageInfoSuffix(): String {
return Config.getSettings()?.image?.oss?.info ?: ""
}
override fun getImageResizeSuffix(): String {
return Config.getSettings()?.image?.oss?.resize ?: ""
}
override fun getQQ(): String {
return Config.getSettings()?.support?.qq ?: ""
}

View File

@ -1,6 +1,7 @@
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.DirectUtils
import com.gh.gamecenter.common.constant.RouteConsts
@ -53,16 +54,16 @@ class DirectProviderImpl : IDirectProvider {
DirectUtils.directDouyin(context, userId)
}
override fun directToSuggestionFromDiagnosis(context: Context, diagnosis: String) {
DirectUtils.directToSuggestion(context, diagnosis = diagnosis)
override fun directToSuggestionFromDiagnosis(context: Context, content: String, diagnosis: String) {
DirectUtils.directToSuggestion(context, content = content, diagnosis = diagnosis)
}
override fun directToQa(context: Context, text: String?, id: String) {
DirectUtils.directToQa(context, text, id)
}
override fun directToHelpAndFeedback(context: Context, position: Int) {
DirectUtils.directToHelpAndFeedback(context, position)
override fun directToHelpAndFeedback(context: Context, bundle: Bundle?) {
DirectUtils.directToHelpAndFeedback(context, bundle)
}
override fun directToQqGroup(context: Context, groupNumber: String?): Boolean {

View File

@ -5,9 +5,11 @@ import com.alibaba.android.arouter.facade.annotation.Route
import com.gh.common.util.NewFlatLogUtils
import com.gh.gamecenter.common.base.GlobalActivityManager
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.entity.GameUpdateEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.provider.IDownloadButtonClickedProvider
import com.gh.gamecenter.feature.view.DownloadButton
import com.gh.gamecenter.packagehelper.PackageRepository
@ -25,6 +27,7 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider {
var downloadStatusInChinese = ""
var gameSchemaType = ""
var packageName = ""
var exposureSourceList: List<ExposureSource>? = null
val boundedObject = downloadButton.getObject()
@ -47,6 +50,7 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider {
downloadStatusInChinese = boundedObject.downloadStatusChinese
gameSchemaType = boundedObject.gameBitChinese
packageName = boundedObject.getUniquePackageName() ?: ""
exposureSourceList = boundedObject.exposureEvent?.source
}
is GameUpdateEntity -> {
@ -57,6 +61,7 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider {
gameTypeInChinese = boundedObject.categoryChinese
downloadStatusInChinese = boundedObject.downloadStatusChinese
packageName = boundedObject.packageName
exposureSourceList = boundedObject.exposureEvent?.source
}
is DownloadEntity -> {
@ -65,6 +70,7 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider {
gameCategory = boundedObject.getGameCategory()
downloadStatus = if (boundedObject.isVGame()) "畅玩" else "下载"
packageName = boundedObject.packageName
exposureSourceList = boundedObject.exposureTrace?.toObject<ExposureEvent>()?.source
}
}
@ -92,8 +98,9 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider {
) {
// 上报神策点击事件
SensorsBridge.trackEvent(
SensorsBridge.trackEventWithExposureSource(
"DownLoadbuttonClick",
exposureSourceList,
"game_id", gameId,
"game_name", gameName,
"game_type", gameTypeInChinese,
@ -105,10 +112,9 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider {
"page_business_id", GlobalActivityManager.getCurrentPageEntity().pageBusinessId,
"last_page_name", GlobalActivityManager.getLastPageEntity().pageName,
"last_page_id", GlobalActivityManager.getLastPageEntity().pageId,
"last_page_business_id", GlobalActivityManager.getLastPageEntity().pageBusinessId
"last_page_business_id", GlobalActivityManager.getLastPageEntity().pageBusinessId,
)
}
}
}

View File

@ -6,7 +6,6 @@ import com.gh.common.util.DirectUtils
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.common.entity.CommunityEntity
import com.gh.gamecenter.common.entity.LinkEntity
import com.gh.gamecenter.common.entity.SimpleGameEntity
import com.gh.gamecenter.common.entity.SuggestType
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.provider.ILinkDirectUtilsProvider
@ -48,17 +47,6 @@ class LinkDirectUtilsProviderImpl : ILinkDirectUtilsProvider {
DirectUtils.directToSuggestion(context, type, suggestHintType, content, isQaFeedback, qaContentId)
}
override fun directToSuggestion(
context: Context,
type: SuggestType,
suggestHintType: String?,
content: String?,
game: SimpleGameEntity,
platform: String
) {
DirectUtils.directToSuggestion(context, type, suggestHintType, content, game, platform)
}
override fun directToSuggestion(context: Context, type: SuggestType, hiddenHint: String) {
DirectUtils.directToSuggestion(context, type, hiddenHint)
}

View File

@ -41,7 +41,7 @@ object NewSimulatorGameManager {
private const val KEY_USE_DEBUG_API = "USE_DEBUG_API"
private const val KEY_META = "META"
// private const val GH_RETRO_EMU_APP_PACKAGE_NAME = "com.gh.retroemu"
// private const val GH_RETRO_EMU_APP_PACKAGE_NAME = "com.gh.retroemu"
private const val GH_RETRO_EMU_APP_LAUNCHER_ACTIVITY_NAME = "com.gh.retroemu.ui.SplashActivity"
@ -61,10 +61,10 @@ object NewSimulatorGameManager {
}
/**
* 弹出更新弹框
*/
* 弹出更新弹框
*/
@JvmStatic
fun showUpdateNewsSimulator(context: Context, callback: EmptyCallback? = null){
fun showUpdateNewsSimulator(context: Context, gameEntity: GameEntity, callback: EmptyCallback? = null) {
NewFlatLogUtils.logSimulatorUpdateAlertShow()
DialogHelper.showDialog(
context,
@ -76,7 +76,13 @@ object NewSimulatorGameManager {
NewFlatLogUtils.logSimulatorUpdateAlertClick("更新")
val simulator = Config.getNewSimulatorEntitySetting()
if (simulator != null) {
SimulatorDownloadManager.getInstance().showDownloadingDialog(context, simulator)
SimulatorDownloadManager.getInstance().showDownloadingDialog(
context,
simulator,
gameEntity.id,
gameEntity.name ?: "",
gameEntity.categoryChinese
)
}
},
cancelClickCallback = {
@ -127,7 +133,10 @@ object NewSimulatorGameManager {
)
val intent = Intent()
intent.setClassName(SimulatorGameManager.NEW_SIMULATOR_PACKAGE_NAME, GH_RETRO_EMU_APP_LAUNCHER_ACTIVITY_NAME)
intent.setClassName(
SimulatorGameManager.NEW_SIMULATOR_PACKAGE_NAME,
GH_RETRO_EMU_APP_LAUNCHER_ACTIVITY_NAME
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.data = gamePackageFileUri
gameEntity.getApk().safelyGetInRelease(0)?.let { apk ->
@ -138,7 +147,10 @@ object NewSimulatorGameManager {
intent.putExtra(KEY_GAME_ICON, it)
intent.putExtra(KEY_GAME_PACKAGE_PATH, downloadEntity.path) // 游戏包文件路径,冗余参数)
intent.putExtra(KEY_GAME_PACKAGE_SDCARD_PATH, true)
intent.putExtra(KEY_GAME_PACKAGE_LAST_MODIFICATION, File(downloadEntity.path).lastModified()) // 游戏包文件修改时间
intent.putExtra(
KEY_GAME_PACKAGE_LAST_MODIFICATION,
File(downloadEntity.path).lastModified()
) // 游戏包文件修改时间
intent.putExtra(KEY_GAME_EMU_SYSTEM, gameEntity.simulatorType) // 模拟器类型
intent.putExtra(KEY_GAME_ID, gameEntity.id)
// TODO 补充光环模拟器的游戏 id

View File

@ -14,6 +14,7 @@ import com.gh.common.util.PackageInstaller
import com.gh.common.util.PackageUtils
import com.gh.download.DownloadManager
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.GlobalActivityManager
import com.gh.gamecenter.common.base.TrackableDialog
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.utils.*
@ -47,6 +48,7 @@ class SimulatorDownloadManager private constructor() {
private var simulator: SimulatorEntity? = null
private var gameId: String = ""
private var gameName: String = ""
private var gameType: String = ""
private var downloadType: String = ""
private val dataWatcher = object : DataWatcher() {
@ -99,33 +101,43 @@ class SimulatorDownloadManager private constructor() {
downloadDialog?.dismiss()
}
}
DownloadStatus.diskisfull == downloadEntity.status -> {
ToastUtils.showToast("存储空间已满,下载任务已暂停")
}
DownloadStatus.diskioerror == downloadEntity.status -> {
ToastUtils.showToast("下载 IO 出现异常,下载任务已暂停")
}
DownloadStatus.neterror == downloadEntity.status -> {
ToastUtils.showToast("网络不稳定,下载任务已暂停")
}
DownloadStatus.timeout == downloadEntity.status -> {
ToastUtils.showToast("网络不稳定,下载任务已暂停")
}
DownloadStatus.notfound == downloadEntity.status -> {
ToastUtils.showToast("下载链接异常,请稍后重试")
}
DownloadStatus.uncertificated == downloadEntity.status -> {
ToastUtils.showToast("请先进行实名认证")
}
DownloadStatus.unqualified == downloadEntity.status -> {
ToastUtils.showToast("未成年人暂不允许在此时间下载游戏")
}
DownloadStatus.unavailable == downloadEntity.status -> {
ToastUtils.showToast("该游戏未接入防沉迷系统,暂不支持下载")
}
DownloadStatus.banned == downloadEntity.status -> {
ToastUtils.showToast("网络异常")
}
DownloadStatus.hijack == downloadEntity.status -> {
ToastUtils.showToast("网络劫持,请稍后重试")
}
@ -135,7 +147,7 @@ class SimulatorDownloadManager private constructor() {
}
fun showDownloadDialog(context: Context, simulator: SimulatorEntity?, location: SimulatorLocation) {
showDownloadDialog(context, simulator, location, "", "", null)
showDownloadDialog(context, simulator, location, "", "", "", null)
}
fun showDownloadDialog(
@ -144,6 +156,7 @@ class SimulatorDownloadManager private constructor() {
location: SimulatorLocation,
gameId: String = "",
gameName: String = "",
gameCategoryChinese: String = "",
cancelCallback: (() -> Unit)? = null
) {
if (context == null) return
@ -152,6 +165,7 @@ class SimulatorDownloadManager private constructor() {
this.simulator = simulator
this.gameId = gameId
this.gameName = gameName
this.gameType = gameCategoryChinese
PermissionHelper.checkGetInstalledAppsListBeforeAction(context, object : EmptyCallback {
override fun onCallback() {
@ -183,7 +197,8 @@ class SimulatorDownloadManager private constructor() {
return
}
val title = if (shouldShowUpdate && isInstalled) "更新模拟器" else "安装模拟器"
val message = if (shouldShowUpdate && isInstalled) "检测到模拟器存在更高版本,是否前往更新" else "模拟器游戏需要先下载安装对应的模拟器,才可以运行"
val message =
if (shouldShowUpdate && isInstalled) "检测到模拟器存在更高版本,是否前往更新" else "模拟器游戏需要先下载安装对应的模拟器,才可以运行"
val positiveText =
if (shouldShowUpdate && isInstalled) "更新(${simulator?.apk?.size}" else "下载(${simulator?.apk?.size}"
val negativeText = if (shouldShowUpdate && isInstalled) "下次再说" else "取消"
@ -195,6 +210,25 @@ class SimulatorDownloadManager private constructor() {
if (shouldShowUpdate && isInstalled) {
NewFlatLogUtils.logSimulatorUpdateAlertShow()
}
if (shouldShowUpdate && isInstalled) {
SensorsBridge.trackSimulatorUpdateDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
} else {
SensorsBridge.trackSimulatorInstallDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
}
DialogHelper.showDialog(
context,
title,
@ -207,16 +241,79 @@ class SimulatorDownloadManager private constructor() {
cancelCallback?.invoke()
NewFlatLogUtils.logSimulatorUpdateAlertClick("取消")
MtaHelper.onEvent(trackableEntity.event, trackableEntity.key, "点击下次再说")
SensorsBridge.trackSimulatorUpdateDialogClick(
buttonName = negativeText,
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
} else {
SensorsBridge.trackSimulatorInstallDialogClick(
buttonName = negativeText,
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
}
},
confirmClickCallback = {
showDownloadingDialog(context, simulator)
showDownloadingDialog(context, simulator, gameId, gameName, gameCategoryChinese)
NewFlatLogUtils.logSimulatorUpdateAlertClick("更新")
MtaHelper.onEvent(
trackableEntity.event,
trackableEntity.key,
if (shouldShowUpdate && isInstalled) "点击更新" else "点击下载"
)
if (shouldShowUpdate && isInstalled) {
SensorsBridge.trackSimulatorUpdateDialogClick(
buttonName = positiveText,
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
} else {
SensorsBridge.trackSimulatorInstallDialogClick(
buttonName = positiveText,
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
}
},
touchOutsideCallback = {
if (shouldShowUpdate && isInstalled) {
SensorsBridge.trackSimulatorUpdateDialogClick(
buttonName = "关闭弹窗",
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
} else {
SensorsBridge.trackSimulatorInstallDialogClick(
buttonName = "关闭弹窗",
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese,
lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
lastPageBusinessId = GlobalActivityManager.getLastPageEntity().pageBusinessId
)
}
},
mtaEvent = trackableEntity.event, mtaKey = trackableEntity.key,
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
@ -228,7 +325,13 @@ class SimulatorDownloadManager private constructor() {
})
}
fun showDownloadingDialog(context: Context, simulator: SimulatorEntity?) {
fun showDownloadingDialog(
context: Context,
simulator: SimulatorEntity?,
gameId: String = "",
gameName: String = "",
gameCategoryChinese: String = "",
) {
mContextRef = WeakReference(context)
val msg = FileUtils.isCanDownload(context, simulator?.apk?.size)
if (!msg.isNullOrEmpty()) {
@ -261,6 +364,11 @@ class SimulatorDownloadManager private constructor() {
}
downloadDialog?.setOnDismissListener {
SensorsBridge.trackSimulatorDownloadDialogClose(
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese
)
DownloadManager.getInstance().removeObserver(dataWatcher)
}
@ -273,7 +381,7 @@ class SimulatorDownloadManager private constructor() {
params?.width = context.resources.displayMetrics.widthPixels - DisplayUtils.dip2px(60f)
downloadDialog?.window?.attributes = params
download(simulator)
download(simulator, gameId, gameName, gameCategoryChinese)
}
private fun showNoneEmulatorDialog(context: Context) {
@ -293,7 +401,12 @@ class SimulatorDownloadManager private constructor() {
)
}
private fun download(simulator: SimulatorEntity?) {
private fun download(
simulator: SimulatorEntity?,
gameId: String = "",
gameName: String = "",
gameCategoryChinese: String = ""
) {
val apkEntity = simulator?.apk ?: return
val entity = DownloadManager.getInstance().getDownloadEntityByUrl(apkEntity.url)
@ -308,18 +421,30 @@ class SimulatorDownloadManager private constructor() {
DownloadStatus.diskisfull -> {
DownloadManager.getInstance().addObserver(dataWatcher)
uiExecutor.executeWithDelay(Runnable { DownloadManager.getInstance().resume(entity, true) }, 200)
SensorsBridge.trackSimulatorDownloadDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese
)
downloadDialog?.show()
}
DownloadStatus.done -> NDataChanger.notifyDataChanged(entity)
else -> createDownload(apkEntity, simulator)
else -> createDownload(apkEntity, simulator, gameId, gameName, gameCategoryChinese)
}
} else {
createDownload(apkEntity, simulator)
createDownload(apkEntity, simulator, gameId, gameName, gameCategoryChinese)
}
}
private fun createDownload(apkEntity: ApkEntity, simulator: SimulatorEntity) {
private fun createDownload(
apkEntity: ApkEntity,
simulator: SimulatorEntity,
gameId: String = "",
gameName: String = "",
gameCategoryChinese: String = ""
) {
DownloadManager.getInstance().addObserver(dataWatcher)
val downloadId = PackageInstaller.createDownloadId(simulator.name)
val downloadEntity = DownloadEntity()
@ -351,6 +476,11 @@ class SimulatorDownloadManager private constructor() {
downloadType,
""
)
SensorsBridge.trackSimulatorDownloadDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameCategoryChinese
)
downloadDialog?.show()
}

View File

@ -150,7 +150,7 @@ object SimulatorGameManager {
SimulatorDownloadManager.getInstance().showDownloadDialog(
AppManager.getInstance().recentActiveActivity, simulator,
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name
?: ""
?: "", gameEntity.categoryChinese
) {
jumpToSimulator(downloadEntity, gameEntity)
}

View File

@ -109,12 +109,12 @@ object ArchiveDownloadButtonHelper {
R.string.archive_download_dialog_content.toResString(),
R.string.archive_download_dialog_confirm.toResString(),
R.string.cancel.toResString(),
{
confirmClickCallback = {
NewFlatLogUtils.logCloudArchiveGameDownloadDialogClick(R.string.archive_download_dialog_confirm.toResString())
VHelper.disableLaunchGameAfterInstallation()
EventBus.getDefault().post(EBReuse("download"))
},
{
cancelClickCallback = {
NewFlatLogUtils.logCloudArchiveGameDownloadDialogClick(R.string.cancel.toResString())
},
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)

View File

@ -177,6 +177,8 @@ public class CommentUtils {
return null;
},
null,
null,
null,
new DialogHelper.Config("", false, true, true, false, -1)
);
break;

View File

@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
@ -33,6 +34,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -121,7 +123,7 @@ public class DialogUtils {
return dialog;
}
public static void checkDownload(Context context, String size, String gameId, String gameName, CheckDownloadCallBack callBack) {
public static void checkDownload(Context context, String size, String gameId, String gameName, String gameCategoryChinese, CheckDownloadCallBack callBack) {
if (!NetworkUtils.isNetworkConnected(context)) {
showNoConnectionDownloadDialog(context, () -> {
},
@ -138,7 +140,8 @@ public class DialogUtils {
() -> callBack.onResponse(false),
() -> callBack.onResponse(true),
gameId,
gameName);
gameName,
gameCategoryChinese);
}
}
@ -167,7 +170,9 @@ public class DialogUtils {
DialogHelper.showDialog(context, "下载提示", "网络异常,请检查手机网络状态", "知道了", "WiFi自动下载", listener::onConfirm, cancelListener::onCancel, false, "", "");
}
public static void showDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener, String gameId, String gameName) {
public static void showDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener, String gameId, String gameName, String gameCategoryChinese) {
SensorsBridge.trackDownloadMobileDataDialogShow(gameId, gameName, gameCategoryChinese);
context = checkDialogContext(context);
NewFlatLogUtils.logDownloadMobileDataDialogShow(gameId, gameName);
@ -182,6 +187,7 @@ public class DialogUtils {
Context finalContext = context;
allowOnce.setOnClickListener(v -> {
NewFlatLogUtils.logDownloadMobileDataDialogClick(gameId, gameName, "允许一次");
SensorsBridge.trackDownloadMobileDataDialogClick("允许一次", gameId, gameName, gameCategoryChinese);
AppExecutor.getUiExecutor().executeWithDelay(() -> {
Utils.toast(finalContext, "已使用移动网络下载,请注意流量消耗");
}, 500);
@ -191,12 +197,14 @@ public class DialogUtils {
});
wifiAuto.setOnClickListener(v -> {
NewFlatLogUtils.logDownloadMobileDataDialogClick(gameId, gameName, "WiFi自动下载");
SensorsBridge.trackDownloadMobileDataDialogClick("WiFi自动下载", gameId, gameName, gameCategoryChinese);
cancelListener.onCancel();
dialog.dismiss();
// MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "连上WiFi后自动下载");
});
allowAlways.setOnClickListener(v -> {
NewFlatLogUtils.logDownloadMobileDataDialogClick(gameId, gameName, "总是允许");
SensorsBridge.trackDownloadMobileDataDialogClick("总是允许", gameId, gameName, gameCategoryChinese);
SPUtils.setBoolean(getTrafficDownloadHintKey(), false);
AppExecutor.getUiExecutor().executeWithDelay(() -> {
// 显示了弹窗以后,即便下面这个 toast 放在 listener.onConfirm 后调用也是显示 listener.onConfirm 里的 toast
@ -208,7 +216,10 @@ public class DialogUtils {
// MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "总是允许");
});
dialog.setOnCancelListener(downloadDialog -> NewFlatLogUtils.logDownloadMobileDataDialogClick(gameId, gameName, "关闭弹窗"));
dialog.setOnCancelListener(downloadDialog -> {
NewFlatLogUtils.logDownloadMobileDataDialogClick(gameId, gameName, "关闭弹窗");
SensorsBridge.trackDownloadMobileDataDialogClick("关闭弹窗", gameId, gameName, gameCategoryChinese);
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
@ -730,6 +741,12 @@ public class DialogUtils {
// 海外下载地址弹窗
public static void showOverseaDownloadDialog(Context context, GameEntity gameEntity, @NonNull ConfirmListener listener) {
SensorsBridge.trackOverseasAddressDialogShow(
gameEntity.getId(),
gameEntity.getName() != null ? gameEntity.getName() : "",
gameEntity.getCategoryChinese()
);
context = checkDialogContext(context);
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
@ -739,8 +756,19 @@ public class DialogUtils {
View contentView = binding.getRoot();
binding.gameIcon.displayGameIcon(gameEntity);
binding.gameNameTv.setText(context.getString(R.string.dialog_oversea_hint, gameEntity.getName()));
binding.closeIv.setOnClickListener(v -> dialog.dismiss());
AtomicBoolean dismissByTouchInside = new AtomicBoolean(false);
binding.closeIv.setOnClickListener(v -> {
dismissByTouchInside.set(true);
SensorsBridge.trackOverseasAddressDialogClick(
"取消",
gameEntity.getId(),
gameEntity.getName() != null ? gameEntity.getName() : "",
gameEntity.getCategoryChinese()
);
dialog.dismiss();
});
if ("show&download".equals(gameEntity.getOverseasAddressDialog().getStatus())) {
gameEntity.getApk().get(0).setUrl(gameEntity.getOverseasAddressDialog().getLink());
@ -748,6 +776,13 @@ public class DialogUtils {
binding.urlTv.setText(gameEntity.getOverseasAddressDialog().getLink());
binding.downloadBtn.setText("下载(" + gameEntity.getApk().get(0).getSize() + "");
binding.downloadBtn.setOnClickListener(v -> {
dismissByTouchInside.set(true);
SensorsBridge.trackOverseasAddressDialogClick(
"下载",
gameEntity.getId(),
gameEntity.getName() != null ? gameEntity.getName() : "",
gameEntity.getCategoryChinese()
);
listener.onConfirm();
dialog.dismiss();
});
@ -757,6 +792,17 @@ public class DialogUtils {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
dialog.setOnDismissListener(dialog1 -> {
if (!dismissByTouchInside.get()) {
SensorsBridge.trackOverseasAddressDialogClick(
"关闭弹窗",
gameEntity.getId(),
gameEntity.getName() != null ? gameEntity.getName() : "",
gameEntity.getCategoryChinese()
);
}
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
@ -1209,7 +1255,7 @@ public class DialogUtils {
@Override
public Unit invoke() {
SimpleGameEntity entity = new SimpleGameEntity(gameId, gameName, "");
HelpAndFeedbackBridge.startSuggestionActivity(finalContext, SuggestType.gameQuestion, "notfound", "模拟器安装包解析错误", entity, "-");
HelpAndFeedbackBridge.startSuggestionActivity(finalContext, SuggestType.GAME, "notfound", "模拟器安装包解析错误", entity);
dialog.dismiss();
return null;
}

View File

@ -15,6 +15,7 @@ import com.gh.common.constant.Config
import com.gh.common.exposure.ExposureManager.log
import com.gh.common.exposure.ExposureTraceUtils.appendTrace
import com.gh.common.util.EntranceUtils.jumpActivity
import com.gh.common.util.EntranceUtils.jumpActivityCompat
import com.gh.gamecenter.*
import com.gh.gamecenter.amway.AmwayActivity
import com.gh.gamecenter.catalog.CatalogActivity
@ -24,7 +25,6 @@ import com.gh.gamecenter.common.base.activity.BaseActivity
import com.gh.gamecenter.common.base.activity.BaseActivity_TabLayout
import com.gh.gamecenter.common.base.activity.ToolBarActivity
import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout
import com.gh.gamecenter.common.constant.CommonConsts
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.constant.EntranceConsts.*
@ -37,7 +37,9 @@ import com.gh.gamecenter.core.runOnIoThread
import com.gh.gamecenter.core.utils.ToastUtils
import com.gh.gamecenter.discovery.DiscoveryActivity
import com.gh.gamecenter.download.DownloadFragment.Companion.INDEX_UPDATE
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.entity.SubjectData
import com.gh.gamecenter.entity.SubjectRecommendEntity
import com.gh.gamecenter.entity.VideoLinkEntity
import com.gh.gamecenter.eventbus.EBSkip
import com.gh.gamecenter.feature.entity.GameDetailServer
import com.gh.gamecenter.feature.entity.GameEntity
@ -225,6 +227,7 @@ object DirectUtils {
linkEntity.link!!.contains("v.douyin") && PackageHelper.localPackageNameSet.contains("com.ss.android.ugc.aweme") -> {
directDouyin(context, "1402577827140941")
}
else -> directToWebView(
context,
url = linkEntity.link!!,
@ -278,7 +281,16 @@ object DirectUtils {
)
}
"column_collection", "专题合集" -> directToColumnCollection(context, linkEntity.link!!, -1, entrance, "", exposureEvent)
"column_collection", "专题合集" -> directToColumnCollection(
context,
linkEntity.link!!,
-1,
entrance,
"",
linkEntity.blockId,
linkEntity.blockName,
exposureEvent
)
"server", "game_server", "开服表" -> directToGameServers(context, entrance, path, exposureEvent)
@ -298,7 +310,7 @@ object DirectUtils {
"libao", "礼包" -> directToGiftDetail(context, linkEntity.link ?: "", entrance)
"feedback" -> directToFeedback(context, linkEntity.name, linkEntity.text, false, "", entrance)
"feedback" -> directToFeedback(context, linkEntity.name, false, "", false, false, entrance)
"qa", "qa_content", "Q&A" -> directToQa(context, linkEntity.text ?: "", linkEntity.link ?: "")
@ -308,7 +320,12 @@ object DirectUtils {
?: ""
)
"anliwall", "安利墙" -> directToAmway(context, fixedTopAmwayCommentId = null, entrance = entrance, path = path)
"anliwall", "安利墙" -> directToAmway(
context,
fixedTopAmwayCommentId = null,
entrance = entrance,
path = path
)
"game_detail_comment" -> directToGameDetail(context, linkEntity.link ?: "", entrance)
@ -430,6 +447,7 @@ object DirectUtils {
"" -> {
// do nothing
}
else -> {
if (unknownCallback != null) {
unknownCallback.invoke()
@ -478,6 +496,8 @@ object DirectUtils {
position: Int = -1,
entrance: String,
columnName: String = "",
blockId: String = "",
blockName: String = "",
exposureEvent: ExposureEvent? = null
) {
if (id.isEmpty()) return
@ -486,9 +506,11 @@ object DirectUtils {
bundle.putString(KEY_ENTRANCE, entrance)
bundle.putString(KEY_COLLECTION_ID, id)
bundle.putString(KEY_COLUMNNAME, columnName)
bundle.putString(KEY_BLOCK_ID, blockId)
bundle.putString(KEY_BLOCK_NAME, blockName)
bundle.putInt(KEY_POSITION, position)
if (exposureEvent != null) {
bundle.putParcelableArrayList(EntranceConsts.KEY_EXPOSURE_SOURCE_LIST ,ArrayList(exposureEvent.source))
bundle.putParcelableArrayList(EntranceConsts.KEY_EXPOSURE_SOURCE_LIST, ArrayList(exposureEvent.source))
}
jumpActivity(context, bundle)
}
@ -721,7 +743,8 @@ object DirectUtils {
) {
if (id.isEmpty()) return
val bundle = Bundle()
val subjectData = SubjectData(subjectId = id, subjectName = subjectName, isOrder = false, isQQMiniGame = isQQMiniGame)
val subjectData =
SubjectData(subjectId = id, subjectName = subjectName, isOrder = false, isQQMiniGame = isQQMiniGame)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
bundle.putString(KEY_TO, SubjectActivity::class.java.name)
bundle.putParcelable(EntranceConsts.KEY_SUBJECT_DATA, subjectData)
@ -735,72 +758,68 @@ object DirectUtils {
// 反馈
@JvmStatic
fun directToFeedback(context: Context, content: String? = null, entrance: String? = null) {
directToFeedback(context, content, null, false, "", entrance)
directToFeedback(context, content, false, "", false, false, entrance)
}
@JvmStatic
fun directToFeedback(
context: Context,
content: String? = null,
hintType: String? = null,
isQaFeedback: Boolean = false,
qaContentId: String? = "",
isPlugin: Boolean = false,
isSmoothGame: Boolean = false,
entrance: String? = null
) {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
val destination = RouteConsts.activity.suggestionActivity.toDestinationClass()
bundle.putString(KEY_TO, destination?.name ?: "")
bundle.putBoolean(KEY_PLUGIN, isPlugin)
bundle.putBoolean(KEY_SMOOTH_GAME, isSmoothGame)
if (isPlugin) {
bundle.putString(KEY_HIDE_SUGGEST_HINT, "【插件问题】")
}
if (isSmoothGame) {
bundle.putString(KEY_HIDE_SUGGEST_HINT, "【畅玩问题】")
}
if (isQaFeedback) {
bundle.putBoolean(KEY_IS_QA_FEEDBACK, true)
bundle.putString(KEY_QA_CONTENT_ID, qaContentId)
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.normal)
} else {
bundle.putString(KEY_CONTENT, content)
if (TextUtils.isEmpty(hintType)) {
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.gameQuestion)
bundle.putString(KEY_SUGGEST_HINT_TYPE, KEY_PLUGIN)
} else {
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.normal)
bundle.putString(KEY_SUGGEST_HINT_TYPE, hintType)
}
}
jumpActivity(context, bundle)
context.startActivity(HelpAndFeedbackBridge.getSuggestionCategoryIntent(context, bundle))
}
/**
* 畅玩助手反馈跳转
* 跳转至使用帮助与反馈,请不要随意修改方法名
*/
@JvmStatic
fun directToVGameFeedback(
fun directToHelpAndFeedback(
context: Context,
content: String? = null,
hintType: String? = null,
isQaFeedback: Boolean = false,
qaContentId: String? = "",
isPlugin: Boolean = false,
isSmoothGame: Boolean = false,
entrance: String? = null
) {
val bundle = Bundle()
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
val destination = RouteConsts.activity.suggestionActivity.toDestinationClass()
bundle.putString(KEY_TO, destination?.name ?: "")
bundle.putBoolean(KEY_PLUGIN, isPlugin)
bundle.putBoolean(KEY_SMOOTH_GAME, isSmoothGame)
if (isPlugin) {
bundle.putString(KEY_HIDE_SUGGEST_HINT, "【插件问题】")
}
if (isSmoothGame) {
bundle.putString(KEY_HIDE_SUGGEST_HINT, "【畅玩问题】")
}
if (isQaFeedback) {
bundle.putBoolean(KEY_IS_QA_FEEDBACK, true)
bundle.putString(KEY_QA_CONTENT_ID, qaContentId)
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.cwzsQuestion)
} else {
bundle.putString(KEY_CONTENT, content)
if (TextUtils.isEmpty(hintType)) {
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.gameQuestion)
bundle.putString(KEY_SUGGEST_HINT_TYPE, KEY_PLUGIN)
} else {
bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.cwzsQuestion)
bundle.putString(KEY_SUGGEST_HINT_TYPE, hintType)
}
}
EntranceUtils.jumpActivityCompat(context, bundle)
directToHelpAndFeedback(context, bundle)
}
@JvmStatic
@ -1430,7 +1449,7 @@ object DirectUtils {
fun directForumDetailSection(
context: Context,
bbsId: String? = "",
sectionId: String = "",
sectionId: String? = "",
entrance: String? = null
) {
val bundle = Bundle()
@ -1525,15 +1544,14 @@ object DirectUtils {
/**
* 跳转至使用帮助与反馈,请不要随意修改方法名
* @param position 使用帮助:[CommonConsts.TAB_MAIN],意见反馈:[CommonConsts.TAB_SUB]
*/
@JvmStatic
fun directToHelpAndFeedback(context: Context, position: Int = CommonConsts.TAB_MAIN) {
fun directToHelpAndFeedback(context: Context, bundle: Bundle? = null) {
val destination = RouteConsts.activity.helpAndFeedbackActivity.toDestinationClass()
val bundle = Bundle()
bundle.putString(KEY_TO, destination?.name ?: "")
bundle.putInt(BaseActivity_TabLayout.PAGE_INDEX, position)
jumpActivity(context, bundle)
val newBundle = Bundle()
newBundle.putString(KEY_TO, destination?.name ?: "")
bundle?.let { newBundle.putAll(it) }
jumpActivityCompat(context, newBundle)
}
/**
@ -1914,16 +1932,16 @@ object DirectUtils {
@JvmStatic
fun directToSuggestion(
context: Context,
type: SuggestType = SuggestType.normal,
type: SuggestType = SuggestType.APP,
hiddenHint: String = "",
suggestHintType: String? = null,
content: String? = null,
platform: String = "",
game: SimpleGameEntity? = null,
isQaFeedback: Boolean = false,
qaContentId: String = "",
fromRatingKey: Boolean = false,
diagnosis: String = "",
forceLogin: Boolean = true,
requestCode: Int? = null
) {
val intent = HelpAndFeedbackBridge.getIntent(
@ -1932,12 +1950,12 @@ object DirectUtils {
hiddenHint,
suggestHintType,
content,
platform,
game,
isQaFeedback,
qaContentId,
fromRatingKey,
diagnosis
diagnosis,
forceLogin
)
if (requestCode != null) {
(context as Activity).startActivityForResult(intent, requestCode)
@ -1980,12 +1998,19 @@ object DirectUtils {
}
@JvmStatic
fun directToSuggestion(context: Context, type: SuggestType, hiddenHint: String, requestCode: Int?) {
fun directToSuggestion(
context: Context,
type: SuggestType,
hiddenHint: String,
forceLogin: Boolean = true,
requestCode: Int?
) {
directToSuggestion(
context = context,
type = type,
hiddenHint = hiddenHint,
suggestHintType = null,
forceLogin = forceLogin,
requestCode = requestCode,
)
}
@ -2010,26 +2035,6 @@ object DirectUtils {
)
}
@JvmStatic
fun directToSuggestion(
context: Context,
type: SuggestType,
suggestHintType: String? = null,
content: String? = null,
game: SimpleGameEntity,
platform: String = ""
) {
directToSuggestion(
context = context,
type = type,
hiddenHint = "",
suggestHintType = suggestHintType,
content = content,
game = game,
platform = platform
)
}
@JvmStatic
fun directToQGameHome(context: Context) {
context.startActivity(QGameHomeWrapperActivity.getIntent(context))
@ -2051,6 +2056,11 @@ object DirectUtils {
qqGameId: String
) {
if (activity !is AppCompatActivity || activity.supportFragmentManager.isDestroyed) {
ToastUtils.toast("启动QQ小游戏失败请稍后再试")
return
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
ToastUtils.toast("该游戏仅支持安卓5.0及以上设备")
return

View File

@ -2,7 +2,10 @@ package com.gh.common.util
import android.content.Context
import android.os.Build
import com.gh.gamecenter.R
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.toResString
import com.gh.gamecenter.core.utils.EmptyCallback
import com.gh.gamecenter.feature.entity.ApkEntity
import com.gh.gamecenter.feature.entity.GameEntity
@ -21,7 +24,43 @@ object DownloadDialogHelper {
) {
val dialog = retrieveAvailableDialog(gameEntity, apkEntity)
if (dialog != null) {
showDownloadDialog(context, dialog, callback)
SensorsBridge.trackGameDownloadDialogShow(
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
DialogHelper.showDialogWithHtmlContent(
context,
dialog.title,
dialog.content,
"继续下载",
"取消",
confirmClickCallback = {
SensorsBridge.trackGameDownloadDialogClick(
buttonName = "继续下载",
gameId = gameEntity.id ,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
cancelClickCallback = {
SensorsBridge.trackGameDownloadDialogClick(
buttonName = "取消",
gameId = gameEntity.id ,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
callback.onCallback()
},
touchOutsideCallback = {
SensorsBridge.trackGameDownloadDialogClick(
buttonName = "关闭弹窗",
gameId = gameEntity.id ,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
}
)
} else {
callback.onCallback()
}
@ -109,14 +148,4 @@ object DownloadDialogHelper {
return null
}
private fun showDownloadDialog(context: Context, dialog: GameEntity.Dialog, callback: EmptyCallback) {
DialogHelper.showDialogWithHtmlContent(
context,
dialog.title,
dialog.content,
"继续下载",
"取消",
{ callback.onCallback() })
}
}

View File

@ -1,6 +1,5 @@
package com.gh.common.util
import android.annotation.SuppressLint
import android.content.Context
import android.os.Message
import android.text.TextUtils
@ -8,7 +7,6 @@ import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.collection.ArrayMap
import androidx.recyclerview.widget.RecyclerView
import com.alibaba.android.arouter.launcher.ARouter
import com.gh.common.chain.*
import com.gh.common.constant.Config
import com.gh.common.dialog.DeviceRemindDialog
@ -32,20 +30,16 @@ import com.gh.gamecenter.common.base.GlobalActivityManager
import com.gh.gamecenter.common.callback.CancelListener
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.constant.RouteConsts
import com.gh.gamecenter.common.entity.LinkEntity
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.core.provider.IQGameProvider
import com.gh.gamecenter.core.utils.*
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.entity.PluginLocation
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.view.DownloadButton
import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment
import com.gh.gamecenter.login.user.UserManager
import com.gh.gamecenter.manager.PackagesManager
import com.gh.gamecenter.retrofit.RetrofitManager
import com.gh.gamecenter.teenagermode.TeenagerModeActivity
import com.gh.vspace.VHelper
import com.lightgame.download.DownloadConfig
@ -642,15 +636,43 @@ object DownloadItemUtils {
gamePermissionDialogFragment?.dismissAllowingStateLoss()
if (SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) {
downloadBtn.setOnClickListener {
SensorsBridge.trackAdolescentModeDialogShow(
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
DialogHelper.showDialog(
context,
"提示",
"当前处于儿童/青少年模式, \n暂不提供游戏下载",
"退出青少年模式",
"关闭",
{ context.startActivity(TeenagerModeActivity.getIntent(context)) },
{},
DialogHelper.Config(
confirmClickCallback = {
context.startActivity(TeenagerModeActivity.getIntent(context))
SensorsBridge.trackAdolescentModeDialogClick(
buttonName = "退出青少年模式",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
cancelClickCallback = {
SensorsBridge.trackAdolescentModeDialogClick(
buttonName = "关闭",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
touchOutsideCallback = {
SensorsBridge.trackAdolescentModeDialogClick(
buttonName = "关闭弹窗",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
extraConfig = DialogHelper.Config(
centerTitle = true,
centerContent = true
)
@ -677,7 +699,7 @@ object DownloadItemUtils {
}
},
{},
DialogHelper.Config(
extraConfig = DialogHelper.Config(
centerTitle = true,
centerContent = true
)
@ -800,7 +822,13 @@ object DownloadItemUtils {
if (downloadBtn is DownloadButton && downloadBtn.text == context.getString(R.string.launch)) {
clickRunnable.onCallback()
} else {
PermissionHelper.checkStoragePermissionBeforeAction(context, clickRunnable)
PermissionHelper.checkStoragePermissionBeforeAction(
context,
gameEntity.id,
gameEntity.name ?: "",
gameEntity.categoryChinese,
clickRunnable
)
}
}
} else {
@ -913,6 +941,19 @@ object DownloadItemUtils {
}
} else if (str == context.getString(R.string.install)) {
val downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.url)
com.gh.gamecenter.common.utils.NewFlatLogUtils.logGameInstall(
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
trigger = "主动安装"
)
SensorsBridge.trackInstallGameClick(
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
action = "主动安装"
)
if (gameEntity.simulator != null) {
val isInstalled =
PackageUtils.isInstalledFromAllPackage(context, gameEntity.simulator!!.apk!!.packageName)
@ -925,8 +966,13 @@ object DownloadItemUtils {
}
if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(gameEntity) && !isInstalled && !isInstalledNewSimulator) {
SimulatorDownloadManager.getInstance().showDownloadDialog(
context, simulator,
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name!!, null
context,
simulator,
SimulatorDownloadManager.SimulatorLocation.LAUNCH,
gameEntity.id,
gameEntity.name!!,
gameEntity.categoryChinese,
null
)
return
}
@ -941,7 +987,7 @@ object DownloadItemUtils {
//启动模拟器游戏
if (SimulatorGameManager.isSimulatorGame(gameEntity)) {
if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(context)) {
NewSimulatorGameManager.showUpdateNewsSimulator(context, null)
NewSimulatorGameManager.showUpdateNewsSimulator(context, gameEntity, null)
return
}
val downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(gameEntity.getApk()[0].url)
@ -977,7 +1023,8 @@ object DownloadItemUtils {
context,
apk.size,
gameEntity.id,
gameEntity.name
gameEntity.name,
gameEntity.categoryChinese
) { isSubscribe: Boolean ->
update(context, gameEntity, entrance, location, isSubscribe, traceEvent)
}
@ -1115,7 +1162,16 @@ object DownloadItemUtils {
}
PackageUtils.isCanPluggable(apkEntity) -> {
DialogHelper.showPluginDialog(context, gameEntity.pluginDesc) { PackageInstaller.uninstall(context, path) }
DialogHelper.showPluginDialog(
context,
pluginDesc = gameEntity.pluginDesc,
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese,
platform = gameEntity.platform ?: ""
) {
PackageInstaller.uninstall(context, path)
}
}
else -> {

View File

@ -17,6 +17,11 @@ import com.gh.gamecenter.common.entity.SimpleGameEntity
import com.gh.gamecenter.common.entity.SuggestType
import com.gh.gamecenter.common.eventbus.EBShowDialog
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.utils.GsonUtils
import com.gh.gamecenter.core.utils.MtaHelper
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.core.utils.ToastUtils
import com.gh.gamecenter.common.utils.NewFlatLogUtils
import com.gh.gamecenter.core.utils.*
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.feature.entity.GameEntity
@ -73,19 +78,47 @@ object DownloadObserver {
val currentActivity = AppManager.getInstance().currentActivity() ?: return
SensorsBridge.trackDownloadLinkRotDialogShow(
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
gameType = downloadEntity.categoryChinese
)
DialogHelper.showDialog(
currentActivity,
"下载失败",
"下载链接已失效,建议提交反馈",
"立即反馈",
"取消",
{
confirmClickCallback = {
HelpAndFeedbackBridge.startSuggestionActivity(
currentActivity,
SuggestType.gameQuestion, "notfound",
StringUtils.buildString(downloadEntity.name, "问题反馈:下载链接失效"),
SuggestType.GAME, "notfound",
"问题反馈:下载链接失效",
SimpleGameEntity(gameId, downloadEntity.name, "")
)
SensorsBridge.trackDownloadLinkRotDialogClick(
buttonName = "立即反馈",
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
gameType = downloadEntity.categoryChinese
)
},
cancelClickCallback = {
SensorsBridge.trackDownloadLinkRotDialogClick(
buttonName = "取消",
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
gameType = downloadEntity.categoryChinese
)
},
touchOutsideCallback = {
SensorsBridge.trackDownloadLinkRotDialogClick(
buttonName = "关闭弹窗",
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
gameType = downloadEntity.categoryChinese
)
},
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
)
@ -196,6 +229,18 @@ object DownloadObserver {
// 会有 ActivityNotFoundException 异常catch 掉不管了
tryWithDefaultCatch {
if (Constants.SILENT_UPDATE != downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE)) {
NewFlatLogUtils.logGameInstall(
gameId = downloadEntity.gameId ?: "",
gameName = downloadEntity.name ?: "",
trigger = "自动安装"
)
SensorsBridge.trackInstallGameClick(
gameName = downloadEntity.name,
gameId = downloadEntity.gameId,
action = "自动安装"
)
// TODO 在 Android 11 上没有授权安装未知应用的权限前第一次调用这个方法系统会杀掉我们的进程...
// 没能找到类似的解释,最接近的是这个 https://issuetracker.google.com/issues/154157387但也只是点授权杀进程而已
PackageInstaller.install(mApplication, downloadEntity);
@ -219,7 +264,7 @@ object DownloadObserver {
EBShowDialog(
BaseActivity.PLUGGABLE,
downloadEntity.path,
downloadEntity.pluginDesc
downloadEntity
)
)
@ -257,7 +302,7 @@ object DownloadObserver {
}
SimulatorDownloadManager.getInstance().showDownloadDialog(
currentActivity, simulator,
SimulatorDownloadManager.SimulatorLocation.LAUNCH, downloadEntity.gameId, gameName, null
SimulatorDownloadManager.SimulatorLocation.LAUNCH, downloadEntity.gameId, gameName, downloadEntity.categoryChinese, null
)
SimulatorGameManager.recordDownloadSimulatorGame(downloadEntity.gameId, simulator.type)
SimulatorGameManager.postPlayedGame(downloadEntity.gameId, downloadEntity.packageName)
@ -277,6 +322,17 @@ object DownloadObserver {
) {
downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES"
tryWithDefaultCatch {
NewFlatLogUtils.logGameInstall(
gameId = downloadEntity.gameId ?: "",
gameName = downloadEntity.name ?: "",
trigger = "自动安装"
)
SensorsBridge.trackInstallGameClick(
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
action = "自动安装"
)
PackageInstaller.install(mApplication, downloadEntity, false)
}
} else {
@ -286,14 +342,15 @@ object DownloadObserver {
EBShowDialog(
BaseActivity.PLUGGABLE,
downloadEntity.path,
downloadEntity.pluginDesc
downloadEntity
)
)
} else {
EventBus.getDefault().post(
EBShowDialog(
BaseActivity.SIGNATURE_CONFLICT,
downloadEntity.path
downloadEntity.path,
downloadEntity
)
)
}
@ -364,35 +421,6 @@ object DownloadObserver {
type = ExposureUtils.DownloadType.PLUGIN_DOWNLOAD
}
if (downloadEntity.isVGame()) {
SensorsBridge.trackEvent(
"HaloFunGameDownloadDone",
"game_name", downloadEntity.name,
"game_id", downloadEntity.gameId,
"game_schema_type", if (downloadEntity.getMetaExtra(VHelper.KEY_BIT) == "32") "32位" else "64位"
)
} else if (downloadEntity.gameId == Constants.HALO_FUN_GAME_ID) {
SensorsBridge.trackEvent(
"HaloFunDownloadDone",
"space_schema_type",
if (downloadEntity.packageName == VHelper.VSPACE_32BIT_PACKAGENAME) "32位" else "64位"
)
} else if (downloadEntity.gameId != Constants.GHZS_GAME_ID && downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) != Constants.SIMULATOR_DOWNLOAD) {
SensorsBridge.trackEvent(
"DownloadProcessFinish",
"game_id", downloadEntity.gameId,
"game_name", downloadEntity.meta[Constants.GAME_NAME] ?: "",
"game_type", downloadEntity.meta[Constants.GAME_CATEGORY_IN_CHINESE] ?: "",
"game_schema_type", if (downloadEntity.getMetaExtra(VHelper.KEY_BIT) == "32") "32位" else "64位",
"page_name", getCurrentPageEntity().pageName,
"page_id", getCurrentPageEntity().pageId,
"page_business_id", getCurrentPageEntity().pageBusinessId,
"last_page_name", getLastPageEntity().pageName,
"last_page_id", getLastPageEntity().pageId,
"last_page_business_id", getLastPageEntity().pageBusinessId
)
}
var downloadSpeed = 0L
val elapsedTimeString = downloadEntity.meta[DownloadConfig.KEY_DOWNLOAD_ELAPSED_TIME]
if (elapsedTimeString != null) {
@ -405,7 +433,7 @@ object DownloadObserver {
val isPlatformRecommend =
java.lang.Boolean.parseBoolean(downloadEntity.getMetaExtra(Constants.IS_PLATFORM_RECOMMEND))
ExposureUtils.logADownloadCompleteExposureEvent(
val exposureEvent = ExposureUtils.logADownloadCompleteExposureEvent(
GameEntity(
id = downloadEntity.gameId,
mName = downloadEntity.name.removeSuffix(Constants.GAME_NAME_DECORATOR),
@ -422,6 +450,41 @@ object DownloadObserver {
type
)
if (downloadEntity.isVGame()) {
SensorsBridge.trackEventWithExposureSource(
"HaloFunGameDownloadDone",
exposureEvent?.source,
"game_name", downloadEntity.name,
"game_id", downloadEntity.gameId,
"game_schema_type", if (downloadEntity.getMetaExtra(VHelper.KEY_BIT) == "32") "32位" else "64位"
)
} else if (downloadEntity.gameId == Constants.HALO_FUN_GAME_ID) {
SensorsBridge.trackEvent(
"HaloFunDownloadDone",
"space_schema_type",
if (downloadEntity.packageName == VHelper.VSPACE_32BIT_PACKAGENAME) "32位" else "64位"
)
}
if (downloadEntity.gameId != Constants.GHZS_GAME_ID
&& downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) != Constants.SIMULATOR_DOWNLOAD
&& downloadEntity.gameId != Constants.HALO_FUN_GAME_ID) {
SensorsBridge.trackEventWithExposureSource(
"DownloadProcessFinish",
exposureEvent?.source,
"game_id", downloadEntity.gameId,
"game_name", downloadEntity.meta[Constants.GAME_NAME] ?: "",
"game_type", downloadEntity.meta[Constants.GAME_CATEGORY_IN_CHINESE] ?: "",
"game_schema_type", if (downloadEntity.getMetaExtra(VHelper.KEY_BIT) == "32") "32位" else "64位",
"page_name", getCurrentPageEntity().pageName,
"page_id", getCurrentPageEntity().pageId,
"page_business_id", getCurrentPageEntity().pageBusinessId,
"last_page_name", getLastPageEntity().pageName,
"last_page_id", getLastPageEntity().pageId,
"last_page_business_id", getLastPageEntity().pageBusinessId
)
}
DataCollectionUtils.uploadDownload(mApplication, downloadEntity, "完成")
}

View File

@ -15,18 +15,19 @@ import android.text.TextUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.gh.gamecenter.common.base.activity.ToolBarActivity;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.MainActivity;
import com.gh.gamecenter.SplashScreenActivity;
import com.gh.gamecenter.common.avoidcallback.AvoidOnResultManager;
import com.gh.gamecenter.common.avoidcallback.Callback;
import com.gh.gamecenter.common.base.activity.ToolBarActivity;
import com.gh.gamecenter.common.base.fragment.ToolbarFragment;
import com.gh.gamecenter.common.constant.EntranceConsts;
import com.gh.gamecenter.core.utils.ClassUtils;
import com.gh.gamecenter.core.utils.GsonUtils;
import com.gh.gamecenter.core.utils.SPUtils;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.AppManager;
import com.lightgame.utils.Utils;
import org.json.JSONException;
@ -66,8 +67,8 @@ public class EntranceUtils {
public static void jumpActivity(Context context, Bundle bundle) {
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
if (HaloApp.getInstance().isRunningForeground) {
// 应用正在运行,前台或后台
if (AppManager.getInstance().findActivity(MainActivity.class) != null) {
// 应用正在运行,前台或后台且MainActivity在栈中
String to = bundle.getString(KEY_TO);
Class<?> clazz = ClassUtils.forName(to);
if (clazz == null) clazz = MainActivity.class;
@ -92,8 +93,8 @@ public class EntranceUtils {
public static void jumpActivity(Context context, Bundle nextToBundle, Bundle bundle, Callback callback) {
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
if (HaloApp.getInstance().isRunningForeground) {
// 应用正在运行,前台或后台
if (AppManager.getInstance().findActivity(MainActivity.class) != null) {
// 应用正在运行,前台或后台且MainActivity在栈中
String to = bundle.getString(KEY_TO);
Class<?> clazz = ClassUtils.forName(to);
if (clazz == null) clazz = MainActivity.class;

View File

@ -19,13 +19,11 @@ import com.gh.download.server.BrowserInstallHelper
import com.gh.gamecenter.R
import com.gh.gamecenter.WebActivity
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.retrofit.ApiResponse
import com.gh.gamecenter.common.retrofit.EmptyResponse
import com.gh.gamecenter.common.retrofit.Response
import com.gh.gamecenter.common.utils.DataLogUtils
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.observableToMain
import com.gh.gamecenter.common.utils.singleToMain
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.runOnUiThread
@ -37,7 +35,6 @@ import com.gh.gamecenter.feature.entity.ApkEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.entity.PluginLocation
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.feature.utils.ApkActiveUtils
import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment
@ -112,15 +109,43 @@ object GameActivityDownloadHelper {
// 青少年模式
private fun isTeenageMode(context: Context): Boolean {
if (SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) {
SensorsBridge.trackAdolescentModeDialogShow(
gameId = mGameEntity?.id ?: "",
gameName = mGameEntity?.name ?: "",
gameType = mGameEntity?.categoryChinese ?: ""
)
DialogHelper.showDialog(
context,
"提示",
"当前处于儿童/青少年模式, \n暂不提供游戏下载",
"退出青少年模式",
"关闭",
{ context.startActivity(TeenagerModeActivity.getIntent(context)) },
{},
DialogHelper.Config(
confirmClickCallback = {
context.startActivity(TeenagerModeActivity.getIntent(context))
SensorsBridge.trackAdolescentModeDialogClick(
buttonName = "退出青少年模式",
gameId = mGameEntity?.id ?: "",
gameName = mGameEntity?.name ?: "",
gameType = mGameEntity?.categoryChinese ?: ""
)
},
cancelClickCallback = {
SensorsBridge.trackAdolescentModeDialogClick(
buttonName = "关闭",
gameId = mGameEntity?.id ?: "",
gameName = mGameEntity?.name ?: "",
gameType = mGameEntity?.categoryChinese ?: ""
)
},
touchOutsideCallback = {
SensorsBridge.trackAdolescentModeDialogClick(
buttonName = "关闭弹窗",
gameId = mGameEntity?.id ?: "",
gameName = mGameEntity?.name ?: "",
gameType = mGameEntity?.categoryChinese ?: ""
)
},
extraConfig = DialogHelper.Config(
centerTitle = true,
centerContent = true
)
@ -235,7 +260,7 @@ object GameActivityDownloadHelper {
) {
GamePermissionDialogFragment.show((context as AppCompatActivity), gameEntity, gameEntity.info) {
CertificationDialog.showCertificationDialog(context, gameEntity) {
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name) { isSubscribe: Boolean ->
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name, gameEntity.categoryChinese) { isSubscribe: Boolean ->
download(context, gameEntity, apk, isSubscribe, entrance, location, traceEvent)
}
}
@ -259,7 +284,8 @@ object GameActivityDownloadHelper {
context,
apk.size,
gameEntity.id,
gameEntity.name
gameEntity.name,
gameEntity.categoryChinese
) { isSubscribe: Boolean ->
download(context, gameEntity, apk, isSubscribe, entrance, location, traceEvent)
}
@ -281,7 +307,7 @@ object GameActivityDownloadHelper {
DownloadDialog.showDownloadDialog(context, gameEntity, traceEvent, entrance, location)
} else {
CertificationDialog.showCertificationDialog(context, gameEntity) {
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name) { isSubscribe: Boolean ->
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name, gameEntity.categoryChinese) { isSubscribe: Boolean ->
plugin(context, gameEntity, apk, entrance, location, isSubscribe, traceEvent)
}
}
@ -295,6 +321,18 @@ object GameActivityDownloadHelper {
apk: ApkEntity,
downloadEntity: DownloadEntity?
) {
com.gh.gamecenter.common.utils.NewFlatLogUtils.logGameInstall(
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
trigger = "主动安装"
)
SensorsBridge.trackInstallGameClick(
gameName = downloadEntity?.name ?: "",
gameId = downloadEntity?.gameId ?: "",
action = "主动安装"
)
val simulatorDownloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.url)
if (gameEntity.simulator != null) {
val isInstalled =
@ -310,7 +348,7 @@ object GameActivityDownloadHelper {
if (simulatorDownloadEntity != null && SimulatorGameManager.isSimulatorGame(gameEntity) && !isInstalled && !isInstalledNewSimulator) {
SimulatorDownloadManager.getInstance().showDownloadDialog(
context, simulator,
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name!!, null
SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name!!, gameEntity.categoryChinese, null
)
return
}
@ -337,7 +375,7 @@ object GameActivityDownloadHelper {
//启动模拟器游戏
if (SimulatorGameManager.isSimulatorGame(gameEntity)) {
if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(context)) {
NewSimulatorGameManager.showUpdateNewsSimulator(context, null)
NewSimulatorGameManager.showUpdateNewsSimulator(context, gameEntity, null)
return
}
val simulatorDownloadEntity =
@ -374,7 +412,7 @@ object GameActivityDownloadHelper {
location: String,
traceEvent: ExposureEvent
) {
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name) { isSubscribe: Boolean ->
DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name, gameEntity.categoryChinese) { isSubscribe: Boolean ->
update(context, gameEntity, apk, entrance, location, isSubscribe, traceEvent)
}
}
@ -489,7 +527,16 @@ object GameActivityDownloadHelper {
gameEntity.getEntryMap().remove(apkEntity.getPlatform())
}
PackageUtils.isCanPluggable(apkEntity) -> {
DialogHelper.showPluginDialog(context, gameEntity.pluginDesc) { PackageInstaller.uninstall(context, path) }
DialogHelper.showPluginDialog(
context,
pluginDesc = gameEntity.pluginDesc,
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese,
platform = gameEntity.platform ?: ""
) {
PackageInstaller.uninstall(context, path)
}
}
else -> {
PackageInstaller.install(context, downloadEntity)

View File

@ -24,7 +24,7 @@ import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.entity.PackageDialogEntity;
import com.gh.gamecenter.feature.entity.Questions;
import com.gh.gamecenter.feature.exposure.ExposureEvent;
import com.gh.gamecenter.feature.exposure.ExposureSource;
import com.gh.gamecenter.common.exposure.ExposureSource;
import com.gh.gamecenter.login.user.UserManager;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Utils;

View File

@ -1623,12 +1623,13 @@ object NewFlatLogUtils {
}
//新游开测详情页点击游戏类型
fun logGameTestDetailGameCategoryClick(tabName: String, gameCategory: String, gameTestStartType: String) {
fun logGameTestDetailGameCategoryClick(tabName: String, gameCategory: String, gameTestStartType: String, isOn: Boolean) {
val json = json {
"event" to "game_test_detail_game_category_click"
"tab_name" to tabName
KEY_GAME_CATEGORY to gameCategory
"game_test_start_type" to gameTestStartType
"is_on" to isOn
parseAndPutMeta().invoke(this)
}
log(json, "event", false)
@ -2400,6 +2401,34 @@ object NewFlatLogUtils {
log(json)
}
// QA视频事件
@JvmStatic
fun logQAVideo(
event: String,
contentId: String,
contentTitle: String,
type: String,
sequence: Int,
videoId: String,
playAction: String,
playProcess: Float,
playTime: Int
) {
val json = json {
KEY_EVENT to event
"content_id" to contentId
"content_title" to contentTitle
"type" to type
"sequence" to sequence
"video_id" to videoId
"play_action" to playAction
"play_process" to playProcess
"play_time" to playTime
parseAndPutMeta().invoke(this)
}
log(json)
}
@JvmStatic
fun logQGameClick(qqGameId: String, qqGameName: String?) {
val json = json {

View File

@ -1646,7 +1646,7 @@ object NewLogUtils {
}
//进入创建游戏单
fun logEnterGameCollectionEdit(entrance: String) {
fun logEnterGameCollectionCreate(entrance: String) {
val json = json {
KEY_EVENT to "enter_game_collect_create_location"
KEY_ENTRANCE to entrance

View File

@ -16,6 +16,7 @@ import com.gh.download.server.BrowserInstallHelper
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.categoryChinese
import com.gh.gamecenter.common.utils.getExtension
import com.gh.gamecenter.common.utils.getMetaExtra
import com.gh.gamecenter.core.utils.CurrentActivityHolder
@ -120,12 +121,24 @@ object PackageInstaller {
}
} else {
if (isPluggin) {
DialogHelper.showPluginDialog(context, downloadEntity?.pluginDesc) {
DialogHelper.showPluginDialog(
context,
pluginDesc = downloadEntity?.pluginDesc,
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
gameType = downloadEntity?.categoryChinese ?: "",
platform = downloadEntity?.platform ?: ""
) {
uninstall(context, pkgPath)
}
} else {
// 非插件化的同包名不同签名冲突
DialogHelper.showSignatureConflictDialog(context) {
DialogHelper.showSignatureConflictDialog(
context,
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
gameType = downloadEntity?.categoryChinese ?: ""
) {
uninstall(context, pkgPath)
}
}
@ -317,11 +330,13 @@ object PackageInstaller {
showCloseIcon = true,
showAlternativeCancelStyle = !isTheFirstTimeToShowVpnHintDialog
),
uiModificationCallback = { binding, dialog ->
uiModificationCallback = { binding ->
binding.cancelTv.visibility = View.GONE
binding.closeContainer.setOnClickListener {
binding.markDismissByTouchInside()
install(currentActivity, pkgPath)
dialog.dismiss()
binding.dismiss()
downloadEntity?.let {
NewFlatLogUtils.logVpnHintDialogClick(it.gameId, it.name, "关闭按钮")

View File

@ -83,8 +83,8 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
private fun addTags() {
removeAllViews()
mTags.forEach {
addView(createView(it))
mTags.forEachIndexed { index, tag ->
addView(createView(tag, index))
}
if (mTotalCount != mTags.size) {
val imageView = ImageView(context).apply {
@ -102,7 +102,7 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
}
}
private fun createView(tag: TagStyleEntity): View {
private fun createView(tag: TagStyleEntity, position: Int): View {
return TextView(context).apply {
text = tag.name
includeFontPadding = false
@ -117,7 +117,7 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
setTextColor(if (tag.isTop) "#${tag.color}".hexStringToIntColor() else R.color.text_title.toColor(context))
background = if (tag.isTop) createTopBackgroundDrawable(tag) else createNormalBackgroundDrawable()
setOnClickListener {
onClickListener?.onItemClickListener(tag)
onClickListener?.onItemClickListener(tag, position)
}
}
}
@ -140,6 +140,6 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
interface OnItemClickListener {
fun onMoreClickListener()
fun onItemClickListener(tag: TagStyleEntity)
fun onItemClickListener(tag: TagStyleEntity, position: Int)
}
}

View File

@ -11,9 +11,12 @@ import android.util.AttributeSet;
import android.view.Gravity;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.Nullable;
import com.gh.common.util.PackageUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.common.constant.Config;
@ -40,8 +43,10 @@ import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* Copyright (C) 2017 Wasabeef
@ -60,6 +65,12 @@ import java.util.Locale;
*/
public class RichEditor extends WebView {
/**
* 默认的编辑器换行符
*/
public final static String DEFAULT_PARAGRAPH_SEPARATOR = "p";
private boolean mContentOwner;
private boolean mInputEnabled;
@ -68,6 +79,8 @@ public class RichEditor extends WebView {
private EmptyCallback mInitialLayoutCallback;
private Map<String, DynamicJsInterface> mDynamicJsInterfaces = new HashMap<>();
private String mCurrentContent = "";
public enum Type {
@ -87,7 +100,7 @@ public class RichEditor extends WebView {
UNORDEREDLIST,
JUSTIFYCENTER,
JUSTIFYFULL,
JUSTUFYLEFT,
JUSTIFYLEFT,
JUSTIFYRIGHT
}
@ -116,6 +129,7 @@ public class RichEditor extends WebView {
private OnDecorationStateListener mDecorationStateListener;
private AfterInitialLoadListener mLoadListener;
private WebChromeClientListener mChromeClientListener;
private WebResourceRequestInterceptor mWebResourceRequestInterceptor;
private PageFinishedListener mPageFinishedListener;
public RichEditor(Context context) {
@ -173,6 +187,10 @@ public class RichEditor extends WebView {
mChromeClientListener = chromeClientListener;
}
public void setWebResourceRequestInterceptor(WebResourceRequestInterceptor interceptor) {
mWebResourceRequestInterceptor = interceptor;
}
public void setPageFinishedListener(PageFinishedListener pageFinishedListener) {
mPageFinishedListener = pageFinishedListener;
}
@ -396,6 +414,14 @@ public class RichEditor extends WebView {
exec("javascript:RE.insertImage('" + url + "');");
}
/**
* 插入分割线
*/
public void insertDivider() {
exec("javascript:RE.prepareInsert();");
exec("javascript:RE.insertHorizontalRule();");
}
public void insertHtml(String html) {
exec("javascript:RE.prepareInsert();");
exec("javascript:RE.insertHTML('" + html + "');");
@ -447,6 +473,14 @@ public class RichEditor extends WebView {
exec("javascript:RE.setBaseTextColor('" + hex + "');");
}
/**
* 设置编辑器默认换行符
* @param separator 换行符
*/
public void setDefaultParagraphSeparator(String separator) {
exec("javascript:RE.setDefaultParagraphSeparator('" + separator + "')");
}
public void insertPlaceholderImage(String id) {
exec("javascript:RE.prepareInsert();");
exec("javascript:RE.insertPlaceholderImage('" + id + "');");
@ -575,6 +609,14 @@ public class RichEditor extends WebView {
exec("javascript:RE.formatBlock();");
}
public void registerDynamicJsInterface(String method, DynamicJsInterface jsInterface) {
mDynamicJsInterfaces.put(method, jsInterface);
}
public void unregisterDynamicJsInterface(String method) {
mDynamicJsInterfaces.remove(method);
}
/**
* 调用 JS 方法,告诉网页端该 url 对应视频播放的进度
*/
@ -625,6 +667,9 @@ public class RichEditor extends WebView {
@Override
public void onPageFinished(WebView view, String url) {
isReady = url.equalsIgnoreCase(SETUP_HTML);
if (isReady) {
setDefaultParagraphSeparator(DEFAULT_PARAGRAPH_SEPARATOR);
}
if (mLoadListener != null) {
mLoadListener.onAfterInitialLoad(isReady);
}
@ -658,6 +703,16 @@ public class RichEditor extends WebView {
return super.shouldOverrideUrlLoading(view, url);
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (mWebResourceRequestInterceptor != null) {
return mWebResourceRequestInterceptor.shouldInterceptRequest(view, url);
}
return super.shouldInterceptRequest(view, url);
}
}
public void setContentOwner(boolean contentOwner) {
@ -674,6 +729,10 @@ public class RichEditor extends WebView {
boolean shouldOverrideUrlLoading(WebView view, String url);
}
public interface WebResourceRequestInterceptor {
WebResourceResponse shouldInterceptRequest(WebView view, String url);
}
public interface PageFinishedListener {
void onPageFinished();
}
@ -815,6 +874,14 @@ public class RichEditor extends WebView {
public void logMtaEvent(String event) {
// do nothing, mta is deprecated
}
@JavascriptInterface
public void invokeMethod(String method, String data) {
DynamicJsInterface jsInterface = mDynamicJsInterfaces.get(method);
if (jsInterface != null) {
jsInterface.invoke(data);
}
}
}
@Override
@ -827,4 +894,8 @@ public class RichEditor extends WebView {
mInitialLayoutCallback = null;
}
}
public interface DynamicJsInterface {
void invoke(String data);
}
}

View File

@ -14,9 +14,7 @@ import com.gh.gamecenter.common.activityresult.ActResultRequest
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.entity.SimpleGameEntity
import com.gh.gamecenter.common.entity.SuggestType
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.PermissionHelper
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.help.HelpAndFeedbackBridge
import com.lightgame.download.DownloadEntity
@ -31,11 +29,18 @@ object XapkDialogHelper {
val trigger = if (isManualAction) "手动触发" else "自动触发"
NewFlatLogUtils.logXApkUnzipFailedDialogShowed(trigger, downloadEntity.gameId, downloadEntity.name)
SensorsBridge.trackGameDecompressionFailedDialogShow(
downloadEntity.gameId,
downloadEntity.name,
downloadEntity.categoryChinese
)
val previousShowedDialog = mUnzipFailureDialogRef?.get()
if (previousShowedDialog != null
&& previousShowedDialog.isShowing
&& context == previousShowedDialog.ownerActivity) {
&& context == previousShowedDialog.ownerActivity
) {
// 上一个解压失败弹窗还在显示,当前 activity 不用再显示新的弹窗了
return
}
@ -57,6 +62,13 @@ object XapkDialogHelper {
downloadEntity.name
)
SensorsBridge.trackGameDecompressionFailedDialogClick(
buttonName = "开启权限",
downloadEntity.gameId,
downloadEntity.name,
downloadEntity.categoryChinese
)
// 记录应用重启前需要重解压的信息
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, context.javaClass.name)
SPUtils.setString(Constants.SP_XAPK_URL, downloadEntity.url)
@ -88,10 +100,10 @@ object XapkDialogHelper {
}
},
cancelClickCallback = {
val hint = "" + downloadEntity.name + "游戏安装包解压失败,问题反馈:"
val hint = "游戏安装包解压失败,问题反馈:"
HelpAndFeedbackBridge.startSuggestionActivity(
context,
SuggestType.normal,
SuggestType.GAME,
null,
hint,
SimpleGameEntity(downloadEntity.gameId, downloadEntity.name, downloadEntity.icon)
@ -102,23 +114,47 @@ object XapkDialogHelper {
downloadEntity.gameId,
downloadEntity.name
)
SensorsBridge.trackGameDecompressionFailedDialogClick(
buttonName = "提交反馈",
downloadEntity.gameId,
downloadEntity.name,
downloadEntity.categoryChinese
)
},
uiModificationCallback = { binding, dialog ->
uiModificationCallback = { binding ->
binding.headIv.setBackgroundResource(R.drawable.dialog_unzip_failure_head_background)
binding.titleTv.visibility = View.GONE
// VectorDrawable 的动态颜色设置只在支持 Vector 的系统版本上生效,为了能方便复用资源不支持的就用默认颜色,又不是不能用!
binding.closeIv.setColorFilter(Color.WHITE)
binding.contentTv.setLineSpacing(5.0F.dip2px().toFloat(), 1.0F)
binding.closeContainer.setOnClickListener {
binding.markDismissByTouchInside()
NewFlatLogUtils.logXApkUnzipFailedDialogClick(
"关闭",
false,
downloadEntity.gameId,
downloadEntity.name
)
dialog.dismiss()
SensorsBridge.trackGameDecompressionFailedDialogClick(
buttonName = "关闭",
downloadEntity.gameId,
downloadEntity.name,
downloadEntity.categoryChinese
)
binding.dismiss()
}
},
touchOutsideCallback = {
SensorsBridge.trackGameDecompressionFailedDialogClick(
buttonName = "关闭弹窗",
downloadEntity.gameId,
downloadEntity.name,
downloadEntity.categoryChinese
)
},
extraConfig = DialogHelper.Config(showCloseIcon = true)
)

View File

@ -79,6 +79,7 @@ object XapkInstaller : XApkUnZipCallback, XApkUnZipOutputFactory {
if (MiuiUtils.isMiui() && !MiuiUtils.isMiuiOptimizationDisabled() && downloadEntity.format == Constants.XAPK_APKS_FORMAT) {// 小米手机开启miui以后需要引导用户关闭miui优化
DialogHelper.showMiuiOptimizationWarning(
context,
downloadEntity,
onHintClick = {
val guides = Config.getNewApiSettingsEntity()?.install
val miuiOptimizationGuide = guides?.guides?.findLast {
@ -99,6 +100,7 @@ object XapkInstaller : XApkUnZipCallback, XApkUnZipOutputFactory {
Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
it.markDismissByTouchInside()
it.dismiss()
} else {
ToastUtils.showToast(context.getString(R.string.miui_open_adb_hint))
@ -135,7 +137,7 @@ object XapkInstaller : XApkUnZipCallback, XApkUnZipOutputFactory {
override fun onProgress(apk: XApkFile, progress: Float) {
val downloadEntity = mDownloadEntityMap[apk.file.path] ?: return
downloadEntity.meta[XAPK_UNZIP_PERCENT] = String.format("%.2f", progress * 100)
downloadEntity.meta[XAPK_UNZIP_PERCENT] = String.format(Locale.CHINA, "%.2f", progress * 100)
downloadEntity.meta[XAPK_UNZIP_STATUS] = XapkUnzipStatus.UNZIPPING.name
AppExecutor.ioExecutor.execute {
@ -184,6 +186,12 @@ object XapkInstaller : XApkUnZipCallback, XApkUnZipOutputFactory {
}
DownloadDataHelper.uploadDownloadStatusEvent(downloadEntity, "xapk解压失败")
SensorsBridge.trackGameDecompressionFailed(
downloadEntity.gameId,
downloadEntity.name,
downloadEntity.categoryChinese
)
}
debugOnly {

View File

@ -346,24 +346,6 @@ public class DownloadManager implements DownloadStatusListener {
ExtensionsKt.addMetaExtra(downloadEntity, DownloadConfig.KEY_PROGRESS_CALLBACK_INTERVAL, "200");
ExtensionsKt.addMetaExtra(downloadEntity, VHelper.KEY_REQUIRED_G_APPS, gameEntity.getGAppsSwitch());
ExtensionsKt.addMetaExtra(downloadEntity, VHelper.KEY_BIT, apkEntity.getBit());
SensorsBridge.trackEvent("HaloFunGameDownloadClick",
"game_name", gameEntity.getName(),
"game_id", gameEntity.getId(),
"game_schema_type", gameEntity.getGameBitChinese());
} else {
SensorsBridge.trackEvent("DownloadProcessBegin",
"game_id", gameEntity.getId(),
"game_name", gameEntity.getName(),
"game_type", gameEntity.getCategoryChinese(),
"game_schema_type", gameEntity.getGameBitChinese(),
"page_name", GlobalActivityManager.getCurrentPageEntity().getPageName(),
"page_id", GlobalActivityManager.getCurrentPageEntity().getPageId(),
"page_business_id", GlobalActivityManager.getCurrentPageEntity().getPageBusinessId(),
"last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(),
"last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(),
"last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId()
);
}
HashMap<String, String> map = PageSwitchDataHelper.popLastPageData();
@ -407,6 +389,28 @@ public class DownloadManager implements DownloadStatusListener {
AppDebugConfig.logMethodWithParams(DownloadManager.class, apkEntity.getUrl(), downloadEntity.getUrl(), method, entrance, location);
}
if (gameEntity.isVGame()) {
SensorsBridge.trackEventWithExposureSource("HaloFunGameDownloadClick",
downloadExposureEvent.getSource(),
"game_name", gameEntity.getName(),
"game_id", gameEntity.getId(),
"game_schema_type", gameEntity.getGameBitChinese());
}
SensorsBridge.trackEventWithExposureSource("DownloadProcessBegin",
downloadExposureEvent.getSource(),
"game_id", gameEntity.getId(),
"game_name", gameEntity.getName(),
"game_type", gameEntity.getCategoryChinese(),
"game_schema_type", gameEntity.getGameBitChinese(),
"page_name", GlobalActivityManager.getCurrentPageEntity().getPageName(),
"page_id", GlobalActivityManager.getCurrentPageEntity().getPageId(),
"page_business_id", GlobalActivityManager.getCurrentPageEntity().getPageBusinessId(),
"last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(),
"last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(),
"last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId()
);
//TODO remove
DownloadManager.getInstance().putStatus(downloadEntity.getUrl(), DownloadStatus.downloading);
@ -920,7 +924,7 @@ public class DownloadManager implements DownloadStatusListener {
for (DownloadEntity downloadEntity : getAllDownloadEntity()) {
if (!urlSet.contains(downloadEntity.getUrl())
&& (downloadEntity.getStatus().equals(DownloadStatus.downloading)
|| downloadEntity.getStatus().equals(DownloadStatus.waiting))) {
|| downloadEntity.getStatus().equals(DownloadStatus.waiting))) {
downloadEntity.setStatus(DownloadStatus.subscribe);
mDownloadDao.newOrUpdate(downloadEntity);
NDataChanger.INSTANCE.notifyDataChanged(downloadEntity);

View File

@ -12,6 +12,8 @@ import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.loghub.LoghubUtils
import com.gh.gamecenter.common.retrofit.EmptyResponse
import com.gh.gamecenter.common.retrofit.Response
import com.gh.gamecenter.common.utils.NewFlatLogUtils
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.isVGame
import com.gh.gamecenter.core.runOnIoThread
import com.gh.gamecenter.core.utils.SPUtils
@ -147,11 +149,22 @@ object PackageObserver {
if (EBPackage.TYPE_UNINSTALLED == busFour.type) {
mPackageViewModel.addUninstalledGame(packageName)
mDownloadEntity?.let {
if (it.isVGame()) return@let
if (it.isPluggable
|| (it.isUpdate && !PackageUtils.isInstalled(application, it.packageName))) {
NewFlatLogUtils.logGameInstall(
gameId = mDownloadEntity.gameId,
gameName = mDownloadEntity.name,
trigger = "自动安装"
)
SensorsBridge.trackInstallGameClick(
gameId = mDownloadEntity.gameId,
gameName = mDownloadEntity.name,
action = "自动安装"
)
PackageInstaller.install(application, mDownloadEntity)
}
}

View File

@ -2,6 +2,7 @@ package com.gh.download.dialog
import android.annotation.SuppressLint
import android.content.Context
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@ -14,7 +15,6 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.*
import androidx.recyclerview.widget.RecyclerView.SmoothScroller
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.common.util.*
import com.gh.download.DownloadManager
import com.gh.gamecenter.BuildConfig
@ -28,9 +28,11 @@ import com.gh.gamecenter.common.utils.throwExceptionInDebug
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.core.utils.TimeElapsedHelper
import com.gh.gamecenter.databinding.DialogDownloadBinding
import com.gh.gamecenter.entity.GamePlatform
import com.gh.gamecenter.feature.entity.ApkEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.eventbus.EBPackage
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.halo.assistant.HaloApp
import com.lightgame.download.DataWatcher
import com.lightgame.download.DownloadEntity
@ -50,8 +52,7 @@ class DownloadDialog : BaseDraggableDialogFragment() {
private var mAdapter: DownloadDialogAdapter? = null
private var mTraceEvent: ExposureEvent? = null
private var mPlatformName: String = ""
private var mPackageName: String = ""
private var mPlatformList: List<GamePlatform>? = null
private var mParentBundle: Bundle? = null
// 合集页面保持和后台一样的顺序
@ -97,8 +98,11 @@ class DownloadDialog : BaseDraggableDialogFragment() {
super.onCreate(savedInstanceState)
mParentBundle = requireActivity().intent.extras?.getBundle(ToolBarActivity.NORMAL_FRAGMENT_BUNDLE)
mPlatformName = mParentBundle?.getString(EntranceConsts.KEY_PLATFORM, "") ?: ""
mPackageName = mParentBundle?.getString(EntranceConsts.KEY_PACKAGENAME, "") ?: ""
mPlatformList = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
mParentBundle?.getParcelableArrayList(EntranceConsts.KEY_PLATFORMS, GamePlatform::class.java)
} else {
mParentBundle?.getParcelableArrayList(EntranceConsts.KEY_PLATFORMS)
}
mGameEntity = requireArguments().getParcelable(GameEntity::class.java.simpleName)!!
mEntrance = requireArguments().getString(EntranceConsts.KEY_ENTRANCE) ?: ""
mLocation = requireArguments().getString(EntranceConsts.KEY_LOCATION) ?: ""
@ -172,28 +176,37 @@ class DownloadDialog : BaseDraggableDialogFragment() {
//自动下载
private fun performAutoDownload(itemList: List<DownloadDialogItemData>, recyclerView: RecyclerView) {
if (mPlatformName.isEmpty() && mPackageName.isEmpty()) return
val platformList = this.mPlatformList
if (platformList.isNullOrEmpty()) return
AppExecutor.uiExecutor.executeWithDelay({
recyclerView.adapter?.let {
for (i in 0 until it.itemCount) {
val apkEntity = itemList[i].normal ?: continue
val apkCollection = apkEntity.apkCollection
if (apkCollection != null) {
if (apkCollection.name == mPlatformName) {
val platformName = platformList[0].name
val packageName = platformList[0].packageName
if (apkCollection != null) {// 插件集合首先切换到集合列表,再自动下载插件
if (apkCollection.name == platformName) {// 第一个需要自动下载的插件名称与插件集合名称相同
scrollAndDownload(recyclerView, false, i)
break
} else {
apkCollection.saveApkEntity?.forEach { entity ->
if (entity.getPlatformName() == mPlatformName || entity.packageName == mPackageName) {
scrollAndDownload(recyclerView, false, i)
}
// 插件集合列表中存在需要自动下载的插件
val matched = apkCollection.saveApkEntity?.any { entity ->
entity.getPlatformName() == platformName || entity.packageName == packageName
}
if (matched == true) {
scrollAndDownload(recyclerView, false, i)
break
}
break
}
}
if (apkEntity.getPlatformName() == mPlatformName || apkEntity.packageName == mPackageName) {
// 自动下载符合条件的插件
val matchPlatformIndex = platformList.indexOfFirst { platform ->
platform.name == apkEntity.getPlatformName() || platform.packageName == apkEntity.packageName
}
if (matchPlatformIndex != -1) {
scrollAndDownload(recyclerView, true, i)
break
}
}
}

View File

@ -5,14 +5,14 @@ import android.graphics.drawable.GradientDrawable
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.gh.gamecenter.common.callback.OnViewClickListener
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.common.util.*
import com.gh.common.util.DirectUtils
import com.gh.gamecenter.NewsDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.callback.OnViewClickListener
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.databinding.*
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.lightgame.adapter.BaseRecyclerAdapter
class DownloadDialogAdapter(
@ -100,7 +100,7 @@ class DownloadDialogAdapter(
DirectUtils.directToQa(mContext, data.linkText, data.linkId)
}
"qa_collection" -> {
DirectUtils.directToQaCollection(mContext, data.linkText, data.linkId)
DirectUtils.directToHelpAndFeedback(mContext, isPlugin = true)
}
else -> {
//Utils.toast(mContext, "暂不支持类型:" + data.linkType)

View File

@ -11,7 +11,6 @@ import com.gh.common.dialog.CertificationDialog
import com.gh.common.dialog.DeviceRemindDialog
import com.gh.common.dialog.PackageCheckDialogFragment
import com.gh.common.util.*
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.common.util.DirectUtils.directToLinkPage
import com.gh.download.DownloadManager
import com.gh.download.server.BrowserInstallHelper
@ -19,14 +18,14 @@ import com.gh.gamecenter.DownloadManagerActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
import com.gh.gamecenter.common.base.activity.BaseActivity
import com.gh.gamecenter.common.callback.ConfirmListener
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.utils.EmptyCallback
import com.gh.gamecenter.common.utils.NewFlatLogUtils
import com.gh.gamecenter.core.utils.SpeedUtils
import com.gh.gamecenter.databinding.DownloadDialogItemBinding
import com.gh.gamecenter.feature.entity.ApkEntity
import com.gh.gamecenter.feature.entity.GameCollectionEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.manager.PackagesManager
import com.lightgame.download.DownloadEntity
import com.lightgame.download.DownloadStatus
@ -279,10 +278,28 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas
DownloadManager.getInstance().cancel(apkEntity.url)
} else {
if (PackageUtils.isCanPluggable(apkEntity)) {
DialogHelper.showPluginDialog(it.context, gameEntity.pluginDesc) {
DialogHelper.showPluginDialog(
it.context,
pluginDesc = gameEntity.pluginDesc,
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese,
platform = gameEntity.platform ?: ""
) {
PackageInstaller.uninstall(it.context, downloadEntity.path)
}
} else {
NewFlatLogUtils.logGameInstall(
gameId = downloadEntity.gameId ,
gameName = downloadEntity.name,
trigger = "主动安装"
)
SensorsBridge.trackInstallGameClick(
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
action = "主动安装"
)
PackageInstaller.install(it.context, downloadEntity)
}
}
@ -349,6 +366,7 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas
if (msg.isNullOrEmpty()) {
BrowserInstallHelper.showBrowserInstallHintDialog(
context,
gameEntity,
gameEntity.isVGame() || gameEntity.isSplitXApk()
) {
DownloadDialogHelper.findAvailableDialogAndShow(
@ -368,7 +386,8 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas
context,
apkEntity.size,
gameEntity.id,
gameEntity.name
gameEntity.name,
gameEntity.categoryChinese
) { isSubscribe ->
DownloadManager.createDownload(
context,

View File

@ -4,7 +4,6 @@ import android.content.Context
import android.os.Build
import android.util.Base64
import com.gh.common.constant.Config
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.common.util.DirectUtils
import com.gh.common.util.LogUtils
import com.gh.common.util.PackageUtils
@ -13,11 +12,14 @@ import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.entity.ExposureEntity
import com.gh.gamecenter.common.loghub.LoghubUtils
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.tryCatchInRelease
import com.gh.gamecenter.core.utils.EmptyCallback
import com.gh.gamecenter.core.utils.GsonUtils
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.entity.NewSettingsEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.google.gson.JsonObject
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
@ -135,6 +137,7 @@ object BrowserInstallHelper {
@JvmStatic
fun showBrowserInstallHintDialog(
context: Context,
gameEntity: GameEntity,
skipBrowserInstallDialog: Boolean = false,
callback: EmptyCallback
) {
@ -153,6 +156,12 @@ object BrowserInstallHelper {
"当前安装方式为助手安装,下载安装游戏需要验证账户密码或指纹。如需免密码安装,可选择切换安装方式为“浏览器安装”"
}
SensorsBridge.trackSwitchInstallDialogShow(
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
DialogHelper.showDialog(
context,
title = "温馨提示",
@ -163,10 +172,30 @@ object BrowserInstallHelper {
val intent = ShellActivity.getIntent(context, ShellActivity.Type.SWITCH_INSTALL_METHOD, null)
context.startActivity(intent)
logOrdinaryBrowserEvent(Type.SWITCH_INSTALL_DIALOG_ACCESS)
SensorsBridge.trackSwitchInstallDialogClick(
buttonName = "切换安装方式",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
cancelClickCallback = {
callback.onCallback()
logOrdinaryBrowserEvent(Type.SWITCH_INSTALL_DIALOG_QUIT)
SensorsBridge.trackSwitchInstallDialogClick(
buttonName = "继续下载",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
touchOutsideCallback = {
SensorsBridge.trackSwitchInstallDialogClick(
buttonName = "关闭弹窗",
gameId = gameEntity.id,
gameName = gameEntity.name ?: "",
gameType = gameEntity.categoryChinese
)
},
extraConfig = DialogHelper.Config(hint = "修改路径:我的光环-设置-切换安装方式")
)
@ -185,22 +214,8 @@ object BrowserInstallHelper {
if (settingsEntity.installModel?.status == "matched") {
return true
}
settingsEntity.installModel?.whiteList?.let {
for (packageName in it) {
if (mAllInstalledPackageList.contains(packageName)) {
return false
}
}
}
settingsEntity.installModel?.packages?.let {
for (packageName in it) {
if (mAllInstalledPackageList.contains(packageName)) {
return true
}
}
}
return false
return isConditionMatched(settingsEntity)
}
}
@ -211,26 +226,43 @@ object BrowserInstallHelper {
fun isUseBrowserToInstallEnabledWithPackageMatched(): Boolean {
val settingsEntity = Config.getNewSettingsEntity()
if (settingsEntity == null) {
return false
return if (settingsEntity == null) {
false
} else {
settingsEntity.installModel?.whiteList?.let {
for (packageName in it) {
if (mAllInstalledPackageList.contains(packageName)) {
return false
}
isConditionMatched(settingsEntity)
}
}
/**
* 是否满足开启浏览器安装的条件
*/
private fun isConditionMatched(settingsEntity: NewSettingsEntity): Boolean {
settingsEntity.installModel?.whiteList?.let {
for (packageName in it) {
if (mAllInstalledPackageList.contains(packageName)) {
return false
}
}
settingsEntity.installModel?.packages?.let {
for (packageName in it) {
if (mAllInstalledPackageList.contains(packageName)) {
}
settingsEntity.installModel?.packages?.let {
for (packageName in it) {
if (mAllInstalledPackageList.contains(packageName)) {
return true
}
}
}
// 匹配部分字符串即可
settingsEntity.installModel?.regexPackages?.let {
for (packageNamePieces in it) {
for (installedPackageName in mAllInstalledPackageList) {
if (installedPackageName.contains(packageNamePieces)) {
return true
}
}
}
return false
}
return false
}
fun onApkInstalled(path: String?) {

View File

@ -5,9 +5,9 @@ import android.content.Intent
import android.os.Bundle
import com.gh.base.DownloadToolbarActivity
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.updateStatusBarColor
import com.gh.gamecenter.entity.SubjectRecommendEntity
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.game.GameFragment
class BlockActivity : DownloadToolbarActivity() {

View File

@ -12,6 +12,7 @@ import com.gh.gamecenter.common.base.activity.ToolBarActivity;
import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout;
import com.gh.gamecenter.common.constant.EntranceConsts;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.SensorsBridge;
import com.gh.gamecenter.download.DownloadFragment;
import com.gh.vspace.VHelper;

View File

@ -10,7 +10,9 @@ import com.gh.common.exposure.ExposureManager.log
import com.gh.common.exposure.ExposureTraceUtils.appendTrace
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.utils.toArrayList
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.entity.GamePlatform
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureEvent.Companion.createEvent
@ -195,6 +197,7 @@ class GameDetailActivity : DownloadToolbarActivity() {
openPlatformWindow,
null,
null,
null,
traceEvent
)
}
@ -222,6 +225,7 @@ class GameDetailActivity : DownloadToolbarActivity() {
openPlatformWindow: Boolean = false,
platformName: String? = null,
packageName: String? = null,
platforms: List<GamePlatform>? = null,
traceEvent: ExposureEvent? = null
) {
val bundle = Bundle()
@ -261,11 +265,13 @@ class GameDetailActivity : DownloadToolbarActivity() {
}
if (openPlatformWindow) {
bundle.putBoolean(EntranceConsts.KEY_OPEN_PLATFORM_WINDOW, true)
if (!platformName.isNullOrEmpty()) {
bundle.putString(EntranceConsts.KEY_PLATFORM, platformName)
}
if (!packageName.isNullOrEmpty()) {
bundle.putString(EntranceConsts.KEY_PACKAGENAME, packageName)
if (!platforms.isNullOrEmpty()) {
bundle.putParcelableArrayList(EntranceConsts.KEY_PLATFORMS, platforms.toArrayList())
} else if (!platformName.isNullOrEmpty() || !packageName.isNullOrEmpty()) {
bundle.putParcelableArrayList(
EntranceConsts.KEY_PLATFORMS,
arrayListOf(GamePlatform(platformName, packageName))
)
}
}
if (scrollToLibao) {

View File

@ -385,8 +385,9 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener {
private fun loadImageInfo(position: Int, width: Int) {
val url = mUrlList!![position]
val imageInfoConfig = Config.getSettings()?.image?.oss?.info ?: "?x-oss-process=image/info"
RetrofitManager.getInstance()
.api.getImageInfo("$url?x-oss-process=image/info")
.api.getImageInfo("$url$imageInfoConfig")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ImageInfoEntity?>() {

View File

@ -38,15 +38,13 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.ad.AdDelegateHelper;
import com.gh.common.constant.Config;
import com.gh.common.exposure.ExposureManager;
import com.gh.common.filter.RegionSettingHelper;
import com.gh.common.history.HistoryDatabase;
import com.gh.common.history.HistoryHelper;
@ -63,7 +61,6 @@ import com.gh.common.util.ErrorHelper;
import com.gh.common.util.HomePluggableHelper;
import com.gh.common.util.LogUtils;
import com.gh.common.util.LunchType;
import com.gh.common.util.NewFlatLogUtils;
import com.gh.common.util.PackageInstaller;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.WechatBindHelper;
@ -76,8 +73,6 @@ import com.gh.gamecenter.common.base.fragment.ToolbarFragment;
import com.gh.gamecenter.common.constant.CommonConsts;
import com.gh.gamecenter.common.constant.Constants;
import com.gh.gamecenter.common.constant.EntranceConsts;
import com.gh.gamecenter.common.entity.LinkEntity;
import com.gh.gamecenter.common.entity.NotificationUgc;
import com.gh.gamecenter.common.entity.SuggestType;
import com.gh.gamecenter.common.eventbus.EBNetworkState;
import com.gh.gamecenter.common.eventbus.EBReuse;
@ -86,8 +81,8 @@ import com.gh.gamecenter.common.retrofit.BiResponse;
import com.gh.gamecenter.common.retrofit.Response;
import com.gh.gamecenter.common.utils.DialogHelper;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.ImageUtils;
import com.gh.gamecenter.common.utils.NotificationHelper;
import com.gh.gamecenter.common.utils.NewFlatLogUtils;
import com.gh.gamecenter.common.utils.SensorsBridge;
import com.gh.gamecenter.common.utils.ShareUtils;
import com.gh.gamecenter.core.AppExecutor;
import com.gh.gamecenter.core.utils.ClassUtils;
@ -96,22 +91,18 @@ import com.gh.gamecenter.core.utils.GsonUtils;
import com.gh.gamecenter.core.utils.MtaHelper;
import com.gh.gamecenter.core.utils.SPUtils;
import com.gh.gamecenter.core.utils.SentryHelper;
import com.gh.gamecenter.core.utils.TimeUtils;
import com.gh.gamecenter.core.utils.ToastUtils;
import com.gh.gamecenter.core.utils.UrlFilterUtils;
import com.gh.gamecenter.entity.StartupAdEntity;
import com.gh.gamecenter.eventbus.EBSkip;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.exposure.ExposureEvent;
import com.gh.gamecenter.feature.exposure.ExposureSource;
import com.gh.gamecenter.feature.exposure.ExposureType;
import com.gh.gamecenter.feature.utils.PlatformUtils;
import com.gh.gamecenter.fragment.MainWrapperFragment;
import com.gh.gamecenter.fragment.MainWrapperViewModel;
import com.gh.gamecenter.home.skip.PackageSkipActivity;
import com.gh.gamecenter.login.user.UserManager;
import com.gh.gamecenter.login.utils.QuickLoginHelper;
import com.gh.gamecenter.manager.DataCollectionManager;
import com.gh.gamecenter.manager.UpdateManager;
import com.gh.gamecenter.packagehelper.PackageViewModel;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.gh.gamecenter.room.AppDatabase;
@ -171,6 +162,8 @@ public class MainActivity extends BaseActivity {
private PackageViewModel mPackageViewModel;
private MainWrapperViewModel mMainWrapperViewModel;
private MainWrapperFragment mMainWrapperFragment;
// 黄壮华 按连续按返回键两次才退出应用
@ -187,6 +180,9 @@ public class MainActivity extends BaseActivity {
HaloApp.getInstance().isAlreadyUpAndRunning = true;
mMainWrapperViewModel = new ViewModelProvider(this, new MainWrapperViewModel.Factory(HaloApp.getInstance()))
.get(MainWrapperViewModel.class);
super.onCreate(savedInstanceState);
setStatusBarColor(Color.TRANSPARENT);
@ -245,7 +241,7 @@ public class MainActivity extends BaseActivity {
return null;
},
() -> {
DirectUtils.directToSuggestion(MainActivity.this, SuggestType.crash, "APP闪退", 100);
DirectUtils.directToSuggestion(MainActivity.this, SuggestType.APP, "APP闪退", false, 100);
MtaHelper.onEventWithBasicDeviceInfo(
"闪退弹窗",
"玩家操作", "点击反馈");
@ -255,7 +251,7 @@ public class MainActivity extends BaseActivity {
DialogHelper.showCenterWarningDialog(this, "发生闪退", "光环助手刚刚发生了闪退,马上反馈以帮助我们更好地修复问题?(只需简单描述你刚才的操作)"
, "暂不", "马上反馈",
() -> {
DirectUtils.directToSuggestion(MainActivity.this, SuggestType.crash, "APP闪退", 100);
DirectUtils.directToSuggestion(MainActivity.this, SuggestType.APP, "APP闪退", false, 100);
MtaHelper.onEventWithBasicDeviceInfo(
"闪退弹窗",
"玩家操作", "点击反馈");
@ -339,8 +335,15 @@ public class MainActivity extends BaseActivity {
// 检查是否需要触发 XAPK 安装
AppExecutor.getUiExecutor().executeWithDelay(this::resumeXapkInstallIfNeeded, 150);
mMainWrapperViewModel.requestAllDialogData();
// TODO 去掉一键登录?
QuickLoginHelper.getPhoneInfo();
// TODO 搞清楚为什么这里要获取微信相关配置
WechatBindHelper.getWechatConfig(null);
// TODO 根据用户是否安装微博来确定是否需要初始化微博 SDK
initWBSDK();
CertificationSwitchHelper.getCertificationSwitch();
}
@ -580,17 +583,10 @@ public class MainActivity extends BaseActivity {
ExtensionsKt.removeFromParent(startSdkAdContainer);
AdDelegateHelper.INSTANCE.cancelSplashAd(this);
}
checkDialog();
}
private void checkDialog() {
// 检查通知权限
checkNotificationPermission();
// 检查助手更新
AppExecutor.getIoExecutor().execute(() -> {
UpdateManager updateManager = UpdateManager.getInstance(this);
updateManager.checkUpdate(true, null);
updateManager.setDismissCallback(mMainWrapperFragment::getDialog);
// 通知优先级高的弹窗可以显示了
AppExecutor.getUiExecutor().execute(() -> {
mMainWrapperFragment.showDialog();
});
}
@ -797,13 +793,6 @@ public class MainActivity extends BaseActivity {
});
}
private void checkNotificationPermission() {
// 仅登录后再启动光环时请求一次权限
if (UserManager.getInstance().isLoggedIn()) {
NotificationHelper.showNotificationHintDialog(NotificationUgc.LOGIN, null);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && !mMainWrapperFragment.onHandleBackPressed()) {
@ -838,7 +827,19 @@ public class MainActivity extends BaseActivity {
"直接退出",
"立即安装",
() -> {
handler.postDelayed(() -> PackageInstaller.install(MainActivity.this, finalDownloadEntity), 200);
handler.postDelayed(() -> {
NewFlatLogUtils.INSTANCE.logGameInstall(
finalDownloadEntity.getGameId(),
finalDownloadEntity.getName(),
"主动安装"
);
SensorsBridge.trackInstallGameClick(
finalDownloadEntity.getGameId(),
finalDownloadEntity.getName(),
"主动安装"
);
PackageInstaller.install(MainActivity.this, finalDownloadEntity);
}, 200);
return null;
},
() -> {
@ -974,6 +975,16 @@ public class MainActivity extends BaseActivity {
if (!TextUtils.isEmpty(xapkUrl)) {
DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntityByUrl(xapkUrl);
if (downloadEntity != null) {
NewFlatLogUtils.INSTANCE.logGameInstall(
downloadEntity.getGameId(),
downloadEntity.getName(),
"自动安装"
);
SensorsBridge.trackInstallGameClick(
downloadEntity.getGameId(),
downloadEntity.getName(),
"自动安装"
);
PackageInstaller.install(this, downloadEntity, false);
}
}

View File

@ -29,6 +29,7 @@ import com.alibaba.android.arouter.facade.annotation.Route;
import com.ethanhua.skeleton.Skeleton;
import com.ethanhua.skeleton.ViewSkeletonScreen;
import com.gh.base.DownloadToolbarActivity;
import com.gh.common.exposure.ExposureManager;
import com.gh.common.filter.RegionSettingHelper;
import com.gh.common.history.HistoryHelper;
import com.gh.common.util.CheckLoginUtils;
@ -61,6 +62,9 @@ import com.gh.gamecenter.eventbus.EBPackage;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.entity.MeEntity;
import com.gh.gamecenter.feature.entity.NewsEntity;
import com.gh.gamecenter.feature.exposure.ExposureEvent;
import com.gh.gamecenter.common.exposure.ExposureSource;
import com.gh.gamecenter.feature.exposure.ExposureType;
import com.gh.gamecenter.feature.utils.ApkActiveUtils;
import com.gh.gamecenter.newsdetail.NewsDetailAdapter;
import com.gh.gamecenter.retrofit.RetrofitManager;
@ -72,6 +76,7 @@ import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.HashSet;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -126,6 +131,8 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli
private NewsEntity mNewsEntity;
private DownloadEntity mDownloadEntity;
private ExposureEvent mExposureEvent;
private Boolean mHideUselessInfo = false; // 是否需要隐藏一些额外的信息(评论按钮等)
private Handler handler = new Handler();
@ -193,7 +200,7 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli
private DetailViewHolder getDetailViewHolder() {
// 每次获取需要重新创建, 防止数据刷新
return new DetailViewHolder(mContentView, gameEntity, mDownloadEntity,
true, mEntrance, "新闻详情", adapter.getTitle(), null); // 下载按钮ViewHolder
true, mEntrance, "新闻详情", adapter.getTitle(), mExposureEvent); // 下载按钮ViewHolder
}
/**
@ -684,6 +691,8 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli
ApkActiveUtils.filterHideApk(response);
gameEntity = response;
logExposure();
if (!mHideUselessInfo) {
adapter.setGameEntity(gameEntity);
adapter.notifyItemInserted(1);
@ -709,6 +718,19 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli
});
}
private void logExposure() {
String sourceValue = mNewsEntity.getTitle() + "+" + mNewsEntity.getId();
ArrayList<ExposureSource> sourceList = new ArrayList<>();
sourceList.add(new ExposureSource("资讯文章", sourceValue));
mExposureEvent = ExposureEvent.createEvent(
gameEntity,
sourceList,
null,
ExposureType.EXPOSURE
);
ExposureManager.INSTANCE.log(mExposureEvent);
}
@Override
protected void onStop() {
super.onStop();

View File

@ -121,6 +121,27 @@ public class SkipActivity extends BaseActivity {
path = path.substring(1);
}
String platform = uri.getQueryParameter(KEY_PLATFORM);
String platformName = PlatformUtils.getInstance(this).getPlatformName(platform);
String gameId = uri.getQueryParameter(EntranceConsts.KEY_GAMEID);
String packageMd5 = uri.getQueryParameter(EntranceConsts.KEY_PACKAGE_MD5);
String isQaFeedbackString = uri.getQueryParameter(EntranceConsts.KEY_IS_QA_FEEDBACK);
String suggestionType = uri.getQueryParameter(KEY_TYPE);
boolean isQaFeedback = !TextUtils.isEmpty(isQaFeedbackString) && isQaFeedbackString.equals("true");
String content = (TextUtils.isEmpty(gameId) || TextUtils.isEmpty(packageMd5)) ?
String.format("%s—V%s—%sV%s",
uri.getQueryParameter(KEY_GAME_NAME),
uri.getQueryParameter(KEY_VERSION),
TextUtils.isEmpty(platformName) ? platform : platformName,
uri.getQueryParameter(KEY_PLATFORM_VERSION)) :
String.format("%s-%s-V%s\n游戏ID%s\n游戏包MD5%s\n",
uri.getQueryParameter(KEY_GAME_NAME),
TextUtils.isEmpty(platformName) ? platform : platformName,
uri.getQueryParameter(KEY_VERSION), gameId, packageMd5);
String qaId = uri.getQueryParameter("qa_id");
String qaContentId = uri.getQueryParameter(EntranceConsts.KEY_QA_CONTENT_ID);
String qaTitle = uri.getQueryParameter(EntranceConsts.KEY_QA_TITLE);
if (host != null) {
Intent intent;
switch (host) {
@ -141,32 +162,12 @@ public class SkipActivity extends BaseActivity {
DirectUtils.directToSubject(this, path, uri.getQueryParameter(KEY_NAME), ENTRANCE_BROWSER, null, false);
break;
case HOST_SUGGESTION:
String platform = uri.getQueryParameter(KEY_PLATFORM);
String platformName = PlatformUtils.getInstance(this).getPlatformName(platform);
String gameId = uri.getQueryParameter(EntranceConsts.KEY_GAMEID);
String packageMd5 = uri.getQueryParameter(EntranceConsts.KEY_PACKAGE_MD5);
String isQaFeedbackString = uri.getQueryParameter(EntranceConsts.KEY_IS_QA_FEEDBACK);
String suggestionType = uri.getQueryParameter(KEY_TYPE);
boolean isQaFeedback = !TextUtils.isEmpty(isQaFeedbackString) && isQaFeedbackString.equals("true");
String content = (TextUtils.isEmpty(gameId) || TextUtils.isEmpty(packageMd5)) ?
String.format("%s—V%s—%sV%s",
uri.getQueryParameter(KEY_GAME_NAME),
uri.getQueryParameter(KEY_VERSION),
TextUtils.isEmpty(platformName) ? platform : platformName,
uri.getQueryParameter(KEY_PLATFORM_VERSION)) :
String.format("%s-%s-V%s\n游戏ID%s\n游戏包MD5%s\n",
uri.getQueryParameter(KEY_GAME_NAME),
TextUtils.isEmpty(platformName) ? platform : platformName,
uri.getQueryParameter(KEY_VERSION), gameId, packageMd5);
String qaId = uri.getQueryParameter("qa_id");
String qaContentId = uri.getQueryParameter(EntranceConsts.KEY_QA_CONTENT_ID);
String qaTitle = uri.getQueryParameter(EntranceConsts.KEY_QA_TITLE);
if (!TextUtils.isEmpty(qaId)) {
DirectUtils.directToQa(this, qaTitle, qaId);
} else if ("vgame".equals(suggestionType)) {
DirectUtils.directToVGameFeedback(this, content, "game", isQaFeedback, qaContentId, EntranceConsts.ENTRANCE_BROWSER);
DirectUtils.directToFeedback(this, content, isQaFeedback, qaContentId, false, true, EntranceConsts.ENTRANCE_BROWSER);
} else {
DirectUtils.directToFeedback(this, content, null, isQaFeedback, qaContentId, EntranceConsts.ENTRANCE_BROWSER);
DirectUtils.directToFeedback(this, content, isQaFeedback, qaContentId, true, false, EntranceConsts.ENTRANCE_BROWSER);
}
break;
case HOST_DOWNLOAD:
@ -335,7 +336,7 @@ public class SkipActivity extends BaseActivity {
DirectUtils.directCategoryDirectory(this, path, title, ENTRANCE_BROWSER, "浏览器");
break;
case HOST_COLUMN_COLLECTION:
DirectUtils.directToColumnCollection(this, path, -1, ENTRANCE_BROWSER, "", null);
DirectUtils.directToColumnCollection(this, path, -1, ENTRANCE_BROWSER, "", "", "", null);
break;
case EntranceConsts.HOST_BLOCK:
name = uri.getQueryParameter("name");
@ -401,7 +402,8 @@ public class SkipActivity extends BaseActivity {
DirectUtils.directToHistoryApk(this, uri.getQueryParameter(EntranceConsts.KEY_GAME_ID));
break;
case EntranceConsts.HOST_FORUM_DETAIL:
DirectUtils.directForumDetail(this, id, ENTRANCE_BROWSER);
String sectionId = uri.getQueryParameter("section_id");
DirectUtils.directForumDetailSection(this, id, sectionId, ENTRANCE_BROWSER);
break;
case EntranceConsts.HOST_GAME_RATING_DETAIL:
DirectUtils.directToGameRatingDetail(this, uri.getQueryParameter(EntranceConsts.KEY_GAME_ID), uri.getQueryParameter(EntranceConsts.KEY_COMMENT_ID), ENTRANCE_BROWSER);
@ -411,8 +413,11 @@ public class SkipActivity extends BaseActivity {
DirectUtils.directToForum(this, TextUtils.isEmpty(position) ? 0 : Integer.parseInt(position));
break;
case EntranceConsts.HOST_HELP_AND_FEEDBACK:
position = uri.getQueryParameter("position");
DirectUtils.directToHelpAndFeedback(this, TextUtils.isEmpty(position) ? 0 : Integer.parseInt(position));
if ("vgame".equals(suggestionType)) {
DirectUtils.directToHelpAndFeedback(this, content, isQaFeedback, qaContentId, false, true, EntranceConsts.ENTRANCE_BROWSER);
} else {
DirectUtils.directToHelpAndFeedback(this, content, isQaFeedback, qaContentId, true, false, EntranceConsts.ENTRANCE_BROWSER);
}
break;
case HOST_GAME_COLLECTION_DETAIL:
DirectUtils.directToGameCollectionDetail(this, path, ENTRANCE_BROWSER, "", null);

View File

@ -66,8 +66,6 @@ class SplashScreenActivity : BaseActivity() {
private var mShouldPrefetchData = true
private val mPermissions = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
PermissionHelper.PERMISSION_GET_INSTALLED_LIST
)

View File

@ -12,28 +12,27 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.gamecenter.common.entity.ExposureEntity;
import com.gh.gamecenter.feature.exposure.ExposureEvent;
import com.gh.gamecenter.feature.exposure.ExposureSource;
import com.gh.gamecenter.feature.exposure.ExposureType;
import com.gh.gamecenter.common.utils.DataLogUtils;
import com.gh.common.util.DirectUtils;
import com.gh.gamecenter.MainActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.common.entity.ExposureEntity;
import com.gh.gamecenter.common.entity.LinkEntity;
import com.gh.gamecenter.common.exposure.ExposureSource;
import com.gh.gamecenter.common.utils.DataLogUtils;
import com.gh.gamecenter.common.utils.ImageUtils;
import com.gh.gamecenter.common.utils.SensorsBridge;
import com.gh.gamecenter.core.utils.MtaHelper;
import com.gh.gamecenter.core.utils.PageSwitchDataHelper;
import com.gh.gamecenter.core.utils.StringUtils;
import com.gh.gamecenter.MainActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.common.entity.LinkEntity;
import com.gh.gamecenter.entity.SubjectRecommendEntity;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.exposure.ExposureEvent;
import com.gh.gamecenter.feature.exposure.ExposureType;
import com.gh.gamecenter.game.data.GameItemData;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -143,6 +142,17 @@ public class ImagePagerAdapter extends RecyclingPagerAdapter {
DirectUtils.INSTANCE.directToLinkPage(mContext, slideEntity, entrance, "轮播图[" + slideEntity
.getText() + "=" + slideEntity.getType() + "=" + indexName + "]", finalExposureEvent);
JSONObject trackEvent = new JSONObject();
try {
trackEvent.put("position", index);
trackEvent.put("location", "版块");
trackEvent.put("block_name", mBlockData.getText());
trackEvent.put("block_id", mBlockData.getLink());
} catch (JSONException e) {
e.printStackTrace();
}
SensorsBridge.trackEvent("BannerClick", trackEvent);
});
mItemData.getExposureEventList().add(finalExposureEvent);

View File

@ -27,6 +27,7 @@ import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.LibaoDetailContentViewHolder;
import com.gh.gamecenter.adapter.viewholder.LibaoDetailTopViewHolder;
import com.gh.gamecenter.common.callback.OnRequestCallBackListener;
import com.gh.gamecenter.common.entity.SimpleGameEntity;
import com.gh.gamecenter.common.entity.SuggestType;
import com.gh.gamecenter.common.retrofit.Response;
import com.gh.gamecenter.common.utils.ExtensionsKt;
@ -39,9 +40,9 @@ import com.gh.gamecenter.core.utils.StringUtils;
import com.gh.gamecenter.databinding.LibaodetailItemContentBinding;
import com.gh.gamecenter.databinding.LibaodetailItemTopBinding;
import com.gh.gamecenter.entity.LibaoDetailEntity;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.entity.LibaoEntity;
import com.gh.gamecenter.feature.entity.LibaoStatusEntity;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.entity.MeEntity;
import com.gh.gamecenter.feature.entity.UserDataLibaoEntity;
import com.gh.gamecenter.feature.game.GameItemViewHolder;
@ -156,12 +157,12 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter<ViewHolder> {
viewHolder.initItemPadding();
viewHolder.getLoading().setVisibility(View.GONE);
SpannableStringBuilder builder = new SpanBuilder("此礼包有问题?点击反馈")
.click(mContext, 7, 11, R.color.theme_font, false, () -> {
HelpAndFeedbackBridge.startSuggestionActivity(mContext,
SuggestType.normal, "libao",
StringUtils.buildString(mLibaoEntity.getGame().getName(), "",
mLibaoEntity.getName(), "有问题:"));
SuggestType.GAME, "libao",
StringUtils.buildString(mLibaoEntity.getName(), "有问题:"), new SimpleGameEntity(mLibaoEntity.getGame().getId(), mLibaoEntity.getGame().getName(), mLibaoEntity.getGame().getIcon()));
return null;
})
.build();

View File

@ -1,213 +0,0 @@
package com.gh.gamecenter.adapter;
import static com.gh.common.constant.Config.URL_ARTICLE;
import static com.gh.gamecenter.R.string.loading;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.gh.gamecenter.NewsDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.WebActivity;
import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder;
import com.gh.gamecenter.adapter.viewholder.ToolBoxViewHolder;
import com.gh.gamecenter.common.callback.OnRequestCallBackListener;
import com.gh.gamecenter.common.entity.SuggestType;
import com.gh.gamecenter.common.entity.ToolBoxEntity;
import com.gh.gamecenter.common.retrofit.Response;
import com.gh.gamecenter.common.utils.ImageUtils;
import com.gh.gamecenter.common.viewholder.FooterViewHolder;
import com.gh.gamecenter.core.utils.MtaHelper;
import com.gh.gamecenter.core.utils.UrlFilterUtils;
import com.gh.gamecenter.databinding.ToolboxItemBinding;
import com.gh.gamecenter.help.HelpAndFeedbackBridge;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.HttpException;
/**
* Created by khy on 24/05/17.
*/
public class ToolBoxRvAdapter extends BaseRecyclerAdapter {
private OnRequestCallBackListener mCallBackListener;
private List<ToolBoxEntity> mEntityList;
private String mSearchKey;
private boolean mIsSearch;
private boolean mIsLoading;
private boolean mIsOver;
private boolean mIsNetworkError;
private int mPage;
public ToolBoxRvAdapter(Context context, OnRequestCallBackListener listener, boolean isSearch, String key) {
super(context);
this.mIsSearch = isSearch;
this.mSearchKey = key;
mPage = 1;
mCallBackListener = listener;
mEntityList = new ArrayList<>();
loadData();
}
public void loadData() {
if (mIsLoading) {
return;
}
mIsLoading = true;
RetrofitManager.getInstance().getApi()
.getToolKitData(mPage, UrlFilterUtils.getFilterQuery("keyword", mIsSearch ? mSearchKey : ""))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<ToolBoxEntity>>() {
@Override
public void onResponse(List<ToolBoxEntity> response) {
super.onResponse(response);
if (response.size() > 0) {
mEntityList.addAll(response);
}
mCallBackListener.loadDone();
if (response.size() < 20) {
mIsOver = true;
}
notifyDataSetChanged();
mPage++;
mIsLoading = false;
if (mEntityList.size() == 0) {
mCallBackListener.loadEmpty();
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
mIsLoading = false;
if (mEntityList.size() == 0) {
mCallBackListener.loadError();
} else {
mIsNetworkError = true;
notifyItemChanged(getItemCount() - 1);
}
}
});
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return 1;
} else if (position == getItemCount() - 1) {
return 2;
} else {
return 3;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 2) {
View view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view);
} else if (viewType == 1) {
View view = mLayoutInflater.inflate(R.layout.toolbox_hint_item, parent, false);
return new ReuseViewHolder(view);
} else {
View view = mLayoutInflater.inflate(R.layout.toolbox_item, parent, false);
return new ToolBoxViewHolder(ToolboxItemBinding.bind(view));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ToolBoxViewHolder) {
ToolBoxViewHolder viewHolder = (ToolBoxViewHolder) holder;
ToolBoxEntity toolBoxEntity = mEntityList.get(position - 1);
initToolBoxViewHolder(viewHolder, toolBoxEntity);
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder viewHolder = (FooterViewHolder) holder;
initFooterViewHolder(viewHolder);
} else if (holder instanceof ReuseViewHolder) {
holder.itemView.setOnClickListener(v -> {
MtaHelper.onEvent("我的光环_新", "工具箱", "点击反馈");
HelpAndFeedbackBridge.startSuggestionActivity(mContext, SuggestType.normal, null, null);
});
}
}
@Override
public int getItemCount() {
if (mEntityList.size() > 0) {
return mEntityList.size() + 2;
} else {
return 0;
}
}
private void initFooterViewHolder(FooterViewHolder viewHolder) {
viewHolder.initItemPadding();
if (mIsNetworkError) {
viewHolder.getLoading().setVisibility(View.GONE);
viewHolder.getHint().setText(R.string.loading_failed_retry);
viewHolder.itemView.setClickable(true);
viewHolder.itemView.setOnClickListener(v -> loadData());
} else if (mIsOver) {
viewHolder.getLoading().setVisibility(View.GONE);
viewHolder.getHint().setText(R.string.loading_complete);
viewHolder.itemView.setClickable(false);
} else {
viewHolder.getLoading().setVisibility(View.VISIBLE);
viewHolder.getHint().setText(loading);
viewHolder.itemView.setClickable(false);
}
}
private void initToolBoxViewHolder(ToolBoxViewHolder viewHolder, final ToolBoxEntity toolBoxEntity) {
viewHolder.binding.toolboxItemDes.setText(toolBoxEntity.getDes());
viewHolder.binding.toolboxItemTitle.setText(toolBoxEntity.getName());
ImageUtils.display(viewHolder.binding.toolboxItemGameThumb, toolBoxEntity.getIcon());
viewHolder.itemView.setOnClickListener(v -> {
String url = toolBoxEntity.getUrl();
// http://www.ghzs666.com/article/59291e7ce9a64a496cfd6897.html
if (url != null && url.contains(URL_ARTICLE)) {
String newsId = url.substring(url.lastIndexOf("/") + 1, url.length() - 5); // 5: ".html"
Intent intent = NewsDetailActivity.getIntentById(mContext, newsId, "工具箱列表");
mContext.startActivity(intent);
} else {
mContext.startActivity(WebActivity.getWebByCollectionTools(mContext, toolBoxEntity, false));
}
});
}
public boolean isOver() {
return mIsOver;
}
public boolean isLoading() {
return mIsLoading;
}
public boolean isNetworkError() {
return mIsNetworkError;
}
}

View File

@ -59,6 +59,7 @@ import com.gh.gamecenter.common.eventbus.EBReuse;
import com.gh.gamecenter.common.utils.DataLogUtils;
import com.gh.gamecenter.common.utils.DialogHelper;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.NewFlatLogUtils;
import com.gh.gamecenter.common.utils.PermissionHelper;
import com.gh.gamecenter.common.utils.SensorsBridge;
import com.gh.gamecenter.core.utils.PageSwitchDataHelper;
@ -186,17 +187,33 @@ public class DetailViewHolder {
XapkInstaller.cancelUnzipTask(mDownloadEntity);
return;
} else if (XapkUnzipStatus.FAILURE.name().equals(xapkStatus)) {
PermissionHelper.checkStoragePermissionBeforeAction(mViewHolder.context, () -> {
if (mDownloadEntity != null) {
final String path = mDownloadEntity.getPath();
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mViewHolder.context, R.string.install_failure_hint);
DownloadManager.getInstance().cancel(mDownloadEntity.getUrl());
} else {
PackageInstaller.install(mViewHolder.context, mDownloadEntity);
}
}
});
PermissionHelper.checkStoragePermissionBeforeAction(
mViewHolder.context,
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese(),
() -> {
if (mDownloadEntity != null) {
final String path = mDownloadEntity.getPath();
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mViewHolder.context, R.string.install_failure_hint);
DownloadManager.getInstance().cancel(mDownloadEntity.getUrl());
} else {
NewFlatLogUtils.INSTANCE.logGameInstall(
mDownloadEntity.getGameId(),
mDownloadEntity.getName(),
"主动安装"
);
SensorsBridge.trackInstallGameClick(
mDownloadEntity.getGameId(),
mDownloadEntity.getName(),
"主动安装"
);
PackageInstaller.install(mViewHolder.context, mDownloadEntity);
}
}
});
return;
}
}
@ -274,7 +291,7 @@ public class DetailViewHolder {
//启动模拟器游戏
if (SimulatorGameManager.isSimulatorGame(mGameEntity)) {
if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(mViewHolder.context)) {
NewSimulatorGameManager.showUpdateNewsSimulator(mViewHolder.context, null);
NewSimulatorGameManager.showUpdateNewsSimulator(mViewHolder.context, mGameEntity, null);
return;
}
DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(mGameEntity.getApk().get(0).getUrl());
@ -297,14 +314,19 @@ public class DetailViewHolder {
PackageLauncher.launchApp(mViewHolder.context, mGameEntity, mGameEntity.getApk().get(0).getPackageName());
} else {
GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> {
PermissionHelper.checkStoragePermissionBeforeAction(mViewHolder.context, () -> {
DownloadDialog.showDownloadDialog(
mViewHolder.context,
mGameEntity,
mTraceEvent,
StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"),
mName + ":" + mTitle);
});
PermissionHelper.checkStoragePermissionBeforeAction(
mViewHolder.context,
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese(),
() -> {
DownloadDialog.showDownloadDialog(
mViewHolder.context,
mGameEntity,
mTraceEvent,
StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"),
mName + ":" + mTitle);
});
});
}
break;
@ -312,6 +334,18 @@ public class DetailViewHolder {
case INSTALL_NORMAL:
if (mGameEntity.getApk().isEmpty()) return;
NewFlatLogUtils.INSTANCE.logGameInstall(
mDownloadEntity.getGameId(),
mDownloadEntity.getName(),
"主动安装"
);
SensorsBridge.trackInstallGameClick(
mDownloadEntity.getGameId(),
mDownloadEntity.getName(),
"主动安装"
);
ApkEntity apk = mGameEntity.getApk().get(0);
DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.getUrl());
if (mGameEntity.getSimulator() != null) {
@ -326,7 +360,7 @@ public class DetailViewHolder {
if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(mGameEntity) && !isInstalled && !isInstalledNewSimulator) {
SimulatorDownloadManager.getInstance().showDownloadDialog(mViewHolder.context, simulator,
SimulatorDownloadManager.SimulatorLocation.LAUNCH, mGameEntity.getId(), mGameEntity.getName(), null);
SimulatorDownloadManager.SimulatorLocation.LAUNCH, mGameEntity.getId(), mGameEntity.getName(), mGameEntity.getCategoryChinese(), null);
return;
}
}
@ -336,21 +370,26 @@ public class DetailViewHolder {
return;
}
PermissionHelper.checkStoragePermissionBeforeAction(mViewHolder.context, () -> {
if (mDownloadEntity == null) {
mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity);
}
PermissionHelper.checkStoragePermissionBeforeAction(
mViewHolder.context,
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese(),
() -> {
if (mDownloadEntity == null) {
mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity);
}
if (mDownloadEntity != null) {
final String path = mDownloadEntity.getPath();
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mViewHolder.context, R.string.install_failure_hint);
DownloadManager.getInstance().cancel(mDownloadEntity.getUrl());
} else {
PackageInstaller.install(mViewHolder.context, mDownloadEntity);
}
}
});
if (mDownloadEntity != null) {
final String path = mDownloadEntity.getPath();
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mViewHolder.context, R.string.install_failure_hint);
DownloadManager.getInstance().cancel(mDownloadEntity.getUrl());
} else {
PackageInstaller.install(mViewHolder.context, mDownloadEntity);
}
}
});
break;
case RESERVABLE:
GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> {
@ -395,11 +434,38 @@ public class DetailViewHolder {
Utils.toast(mViewHolder.context, "正在加急更新版本,敬请后续留意");
break;
case TEENAGER_MODE:
SensorsBridge.trackAdolescentModeDialogShow(
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese()
);
DialogHelper.showCenterDialog(
mViewHolder.context,
"提示", "当前处于儿童/青少年模式, \n暂不提供游戏下载", "退出青少年模式", "关闭",
() -> mViewHolder.context.startActivity(TeenagerModeActivity.getIntent(mViewHolder.context)),
() -> {
mViewHolder.context.startActivity(TeenagerModeActivity.getIntent(mViewHolder.context));
SensorsBridge.trackAdolescentModeDialogClick(
"退出青少年模式",
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese()
);
},
() -> {
SensorsBridge.trackAdolescentModeDialogClick(
"关闭",
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese()
);
},
() -> {
SensorsBridge.trackAdolescentModeDialogClick(
"关闭弹窗",
mGameEntity.getId(),
mGameEntity.getName() != null ? mGameEntity.getName() : "",
mGameEntity.getCategoryChinese()
);
}
);
break;

View File

@ -18,6 +18,7 @@ import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.callback.ConfirmListener
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.viewholder.FooterViewHolder
import com.gh.gamecenter.core.utils.DisplayUtils
@ -26,7 +27,6 @@ import com.gh.gamecenter.core.utils.NumberUtils
import com.gh.gamecenter.databinding.AmwayCommentItemBinding
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.game.GameItemViewHolder
import com.gh.gamecenter.game.GameAndPosition
import com.gh.gamecenter.game.vertical.GameVerticalAdapter

View File

@ -10,7 +10,6 @@ import androidx.core.view.ViewCompat
import androidx.recyclerview.widget.RecyclerView
import com.ethanhua.skeleton.Skeleton
import com.gh.common.exposure.ExposureListener
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.util.DialogUtils
import com.gh.common.util.NewFlatLogUtils
import com.gh.common.xapk.XapkInstaller
@ -23,6 +22,7 @@ import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.eventbus.EBReuse
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.view.VerticalItemDecoration
import com.gh.gamecenter.core.utils.ClickUtils

View File

@ -5,6 +5,7 @@ import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.gh.gamecenter.common.base.fragment.ToolbarFragment
import com.gh.gamecenter.common.baselist.LoadStatus
import com.gh.gamecenter.common.entity.SimpleGameEntity
import com.gh.gamecenter.common.entity.SuggestType
import com.gh.gamecenter.common.utils.observeNonNull
import com.gh.gamecenter.common.utils.viewModelProviderFromParent
@ -35,7 +36,13 @@ class AmwaySearchListFragment : ToolbarFragment() {
mBinding.noDataContainer.reuseNoneDataDescTv.text = "换个搜索词试试~"
mBinding.noDataContainer.reuseResetLoadTv.visibility = View.VISIBLE
mBinding.noDataContainer.reuseResetLoadTv.setOnClickListener {
HelpAndFeedbackBridge.startSuggestionActivity(requireContext(), SuggestType.gameCollect, "求游戏:")
HelpAndFeedbackBridge.startSuggestionActivity(
requireContext(),
SuggestType.UPDATE,
null,
null,
SimpleGameEntity(name = mViewModel.currentSearchKey)
)
}
mBinding.errorContainer.connectionReloadTv.setOnClickListener {

View File

@ -9,10 +9,10 @@ import com.gh.common.constant.Config
import com.gh.common.util.PackageHelper
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.common.baselist.LoadStatus
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.login.user.UserManager
import com.gh.gamecenter.common.retrofit.BiResponse
import com.gh.gamecenter.common.retrofit.Response
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.login.user.UserManager
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
@ -23,6 +23,7 @@ import retrofit2.HttpException
class AmwaySearchViewModel(application: Application) : AndroidViewModel(application) {
private var mTempSearchKey = ""
var currentSearchKey = ""
var loadStatus = MutableLiveData<LoadStatus>()
@ -41,6 +42,7 @@ class AmwaySearchViewModel(application: Application) : AndroidViewModel(applicat
fun getSearchResult(searchKey: String) {
mTempSearchKey = searchKey
currentSearchKey = searchKey
loadStatus.postValue(LoadStatus.INIT_LOADING)
RetrofitManager
.getInstance().api

View File

@ -6,14 +6,14 @@ import android.view.ViewGroup
import android.widget.TextView
import androidx.viewpager.widget.PagerAdapter
import com.facebook.drawee.view.SimpleDraweeView
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.util.DirectUtils
import com.gh.gamecenter.common.utils.ImageUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.RecyclingPagerAdapter
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.core.utils.PageSwitchDataHelper
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
class BannerAdapter(
private val mContext: Context,

View File

@ -11,6 +11,7 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.toBinding
import com.gh.gamecenter.common.viewholder.FooterViewHolder
@ -18,7 +19,6 @@ import com.gh.gamecenter.core.utils.StringUtils
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.feature.game.GameItemViewHolder
import com.lightgame.download.DownloadEntity

View File

@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.View
import com.ethanhua.skeleton.Skeleton
import com.gh.common.exposure.ExposureListener
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.util.DialogUtils
import com.gh.common.view.CatalogFilterView
import com.gh.common.xapk.XapkInstaller
@ -15,6 +14,7 @@ import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.utils.observeNonNull
import com.gh.gamecenter.common.baselist.ListFragment
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.toColor
import com.gh.gamecenter.common.utils.viewModelProvider
import com.gh.gamecenter.databinding.FragmentCatalogListBinding

View File

@ -13,18 +13,18 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.exposure.IExposable
import com.gh.common.util.*
import com.gh.gamecenter.R
import com.gh.gamecenter.common.viewholder.FooterViewHolder
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.utils.PageSwitchDataHelper
import com.gh.gamecenter.databinding.*
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.entity.SpecialCatalogEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.subject.SubjectActivity.Companion.startSubjectActivity
class SpecialCatalogAdapter(
@ -156,7 +156,13 @@ class SpecialCatalogAdapter(
mExposureEventSparseArray.append(position, exposureEvent)
}
root.setOnClickListener {
DirectUtils.directToLinkPage(mContext, imageEntity.link, "新分类-精选分类", "图片", exposureEvent)
DirectUtils.directToLinkPage(
mContext,
imageEntity.link,
"新分类-精选分类",
"图片",
exposureEvent
)
mCatalogViewModel.logSpecialCatalogContentClick(
"图片",
imageEntity.image.title,
@ -176,7 +182,10 @@ class SpecialCatalogAdapter(
headMore.setOnClickListener {
if (entity.type == "专题合集") {
DirectUtils.directToColumnCollection(
mContext, specialLink.link ?: "", -1, "(游戏-专题:" + specialLink.text + "-全部)"
mContext,
specialLink.link ?: "",
-1,
"(游戏-专题:" + specialLink.text + "-全部)"
)
} else {
startSubjectActivity(
@ -275,6 +284,7 @@ class SpecialCatalogAdapter(
banners,
lastPageDataMap
)
banners.isNotEmpty() && pagerAdapter != null -> (pagerAdapter as BannerAdapter).checkResetData(itemData)
banners.isEmpty() -> binding.viewPager.adapter = null
}

View File

@ -7,8 +7,8 @@ import com.gh.common.filter.RegionSettingHelper
import com.gh.common.util.LogUtils
import com.gh.gamecenter.common.baselist.ListViewModel
import com.gh.gamecenter.common.entity.ExposureEntity
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.entity.SpecialCatalogEntity
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.retrofit.RetrofitManager
import com.halo.assistant.HaloApp
import io.reactivex.Observable

View File

@ -11,6 +11,7 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.toBinding
import com.gh.gamecenter.common.viewholder.FooterViewHolder
@ -18,7 +19,6 @@ import com.gh.gamecenter.core.utils.StringUtils
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.feature.game.GameItemViewHolder
import com.lightgame.download.DownloadEntity

View File

@ -9,7 +9,6 @@ import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.util.LogUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.SearchActivity
@ -17,6 +16,7 @@ import com.gh.gamecenter.catalog.SpecialCatalogFragment
import com.gh.gamecenter.common.base.fragment.LazyFragment
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.view.FixLinearLayoutManager
import com.gh.gamecenter.core.utils.PageSwitchDataHelper

View File

@ -6,9 +6,6 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.databind.BindingAdapters
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.common.exposure.IExposable
import com.gh.common.util.DownloadItemUtils
import com.gh.gamecenter.GameDetailActivity
@ -17,6 +14,7 @@ import com.gh.gamecenter.adapter.viewholder.GameViewHolder
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.view.DrawableView
import com.gh.gamecenter.common.viewholder.FooterViewHolder
@ -25,6 +23,8 @@ import com.gh.gamecenter.core.utils.StringUtils
import com.gh.gamecenter.databinding.CategoryGameItemBinding
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.feature.game.GameItemViewHolder
import com.lightgame.download.DownloadEntity
import org.json.JSONException

View File

@ -5,11 +5,11 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.gh.gamecenter.common.entity.ExposureEntity
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.exposure.ExposureUtils
import com.gh.gamecenter.core.utils.UrlFilterUtils
import com.gh.common.view.CategoryFilterView
import com.gh.gamecenter.common.baselist.ListViewModel
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.entity.SubjectSettingEntity
import com.gh.gamecenter.retrofit.RetrofitManager

View File

@ -278,7 +278,7 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() {
}
override fun onError(e: Throwable?) {
toast("上传失败")
toast("存档上传失败")
}
},
null,

View File

@ -15,26 +15,30 @@ import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.exposure.IExposable
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.syncpage.ISyncAdapterHandler
import com.gh.common.util.*
import com.gh.common.util.CheckLoginUtils
import com.gh.common.util.DirectUtils
import com.gh.common.util.NewLogUtils
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.viewholder.FooterViewHolder
import com.gh.gamecenter.adapter.viewholder.GameCollectionItemViewHolder
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.collection.GamesCollectionFragment.Companion.TYPE_USER
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.json.json
import com.gh.gamecenter.common.syncpage.ISyncAdapterHandler
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.view.DrawableView
import com.gh.gamecenter.core.utils.*
import com.gh.gamecenter.common.viewholder.FooterViewHolder
import com.gh.gamecenter.core.utils.NumberUtils
import com.gh.gamecenter.core.utils.TimeUtils
import com.gh.gamecenter.core.utils.ToastUtils
import com.gh.gamecenter.databinding.ItemGameCollectionFlexTagBinding
import com.gh.gamecenter.databinding.PopupHistoryOptionBinding
import com.gh.gamecenter.entity.GamesCollectionEntity
import com.gh.gamecenter.entity.TagInfoEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.gamecollection.detail.GameCollectionDetailActivity
import com.gh.gamecenter.gamecollection.publish.GameCollectionEditActivity
@ -398,26 +402,146 @@ class GamesCollectionAdapter(
}
private fun dealOption(content: String, entity: GamesCollectionEntity) {
val path = when (mViewModel.type) {
GamesCollectionFragment.TYPE_COLLECT -> "我的收藏"
GamesCollectionFragment.TYPE_HISTORY -> "浏览记录"
GamesCollectionFragment.TYPE_USER -> "个人主页"
else -> ""
}
when (content) {
"编辑" -> {
mContext.startActivity(GameCollectionEditActivity.getIntent(mContext, entity))
mContext.startActivity(GameCollectionEditActivity.getIntent(mContext, entity, path = path))
}
"投稿" -> {
SensorsBridge.trackEvent("GameCollectContributeClick", json {
"source_entrance" to path
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
if ((entity.count?.game ?: 0) >= 8) {
DialogHelper.showDialog(mContext, "温馨提示", "投稿通过后,将自动关闭“仅自己可见”,所有用户都能浏览到游戏单,确定投稿?", "确定", "取消", {
mViewModel.publishGameCollection(entity)
}, extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true))
SensorsBridge.trackEvent("GameCollectContributeConfirmDialogShow", json {
"source_entrance" to path
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
DialogHelper.showDialog(
mContext,
"温馨提示",
"投稿通过后,将自动关闭“仅自己可见”,所有用户都能浏览到游戏单,确定投稿?",
"确定",
"取消",
{
SensorsBridge.trackEvent("GameCollectContributeConfirmDialogClick", json {
"source_entrance" to path
"button_name" to "确定"
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
mViewModel.publishGameCollection(entity)
},
{
SensorsBridge.trackEvent("GameCollectContributeConfirmDialogClick", json {
"source_entrance" to path
"button_name" to "取消"
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
},
{
SensorsBridge.trackEvent("GameCollectContributeConfirmDialogClick", json {
"source_entrance" to path
"button_name" to "关闭弹窗"
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
},
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
)
} else {
DialogHelper.showDialog(mContext, "温馨提示", "游戏单需要收录至少8个游戏才可以投稿至游戏单广场哦~", "添加游戏", "我知道了", {
mContext.startActivity(GameCollectionEditActivity.getIntent(mContext, entity))
}, extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true))
SensorsBridge.trackEvent("GameCollectContributeGameLackDialogShow", json {
"source_entrance" to path
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
DialogHelper.showDialog(
mContext,
"温馨提示",
"游戏单需要收录至少8个游戏才可以投稿至游戏单广场哦~",
"添加游戏",
"我知道了",
{
SensorsBridge.trackEvent("GameCollectContributeGameLackDialogClick", json {
"source_entrance" to path
"button_name" to "添加游戏"
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
mContext.startActivity(GameCollectionEditActivity.getIntent(mContext, entity, path = path))
},
{
SensorsBridge.trackEvent("GameCollectContributeGameLackDialogClick", json {
"source_entrance" to path
"button_name" to "我知道了"
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
},
{
SensorsBridge.trackEvent("GameCollectContributeGameLackDialogClick", json {
"source_entrance" to path
"button_name" to "关闭弹窗"
"game_num" to entity.count?.game
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
},
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
)
}
}
"删除" -> {
SensorsBridge.trackEvent("GameCollectDeleteClick", json {
"source_entrance" to path
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
SensorsBridge.trackEvent("GameCollectDeleteDialogShow", json {
"source_entrance" to path
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
DialogHelper.showDialog(mContext, "温馨提示", "游戏单删除后将无法恢复,是否确认删除", "确定", "取消", {
SensorsBridge.trackEvent("GameCollectDeleteDialogClick", json {
"source_entrance" to path
"button_name" to "确定"
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
mViewModel.deleteGameCollection(entity)
}, {
SensorsBridge.trackEvent("GameCollectDeleteDialogClick", json {
"source_entrance" to path
"button_name" to "取消"
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
}, {
SensorsBridge.trackEvent("GameCollectDeleteDialogClick", json {
"source_entrance" to path
"button_name" to "关闭弹窗"
"game_collect_title" to entity.title
"game_collect_id" to entity.id
})
}, extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true))
}
}

View File

@ -4,20 +4,22 @@ import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
import com.gh.common.exposure.ExposureListener
import com.gh.gamecenter.common.constant.EntranceConsts.*
import com.gh.gamecenter.common.view.SpacingItemDecoration
import com.gh.gamecenter.R
import com.gh.gamecenter.common.baselist.ListFragment
import com.gh.gamecenter.common.baselist.LoadType
import com.gh.gamecenter.common.constant.EntranceConsts.*
import com.gh.gamecenter.common.eventbus.EBReuse
import com.gh.gamecenter.common.json.json
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.toColor
import com.gh.gamecenter.common.utils.viewModelProvider
import com.gh.gamecenter.common.view.SpacingItemDecoration
import com.gh.gamecenter.entity.GamesCollectionEntity
import com.gh.gamecenter.common.eventbus.EBReuse
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import com.gh.gamecenter.history.IBatchDelete
import com.gh.gamecenter.history.ManageOption
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class GamesCollectionFragment : ListFragment<GamesCollectionEntity, GamesCollectionViewModel>(), IBatchDelete {
@ -76,6 +78,19 @@ class GamesCollectionFragment : ListFragment<GamesCollectionEntity, GamesCollect
mListViewModel.publishLiveData.observe(viewLifecycleOwner) {
mListViewModel.load(LoadType.REFRESH)
val path = when (mType) {
TYPE_COLLECT -> "我的收藏"
TYPE_HISTORY -> "浏览记录"
TYPE_USER -> "个人主页"
else -> ""
}
SensorsBridge.trackEvent("GameCollectContributeSuccess", json {
"source_entrance" to path
"game_num" to it.count?.game
"game_collect_title" to it.title
"game_collect_id" to it.id
})
}
mListRv.addOnScrollListener(ExposureListener(this, provideListAdapter()))

View File

@ -8,7 +8,6 @@ import com.gh.gamecenter.common.base.activity.ToolBarActivity
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.utils.updateStatusBarColor
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import java.util.ArrayList
/**

View File

@ -21,6 +21,7 @@ import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.baselist.LoadStatus
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.viewholder.FooterViewHolder
import com.gh.gamecenter.core.utils.StringUtils
@ -35,7 +36,6 @@ import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.eventbus.EBSkip
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.feature.game.GameItemViewHolder
import com.gh.gamecenter.fragment.MainWrapperFragment

View File

@ -25,6 +25,7 @@ import com.gh.gamecenter.common.baselist.LazyListFragment
import com.gh.gamecenter.common.baselist.ListAdapter
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.core.AppExecutor
import com.gh.gamecenter.core.utils.SPUtils
@ -34,7 +35,6 @@ import com.gh.gamecenter.databinding.LayoutPopupDiscoveryDislikeBinding
import com.gh.gamecenter.eventbus.EBDiscoverChanged
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.eventbus.EBPackage
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.google.android.flexbox.FlexboxLayout
import com.lightgame.download.DataWatcher
import com.lightgame.download.DownloadEntity

View File

@ -18,16 +18,17 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout
import com.gh.gamecenter.common.databinding.FragmentDownloadBinding
import com.gh.gamecenter.common.eventbus.EBMiPush
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.dip2px
import com.gh.gamecenter.common.utils.goneIf
import com.gh.gamecenter.common.utils.visibleIf
import com.gh.gamecenter.core.utils.DisplayUtils
import com.gh.gamecenter.databinding.TabItemDownloadNumberBinding
import com.gh.gamecenter.entity.HomePluggableFilterEntity
import com.gh.gamecenter.feature.entity.PluginLocation
import com.gh.gamecenter.eventbus.EBDownloadChanged
import com.gh.gamecenter.eventbus.EBSkip
import com.gh.gamecenter.eventbus.EBUISwitch
import com.gh.gamecenter.feature.entity.PluginLocation
import com.gh.gamecenter.manager.PackagesManager
import com.lightgame.download.DownloadStatus
import org.greenrobot.eventbus.EventBus
@ -51,6 +52,8 @@ class DownloadFragment : BaseFragment_TabLayout() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
SensorsBridge.trackDownloadManagerEnter()
mPermanentInactivePluggableApkList = HomePluggableHelper.getPermanentInactivePluggablePackage()
}
@ -145,6 +148,8 @@ class DownloadFragment : BaseFragment_TabLayout() {
override fun onPageSelected(index: Int) {
EventBus.getDefault().post(EBUISwitch(DownloadManagerActivity.TAG, index))
SensorsBridge.trackDownloadManagerTabSelect(mTabTitleList[index])
if (index == INDEX_UPDATE) {
mIsUpdateTabHasBeenSelected = true
updateUpdateHint()
@ -259,6 +264,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
const val INDEX_UPDATE = 1
const val KEY_PATH_OF_PACKAGE_TO_INSTALL = "key_path_of_package_to_install"
const val KEY_URL_OF_PACKAGE_TO_INSTALL = "key_url_of_package_to_install"
}
}

View File

@ -222,6 +222,10 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi
protected void initView(View view) {
super.initView(view);
String path = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_PATH);
String gameId = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_GAME_ID);
String gameName = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_GAME_NAME);
String gameType = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_GAME_TYPE);
String platform = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_PLATFORM);
String pluginDesc = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_PLUGIN_DESC);
url = getActivity().getIntent().getStringExtra(EntranceConsts.KEY_URL);
@ -298,7 +302,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi
});
if (path != null) {
adapter.showPluginDialog(path, pluginDesc);
adapter.showPluginDialog(path, pluginDesc, gameId, gameName, gameType, platform);
}
mBinding.downloadmanagerTvAllstart.setOnClickListener(this);
}
@ -344,7 +348,14 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi
public void onEventMainThread(EBMiPush mipush) {
if ("plugin_install".equals(mipush.getFrom())) {
DownloadEntity downloadEntity = (DownloadEntity) mipush.getObj();
adapter.showPluginDialog(downloadEntity.getPath(), downloadEntity.getPluginDesc());
adapter.showPluginDialog(
downloadEntity.getPath(),
downloadEntity.getPluginDesc(),
downloadEntity.getGameId(),
downloadEntity.getName(),
ExtensionsKt.getCategoryChinese(downloadEntity),
downloadEntity.getPlatform()
);
}
}

View File

@ -17,11 +17,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.PackageInstaller;
import com.gh.common.util.PackageLauncher;
import com.gh.common.util.PackageUtils;
import com.gh.common.xapk.XapkDialogHelper;
import com.gh.gamecenter.common.entity.IconFloat;
import com.gh.gamecenter.feature.utils.PlatformUtils;
import com.gh.gamecenter.feature.view.DownloadButton;
import com.gh.common.xapk.XapkInstaller;
import com.gh.common.xapk.XapkUnzipStatus;
import com.gh.download.DownloadManager;
@ -29,15 +25,20 @@ import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.DownloadHeadViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDownloadViewHolder;
import com.gh.gamecenter.common.constant.Constants;
import com.gh.gamecenter.common.entity.IconFloat;
import com.gh.gamecenter.common.utils.DialogHelper;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.ImageUtils;
import com.gh.gamecenter.common.utils.NetworkUtils;
import com.gh.gamecenter.common.utils.NewFlatLogUtils;
import com.gh.gamecenter.common.utils.PermissionHelper;
import com.gh.gamecenter.common.utils.SensorsBridge;
import com.gh.gamecenter.core.utils.SpeedUtils;
import com.gh.gamecenter.databinding.DownloadmanagerItemHeadBinding;
import com.gh.gamecenter.databinding.FmDownloadmanagerItemBinding;
import com.gh.gamecenter.eventbus.EBDownloadChanged;
import com.gh.gamecenter.feature.utils.PlatformUtils;
import com.gh.gamecenter.feature.view.DownloadButton;
import com.gh.gamecenter.manager.PackagesManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import com.lightgame.download.DownloadConfig;
@ -278,20 +279,43 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter<ViewHolder> {
return;
} else if (XapkUnzipStatus.FAILURE.name().equals(currentXApkStatus)
|| XapkUnzipStatus.SUCCESS.name().equals(currentXApkStatus)) {
PermissionHelper.checkStoragePermissionBeforeAction(mContext, () -> {
final String path = downloadEntity.getPath();
if (downloadEntity.isPluggable()
&& PackagesManager.isInstalled(downloadEntity.getPackageName())) {
showPluginDialog(downloadEntity.getPath(), downloadEntity.getPluginDesc());
} else {
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mContext, R.string.install_failure_hint);
removeDownload(downloadEntity);
} else {
PackageInstaller.install(mContext, downloadEntity);
}
}
});
PermissionHelper.checkStoragePermissionBeforeAction(
mContext,
downloadEntity.getGameId(),
downloadEntity.getName(),
ExtensionsKt.getCategoryChinese(downloadEntity),
() -> {
final String path = downloadEntity.getPath();
if (downloadEntity.isPluggable()
&& PackagesManager.isInstalled(downloadEntity.getPackageName())) {
showPluginDialog(
downloadEntity.getPath(),
downloadEntity.getPluginDesc(),
downloadEntity.getGameId(),
downloadEntity.getName(),
ExtensionsKt.getGameCategory(downloadEntity),
downloadEntity.getPlatform()
);
} else {
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mContext, R.string.install_failure_hint);
removeDownload(downloadEntity);
} else {
NewFlatLogUtils.INSTANCE.logGameInstall(
downloadEntity.getGameId(),
downloadEntity.getName(),
"主动安装"
);
SensorsBridge.trackInstallGameClick(
downloadEntity.getGameId(),
downloadEntity.getName(),
"主动安装"
);
PackageInstaller.install(mContext, downloadEntity);
}
}
});
return;
}
@ -300,47 +324,75 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter<ViewHolder> {
case timeout:
case neterror:
case subscribe:
PermissionHelper.checkStoragePermissionBeforeAction(mContext, () -> {
// 下载管理不用判断是否大于50M
DialogUtils.checkDownload(mContext, Float.toString(100F), downloadEntity.getGameId(), downloadEntity.getName(), isSubscribe -> {
if (isSubscribe) {
DownloadManager.getInstance().subscribe(downloadEntity);
statusMap.put(url, DownloadStatus.subscribe.getStatus());
notifyItemChanged(mDownloadedList.isEmpty() ? 0 : 1 + mDownloadedList
.size());
} else {
viewHolder.binding.dmItemTvSpeed.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font));
viewHolder.binding.dmItemTvSpeed.setText(String.format("%s(剩%s)",
SpeedUtils.getSpeed(downloadEntity.getSpeed()),
SpeedUtils.getRemainTime(downloadEntity.getSize(),
downloadEntity.getProgress(), downloadEntity.getSpeed() * 1024)));
viewHolder.binding.dmItemTvStartorpause.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL);
viewHolder.binding.dmItemTvStartorpause.setText(downloadEntity.getPercent() + "%");
viewHolder.binding.dmItemTvStartorpause.setProgress((int) (downloadEntity.getPercent() * 10));
statusMap.put(url, DownloadStatus.downloading.getStatus());
notifyItemChanged(mDownloadedList.isEmpty() ? 0 : 1 + mDownloadedList
.size());
DownloadManager.getInstance().resume(downloadEntity, true);
}
});
});
PermissionHelper.checkStoragePermissionBeforeAction(
mContext,
downloadEntity.getGameId(),
downloadEntity.getName(),
ExtensionsKt.getCategoryChinese(downloadEntity),
() -> {
// 下载管理不用判断是否大于50M
DialogUtils.checkDownload(mContext, Float.toString(100F), downloadEntity.getGameId(), downloadEntity.getName(), ExtensionsKt.getGameCategory(downloadEntity), isSubscribe -> {
if (isSubscribe) {
DownloadManager.getInstance().subscribe(downloadEntity);
statusMap.put(url, DownloadStatus.subscribe.getStatus());
notifyItemChanged(mDownloadedList.isEmpty() ? 0 : 1 + mDownloadedList
.size());
} else {
viewHolder.binding.dmItemTvSpeed.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font));
viewHolder.binding.dmItemTvSpeed.setText(String.format("%s(剩%s)",
SpeedUtils.getSpeed(downloadEntity.getSpeed()),
SpeedUtils.getRemainTime(downloadEntity.getSize(),
downloadEntity.getProgress(), downloadEntity.getSpeed() * 1024)));
viewHolder.binding.dmItemTvStartorpause.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL);
viewHolder.binding.dmItemTvStartorpause.setText(downloadEntity.getPercent() + "%");
viewHolder.binding.dmItemTvStartorpause.setProgress((int) (downloadEntity.getPercent() * 10));
statusMap.put(url, DownloadStatus.downloading.getStatus());
notifyItemChanged(mDownloadedList.isEmpty() ? 0 : 1 + mDownloadedList
.size());
DownloadManager.getInstance().resume(downloadEntity, true);
}
});
});
break;
case done:
if (str.equals(mContext.getString(R.string.install))) {
PermissionHelper.checkStoragePermissionBeforeAction(mContext, () -> {
final String path = downloadEntity.getPath();
if (downloadEntity.isPluggable()
&& PackagesManager.isInstalled(downloadEntity.getPackageName())) {
showPluginDialog(downloadEntity.getPath(), downloadEntity.getPluginDesc());
} else {
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mContext, R.string.install_failure_hint);
removeDownload(downloadEntity);
} else {
PackageInstaller.install(mContext, downloadEntity);
}
}
});
PermissionHelper.checkStoragePermissionBeforeAction(
mContext,
downloadEntity.getGameId(),
downloadEntity.getName(),
ExtensionsKt.getCategoryChinese(downloadEntity),
() -> {
final String path = downloadEntity.getPath();
if (downloadEntity.isPluggable()
&& PackagesManager.isInstalled(downloadEntity.getPackageName())) {
showPluginDialog(
downloadEntity.getPath(),
downloadEntity.getPluginDesc(),
downloadEntity.getGameId(),
downloadEntity.getName(),
ExtensionsKt.getGameCategory(downloadEntity),
downloadEntity.getPlatform()
);
} else {
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mContext, R.string.install_failure_hint);
removeDownload(downloadEntity);
} else {
NewFlatLogUtils.INSTANCE.logGameInstall(
downloadEntity.getGameId(),
downloadEntity.getName(),
"主动安装"
);
SensorsBridge.trackInstallGameClick(
downloadEntity.getGameId(),
downloadEntity.getName(),
"主动安装"
);
PackageInstaller.install(mContext, downloadEntity);
}
}
});
} else if (str.equals(mContext.getString(R.string.launch))) {
PackageLauncher.launchApp(mContext, null, downloadEntity.getPackageName());
}
@ -477,8 +529,15 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter<ViewHolder> {
}
// 显示插件化
void showPluginDialog(final String path, final String pluginDesc) {
DialogHelper.showPluginDialog(mContext, pluginDesc, () -> {
void showPluginDialog(
final String path,
final String pluginDesc,
final String gameId,
final String gameName,
final String gameType,
final String platform
) {
DialogHelper.showPluginDialog(mContext, pluginDesc, gameId, gameName, gameType, platform, () -> {
if (FileUtils.isEmptyFile(path)) {
Utils.toast(mContext, R.string.install_failure_hint);
} else {

View File

@ -8,10 +8,7 @@ import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toDrawable
import androidx.recyclerview.widget.RecyclerView
import com.gh.gamecenter.common.constant.ItemViewType
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureEvent.Companion.createEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.common.exposure.IExposable
import com.gh.common.simulator.SimulatorGameManager.isSimulatorGame
import com.gh.common.util.*
@ -19,10 +16,13 @@ import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.viewholder.FooterViewHolder
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.utils.putWidgetBusinessName
import com.gh.gamecenter.common.utils.safelyGetInRelease
import com.gh.gamecenter.feature.databinding.GameItemBinding
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureType
import com.gh.gamecenter.feature.utils.PlatformUtils
import com.gh.gamecenter.feature.game.GameItemViewHolder
import com.gh.gamecenter.manager.PackagesManager

View File

@ -9,23 +9,24 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.setPadding
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureEvent.Companion.createEvent
import com.gh.gamecenter.feature.exposure.ExposureSource
import com.gh.common.exposure.IExposable
import com.gh.common.util.*
import com.gh.common.util.DialogUtils
import com.gh.gamecenter.feature.view.DownloadButton
import com.gh.download.DownloadManager
import com.gh.download.dialog.DownloadDialog
import com.gh.gamecenter.DownloadManagerActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.databinding.LayoutPopupContainerBinding
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.utils.NewFlatLogUtils
import com.gh.gamecenter.common.view.BugFixedPopupWindow
import com.gh.gamecenter.core.utils.CurrentActivityHolder
import com.gh.gamecenter.databinding.*
import com.gh.gamecenter.entity.GameUpdateEntity
import com.gh.gamecenter.eventbus.EBSkip
import com.gh.gamecenter.feature.exposure.ExposureEvent
import com.gh.gamecenter.feature.exposure.ExposureEvent.Companion.createEvent
import com.gh.gamecenter.feature.view.DownloadButton
import com.gh.gamecenter.home.BlankDividerViewHolder
import com.gh.gamecenter.manager.PackagesManager
import com.lightgame.download.DownloadEntity
@ -382,12 +383,17 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) :
return@setOnClickListener
}
(CurrentActivityHolder.getCurrentActivity() as? FragmentActivity)?.checkStoragePermissionBeforeAction {
(CurrentActivityHolder.getCurrentActivity() as? FragmentActivity)?.checkStoragePermissionBeforeAction(
gameId = downloadEntity?.gameId ?: "",
gameName = downloadEntity?.name ?: "",
gameType = downloadEntity?.categoryChinese ?: ""
) {
DialogUtils.checkDownload(
updateBtn.context,
update.size,
downloadEntity?.gameId ?: "",
downloadEntity?.name ?: ""
downloadEntity?.name ?: "",
downloadEntity?.categoryChinese ?: ""
) { isSubscribe: Boolean ->
if (str.contains("")) {
if (update.pluggableCollection != null) {
@ -431,10 +437,21 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) :
updateBtn.progress = (downloadEntity.percent * 10).toInt()
}
} else if (updateBtn.context.getString(R.string.install) == str) {
val download = DownloadManager.getInstance()
.getDownloadEntityByUrl(update.url)
NewFlatLogUtils.logGameInstall(
download?.gameId ?: "",
download?.name ?: "",
"主动安装"
)
SensorsBridge.trackInstallGameClick(
download?.gameId ?: "",
download?.name ?: "",
"主动安装"
)
PackageInstaller.install(
updateBtn.context,
DownloadManager.getInstance()
.getDownloadEntityByUrl(update.url)
downloadEntity
)
} else {
if (downloadEntity != null) {

View File

@ -17,7 +17,6 @@ import com.gh.gamecenter.common.base.GlobalActivityManager.getLastPageEntity
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.retrofit.Response
import com.gh.gamecenter.common.utils.*
import com.gh.gamecenter.common.utils.SensorsBridge.trackEvent
import com.gh.gamecenter.core.utils.GsonUtils.toJson
import com.gh.gamecenter.core.utils.SPUtils
import com.gh.gamecenter.core.utils.UrlFilterUtils
@ -688,8 +687,9 @@ class UpdatableGameViewModel(
// 收集下载数据
DataCollectionUtils.uploadDownload(getApplication(), downloadEntity, "开始")
trackEvent(
SensorsBridge.trackEventWithExposureSource(
"DownloadProcessBegin",
event.source,
"game_id", update.id,
"game_name", update.name ?: "",
"game_type", update.categoryChinese,
@ -698,7 +698,7 @@ class UpdatableGameViewModel(
"page_business_id", getCurrentPageEntity().pageBusinessId,
"last_page_name", getLastPageEntity().pageName,
"last_page_id", getLastPageEntity().pageId,
"last_page_business_id", getLastPageEntity().pageBusinessId
"last_page_business_id", getLastPageEntity().pageBusinessId,
)
}

View File

@ -10,6 +10,7 @@ data class CommonCollectionEntity(
val name: String = "",
val type: String = "",
val style: String = "",
val more: Int = 0,
@SerializedName("home_page_style")
val homePageStyle: String = "horizontal_sliding", //首页样式 横排滑动horizontal_sliding 竖排一行两个1-2
@SerializedName("vertical_line")

View File

@ -1,6 +1,7 @@
package com.gh.gamecenter.entity
import android.os.Parcelable
import com.gh.gamecenter.feature.entity.WelcomeDialogEntity
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize

View File

@ -27,7 +27,8 @@ data class HomeSubSlide(
@SerializedName("card_data")
val cardData: CardData = CardData(),
val image: String = "",
val title: String = ""
val title: String = "",
var sequence: Int = -1 // 本地字段
) {
fun toLinkEntity(): LinkEntity {
return if (linkType.isNotEmpty()) {

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