Compare commits

..

311 Commits

Author SHA1 Message Date
7e350cac41 下载劫持接入MTA,优化下载(有效防止解析包错误) 2018-05-15 19:01:17 +08:00
6e9edabd94 修复登录掉线问题,对接错误统计需求(MTA)光环助手V3.2.2需求汇总 2018-05-11 17:31:43 +08:00
665fbb0f6c PATCH_VERSION_NAME 升级为 3.2.1 2018-05-03 17:39:26 +08:00
fd0921870d 修复3.2的一些bug 2018-05-03 10:34:36 +08:00
0cc78b1055 3.2 tinker base 2018-04-28 14:52:09 +08:00
6dc3b5c382 修复专题分页异常问题 2018-04-27 06:27:29 +08:00
9ac373bf0e 光环助手V3.2 RELEASE(20180427-0410)测试问题汇总 2018-04-27 06:08:15 +08:00
02f96f9083 Merge remote-tracking branch 'origin/dev' into dev 2018-04-27 05:59:14 +08:00
c74997f306 修复切换选择游戏,社区专题会显示到原来的社区再更新为新社区的问题 2018-04-27 05:59:05 +08:00
58d4f22a6b 光环助手V3.2 RELEASE(20180427-0138)测试问题汇总 2018-04-27 03:58:24 +08:00
c5cf1c168e 答案被删除时隐藏收藏和更多按钮 2018-04-27 02:26:24 +08:00
36638a63ca ... 2018-04-27 02:04:06 +08:00
07de30ceea 统一投票样式,选择游戏入口显示小红点 2018-04-27 01:27:13 +08:00
35e15263b0 光环助手V3.2 RELEASE(20180426-2223)测试问题汇总(除2.8.9.10其他完成) 2018-04-27 01:26:03 +08:00
420867378b room数据库版本改为4 2018-04-26 22:41:52 +08:00
0cc183df22 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-26 21:57:56 +08:00
eb557ca9bd 光环助手V3.2 RELEASE(20180426-1800)测试问题汇总(1.2.9.10) 2018-04-26 21:57:44 +08:00
72b39a5982 回答详情回答过快增加 Toast 提醒,移动网络点击所有缩略图后隐藏 [显示大图] 按钮 2018-04-26 21:36:32 +08:00
b96ee6bc19 修复第二次启动光环助手,点击“问答”出现的引导图,点击“我知道了”前面的“我知道”没有反应 2018-04-26 18:06:47 +08:00
684fa318ec 接口limit改为page_size,修复游戏列表下载与详情下载安装判断不一致问题,安装游戏删除addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 2018-04-26 17:09:16 +08:00
29faea14c6 光环助手V3.2 RELEASE(20180424-1820)测试问题汇总(完成部分) 2018-04-25 19:26:47 +08:00
c25f7a13db 游戏搜索以及社区搜索UI微调 2018-04-24 20:10:08 +08:00
715edd77e0 TimestampUtils 修改 2018-04-24 18:31:00 +08:00
25cc825ea6 光环助手V3.2 RELEASE(20180422-1800)测试问题汇总 2018-04-24 17:52:53 +08:00
f7e7819b84 修复UserManager equals判断问题 2018-04-23 17:27:41 +08:00
d305315d7e 光环助手V3.2 RELEASE(20180419-1810)测试问题汇总(完成) 2018-04-23 16:50:36 +08:00
965d756cba 光环助手V3.2 RELEASE(20180419-1810)UI问题汇总 2018-04-23 16:13:05 +08:00
29a19b5df6 光环助手V3.2 RELEASE(20180419-1810)测试问题汇总(运营汇总) 2018-04-23 11:09:00 +08:00
cb2cdd98e8 光环助手V3.2 RELEASE(20180419-1810)测试问题汇总(三.9和评论未完成) 2018-04-22 18:52:08 +08:00
da79a972f7 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-20 17:39:14 +08:00
3c13eff2cf Merge remote-tracking branch 'origin/dev' into dev 2018-04-19 18:36:34 +08:00
7050070310 修复评论弹窗没登录也能提交的问题问题 2018-04-19 18:36:14 +08:00
1dca4e8c0a 光环助手V3.2 RELEASE(20180418-1420)测试问题汇总(完成) 2018-04-19 18:00:23 +08:00
1163e04aaf Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-19 16:49:55 +08:00
73bc256ce6 光环助手V3.2 RELEASE(20180418-1420)测试问题汇总(部分完成) 2018-04-19 16:49:51 +08:00
df78db5686 UI微调 2018-04-19 16:42:08 +08:00
b64ceaf5d4 微调精选推荐的代码结构 2018-04-19 15:38:43 +08:00
eb9b4cd132 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-19 11:35:18 +08:00
b9eec94644 更改 AnswerEntity db key 2018-04-19 11:35:07 +08:00
4e388ec3d7 问答精选数据流修改 2018-04-19 11:13:23 +08:00
a5069789b3 问题/答案/评论 提交时增加限制(5秒内只能提交1次) 2018-04-19 10:59:41 +08:00
3797fd85ad 回答列表补充评论数 2018-04-19 10:43:30 +08:00
f0b0423872 修复新增回答后问题详情页面出现两条相同数据的问题 2018-04-19 09:55:30 +08:00
e5daf1d29f 修复问题详情和回答详情的部分问题 http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/210 2018-04-18 21:19:50 +08:00
2b9f40a976 修复文章列表为空导致的闪退问题 2018-04-18 16:13:01 +08:00
05fbf28d2b 部分接口修改 2018-04-18 14:18:51 +08:00
e54d06def9 签到逻辑修改(保存本地数据库) 2018-04-18 10:12:37 +08:00
840eff3cc4 光环助手V3.2 DEV(20180415-1700)测试问题汇总
http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/207
2018-04-17 15:16:25 +08:00
a0737d0010 fix issues http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/203 2018-04-16 17:57:59 +08:00
9d93df888e 修复已知bug 2018-04-16 10:15:23 +08:00
90fbb235c3 光环助手V3.2 DEV(20180413-2100)测试问题汇总
http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/206
2018-04-15 16:37:44 +08:00
9be884c672 间距调整 2018-04-13 14:36:12 +08:00
550a4cdecf Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-13 14:13:53 +08:00
0d883b76fe 光环助手V3.2 DEV(20180412-1000)测试问题汇总(完成部分) 2018-04-13 14:13:41 +08:00
e3c3101cab Merge remote-tracking branch 'origin/dev' into dev 2018-04-13 11:26:51 +08:00
cce289253d 修复回答详情以及评论列表的一些问题 http://gitlab.ghzhushou.com/pm/issues-Inbox/issues/345 2018-04-13 11:26:32 +08:00
2102dd729c 光环助手V3.2数据统计需求(MTA)(完成) 2018-04-12 18:37:00 +08:00
347a83cf0f 统一DataUtils 2018-04-12 17:08:50 +08:00
1f8d573fad Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-12 16:53:10 +08:00
72b6c2a176 Menu全部初始化放在onActivityCreated,页面间距修改 2018-04-12 16:53:01 +08:00
743e3660e9 微调回答评论列表UI 2018-04-12 15:27:22 +08:00
2ab6a49bec Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-12 14:43:41 +08:00
1e31e13384 修复已知BUG OkHttpNetworkInterceptor去除接口404处理 2018-04-12 14:42:15 +08:00
f77fbe680f 1、回答评论列表答案作者显示作者
2、修复回答详情页查看大图滑动后返回依旧不是大图的问题
2018-04-12 14:19:12 +08:00
53c55a3f36 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-11 21:32:18 +08:00
18d11e3421 删除无用图标 2018-04-11 21:32:10 +08:00
bf42834051 光环助手V3.2 DEV(20180410-1140)测试问题汇总(部分未完成)
光环助手V3.2 DEV(20180410-1140)文案优化(部分未完成)
2018-04-11 21:31:40 +08:00
ee6337276c 回答详情也以及回答列表问题修复 2018-04-11 19:01:06 +08:00
cdc001b43e Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-11 11:19:31 +08:00
f3eeaddec8 光环助手V3.2数据统计需求(登录,问答精选刷新) 2018-04-11 10:45:17 +08:00
b8e1e4e21c 首页-下载,下载列表右边button未与上方全部开始对齐,列表下载条占位往左扣减5dp 2018-04-10 21:07:57 +08:00
64f2c83894 为所有页面添加Activity(为了接入MTA页面访问统计) 2018-04-10 20:50:19 +08:00
f9211e17a1 修改问答评论页UI 2018-04-10 20:09:36 +08:00
f0c952848a 修复部分已知bug 2018-04-10 16:15:07 +08:00
c736068d0e 光环助手V3.2其它优化汇总 2018-04-10 11:34:39 +08:00
e0c9d43f02 重新整理签到 2018-04-09 10:25:12 +08:00
0a4b657a85 修复由于xml id问题导致的打包失败 2018-04-08 18:08:56 +08:00
0121d9601c 游戏求版本ListFragment改造 2018-04-07 17:34:10 +08:00
371a450f5a 首页游戏执行分页操作 2018-04-07 15:38:43 +08:00
2796145d26 我的光环-签到功能优化(完成) 2018-04-07 14:53:28 +08:00
5a662ac72b 升级 OkHttp 依赖来解决 HTTP/2 连接问题 (http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/193) 2018-04-04 16:24:35 +08:00
6cd62cbd0a 回答详情页滑动时显示问题标题 2018-04-04 11:07:42 +08:00
299fa1a107 修复社区相关举报跳转至反馈页面没有提示选项问题 2018-04-02 18:30:43 +08:00
c39ba2e17e issues测试以及整理 2018-04-02 17:51:29 +08:00
414b5b3861 列表点击逻辑修改,助手版本升为3.2 2018-04-02 16:16:49 +08:00
6f89f4acce Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-04-02 14:51:18 +08:00
5f09fd1fa3 问答精选新增专题功能(完成) 2018-04-02 14:51:04 +08:00
00f1b0e8a3 Merge remote-tracking branch 'origin/dev' into dev 2018-04-02 11:14:37 +08:00
4473d0f787 修改回答详情页顶部title 2018-04-02 11:14:25 +08:00
d5255f91d0 修复问题详情闪退问题,修改CheckLoginUtils 2018-04-01 10:04:28 +08:00
57a3479144 问答精选列表数据流刷新(完成) 2018-03-30 18:21:24 +08:00
82c4ebf375 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-03-30 16:03:33 +08:00
23ca884684 所有接口offset改为page(完成) 2018-03-30 16:01:41 +08:00
cdfa999b05 评论弹窗显示条数 2018-03-29 18:28:47 +08:00
224092b30a 根据接口字段变动修改回答评论列表 2018-03-29 18:18:26 +08:00
8daefb2e42 消息中心改造基本完成(还差测试) 2018-03-29 17:51:14 +08:00
c0c0ef979d Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java
2018-03-28 17:28:12 +08:00
6f0738cebb 提问问题/修改问题(完成) 2018-03-28 17:22:24 +08:00
3c352921bb 根据接口变动修改回答详情页细节 2018-03-28 11:53:15 +08:00
4df8f18cc4 V3.2Api接口更改(分页改为page未完成) 2018-03-28 10:01:10 +08:00
120acdefc6 Resolve conflict. 2018-03-27 10:24:00 +08:00
7eb31085b0 修改回答详情评论接口传参 2018-03-27 10:16:51 +08:00
17a3446be4 增加回答详情页菜单选项弹窗 2018-03-26 10:25:07 +08:00
d713c67c9b 我的光环-消息中心改版 2018-03-24 18:33:10 +08:00
76d788ee66 增加部分回答详情评论的接口 2018-03-23 18:09:52 +08:00
1cf13fc2a1 提问页面流程优化(还差接口调试) 2018-03-23 16:44:09 +08:00
de08d4d32d 为回答详情添加评论(增加部分UI 2018-03-22 18:32:09 +08:00
dce3a91156 删除QuestionsDetailActivity 2018-03-22 16:48:17 +08:00
38bf17c932 问题详情与邀请回答优化(完成) 2018-03-22 16:31:02 +08:00
5d0ccb9a34 光环助手V3.2 CTA按钮样式优化方案(完成) 2018-03-21 11:58:15 +08:00
b557afde2c ListRepository add todo 2018-03-21 10:44:58 +08:00
ea9375c20e baseList多接口兼容完成 2018-03-21 10:41:51 +08:00
fa464a9f1d baseList多接口-资讯页面(完成) 2018-03-20 17:33:06 +08:00
b3ff6ea991 baseList多接口-资讯页面(未完成) 2018-03-20 15:22:20 +08:00
f9dbdd4aa8 baseList 兼容多接口列表 2018-03-19 18:15:08 +08:00
21d06d97ef 更改主题色(包括一些按钮的调整) 2018-03-16 18:24:02 +08:00
fb28a49537 所有TabLayout指示器统一长度 2018-03-16 15:31:07 +08:00
d124504d5b 详情(游戏,文章,礼包)下载改造完成 2018-03-15 17:14:34 +08:00
0c69e0c5e5 更改Fragment初始化Toolbar Menu的位置(onCreate ->onActivityCreated) 2018-03-13 16:38:55 +08:00
39aee1ce89 首页+发现+我的光环 页面优化:http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/175(全部完成) 2018-03-13 15:01:01 +08:00
b3fe87b79a 光环助手V3.2 其它UI优化汇总:http://gitlab.ghzhushou.com/pm/halo-app-issues/issues/176(除第二点外其他的完成) 2018-03-13 11:45:56 +08:00
2dfdc17523 Merge branch 'plugin_control' into dev 2018-03-12 17:53:12 +08:00
c208e7f72d 3.1.1封包(0.0) 2018-02-07 21:00:05 +08:00
8722d0a65b 更改BaseList的数据传递和刷新方式 2018-02-07 19:29:47 +08:00
54f044dfa0 修复部分bug 2018-02-07 14:43:40 +08:00
b854a6dfef WebFragment onActivityResult 数据非空判断 2018-02-06 15:42:57 +08:00
badb99da59 tinker 版本升为3.1.1 准备打补丁包 2018-02-05 15:23:32 +08:00
30d99dbe54 修复切换社区时问答页面销毁导致无法更新问题 2018-02-05 15:12:39 +08:00
c44c4e8b2d 修复切换社区时问答页面销毁导致无法更新问题 2018-02-05 15:12:24 +08:00
656b2f469b NormalActivity getMenuItem 非空判断 2018-02-05 15:04:07 +08:00
39e17842cc bug修复 2018-02-05 14:23:31 +08:00
57f7c0bb31 .gitignore增加选项 2018-02-03 17:51:27 +08:00
76b03fa68b list大小判断 2018-02-03 17:47:41 +08:00
c99d6fb16f 适配开启不保留活动模式(未完全适配 只是尽量让app不要崩) 2018-02-03 17:34:00 +08:00
d29ccc0aca toast context判断 禁止context.getString 操作 2018-02-03 10:16:27 +08:00
bf51be498b ImageUtils 非空问题 2018-02-01 16:02:28 +08:00
6d941975e2 toast禁止使用context 2018-02-01 15:27:29 +08:00
0e075d28a5 imageUtils kotlin非空问题 2018-01-31 14:25:40 +08:00
4b5e6b574f 修复列表刷新FooterViewHolder的方式 以及调整邀请达人FooterViewHolder的间距 2018-01-31 10:56:20 +08:00
fc79581f8c NavigationTitle空处理 MessageDetailActivity继承NormalActivity 2018-01-30 20:48:32 +08:00
6176c47e2f 修复已知bug,debug状态关闭数据上报,release增加tinker开发设备(channel:GH_TEST) 2018-01-30 19:45:56 +08:00
9abe0eb158 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-01-30 16:30:13 +08:00
4d7cedb8a6 解决社区游戏选择分页后数据异常问题,解决问题详情无法分页问题 2018-01-30 16:28:34 +08:00
2b02fe06ac Merge remote-tracking branch 'origin/dev' into dev 2018-01-30 11:34:27 +08:00
cd5f530fc6 Add todo. 2018-01-30 11:34:04 +08:00
b9085c7091 修复最新礼包无法下拉刷新问题,appbar在触控屏幕时禁止open/close,部分Fragment commit 替换成commitAllowingStateLoss 2018-01-30 10:38:26 +08:00
679ee71f89 修复channel脚本路劲问题,打tinker基础包 2018-01-28 16:10:12 +08:00
536f0e038a Activity 相关跳转(内部/外部)增加NormalActivity兼容 2018-01-28 15:34:13 +08:00
b087e35b30 修复问答-问题由于调整顺序可能会造成的闪退问题,修复社区-问题由于切换社区造成的数据异常 2018-01-28 14:33:30 +08:00
db3df649ce 优化下载超过100%问题 2018-01-26 16:51:47 +08:00
bb708277b1 修改昵称违规toast文案 2018-01-26 15:43:24 +08:00
c3b694dc6c 优化下载进度超过100%问题 登录相关增加错误toast 2018-01-26 15:34:21 +08:00
b9ff0b1c88 修复下载相关无法即时刷新页面问题 2018-01-25 19:06:04 +08:00
52be8db71f 后台控制关闭插件相关的功能 2018-01-25 17:41:54 +08:00
0e791133dd gradle internal publish 2018-01-24 18:12:01 +08:00
b4f760d69f 社区问题加载... 2018-01-24 18:02:55 +08:00
9bba3c9560 修复问答社区切换时造成数据异常问题 2018-01-24 17:59:49 +08:00
bcd61e87d3 修改草稿后重新刷新我的草稿列表 2018-01-24 11:28:15 +08:00
e8c0e523e6 光环助手V3.1 RELEASE(20180123-1205)测试汇总 2018-01-24 10:53:10 +08:00
af9e9a87b4 去除KEY_DATA, NormalActivity增加适配规则 2018-01-23 17:32:48 +08:00
2d1bb6435f 修复安装/卸载后游戏插件化区域无法更新问题 2018-01-23 14:50:41 +08:00
5680b8508d 问题详情标题去除行数限制 调整标签顺序 2018-01-23 11:00:21 +08:00
df0e9197dc 对话详情回复字数限制,答案/回答详情标题间距修改 2018-01-23 10:21:00 +08:00
79964160ff 发现页面入口点击统计 问答问题修改后刷新问题详情页面 2018-01-22 17:28:45 +08:00
0d46554b66 光环助手V3.1 RELEASE(20180118-2020)测试汇总(完成部分) 2018-01-22 16:07:07 +08:00
2c674896ff tinker脚本修改(internal切到publish) 2018-01-22 09:35:18 +08:00
3ce1f28ae6 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-01-19 11:33:20 +08:00
5ef145ed47 修复InstallUtils卸载事件异常BUG 修复提问时问题标签顺序混乱问题 2018-01-19 11:30:54 +08:00
b478cd6812 Merge remote-tracking branch 'origin/dev' into dev 2018-01-19 11:05:28 +08:00
7e86187132 1.答案编辑页面去处拷贝来的样式
2.增加超出文字字数处理逻辑
2018-01-19 11:04:49 +08:00
58b7a9515f 修复点击取消安装后依然收到安装通知的Bug,删除安装完成自动删除安装包 默认安装后不删除安装包 2018-01-18 18:13:35 +08:00
370b2122aa 解决重复登录 出现多个弹窗问题 2018-01-18 15:35:42 +08:00
c6f1a7d212 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-01-18 14:41:07 +08:00
c04e425550 光环助手V3.1 RELEASE(20180116-1826)测试汇总 补充 2018-01-18 14:40:40 +08:00
19543d7d29 修复了修改回答 Webview 进入时无法滚到页面底部的问题 2018-01-18 09:19:45 +08:00
12af602066 问答相关一些间距调整, 社区搜索增加提问按钮,提问标题字数不足30字且最后字节不是问号的情况下自动增加问号 2018-01-17 16:13:24 +08:00
000515cda7 首页问答增加断网重连 2018-01-17 15:12:05 +08:00
645e5a94a6 调整toolbar menu间距 2018-01-17 14:54:45 +08:00
c2f69eb03d 问题详情我的回答和我来回答图标调换 2018-01-16 18:14:46 +08:00
93a9c41bee Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev
# Conflicts:
#	README.md
2018-01-16 18:07:08 +08:00
02dffc6e22 修复消息小红点问题,修改问题详情刷新方式 2018-01-16 18:04:00 +08:00
2658b7ca93 Add todo. 2018-01-16 17:23:17 +08:00
8c3335a7bf 再次优化图片压缩方式, 提问和反馈(先压缩再显示界面) 2018-01-16 14:18:36 +08:00
c0e7b8e3ee 修复外部跳转NormalFragment失败问题,光环助手V3.1 RELEASE(20180112-0755)测试汇总 2018-01-15 18:37:04 +08:00
9ef3d65aa4 修复回答编辑框默认文案显示异常问题 2018-01-15 16:56:45 +08:00
8d188d4798 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-01-15 14:41:26 +08:00
7bfc84c156 回答详情重命名,外部跳转支持NormalFragment(未测试) 2018-01-15 14:38:58 +08:00
18bc47efe1 图片压缩优化 以及 问题详情页面调整 2018-01-15 11:53:43 +08:00
4593952cc3 把查询发现红点的间隔从60秒改成5分钟 2018-01-15 11:32:55 +08:00
1d3e30f8d3 社区问题页面 ViewPager Adapter 更换 2018-01-13 19:14:58 +08:00
6fef655e44 合并后续 2018-01-13 15:53:19 +08:00
552b81c558 1-12最后部分修改以及合并代码 2018-01-13 15:51:40 +08:00
6c9a4daf9b 修复了发现tab的红点问题 2018-01-12 18:44:57 +08:00
fbc46c54c4 修复社区页面没有登录也能进入提问编辑页面的问题 2018-01-12 14:43:45 +08:00
bc7aaa8b08 1-12修改 2018-01-12 08:26:13 +08:00
95af9902e7 部分UI调整,选择社区和问题详情脚布局调整 2018-01-11 18:15:01 +08:00
f340a13212 光环助手V3.1 DEV(20180109-2100)测试汇总 2018-01-10 21:30:25 +08:00
3d8f17d641 社区回答修改答案上传规则 2018-01-10 16:07:02 +08:00
68f7b0f20f 增加首页-发现和修复部分汇总 2018-01-09 21:22:12 +08:00
c3a3060b92 光环助手V3.1 DEV(20180106-1901)测试汇总(补充) 2018-01-09 14:07:50 +08:00
c01b96298d 光环助手V3.1 DEV(20180106-1901)测试汇总(部分未完成) 2018-01-09 10:49:31 +08:00
26655da185 toolbar统一样式(后续有时间再全部整理) 2018-01-08 11:01:18 +08:00
9d0345303a 重新整理ShareUtils,增加社区相关分享 2018-01-06 18:19:15 +08:00
33d02a0b2e 问题正文,如果超过3行的,要出现查看全文按钮,默认最多只支持显示3行 2018-01-06 17:23:13 +08:00
f301ab694c 所有user_data的SerializedName改为me,答案详情增加“查看大图”按钮 2018-01-06 15:49:31 +08:00
baa6c0db3c 光环助手V3.1 DEV测试汇总(20180104) 2018-01-06 11:43:34 +08:00
d118f54bd3 重新整理ShareUtils,增加社区相关分享 2018-01-05 18:17:39 +08:00
4a7384d371 LogHub增加混淆,修复问题详情无法查看我的答案 2018-01-05 10:55:18 +08:00
6a91b8ae0f Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-01-04 18:24:57 +08:00
b5fddfbbd0 界面调整和部分测试汇总 2018-01-04 18:24:36 +08:00
cfa3ceaae7 RichEditor 增加缩略图控制,图片监听(还差查看大图按钮),相关页面已经接入 2018-01-04 11:09:29 +08:00
7a8f75abfc 问答用户头像圆角,发布问题成功后跳转到问题详情 2018-01-03 14:40:26 +08:00
3db70fcbbe Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2018-01-03 12:05:45 +08:00
7b74d9fe47 fix webview wide viewport 2018-01-03 12:05:15 +08:00
553c211f24 新增问答搜索统计 2018-01-02 17:49:09 +08:00
3b153f5967 增加LogHub 新增问答答案统计, 新增问答问题统计 2018-01-02 17:05:53 +08:00
926b2d070f 修复有草稿箱进去回答答案成功后无法刷新页面问题 2017-12-29 18:24:31 +08:00
3e37731d84 评论关键字标红 答案编辑传参更改 2017-12-29 15:38:25 +08:00
24b5b81279 问答相关非GET请求处理(toast),修复由我的草稿编辑无法评论问题 2017-12-28 19:20:23 +08:00
0534294b82 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2017-12-28 17:26:24 +08:00
a314404b61 更改消息客服接口 2017-12-28 17:26:14 +08:00
71b81b2255 消息中心-消息页面 改造完成 2017-12-28 17:21:32 +08:00
c8cb61436e 问题Tag标签整理(位置调整保持),社区选择回调(刷新界面) 2017-12-28 09:52:04 +08:00
1006bf25c1 1、移除MTA可视化埋点
2、增加TalkingData可视化埋点
2017-12-27 19:20:31 +08:00
cb6f03231e 问答社区相关优化 2017-12-27 16:47:42 +08:00
8ee2308ee1 整理NormalFragment相关代码 2017-12-27 15:02:17 +08:00
719dbeef76 整理页面toolbar,修复开服表跨年显示异常问题 2017-12-26 17:30:59 +08:00
4c34333956 NormalFragment 增加getItemMenu, 修复答案收藏无法反选问题 2017-12-25 18:11:35 +08:00
bff677d607 增加创建社区投票,编辑草稿回调失败问题, gameInfo增加icon 2017-12-25 15:48:15 +08:00
ba1461c874 增加收藏-答案 2017-12-22 15:56:35 +08:00
7a0e885444 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2017-12-21 18:26:10 +08:00
72d4ab6db5 优化我的问答界面以及跳转和其他问答相关页面整理 2017-12-21 18:25:40 +08:00
dfd6b61123 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2017-12-21 17:27:24 +08:00
352d7d032e 1、解决toolbar上面文字的问题。。。简直6
2、解决快传文件的一个bug
2017-12-21 17:01:29 +08:00
ae6ba7832d x 2017-12-21 14:46:08 +08:00
9d63a6d0c4 fix string 2017-12-21 14:45:24 +08:00
e905fb366e 问题精选更改Entity 和点击跳转 2017-12-21 11:33:55 +08:00
27b325f7d9 答案编辑-保存草稿 修复答案收藏和问题关注 2017-12-21 10:49:28 +08:00
5c2f8c60dd 对接问题关注和答案收藏 2017-12-20 19:49:24 +08:00
3ac5905994 增加答案编辑(接口测不通) 2017-12-20 16:55:10 +08:00
0e460b0778 个人中心 增加我的问答 2017-12-20 15:39:00 +08:00
4eea5b99d6 ... 2017-12-19 21:16:38 +08:00
34c60d09f6 问答相关接口测试整理 升级3.1 2017-12-19 18:10:43 +08:00
48e1ee4e7b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java
2017-12-19 16:21:09 +08:00
46863d09a2 问答接口测试 整理 2017-12-19 16:17:48 +08:00
ade08dcbee revert gradle 2017-12-19 15:57:15 +08:00
e9a381068e 1、用户信息相关页面整理 2017-12-19 15:56:32 +08:00
f5a068937a Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2017-12-19 11:21:00 +08:00
c2bc52e474 重构专题页面相关逻辑
其他toolbar逻辑移除
2017-12-19 11:20:47 +08:00
cd4ce2aa6b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java
2017-12-19 09:27:48 +08:00
257e82e825 问答相关接口测试与对接 2017-12-19 09:25:22 +08:00
a705f0ec53 fix gradle.properties 2017-12-18 16:20:17 +08:00
46699a05ce Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2017-12-18 16:00:44 +08:00
9fd1855daa 资讯相关页面的整理 2017-12-18 16:00:30 +08:00
9a96fffd18 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2017-12-18 15:07:36 +08:00
00d6f5e4b1 问题搜索 问题编辑 页面处理 2017-12-18 15:06:52 +08:00
a3adb87a6a (答案-编辑,问答-问题,问答-邀请)功能优化整理 2017-12-17 18:30:32 +08:00
d0c01f1873 问答-答案详情 2017-12-17 14:20:44 +08:00
725d0b217a 优化问答编辑框 2017-12-17 10:10:47 +08:00
1958c6aefb update readme 2017-12-15 18:06:27 +08:00
05be092d69 1、移除部分haloapp的静态变量
2、整理hardcode tag
3、修复NPE
2017-12-15 18:04:56 +08:00
40fccea23a 1、修复libaoactivity、libaodetailactivity崩溃
2、处理部分toolbar
3、处理输入法弹出、隐藏
2017-12-15 17:23:34 +08:00
a022526e7e Merge remote-tracking branch 'origin/temp' into dev 2017-12-15 11:00:08 +08:00
765b4c3afa fix to compile 2017-12-15 10:26:27 +08:00
f704a29b38 Merge remote-tracking branch 'origin/3.1' into dev 2017-12-15 09:57:57 +08:00
309bb98036 选择游戏页面修改 2017-12-14 18:06:09 +08:00
bf7b0b0a82 处理一部分activity的toolbar,已经处理完毕的标记为Deprecated,为了保持MTA数据上报兼容性,暂时未删除对应的Activity 2017-12-14 17:56:54 +08:00
98629c5e85 问答标签同步 2017-12-14 15:38:45 +08:00
461acbd376 答案编辑改进 2017-12-13 18:02:17 +08:00
e0b70b26f3 1、分离datautils,debug release独立逻辑
2、baseactivity toolbar处理(继续处理消除activity)
3、xml处理
2017-12-13 16:47:27 +08:00
4a831f4cb9 优化部分命名问题 2017-12-12 17:55:00 +08:00
b58bbbe705 社区对接接口 2017-12-12 17:13:00 +08:00
dc186e2e6b 部分enum修改 2017-12-12 10:22:16 +08:00
886007eae5 对接部分接口 2017-12-11 18:37:12 +08:00
877ecbaef1 问答相关页面整理 2017-12-11 16:45:09 +08:00
434bfde292 问答-搜索,问答-提问 2017-12-08 18:35:46 +08:00
40c55e716d 问题详情/问题详情-邀请页面/问题详情-回答编辑页面 2017-12-08 14:47:27 +08:00
19e394abb8 问答社区-问题/切换社区-选择游戏/问答社区-调整问题类型顺序 2017-12-06 18:09:11 +08:00
7b95d991d4 问答-问题 2017-12-05 19:18:45 +08:00
4214c08e76 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1
QQ 跳转无法回话问题
2017-12-05 11:02:17 +08:00
180c49f9d3 问答精选基本完成(还差接口) 2017-12-05 11:00:52 +08:00
65e098e1c8 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-12-04 18:48:41 +08:00
3978ab95f4 新增通用列表模块,问答精选 2017-12-04 18:47:53 +08:00
d537cb2383 登录重构(token过期重试部分) 2017-12-02 14:32:08 +08:00
dba866e5c9 登录重构相关 2017-12-01 17:44:09 +08:00
ce36dd4012 登录重构(网络层的token重试未完成, 还有其他登录相关代码的整理) 2017-12-01 16:59:32 +08:00
ea2b9ef4df Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-28 15:45:12 +08:00
a34b101a05 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-28 09:23:56 +08:00
b0fe7595da Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-27 16:39:04 +08:00
6a7ef44bdd 字符串hardcode问题 2017-11-27 16:37:06 +08:00
4131396117 引入constraintLayout 2017-11-24 10:42:53 +08:00
e5f8d959ed Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-23 20:07:25 +08:00
6f0c9e0b59 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-23 20:04:55 +08:00
051e0751a5 禁止用Class SimpleName做bundle的TAG 2017-11-23 10:15:02 +08:00
5f19f55e03 文章详情 相关文章推荐优化 2017-11-22 17:09:35 +08:00
da6cfdc4e8 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-22 15:44:27 +08:00
adbdc55bc4 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-22 15:23:56 +08:00
6c1da15ae4 整理文章详情和游戏详情的文章列表(将布局代码抽离到xml) 2017-11-21 18:31:03 +08:00
ecf05bcd00 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1
# Conflicts:
#	app/src/main/java/com/halo/assistant/HaloApp.java // 设置GH_TEST渠道为Bugly(tinker)开发设备
2017-11-21 17:02:25 +08:00
3baec32ff8 彻底删除小米推送,整理部分TODO 2017-11-21 16:55:45 +08:00
cb95204fac 解决一些hardcode和命名规范 2017-11-21 09:23:33 +08:00
41b940a8e9 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-19 14:29:32 +08:00
3d8d612897 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-19 14:27:09 +08:00
b3297e3fcd 升级最新友盟推送(包含华为小米),删除旧版小米(已包含在友盟) 2017-11-19 14:14:39 +08:00
c8c93cac6e 与3.0.2合并 2017-11-17 10:47:43 +08:00
e68e47e132 增加 baselist 相关 2017-11-11 15:48:10 +08:00
72f9e8ed79 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-11 09:34:43 +08:00
3a2c67152e 字符串hardcode问题 2017-11-11 09:34:01 +08:00
c4c499532a Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into 3.1 2017-11-07 14:57:02 +08:00
d8f043ad71 游戏列表开服信息 重写到ViewHolder类本身 2017-11-02 16:45:36 +08:00
1706ead392 整理已安装的游戏数据表 2017-11-02 15:20:38 +08:00
778 changed files with 35228 additions and 17066 deletions

3
.gitignore vendored
View File

@ -6,4 +6,5 @@ local.properties
.DS_Store
captures/
build/
release-app/
release-app/
scripts/apk-channel/

View File

@ -1,3 +1,5 @@
### Ver 3.1
### Ver 3.0
* 升级账号系统(登录流程/用户信息相关/用户账号相关操作(评论,礼包...))
* 新增收藏功能(文章/工具箱)

View File

@ -1,40 +1,66 @@
# 光环助手Android客户端
### Sourceset/debug/release
### sourcesets/debug/release
* https://developer.android.com/studio/build/build-variants.html#sourcesets
### 多渠道打包配置
### APK打包配置
* 使用[ApkChannelPackage](https://github.com/ltlovezh/ApkChannelPackage)的方案
* 正式打包命令:请使用./gradlew channelPubRelease打包渠道包
* 打包命令,视情况使用:
> 打包Tinker基准包`./scripts/tinker_release_base.sh`
> 以Tinker基准包打渠道包`./scripts/tinker_release_channel.sh`
> 以Tinker基准包打补丁包`./scripts/tinker_release_patch.sh`
### 混淆配置
* 配置文件Android默认配置+proguard-rules.txt等
* 参考libraries下每个项目独立的配置文件``proguard-project.txt``
* 参考libraries下每个项目独立的配置文件`proguard-project.txt`
### apk大小优化
* 限制resConfig资源集
* 开启ShrinkResources
* 开启混淆使用minifyEnabled(仅在release开启
* pngquant对png压缩、png/jpg->webp(未尝试)
### 第三方appkey等配置
* 修改``gradle.properties``文件将各种key填入其中实现统一管理
* 修改`gradle.properties`文件将各种key填入其中实现统一管理
* 通过gradle文件内的resValue/buildConfigField/manifestPlaceHolder方式实现编译期间修改具体情况请参考``./build.gradle``和``./app/build.gradle``配置
### 拉取代码步骤
1. 拉取主项目代码: `git clone -b dev git@gitlab.ghzhushou.com:halo/assistant-android.git`
2. 初始化公用类库: `bash ./scripts/init_submodules.sh`
2. 初始化公用类库: `bash ./scripts/submodules_init.sh`
### submodule管理方式(只拉取master)
* 提交代码需要cd到submodule文件夹去做修改
* 更新远端代码,`bash ./scripts/submodules_update.sh`
### TODO
* GSON 序列化用统一的一个, GsonUtil fromJson
* CleanApkAdapter 转化字符串size工具函数 比如SpeedUtils
* getString 解决 字符串hardcode问题
* Adapter 里面clicklistener 用接口传参将点击操作委托给controller
* Adapter ViewHolder的功能部分重写到ViewHolder类本身
* ~~Adapter 里面clicklistener 用接口传参将点击操作委托给controller~~
* ~~Adapter ViewHolder的功能部分重写到ViewHolder类本身~~
* activity 统一入口未完成(外部入口相关)
* ~~activity 统一入口未完成(外部入口相关)去除多余activity使用统一toolbar~~
* release / debug compile不同的类库不需要再做什么开关
* ~~Toolbar分离有图形按钮/没有图形按钮~~
### TODO Since 3.1
- 解决 Utils 工具类引发的内存泄漏问题
- 把原有 EventBus 的消息 Type 统一到一个文件内
- 明确 MVVM 中 Repository 及其衍生类的具体实现方式
- 将实现细节从 View(Fragment、Activity) 剥离并以 MVVM 结构改造
- 将 ListViewModel 所对应的 ListRepository 合并到 ListViewModel 中
- 依照光环助手界面功能以大模块 - 小模块的方式去修改包结构,包内文件建议以包名摘要作为前缀
- 使用 RxJava 的 Debounce 和 Map 操作优化搜索触发机制 参考资料:[1](https://proandroiddev.com/building-an-autocompleting-edittext-using-rxjava-f69c5c3f5a40),[2](https://medium.com/@kurtisnusbaum/rxandroid-basics-part-2-6e877af352)

View File

@ -9,9 +9,13 @@ apply from: 'tinker-support.gradle'
android {
dataBinding {
enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dexOptions {
@ -140,6 +144,10 @@ android {
}
}
dataBinding {
enabled = true
}
// productFlavors.all { flavor ->
// flavor.manifestPlaceholders = [CHANNEL_VALUE: name]//命令 gradlew assembleRelease
// }
@ -176,9 +184,10 @@ dependencies {
implementation "com.android.support:design:${androidSupport}"
implementation "com.android.support:support-v4:${androidSupport}"
implementation "com.android.support:appcompat-v7:${androidSupport}"
implementation "com.android.support:cardview-v7:${androidSupport}"
implementation "com.android.support:support-annotations:${androidSupport}"
implementation "com.android.support:percent:${androidSupport}"
implementation "com.android.support.constraint:constraint-layout:${constraintLayout}"
implementation "com.kyleduo.switchbutton:library:${switchButton}"
implementation "com.readystatesoftware.systembartint:systembartint:${systemBarTint}"
@ -226,20 +235,29 @@ dependencies {
implementation "com.tencent.bugly:crashreport_upgrade:${buglyTinkerSupport}"
implementation "pub.devrel:easypermissions:${easypermissions}"
// mvvm
implementation "android.arch.lifecycle:runtime:${archLifecycleVersion}"
annotationProcessor "android.arch.lifecycle:compiler:${archLifecycleVersion}"
implementation "android.arch.lifecycle:extensions:${archLifecycleVersion}"
implementation "android.arch.persistence.room:runtime:${archRoomVersion}"
annotationProcessor "android.arch.persistence.room:compiler:${archRoomVersion}"
implementation project(':libraries:MiPush')
implementation 'com.google.android:flexbox:0.2.2'
implementation project(':libraries:LGLibrary')
implementation project(':libraries:MTA')
implementation project(':libraries:QQShare')
implementation project(':libraries:TalkingData')
implementation project(':libraries:UmengPush')
implementation project(':libraries:WechatShare')
implementation project(':libraries:iosched')
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation project(':libraries:LogHub')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
File propFile = file('sign.properties')
if (propFile.exists()) {
def Properties props = new Properties()
Properties props = new Properties()
props.load(new FileInputStream(propFile))
if (props.containsKey('keyAlias') && props.containsKey('keyPassword') &&

View File

@ -140,6 +140,7 @@
-keep class com.gh.common.view.** {*;}
-keep class com.gh.gamecenter.db.info.** {*;}
-keep class com.gh.gamecenter.entity.** {*;}
-keep class com.gh.gamecenter.ask.entity.** {*;}
-keep class com.gh.gamecenter.retrofit.** {*;}
-keep class com.gh.gamecenter.eventbus.** {*;}
-keep class * extends rx.Subscriber

View File

@ -4,7 +4,6 @@ import android.app.Application;
import com.facebook.stetho.Stetho;
import com.facebook.stetho.okhttp3.StethoInterceptor;
import com.lightgame.utils.Utils;
import com.squareup.leakcanary.LeakCanary;
import okhttp3.OkHttpClient;
@ -35,33 +34,11 @@ public class Injection {
}
public static OkHttpClient.Builder provideRetrofitBuilder() {
// HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
//
// @Override
// public void log(String message) {
// //分段打印retrofit日志
// if (message.startsWith("{") || message.startsWith("["))
// if (message.length() > 4000) {
// for (int i = 0; i < message.length(); i += 4000) {
// if (i + 4000 < message.length())
// Utils.log("OkHttp_Body::" + i, message.substring(i, i + 4000));
// else
// Utils.log("OkHttp_Body::" + i, message.substring(i, message.length()));
// }
// } else
// Utils.log("OkHttp_Body::", message);
// }
// });
// loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addNetworkInterceptor(interceptor);
builder.addNetworkInterceptor(new StethoInterceptor());
// if (BuildConfig.DEBUG) {
// builder.addNetworkInterceptor(loggingInterceptor);
// }
return builder;
}

View File

@ -75,15 +75,6 @@
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter >
<!-- MTA可视化启动连接接口 -->
<intent-filter >
<data android:scheme = "${tencentAppScheme}" />
<action android:name = "android.intent.action.VIEW" />
<category android:name = "android.intent.category.DEFAULT" />
<category android:name = "android.intent.category.BROWSABLE" />
</intent-filter >
</activity >
<activity
@ -97,9 +88,8 @@
android:launchMode = "singleTask"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.ViewImageActivity"
android:theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" />
<!--android:theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" 退出时屏幕抖动 -->
<activity android:name = "com.gh.gamecenter.ViewImageActivity" />
<activity
android:name = "com.gh.gamecenter.SearchActivity"
android:configChanges = "keyboardHidden"
@ -235,10 +225,78 @@
<activity
android:name = "com.gh.gamecenter.KaiFuActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.NormalActivity"
android:name = "com.gh.gamecenter.AskSearchActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.AnswerDetailActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.QuestionsDetailActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.AnswerFoldActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.AnswerEditActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.QuestionEditActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.ConcernInfoActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.InfoActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.MessageKeFuActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.CommunitiesSelectActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.CommunitySubjectActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.MessageInviteActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.MessageVoteActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.QuestionsInviteActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.MyAskActivity"
android:screenOrientation = "portrait" />
<activity
android:name = "com.gh.gamecenter.AskTabOrderActivity"
android:screenOrientation = "portrait" />
<!-- 使用小米/华为推送弹窗功能提高推送成功率-->
<activity
android:name = "com.gh.gamecenter.PushProxyActivity"
android:exported = "true"
android:theme = "@android:style/Theme.Translucent" />
<activity
android:name = "com.gh.gamecenter.SkipActivity"
android:theme = "@style/Theme.AppCompat.Light.Fullscreen.Transparent" >
@ -264,13 +322,7 @@
<data android:scheme = "package" />
</intent-filter >
</receiver >
<receiver
android:name = "com.gh.gamecenter.receiver.NotificationReceiver"
android:exported = "false" >
<intent-filter >
<action android:name = "com.gh.gamecenter.NOTIFICATION" />
</intent-filter >
</receiver >
<receiver
android:name = "com.gh.gamecenter.receiver.DownloadReceiver"
android:exported = "false" >

View File

@ -0,0 +1,24 @@
function requestContentFocus() {
$('#editor').focus();
}
function setupWhenContentEditable() {
var editor = $('#editor');
if (!editor[0].hasAttribute('contenteditable')) {
return;
}
// paste 回调只会获取粘贴之前的光标位置,需要自己手动加上粘贴文本的长度,并保证粘贴的是纯文本
editor.on('paste', function(e) {
e.preventDefault();
var text = (e.originalEvent || e).clipboardData.getData('text/plain');
text = text.replace(/\n/g, '<br>');
document.execCommand("insertHTML", false, text);
});
requestContentFocus();
}
$(document).ready(function() {
setupWhenContentEditable();
});

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="user-scalable=no">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="normalize.css">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div id="editor" contenteditable="true"></div>
<script type="text/javascript" src="zepto.min.js"></script>
<script type="text/javascript" src="rich_editor.js"></script>
<script type="text/javascript" src="content.js"></script>
</body>
</html>

413
app/src/main/assets/normalize.css vendored Normal file
View File

@ -0,0 +1,413 @@
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined for any HTML5 element in IE 8/9.
* Correct `block` display not defined for `details` or `summary` in IE 10/11
* and Firefox.
* Correct `block` display not defined for `main` in IE 11.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address `[hidden]` styling not present in IE 8/9/10.
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
*/
[hidden],
template {
display: none;
}
/* Links
========================================================================== */
/**
* Remove the gray background color from active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
*/
b,
strong {
font-weight: bold;
}
/**
* Address styling not present in Safari and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9/10.
*/
img {
border: 0;
}
/**
* Correct overflow not hidden in IE 9/10/11.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari.
*/
figure {
margin: 1em 40px;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
*/
button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/**
* Address `overflow` set to `hidden` in IE 8/9/10/11.
*/
button {
overflow: visible;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
* Correct `select` style inheritance in Firefox.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9/10/11.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9/10/11.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}

View File

@ -0,0 +1,407 @@
/**
* Copyright (C) 2017 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var RE = {};
RE.currentSelection = {
"startContainer": 0,
"startOffset": 0,
"endContainer": 0,
"endOffset": 0};
RE.editor = document.getElementById('editor');
document.addEventListener("selectionchange", function() { RE.backuprange(); });
// Initializations
RE.callback = function() {
window.location.href = "re-callback://" + encodeURI(RE.getHtml());
}
RE.setHtml = function(contents) {
RE.editor.innerHTML = decodeURIComponent(contents.replace(/\+/g, '%20'));
}
RE.getHtml = function() {
return RE.editor.innerHTML;
}
RE.getText = function() {
return RE.editor.innerText;
}
RE.setBaseTextColor = function(color) {
RE.editor.style.color = color;
}
RE.setBaseFontSize = function(size) {
RE.editor.style.fontSize = size;
}
RE.setPadding = function(left, top, right, bottom) {
RE.editor.style.paddingLeft = left;
RE.editor.style.paddingTop = top;
RE.editor.style.paddingRight = right;
RE.editor.style.paddingBottom = bottom;
}
RE.setBackgroundColor = function(color) {
document.body.style.backgroundColor = color;
}
RE.setBackgroundImage = function(image) {
RE.editor.style.backgroundImage = image;
}
RE.setWidth = function(size) {
RE.editor.style.minWidth = size;
}
RE.setHeight = function(size) {
RE.editor.style.height = size;
}
RE.setTextAlign = function(align) {
RE.editor.style.textAlign = align;
}
RE.setVerticalAlign = function(align) {
RE.editor.style.verticalAlign = align;
}
RE.setPlaceholder = function(placeholder) {
RE.editor.setAttribute("placeholder", placeholder);
}
RE.setEditorFocus = function() {
RE.editor.focus();
}
RE.setInputEnabled = function(inputEnabled) {
RE.editor.contentEditable = String(inputEnabled);
}
RE.setFocusByEnd = function() {
//alert("111111")
// var txt =RE.editor.createTextRange();
// ("22222")
// txt.moveStart('character',-1);
// ("333333")
// txt.collapse(true);
// ("444444")
// txt.select();
// alert("ddddddd")
}
RE.undo = function() {
document.execCommand('undo', false, null);
}
RE.redo = function() {
document.execCommand('redo', false, null);
}
RE.setBold = function() {
document.execCommand('bold', false, null);
}
RE.setItalic = function() {
document.execCommand('italic', false, null);
}
RE.setSubscript = function() {
document.execCommand('subscript', false, null);
}
RE.setSuperscript = function() {
document.execCommand('superscript', false, null);
}
RE.setStrikeThrough = function() {
document.execCommand('strikeThrough', false, null);
}
RE.setUnderline = function() {
document.execCommand('underline', false, null);
}
RE.setBullets = function() {
document.execCommand('insertUnorderedList', false, null);
}
RE.setNumbers = function() {
document.execCommand('insertOrderedList', false, null);
}
RE.setTextColor = function(color) {
RE.restorerange();
document.execCommand("styleWithCSS", null, true);
document.execCommand('foreColor', false, color);
document.execCommand("styleWithCSS", null, false);
}
RE.setTextBackgroundColor = function(color) {
RE.restorerange();
document.execCommand("styleWithCSS", null, true);
document.execCommand('hiliteColor', false, color);
document.execCommand("styleWithCSS", null, false);
}
RE.setFontSize = function(fontSize){
document.execCommand("fontSize", false, fontSize);
}
RE.setHeading = function(heading) {
document.execCommand('formatBlock', false, '<h'+heading+'>');
}
RE.setIndent = function() {
document.execCommand('indent', false, null);
}
RE.setOutdent = function() {
document.execCommand('outdent', false, null);
}
RE.setJustifyLeft = function() {
document.execCommand('justifyLeft', false, null);
}
RE.setJustifyCenter = function() {
document.execCommand('justifyCenter', false, null);
}
RE.setJustifyRight = function() {
document.execCommand('justifyRight', false, null);
}
RE.setBlockquote = function() {
document.execCommand('formatBlock', false, '<blockquote>');
}
RE.insertImage = function(url) {
var html = "<div><img src =\"" + url + "\" style=\" max-width: 100%; display:block; margin:8px auto; height: auto;\"></div><br>"
RE.insertHTML(html);
}
RE.replaceTbImage = function() {
var imgs = document.getElementsByTagName("img");
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
if(img.src.indexOf("/tb/") > 0) continue;
var imgArr = img.src.split("/");
var tbImg = ""
for (var j = 0; j < imgArr.length; j++) {
if (j == imgArr.length - 1) {
tbImg += "tb/" + imgArr[j];
} else {
tbImg += imgArr[j] + "/";
}
}
img.style.cssText = "max-width: 30%; display:block; margin:8px auto; height: auto;"
img.src = tbImg;
if (i == 0) {
var bigImg = document.createElement('img');
bigImg.src = "file:///android_asset/web_load_dfimg_icon.png";
bigImg.style.cssText = "max-width: 20%; margin:8px 0 0 0; height: auto;"
img.parentNode.insertBefore(bigImg, img.parentNode.childNodes[0]);
i++;
}
}
}
RE.replaceAllDfImage = function() {
var imgs = document.getElementsByTagName("img");
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
if(img.src.indexOf("web_load_dfimg_icon") > 0) {
img.parentNode.removeChild(img.parentNode.childNodes[0]);
i--;
} else {
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
img.src = img.src.replace("/tb/", "/");
}
}
}
RE.hideShowBigPic = function() {
var imgs = document.getElementsByTagName("img");
var j = 0;
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
if(img.src.indexOf("/tb/") > 0) {
j++;
}
}
if (j == 0) {
RE.replaceAllDfImage();
}
}
RE.replaceDfImageByUrl = function(imgUrl) {
var imgs = document.getElementsByTagName("img");
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
if (img.src == imgUrl) {
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
img.src = img.src.replace("/tb/", "/");
}
}
RE.hideShowBigPic();
}
RE.ImageClickListener = function() {
var imgs = document.getElementsByTagName("img");
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
window.imagelistener.imageArr(img.src);
img.onclick = function() {
window.imagelistener.imageClick(this.src);
}
}
}
RE.insertHTML = function(html) {
RE.restorerange();
document.execCommand('insertHTML', false, html);
}
RE.insertLink = function(url, title) {
RE.restorerange();
var sel = document.getSelection();
if (sel.toString().length == 0) {
document.execCommand("insertHTML",false,"<a href='"+url+"'>"+title+"</a>");
} else if (sel.rangeCount) {
var el = document.createElement("a");
el.setAttribute("href", url);
el.setAttribute("title", title);
var range = sel.getRangeAt(0).cloneRange();
range.surroundContents(el);
sel.removeAllRanges();
sel.addRange(range);
}
RE.callback();
}
RE.setTodo = function(text) {
var html = '<input type="checkbox" name="'+ text +'" value="'+ text +'"/> &nbsp;';
document.execCommand('insertHTML', false, html);
}
RE.prepareInsert = function() {
RE.backuprange();
}
RE.backuprange = function(){
var selection = window.getSelection();
if (selection.rangeCount > 0) {
var range = selection.getRangeAt(0);
RE.currentSelection = {
"startContainer": range.startContainer,
"startOffset": range.startOffset,
"endContainer": range.endContainer,
"endOffset": range.endOffset};
}
}
RE.restorerange = function(){
var selection = window.getSelection();
selection.removeAllRanges();
var range = document.createRange();
range.setStart(RE.currentSelection.startContainer, RE.currentSelection.startOffset);
range.setEnd(RE.currentSelection.endContainer, RE.currentSelection.endOffset);
selection.addRange(range);
}
RE.enabledEditingItems = function(e) {
var items = [];
if (document.queryCommandState('bold')) {
items.push('bold');
}
if (document.queryCommandState('italic')) {
items.push('italic');
}
if (document.queryCommandState('subscript')) {
items.push('subscript');
}
if (document.queryCommandState('superscript')) {
items.push('superscript');
}
if (document.queryCommandState('strikeThrough')) {
items.push('strikeThrough');
}
if (document.queryCommandState('underline')) {
items.push('underline');
}
if (document.queryCommandState('insertOrderedList')) {
items.push('orderedList');
}
if (document.queryCommandState('insertUnorderedList')) {
items.push('unorderedList');
}
if (document.queryCommandState('justifyCenter')) {
items.push('justifyCenter');
}
if (document.queryCommandState('justifyFull')) {
items.push('justifyFull');
}
if (document.queryCommandState('justifyLeft')) {
items.push('justifyLeft');
}
if (document.queryCommandState('justifyRight')) {
items.push('justifyRight');
}
if (document.queryCommandState('insertHorizontalRule')) {
items.push('horizontalRule');
}
var formatBlock = document.queryCommandValue('formatBlock');
if (formatBlock.length > 0) {
items.push(formatBlock);
}
window.location.href = "re-state://" + encodeURI(items.join(','));
}
RE.focus = function() {
var range = document.createRange();
range.selectNodeContents(RE.editor);
range.collapse(false);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
RE.editor.focus();
}
RE.blurFocus = function() {
RE.editor.blur();
}
RE.removeFormat = function() {
document.execCommand('removeFormat', false, null);
}
// Event Listeners
RE.editor.addEventListener("input", RE.callback);
RE.editor.addEventListener("keyup", function(e) {
var KEY_LEFT = 37, KEY_RIGHT = 39;
if (e.which == KEY_LEFT || e.which == KEY_RIGHT) {
RE.enabledEditingItems(e);
}
});
RE.editor.addEventListener("click", RE.enabledEditingItems);

View File

@ -0,0 +1,43 @@
/**
* Copyright (C) 2017 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@charset "UTF-8";
html {
height: 100%;
}
body {
overflow: scroll;
display: table;
table-layout: fixed;
width: 100%;
min-height:100%;
}
#editor {
display: table-cell;
outline: 0px solid transparent;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
}
#editor[placeholder]:empty:not(:focus):before {
content: attr(placeholder);
opacity: .5;
}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

2
app/src/main/assets/zepto.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -11,13 +11,12 @@ import android.util.Log;
import com.gh.common.constant.Config;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.gamecenter.SplashScreenActivity;
import com.lightgame.config.CommonDebug;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.AppManager;
import com.lightgame.utils.Utils;
import com.tencent.stat.StatService;
import com.tendcloud.tenddata.TCAgent;
import java.io.File;
import java.io.FileWriter;
@ -118,23 +117,7 @@ public class AppUncaughtHandler implements UncaughtExceptionHandler {
} catch (Exception e) {
}
// MTA主动上传错误
try {
StatService.reportException(context, throwable);
} catch (Exception e) {
}
// //bugly 作为默认处理异常的类库,已经上报了,此处不重复上报
// try {
// CrashReport.postCatchedException(throwable);
// } catch (Exception e) {
// }
//talkingdata
try {
TCAgent.onError(context, throwable);
} catch (Exception e) {
}
DataUtils.onError(context, throwable);
}

View File

@ -1,11 +1,11 @@
package com.gh.base;
import android.arch.lifecycle.Lifecycle;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DialogUtils;
@ -15,10 +15,11 @@ import com.gh.common.util.ShareUtils;
import com.gh.common.util.StringUtils;
import com.gh.gamecenter.LoginActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SuggestionActivity;
import com.gh.gamecenter.eventbus.EBShowDialog;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.AppManager;
import com.lightgame.utils.Utils;
import com.tencent.tauth.Tencent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@ -26,92 +27,95 @@ import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.lang.ref.WeakReference;
import java.util.List;
import butterknife.ButterKnife;
import pub.devrel.easypermissions.EasyPermissions;
import static com.gh.common.util.EntranceUtils.KEY_DATA;
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
public abstract class BaseActivity extends BaseAppCompatToolBarActivity implements EasyPermissions.PermissionCallbacks{
public abstract class BaseActivity extends BaseToolBarActivity implements EasyPermissions.PermissionCallbacks {
protected String mEntrance;
private boolean mIsPause;
private boolean mIsExistLogoutDialog;
protected final Handler mBaseHandler = new BaseHandler(this);
protected static class BaseHandler extends Handler {
private final WeakReference<BaseActivity> mActivityWeakReference;
BaseHandler(BaseActivity activity) {
mActivityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mActivityWeakReference.get().handleMessage(msg);
}
}
protected void handleMessage(Message msg) {
}
//接收QQ或者QQ空间分享回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == com.tencent.connect.common.Constants.REQUEST_QQ_SHARE
|| requestCode == com.tencent.connect.common.Constants.REQUEST_QZONE_SHARE) {
Tencent.onActivityResultData(requestCode, resultCode, data, ShareUtils.getInstance(this).QqShareListener);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init(mContentView);
AppManager.getInstance().addActivity(this);
EventBus.getDefault().register(this);
ButterKnife.bind(this);
mEntrance = getIntent().getStringExtra(KEY_ENTRANCE);
if (getIntent().getBundleExtra(KEY_DATA) != null) {
mEntrance = getIntent().getBundleExtra(KEY_DATA).getString(KEY_ENTRANCE);
}
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
mBaseHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
@Override
protected boolean onNavigationIconClicked() {
return false;
}
private void init(View contentView) {
setContentView(contentView);
ButterKnife.bind(this);
View back = findViewById(R.id.actionbar_rl_back);
if (back != null)
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
protected void initTitle(String title) {
TextView actionbar_tv_title = (TextView) findViewById(R.id.actionbar_tv_title);
actionbar_tv_title.setText(title);
// setNavigationTitle(title);
onBackPressed();
return true;
}
public void toast(String msg) {
Utils.toast(this, msg);
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
Utils.toast(this, msg);
}
public void toast(int msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
toast(getString(msg));
}
//如果是游戏分享newsTitle默认为空
public void showShare(String url, String gameName, String icon, String newsTitle, ArrayList<String> tag, boolean isToolsBox) {
public void showShare(String url, String icon, String shareTitle, String shareSummary, ShareUtils.ShareType shareType) {
//判断是否是官方版
boolean isPlugin = false;
if (tag != null) {
for (String s : tag) {
if (!"官方版".equals(s)) {
isPlugin = true;
}
}
}
ShareUtils.getInstance(this).showShareWindows(this, getWindow().getDecorView(), url, icon, shareTitle, shareSummary, shareType);
ShareUtils.getInstance(this).showShareWindows(getWindow().getDecorView(), url, gameName, icon, newsTitle, isPlugin, true, isToolsBox);
if (newsTitle == null) {
DataUtils.onEvent(this, "内容分享", gameName);
if (shareType == ShareUtils.ShareType.game || shareType == ShareUtils.ShareType.plugin) {
DataUtils.onEvent(this, "内容分享", shareTitle + shareSummary);
} else {
DataUtils.onEvent(this, "内容分享", newsTitle);
DataUtils.onEvent(this, "内容分享", shareTitle);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(final EBShowDialog showDialog) {
//TODO 改为缓存到UI可见时才调用参考beier-assist
if (!mIsPause && this.getClass().getName().equals(RunningUtils.getTopActivity(this))) {
if ("hijack".equals(showDialog.getType())) {
DialogUtils.showQqSessionDialog(this, "2586716223");// 建议用户联系客服
@ -120,13 +124,15 @@ public abstract class BaseActivity extends BaseAppCompatToolBarActivity implemen
@Override
public void onConfirm() {
if (FileUtils.isEmptyFile(showDialog.getPath())) {
Utils.toast(BaseActivity.this, getString(R.string.install_failure_hint));
toast(R.string.install_failure_hint);
} else {
startActivity(PackageUtils.getUninstallIntent(BaseActivity.this, showDialog.getPath()));
}
}
});
} else if ("loginException".equals(showDialog.getType())) {
if (mIsExistLogoutDialog) return;
mIsExistLogoutDialog = true;
try {
JSONObject object = new JSONObject(showDialog.getPath());
JSONObject device = object.getJSONObject("device");
@ -135,41 +141,36 @@ public abstract class BaseActivity extends BaseAppCompatToolBarActivity implemen
DialogUtils.showAlertDialog(this, "你的账号已在另外一台设备登录"
, StringUtils.buildString("", manufacturer, " - ", model, "")
, "知道了", "重新登录"
, null, new DialogUtils.CancelListener() {
@Override
public void onCancel() {
startActivity(LoginActivity.getIntent(BaseActivity.this, false));
}
});
, null
, () -> startActivity(LoginActivity.getIntent(BaseActivity.this))
);
mBaseHandler.postDelayed(() -> mIsExistLogoutDialog = false, 5000);
} catch (JSONException e) {
e.printStackTrace();
}
} else if ("notfound".equals(showDialog.getType())) {
DialogUtils.showAlertDialog(this, "下载失败", "下载链接已失效,建议提交反馈"
, "立即反馈", "取消"
, () -> {
SuggestionActivity.startSuggestionActivity(this, 4,
null, showDialog.getPath() + ",问题反馈:下载链接失效");
}, null);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
AppManager.getInstance().finishActivity(this);
}
@Override
protected void onPause() {
super.onPause();
// DataUtils.onPause(this);
mIsPause = true;
}
@Override
protected void onResume() {
super.onResume();
// DataUtils.onResume(this);
mIsPause = false;
// DownloadManager.getInstance(this).initGameMap();
}
@Override

View File

@ -1,46 +0,0 @@
package com.gh.base;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import com.gh.gamecenter.R;
import com.lightgame.BaseAppCompatActivity;
/**
* Created by csheng on 15-10-12.
*/
public abstract class BaseAppCompatToolBarActivity extends BaseAppCompatActivity {
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initToolbar();
}
private void initToolbar() {
mToolbar = (Toolbar) findViewById(R.id.toolbar_navigation);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
mToolbar.addView(View.inflate(this, R.layout.reuse_actionbar, null));
getSupportActionBar().setHomeButtonEnabled(false);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
return onNavigationIconClicked();
}
return super.onOptionsItemSelected(item);
}
protected abstract boolean onNavigationIconClicked();
}

View File

@ -15,7 +15,7 @@ import butterknife.ButterKnife;
public abstract class BaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder implements View.OnClickListener {
private T data;
private T mData;
private OnListClickListener mListClickListener;
public BaseRecyclerViewHolder(View itemView) {
@ -25,19 +25,33 @@ public abstract class BaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder
/**
* 具体的设置监听在childViewHolder 设置
*
* @param itemView
* @param data 一般情况下只传列表数据
* @param listClickListener 列表事件接口
*/
public BaseRecyclerViewHolder(View itemView, T data, OnListClickListener listClickListener) {
this(itemView);
this.data = data;
this.mData = data;
this.mListClickListener = listClickListener;
}
public BaseRecyclerViewHolder(View itemView, OnListClickListener listClickListener) {
this(itemView);
this.mListClickListener = listClickListener;
}
public void setClickData(T clickData) {
this.mData = clickData;
}
@Override
public void onClick(View view) {
mListClickListener.onListClick(view, getAdapterPosition(), data);
try {
mListClickListener.onListClick(view, getAdapterPosition(), mData);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,116 @@
package com.gh.base;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.gh.gamecenter.R;
import com.lightgame.BaseAppCompatActivity;
import com.lightgame.OnTitleClickListener;
import com.lightgame.view.TextDrawable;
import java.util.List;
/**
* Created by csheng on 15-10-12.
*/
public abstract class BaseToolBarActivity extends BaseAppCompatActivity {
private Toolbar mToolbar;
private Drawable mToolbarBackground;
private TextView mTitleTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initToolbar();
}
public void setNavigationTitle(@StringRes int title, @ColorRes int color) {
setNavigationTitle(getString(title), ContextCompat.getColor(this, color));
}
public void setNavigationTitle(String title, @ColorInt int color) {
if (mToolbar != null) {
final TextDrawable textDrawable = new TextDrawable(getResources());
textDrawable.setTextColor(color);
textDrawable.setText(title);
if (mToolbarBackground == null) {
mToolbarBackground = mToolbar.getBackground();
}
LayerDrawable drawable = new LayerDrawable(new Drawable[]{mToolbarBackground, textDrawable});
mToolbar.setBackgroundDrawable(drawable);
}
}
@Deprecated
public void setNavigationTitle(String title) {
// if (mTitleTv != null) {
// mTitleTv.setText(title);
// }
if (mToolbar != null && !TextUtils.isEmpty(title)) {
final TextDrawable textDrawable = new TextDrawable(getResources());
textDrawable.setText(title);
if (mToolbarBackground == null) {
mToolbarBackground = mToolbar.getBackground();
}
LayerDrawable drawable = new LayerDrawable(new Drawable[]{mToolbarBackground, textDrawable});
mToolbar.setBackgroundDrawable(drawable);
}
}
public void setNavigationTitle(@StringRes int res) {
setNavigationTitle(getString(res));
}
private void initToolbar() {
mToolbar = findViewById(R.id.toolbar_navigation);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
final View back = mToolbar.findViewById(R.id.actionbar_rl_back);
if (back != null) {
back.setOnClickListener(v -> onBackPressed());
}
mTitleTv = findViewById(R.id.actionbar_tv_title);
mTitleTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
for (Fragment fragment : fragmentList) {
if (fragment instanceof OnTitleClickListener) {
((OnTitleClickListener) fragment).onTitleClick();
}
}
}
});
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
return onNavigationIconClicked();
}
return super.onOptionsItemSelected(item);
}
protected abstract boolean onNavigationIconClicked();
}

View File

@ -6,6 +6,7 @@ import android.os.Bundle;
import com.gh.common.util.DataUtils;
import com.gh.download.DownloadManager;
import com.lightgame.utils.AppManager;
/**
* 1、写点针对生命周期的统计代码
@ -18,10 +19,10 @@ import com.gh.download.DownloadManager;
*/
public class GHActivityLifecycleCallbacksImpl implements ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
AppManager.getInstance().addActivity(activity);
}
@Override
@ -33,6 +34,7 @@ public class GHActivityLifecycleCallbacksImpl implements ActivityLifecycleCallba
public void onActivityResumed(Activity activity) {
DataUtils.onResume(activity);
//FIXME 这里应该只是部分Activity需要
try {
// 初始化gameMap
DownloadManager.getInstance(activity).initGameMap();
@ -58,7 +60,7 @@ public class GHActivityLifecycleCallbacksImpl implements ActivityLifecycleCallba
@Override
public void onActivityDestroyed(Activity activity) {
AppManager.getInstance().finishActivity(activity);
}
}

View File

@ -1,322 +0,0 @@
package com.gh.base;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v4.util.ArrayMap;
import android.text.TextUtils;
import android.widget.RemoteViews;
import com.gh.common.util.AppDebugConfig;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.TokenUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.R;
import com.halo.assistant.HaloApp;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.Utils;
import com.xiaomi.mipush.sdk.ErrorCode;
import com.xiaomi.mipush.sdk.MiPushClient;
import com.xiaomi.mipush.sdk.MiPushCommandMessage;
import com.xiaomi.mipush.sdk.MiPushMessage;
import com.xiaomi.mipush.sdk.PushMessageReceiver;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import static com.gh.common.util.EntranceUtils.ENTRANCE_MIPUSH;
import static com.gh.common.util.EntranceUtils.HOST_ARTICLE;
import static com.gh.common.util.EntranceUtils.HOST_GAME;
import static com.gh.common.util.EntranceUtils.HOST_WEB;
import static com.gh.common.util.EntranceUtils.HOST_COLUMN;
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
import static com.gh.common.util.EntranceUtils.KEY_GAMEID;
import static com.gh.common.util.EntranceUtils.KEY_ID;
import static com.gh.common.util.EntranceUtils.KEY_NEWSID;
import static com.gh.common.util.EntranceUtils.KEY_TARGET;
import static com.gh.common.util.EntranceUtils.KEY_TO;
import static com.gh.common.util.EntranceUtils.KEY_TYPE;
import static com.gh.common.util.EntranceUtils.KEY_URL;
/**
* 1、PushMessageReceiver是个抽象类该类继承了BroadcastReceiver。
* 2、需要将自定义的DemoMessageReceiver注册在AndroidManifest.xml文件中 <receiver
* android:exported="true"
* android:name="com.xiaomi.mipushdemo.DemoMessageReceiver"> <intent-filter>
* <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" /> </intent-filter>
* <intent-filter> <action android:name="com.xiaomi.mipush.ERROR" />
* </intent-filter> <intent-filter> <action
* android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" /></intent-filter>
* </receiver>
* 3、DemoMessageReceiver的onReceivePassThroughMessage方法用来接收服务器向客户端发送的透传消息
* 4、DemoMessageReceiver的onNotificationMessageClicked方法用来接收服务器向客户端发送的通知消息
* 这个回调方法会在用户手动点击通知后触发
* 5、DemoMessageReceiver的onNotificationMessageArrived方法用来接收服务器向客户端发送的通知消息
* 这个回调方法是在通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数
* 6、DemoMessageReceiver的onCommandResult方法用来接收客户端向服务器发送命令后的响应结果
* 7、DemoMessageReceiver的onReceiveRegisterResult方法用来接收客户端向服务器发送注册命令后的响应结果
* 8、以上这些方法运行在非UI线程中
*
* @author mayixiang
* //TODO 请勿更改此类路径,若需更改时请注意更改./libraries/MiPush/proguard-library.txt混淆对应配置
*/
public class GHPushMessageReceiver extends PushMessageReceiver {
private String mAlias;
@Override
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
if (BuildConfig.DEBUG) {
AppDebugConfig.logMethodWithParams(this, message);
}
// 1判断notifyid是否为4
try {
//TODO what is magic number 4?
if (message.getNotifyId() == 4) {
JSONObject jsonObject = new JSONObject(message.getContent());
Utils.log(jsonObject.toString());
String channel = jsonObject.getString("channel");
Utils.log("channel = " + channel);
// 1判断渠道号是否一致或是否为ALL
String packageChannel = HaloApp.getInstance().getChannel();
if ("ALL".equals(channel) || channel.equalsIgnoreCase(packageChannel)) {
String type = jsonObject.getString(KEY_TYPE);
Utils.log("type = " + type);
JSONArray jsonArray;
ArrayMap<String, Boolean> map;
switch (type) {
case "NEWS":
// 新闻推送
jsonArray = jsonObject.getJSONArray("package");
map = getInstalledMapFromLocal(context);
for (int i = 0; i < jsonArray.length(); i++) {
Boolean b = map.get(jsonArray.getString(i));
if (b != null) {
// 显示推送的消息
showNotification(context, jsonObject, 0);
break;
}
}
break;
case "PLUGIN_UPDATE":
// 插件更新推送
jsonArray = jsonObject.getJSONArray("apk");
map = getInstalledMapFromLocal(context);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject apk = jsonArray.getJSONObject(i);
String packageName = apk.getString("package");
Boolean b = map.get(packageName);
if (b != null) {
// 判断是否gh_version是否相同
String gh_version = (String) PackageUtils
.getMetaData(context, packageName, "gh_version");
if (gh_version != null) {
gh_version = gh_version.substring(2);
// 判断gh_version是否相同
if (gh_version.equals(apk.getString("gh_version"))) {
// 判断version是否相同
String version = PackageUtils.getVersionByPackage(context, packageName);
if (apk.getString("version").equals(version)) {
// 版本相同,无需显示插件更新,继续查看是否有可更新的游戏包
continue;
}
}
}
// 显示推送的消息
showNotification(context, jsonObject, 1);
break;
}
}
break;
case "NEW_GAME":
// 新游推送
showNotification(context, jsonObject, 2);
break;
default:
break;
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
private ArrayMap<String, Boolean> getInstalledMapFromLocal(Context context) {
ArrayMap<String, Boolean> map = new ArrayMap<>();
ArrayList<String> list = getAllPackageName(context);
for (String str : list) {
map.put(str, true);
}
return map;
}
private void showNotification(Context context, JSONObject jsonObject, int id) throws JSONException {
Intent intent = new Intent();
intent.setAction("com.gh.gamecenter.NOTIFICATION");
intent.putExtra("notifyId", id);
intent.putExtra("notifyData", jsonObject.toString());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_ONE_SHOT);
NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
RemoteViews remoteViews = null;
if (Build.MANUFACTURER.equals("Meizu") &&
(Build.MODEL.startsWith("m") || Build.MODEL.startsWith("MX"))) {
remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_meizu);
SimpleDateFormat format = new SimpleDateFormat("HH:mm", Locale.getDefault());
remoteViews.setTextViewText(R.id.time, format.format(new Date()));
} else if (Build.MANUFACTURER.equals("Xiaomi") &&
(Build.MODEL.startsWith("MI") || Build.MODEL.startsWith("HM") || Build.MODEL.startsWith("Redmi"))) {
// 小米系统
remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_xiaomi);
SimpleDateFormat format = new SimpleDateFormat("ah:mm", Locale.getDefault());
remoteViews.setTextViewText(R.id.time, format.format(new Date()));
} else if (Build.MANUFACTURER.equals("HUAWEI")) {
// 华为系统
remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_huawei);
}
String url = jsonObject.getString("icon");
String path = context.getCacheDir() + File.separator + url.substring(url.lastIndexOf("/") + 1);
int result = FileUtils.downloadFile(url, path);
if (result != 200) {
// 下载出错使用光环logo
path = null;
}
final NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setTicker(jsonObject.getString("pushTitle"))
.setContentTitle(jsonObject.getString("pushTitle"))
.setContentText(jsonObject.getString("pushDesc"))
.setContentIntent(pendingIntent)
.setDefaults(Notification.DEFAULT_SOUND) // 添加系统默认声音
.setAutoCancel(true); // FLAG_AUTO_CANCEL表明当通知被用户点击时通知将被清除。
if (remoteViews != null) {
if (path == null) {
remoteViews.setImageViewBitmap(R.id.icon, BitmapFactory.decodeResource(context.getResources(), R.drawable.logo));
} else {
remoteViews.setImageViewBitmap(R.id.icon, BitmapFactory.decodeFile(path));
}
remoteViews.setTextViewText(R.id.title, jsonObject.getString("pushTitle"));
remoteViews.setTextViewText(R.id.intro, jsonObject.getString("pushDesc"));
builder.setSmallIcon(R.drawable.logo);
builder.setCustomContentView(remoteViews);
} else {
builder.setSmallIcon(R.drawable.logo_black);
if (path == null) {
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.logo));
} else {
builder.setLargeIcon(BitmapFactory.decodeFile(path));
}
}
nManager.notify(((int) System.currentTimeMillis() / 1000), builder.build());// 通过通知管理器来发起通知。如果id不同则每click在status哪里增加一个提示
}
private ArrayList<String> getAllPackageName(Context context) {
ArrayList<String> list = new ArrayList<>();
List<PackageInfo> packageInfos = context.getPackageManager().getInstalledPackages(0);
for (PackageInfo packageInfo : packageInfos) {
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
list.add(packageInfo.packageName);
}
}
return list;
}
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
if (BuildConfig.DEBUG) {
AppDebugConfig.logMethodWithParams(this, message);
}
try {
String content = message.getContent();
JSONObject response = new JSONObject(content);
Bundle bundle = new Bundle();
bundle.putString(KEY_ENTRANCE, ENTRANCE_MIPUSH);
String type = response.getString(KEY_TYPE);
String target = response.getString(KEY_TARGET);
switch (type) {
case HOST_ARTICLE:
bundle.putString(KEY_TO, "NewsDetailActivity");
bundle.putString(KEY_NEWSID, target);
break;
case HOST_GAME:
bundle.putString(KEY_TO, "GameDetailActivity");
bundle.putString(KEY_GAMEID, target);
break;
case HOST_COLUMN:
bundle.putString(KEY_TO, "SubjectActivity");
bundle.putString(KEY_ID, target);
break;
case HOST_WEB:
bundle.putString(KEY_TO, "WebActivity");
bundle.putString(KEY_URL, target);
break;
}
EntranceUtils.jumpActivity(context, bundle);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
if (BuildConfig.DEBUG) {
AppDebugConfig.logMethodWithParams(this, message);
}
}
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
if (BuildConfig.DEBUG) {
AppDebugConfig.logMethodWithParams(this, message);
}
}
@Override
public void onCommandResult(Context context, MiPushCommandMessage message) {
if (BuildConfig.DEBUG) {
AppDebugConfig.logMethodWithParams(this, message);
}
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mAlias = arguments.get(0);
}
}
if (TextUtils.isEmpty(mAlias)) {
//添加别名
MiPushClient.setAlias(context, TokenUtils.getDeviceId(context), null);
}
}
}

View File

@ -4,6 +4,10 @@ import android.content.Context;
import android.os.Bundle;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.GameDetailActivity;
import com.gh.gamecenter.NewsDetailActivity;
import com.gh.gamecenter.SubjectActivity;
import com.gh.gamecenter.WebActivity;
import com.umeng.message.UmengNotificationClickHandler;
import com.umeng.message.entity.UMessage;
@ -26,19 +30,19 @@ public class GHUmengNotificationClickHandler extends UmengNotificationClickHandl
String target = response.getString(EntranceUtils.KEY_TARGET);
switch (type) {
case EntranceUtils.HOST_ARTICLE:
bundle.putString(EntranceUtils.KEY_TO, "NewsDetailActivity");
bundle.putString(EntranceUtils.KEY_TO, NewsDetailActivity.class.getSimpleName());
bundle.putString(EntranceUtils.KEY_NEWSID, target);
break;
case EntranceUtils.HOST_GAME:
bundle.putString(EntranceUtils.KEY_TO, "GameDetailActivity");
bundle.putString(EntranceUtils.KEY_TO, GameDetailActivity.class.getSimpleName());
bundle.putString(EntranceUtils.KEY_GAMEID, target);
break;
case EntranceUtils.HOST_COLUMN:
bundle.putString(EntranceUtils.KEY_TO, "SubjectActivity");
bundle.putString(EntranceUtils.KEY_TO, SubjectActivity.class.getSimpleName());
bundle.putString(EntranceUtils.KEY_ID, target);
break;
case EntranceUtils.HOST_WEB:
bundle.putString(EntranceUtils.KEY_TO, "WebActivity");
bundle.putString(EntranceUtils.KEY_TO, WebActivity.class.getSimpleName());
bundle.putString(EntranceUtils.KEY_URL, target);
break;
}

View File

@ -1,48 +0,0 @@
//package com.gh.base;
//
//import java.io.Serializable;
//
//public enum SuggestionType implements Serializable {
//
// FEEDBACK("普通反馈", 1),
// SUGGESTION("功能建议", 2),
// CRASH("发生闪退", 3),
// GAME("游戏问题", 4),
// COLLECT("游戏收录", 5),
// POST("文章投稿", 6);
//
// private String mName;
// private int mIndex;
//
// private SuggestionType(String name, int index) {
// mName = name;
// mIndex = index;
// }
//
// public static String getName(int index) {
// for (SuggestionType c : SuggestionType.values()) {
// if (c.mIndex == index) {
// return c.mName;
// }
// }
// return "";
// }
//
// public static int getIndex(String name) {
// for (SuggestionType c : SuggestionType.values()) {
// if (c.mName == name) {
// return c.mIndex;
// }
// }
// return -1;
// }
//
// public int getIndex() {
// return mIndex;
// }
//
// public String getName() {
// return mName;
// }
//
//}

View File

@ -1,5 +1,6 @@
package com.gh.base.adapter;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
@ -14,11 +15,19 @@ public class FragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragmentList;
private List<String> mTitleList;
public FragmentAdapter(FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
this.mFragmentList = fragmentList;
}
public FragmentAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList) {
super(fm);
this.mFragmentList = fragmentList;
this.mTitleList = titleList;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
@ -29,4 +38,12 @@ public class FragmentAdapter extends FragmentPagerAdapter {
return mFragmentList.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
if (mTitleList != null && mTitleList.size() > position) {
return mTitleList.get(position);
}
return super.getPageTitle(position);
}
}

View File

@ -0,0 +1,31 @@
package com.gh.base.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import java.util.List;
/**
* Created by khy on 7/12/28.
*/
public class FragmentStateAdapter extends FragmentStatePagerAdapter {
private List<Fragment> mFragmentList;
public FragmentStateAdapter(FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
this.mFragmentList = fragmentList;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
}

View File

@ -0,0 +1,52 @@
package com.gh.base.fragment;
import android.app.Dialog;
import android.arch.lifecycle.Lifecycle;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.DialogFragment;
import com.gh.gamecenter.R;
import com.lightgame.utils.RuntimeUtils;
import com.lightgame.utils.Utils;
/**
* @author CsHeng
* @Date 17/05/2017
* @Time 4:30 PM
*/
public class BaseDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = new Dialog(getActivity(), R.style.DialogWindowTransparent);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
return dialog;
}
public void toast(@StringRes int res) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
toast(getString(res));
}
public void toast(String msg) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
Utils.toast(getContext(), msg);
}
public void toastLong(@StringRes int msg) {
toastLong(getString(msg));
}
public void toastLong(String msg) {
RuntimeUtils.getInstance().toastLong(getContext(), msg);
}
}

View File

@ -0,0 +1,55 @@
package com.gh.base.fragment;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.gh.gamecenter.R;
/**
* Wrap another fragment with dialog fragment.
*/
public class BaseDialogWrapperFragment extends BaseDialogFragment {
private Fragment mFragmentToWrap;
public static BaseDialogWrapperFragment getInstance(Fragment fragmentToWrap) {
BaseDialogWrapperFragment fragment = new BaseDialogWrapperFragment();
fragment.mFragmentToWrap = fragmentToWrap;
return fragment;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_dialog_wrapper, null);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getChildFragmentManager().beginTransaction().replace(R.id.fragment_placeholder, mFragmentToWrap).commitNowAllowingStateLoss();
}
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setGravity(Gravity.BOTTOM);
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
}

View File

@ -1,17 +1,23 @@
package com.gh.base.fragment;
import android.arch.lifecycle.Lifecycle;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.gh.base.OnListClickListener;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.eventbus.EBMiPush;
import com.lightgame.OnTitleClickListener;
import com.lightgame.utils.RuntimeUtils;
import com.lightgame.utils.Utils;
@ -19,28 +25,59 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.ref.WeakReference;
import java.util.List;
import butterknife.ButterKnife;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
/**
* Created by LGT on 2016/9/4.
* Fragment 基类
*/
public abstract class BaseFragment<T> extends Fragment implements OnRequestCallBackListener<T>,
View.OnClickListener, OnListClickListener{
View.OnClickListener, OnListClickListener, OnTitleClickListener {
// TODO private view
protected View view;
protected View mCachedView;
protected boolean isEverPause;
protected String mEntrance;
protected final Handler mBaseHandler = new BaseFragment.BaseHandler(this);
protected static class BaseHandler extends Handler {
private final WeakReference<BaseFragment> mFragmentWeakReference;
BaseHandler(BaseFragment fragment) {
mFragmentWeakReference = new WeakReference<>(fragment);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mFragmentWeakReference.get().handleMessage(msg);
}
}
protected void handleMessage(Message msg) {
}
@LayoutRes
protected abstract int getLayoutId();
/**
* 提供 Inflated 的 view ,可用于 data binding.
*/
protected View getInflatedLayout() {
return null;
}
/**
* 责任链谁处理了就返回true否则返回super.handleOnClick(View view)
*
@ -55,6 +92,7 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
handleOnClick(v);
}
protected void initView(View view) {
}
@ -70,12 +108,21 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mEntrance = getActivity().getIntent().getStringExtra(EntranceUtils.KEY_ENTRANCE);
final Intent intent = getActivity().getIntent();
mEntrance = intent.getStringExtra(KEY_ENTRANCE);
isEverPause = false;
EventBus.getDefault().register(this);
view = View.inflate(getContext(), getLayoutId(), null);
ButterKnife.bind(this, view);
initView(view);
// For data binding.
if (getInflatedLayout() != null) {
mCachedView = getInflatedLayout();
} else {
mCachedView = View.inflate(getContext(), getLayoutId(), null);
}
ButterKnife.bind(this, mCachedView);
initView(mCachedView);
}
//TODO 尴尬必须的有subscribe才能register
@ -88,9 +135,9 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (container != null) {
container.removeView(view);
container.removeView(mCachedView);
}
return view;
return mCachedView;
}
@Override
@ -108,12 +155,27 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
@Override
public void onDestroy() {
super.onDestroy();
mBaseHandler.removeCallbacksAndMessages(null);
RuntimeUtils.getInstance().removeRunnable();
EventBus.getDefault().unregister(this);
}
public void toast(@StringRes int res) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
toast(getString(res));
}
public void toast(String msg) {
Utils.toast(getContext(), msg);
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
Utils.toast(getContext(), msg);
}
public void toastLong(@StringRes int msg) {
toastLong(getString(msg));
}
public void toastLong(String msg) {
RuntimeUtils.getInstance().toastLong(getContext(), msg);
}
public boolean isEverPause() {
@ -126,7 +188,7 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
}
@Override
public void loadDone(Object obj) {
public void loadDone(T obj) {
}
@ -141,7 +203,7 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
}
@Override
public <T> void onListClick(View view, int position, T data) {
public <LIST> void onListClick(View view, int position, LIST data) {
}
@ -149,4 +211,22 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
// 将所有的Fragment都置为隐藏状态。
protected void hideFragments(FragmentTransaction transaction) {
List<Fragment> list = getChildFragmentManager().getFragments();
for (Fragment fragment : list) {
transaction.hide(fragment);
}
}
@Override
public void onTitleClick() {
List<Fragment> list = getChildFragmentManager().getFragments();
for (Fragment fragment : list) {
if (fragment instanceof OnTitleClickListener) {
((OnTitleClickListener) fragment).onTitleClick();
}
}
}
}

View File

@ -0,0 +1,106 @@
package com.gh.base.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.View;
import com.gh.base.adapter.FragmentAdapter;
import com.gh.common.view.TabIndicatorView;
import com.gh.gamecenter.R;
import com.gh.gamecenter.normal.NormalFragment;
import com.lightgame.view.NoScrollableViewPager;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
/**
* Created by khy on 15/03/18.
*/
public abstract class BaseFragment_TabLayout extends NormalFragment implements ViewPager.OnPageChangeListener {
public static final String PAGE_INDEX = "PAGE_INDEX";
@BindView(R.id.fragment_tab_layout)
protected TabLayout mTabLayout;
@BindView(R.id.fragment_view_pager)
protected NoScrollableViewPager mViewPager;
@BindView(R.id.fragment_tab_indicator)
protected TabIndicatorView mTabIndicatorView;
protected List<Fragment> mFragmentsList;
protected List<String> mTabTitleList;
protected int mCheckedIndex = 0;
protected abstract void initFragmentList(List<Fragment> fragments);
protected abstract void initTabTitleList(List<String> tabTitleList);
protected int provideIndicatorWidth() {
return 65;
}
protected View provideTabView(int position, String tabTitle) {
return null;
}
@Override
protected int getLayoutId() {
return R.layout.fragment_taglyout_viewpager;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) mCheckedIndex = getArguments().getInt(PAGE_INDEX, 0);
mFragmentsList = new ArrayList<>();
initFragmentList(mFragmentsList);
mTabTitleList = new ArrayList<>();
initTabTitleList(mTabTitleList);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewPager.setOffscreenPageLimit(mFragmentsList.size());
mViewPager.addOnPageChangeListener(this);
mViewPager.setAdapter(new FragmentAdapter(getChildFragmentManager(), mFragmentsList, mTabTitleList));
mViewPager.setCurrentItem(mCheckedIndex);
mTabLayout.setupWithViewPager(mViewPager);
mTabIndicatorView.setupWithTabLayout(mTabLayout);
mTabIndicatorView.setupWithViewPager(mViewPager);
mTabIndicatorView.setIndicatorWidth(provideIndicatorWidth());
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
TabLayout.Tab tab = mTabLayout.getTabAt(i);
if (tab == null) continue;
View tabView = provideTabView(i, tab.getText() != null ? tab.getText().toString() : "");
if (tabView == null) continue;
tab.setCustomView(tabView);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
}

View File

@ -19,6 +19,7 @@ import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import com.gh.gamecenter.normal.NormalFragment;
import com.lightgame.adapter.BaseFragmentPagerAdapter;
import com.lightgame.config.CommonDebug;
import com.lightgame.view.DoubleTapTextView;
@ -33,9 +34,9 @@ import java.util.List;
* @author CsHeng
* @date 2013-3-6
*/
public abstract class BaseFragment_ViewPager extends BaseFragment implements DoubleTapTextView.OnDoubleTapListener {
public abstract class BaseFragment_ViewPager extends NormalFragment implements DoubleTapTextView.OnDoubleTapListener {
protected static final String ARGS_INDEX = "index";
public static final String ARGS_INDEX = "index";
protected int mCheckedIndex = 0;
protected PagerAdapter mAdapter;
protected List<Fragment> mFragmentsList;
@ -67,11 +68,6 @@ public abstract class BaseFragment_ViewPager extends BaseFragment implements Dou
mViewPager = (ViewPager) view.findViewById(getViewPagerId());
mViewPager.setOffscreenPageLimit(mFragmentsList.size());
mViewPager.setAdapter(mAdapter);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (mCheckedIndex < mFragmentsList.size()) {
mViewPager.setCurrentItem(mCheckedIndex, false);
}
@ -116,10 +112,15 @@ public abstract class BaseFragment_ViewPager extends BaseFragment implements Dou
}
List<Fragment> fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
Fragment curFragment = fragments.get(mViewPager.getCurrentItem());
curFragment.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : fragments) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
public int getCurrentItem() {
return mViewPager != null ? mViewPager.getCurrentItem() : 0;
}
}

View File

@ -1,7 +1,8 @@
package com.gh.gamecenter.fragment;
package com.gh.base.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -26,6 +27,16 @@ public class WaitingDialogFragment extends BaseDialogFragment {
return fragment;
}
public static WaitingDialogFragment newInstance(String message, boolean isCancelable) {
Bundle args = new Bundle();
args.putString(KEY_MSG, message);
WaitingDialogFragment fragment = new WaitingDialogFragment();
fragment.setArguments(args);
fragment.setCancelable(isCancelable);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -35,4 +46,12 @@ public class WaitingDialogFragment extends BaseDialogFragment {
return view;
}
@Override
public void show(FragmentManager manager, String tag) {
try {
super.show(manager, tag);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,33 @@
package com.gh.base;
import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by khy on 25/04/18.
*/
public abstract class onDoubleTapListener implements View.OnTouchListener {
private GestureDetector mGestureDetector;
public onDoubleTapListener(Context context) {
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
onDoubleTapListener.this.onDoubleTap();
return true;
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
public abstract void onDoubleTap();
}

View File

@ -4,8 +4,16 @@ package com.gh.common.constant;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import com.gh.common.util.GsonUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.entity.SettingsEntity;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Utils;
import java.util.List;
public class Config {
@ -42,9 +50,23 @@ public class Config {
public static final String URL_ARTICLE = "http://www.ghzs666.com/article/"; // TODO ghzs/ghzs666 统一
public static final String PATCHES = "patches";
public static boolean isShow(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean("isShow", true);
private static SettingsEntity mSettingsEntity;
public static boolean isShow() {
// SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
// return sp.getBoolean("isShow", true);
if (!isExistDownloadFilter()) return false;
for (SettingsEntity.Download entity : mSettingsEntity.getDownload()) {
if ("all".equals(entity.getGame())) {
if (entity.isPluginfy() && "normal".equals(entity.getPolicy()) && filterTime(entity.getTime())) {
return true;
}
}
}
return false;
}
public static String getExceptionMsg(Context context) {
@ -56,4 +78,107 @@ public class Config {
PreferenceManager.getDefaultSharedPreferences(context).edit().putString("errMsg", errMsg).apply();
}
public static boolean isShowDownload(String gameId) {
if (TextUtils.isEmpty(gameId) || !isExistDownloadFilter())
return false;
for (SettingsEntity.Download entity : mSettingsEntity.getDownload()) {
if (gameId.equals(entity.getGame())) {
if ("normal".equals(entity.getPolicy()) && filterTime(entity.getTime())) {
return true;
} else {
return false;
}
} else if ("all".equals(entity.getGame())) {
if ("normal".equals(entity.getPolicy()) && filterTime(entity.getTime())) {
return true;
}
}
}
return false;
}
public static boolean isShowPlugin(String gameId) {
if (TextUtils.isEmpty(gameId) || !isExistDownloadFilter())
return false;
for (SettingsEntity.Download entity : mSettingsEntity.getDownload()) {
if (gameId.equals(entity.getGame())) {
if (entity.isPluginfy() && filterTime(entity.getTime())) {
return true;
} else {
return false;
}
} else if ("all".equals(entity.getGame())) {
if (entity.isPluginfy() && filterTime(entity.getTime())) {
return true;
}
}
}
return false;
}
public static boolean isShowPlugin() {
if (!isExistDownloadFilter())
return false;
for (SettingsEntity.Download entity : mSettingsEntity.getDownload()) {
if ("all".equals(entity.getGame())) {
if (entity.isPluginfy() && filterTime(entity.getTime())) {
return true;
}
}
}
return false;
}
private static boolean filterTime(SettingsEntity.Download.TimeEntity timeEntity) {
long end = timeEntity.getEnd();
long start = timeEntity.getStart();
long curTime = Utils.getTime(HaloApp.getInstance().getApplication());
if ((start == 0 || curTime >= start) && (end == 0 || curTime <= end)) {
return true;
}
return false;
}
public static void setSettings(SettingsEntity settingsEntity) {
if (settingsEntity != null && settingsEntity.getSuggestion() != null) {
String s = GsonUtils.Companion.getInstance().toJson(settingsEntity);
}
mSettingsEntity = settingsEntity;
}
public static SettingsEntity getSettings() {
return mSettingsEntity;
}
private static boolean isExistDownloadFilter() {
if (mSettingsEntity == null || mSettingsEntity.getDownload() == null || mSettingsEntity.getDownload().size() == 0) {
return false;
} else {
return true;
}
}
public static void filterPluginArticle(List<NewsEntity> list) {
if (isShowPlugin() || list == null) return;
for (int i = 0; i < list.size(); i++) {
NewsEntity newsEntity = list.get(i);
String title = newsEntity.getTitle();
if (!TextUtils.isEmpty(title) && title.contains("插件")) {
list.remove(i);
i--;
}
}
}
}

View File

@ -10,6 +10,8 @@ public class Constants {
public final static int NOT_NETWORK_CODE = 504; // 没有网络的状态码(应该是这个吧!)
public static final String LOGIN_TOKEN_ID = "userToken_id"; // 用户ID 与服务器无关
//手机号码匹配规则
public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
public static final String REGEX_ACCOUNT = "^[a-zA-Z_]\\w{5,17}$";

View File

@ -24,4 +24,12 @@ public class ItemViewType {
public static final int KC_HINT = 17;
public static final int GAME_PULGIN = 18; // 游戏插件模块
/**
* 普通列表
*/
public static final int ITEM_BODY = 100;
public static final int ITEM_FOOTER = 101;
public static final int ITEM_TOP = 102;
}

View File

@ -0,0 +1,149 @@
package com.gh.common.databind;
import android.databinding.BindingAdapter;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.NewsUtils;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.GameEntity;
/**
* Created by khy on 12/02/18.
*/
public class BindingAdapters {
@BindingAdapter("imageUrl")
public static void loadImage(SimpleDraweeView view, String imageUrl) {
view.setImageURI(imageUrl);
}
@BindingAdapter("visibleGone")
public static void showHide(View view, Boolean show) {
if (show) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
}
}
@BindingAdapter("messageUnread")
public static void setMessageUnread(TextView view, int unreadCount) {
if (unreadCount < 100) {
view.setText(String.valueOf(unreadCount));
} else {
view.setText("99+");
}
}
@BindingAdapter("serverTypePadding")
public static void setServerTypePadding(TextView view, String serverType) {
int paddRight = 0;
if (TextUtils.isEmpty(serverType)) {
} else {
if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) {
if ("删档内测".equals(serverType)) {
paddRight = DisplayUtils.dip2px(view.getContext(), 50);
} else {
paddRight = DisplayUtils.dip2px(view.getContext(), 60);
}
} else {
paddRight = DisplayUtils.dip2px(view.getContext(), 30);
}
}
view.setPadding(0, 0, paddRight, 0);
}
@BindingAdapter("serverType")
public static void setServerType(TextView view, String serverType) {
view.setText(serverType);
if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) {
view.setBackgroundResource(R.drawable.textview_server_tag);
} else {
view.setBackgroundResource(R.drawable.textview_orange_up);
}
}
@BindingAdapter("articleType")
public static void setArticleType(TextView view, String articleType) {
NewsUtils.setNewsType(view, articleType, 0, 0);
}
@BindingAdapter("detailDownloadText")
public static void setDetailDownloadText(TextView view, GameEntity gameEntity) {
if (gameEntity == null || gameEntity.getApk().isEmpty()) {
view.setBackgroundResource(R.drawable.game_item_btn_pause_style);
view.setTextColor(0xFF999999);
view.setClickable(false);
}
}
@BindingAdapter("liBaoBtn")
public static void setLiBaoBtn(TextView view, String status) {
if (TextUtils.isEmpty(status)) return;
switch (status) {
case "coming":
view.setText(R.string.libao_coming);
view.setBackgroundResource(R.drawable.textview_blue_style);
break;
case "ling":
view.setText(R.string.libao_ling);
view.setBackgroundResource(R.drawable.textview_green_style);
break;
case "tao":
view.setText(R.string.libao_tao);
view.setBackgroundResource(R.drawable.textview_orange_style);
break;
case "used_up":
view.setText(R.string.libao_used_up);
view.setBackgroundResource(R.drawable.textview_cancel_up);
break;
case "finish":
view.setText(R.string.libao_finish);
view.setBackgroundResource(R.drawable.textview_cancel_up);
break;
case "linged":
view.setText(R.string.libao_linged);
view.setBackgroundResource(R.drawable.libao_linged_style);
view.setTextColor(ContextCompat.getColorStateList(view.getContext(), R.color.libao_linged_selector));
break;
case "taoed":
view.setText(R.string.libao_taoed);
view.setBackgroundResource(R.drawable.libao_taoed_style);
view.setTextColor(ContextCompat.getColorStateList(view.getContext(), R.color.libao_taoed_selector));
break;
case "copy":
view.setText(R.string.libao_copy);
view.setBackgroundResource(R.drawable.textview_blue_style);
break;
case "repeatLing":
view.setText(R.string.libao_repeat_ling);
view.setBackgroundResource(R.drawable.textview_cancel_up);
break;
case "repeatLinged":
view.setText(R.string.libao_repeat_ling);
view.setBackgroundResource(R.drawable.textview_green_style);
break;
case "repeatTao":
view.setText(R.string.libao_repeat_tao);
view.setBackgroundResource(R.drawable.textview_cancel_up);
break;
case "repeatTaoed":
view.setText(R.string.libao_repeat_tao);
view.setBackgroundResource(R.drawable.textview_orange_style);
break;
case "unshelve":
view.setBackgroundResource(R.drawable.textview_cancel_style);
view.setText(R.string.libao_unshelve);
break;
default:
view.setBackgroundResource(R.drawable.textview_cancel_style);
view.setText("异常");
}
}
}

View File

@ -0,0 +1,90 @@
package com.gh.common.util;
import android.content.Context;
import com.lightgame.utils.Utils;
import org.json.JSONObject;
import retrofit2.HttpException;
/**
* Created by khy on 28/12/17.
*/
public class AskErrorResponseUtils {
public static void errorResponseControl(Context context, HttpException e) {
if (e == null) return;
int code = e.code();
try {
if (code == 403) {
JSONObject object = new JSONObject(e.response().errorBody().string());
int errorCode = object.getInt("code");
switch (errorCode) {
case 403001:
Utils.toast(context, "标签名称太长了");
break;
case 403002:
Utils.toast(context, "已经被邀请了");
break;
case 403003:
Utils.toast(context, "每天最多只能邀请10次");
break;
case 403004:
Utils.toast(context, "客户端提供的ID无效空/无效ID");
break;
case 403005:
Utils.toast(context, "已经回答过了(限制频率)");
break;
case 403006:
Utils.toast(context, "图片数量达到限制点");
break;
case 403007:
Utils.toast(context, "不合法的用户");
break;
case 403008:
Utils.toast(context, "已投票");
break;
case 403009:
Utils.toast(context, "已经收藏过了");
break;
case 403010:
Utils.toast(context, "无效的标签栏");
break;
case 403011:
Utils.toast(context, "标题内容过长");
break;
case 403012:
Utils.toast(context, "描述内容过长");
break;
case 403013:
Utils.toast(context, "无效的标签");
break;
case 403014:
Utils.toast(context, "标签数量太多了");
break;
case 403015:
Utils.toast(context, "已经关注过了");
break;
default:
Utils.toast(context, "网络错误");
break;
}
} else if (code == 401) {
JSONObject object = new JSONObject(e.response().errorBody().string());
int errorCode = object.getInt("code");
if (errorCode == 404001) {
Utils.toast(context, "请求的资源不存在");
}
} else {
Utils.toast(context, "网络错误");
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}

View File

@ -0,0 +1,122 @@
package com.gh.common.util;
import android.content.Context;
import android.provider.Settings;
import android.text.TextUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.ask.entity.Questions;
import com.gh.gamecenter.manager.UserManager;
import com.gh.loghub.LogHubUtils;
import com.halo.assistant.HaloApp;
import com.lightgame.utils.Util_System_Phone_State;
import com.lightgame.utils.Utils;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by khy on 2/01/18.
*/
public class AskLogUtils {
public static void uploadQuestions(Context context, String tracers, Questions questions) {
if (context == null) return;
JSONObject object = new JSONObject();
try {
object.put("community_id", UserManager.getInstance().getCommunityId(context));
object.put("community_name", UserManager.getInstance().getCommunityName(context));
object.put("question_id", questions.getId());
object.put("question_name", questions.getTitle());
object.put("subject", "question");
object.put("tracers", tracers);
} catch (JSONException e) {
e.printStackTrace();
}
upload(context, object);
}
public static void uploadAnswers(Context context, String tracers, Questions questions, String answerId) {
if (context == null) return;
JSONObject object = new JSONObject();
try {
object.put("community_id", UserManager.getInstance().getCommunityId(context));
object.put("community_name", UserManager.getInstance().getCommunityName(context));
object.put("question_id", questions.getId());
object.put("question_name", questions.getTitle());
object.put("subject", "answer");
object.put("tracers", tracers);
object.put("answer_id", answerId);
} catch (JSONException e) {
e.printStackTrace();
}
upload(context, object);
}
public static void uploadSearch(Context context, String searchKey) {
if (TextUtils.isEmpty(searchKey) || context == null) return;
JSONObject object = new JSONObject();
try {
object.put("community_id", UserManager.getInstance().getCommunityId(context));
object.put("community_name", UserManager.getInstance().getCommunityName(context));
object.put("keyword", searchKey);
object.put("subject", "search");
} catch (JSONException e) {
e.printStackTrace();
}
upload(context, object);
}
public static void communityRefresh(Context context, int dataCount) {
if (context == null) return;
JSONObject object = new JSONObject();
try {
object.put("subject", "community_refresh");
object.put("community_id", UserManager.getInstance().getCommunityId(context));
object.put("refresh_type", "recommend");
object.put("data_count", dataCount);
object.put("user_id", UserManager.getInstance().getUserId());
object.put("network", DeviceUtils.getNetwork(context));
} catch (JSONException e) {
e.printStackTrace();
}
upload(context, object);
}
public static void login(Context context, String loginStep, String loginType) {
if (context == null) return;
JSONObject object = new JSONObject();
try {
object.put("subject", "login");
object.put("step", loginStep);
object.put("login_type", loginType);
object.put("network", DeviceUtils.getNetwork(context));
} catch (JSONException e) {
e.printStackTrace();
}
upload(context, object);
}
private static void upload(Context context, JSONObject object) {
if (context == null) return;
try {
object.put("version", BuildConfig.PATCH_VERSION_NAME);
object.put("channel", HaloApp.getInstance().getChannel());
object.put("android_id", Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID));
object.put("imei", Util_System_Phone_State.getDeviceId(context));
object.put("time", Utils.getTime(context));
} catch (JSONException e) {
e.printStackTrace();
}
LogHubUtils.uploadLog(DeviceUtils.getIPAddress(context), object);
}
}

View File

@ -0,0 +1,50 @@
package com.gh.common.util;
import android.text.TextUtils;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by khy on 27/12/17.
*/
public class AskUtils {
public static String voteCountFormat(int voteCount) {
String vote;
if (voteCount >= 10000) {
DecimalFormat df = new DecimalFormat("#.0万");
vote = df.format(voteCount / 10000f);
} else {
vote = String.valueOf(voteCount);
}
return vote;
}
public static String stripHtml(String htmlStr) {
if (TextUtils.isEmpty(htmlStr)) return "";
String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式
String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式
String regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式
Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
Matcher m_script = p_script.matcher(htmlStr);
htmlStr = m_script.replaceAll(""); //过滤script标签
Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
Matcher m_style = p_style.matcher(htmlStr);
htmlStr = m_style.replaceAll(""); //过滤style标签
Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
Matcher m_html = p_html.matcher(htmlStr);
htmlStr = m_html.replaceAll(""); //过滤html标签
return htmlStr.trim(); //返回文本字符串
}
}

View File

@ -9,6 +9,7 @@ import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@ -27,13 +28,16 @@ public class BitmapUtils {
*/
public static boolean savePicture(String newPath, String filePath) {
BitmapFactory.Options options = new BitmapFactory.Options();
// options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
File file = new File(newPath);
int quality = 80;
do {
try {
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, bos);
bos.flush();
@ -51,6 +55,62 @@ public class BitmapUtils {
return true;
}
/**
* 保存图片
*
* @param newPath
* @param filePath
* @return
*/
public static boolean savePicture(String newPath, String filePath, int compressSize) {
if (compressSize > new File(filePath).length()) {
return false;
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, bos);
float zoom = (float) Math.sqrt(compressSize / (float) bos.toByteArray().length);
Matrix matrix = new Matrix();
matrix.setScale(zoom, zoom);
Bitmap result = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bos.reset();
bitmap.recycle();
result.compress(Bitmap.CompressFormat.JPEG, 85, bos);
while (bos.toByteArray().length > compressSize) {
matrix.setScale(0.9f, 0.9f);
result = Bitmap.createBitmap(result, 0, 0, result.getWidth(), result.getHeight(), matrix, true);
bos.reset();
result.compress(Bitmap.CompressFormat.JPEG, 85, bos);
}
File file = new File(newPath);
try {
BufferedOutputStream fbos = new BufferedOutputStream(new FileOutputStream(file));
result.compress(Bitmap.CompressFormat.JPEG, 85, fbos);
fbos.flush();
fbos.close();
result.recycle();
} catch (Exception e) {
file.delete();
e.printStackTrace();
return false;
}
return true;
}
/**
* 根据文件路径返回bitmap
*

View File

@ -5,6 +5,7 @@ import android.content.Intent;
import android.text.TextUtils;
import com.gh.gamecenter.LoginActivity;
import com.gh.gamecenter.manager.UserManager;
/**
* Created by khy on 28/06/17.
@ -12,24 +13,29 @@ import com.gh.gamecenter.LoginActivity;
public class CheckLoginUtils {
public static void checkLogin(final Context context, OnLoggenInListener listener) {
String token = LoginUtils.getToken(context);
if (TextUtils.isEmpty(token)) {
public static void checkLogin(final Context context, OnLoginListener listener) {
// String token = LoginUtils.getToken(context);
if (TextUtils.isEmpty(UserManager.getInstance().getToken())) {
AskLogUtils.login(context, "dialog", null);
DialogUtils.showWarningDialog(context, "登录提示", "需要登录才能使用该功能喔!", "取消", "快速登录",
new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
Intent intent = LoginActivity.getIntent(context, false);
AskLogUtils.login(context, "activity", null);
Intent intent = LoginActivity.getIntent(context);
context.startActivity(intent);
}
}, null);
} else {
listener.onLoggedIn();
listener.onLogin();
}
}
public static boolean isLogin() {
return !TextUtils.isEmpty(UserManager.getInstance().getToken());
}
public interface OnLoggenInListener {
void onLoggedIn();
public interface OnLoginListener {
void onLogin();
}
}

View File

@ -0,0 +1,44 @@
package com.gh.common.util;
import android.util.Log;
public class ClickUtils {
private static long lastClickTime = 0;
private static long DIFF = 800;
private static int lastButtonId = -1;
/**
* 判断两次点击的间隔如果小于800则认为是多次无效点击 * * @return
*/
public static boolean isFastDoubleClick() {
return isFastDoubleClick(-1, DIFF);
}
/**
* 判断两次点击的间隔如果小于800则认为是多次无效点击 * * @return
*/
public static boolean isFastDoubleClick(int buttonId) {
return isFastDoubleClick(buttonId, DIFF);
}
/**
* 判断两次点击的间隔如果小于diff则认为是多次无效点击 * * @param diff * @return
*/
public static boolean isFastDoubleClick(int buttonId, long diff) {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (lastButtonId == buttonId && lastClickTime > 0 && timeD < diff) {
Log.v("isFastDoubleClick", "短时间内按钮多次触发");
return true;
}
lastClickTime = time;
lastButtonId = buttonId;
return false;
}
public static void releaseInterval() {
lastButtonId = 0;
}
}

View File

@ -2,10 +2,9 @@ package com.gh.common.util
import android.content.Context
import com.gh.gamecenter.eventbus.EBCollectionChanged
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import okhttp3.MediaType
import okhttp3.RequestBody
import okhttp3.ResponseBody
import org.greenrobot.eventbus.EventBus
import org.json.JSONObject
@ -20,15 +19,15 @@ import rx.schedulers.Schedulers
object CollectionUtils {
enum class CollectionType {
toolkit, article
toolkit, article, answer
}
fun postCollection(context: Context, content: String, type: CollectionType, listener: OnCollectionListener) {
val body = RequestBody.create(MediaType.parse("application/json"), content)
val postCollection = when (type) {
CollectionType.article -> RetrofitManager.getInstance(context).getApi().postCollectionArticle(body)
CollectionType.toolkit -> RetrofitManager.getInstance(context).getApi().postCollectionTools(body)
CollectionType.article -> RetrofitManager.getInstance(context).getApi().postCollectionArticle(UserManager.getInstance().userId, content)
CollectionType.toolkit -> RetrofitManager.getInstance(context).getApi().postCollectionTools(UserManager.getInstance().userId, content)
CollectionType.answer -> RetrofitManager.getInstance(context).getApi().postCollectionAnswer(UserManager.getInstance().userId, content)
}
postCollection
.subscribeOn(Schedulers.io())
@ -37,7 +36,8 @@ object CollectionUtils {
override fun onResponse(response: ResponseBody?) {
super.onResponse(response)
listener.onSuccess()
EventBus.getDefault().post(EBCollectionChanged(JSONObject(content).getString("_id"), true, type))
if(type != CollectionType.answer)
EventBus.getDefault().post(EBCollectionChanged(content, true, type))
}
override fun onFailure(e: HttpException?) {
@ -46,7 +46,7 @@ object CollectionUtils {
try {
val string = e.response()?.errorBody()?.string()
val errorBody = JSONObject(string)
if (errorBody.getInt("status") == 40031) {
if (errorBody.getInt("detail") == 403009) {
listener.onSuccess()
return
}
@ -63,8 +63,9 @@ object CollectionUtils {
val postCollection: Observable<ResponseBody>
when (type) {
CollectionType.article -> postCollection = RetrofitManager.getInstance(context).getApi().deletaCollectionArticle(id)
CollectionType.toolkit -> postCollection = RetrofitManager.getInstance(context).getApi().deleteCollectionTools(id)
CollectionType.article -> postCollection = RetrofitManager.getInstance(context).getApi().deletaCollectionArticle(UserManager.getInstance().userId, id)
CollectionType.toolkit -> postCollection = RetrofitManager.getInstance(context).getApi().deleteCollectionTools(UserManager.getInstance().userId, id)
CollectionType.answer -> postCollection = RetrofitManager.getInstance(context).getApi().deleteCollectionAnswer(UserManager.getInstance().userId, id)
}
postCollection
.subscribeOn(Schedulers.io())
@ -73,6 +74,7 @@ object CollectionUtils {
override fun onResponse(response: ResponseBody?) {
super.onResponse(response)
listener.onSuccess()
if(type != CollectionType.answer)
EventBus.getDefault().post(EBCollectionChanged(id, false, type))
}
@ -84,14 +86,17 @@ object CollectionUtils {
}
fun patchCollection(context: Context, id: String, type: CollectionType) {
val postCollection = when (type) {
CollectionType.article -> RetrofitManager.getInstance(context).getApi().patchCollectionArticle(id)
CollectionType.toolkit -> RetrofitManager.getInstance(context).getApi().patchCollectionTools(id)
}
postCollection
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ResponseBody>() {})
// val postCollection = when (type) {
// CollectionType.article -> RetrofitManager.getInstance(context).getApi().patchCollectionArticle(id)
// CollectionType.toolkit -> RetrofitManager.getInstance(context).getApi().patchCollectionTools(id)
// else -> {
// return
// }
// }
// postCollection
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(object : Response<ResponseBody>() {})
}

View File

@ -1,6 +1,7 @@
package com.gh.common.util;
import android.app.Dialog;
import android.content.ClipboardManager;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.content.ContextCompat;
@ -19,6 +20,7 @@ import com.gh.gamecenter.adapter.viewholder.CommentViewHolder;
import com.gh.gamecenter.entity.CommentEntity;
import com.gh.gamecenter.entity.UserDataEntity;
import com.gh.gamecenter.entity.UserInfoEntity;
import com.gh.gamecenter.manager.UserManager;
import com.lightgame.utils.Utils;
import org.json.JSONException;
@ -69,7 +71,7 @@ public class CommentUtils {
}
}
public static void showReportDialog(final CommentEntity commentEntity, final Context context,
public static void showReportDialog(final CommentEntity commentEntity, final Context context, final boolean showConversation,
final OnCommentCallBackListener listener, final String newsId) {
final Dialog dialog = new Dialog(context);
@ -88,7 +90,7 @@ public class CommentUtils {
dialogType.add("复制");
dialogType.add("举报");
if (commentEntity.getParent() != null) {
if (commentEntity.getParent() != null && showConversation) {
dialogType.add("查看对话");
}
@ -111,33 +113,25 @@ public class CommentUtils {
dialog.cancel();
switch (reportTv.getText().toString()) {
case "回复":
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
@Override
public void onLoggedIn() {
if (listener != null) {
listener.onCommentCallback(commentEntity);
} else if (!TextUtils.isEmpty(newsId)) {
context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, newsId));
} else {
Utils.toast(context, "缺少关键属性");
}
CheckLoginUtils.checkLogin(context, () -> {
if (listener != null) {
listener.onCommentCallback(commentEntity);
} else if (!TextUtils.isEmpty(newsId)) {
context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, newsId));
} else {
Utils.toast(context, "缺少关键属性");
}
});
break;
case "复制":
LibaoUtils.copyLink(commentEntity.getContent(), context);
copyText(commentEntity.getContent(), context);
break;
case "举报":
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
@Override
public void onLoggedIn() {
showReportTypeDialog(commentEntity, context);
}
});
CheckLoginUtils.checkLogin(context, () -> showReportTypeDialog(commentEntity, context));
break;
case "查看对话":
context.startActivity(CommentDetailActivity.getCommentDetailIntent(context, commentEntity.getId()));
context.startActivity(CommentDetailActivity.getIntent(context, commentEntity.getId()));
break;
}
}
@ -150,27 +144,147 @@ public class CommentUtils {
}
private static void showReportTypeDialog(final CommentEntity commentEntity, final Context mContext) {
public static void showAnswerCommentOptions(final CommentEntity commentEntity, final Context context,
final OnCommentCallBackListener listener, final String id, boolean showConversation, String answerId) {
final Dialog dialog = new Dialog(context);
LinearLayout container = new LinearLayout(context);
container.setOrientation(LinearLayout.VERTICAL);
container.setBackgroundColor(Color.WHITE);
container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12));
List<String> dialogType = new ArrayList<>();
if (commentEntity.getUserData() == null || !commentEntity.getUserData().isAnswerCommented()) {
dialogType.add("回复");
}
dialogType.add("复制");
dialogType.add("举报");
if (commentEntity.getParentUser() != null && showConversation) {
dialogType.add("查看对话");
}
for (String s : dialogType) {
final TextView reportTv = new TextView(context);
reportTv.setText(s);
reportTv.setTextSize(17);
reportTv.setTextColor(ContextCompat.getColor(context, R.color.title));
reportTv.setBackgroundResource(R.drawable.textview_white_style);
int widthPixels = context.getResources().getDisplayMetrics().widthPixels;
reportTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10,
LinearLayout.LayoutParams.WRAP_CONTENT));
reportTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12),
0, DisplayUtils.dip2px(context, 12));
container.addView(reportTv);
reportTv.setOnClickListener(v -> {
dialog.cancel();
switch (reportTv.getText().toString()) {
case "回复":
CheckLoginUtils.checkLogin(context, () -> {
if (listener != null) {
listener.onCommentCallback(commentEntity);
} else if (!TextUtils.isEmpty(id)) {
context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, id));
} else {
Utils.toast(context, "缺少关键属性");
}
});
break;
case "复制":
copyText(commentEntity.getContent(), context);
break;
case "举报":
CheckLoginUtils.checkLogin(context, () -> showAnswerReportDialog(answerId, commentEntity, context));
break;
case "查看对话":
context.startActivity(CommentDetailActivity.getAnswerCommentIntent(context, commentEntity.getId(), answerId));
break;
}
});
}
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(container);
dialog.show();
}
private static void showAnswerReportDialog(final String answerId, final CommentEntity commentEntity, final Context context) {
final String[] arrReportType = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息",
"违法有害信息", "其它"};
int widthPixels = mContext.getResources().getDisplayMetrics().widthPixels;
int widthPixels = context.getResources().getDisplayMetrics().widthPixels;
final Dialog reportTypeDialog = new Dialog(mContext);
LinearLayout container = new LinearLayout(mContext);
final Dialog reportTypeDialog = new Dialog(context);
LinearLayout container = new LinearLayout(context);
container.setOrientation(LinearLayout.VERTICAL);
container.setPadding(0, DisplayUtils.dip2px(mContext, 12), 0, DisplayUtils.dip2px(mContext, 12));
container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12));
container.setBackgroundColor(Color.WHITE);
for (final String s : arrReportType) {
TextView reportTypeTv = new TextView(mContext);
TextView reportTypeTv = new TextView(context);
reportTypeTv.setText(s);
reportTypeTv.setTextSize(17);
reportTypeTv.setTextColor(ContextCompat.getColor(mContext, R.color.title));
reportTypeTv.setTextColor(ContextCompat.getColor(context, R.color.title));
reportTypeTv.setBackgroundResource(R.drawable.textview_white_style);
reportTypeTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10,
LinearLayout.LayoutParams.WRAP_CONTENT));
reportTypeTv.setPadding(DisplayUtils.dip2px(mContext, 20), DisplayUtils.dip2px(mContext, 12),
0, DisplayUtils.dip2px(mContext, 12));
reportTypeTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12),
0, DisplayUtils.dip2px(context, 12));
container.addView(reportTypeTv);
reportTypeTv.setOnClickListener(v -> {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("reason", s);
} catch (JSONException e) {
e.printStackTrace();
}
PostCommentUtils.postAnswerReportData(context, commentEntity.getId(), answerId, jsonObject.toString(),
new PostCommentUtils.PostCommentListener() {
@Override
public void postSuccess(JSONObject response) {
Utils.toast(context, "感谢您的举报");
}
@Override
public void postFailed(Throwable error) {
Utils.toast(context, error.toString());
}
});
reportTypeDialog.cancel();
});
}
reportTypeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
reportTypeDialog.setContentView(container);
reportTypeDialog.show();
}
private static void showReportTypeDialog(final CommentEntity commentEntity, final Context context) {
final String[] arrReportType = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息",
"违法有害信息", "其它"};
int widthPixels = context.getResources().getDisplayMetrics().widthPixels;
final Dialog reportTypeDialog = new Dialog(context);
LinearLayout container = new LinearLayout(context);
container.setOrientation(LinearLayout.VERTICAL);
container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12));
container.setBackgroundColor(Color.WHITE);
for (final String s : arrReportType) {
TextView reportTypeTv = new TextView(context);
reportTypeTv.setText(s);
reportTypeTv.setTextSize(17);
reportTypeTv.setTextColor(ContextCompat.getColor(context, R.color.title));
reportTypeTv.setBackgroundResource(R.drawable.textview_white_style);
reportTypeTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10,
LinearLayout.LayoutParams.WRAP_CONTENT));
reportTypeTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12),
0, DisplayUtils.dip2px(context, 12));
container.addView(reportTypeTv);
reportTypeTv.setOnClickListener(new View.OnClickListener() {
@ -184,16 +298,16 @@ public class CommentUtils {
e.printStackTrace();
}
PostCommentUtils.addReportData(mContext, jsonObject.toString(),
PostCommentUtils.addReportData(context, commentEntity.getId(), jsonObject.toString(),
new PostCommentUtils.PostCommentListener() {
@Override
public void postSuccess(JSONObject response) {
Utils.toast(mContext, "感谢您的举报");
Utils.toast(context, "感谢您的举报");
}
@Override
public void postFailed(Throwable error) {
Utils.toast(mContext, "举报失败,请检查网络设置");
Utils.toast(context, "举报失败,请检查网络设置");
}
});
reportTypeDialog.cancel();
@ -208,59 +322,111 @@ public class CommentUtils {
public static void postVote(final Context context, final CommentEntity commentEntity,
final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) {
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
@Override
public void onLoggedIn() {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) {
Utils.toast(context, "已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme));
commentLikeIv.setImageResource(R.drawable.ic_like_select);
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
commentLikeCountTv.setVisibility(View.VISIBLE);
PostCommentUtils.addCommentVoto(context, commentEntity.getId(),
new PostCommentUtils.PostCommentListener() {
@Override
public void postSuccess(JSONObject response) {
if (listener != null) {
listener.onVote();
}
}
@Override
public void postFailed(Throwable e) {
commentEntity.setVote(commentEntity.getVote() - 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
commentLikeIv.setImageResource(R.drawable.ic_like_unselect);
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
if (commentEntity.getVote() == 0) {
commentLikeCountTv.setVisibility(View.GONE);
} else {
commentLikeCountTv.setVisibility(View.VISIBLE);
}
if (e instanceof HttpException) {
HttpException exception = (HttpException) e;
if (exception.code() == 403) {
try {
String detail = new JSONObject(exception.response().errorBody().string()).getString("detail");
if ("voted".equals(detail)) {
Utils.toast(context, "已经点过赞啦!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
return;
}
}
Utils.toast(context, "网络异常,点赞失败");
}
});
CheckLoginUtils.checkLogin(context, () -> {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) {
Utils.toast(context, "已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme));
commentLikeIv.setImageResource(R.drawable.ic_like_select);
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
commentLikeCountTv.setVisibility(View.VISIBLE);
PostCommentUtils.addCommentVoto(context, commentEntity.getId(),
new PostCommentUtils.PostCommentListener() {
@Override
public void postSuccess(JSONObject response) {
if (listener != null) {
listener.onVote();
}
}
@Override
public void postFailed(Throwable e) {
commentEntity.setVote(commentEntity.getVote() - 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
commentLikeIv.setImageResource(R.drawable.ic_like_unselect);
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
if (commentEntity.getVote() == 0) {
commentLikeCountTv.setVisibility(View.GONE);
} else {
commentLikeCountTv.setVisibility(View.VISIBLE);
}
if (e instanceof HttpException) {
HttpException exception = (HttpException) e;
if (exception.code() == 403) {
try {
String detail = new JSONObject(exception.response().errorBody().string()).getString("detail");
if ("voted".equals(detail)) {
Utils.toast(context, "已经点过赞啦!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
return;
}
}
Utils.toast(context, "网络异常,点赞失败");
}
});
});
}
public static void postVoteToAnswerComment(final Context context, String answerId, final CommentEntity commentEntity,
final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) {
CheckLoginUtils.checkLogin(context, () -> {
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) {
Utils.toast(context, "已经点过赞啦!");
return;
}
commentEntity.setVote(commentEntity.getVote() + 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme));
commentLikeIv.setImageResource(R.drawable.ic_like_select);
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
commentLikeCountTv.setVisibility(View.VISIBLE);
PostCommentUtils.voteAnswerComment(context, answerId, commentEntity.getId(),
new PostCommentUtils.PostCommentListener() {
@Override
public void postSuccess(JSONObject response) {
if (listener != null) {
listener.onVote();
}
}
@Override
public void postFailed(Throwable e) {
commentEntity.setVote(commentEntity.getVote() - 1);
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
commentLikeIv.setImageResource(R.drawable.ic_like_unselect);
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
if (commentEntity.getVote() == 0) {
commentLikeCountTv.setVisibility(View.GONE);
} else {
commentLikeCountTv.setVisibility(View.VISIBLE);
}
if (e instanceof HttpException) {
HttpException exception = (HttpException) e;
if (exception.code() == 403) {
try {
String detail = new JSONObject(exception.response().errorBody().string()).getString("detail");
if ("voted".equals(detail)) {
Utils.toast(context, "已经点过赞啦!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
return;
}
}
Utils.toast(context, "网络异常,点赞失败");
}
});
});
}
@ -274,7 +440,7 @@ public class CommentUtils {
if (entity.getVote() == 0) {
holder.commentLikeCountTv.setVisibility(View.GONE);
} else { // 检查是否已点赞
if (userDataEntity != null && userDataEntity.isCommentVoted()) {
if (userDataEntity != null && (userDataEntity.isCommentVoted() || userDataEntity.isAnswerCommentVoted())) {
holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.theme));
holder.commentLikeIv.setImageResource(R.drawable.ic_like_select);
}
@ -283,12 +449,20 @@ public class CommentUtils {
}
//检查是否是自身评论
UserInfoEntity userInfo = LoginUtils.getUserInfo(mContext);
UserInfoEntity userInfo = UserManager.getInstance().getUserInfoEntity();
if (userDataEntity != null && userDataEntity.isCommentOwn() && userInfo != null) {
holder.commentUserNameTv.setText(userInfo.getName());
if (entity.getUserData() != null && entity.getUserData().isAnswerOwn()) {
holder.commentUserNameTv.setText(userInfo.getName() + "(作者)");
} else {
holder.commentUserNameTv.setText(userInfo.getName());
}
ImageUtils.Companion.display(holder.commentUserIconDv, userInfo.getIcon());
} else {
holder.commentUserNameTv.setText(entity.getUser().getName());
if (entity.getUserData() != null && entity.getUserData().isAnswerOwn()) {
holder.commentUserNameTv.setText(entity.getUser().getName() + "(作者)");
} else {
holder.commentUserNameTv.setText(entity.getUser().getName());
}
if (TextUtils.isEmpty(entity.getUser().getIcon())) {
ImageUtils.Companion.display(holder.commentUserIconDv, R.drawable.user_default_icon_comment);
} else {
@ -297,6 +471,15 @@ public class CommentUtils {
}
}
//复制文字
public static void copyText(String copyContent, Context context) {
ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(copyContent);
Utils.toast(context, "复制成功");
}
public interface OnVoteListener {
void onVote();
}

View File

@ -2,6 +2,7 @@ package com.gh.common.util
import android.content.Context
import com.gh.gamecenter.eventbus.EBConcernChanged
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import okhttp3.MediaType
@ -20,14 +21,14 @@ import rx.schedulers.Schedulers
object ConcernUtils {
fun postConcernGameId(context: Context, gameId: String, listener: onConcernListener?) {
val params = JSONArray()
params.put(gameId)
val body = RequestBody.create(MediaType.parse("application/json"), params.toString())
// val params = JSONArray()
// params.put(gameId)
// val body = RequestBody.create(MediaType.parse("application/json"), params.toString())
RetrofitManager.getInstance(context).getApi()
.postConcern(body)
.postConcern(UserManager.getInstance().userId, gameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ResponseBody>(){
.subscribe(object : Response<ResponseBody>() {
override fun onResponse(response: ResponseBody?) {
super.onResponse(response)
listener?.onSuccess()
@ -43,10 +44,10 @@ object ConcernUtils {
fun deleteConcernData(context: Context, gameId: String, listener: onConcernListener?) {
RetrofitManager.getInstance(context).getApi()
.deleteConcern(gameId)
.deleteConcern(UserManager.getInstance().userId, gameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ResponseBody>(){
.subscribe(object : Response<ResponseBody>() {
override fun onResponse(response: ResponseBody?) {
super.onResponse(response)
listener?.onSuccess()
@ -64,7 +65,7 @@ object ConcernUtils {
val body = RequestBody.create(MediaType.parse("application/json"),
data.toString())
RetrofitManager.getInstance(context).getApi()
.putConcern(body)
.putConcern(UserManager.getInstance().userId, body)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(object : Response<ResponseBody>() {
@ -75,6 +76,44 @@ object ConcernUtils {
})
}
fun deleteConcernQuestions(context: Context, questionsId: String, listener: onConcernListener?) {
RetrofitManager.getInstance(context).getApi()
.deleteConcernQuestions(UserManager.getInstance().userId, questionsId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ResponseBody>() {
override fun onResponse(response: ResponseBody?) {
super.onResponse(response)
listener?.onSuccess()
}
override fun onFailure(e: HttpException?) {
super.onFailure(e)
listener?.onError()
AskErrorResponseUtils.errorResponseControl(context, e)
}
})
}
fun postConcernQuestions(context: Context, questionsId: String, listener: onConcernListener?) {
RetrofitManager.getInstance(context).getApi()
.postConcernQuestions(UserManager.getInstance().userId, questionsId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ResponseBody>() {
override fun onResponse(response: ResponseBody?) {
super.onResponse(response)
listener?.onSuccess()
}
override fun onFailure(e: HttpException?) {
super.onFailure(e)
listener?.onError()
AskErrorResponseUtils.errorResponseControl(context, e)
}
})
}
interface onConcernListener {
fun onSuccess()

View File

@ -3,17 +3,14 @@ package com.gh.common.util;
import android.content.Context;
import android.os.Build;
import com.lightgame.download.DownloadEntity;
import com.gh.gamecenter.db.info.ConcernInfo;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.NewsDetailEntity;
import com.gh.gamecenter.manager.ConcernManager;
import com.gh.gamecenter.manager.DataCollectionManager;
import com.gh.gamecenter.manager.PackageManager;
import com.lightgame.download.DownloadEntity;
import org.json.JSONArray;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@ -118,18 +115,10 @@ public class DataCollectionUtils {
// 上传用户数据
public static void uploadUser(Context context) {
ConcernManager concernManager = new ConcernManager(context);
ArrayList<String> concernList = new ArrayList<>();
for (ConcernInfo entity : concernManager.getAllConcern()) {
if (entity.isConcern()) {
concernList.add(entity.getGameName());
}
}
Map<String, Object> map = new HashMap<>();
map.put("type", Build.MODEL);
map.put("system", Build.VERSION.SDK_INT + "=" + Build.VERSION.RELEASE);
map.put("install", PackageManager.getInstalledList());
map.put("concern", concernList);
DataCollectionManager.upsert(context, "user", map);
}

View File

@ -3,18 +3,16 @@ package com.gh.common.util;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.text.TextUtils;
import com.gh.common.constant.Config;
import com.halo.assistant.TinkerApp;
import com.tencent.bugly.beta.tinker.TinkerManager;
import com.lightgame.config.CommonDebug;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.mta.track.StatisticsDataAPI;
import com.tencent.stat.MtaSDkException;
import com.tencent.stat.StatConfig;
import com.tencent.stat.StatCrashReporter;
import com.tencent.stat.StatReportStrategy;
import com.tencent.stat.StatService;
import com.tencent.tinker.lib.tinker.Tinker;
import com.tendcloud.tenddata.TCAgent;
import java.util.HashMap;
@ -31,14 +29,16 @@ public class DataUtils {
* 初始化各种统计工具仅在release build非debug模式启用统计
*
* @param context
* @param debug 是否debug模式
* @param channel
*/
public static void init(final Application context, final boolean debug, String channel) {
public static void init(final Application context, String channel) {
if (CommonDebug.IS_DEBUG) {
return;
}
//TalkingData
try {
TCAgent.LOG_ON = debug;
TCAgent.LOG_ON = false;
TCAgent.init(context, Config.TALKINGDATA_APPID, channel);
/**
*
@ -61,38 +61,31 @@ public class DataUtils {
crashReporter.setJavaCrashHandlerStatus(false);
// crashReporter.setEnableInstantReporting(true);
StatConfig.setDebugEnable(debug);
StatConfig.setDebugEnable(false);
// 设置数据上报策略
if (debug) {
StatConfig.setStatSendStrategy(StatReportStrategy.INSTANT);
} else {
StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD);
StatConfig.setSendPeriodMinutes(5);
}
StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD);
StatConfig.setSendPeriodMinutes(5);
// 设置启用Tlink
StatConfig.setTLinkStatus(true);
// 设置启用可视化埋点
StatisticsDataAPI.instance(context);
StatConfig.init(context);
StatConfig.setInstallChannel(channel);
StatConfig.setAntoActivityLifecycleStat(true);
StatConfig.setAppVersion(PackageUtils.getPatchVersionName());
StatService.setContext(context);
StatService.registerActivityLifecycleCallbacks(context);
// 开启收集服务
StatService.startStatService(context, Config.MTA_APPKEY, com.tencent.stat.common.StatConstants.VERSION);
StatService.registerActivityLifecycleCallbacks(context);
} catch (MtaSDkException e) {
e.printStackTrace();
}
// init bugly
try {
CrashReport.setIsDevelopmentDevice(context, debug);
CrashReport.setIsDevelopmentDevice(context, "GH_TEST".equals(channel));
CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context);
strategy.setEnableANRCrashMonitor(false);
@ -100,7 +93,7 @@ public class DataUtils {
strategy.setAppChannel(channel);
strategy.setAppVersion(PackageUtils.getPatchVersionName());
CrashReport.initCrashReport(context, Config.BUGLY_APPID, debug, strategy);
CrashReport.initCrashReport(context, Config.BUGLY_APPID, false, strategy);
} catch (Exception e) {
e.printStackTrace();
@ -108,9 +101,29 @@ public class DataUtils {
}
// MTA ->【次数统计】Key-Value参数的事件
public static void onMtaEvent(Context context, String eventId, String... kv) {
if (CommonDebug.IS_DEBUG && (kv == null || kv.length % 2 != 0)) {
throw new IllegalStateException("onEvent kv 必须不为空且数量为偶数");
}
Properties prop = new Properties();
for (int i = 0; i < kv.length; i++) {
if (i % 2 != 0 || i != 0) {
String key = kv[i - 1];
String value = kv[i];
if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) {
prop.setProperty(key, value);
}
}
}
StatService.trackCustomKVEvent(context, eventId, prop);
}
public static void onEvent(Context var0, String var1, String var2) {
TCAgent.onEvent(var0, var1, var2);
StatService.trackCustomEvent(var0, var1, var2);
Properties prop = new Properties();
prop.setProperty(var1, var2);
StatService.trackCustomKVEvent(var0, var1, prop);
}
public static void onPause(Activity var0) {
@ -168,4 +181,24 @@ public class DataUtils {
onEvent(context, "游戏更新", gameName, kv);
}
public static void onError(Context context, Throwable throwable) {
// MTA主动上传错误
try {
StatService.reportException(context, throwable);
} catch (Exception e) {
}
// //bugly 作为默认处理异常的类库,已经上报了,此处不重复上报
// try {
// CrashReport.postCatchedException(throwable);
// } catch (Exception e) {
// }
//talkingdata
try {
TCAgent.onError(context, throwable);
} catch (Exception e) {
}
}
}

View File

@ -1,22 +1,15 @@
package com.gh.common.util;
import android.content.Intent;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.view.View;
import com.gh.common.constant.Config;
import com.gh.common.view.DownloadDialog;
import com.gh.common.view.DownloadProgressBar;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.DownloadManagerActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.DetailViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.manager.PackageManager;
import com.lightgame.download.DownloadEntity;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.Utils;
/**
* Created by khy on 27/06/17.
@ -26,118 +19,56 @@ import com.lightgame.utils.Utils;
public class DetailDownloadUtils {
public static void detailInitDownload(DetailViewHolder viewHolder, boolean isCheck) {
if (Config.isShow(viewHolder.context)) {
if (viewHolder.gameEntity != null
&& Config.isShowDownload(viewHolder.gameEntity.getId())
&& !"光环助手".equals(viewHolder.gameEntity.getName())) {
viewHolder.downloadBottom.setVisibility(View.VISIBLE);
} else {
viewHolder.downloadBottom.setVisibility(View.GONE);
return;
}
if (viewHolder.gameEntity != null && "光环助手".equals(viewHolder.gameEntity.getName())) {
viewHolder.downloadBottom.setVisibility(View.GONE);
} else if (viewHolder.gameEntity == null || viewHolder.gameEntity.getApk().isEmpty()) {
viewHolder.downloadTv.setVisibility(View.VISIBLE);
viewHolder.downloadPb.setVisibility(View.GONE);
viewHolder.downloadPer.setVisibility(View.GONE);
if (TextUtils.isEmpty(viewHolder.downloadOffText)) {
viewHolder.downloadTv.setText("暂无下载");
} else {
viewHolder.downloadTv.setText(viewHolder.downloadOffText);
}
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_pause_style);
viewHolder.downloadTv.setTextColor(0xFF999999);
viewHolder.downloadTv.setClickable(false);
} else {
viewHolder.downloadTv.setVisibility(View.VISIBLE);
viewHolder.downloadPb.setVisibility(View.GONE);
viewHolder.downloadPer.setVisibility(View.GONE);
boolean isInstalled = false;
if (viewHolder.gameEntity.getApk().size() == 1
&& PackageManager.isInstalled(viewHolder.gameEntity.getApk().get(0).getPackageName())) {
isInstalled = true;
}
if (isInstalled) {
if (PackageManager.isCanUpdate(viewHolder.gameEntity.getId(), viewHolder.gameEntity.getApk().get(0).getPackageName())) {
if (viewHolder.isNewsDetail) {
viewHolder.downloadTv.setText(R.string.update);
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
viewHolder.downloadTv.setText(String.format("更新《%s》",
viewHolder.gameEntity.getName()));
} else {
viewHolder.downloadTv.setText(String.format("更新《%s》%s",
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
}
viewHolder.downloadTv.setBackgroundResource(
R.drawable.game_item_btn_download_style);
} else {
if (viewHolder.gameEntity.getTag() != null && viewHolder.gameEntity.getTag().size() != 0
&& !TextUtils.isEmpty(viewHolder.gameEntity.getApk().get(0).getGhVersion())
&& !PackageUtils.isSignature(viewHolder.context, viewHolder.gameEntity.getApk().get(0).getPackageName())) {
if (viewHolder.isNewsDetail) {
viewHolder.downloadTv.setText(R.string.pluggable);
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
viewHolder.downloadTv.setText(String.format("插件化《%s》",
viewHolder.gameEntity.getName()));
} else {
viewHolder.downloadTv.setText(String.format("插件化《%s》%s",
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
}
viewHolder.downloadTv.setBackgroundResource(
R.drawable.game_item_btn_plugin_style);
} else {
if (viewHolder.isNewsDetail) {
viewHolder.downloadTv.setText(R.string.launch);
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
viewHolder.downloadTv.setText(String.format("启动《%s》",
viewHolder.gameEntity.getName()));
} else {
viewHolder.downloadTv.setText(String.format("启动《%s》%s",
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
}
viewHolder.downloadTv.setBackgroundResource(
R.drawable.game_item_btn_launch_style);
}
}
} else {
String status = GameUtils.getDownloadBtnText(viewHolder.context, viewHolder.gameEntity);
switch (status) {
case "插件化":
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
break;
case "打开":
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_launch_style);
break;
default:
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_download_style);
break;
}
if (viewHolder.isNewsDetail) {
viewHolder.downloadTv.setText(status);
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
viewHolder.downloadTv.setText(String.format(status + "《%s》",
viewHolder.gameEntity.getName()));
} else {
viewHolder.downloadTv.setText(String.format(status + "《%s》%s",
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
}
if (viewHolder.gameEntity.getApk().isEmpty()) {
viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.downloadOffText) ? "暂无下载" : viewHolder.downloadOffText);
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NONE);
} else {
String status = GameUtils.getDownloadBtnText(viewHolder.context, viewHolder.gameEntity);
switch (status) {
case "插件化":
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.PLUGIN);
break;
case "打开":
if (viewHolder.gameEntity.getApk().size() == 1) {
status = "启动";
}
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.LAUNCH_OR_OPEN);
break;
default:
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.NORMAL);
break;
}
if (viewHolder.isNewsDetail) {
viewHolder.mDownloadPb.setText(status);
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
viewHolder.mDownloadPb.setText(String.format(status + "《%s》", viewHolder.gameEntity.getName()));
} else {
viewHolder.mDownloadPb.setText(String.format(status + "《%s》%s", viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
}
}
if (isCheck && viewHolder.gameEntity != null
&& viewHolder.gameEntity.getApk().size() == 1) {
if (isCheck && viewHolder.gameEntity.getApk().size() == 1) {
String url = viewHolder.gameEntity.getApk().get(0).getUrl();
DownloadEntity downloadEntity = DownloadManager.getInstance(viewHolder.context).getDownloadEntityByUrl(url);
if (downloadEntity != null) {
viewHolder.downloadEntity = downloadEntity;
viewHolder.downloadTv.setVisibility(View.GONE);
viewHolder.downloadPb.setVisibility(View.VISIBLE);
viewHolder.downloadPer.setVisibility(View.VISIBLE);
detailInvalidate(viewHolder);
}
}
}
public static void detailInvalidate(DetailViewHolder viewHolder) {
viewHolder.downloadPb.setProgress((int) (viewHolder.downloadEntity.getPercent() * 10));
viewHolder.downloadPer.setTextColor(0xFFFFFFFF);
viewHolder.mDownloadPb.setProgress((int) (viewHolder.downloadEntity.getPercent() * 10));
DownloadEntity downloadEntity = viewHolder.downloadEntity;
switch (downloadEntity.getStatus()) {
case downloading:
@ -145,15 +76,20 @@ public class DetailDownloadUtils {
case timeout:
case neterror:
case waiting:
viewHolder.downloadPer.setText(R.string.downloading);
viewHolder.mDownloadPb.setText(R.string.downloading);
if (downloadEntity.isPluggable() && PackageManager.isInstalled(downloadEntity.getPackageName())) {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.DOWNLOADING_PLUGIN);
} else {
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.DOWNLOADING_NORMAL);
}
break;
case done:
viewHolder.downloadPer.setText("安装");
viewHolder.mDownloadPb.setText(R.string.install);
if (downloadEntity.isPluggable()
&& PackageManager.isInstalled(downloadEntity.getPackageName())) {
viewHolder.downloadPb.setProgressDrawable(ContextCompat.getDrawable(viewHolder.context, R.drawable.progressbar_plugin_radius_style));
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_PLUGIN);
} else {
viewHolder.downloadPb.setProgressDrawable(ContextCompat.getDrawable(viewHolder.context, R.drawable.progressbar_normal_radius_style));
viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_NORMAL);
}
break;
case cancel:
@ -166,94 +102,5 @@ public class DetailDownloadUtils {
}
}
public static class OnDetailDownloadClickListener implements View.OnClickListener {
private DetailViewHolder mViewHolder;
private GameEntity mGameEntity;
private DownloadEntity mDownloadEntity;
private String mEntrance;
private String mName;
private String mTitle;
public OnDetailDownloadClickListener(DetailViewHolder viewHolder, String entrance, String name, String title) {
mViewHolder = viewHolder;
mGameEntity = viewHolder.gameEntity;
mDownloadEntity = viewHolder.downloadEntity;
mEntrance = entrance;
mName = name;
mTitle = title;
}
@Override
public void onClick(View v) {
if (v == mViewHolder.downloadTv) {
if (mGameEntity != null && !mGameEntity.getApk().isEmpty()) {
if (mGameEntity.getApk().size() == 1) {
String str = mViewHolder.downloadTv.getText().toString();
if (str.contains("启动")) {
DataUtils.onGameLaunchEvent(mViewHolder.context, mGameEntity.getName(), mGameEntity.getApk().get(0).getPlatform(), mName);
PackageUtils.launchApplicationByPackageName(mViewHolder.context, mGameEntity.getApk().get(0).getPackageName());
} else if (NetworkUtils.isWifiConnected(mViewHolder.context)) {
download();
} else {
DialogUtils.showDownloadDialog(mViewHolder.context, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
download();
}
});
}
} else {
DownloadDialog.getInstance(mViewHolder.context)
.showPopupWindow(v, mGameEntity, StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), mName + ":" + mTitle);
}
} else {
Utils.toast(mViewHolder.context, "稍等片刻~!游戏正在上传中...");
}
} else if (v == mViewHolder.downloadPb || v == mViewHolder.downloadPer) {
String str = mViewHolder.downloadPer.getText().toString();
if ("下载中".equals(str)) {
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context,
mGameEntity.getApk().get(0).getUrl(), StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"));
mViewHolder.context.startActivity(intent);
} else if ("安装".equals(str)) {
if (mDownloadEntity == null) {
mDownloadEntity = DownloadManager.getInstance(mViewHolder.context).getDownloadEntityByUrl(mGameEntity.getApk().get(0).getUrl());
}
if (mDownloadEntity != null) {
PackageUtils.launchSetup(mViewHolder.context, mDownloadEntity.getPath());
}
}
}
}
private void download() {
String str = mViewHolder.downloadTv.getText().toString();
String method;
if (str.contains("更新")) {
method = "更新";
} else if (str.contains("插件化")) {
method = "插件化";
} else {
method = mViewHolder.context.getString(R.string.download);
}
ApkEntity apkEntity = mGameEntity.getApk().get(0);
String msg = FileUtils.isCanDownload(mViewHolder.context, apkEntity.getSize());
if (TextUtils.isEmpty(msg)) {
DataUtils.onGameDownloadEvent(mViewHolder.context, mGameEntity.getName(), apkEntity.getPlatform(), StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), "下载开始");
DownloadManager.createDownload(mViewHolder.context, apkEntity, mGameEntity, method, StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), mName + ":" + mTitle);
mViewHolder.downloadTv.setVisibility(View.GONE);
mViewHolder.downloadPb.setVisibility(View.VISIBLE);
mViewHolder.downloadPer.setVisibility(View.VISIBLE);
mViewHolder.downloadPb.setProgress(0);
mViewHolder.downloadPer.setText("0.0%");
// DownloadManager.getInstance(mViewHolder.context).putStatus(apkEntity.getUrl(), "downloading");
} else {
Utils.toast(mViewHolder.context, msg);
}
}
}
}

View File

@ -16,6 +16,7 @@ import com.tencent.stat.StatConfig;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
@ -79,7 +80,7 @@ public class DeviceUtils {
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str;) {
for (; null != str; ) {
str = input.readLine();
if (str != null) {
macSerial = str.trim();// 去空格
@ -93,9 +94,10 @@ public class DeviceUtils {
try {
return loadFileAsString("/sys/class/net/eth0/address")
.toUpperCase().substring(0, 17);
} catch (FileNotFoundException e) {
// do nothing
} catch (Exception e) {
e.printStackTrace();
}
}
@ -124,7 +126,7 @@ public class DeviceUtils {
}
private static String getIPAddress(Context context) {
public static String getIPAddress(Context context) {
NetworkInfo info = ((ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {
@ -152,7 +154,7 @@ public class DeviceUtils {
return null;
}
private static String getNetwork(Context context) {
public static String getNetwork(Context context) {
NetworkInfo info = ((ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {

View File

@ -24,6 +24,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.gh.gamecenter.KcSelectGameActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.kuaichuan.WifiMgr;
import com.halo.assistant.HaloApp;
@ -55,7 +56,7 @@ public class DialogUtils {
// 快传成绩单
public static void showKuaiChuanResult(final Activity activity, Handler handler, int requestCode, final String picName) {
HaloApp.remove("FileInfo");
HaloApp.remove(KcSelectGameActivity.KEY_FILE_INFO);
List<Map<String, String>> mapList = (List<Map<String, String>>) HaloApp.get("sendData", true);
if (mapList == null || mapList.size() == 0) return;
@ -69,8 +70,7 @@ public class DialogUtils {
int filesSize = 0;
int sendTime = 0;
View view = View.inflate(activity
, R.layout.dialog_kuaichuan, null);
View view = View.inflate(activity, R.layout.dialog_kuaichuan, null);
final LinearLayout mShareLl = (LinearLayout) view.findViewById(R.id.kuaichuan_dialog_ll);
final LinearLayout mShareBottomLl = (LinearLayout) view.findViewById(R.id.kuaichuan_dialog_share_rl);
LinearLayout shareIconLl = (LinearLayout) view.findViewById(R.id.kuaichuan_icon_ll);
@ -192,7 +192,7 @@ public class DialogUtils {
mShareLl.buildDrawingCache();
Bitmap drawingCache = mShareLl.getDrawingCache();
saveBitmap(drawingCache, activity, picName);
MessageShareUtils.getInstance(activity).showShareWindows(mShareBottomLl, drawingCache, picName, 2);
MessageShareUtils.getInstance(activity).showShareWindows(activity, mShareBottomLl, drawingCache, picName, 2);
mShareBottomLl.setVisibility(View.VISIBLE);
}
}, 200);
@ -325,6 +325,10 @@ public class DialogUtils {
}
public static void showWarningDialog(Context context, String title, CharSequence msg, final ConfirmListener listener) {
//TODO fix this
if (!(context instanceof Activity)) {
return;
}
showWarningDialog(context, title, msg, "取消", "确定", listener, null);
}
@ -366,30 +370,6 @@ public class DialogUtils {
showWarningDialog(context, "插件化安装", spanned, listener);
}
public static void showDisclaimerDialog(Context context, String content) {
final Dialog disclaimerDialog = new Dialog(context);
View view = View.inflate(context, R.layout.dialog_disclaimer, null);
// TextView title = (TextView) view.findViewById(R.id.disclaimer_title);
// title.setText("免责声明");
TextView message = (TextView) view.findViewById(R.id.disclaimer_message);
Spanned spanned = Html.fromHtml(content);
message.setText(spanned);
view.findViewById(R.id.disclaimer_confirm).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
disclaimerDialog.dismiss();
}
});
disclaimerDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
disclaimerDialog.setContentView(view);
disclaimerDialog.show();
}
/**
* Material Design 风格弹窗
*
@ -401,46 +381,9 @@ public class DialogUtils {
* @param cmListener 确认按钮监听
* @param clListener 取消按钮监听
*/
public static void showAlertDialog(Context context, String title, CharSequence message
, String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) {
// AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.GhAlertDialog)
// .setTitle(title)
// .setMessage(message)
// .setPositiveButton(positive, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// if (cmListener != null) {
// cmListener.onConfirm();
// }
// }
// })
// .setNegativeButton(negative, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// if (clListener != null) {
// clListener.onCancel();
// }
// }
// })
// .create();
// alertDialog.show();
//
// TextView mesage = (TextView) alertDialog.findViewById(android.R.id.message);
// Button positiveBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE);
// Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
//
// positiveBtn.setTextSize(14);
// positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
// negativeBtn.setTextSize(14);
// negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
// if (mesage != null) {
// mesage.setTextSize(14);
// mesage.setTextColor(ContextCompat.getColor(context, R.color.system_bar));
// mesage.setLineSpacing(1.0f, 1.3f);
// }
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null);
@ -491,38 +434,8 @@ public class DialogUtils {
* @param cmListener
*/
// TODO: 8/10/17 将下面几个弹窗整理在一起
public static void showAlertDialog(Context context, String title, CharSequence message
, String positive, String negative, final ConfirmListener cmListener) {
// AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.GhAlertDialog)
// .setTitle(title)
// .setMessage(message)
// .setPositiveButton(positive, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// if (cmListener != null) {
// cmListener.onConfirm();
// }
// }
// })
// .setNegativeButton(negative, null)
// .create();
// alertDialog.show();
//
// TextView mesage = (TextView) alertDialog.findViewById(android.R.id.message);
// Button positiveBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE);
// Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
//
// positiveBtn.setTextSize(14);
// positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
// negativeBtn.setTextSize(14);
// negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.hint));
// if (mesage != null) {
// mesage.setTextSize(14);
// mesage.setTextColor(ContextCompat.getColor(context, R.color.system_bar));
// mesage.setLineSpacing(1.0f, 1.3f);
// }
public static void showCancelAlertDialog(Context context, String title, CharSequence message
, String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) {
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
@ -541,6 +454,9 @@ public class DialogUtils {
negativeTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (clListener != null) {
clListener.onCancel();
}
dialog.dismiss();
}
});
@ -568,48 +484,6 @@ public class DialogUtils {
public static void showCancelListenerDialog(Context context, String title, CharSequence message
, String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) {
// AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.GhAlertDialog)
// .setTitle(title)
// .setMessage(message)
// .setPositiveButton(positive, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// if (cmListener != null) {
// cmListener.onConfirm();
// }
// }
// })
// .setNegativeButton(negative, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// if (clListener != null) {
// clListener.onCancel();
// }
// }
// })
// .setOnCancelListener(new DialogInterface.OnCancelListener() {
// @Override
// public void onCancel(DialogInterface dialogInterface) {
// clListener.onCancel();
// }
// })
// .create();
//
// alertDialog.show();
//
// TextView mesage = (TextView) alertDialog.findViewById(android.R.id.message);
// Button positiveBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE);
// Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
//
// positiveBtn.setTextSize(14);
// positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
// negativeBtn.setTextSize(14);
// negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.hint));
// if (mesage != null) {
// mesage.setTextSize(14);
// mesage.setTextColor(ContextCompat.getColor(context, R.color.system_bar));
// mesage.setLineSpacing(1.0f, 1.3f);
// }
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
@ -651,7 +525,7 @@ public class DialogUtils {
@Override
public void onCancel(DialogInterface dialogInterface) {
if (clListener != null)
clListener.onCancel();
clListener.onCancel();
}
});
dialog.show();
@ -797,6 +671,44 @@ public class DialogUtils {
}
public static void showSignDialog(Context context, String title, CharSequence message, CharSequence message2
, String positive, final ConfirmListener cmListener) {
final Dialog dialog = new Dialog(context);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_sign, null);
TextView contentTv = contentView.findViewById(R.id.dialog_content);
TextView titleTv = contentView.findViewById(R.id.dialog_title);
TextView negativeTv = contentView.findViewById(R.id.dialog_negative);
TextView positiveTv = contentView.findViewById(R.id.dialog_positive);
TextView content2Tv = contentView.findViewById(R.id.dialog_content2);
contentTv.setText(Html.fromHtml(message.toString()));
content2Tv.setText(Html.fromHtml(message2.toString()));
titleTv.setText(title);
positiveTv.setText(positive);
negativeTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
positiveTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (cmListener != null) {
cmListener.onConfirm();
}
dialog.dismiss();
}
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(contentView);
dialog.show();
}
public interface ConfirmListener {
void onConfirm();
}

View File

@ -60,9 +60,10 @@ public class DownloadItemUtils {
gameEntity.setEntryMap(entryMap);
}
entryMap.put(platform, downloadEntity);
if (!"pause".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) {
adapter.notifyItemChanged(index);
}
adapter.notifyItemChanged(index);
// if (!DownloadStatus.pause.equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) {
// adapter.notifyItemChanged(index);
// }
} else {
if (!queue.contains(platform)) {
queue.offer(platform);
@ -84,7 +85,7 @@ public class DownloadItemUtils {
gameEntity.setEntryMap(entryMap);
}
entryMap.put(platform, downloadEntity);
if (!"pause".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) {
if (!DownloadStatus.pause.equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) {
adapter.notifyItemChanged(index);
}
}
@ -94,7 +95,7 @@ public class DownloadItemUtils {
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder, boolean isShowPlatform) {
// 控制是否显示下载按钮
if (!Config.isShow(context) || context.getString(R.string.app_name).equals(gameEntity.getName())) {
if (!Config.isShowDownload(gameEntity.getId()) || context.getString(R.string.app_name).equals(gameEntity.getName())) {
holder.gameDownloadBtn.setVisibility(View.GONE);
} else {
holder.gameDownloadBtn.setVisibility(View.VISIBLE);
@ -110,8 +111,9 @@ public class DownloadItemUtils {
holder.gameDes.setVisibility(View.VISIBLE);
holder.gameProgressbar.setVisibility(View.GONE);
holder.gameInfo.setVisibility(View.GONE);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_style);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.news_detail_comment);
holder.gameDownloadBtn.setText("暂无");
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.button_gray));
holder.gameDownloadBtn.setClickable(false);
} else if (gameEntity.getApk().size() == 1) {
updateNormalItem(context, holder, gameEntity, isShowPlatform);
@ -154,14 +156,19 @@ public class DownloadItemUtils {
holder.gameDownloadBtn.setText(R.string.update);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
} else {
Object gh_id = PackageUtils.getMetaData(context, packageName, "gh_id");
if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
&& !TextUtils.isEmpty(apkEntity.getGhVersion())
&& !PackageUtils.isSignature(context, packageName)) {
holder.gameDownloadBtn.setText(R.string.pluggable);
setwhat(context, holder, apkEntity, packageName);
} else {
} else if (gh_id == null || gh_id.equals(gameEntity.getId())) {
holder.gameDownloadBtn.setText(R.string.launch);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_launch_style);
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
holder.gameDownloadBtn.setBackgroundResource(R.drawable.detail_downloading_normal_style);
} else {
holder.gameDownloadBtn.setText(R.string.download);
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
}
}
} else {
@ -230,7 +237,7 @@ public class DownloadItemUtils {
DownloadStatus status = downloadEntity.getStatus();
if (status.equals(DownloadStatus.downloading)) {
if (!"pause".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) {
if (!DownloadStatus.pause.equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) {
holder.gameProgressbar.setProgress((int) (downloadEntity.getPercent() * 10));
if (isShowPlatform && platform != null) {
holder.gameDownloadSpeed.setText(String.format("%s - %s(剩%s)", platform,
@ -438,7 +445,7 @@ public class DownloadItemUtils {
if (downloadEntity != null) {
final String path = downloadEntity.getPath();
if (FileUtils.isEmptyFile(path)) {
Utils.toast(context, context.getString(R.string.install_failure_hint));
Utils.toast(context, R.string.install_failure_hint);
DownloadManager.getInstance(context).cancel(downloadEntity.getUrl());
if (gameEntity.getEntryMap() != null) {
gameEntity.getEntryMap().remove(apkEntity.getPlatform());

View File

@ -6,7 +6,9 @@ import android.os.Bundle;
import android.text.TextUtils;
import com.gh.gamecenter.MainActivity;
import com.gh.gamecenter.NormalActivity;
import com.gh.gamecenter.SplashScreenActivity;
import com.gh.gamecenter.normal.NormalFragment;
/**
* @author CsHeng
@ -28,6 +30,8 @@ public class EntranceUtils {
public static final String HOST_WEB = "web";
public static final String HOST_DOWNLOAD = "download";
public static final String HOST_SUGGESTION = "suggestion";
public static final String HOST_ANSWER = "answer";
public static final String HOST_QUESTION = "question";
public static final String KEY_DATA = "data";
public static final String KEY_TYPE = "type";
public static final String KEY_NAME = "name";
@ -56,6 +60,19 @@ public class EntranceUtils {
public static final String KEY_PROLIST = "provinceList";
public static final String KEY_ORDER = "order";
public static final String KEY_TAGTYPE = "tagType";
public static final String KEY_ANSWER_ID = "answerId";
public static final String KEY_ANSWER_CONTENT = "answerContent";
public static final String KEY_QUESTIONS_ID = "questionsId";
public static final String KEY_QUESTIONS_TITLE = "questionsTitle";
public static final String KEY_ANSWER_OPEN_IN_NEW_PAGE = "openInNewPage";
public static final String KEY_QUESTIONS_PATCH = "questionsPatch";
public static final String KEY_INVITE_SEARCH_KEY = "inviteSearchKey";
public static final String KEY_MESSAGE_TYPE = "messageType";
public static final String KEY_QUESTIONS_SEARCH_KEY = "questionsSearchKey";
public static final String KEY_SHOW_ANSWER_COMMENT = "showAnswerComment";
public static final String KEY_VERSION_UPDATE = "versionUpdate";
public static final String KEY_CHECK_QUESTION_CONCERN = "check_question_concern";
public static final String KEY_DRAFT_ID = "draft_id";
public static void jumpActivity(Context context, Bundle bundle) {
@ -67,10 +84,14 @@ public class EntranceUtils {
if (!TextUtils.isEmpty(to)) {
Class<?> clazz = ClassUtils.forName(to);
if (clazz != null) {
Intent intent1 = new Intent(context, clazz);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(KEY_DATA, bundle);
context.startActivity(intent1);
if (NormalFragment.class.isAssignableFrom(clazz)) { // 兼容NormalFragment
NormalActivity.startFragmentNewTask(context, (Class<? extends NormalFragment>) clazz, bundle);
} else {
Intent intent1 = new Intent(context, clazz);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtras(bundle);
context.startActivity(intent1);
}
}
}
} else {

View File

@ -2,6 +2,7 @@ package com.gh.common.util;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.widget.TextView;
@ -51,7 +52,8 @@ public class GameUtils {
if ("插件化".equals(status)) {
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
} else if ("打开".equals(status)) {
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_launch_style);
downloadBtn.setBackgroundResource(R.drawable.detail_downloading_normal_style);
downloadBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
} else {
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
}

View File

@ -6,6 +6,8 @@ import android.content.Intent;
import android.widget.Toast;
import com.gh.common.constant.Config;
import com.gh.gamecenter.R;
import com.gh.gamecenter.login.LoginTag;
import com.lightgame.utils.RuntimeUtils;
import com.lightgame.utils.Utils;
import com.sina.weibo.sdk.WbSdk;
@ -89,7 +91,7 @@ public class GetLoginDataUtils {
content.put("access_token_expire", Utils.getTime(mContext) + jsonObject.getLong("expires_in"));
content.put("access_token", jsonObject.getString("access_token"));
if (mLoginListener != null) {
mLoginListener.OnLoginData(content, LoginUtils.LoginTag.qq);// QQ 登录回调
mLoginListener.OnLoginData(content, LoginTag.qq);// QQ 登录回调
}
} catch (JSONException e) {
@ -161,7 +163,7 @@ public class GetLoginDataUtils {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "光环助手";
req.state = mContext.getString(R.string.app_name);
boolean b = mIWXAPI.sendReq(req);
Utils.log(GetLoginDataUtils.class.getSimpleName(), "微信注册状态::" + register + "\n 发送状态::" + b);
if (!register || !b) {
@ -171,7 +173,9 @@ public class GetLoginDataUtils {
}
public void WCLofinCallBack(JSONObject content) {
mLoginListener.OnLoginData(content, LoginUtils.LoginTag.wechat);
if (mLoginListener != null) {
mLoginListener.OnLoginData(content, LoginTag.wechat);
}
}
public void onWeiboCallback(int requestCode, int resultCode, Intent data) {
@ -219,7 +223,7 @@ public class GetLoginDataUtils {
content.put("refresh_token", token.getRefreshToken());
// content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天
if (mLoginListener != null) {
mLoginListener.OnLoginData(content, LoginUtils.LoginTag.weibo);// 微博 登录回调
mLoginListener.OnLoginData(content, LoginTag.weibo);// 微博 登录回调
}
} catch (JSONException e) {
e.printStackTrace();
@ -293,7 +297,7 @@ public class GetLoginDataUtils {
// 登录成功回调
public interface OnLoginDataListener {
void OnLoginData(JSONObject content, LoginUtils.LoginTag loginTag);
void OnLoginData(JSONObject content, LoginTag loginTag);
}
}

View File

@ -7,6 +7,7 @@ import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.support.annotation.DrawableRes
import android.support.v4.content.ContextCompat
import android.text.TextUtils
import com.facebook.common.executors.CallerThreadExecutor
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.controller.BaseControllerListener
@ -18,33 +19,67 @@ import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber
import com.facebook.imagepipeline.image.ImageInfo
import com.facebook.imagepipeline.request.ImageRequest
import com.facebook.imagepipeline.request.ImageRequestBuilder
import com.gh.common.constant.Config
import com.gh.gamecenter.R
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.Response
import com.lightgame.config.CommonDebug
import com.lightgame.download.FileUtils
import com.lightgame.utils.Utils
import org.json.JSONObject
import retrofit2.HttpException
import rx.Observable
import rx.Observer
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import java.io.File
import java.net.HttpURLConnection
class ImageUtils private constructor() {
// 自适应图片宽高
fun display(simpleDraweeView: SimpleDraweeView, url: String?, width: Int) {
fun display(simpleDraweeView: SimpleDraweeView?, url: String?, width: Int) {
val listener = object : BaseControllerListener<ImageInfo>() {
override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
if (imageInfo == null) {
return
}
val layoutParams = simpleDraweeView.layoutParams
val layoutParams = simpleDraweeView?.layoutParams
val scale = imageInfo.height.toFloat() / imageInfo.width.toFloat()
layoutParams.height = (width * scale).toInt()
simpleDraweeView.layoutParams = layoutParams
layoutParams?.height = (width * scale).toInt()
simpleDraweeView?.layoutParams = layoutParams
}
}
simpleDraweeView.controller = Fresco.newDraweeControllerBuilder()
simpleDraweeView?.controller = Fresco.newDraweeControllerBuilder()
.setUri(url)
.setControllerListener(listener)
.build()
}
// 自适应图片宽高
fun displayScale(simpleDraweeView: SimpleDraweeView?, url: String?, height: Int) {
val listener = object : BaseControllerListener<ImageInfo>() {
override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
if (imageInfo == null) {
return
}
val layoutParams = simpleDraweeView?.layoutParams
val scale = imageInfo.width.toFloat()/imageInfo.height.toFloat()
layoutParams?.width = (height * scale).toInt()
simpleDraweeView?.layoutParams = layoutParams
}
}
simpleDraweeView?.controller = Fresco.newDraweeControllerBuilder()
.setUri(url)
.setControllerListener(listener)
.build()
}
// 设置缩放类型,设置按压状态下的叠加图
fun display(resources: Resources, simpleDraweeView: SimpleDraweeView,
scaleType: ScalingUtils.ScaleType, url: String?) {
val context = simpleDraweeView.context
fun display(resources: Resources?, simpleDraweeView: SimpleDraweeView?,
scaleType: ScalingUtils.ScaleType?, url: String?) {
if (simpleDraweeView == null) return
val context = simpleDraweeView.context ?: return
simpleDraweeView.hierarchy = GenericDraweeHierarchyBuilder(resources)
.setFadeDuration(500)
.setPressedStateOverlay(ColorDrawable(ContextCompat.getColor(context, R.color.pressed_bg)))
@ -57,8 +92,9 @@ class ImageUtils private constructor() {
}
// 设置占位符
fun display(resources: Resources, simpleDraweeView: SimpleDraweeView, url: String?, placeholderImage: Int) {
val context = simpleDraweeView.context
fun display(resources: Resources?, simpleDraweeView: SimpleDraweeView?, url: String?, placeholderImage: Int) {
if (simpleDraweeView == null) return
val context = simpleDraweeView.context ?: return
simpleDraweeView.hierarchy = GenericDraweeHierarchyBuilder(resources)
.setFadeDuration(500)
.setPressedStateOverlay(ColorDrawable(ContextCompat.getColor(context, R.color.pressed_bg)))
@ -70,9 +106,9 @@ class ImageUtils private constructor() {
}
// 图片下载监听和设置低高分辨率图片
fun display(simpleDraweeView: SimpleDraweeView, url: String?, lowUrl: String?,
fun display(simpleDraweeView: SimpleDraweeView?, url: String?, lowUrl: String?,
listener: ControllerListener<in ImageInfo>) {
simpleDraweeView.controller = Fresco.newDraweeControllerBuilder()
simpleDraweeView?.controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(ImageRequest.fromUri(url))
.setControllerListener(listener)
.setLowResImageRequest(ImageRequest.fromUri(lowUrl)) // 低分辨率图片
@ -80,7 +116,7 @@ class ImageUtils private constructor() {
}
// 获取bitmap
fun display(context: Context, url: String?, dataSubscriber: BaseBitmapDataSubscriber) {
fun display(context: Context?, url: String?, dataSubscriber: BaseBitmapDataSubscriber) {
val imageRequest = ImageRequestBuilder
.newBuilderWithSource(Uri.parse(url))
.setProgressiveRenderingEnabled(true)
@ -92,6 +128,7 @@ class ImageUtils private constructor() {
}
companion object {
const val RESPONSE403: String = "RESPONSE403"
fun getInstance(): ImageUtils {
return Inner.anotherSingle
@ -102,15 +139,101 @@ class ImageUtils private constructor() {
}
fun display(simpleDraweeView: SimpleDraweeView, url: String?) {
// if (url.startsWith("http://image.ghzs666.com") && url.endsWith(".jpg")) {
// url = url + "?x-oss-process=image/format,webp";
// }
simpleDraweeView.setImageURI(url)
}
fun display(draweeView: SimpleDraweeView, @DrawableRes res: Int?) {
draweeView.setImageURI("res:///" + res)
}
fun postImageArr(context: Context, imgArr: List<String>, listener: OnPostArrImageListener) {
val imgMap: HashMap<String, String> = HashMap()
Observable.create(Observable.OnSubscribe<JSONObject> { subscriber ->
var path: String
var index = 0
for (s in imgArr) {
path = context.getCacheDir().path + File.separator + System.currentTimeMillis() + index + ".jpg"
if (BitmapUtils.savePicture(path, s, 200000)) {
subscriber.onNext(FileUtils.uploadFile(Config.API_HOST + "images?type=community", path, s, UserManager.getInstance().token))
index++
} else {
subscriber.onNext(FileUtils.uploadFile(Config.API_HOST + "images?type=community", s, s, UserManager.getInstance().token))
}
}
subscriber.onCompleted()
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<JSONObject> {
override fun onCompleted() {
Utils.log("图片上传完成")
listener.postSuccess(imgMap)
}
override fun onError(e: Throwable) {
Utils.log("图片上传失败" + e.toString())
listener.postError()
}
override fun onNext(result: JSONObject?) {
if (result != null) {
try {
val statusCode = result.getInt("statusCode")
if (statusCode == HttpURLConnection.HTTP_OK) {
imgMap.put(result.getString("realPath"), result.getString("icon"))
} else if (statusCode == 403) {
imgMap.put(result.getString("realPath"), RESPONSE403)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
})
}
fun postImage(context: Context?, picturePath: String?, listener: OnPostImageListener) {
if (context == null || TextUtils.isEmpty(picturePath)) return
Observable.create(Observable.OnSubscribe<JSONObject> { subscriber ->
val path = context.getCacheDir().path + File.separator + System.currentTimeMillis() + ".jpg"
if (BitmapUtils.savePicture(path, picturePath, 200000)) {
subscriber.onNext(FileUtils.uploadFile(Config.API_HOST + "images?type=community", path, UserManager.getInstance().token))
} else {
subscriber.onNext(FileUtils.uploadFile(Config.API_HOST + "images?type=community", picturePath, UserManager.getInstance().token))
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<JSONObject>() {
override fun onResponse(response: JSONObject?) {
if (CommonDebug.IS_DEBUG) {
Utils.log("postImage:onResponse=>" + response.toString())
}
listener.postSuccess(response)
}
override fun onFailure(e: HttpException) {
listener.postError()
}
})
}
}
interface OnPostImageListener {
fun postSuccess(response: JSONObject?)
fun postError()
}
interface OnPostArrImageListener {
/**
* key: 图片本地路径
* value: 图片提交成功后的链接
*/
fun postSuccess(imgMap: HashMap<String, String>)
fun postError()
}
}

View File

@ -7,8 +7,11 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.eventbus.EBPackage;
import com.lightgame.download.DownloadEntity;
import org.greenrobot.eventbus.EventBus;
@ -59,7 +62,17 @@ public class InstallUtils {
keys.add(packageName);
} else if (list.contains(packageName)) {
keys.add(packageName);
EventBus.getDefault().post(new EBPackage("安装", packageName));
DownloadEntity downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByPackageName(packageName);
String installVersion = PackageUtils.getVersionByPackage(context, packageName);
if (!TextUtils.isEmpty(installVersion) && downloadEntity != null &&
installVersion.equals(downloadEntity.getVersionName())) {
if (!downloadEntity.isPluggable() || PackageUtils.isSignature(context, packageName)) {
EventBus.getDefault().post(new EBPackage("安装", packageName));
}
}
}
}
for (String key : keys) {
@ -72,7 +85,7 @@ public class InstallUtils {
long time = uninstallMap.get(packageName);
if (System.currentTimeMillis() - time >= MAX_TIME) {
keys.add(packageName);
} else if (list.contains(packageName)) {
} else if (!list.contains(packageName)) {
keys.add(packageName);
EventBus.getDefault().post(new EBPackage("卸载", packageName));
}

View File

@ -26,6 +26,7 @@ import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.eventbus.EBUISwitch;
import com.gh.gamecenter.geetest.GeetestListener;
import com.gh.gamecenter.geetest.GeetestUtils;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
@ -118,7 +119,7 @@ public class LibaoUtils {
public static void deleteLibaoCode(final Context context, final String code,
final PostLibaoListener listener) {
RetrofitManager.getInstance(context).getApi().deleteLibaoCode(code)
RetrofitManager.getInstance(context).getApi().deleteLibaoCode(UserManager.getInstance().getUserId(), code)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
@ -135,7 +136,7 @@ public class LibaoUtils {
}
public static void getLibaoStatus(Context context, String ids, final PostLibaoListener listener) {
RetrofitManager.getInstance(context).getApi().getLibaoStatus(ids)
RetrofitManager.getInstance(context).getApi().getLibaoStatus(UrlFilterUtils.getFilterQuery("libao_ids", ids))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<LibaoStatusEntity>>() {
@ -151,148 +152,236 @@ public class LibaoUtils {
});
}
public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity,
final boolean isInstallRequired, final LibaoDetailAdapter adapter, final String entrance) {
public static void setLiBaoBtnStatus(final TextView libaoBtn, String status, Context context) {
libaoBtn.setTextColor(Color.WHITE);
final String status = libaoEntity.getStatus();
if (TextUtils.isEmpty(status)) return;
switch (status) {
case "coming":
libaoBtn.setText(R.string.libao_coming);
libaoBtn.setBackgroundResource(R.drawable.textview_blue_style);
break;
case "ling":
libaoBtn.setText(R.string.libao_ling);
libaoBtn.setBackgroundResource(R.drawable.textview_green_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
break;
case "tao":
libaoBtn.setText(R.string.libao_tao);
libaoBtn.setBackgroundResource(R.drawable.textview_orange_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
break;
case "coming":
libaoBtn.setText(R.string.libao_coming);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme));
break;
case "used_up":
libaoBtn.setText(R.string.libao_used_up);
libaoBtn.setBackgroundResource(R.drawable.textview_cancel_up);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme));
break;
case "finish":
libaoBtn.setText(R.string.libao_finish);
libaoBtn.setBackgroundResource(R.drawable.textview_cancel_up);
libaoBtn.setBackgroundResource(R.drawable.button_border_gray);
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
break;
case "linged":
libaoBtn.setText(R.string.libao_linged);
libaoBtn.setBackgroundResource(R.drawable.libao_linged_style);
libaoBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.libao_linged_selector));
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme));
break;
case "taoed":
libaoBtn.setText(R.string.libao_taoed);
libaoBtn.setBackgroundResource(R.drawable.libao_taoed_style);
libaoBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.libao_taoed_selector));
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme));
break;
case "copy":
libaoBtn.setText(R.string.libao_copy);
libaoBtn.setBackgroundResource(R.drawable.textview_blue_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
break;
case "repeatLing":
libaoBtn.setText(R.string.libao_repeat_ling);
libaoBtn.setBackgroundResource(R.drawable.textview_cancel_up);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme));
break;
case "repeatLinged":
libaoBtn.setText(R.string.libao_repeat_ling);
libaoBtn.setBackgroundResource(R.drawable.textview_green_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
break;
case "repeatTao":
libaoBtn.setText(R.string.libao_repeat_tao);
libaoBtn.setBackgroundResource(R.drawable.textview_cancel_up);
libaoBtn.setBackgroundResource(R.drawable.button_normal_border);
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme));
break;
case "repeatTaoed":
libaoBtn.setText(R.string.libao_repeat_tao);
libaoBtn.setBackgroundResource(R.drawable.textview_orange_style);
libaoBtn.setBackgroundResource(R.drawable.button_normal_style);
break;
case "unshelve":
libaoBtn.setBackgroundResource(R.drawable.textview_cancel_style);
libaoBtn.setBackgroundResource(R.drawable.button_border_gray);
libaoBtn.setText(R.string.libao_unshelve);
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
break;
default:
libaoBtn.setBackgroundResource(R.drawable.textview_cancel_style);
libaoBtn.setBackgroundResource(R.drawable.button_border_gray);
libaoBtn.setText("异常");
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
break;
}
}
public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity,
final boolean isInstallRequired, final LibaoDetailAdapter adapter, final String entrance) {
String status = libaoEntity.getStatus();
setLiBaoBtnStatus(libaoBtn, status, context);
libaoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
@Override
public void onLoggedIn() {
// 领取限制
if ("领取".equals(libaoBtn.getText().toString()) || "淘号".equals(libaoBtn.getText().toString())) {
if (isInstallRequired && !isAppInstalled(context, libaoEntity.getPackageName())) {
String platform;
if (TextUtils.isEmpty(libaoEntity.getPlatform())) {
platform = "";
} else {
platform = PlatformUtils.getInstance(context)
.getPlatformName(libaoEntity.getPlatform()) + "";
}
CheckLoginUtils.checkLogin(context, () -> {
// 领取限制
if ("领取".equals(libaoBtn.getText().toString()) || "淘号".equals(libaoBtn.getText().toString())) {
if (isInstallRequired && !isAppInstalled(context, libaoEntity.getPackageName())) {
String platform;
if (TextUtils.isEmpty(libaoEntity.getPlatform())) {
platform = "";
} else {
platform = PlatformUtils.getInstance(context)
.getPlatformName(libaoEntity.getPlatform()) + "";
}
String dialogContent = context.getString(R.string.ling_rules_dialog, libaoEntity.getGame().getName(), platform);
DialogUtils.showWarningDialog(context, "条件不符",
Html.fromHtml(dialogContent), "关闭", "立即安装"
, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
adapter.openDownload();
}
}, null);
String dialogContent = context.getString(R.string.ling_rules_dialog, libaoEntity.getGame().getName(), platform);
DialogUtils.showWarningDialog(context, "条件不符",
Html.fromHtml(dialogContent), "关闭", "立即安装"
, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
adapter.openDownload();
}
}, null);
return;
}
}
switch (libaoBtn.getText().toString()) {
case "未开始":
Utils.toast(context, "还没到开始领取时间");
break;
case "查看":
Intent intent = LibaoDetailActivity.getIntent(context, libaoEntity, entrance);
context.startActivity(intent);
break;
case "再领一个":
case "领取":
if ("repeatLing".equals(status)) {
DialogUtils.showWarningDialog(context, "礼包刷新提醒"
, "礼包每天0点刷新换新区或者换新角色需要继续领取礼包的童鞋请于明天0点之后回来即可[再领一个]"
, null, "知道了", null, null);
} else {
libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance);
}
break;
case "再淘一个":
case "淘号":
if ("repeatTao".equals(status)) {
Utils.toast(context, "没到重复淘号时间, 礼包每天0点刷新");
return;
}
}
final Dialog loadingDialog = DialogUtils.showWaitDialog(context, "淘号中...");
postLibaoTao(context, libaoEntity.getId(), new PostLibaoListener() {
@Override
public void postSucced(Object response) {
switch (libaoBtn.getText().toString()) {
case "未开始":
Utils.toast(context, "还没到开始领取时间");
break;
case "查看":
Intent intent = LibaoDetailActivity.getIntent(context, libaoEntity, entrance);
context.startActivity(intent);
break;
case "再领一个":
case "领取":
if ("repeatLing".equals(status)) {
DialogUtils.showWarningDialog(context, "礼包刷新提醒"
, "礼包每天0点刷新换新区或者换新角色需要继续领取礼包的童鞋请于明天0点之后回来即可[再领一个]"
, null, "知道了", null, null);
} else {
libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance);
}
break;
case "再淘一个":
case "淘号":
if ("repeatTao".equals(status)) {
Utils.toast(context, "没到重复淘号时间, 礼包每天0点刷新");
return;
}
final Dialog loadingDialog = DialogUtils.showWaitDialog(context, "淘号中...");
postLibaoTao(context, libaoEntity.getId(), new PostLibaoListener() {
@Override
public void postSucced(Object response) {
if (loadingDialog != null) loadingDialog.dismiss();
if (loadingDialog != null) loadingDialog.dismiss();
JSONObject responseBody = (JSONObject) response;
String libaoCode = null;
try {
libaoCode = responseBody.getString("code");
} catch (JSONException e) {
e.printStackTrace();
}
JSONObject responseBody = (JSONObject) response;
Utils.log("postLibaoTao=====" + responseBody);
String libaoCode = null;
if (TextUtils.isEmpty(libaoCode)) {
try {
libaoCode = responseBody.getString("code");
String detail = responseBody.getString("detail");
switch (detail) {
case "maintaining":
Utils.toast(context, "网络状态异常,请稍后再试");
break;
case "fail to compete":
Utils.toast(context, "淘号失败,稍后重试");
break;
default:
Utils.toast(context, "淘号异常");
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
return;
}
if (TextUtils.isEmpty(libaoCode)) {
Utils.toast(context, "淘号成功");
libaoEntity.setStatus("taoed");
EventBus.getDefault().post(new EBReuse("libaoChanged"));
adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "tao", Utils.getTime(context)));
final String finalLibaoCode = libaoCode;
DialogUtils.showWarningDialog(context, "淘号成功"
, Html.fromHtml(context.getString(R.string.taoed_dialog, libaoCode))
, "关闭", " 复制礼包码"
, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
copyLink(finalLibaoCode, context);
if (isInstallRequired) {
libaoBtn.postDelayed(new Runnable() {
@Override
public void run() {
Spanned msg = Html.fromHtml(
context.getString(R.string.taoed_copy_dialog
, finalLibaoCode));
lunningAppDialog(context
, msg, libaoEntity);
}
}, 300);
}
}
}, null);
}
@Override
public void postFailed(Throwable error) {
Utils.log("---" + error.toString());
if (loadingDialog != null) loadingDialog.dismiss();
if (error instanceof HttpException) {
HttpException exception = (HttpException) error;
if (exception.code() == 403) {
try {
String detail = responseBody.getString("detail");
JSONObject errorJson = new JSONObject(exception.response().errorBody().string());
String detail = errorJson.getString("detail");
// Utils.toast(context, "返回::" + detail);
switch (detail) {
case "coming":
Utils.toast(context, "礼包领取时间未开始");
break;
case "finish":
Utils.toast(context, "礼包领取时间已结束");
break;
case "fetched":
Utils.toast(context, "你今天已领过这个礼包了, 不能再淘号");
libaoBtn.setText("已淘号");
libaoBtn.setBackgroundResource(R.drawable.libao_taoed_style);
libaoBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.libao_taoed_selector));
libaoEntity.setStatus("taoed");
break;
case "try tao":
case "used up":
DialogUtils.showHintDialog(context, "礼包已领光"
, "手速不够快,礼包已经被抢光了,十分抱歉", "知道了");
break;
case "maintaining":
Utils.toast(context, "网络状态异常,请稍后再试");
break;
@ -300,104 +389,21 @@ public class LibaoUtils {
Utils.toast(context, "淘号失败,稍后重试");
break;
default:
Utils.toast(context, "淘号异常");
Utils.toast(context, "操作失败");
break;
}
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
Utils.toast(context, "礼包处理异常" + ex.toString());
}
return;
}
Utils.toast(context, "淘号成功");
libaoEntity.setStatus("taoed");
EventBus.getDefault().post(new EBReuse("libaoChanged"));
adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "tao", Utils.getTime(context)));
final String finalLibaoCode = libaoCode;
DialogUtils.showWarningDialog(context, "淘号成功"
, Html.fromHtml(context.getString(R.string.taoed_dialog, libaoCode))
, "关闭", " 复制礼包码"
, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
copyLink(finalLibaoCode, context);
if (isInstallRequired) {
libaoBtn.postDelayed(new Runnable() {
@Override
public void run() {
Spanned msg = Html.fromHtml(
context.getString(R.string.taoed_copy_dialog
, finalLibaoCode));
lunningAppDialog(context
, msg, libaoEntity);
}
}, 300);
}
}
}, null);
}
@Override
public void postFailed(Throwable error) {
Utils.log("---" + error.toString());
if (loadingDialog != null) loadingDialog.dismiss();
if (error instanceof HttpException) {
HttpException exception = (HttpException) error;
if (exception.code() == 403) {
try {
JSONObject errorJson = new JSONObject(exception.response().errorBody().string());
String detail = errorJson.getString("detail");
// Utils.toast(context, "返回::" + detail);
switch (detail) {
case "coming":
Utils.toast(context, "礼包领取时间未开始");
break;
case "finish":
Utils.toast(context, "礼包领取时间已结束");
break;
case "fetched":
Utils.toast(context, "你今天已领过这个礼包了, 不能再淘号");
libaoBtn.setText("已淘号");
libaoBtn.setBackgroundResource(R.drawable.libao_taoed_style);
libaoBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.libao_taoed_selector));
libaoEntity.setStatus("taoed");
break;
case "try tao":
case "used up":
DialogUtils.showHintDialog(context, "礼包已领光"
, "手速不够快,礼包已经被抢光了,十分抱歉", "知道了");
break;
case "maintaining":
Utils.toast(context, "网络状态异常,请稍后再试");
break;
case "fail to compete":
Utils.toast(context, "淘号失败,稍后重试");
break;
default:
Utils.toast(context, "操作失败");
break;
}
} catch (Exception ex) {
ex.printStackTrace();
Utils.toast(context, "礼包处理异常" + ex.toString());
}
return;
}
}
Utils.toast(context, "发生异常");
}
});
break;
}
Utils.toast(context, "发生异常");
}
});
break;
}
});
}
@ -419,7 +425,6 @@ public class LibaoUtils {
if (loadingDialog != null) loadingDialog.dismiss();
JSONObject responseBody = (JSONObject) response;
Utils.log("postLibaoLing=====" + responseBody);
String libaoCode = null;
try {
libaoCode = responseBody.getString("code");
@ -472,7 +477,6 @@ public class LibaoUtils {
String string = exception.response().errorBody().string();
JSONObject errorJson = new JSONObject(string);
String detail = errorJson.getString("detail");
Utils.log("=======detail ::" + errorJson.toString());
switch (detail) {
case "coming":
Utils.toast(context, "礼包领取时间未开始");
@ -484,7 +488,8 @@ public class LibaoUtils {
Utils.toast(context, "你已领过这个礼包了");
int countdown = 0;
if (errorJson.toString().contains("countdown")) {
countdown = errorJson.getInt("countdown");
JSONObject data = errorJson.getJSONObject("data");
countdown = data.getInt("countdown");
}
if (countdown > 0 && countdown < 60 * 10) {
EventBus.getDefault().post(new EBUISwitch(REFRESH_LIBAO_TIME, countdown));

View File

@ -1,37 +1,20 @@
package com.gh.common.util;
import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.LoginResponseEntity;
import com.gh.gamecenter.entity.UserInfoEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.RefreshTokenManager;
import com.gh.gamecenter.personal.PersonalFragment;
import com.gh.gamecenter.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.HttpException;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
@ -39,55 +22,52 @@ import rx.schedulers.Schedulers;
* Created by khy on 7/07/17.
*/
// TODO: 1/12/17 逐步整理 删除
public class LoginUtils {
public enum LoginTag {
qq, wechat, weibo, phone, refresh, oldUserPhone
}
public static void checkPhoneNum(final Context context, final String phoneName, final onCaptchaCallBackListener listener) { // 老用户登录检查手机是否登录过
RetrofitManager.getInstance(context).getApi()
.checkPhoneNum(phoneName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
@Override
public void onResponse(ResponseBody response) {
super.onResponse(response);
try {
JSONObject content = new JSONObject(response.string());
String status = content.getString("status");
if ("ok".equals(status)) {
getPhoneCaptcha(context, phoneName, listener);
} else {
DialogUtils.showWarningDialog(context, null, "手机号已存在,请使用未登录过的手机号,以保证数据正常同步到新账号上"
, null, "我知道了", null, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (e == null) {
Utils.toast(context, "请检查网络是否可用");
return;
}
try {
ResponseBody responseBody = e.response().errorBody();
String string = responseBody.string();
JSONObject content = new JSONObject(string);
int code = content.getInt("code");
outputErrorHint(context, code);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
// public static void checkPhoneNum(final Context context, final String phoneName, final onCaptchaCallBackListener listener) { // 老用户登录检查手机是否登录过
// RetrofitManager.getInstance(context).getApi()
// .checkPhoneNum(phoneName)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new Response<ResponseBody>() {
// @Override
// public void onResponse(ResponseBody response) {
// super.onResponse(response);
// try {
// JSONObject content = new JSONObject(response.string());
// String status = content.getString("status");
// if ("ok".equals(status)) {
// getPhoneCaptcha(context, phoneName, listener);
// } else {
// DialogUtils.showWarningDialog(context, null, "手机号已存在,请使用未登录过的手机号,以保证数据正常同步到新账号上"
// , null, "我知道了", null, null);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
// @Override
// public void onFailure(HttpException e) {
// super.onFailure(e);
// if (e == null) {
// Utils.toast(context, "请检查网络是否可用");
// return;
// }
// try {
// ResponseBody responseBody = e.response().errorBody();
// String string = responseBody.string();
// JSONObject content = new JSONObject(string);
// int code = content.getInt("code");
// outputErrorHint(context, code);
// } catch (Exception e1) {
// e1.printStackTrace();
// }
// }
// });
//
// }
// 获取验证码
public static void getPhoneCaptcha(final Context context, String phoneNum, final onCaptchaCallBackListener listener) {
@ -111,6 +91,7 @@ public class LoginUtils {
super.onResponse(response);
try {
listener.onCaptcha(response.getString("service_id"));
Utils.toast(context, "验证码短信已发送,请注意查收");
} catch (JSONException e) {
e.printStackTrace();
}
@ -128,7 +109,11 @@ public class LoginUtils {
String string = responseBody.string();
JSONObject content = new JSONObject(string);
int code = content.getInt("code");
outputErrorHint(context, code);
if (code == 403202) {
captchaErrorHint(context, content);
} else {
outputErrorHint(context, code);
}
} catch (Exception e1) {
e1.printStackTrace();
Utils.toast(context, "无法获取验证码,请检查你的网络状态");
@ -138,118 +123,6 @@ public class LoginUtils {
}
// 登录前做好body判断
public static void login(final Context context, final JSONObject content, final LoginTag loginTag,
final onLoginCallBackListener listener) {
Observable<LoginResponseEntity> observable = null;
String userToken = null;
try {
JSONObject device = DeviceUtils.getLoginDevice(context.getApplicationContext());
content.put("device", device);
RequestBody body = RequestBody.create(MediaType.parse("application/json"), content.toString());
if (loginTag == LoginTag.weibo) {
userToken = content.getString("uid");
observable = RetrofitManager.getInstance(context).getUsersea().loginByWeibo(body);
} else if (loginTag == LoginTag.qq) {
userToken = content.getString("openid");
observable = RetrofitManager.getInstance(context).getUsersea().loginByQQ(body);
} else if (loginTag == LoginTag.wechat) {
userToken = content.getString("openid");
observable = RetrofitManager.getInstance(context).getUsersea().loginByWechat(body);
} else if (loginTag == LoginTag.phone || loginTag == LoginTag.oldUserPhone) {
userToken = content.getString("mobile");
observable = RetrofitManager.getInstance(context).getUsersea().loginByMobile(body);
} else {
return;
}
} catch (JSONException e) {
e.printStackTrace();
}
if (observable == null) return;
final String finalUserToken = userToken;
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<LoginResponseEntity>() {
@Override
public void onResponse(LoginResponseEntity response) {
super.onResponse(response);
if (loginTag.equals(LoginTag.phone) || loginTag.equals(LoginTag.oldUserPhone)) {
try {
response.setLoginType(content.getString("mobile"));
} catch (JSONException e) {
e.printStackTrace();
}
} else {
response.setLoginType(loginTag.name());
}
response.setUserToken(finalUserToken);
saveLoginToken(context, response);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String syncDeviceID = sp.getString("syncDeviceID", null);
if (!TextUtils.isEmpty(syncDeviceID)) {
syncUserData(context, syncDeviceID, listener, loginTag);
sp.edit().putString("syncDeviceID", null).apply(); // 清空
} else {
getUserData(context, false, listener, loginTag);
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (listener != null) {
listener.onLoginFailure();
}
try {
ResponseBody responseBody = e.response().errorBody();
String string = responseBody.string();
JSONObject content = new JSONObject(string);
int code = content.getInt("code");
if (loginTag.equals(LoginTag.phone)) {
outputErrorHint(context, code);
} else {
if (loginTag.equals(LoginTag.qq)) {
GetLoginDataUtils.getInstance(context).QQLogout();
}
Utils.toast(context, context.getString(R.string.login_failure_hint));
}
} catch (Exception e1) {
Utils.toast(context, context.getString(R.string.login_failure_hint));
e1.printStackTrace();
}
}
});
}
private static void syncUserData(final Context context, String syncDeviceID,
final onLoginCallBackListener listener,
final LoginTag loginTag) {
String loginType;
if (LoginTag.phone.equals(loginTag)) {
loginType = "mobile";
} else {
loginType = loginTag.toString();
}
HashMap<String, String> map = new HashMap<>();
map.put("device_id", syncDeviceID);
map.put("login_type", loginType);
RequestBody body = RequestBody.create(MediaType.parse("application/json"), new JSONObject(map).toString());
RetrofitManager.getInstance(context).getApi().syncUserData(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userInfoResponse(context, loginTag, listener));
}
// 注销登录
public static void logout(final Context context, final OnLogoutListener listener) {
@ -274,300 +147,106 @@ public class LoginUtils {
});
}
// 清除本地用户相关信息
public static void cleanUserData(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("user_info", null);
edit.putString("login_token", null);
edit.apply();
GetLoginDataUtils.getInstance(context).QQLogout();
EventBus.getDefault().post(new EBReuse(PersonalFragment.LOGOUT_TAG));
public static boolean userPostErrorToast(Throwable throwable, Context context, boolean isComment) {
if (throwable instanceof HttpException) {
HttpException exception = (HttpException) throwable;
if (exception.code() == 403) {
try {
JSONObject errorJson = new JSONObject(exception.response().errorBody().string());
int errorCode = errorJson.getInt("code");
switch (errorCode) {
case 403019:
if (isComment) {
Utils.toast(context, R.string.comment_failed_userblocked);
} else {
Utils.toast(context, R.string.comment_failed_userbanned);
}
break;
case 403020:
Utils.toast(context, R.string.comment_failed_toofrequent);
break;
case 403021:
Utils.toast(context, R.string.comment_failed_illegal);
break;
default:
Utils.toast(context, R.string.comment_failed_unknown);
break;
}
} catch (Exception ex) {
ex.printStackTrace();
Utils.toast(context, "无法识别错误类型");
}
return true;
}
}
return false;
}
// 检查本地是否有缓存token,有则马上登录
public static void checkLogin(Context context, onLoginCallBackListener listener) {
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken != null && loginToken.getAccessToken() != null) {
LoginResponseEntity.AccessToken accessToken = loginToken.getAccessToken();
Long accessExpire = accessToken.getExpire();
if (accessExpire != null && accessExpire > Utils.getTime(context)) {
getUserData(context, false, listener, null);
public static void captchaErrorHint(Context context, JSONObject content) {
try {
JSONObject detail = content.getJSONObject("detail");
if ("isv.BUSINESS_LIMIT_CONTROL".equals(detail.getString("sub_code"))) {
Utils.toast(context, "获取验证码太频繁,请稍后再试");
} else {
LoginResponseEntity.RefreshToken refreshToken = loginToken.getRefreshToken();
Long refreshExpire = refreshToken.getExpire();
if (refreshExpire != null && refreshExpire > Utils.getTime(context)) {
Map<String, String> params = new HashMap<>();
params.put("refresh_token", refreshToken.getValue());
RefreshTokenManager.getInstance().refreshToken(context, false, new JSONObject(params), listener);
} else {
// 重新登录
cleanUserData(context);
}
Utils.toast(context, detail.getString("sub_msg"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
private static Response<UserInfoEntity> userInfoResponse(final Context context,
final LoginTag loginTag,
final onLoginCallBackListener listener) {
return new Response<UserInfoEntity>() {
@Override
public void onResponse(UserInfoEntity response) {
super.onResponse(response);
saveUserInfo(context, response);
if (listener != null) {
listener.onLogin(response, loginTag);
}
if (loginTag != null && !LoginTag.refresh.equals(loginTag)) {
Utils.toast(context, "登录成功");
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (listener != null) {
listener.onLoginFailure();
}
if (loginTag != null) {
Utils.toast(context, context.getString(R.string.login_failure_hint));
}
if (loginTag != null && loginTag.equals(LoginTag.qq)) {
GetLoginDataUtils.getInstance(context).QQLogout();
}
}
};
}
// 获取用户信息
public static void getUserData(final Context context, boolean isRunMainThread, final onLoginCallBackListener listener, final LoginTag loginTag) {
Observable<UserInfoEntity> observable;
if (isRunMainThread) {
observable = RetrofitManager.getInstance(context)
.getApi()
.getUserInfo();
} else {
observable = RetrofitManager.getInstance(context)
.getApi()
.getUserInfo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
observable.subscribe(userInfoResponse(context, loginTag, listener));
}
// 获取本地缓存用户信息
public static UserInfoEntity getUserInfo(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String loginData = sp.getString("user_info", null);
if (!TextUtils.isEmpty(loginData)) {
Type listType = new TypeToken<UserInfoEntity>() {
}.getType();
return new Gson().fromJson(loginData, listType);
}
return null;
}
// 在本地缓存用户信息
public static void saveUserInfo(Context context, UserInfoEntity entity) {
if (entity != null) {
String region = entity.getRegion();
if (region != null && region.contains("中国")) { // 转换地区格式
String replace = region.replace("中国 ", "");
entity.setRegion(replace);
}
String s = new Gson().toJson(entity);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("user_info", s);
edit.apply();
}
}
//获取本地缓存用户token
public static LoginResponseEntity getLoginToken(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String loginData = sp.getString("login_token", null);
if (!TextUtils.isEmpty(loginData)) {
Type listType = new TypeToken<LoginResponseEntity>() {
}.getType();
return new Gson().fromJson(loginData, listType);
}
return null;
}
//获取本地缓存用户token
public static String getToken(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String loginData = sp.getString("login_token", null);
if (!TextUtils.isEmpty(loginData)) {
Type listType = new TypeToken<LoginResponseEntity>() {
}.getType();
LoginResponseEntity entity = new Gson().fromJson(loginData, listType);
if (entity != null && entity.getAccessToken() != null) {
return entity.getAccessToken().getValue();
}
}
return null;
}
// 在本地缓存用户token
public static void saveLoginToken(Context context, LoginResponseEntity entity) {
if (entity != null) {
if (TextUtils.isEmpty(entity.getLoginType())) {
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken != null) {
entity.setLoginType(loginToken.getLoginType());
}
}
String s = new Gson().toJson(entity);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("login_token", s);
edit.apply();
}
}
//更改用户信息
public static void changeUserInfo(final onChangeUserInfoListener listener, final Context context,
final String content, final String editType) {
final UserInfoEntity entity = getUserInfo(context);
if (entity == null) {
return;
}
Map<String, String> map = new HashMap<>();
map.put(editType, content);
final Dialog loadingDialog = DialogUtils.showWaitDialog(context, "正在修改信息...");
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
new JSONObject(map).toString());
RetrofitManager.getInstance(context)
.getUsersea()
.changeUserInfo(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
@Override
public void onResponse(ResponseBody response) {
super.onResponse(response);
if (loadingDialog != null) {
loadingDialog.dismiss();
}
switch (editType) {
case "name":
entity.setName(content);
break;
case "contact":
entity.setContact(content);
break;
case "gender":
entity.setGender(content);
break;
case "region":
entity.setRegion(content);
break;
case "icon":
entity.setIcon(content);
break;
default:
return;
}
saveUserInfo(context, entity);
listener.onChange();
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (loadingDialog != null) {
loadingDialog.dismiss();
}
Utils.toast(context, "修改失败");
if (e == null) {
Utils.toast(context, "请检查网络是否可用");
return;
}
try {
ResponseBody responseBody = e.response().errorBody();
String string = responseBody.string();
JSONObject content = new JSONObject(string);
int code = content.getInt("code");
outputErrorHint(context, code);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
private static void outputErrorHint(Context context, int code) {
public static void outputErrorHint(Context context, int code) {
switch (code) {
case 40000:
Utils.toast(context, "参数不全");
break;
case 40001:
case 400001:
Utils.toast(context, "验证码获取过快,请稍后重试");// 已经发送过短信
break;
case 40002:
case 400002:
Utils.toast(context, "请求第三方开放平台时发生错误");
break;
case 40003:
case 400003:
Utils.toast(context, "上传用户头像时发生错误");
break;
case 40101:
case 400101:
Utils.toast(context, "缺少参数 app_id");
break;
case 40102:
case 400102:
Utils.toast(context, "缺少签名验证的头信息");
break;
case 40104:
case 400104:
Utils.toast(context, "缺少token");
break;
case 40105:
case 400105:
Utils.toast(context, "缺少手机号码");
break;
case 40106:
case 400106:
Utils.toast(context, "缺少用户名");
break;
case 40107:
case 400107:
Utils.toast(context, "缺少密码参数");
break;
case 40202:
case 400202:
Utils.toast(context, "无效的手机号码");
break;
case 40203:
case 400203:
Utils.toast(context, "无效的用户名");
break;
case 40204:
case 400204:
Utils.toast(context, "无效的头像地址");
break;
case 40205:
case 400205:
Utils.toast(context, "无效的性别参数");
break;
case 40206:
case 400206:
Utils.toast(context, "无效的地区参数");
break;
case 40208:
case 400208:
Utils.toast(context, "无效的密码");
break;
case 40209:
case 400209:
Utils.toast(context, "无效的URL 地址");
break;
case 42000:
@ -585,68 +264,80 @@ public class LoginUtils {
case 42004:
Utils.toast(context, "无效的请求");
break;
case 40301:
case 400301:
Utils.toast(context, "签名验证失败");
break;
case 40302:
case 400302:
Utils.toast(context, "验证码错误");
break;
case 40303:
case 400303:
Utils.toast(context, "密码错误");
break;
case 40304:
case 400304:
Utils.toast(context, "不支持该种方式登录");
break;
case 40305:
case 400305:
Utils.toast(context, "错误的状态值(应用只有两种状态: working / stop)");
break;
case 40306:
case 400306:
Utils.toast(context, "传递了无法识别的参数");
break;
case 40401:
case 400401:
Utils.toast(context, "token过期");
break;
case 40402:
case 400402:
Utils.toast(context, "Service_id过期,主要原因是:收到手机短信验证码后长时间没有进行登录操作");
break;
case 40403:
case 400403:
Utils.toast(context, "验证码已过期");
break;
case 40501:
case 400501:
Utils.toast(context, "同名应用已经存在");
break;
case 40502:
Utils.toast(context, "用户名已存在");
case 400502:
Utils.toast(context, "昵称已存在");
break;
case 40503:
case 400503:
Utils.toast(context, "名称已经存在");
break;
case 40601:
case 400601:
Utils.toast(context, "应用不存在");
break;
case 40602:
case 400602:
Utils.toast(context, "用户不存在");
break;
case 40603:
case 400603:
Utils.toast(context, "用户系统不存在");
break;
case 40604:
case 400604:
Utils.toast(context, "用户已被冻结");
break;
case 40605:
case 400605:
Utils.toast(context, "用户没有冻结");
break;
case 40606:
case 400606:
Utils.toast(context, "该应用被停止运行了");
break;
case 40801:
case 400801:
Utils.toast(context, "访问过于频繁");
break;
case 403001:
Utils.toast(context, "设备异常,获取验证码失败,请更换登陆方式或明天再试");
break;
case 403202:
Utils.toast(context, "403202");
break;
case 400213:
Utils.toast(context, "昵称违规");
break;
case 403801:
Utils.toast(context, "获取验证码太频繁,请稍后再试");
break;
case 403204:
Utils.toast(context, "获取验证码太频繁,请稍后再试");
break;
default:
Utils.toast(context, "未知错误");
Utils.toast(context, code + "");
break;
}
@ -657,20 +348,9 @@ public class LoginUtils {
void onCompleted();
}
// 更改用户信息回调
public interface onChangeUserInfoListener {
void onChange();
}
// 获取验证码回调
public interface onCaptchaCallBackListener {
void onCaptcha(String serviceId);
}
// 登录回调
public interface onLoginCallBackListener {
void onLogin(UserInfoEntity entity, LoginTag loginTag);
void onLoginFailure();
}
}

View File

@ -71,13 +71,11 @@ public class MessageShareUtils {
private Context mContext;
//TODO 干掉activity将context变成applicationcontext
// private Activity activity; // 用来关闭分享页面
private Activity mActivity; // 用来关闭分享页面
//QQ或者QQ空间分享回调处理
public IUiListener QqShareListener = new IUiListener() {
@Override
public void onComplete(Object o) {
// activity.finish();
// activity.overridePendingTransition(0, 0);//禁止退出Activity 动画
Utils.toast(mContext, "分享成功");
}
@ -88,9 +86,7 @@ public class MessageShareUtils {
@Override
public void onCancel() {
// activity.finish();
// activity.overridePendingTransition(0, 0);//禁止退出Activity 动画
Utils.toast(mContext, "分享已取消");
Utils.toast(mContext, R.string.share_cancel_hint);
}
};
// 适配快传成绩单分享
@ -139,11 +135,11 @@ public class MessageShareUtils {
return mTencent;
}
public void showShareWindows(View view, Bitmap bitmap, String picName, int shareType) {
public void showShareWindows(Activity activity, View view, Bitmap bitmap, String picName, int shareType) {
this.shareBm = bitmap;
this.picName = picName;
this.shareType = shareType;
// this.activity = (Activity) mContext;
this.mActivity = activity;
if (shareType == 2) {
contentSize = 75;
@ -230,11 +226,11 @@ public class MessageShareUtils {
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE,
QQShare.SHARE_TO_QQ_TYPE_IMAGE);
params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, mContext.getExternalCacheDir().getPath() + "/ShareImg/" + picName);
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "光环助手");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, mContext.getString(R.string.app_name));
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,
QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE);
mTencent.shareToQQ(
(Activity) mContext, params, QqShareListener);
mActivity, params, QqShareListener);
if (mPopupWindow == null) return;
mPopupWindow.dismiss();
}
@ -246,11 +242,11 @@ public class MessageShareUtils {
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE,
QQShare.SHARE_TO_QQ_TYPE_IMAGE);
params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, mContext.getExternalCacheDir().getPath() + "/ShareImg/" + picName);
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "光环助手");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, mContext.getString(R.string.app_name));
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,
QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(
(Activity) mContext, params, QqShareListener);
mActivity, params, QqShareListener);
if (mPopupWindow == null) return;
mPopupWindow.dismiss();
}

View File

@ -138,4 +138,67 @@ public class NewsUtils {
}
}
public static void setNewsDetailTime(TextView textView, long time) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
long today = format.parse(format.format(new Date())).getTime();
long day = time * 1000;
if (day >= today && day < today + 86400 * 1000) {
long min = new Date().getTime() / 1000 - day / 1000;
int hour = (int) (min / (60 * 60));
if (hour == 0) {
if (min < 60) {
textView.setText("刚刚");
} else {
textView.setText(String.format(Locale.getDefault(), "%d分钟前", (int) (min / 60)));
}
} else {
textView.setText(String.format(Locale.getDefault(), "%d小时前", hour));
}
} else if (day >= today - 86400 * 1000 && day < today) {
format.applyPattern("HH:mm");
textView.setText("昨天 ");
} else {
format.applyPattern("yyyy-MM-dd");
textView.setText(format.format(day));
}
} catch (ParseException e) {
e.printStackTrace();
format.applyPattern("yyyy-MM-dd");
textView.setText(format.format(time * 1000));
}
}
public static String getFormattedTime(long time) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
long today = format.parse(format.format(new Date())).getTime();
long day = time * 1000;
if (day >= today && day < today + 86400 * 1000) {
long min = new Date().getTime() / 1000 - day / 1000;
int hour = (int) (min / (60 * 60));
if (hour == 0) {
if (min < 60) {
return "刚刚";
} else {
return (String.format(Locale.getDefault(), "%d分钟前", (int) (min / 60)));
}
} else {
return (String.format(Locale.getDefault(), "%d小时前", hour));
}
} else if (day >= today - 86400 * 1000 && day < today) {
format.applyPattern("HH:mm");
return ("昨天 ");
} else {
format.applyPattern("yyyy-MM-dd");
return (format.format(day));
}
} catch (ParseException e) {
e.printStackTrace();
format.applyPattern("yyyy-MM-dd");
return (format.format(time * 1000));
}
}
}

View File

@ -10,9 +10,10 @@ import android.content.pm.Signature;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;
import com.gh.common.constant.Config;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.GameUpdateEntity;
import com.lightgame.utils.Utils;
@ -35,17 +36,35 @@ public class PackageUtils {
/*
* 判断是否可以更新只判断gh_version的大小
*/
public static boolean isCanUpdate(Context context, GameUpdateEntity gameUpdateEntity) {
// 判断是否gh_version是否存在
String gh_version = (String) PackageUtils.getMetaData(
context, gameUpdateEntity.getPackageName(), "gh_version");
if (gh_version != null) {
gh_version = gh_version.substring(2);
// 判断gh_version的大小
return Long.parseLong(gh_version) < Long.parseLong(gameUpdateEntity.getGhVersion());
} else {
return false;
public static List<GameUpdateEntity> isCanUpdate(Context context, GameEntity gameEntity) {
List<GameUpdateEntity> updateList = new ArrayList<>();
for (ApkEntity apkEntity : gameEntity.getApk()) {
// 判断是否gh_version是否存在
String gh_version = (String) PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_version");
if (gh_version != null) {
gh_version = gh_version.substring(2);
if (Long.parseLong(gh_version) < Long.parseLong(apkEntity.getGhVersion()) && apkEntity.getForce()) {
GameUpdateEntity updateEntity = new GameUpdateEntity();
updateEntity.setId(gameEntity.getId());
updateEntity.setName(gameEntity.getName());
updateEntity.setIcon(gameEntity.getIcon());
updateEntity.setPackageName(apkEntity.getPackageName());
updateEntity.setSize(apkEntity.getSize());
updateEntity.setVersion(apkEntity.getVersion());
updateEntity.setGhVersion(apkEntity.getGhVersion());
updateEntity.setUrl(apkEntity.getUrl());
updateEntity.setPlatform(apkEntity.getPlatform());
updateEntity.setEtag(apkEntity.getEtag());
updateEntity.setBrief(gameEntity.getBrief());
updateEntity.setTag(gameEntity.getTag());
updateList.add(updateEntity);
}
}
}
return updateList;
}
/*
@ -148,7 +167,7 @@ public class PackageUtils {
public static Intent getInstallIntent(Context context, String path) {
Uri uri = Uri.fromFile(new File(path));
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
installIntent.setDataAndType(uri, "application/vnd.android.package-archive");
InstallUtils.getInstance(context).addInstall(getPackageNameByPath(context, path));
return installIntent;
@ -193,6 +212,7 @@ public class PackageUtils {
*/
public static long getInstalledTime(Context context, String packageName) {
try {
if (context == null) return 0;
PackageInfo packageInfo = context.getApplicationContext().getPackageManager()
.getPackageInfo(packageName, 0);
return packageInfo.firstInstallTime;

View File

@ -4,17 +4,17 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.support.v4.util.ArrayMap;
import android.text.TextUtils;
import com.halo.assistant.HaloApp;
import com.lightgame.download.FileUtils;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.PlatformEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.utils.Utils;
import com.halo.assistant.HaloApp;
import com.lightgame.download.FileUtils;
import org.greenrobot.eventbus.EventBus;
@ -153,7 +153,7 @@ public class PlatformUtils {
}
}
if (urls.size() != 0) {
HaloApp.MAIN_EXECUTOR.execute(new Runnable() {
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
@Override
public void run() {
int success = 0;
@ -208,7 +208,9 @@ public class PlatformUtils {
if (color != null) {
return color;
}
return "#00B7FA";
int themeColor = ContextCompat.getColor(HaloApp.getInstance().getApplication(), R.color.theme);
return String.format("#%06X", 0xFFFFFF & themeColor);
}
public int getPlatformPic(String platform) {

View File

@ -2,6 +2,7 @@ package com.gh.common.util;
import android.content.Context;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.CommentEntity;
import com.gh.gamecenter.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.Response;
@ -43,7 +44,63 @@ public class PostCommentUtils {
listener.postSuccess(response);
}
} else {
Utils.toast(context, "提交失败,请检查网络设置");
Utils.toast(context, R.string.post_failure_hint);
}
}
@Override
public void onFailure(HttpException e) {
if (listener != null) {
listener.postFailed(e);
}
}
});
}
public static void addAnswerComment(final Context context, final String answerId, final String content,
final CommentEntity commentEntity,
final PostCommentListener listener) {
RequestBody body = RequestBody.create(MediaType.parse("application/json"), content);
Observable<ResponseBody> observable;
if (commentEntity != null) {
observable = RetrofitManager.getInstance(context).getApi().postReplyToAnswerComment(answerId, commentEntity.getId(), body);
} else {
observable = RetrofitManager.getInstance(context).getApi().postNewCommentToAnswer(answerId, body);
}
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new JSONObjectResponse() {
@Override
public void onResponse(JSONObject response) {
if (response.length() != 0) {
if (listener != null) {
listener.postSuccess(response);
}
} else {
Utils.toast(context, R.string.post_failure_hint);
}
}
@Override
public void onFailure(HttpException e) {
if (listener != null) {
listener.postFailed(e);
}
}
});
}
public static void voteAnswerComment(final Context context,final String answerId, final String commentId,
final PostCommentListener listener) {
RetrofitManager.getInstance(context).getApi()
.postVoteAnswerComment(answerId,commentId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
@Override
public void onResponse(ResponseBody response) {
if (listener != null) {
listener.postSuccess(null);
}
}
@ -79,11 +136,31 @@ public class PostCommentUtils {
});
}
public static void addReportData(final Context context, final String reportData,
public static void addReportData(final Context context, final String commentId, final String reportData,
final PostCommentListener listener) {
RequestBody body = RequestBody.create(MediaType.parse("application/json"), reportData);
RetrofitManager.getInstance(context).getApi()
.postReportData(body)
.postReportData(commentId, body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
@Override
public void onResponse(ResponseBody response) {
listener.postSuccess(null);
}
@Override
public void onFailure(HttpException e) {
listener.postFailed(e);
}
});
}
public static void postAnswerReportData(final Context context, final String commentId, final String answerId, final String reportData,
final PostCommentListener listener) {
RequestBody body = RequestBody.create(MediaType.parse("application/json"), reportData);
RetrofitManager.getInstance(context).getApi()
.postReportOfAnswerComment(answerId, commentId, body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {

View File

@ -0,0 +1,56 @@
package com.gh.common.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
/**
* Created by khy on 15/12/17.
*/
public class RichEditorUtils {
private RichEditorUtils() throws InstantiationException {
throw new InstantiationException("This class is not for instantiation");
}
public static String toBase64(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
return Base64.encodeToString(bytes, Base64.NO_WRAP);
}
public static Bitmap toBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
int width = drawable.getIntrinsicWidth();
width = width > 0 ? width : 1;
int height = drawable.getIntrinsicHeight();
height = height > 0 ? height : 1;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
public static Bitmap decodeResource(Context context, int resId) {
return BitmapFactory.decodeResource(context.getResources(), resId);
}
public static long getCurrentTime() {
return System.currentTimeMillis();
}
}

View File

@ -13,6 +13,7 @@ import android.graphics.Matrix;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@ -57,16 +58,14 @@ import static com.gh.common.util.GetLoginDataUtils.SCOPE;
*/
public class ShareUtils {
private static ShareUtils instance;
private static ShareUtils sInstance;
private IWXAPI mIWXAPI;
private Tencent mTencent;
private String shareUrl;
private String shareGameName;
private String shareIcon;
private String shareNewsTitle; // shareNewsTitle不为空就是新闻分享否则是游戏分享
private boolean isPlugin = false;
private boolean ispopupWindow;
private boolean isToolsBox;
private String mTitle;
private String mSummary;
private int[] arrLogo = {
R.drawable.share_wechat_logo,
@ -78,42 +77,57 @@ public class ShareUtils {
R.drawable.share_copyfont_logo,
R.drawable.share_cancel_logo
};
public enum ShareType {
news,
game, // 普通游戏
plugin, // 插件游戏
tools,
askInvite,
askNormal, // 问答问题/答案
shareGh
}
private String[] arrLabel = {"微信好友", "朋友圈", "QQ好友", "QQ空间", "新浪微博", "短信", "复制链接", "取消"};
private PopupWindow popupWindow;
private ShareType mShareType;
private Activity mActivity;
private Context mContext;
//QQ或者QQ空间分享回调处理
public IUiListener QqShareListener = new IUiListener() {
@Override
public void onComplete(Object o) {
Utils.toast(mContext, mContext.getString(R.string.share_success_hint));
Utils.toast(mContext, R.string.share_success_hint);
}
@Override
public void onError(UiError uiError) {
Utils.toast(mContext, mContext.getString(R.string.share_fail_hint));
Utils.toast(mContext, R.string.share_fail_hint);
}
@Override
public void onCancel() {
Utils.toast(mContext, mContext.getString(R.string.share_cancel_hint));
Utils.toast(mContext, R.string.share_cancel_hint);
}
};
private ShareUtils(Context context) {
mTencent = Tencent.createInstance(Config.TENCENT_APPID, context); //初始化QQ分享
mIWXAPI = WXAPIFactory.createWXAPI(context, Config.WECHAT_APPID); //初始化微信分享
WbSdk.install(context,new AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", SCOPE));
WbSdk.install(context, new AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", SCOPE));
// FIXME 此处严重泄露把Activity Context 存为static
mContext = context;
}
public static ShareUtils getInstance(Activity context) {
if (instance == null) {
instance = new ShareUtils(context);
public static ShareUtils getInstance(Context context) {
if (sInstance == null) {
sInstance = new ShareUtils(context);
}
return instance;
return sInstance;
}
//检查是否安装手机QQ
@ -131,26 +145,17 @@ public class ShareUtils {
return false;
}
/**
* @param view ispopupWindow-true是绑定的布局 ispopupWindow-false 则是嵌套的父控件
* @param url 分享链接
* @param gameName 游戏名 与 新闻标题区分
* @param icon 分享图标
* @param newsTitle 新闻标题 与 游戏名区分
* @param isPlugin 判断游戏是否是插件
* @param ispopupWindow 判断是否是 PopupWindow false可直接嵌套进布局分享光环view是父控件
*/
public void showShareWindows(View view, String url, String gameName, String icon, String newsTitle,
boolean isPlugin, boolean ispopupWindow, boolean isToolsBox) {
this.shareIcon = icon;
this.shareGameName = gameName;
this.shareUrl = url;
this.shareNewsTitle = newsTitle;
this.isPlugin = isPlugin;
this.ispopupWindow = ispopupWindow;
this.isToolsBox = isToolsBox;
View contentView = View.inflate(mContext, R.layout.share_popup_layout, null);
public void showShareWindows(Activity activity, View view, String url, String icon, String shareTitle, String shareSummary, ShareType shareType) {
if (activity.isFinishing()) return;
this.mActivity = activity;
this.shareIcon = icon;
this.shareUrl = url;
this.mSummary = shareSummary;
this.mTitle = shareTitle;
this.mShareType = shareType;
View contentView = View.inflate(mActivity, R.layout.share_popup_layout, null);
contentView.setFocusable(true);
contentView.setFocusableInTouchMode(true);
RecyclerView shareRecyclerView = (RecyclerView) contentView.findViewById(R.id.share_rv);
@ -168,7 +173,7 @@ public class ShareUtils {
shareRecyclerView.setLayoutManager(gridLayoutManager);
shareRecyclerView.setAdapter(new ShareRecyclerViewAdapter());
if (!ispopupWindow) {
if (mShareType == ShareType.shareGh) {
RelativeLayout layout = (RelativeLayout) view;
layout.addView(contentView);
arrLabel[6] = "邮件";
@ -186,7 +191,11 @@ public class ShareUtils {
popupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT
, LinearLayout.LayoutParams.MATCH_PARENT, true);
popupWindow.setAnimationStyle(R.style.mypopwindow_anim_style);
popupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
try {
popupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
} catch (Exception e) {
e.printStackTrace();
}
contentView.setOnClickListener(new View.OnClickListener() {
@Override
@ -210,79 +219,52 @@ public class ShareUtils {
}
//QQ分享
private void qqSahre() {
Utils.toast(mContext, mContext.getString(R.string.share_skip));
private void qqShare() {
Utils.toast(mContext, R.string.share_skip);
Bundle params = new Bundle();
String title;
String summary;
if (isToolsBox) {
title = shareNewsTitle;
summary = shareGameName;
} else if (ispopupWindow) {
if (shareNewsTitle != null) {
title = shareNewsTitle;
summary = "来自光环助手(最强卡牌神器)";
} else {
title = "向你推荐:";
if (isPlugin) {
summary = shareGameName + "(光环加速版)";
} else {
summary = shareGameName;
}
}
} else {
title = "玩手游不用肝的感觉真好";
summary = "绿色安全的手游加速助手";
switch (mShareType) {
case plugin:
mSummary += "(光环加速版)";
break;
case askNormal:
mTitle += " - 光环助手";
break;
}
params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, summary);
params.putString(QQShare.SHARE_TO_QQ_TITLE, mTitle);
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, mSummary);
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareUrl);
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, shareIcon);
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "光环助手");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, mContext.getString(R.string.app_name));
mTencent.shareToQQ(
(Activity) mContext, params, QqShareListener);
mTencent.shareToQQ(mActivity, params, QqShareListener);
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
}
}
//微信好友分享
private void wechatSahre() {
Utils.toast(mContext, mContext.getString(R.string.share_skip));
private void wechatShare() {
Utils.toast(mContext, R.string.share_skip);
WXWebpageObject webpage = new WXWebpageObject();
WXMediaMessage msg = new WXMediaMessage(webpage);
webpage.webpageUrl = shareUrl;
String title;
String summary;
switch (mShareType) {
case plugin:
mSummary += "(光环加速版)";
break;
case askNormal:
mTitle += " - 光环助手";
break;
if (isToolsBox) {
title = shareNewsTitle;
summary = shareGameName;
} else if (ispopupWindow) {
if (shareNewsTitle != null) {
title = shareNewsTitle;
summary = "来自光环助手(最强卡牌神器)";
} else {
title = "向你推荐:";
if (isPlugin) {
summary = shareGameName + "(光环加速版)";
} else {
summary = shareGameName;
}
}
} else {
title = "玩手游不用肝的感觉真好";
summary = "绿色安全的手游加速助手";
}
msg.title = title;
msg.description = summary;
msg.title = mTitle;
msg.description = mSummary;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
@ -290,7 +272,7 @@ public class ShareUtils {
req.scene = SendMessageToWX.Req.WXSceneSession;
loadBitMap(shareIcon, msg, req);
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
}
}
@ -304,8 +286,12 @@ public class ShareUtils {
@Override
protected void onNewResultImpl(Bitmap bitmap) {
Bitmap compressBp = compressBitmap(bitmap);
Bitmap resultBp = addBackGround(compressBp);
msg.thumbData = Util.bmpToByteArray(resultBp, true);
if (mShareType == ShareType.askNormal || mShareType == ShareType.askInvite) {
msg.thumbData = Util.bmpToByteArray(compressBp, true);
} else {
Bitmap resultBp = addBackGround(compressBp);
msg.thumbData = Util.bmpToByteArray(resultBp, true);
}
mIWXAPI.sendReq(req);
}
@ -317,10 +303,10 @@ public class ShareUtils {
}
//压缩图片
private Bitmap compressBitmap(Bitmap bitmap) {
public static Bitmap compressBitmap(Bitmap bitmap) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, bos);
float zoom = (float) Math.sqrt(10 * 1024 / (float) bos.toByteArray().length);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
float zoom = (float) Math.sqrt(9 * 1024 / (float) bos.toByteArray().length);
Matrix matrix = new Matrix();
matrix.setScale(zoom, zoom);
@ -328,15 +314,14 @@ public class ShareUtils {
Bitmap result = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bos.reset();
result.compress(Bitmap.CompressFormat.JPEG, 85, bos);
result.compress(Bitmap.CompressFormat.JPEG, 100, bos);
while (bos.toByteArray().length > 10 * 1024) {
while (bos.toByteArray().length > 9 * 1024) {
System.out.println(bos.toByteArray().length);
matrix.setScale(0.9f, 0.9f);
result = Bitmap.createBitmap(result, 0, 0, result.getWidth(), result.getHeight(), matrix, true);
bos.reset();
result.compress(Bitmap.CompressFormat.JPEG, 85, bos);
result.compress(Bitmap.CompressFormat.JPEG, 100, bos);
}
return result;
@ -364,78 +349,61 @@ public class ShareUtils {
}
//QQ空间分享
private void qZoneSahre() {
Utils.toast(mContext, mContext.getString(R.string.share_skip));
private void qZoneShare() {
Utils.toast(mContext, R.string.share_skip);
Bundle params = new Bundle();
String title;
String summary = null;
if (isToolsBox) {
title = shareNewsTitle;
summary = shareGameName;
} else if (ispopupWindow) {
if (shareNewsTitle != null) {
title = shareNewsTitle;
} else {
title = "向你推荐:";
if (isPlugin) {
summary = shareGameName + "(光环加速版)";
} else {
summary = shareGameName;
}
}
} else {
title = "玩手游不用肝的感觉真好";
summary = "绿色安全的手游加速助手";
switch (mShareType) {
case plugin:
mSummary += "(光环加速版)";
break;
case askNormal:
mTitle += " - 光环助手";
break;
}
ArrayList<String> imageUrls = new ArrayList<>();
imageUrls.add(shareIcon);
if (summary != null) {
params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, summary);
if (!TextUtils.isEmpty(mSummary)) {
params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, mSummary);
}
params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title);
params.putString(QzoneShare.SHARE_TO_QQ_TITLE, mTitle);
params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_NO_TYPE);
params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, shareUrl);
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
params.putString(QzoneShare.SHARE_TO_QQ_APP_NAME, "光环助手");
params.putString(QzoneShare.SHARE_TO_QQ_APP_NAME, mContext.getString(R.string.app_name));
mTencent.shareToQzone(
(Activity) mContext, params, QqShareListener);
if (ispopupWindow) {
mTencent.shareToQzone(mActivity, params, QqShareListener);
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
}
}
//微信朋友圈分享
private void wechatMomentsSahre() {
Utils.toast(mContext, mContext.getString(R.string.share_skip));
private void wechatMomentsShare() {
Utils.toast(mContext, R.string.share_skip);
WXWebpageObject webpage = new WXWebpageObject();
WXMediaMessage msg = new WXMediaMessage(webpage);
webpage.webpageUrl = shareUrl;
String title;
if (isToolsBox) {
title = shareNewsTitle;
} else if (ispopupWindow) {
if (shareNewsTitle != null) {
title = shareNewsTitle;
} else {
if (isPlugin) {
title = shareGameName + "(光环加速版)";
} else {
title = shareGameName;
}
}
} else {
title = "玩手游不用肝的感觉真好";
switch (mShareType) {
case plugin:
msg.title = mSummary + "(光环加速版)";
break;
case game:
msg.title = mSummary;
break;
case askNormal:
msg.title = mTitle + " - 光环助手";
break;
default:
msg.title = mTitle;
break;
}
msg.title = title;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
@ -443,39 +411,46 @@ public class ShareUtils {
req.scene = SendMessageToWX.Req.WXSceneTimeline;
loadBitMap(shareIcon, msg, req);
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
}
}
//新浪微博分享
private void sinaWeiboSahre() {
private void sinaWeiboShare() {
Intent intent = WeiBoShareActivity.getWeiboshareIntent(mContext,
shareNewsTitle, shareIcon, shareGameName, shareUrl, isPlugin, ispopupWindow, isToolsBox);
shareUrl, shareIcon, mTitle, mSummary, mShareType.toString());
mContext.startActivity(intent);
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
}
}
//短信分享
private void shortMessageSahre() {
private void shortMessageShare() {
String smsBody;
if (isToolsBox) {
smsBody = shareNewsTitle + shareUrl;
} else if (ispopupWindow) {
if (shareNewsTitle != null) {
smsBody = shareNewsTitle + shareUrl;
} else {
if (isPlugin) {
smsBody = "向你推荐:" + shareGameName + "(光环加速版)" + shareUrl;
} else {
smsBody = "向你推荐:" + shareGameName + shareUrl;
}
}
} else {
smsBody = "这个App可以下载各种热门卡牌手游的加速版绿色安全超级省心做日常效率提高3-5倍光环助手官网地址" + shareUrl;
switch (mShareType) {
case news:
case tools:
smsBody = mTitle + shareUrl;
break;
case plugin:
smsBody = mTitle + mSummary + "(光环加速版)" + shareUrl;
break;
case game:
smsBody = mTitle + mSummary + shareUrl;
break;
case shareGh:
smsBody = "这个App可以下载各种热门卡牌手游的加速版绿色安全超级省心做日常效率提高3-5倍光环助手官网地址" + shareUrl;
break;
case askInvite:
case askNormal:
smsBody = mTitle + " - 光环助手" + shareUrl;
break;
default:
smsBody = mTitle;
break;
}
try {
@ -486,7 +461,7 @@ public class ShareUtils {
e.printStackTrace();
}
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
}
}
@ -495,7 +470,7 @@ public class ShareUtils {
private void copyLink(String copyContent) {
ClipboardManager cmb = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(copyContent);
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
Utils.toast(mContext, "复制成功");
popupWindow.dismiss();
} else {
@ -520,25 +495,29 @@ public class ShareUtils {
public void onClick(View v) {
switch (holder.getPosition()) {
case 0:
wechatSahre();
wechatShare();
break;
case 1:
wechatMomentsSahre();
wechatMomentsShare();
break;
case 2:
qqSahre();
qqShare();
break;
case 3:
qZoneSahre();
qZoneShare();
break;
case 4:
sinaWeiboSahre();
sinaWeiboShare();
break;
case 5:
shortMessageSahre();
shortMessageShare();
break;
case 6:
if (ispopupWindow) {
if (mShareType == ShareType.askInvite) {
copyLink(mTitle + " - 光环助手" + shareUrl);
} else if (mShareType == ShareType.askNormal) {
copyLink(shareUrl);
} else if (mShareType != ShareType.shareGh) {
copyLink(shareUrl);
} else {
Intent data = IntentUtils.getEmailToGHIntent();
@ -546,7 +525,7 @@ public class ShareUtils {
}
break;
case 7:
if (ispopupWindow) {
if (mShareType != ShareType.shareGh) {
popupWindow.dismiss();
} else {
copyLink("推荐光环助手,绿色安全的手游加速助手:" + shareUrl);

View File

@ -3,7 +3,6 @@ package com.gh.common.util;
import android.support.v4.util.ArrayMap;
import android.text.TextUtils;
import com.gh.common.constant.Config;
import com.gh.common.constant.Constants;
import java.util.regex.Pattern;
@ -23,84 +22,37 @@ public class TimestampUtils {
private static void initIntervalMap() {
intervalMap = new ArrayMap<>();
intervalMap.put("^" + Config.API_HOST + "index/slides" + "$", 5);
intervalMap.put("^" + Config.API_HOST + "game/chajian" + "$", 10);
intervalMap.put("^" + Config.API_HOST + "game/tuijian" + "$", 15);
intervalMap.put("^" + Config.API_HOST + "game/.+/detail" + "$", 20);
intervalMap.put("^" + Config.API_HOST + "game/.+/digest" + "$", 25);
intervalMap.put("^" + Config.API_HOST + "game/remenkapai" + "$", 30);
intervalMap.put("^" + Config.API_HOST + "game/.+/news_digest" + "$", 35);
intervalMap.put("^" + Config.API_HOST + "game/column/.+\\?page=.+" + "$", 40);
intervalMap.put("^" + Config.API_HOST + "support/package/.+/game/digest" + "$", 45);
intervalMap.put("^" + Config.API_HOST + "game/danjiyouxi\\?limit=20\\&offset=.+" + "$", 50);
intervalMap.put("^" + Config.API_HOST + "news/.+/digest" + "$", 55);
intervalMap.put("^" + Config.API_HOST + "news/.+/detail" + "$", 60);
intervalMap.put("^" + Config.API_HOST + "news/.+/suggestion" + "$", 65);
intervalMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=3" + "$", 70);
intervalMap.put("^" + Config.API_HOST + "zixun/zixun\\?limit=20\\&offset=.+" + "$", 75);
intervalMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+" + "$", 80);
intervalMap.put("^" + Config.API_HOST + "zixun/yuanchuang\\?limit=20\\&offset=.+" + "$", 85);
intervalMap.put("^" + Config.API_HOST + "news\\?type_group=.+\\&offset=.+\\&limit=20" + "$", 90);
intervalMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?key=.+\\&limit=20\\&offset=.+" + "$", 95);
intervalMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+\\&type=.+" + "$", 100);
intervalMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?game_id=.+\\&limit=20\\&offset=.+" + "$", 105);
intervalMap.put("^" + Config.API_HOST + "search/news\\?game_id=.+\\&keyword=.+\\&page=.+\\&limit=20" + "$", 110);
intervalMap.put("^" + Config.API_HOST + "search/game\\?keyword=.+" + "$", 115);
intervalMap.put("^" + Config.API_HOST + "support/setting/platform" + "$", 120);
intervalMap.put("^" + Config.API_HOST + "update/package/.+" + "$", 125);
intervalMap.put("^" + Config.API_HOST + "update/game/.+/package/.+" + "$", 130);
intervalMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?limit=10\\&offset=.+" + "$", 135);
intervalMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?order=hot\\&limit=10\\&offset=.+" + "$", 140);
intervalMap.put(".*index.*", 5);
intervalMap.put(".*columns.*", 10);
intervalMap.put(".*games.*", 15);
intervalMap.put(".*articles.*", 20);
}
private static void initCDMap() {
cdMap = new ArrayMap<>();
cdMap.put("^" + Config.API_HOST + "index/slides" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/chajian" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/tuijian" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/.+/detail" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/.+/digest" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/remenkapai" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/.+/news_digest" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/column/.+\\?page=.+" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "support/package/.+/game/digest" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "game/danjiyouxi\\?limit=20\\&offset=.+" + "$", Constants.GAME_CD);
cdMap.put("^" + Config.API_HOST + "news/.+/digest" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "news/.+/detail" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "news/.+/suggestion" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=3" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "zixun/zixun\\?limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "zixun/yuanchuang\\?limit=10\\&offset=.+" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "news\\?type_group=.+\\&offset=.+\\&limit=20" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?key=.+\\&limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+\\&type=.+" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?game_id=.+\\&limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "search/news\\?game_id=.+\\&keyword=.+\\&page=.+\\&limit=20" + "$", Constants.NEWS_CD);
cdMap.put("^" + Config.API_HOST + "search/game\\?keyword=.+" + "$", Constants.SEARCH_CD);
cdMap.put("^" + Config.API_HOST + "support/setting/platform" + "$", Constants.PLATFORM_CD);
cdMap.put("^" + Config.API_HOST + "update/package/.+" + "$", Constants.UPDATE_CD);
cdMap.put("^" + Config.API_HOST + "update/game/.+/package/.+" + "$", Constants.UPDATE_CD);
cdMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?limit=10\\&offset=.+" + "$", Constants.COMMENT_CD);
cdMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?order=hot\\&limit=10\\&offset=.+" + "$", Constants.COMMENT_CD);
cdMap.put("^" + Config.API_HOST + "device/.+/concern" + "$", 0);
cdMap.put("^" + Config.API_HOST + "device/.+/concern/.+" + "$", 0);
cdMap.put("^" + Config.API_HOST + "stat/download" + "$", 0);
cdMap.put("^" + Config.API_HOST + "disclaimer" + "$", 0);
cdMap.put("^" + Config.API_HOST + "search/game/default" + "$", 0);
cdMap.put("^" + Config.API_HOST + "support/upgrade\\?version=.+\\&channel=.+" + "$", 0);
cdMap.put("^" + Config.API_HOST + "support/time/current" + "$", 0);
cdMap.put("^" + Config.API_HOST + "support/setting/ui" + "$", 0);
cdMap.put("^" + Config.API_HOST + "support/download_status\\?version=.+\\&channel=.+" + "$", 0);
cdMap.put("^" + Config.API_HOST + "support/suggestion" + "$", 0);
cdMap.put("^" + Config.API_HOST + "game/.+/serverInfo" + "$", 0);
cdMap.put("^" + Config.API_HOST + "support/package/unused\\?skip=.+" + "$", 0);
cdMap.put(".*index.*", Constants.GAME_CD);
cdMap.put(".*columns.*", Constants.GAME_CD);
cdMap.put(".*games.*", Constants.GAME_CD);
cdMap.put(".*articles.*", Constants.NEWS_CD);
}
/*
* 为url添加timestamp
*/
public static String addTimestamp(String url) {
// // TODO: 22/12/17 刷新版
// if (TextUtils.isEmpty(url)) {
// return url;
// }
// if (url.contains("?")) {
// String u = url + "&timestamp=" + System.currentTimeMillis();
// return u;
// } else {
// String u = url + "?timestamp=" + System.currentTimeMillis();
// return u;
// }
if (TextUtils.isEmpty(url)) {
return url;
}

View File

@ -3,197 +3,21 @@ package com.gh.common.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Environment;
import android.preference.PreferenceManager;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.gh.gamecenter.retrofit.StringResponse;
import com.lightgame.utils.Utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lightgame.utils.Util_System_Phone_State;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class TokenUtils {
// 注册设备
// public static synchronized void register(final Context context) {
// Map<String, String> params = new HashMap<>();
// params.put("MANUFACTURER", Build.MANUFACTURER);
// params.put("MODEL", Build.MODEL);
// params.put("ANDROID_SDK", String.valueOf(Build.VERSION.SDK_INT));
// params.put("ANDROID_VERSION", Build.VERSION.RELEASE);
// String android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
// if (!TextUtils.isEmpty(android_id)) {
// params.put("ANDROID_ID", android_id);
// }
// String imei = Util_System_Phone_State.getDeviceId(context);
// if (!TextUtils.isEmpty(imei)) {
// params.put("IMEI", imei);
// }
// WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// String mac = wm.getConnectionInfo().getMacAddress();
// if (!TextUtils.isEmpty(mac) || !":::::".equals(mac)) {
// params.put("MAC", mac);
// } else {
// SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
// sp.edit().putBoolean("isUploadMac", false).apply();
// }
// String mid = StatConfig.getMid(context);
// if (!TextUtils.isEmpty(mid) || !"0".equals(mid)) {
// params.put("MTA_ID", mid);
// } else {
// SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
// sp.edit().putBoolean("isUploadMid", false).apply();
// }
// RequestBody body = RequestBody.create(MediaType.parse("application/json"), new JSONObject(params).toString());
// RetrofitManager.getInstance(context).getApi().postRegister(body)
// .subscribeOn(Schedulers.io())
// .observeOn(Schedulers.io())
// .subscribe(new JSONObjectResponse() {
// @Override
// public void onResponse(JSONObject response) {
// if (response.length() != 0) {
// try {
// // 保存device_id
// saveDeviceId(context, response.getString("device_id"));
// Utils.log("device_id = " + response.getString("device_id"));
// } catch (JSONException e) {
// e.printStackTrace();
// }
// }
// }
// });
// }
public static synchronized void saveDeviceId(Context context, String device_id) {
saveSharedPreferences(context, device_id);
saveDataFile(context, device_id);
svaeSDCard(device_id, "/gh-uuid");// SDCard根目录
svaeSDCard(device_id, "/system"); // SDCard system目录
svaeSDCard(device_id, "/data"); // SDCard data目录
}
//将uuid存到sp
private static void saveSharedPreferences(Context context, String device_id) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("uuid", device_id);
edit.apply();
Utils.log("saveDeviceId", "保存成功SP");
}
//将uuid存到data/data/PackageName/files文件夹下
private static void saveDataFile(Context context, String device_id) {
FileOutputStream fops;
try {
fops = context.openFileOutput("uuid", Context.MODE_PRIVATE);
fops.write(device_id.getBytes());
fops.close();
Utils.log("saveDeviceId", "保存成功DataFile");
} catch (Exception e) {
Utils.log("保存uuid到data/data/PackageName/files文件异常" + e.toString());
e.printStackTrace();
}
}
//将uuid存到SD卡
private static void svaeSDCard(String device_id, String saveDir) {
File sdCardDir = Environment.getExternalStorageDirectory();
String path = sdCardDir.getPath() + saveDir;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
// 判断文件是否存在,存在则删除
File uuidFile = new File(path + "/uuid");
if (uuidFile.isFile() && uuidFile.exists()) {
Utils.log(saveDir + "文件夹里的文件存在,执行删除操作");
uuidFile.delete();
}
File writeFile = new File(file, "uuid");
FileOutputStream fos;
try {
fos = new FileOutputStream(writeFile);
fos.write(device_id.getBytes());
fos.close();
Utils.log("saveDeviceId", "保存成功SDCard" + "目录为:" + saveDir);
} catch (Exception e) {
Utils.log("保存uuid到SDCard异常" + saveDir + e.toString());
e.printStackTrace();
}
}
// // 获取用户token
// public static synchronized Observable<String> getToken(final Context context, boolean isCheck) {
//
// if (true) { // TODO TEST
// return Observable.just(LoginUtils.getToken(context));
// }
//
// String token = null;
// if (isCheck) {
// SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
// token = sp.getString("token", null);
// if (token != null) {
// long expire = sp.getLong("token_expire", 0) * 1000 - 10 * 1000;
// long time = Utils.getTime(context);
// // 判断token是否过期
// if (time >= expire) {
// // token已过期
// token = null;
// }
// }
// }
// if (token == null) {
// Map<String, String> params = new HashMap<>();
// params.put("device_id", getDeviceId(context));
// return RetrofitManager.getInstance(context).getApi()
// .postLogin(RequestBody.create(MediaType.parse("application/json"), new JSONObject(params).toString()))
// .flatMap(new Func1<ResponseBody, Observable<String>>() {
// @Override
// public Observable<String> call(ResponseBody responseBody) {
// String value = null;
// try {
// SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
// Editor editor = sp.edit();
// JSONObject response = new JSONObject(responseBody.string());
// editor.putString("user_name", response.getString("name"));
// editor.putString("user_icon", response.getString("icon"));
// response = response.getJSONObject("token");
// editor.putString("token", response.getString("value"));
// editor.putLong("token_expire", response.getLong("expire"));
// editor.apply();
// // 服务器返回的token和本地已存的token相同更新本地时间
// getTime(context);
// value = response.getString("value");
// } catch (IOException | JSONException e) {
// e.printStackTrace();
// }
// return Observable.just(value);
// }
// }).onErrorResumeNext(new Func1<Throwable, Observable<? extends String>>() {
// @Override
// public Observable<? extends String> call(Throwable throwable) {
// return Observable.error(throwable);
// }
// });
// }
// return Observable.just(token);
// }
// TODO VERSION:3.0 之后不存在deviceId
@Deprecated
public static synchronized String getDeviceId(Context context) {
return loadSharedPreferences(context, false);
return Util_System_Phone_State.getDeviceId(context); // 暂时用IMEI代替
}
// 获取服务器时间
@ -219,118 +43,4 @@ public class TokenUtils {
});
}
//读取SharedPreferences的uuid
private static String loadSharedPreferences(Context context, boolean isCheck) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String uuid = sp.getString("uuid", null);
if (isCheck) {
return uuid;
}
if (uuid == null) {
return loadDataFile(context, false);
}
if (BuildConfig.DEBUG) {
Utils.log("getDeviceId", "获取成功SP" + uuid);
}
return uuid;
}
//读取data/data/PackageName/files的uuid
private static String loadDataFile(Context context, boolean isCheck) {
File file = new File(context.getFilesDir(), "uuid");
if (file.exists()) {
try {
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
int count = -1;
String uuid = null;
while ((count = fis.read(b)) != -1) {
uuid = new String(b, 0, count, "UTF-8");
}
Utils.log("getDeviceId", "获取成功DataFile" + uuid);
return uuid;
} catch (Exception e) {
e.printStackTrace();
}
} else if (!isCheck) {
String[] dirName = {"/gh-uuid", "/system", "/data"};
for (int i = 0; i < 3; i++) {
String s = loadSDCard(dirName[i]);
if (s != null) {
return s;
}
}
}
return null;
}
//读取SD卡的uuid
private static String loadSDCard(String saveDir) {
File sdCardDir = Environment.getExternalStorageDirectory();
String path = sdCardDir.getPath() + saveDir;
File file = new File(path, "uuid");
if (file.exists()) {
FileInputStream fis;
ByteArrayOutputStream bos;
try {
fis = new FileInputStream(file);
bos = new ByteArrayOutputStream();
byte[] array = new byte[1024];
int len = -1;
while ((len = fis.read(array)) != -1) {
bos.write(array, 0, len);
}
bos.close();
fis.close();
Utils.log("getDeviceId", "获取成功SDCard" + "目录为:" + saveDir + "::" + bos.toString());
return bos.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
// // 检查设备信息是否已经上传完整
// public static synchronized void checkDeviceInfo(Context context, String token) {
// final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
// final HashMap<String, String> params = new HashMap<>();
// if (!sp.getBoolean("isUploadExtra", false)) {
// params.put("MANUFACTURER", Build.MANUFACTURER);
// params.put("MODEL", Build.MODEL);
// params.put("ANDROID_SDK", String.valueOf(Build.VERSION.SDK_INT));
// params.put("ANDROID_VERSION", Build.VERSION.RELEASE);
// }
// if (!sp.getBoolean("isUploadMac", true)) {
// WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// String mac = wm.getConnectionInfo().getMacAddress();
// if (!TextUtils.isEmpty(mac) || !":::::".equals(mac)) {
// params.put("MAC", mac);
// }
// }
// if (!sp.getBoolean("isUploadMid", true)) {
// String mid = StatConfig.getMid(context);
// if (!TextUtils.isEmpty(mid) || !"0".equals(mid)) {
// params.put("MTA_ID", mid);
// }
// }
// if (params.size() != 0) {
// RequestBody body = RequestBody.create(MediaType.parse("application/json"),
// new JSONObject(params).toString());
// RetrofitManager.getInstance(context).getApi().postDevice(token, body, TokenUtils.getDeviceId(context))
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new Response<ResponseBody>() {
// @Override
// public void onResponse(ResponseBody response) {
// SharedPreferences.Editor editor = sp.edit();
// editor.putBoolean("isUploadExtra", true);
// editor.putBoolean("isUploadMac", true);
// editor.putBoolean("isUploadMid", true);
// editor.apply();
// }
// });
// }
// }
}

View File

@ -0,0 +1,30 @@
package com.gh.common.util;
import android.support.annotation.NonNull;
import com.lightgame.config.CommonDebug;
/**
* Created by khy on 27/03/18.
*/
public class UrlFilterUtils {
// keyName,value,keyName,value......
public static String getFilterQuery(@NonNull String... arrStr) {
if (CommonDebug.IS_DEBUG && (arrStr.length <= 1 || arrStr.length % 2 != 0)) {
throw new IllegalStateException("UrlFilterUtils->getFilterQuery");
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < arrStr.length; i++) {
String s = arrStr[i];
result.append(s);
if (i % 2 == 0) {
result.append(":");
} else if (i != arrStr.length - 1) {
result.append(",");
}
}
return result.toString();
}
}

View File

@ -73,7 +73,7 @@ public class DownloadDialog implements OnCollectionCallBackListener {
@Override
public void onDataChanged(DownloadEntity downloadEntity) {
if (downloadEntity.getName().equals(gameEntity.getName())
&& !"delete".equals(DownloadManager.getInstance(mContext).getStatus(downloadEntity.getUrl()))) {
&& !DownloadStatus.delete.equals(DownloadManager.getInstance(mContext).getStatus(downloadEntity.getUrl()))) {
adapter.putDownloadEntity(downloadEntity);
@ -86,8 +86,8 @@ public class DownloadDialog implements OnCollectionCallBackListener {
private LinearLayout dialog_ll_collection_hint;
private String entrance;
private String location;
private int row;
private int column;
private final int row = 3;
private final int column = 3;
private boolean isLoadPlatform;
private DownloadDialog() {
@ -117,9 +117,6 @@ public class DownloadDialog implements OnCollectionCallBackListener {
this.location = location;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
row = sp.getInt("download_box_row", 3);
column = sp.getInt("download_box_column", 3);
gameApk = sortApk(new ArrayList<>(gameEntity.getApk()));
if (gameEntity.getCollection() != null) {

View File

@ -0,0 +1,137 @@
package com.gh.common.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.support.annotation.StringRes;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.ProgressBar;
import com.gh.common.util.DisplayUtils;
import com.gh.gamecenter.R;
public class DownloadProgressBar extends ProgressBar {
private static final int MAX_LENGTH = 1000;
public enum DownloadType {
NORMAL,
NONE,
PLUGIN,
LAUNCH_OR_OPEN,
INSTALL_NORMAL,
INSTALL_PLUGIN,
DOWNLOADING_NORMAL,
DOWNLOADING_PLUGIN,
}
private PorterDuffXfermode mDuffXFerMode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private DownloadType mDownloadType;
private String mText;
private int mDefaultColor;
public DownloadProgressBar(Context context) {
super(context);
}
public DownloadProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
setMax(MAX_LENGTH);
setProgressDrawable(getResources().getDrawable(R.drawable.game_item_btn_download_style));
}
Bitmap srcBitmap;
Canvas srcCanvas;
RectF rectF;
private void create() {
srcBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888);
srcCanvas = new Canvas(srcBitmap);
rectF = new RectF(0, 0, getProgress() * getWidth() / MAX_LENGTH, getMeasuredHeight());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (TextUtils.isEmpty(mText)) return;
mPaint.setColor(mDefaultColor == 0 ? ContextCompat.getColor(getContext(), R.color.theme) : mDefaultColor); // 初始化颜色
mPaint.setTextSize(DisplayUtils.sp2px(getContext(), 14));
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setXfermode(null);
create();
Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
int baseline = (getHeight() - fontMetrics.bottom - fontMetrics.top) / 2;
mPaint.setTextAlign(Paint.Align.CENTER);
srcCanvas.drawText(mText, getWidth() / 2, baseline, mPaint);
mPaint.setXfermode(mDuffXFerMode);
mPaint.setColor(Color.WHITE); // 反向颜色
srcCanvas.drawRect(rectF, mPaint);
canvas.drawBitmap(srcBitmap, 0, 0, null);
}
public void setText(String text) {
mText = text;
invalidate();
}
public String getText() {
return mText;
}
public void setText(@StringRes int res) {
setText(getResources().getString(res));
}
public void setDownloadType(DownloadType downloadType) {
switch (downloadType) {
case NORMAL:
case INSTALL_NORMAL:
setProgressDrawable(getResources().getDrawable(R.drawable.game_item_btn_download_style));
mDefaultColor = Color.WHITE;
break;
case PLUGIN:
case INSTALL_PLUGIN:
setProgressDrawable(getResources().getDrawable(R.drawable.game_item_btn_plugin_style));
mDefaultColor = Color.WHITE;
break;
case NONE:
setProgressDrawable(getResources().getDrawable(R.drawable.news_detail_comment)); // todo 是否需要点击效果
mDefaultColor = ContextCompat.getColor(getContext(), R.color.hint);
break;
case LAUNCH_OR_OPEN:
setProgress(0);
setProgressDrawable(getResources().getDrawable(R.drawable.detail_downloading_normal_style)); // todo 背景是否需要与下载中区分
mDefaultColor = ContextCompat.getColor(getContext(), R.color.theme);
break;
case DOWNLOADING_NORMAL: // todo bug 和列表用相同的drawable会复用
setProgressDrawable(getResources().getDrawable(R.drawable.detail_downloading_normal_style2));
mDefaultColor = ContextCompat.getColor(getContext(), R.color.theme);
break;
case DOWNLOADING_PLUGIN:
setProgressDrawable(getResources().getDrawable(R.drawable.detail_downloading_plugin_style));
mDefaultColor = ContextCompat.getColor(getContext(), R.color.btn_plugin);
break;
}
mDownloadType = downloadType;
}
public DownloadType getDownloadType() {
return mDownloadType;
}
}

View File

@ -0,0 +1,45 @@
package com.gh.common.view;
import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;
/**
* Created by khy on 20/04/18.
*/
public class FixedSpeedScroller extends Scroller {
private int mDuration = 0;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
public void setmDuration(int time) {
mDuration = time;
}
public int getmDuration() {
return mDuration;
}
}

View File

@ -14,16 +14,20 @@ import android.view.View;
public class GridDivider extends RecyclerView.ItemDecoration {
public final int[] ATRRS = new int[]{android.R.attr.listDivider};
private Drawable mDividerDarwable;
private int mDividerHight = 1;
private Paint mColorPaint;
private int mDividerHight = 1;
private int mGridCount;
/*
int dividerHight 分割线的线宽
int dividerColor 分割线的颜色
*/
public GridDivider(Context context, int dividerHight, int dividerColor) {
public GridDivider(Context context, int dividerHight, int gridCount, int dividerColor) {
this(context);
mDividerHight = dividerHight;
mGridCount = gridCount;
mColorPaint = new Paint();
mColorPaint.setColor(dividerColor);
}
@ -65,7 +69,7 @@ public class GridDivider extends RecyclerView.ItemDecoration {
int bottom = 0;
// 最上面一行
if ((i / 7) == 0) {
if ((i / mGridCount) == 0) {
//当前item最上面的分割线
top = child.getTop();
//当前item下面的分割线
@ -103,7 +107,7 @@ public class GridDivider extends RecyclerView.ItemDecoration {
int right = 0;
//左边第一列
if ((i % 7) == 0) {
if ((i % mGridCount) == 0) {
//item左边分割线
left = child.getLeft();
right = left + mDividerHight;

View File

@ -0,0 +1,53 @@
package com.gh.common.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
import com.gh.common.util.DisplayUtils;
/**
* Created by khy on 2/04/18.
*/
public class LimitHeightScrollView extends ScrollView {
private int mLimitHeight;
public LimitHeightScrollView(Context context) {
super(context);
}
public LimitHeightScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mLimitHeight = DisplayUtils.dip2px(getContext(), 240);
}
public LimitHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (heightMode == MeasureSpec.EXACTLY) {
heightSize = heightSize <= mLimitHeight ? heightSize
: mLimitHeight;
}
if (heightMode == MeasureSpec.UNSPECIFIED) {
heightSize = heightSize <= mLimitHeight ? heightSize
: mLimitHeight;
}
if (heightMode == MeasureSpec.AT_MOST) {
heightSize = heightSize <= mLimitHeight ? heightSize
: mLimitHeight;
}
int maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize,
heightMode);
super.onMeasure(widthMeasureSpec, maxHeightMeasureSpec);
}
}

View File

@ -44,7 +44,7 @@ public class RadarView extends View {
}
/**
* TODO<提前初始化好需要使用的对象,避免在绘制过程中多次初始化>
* 提前初始化好需要使用的对象,避免在绘制过程中多次初始化
*
* @return void
*/
@ -58,7 +58,6 @@ public class RadarView extends View {
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 获取控件区域宽高
@ -131,7 +130,7 @@ public class RadarView extends View {
}
/**
* TODO<设置扫描状态>
* 设置扫描状态
*
* @return void
*/
@ -141,7 +140,7 @@ public class RadarView extends View {
}
/**
* TODO<解析获取控件宽高>
* 解析获取控件宽高
*
* @return int
*/

View File

@ -0,0 +1,494 @@
package com.gh.common.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.gh.common.util.AskUtils;
import com.gh.common.util.NetworkUtils;
import com.gh.common.util.RichEditorUtils;
import com.gh.gamecenter.BuildConfig;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/**
* Copyright (C) 2017 Wasabeef
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class RichEditor extends WebView {
public enum Type {
BOLD,
ITALIC,
SUBSCRIPT,
SUPERSCRIPT,
STRIKETHROUGH,
UNDERLINE,
H1,
H2,
H3,
H4,
H5,
H6,
ORDEREDLIST,
UNORDEREDLIST,
JUSTIFYCENTER,
JUSTIFYFULL,
JUSTUFYLEFT,
JUSTIFYRIGHT
}
public interface OnTextChangeListener {
void onTextChange(String text);
}
public interface OnDecorationStateListener {
void onStateChangeListener(String text, List<Type> types);
}
public interface AfterInitialLoadListener {
void onAfterInitialLoad(boolean isReady);
}
private static final String SETUP_HTML = "file:///android_asset/editor.html";
private static final String CALLBACK_SCHEME = "re-callback://";
private static final String STATE_SCHEME = "re-state://";
private boolean isReady = false;
private String mContents;
private OnTextChangeListener mTextChangeListener;
private OnDecorationStateListener mDecorationStateListener;
private AfterInitialLoadListener mLoadListener;
public RichEditor(Context context) {
this(context, null);
}
public RichEditor(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.webViewStyle);
}
@SuppressLint("SetJavaScriptEnabled")
public RichEditor(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setVerticalScrollBarEnabled(false);
setHorizontalScrollBarEnabled(false);
getSettings().setJavaScriptEnabled(true);
setWebChromeClient(new WebChromeClient());
setWebViewClient(createWebviewClient());
if (BuildConfig.DEBUG && Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
setWebContentsDebuggingEnabled(true);
}
loadUrl(SETUP_HTML);
applyAttributes(context, attrs);
}
protected EditorWebViewClient createWebviewClient() {
return new EditorWebViewClient();
}
public void setOnTextChangeListener(OnTextChangeListener listener) {
mTextChangeListener = listener;
}
public void setOnDecorationChangeListener(OnDecorationStateListener listener) {
mDecorationStateListener = listener;
}
public void setOnInitialLoadListener(AfterInitialLoadListener listener) {
mLoadListener = listener;
}
private void callback(String text) {
mContents = text.replaceFirst(CALLBACK_SCHEME, "");
if (mTextChangeListener != null) {
mTextChangeListener.onTextChange(mContents);
}
}
private void stateCheck(String text) {
String state = text.replaceFirst(STATE_SCHEME, "").toUpperCase(Locale.ENGLISH);
List<Type> types = new ArrayList<>();
for (Type type : Type.values()) {
if (TextUtils.indexOf(state, type.name()) != -1) {
types.add(type);
}
}
if (mDecorationStateListener != null) {
mDecorationStateListener.onStateChangeListener(state, types);
}
}
private void applyAttributes(Context context, AttributeSet attrs) {
final int[] attrsArray = new int[]{
android.R.attr.gravity
};
TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);
int gravity = ta.getInt(0, NO_ID);
switch (gravity) {
case Gravity.LEFT:
exec("javascript:RE.setTextAlign(\"left\")");
break;
case Gravity.RIGHT:
exec("javascript:RE.setTextAlign(\"right\")");
break;
case Gravity.TOP:
exec("javascript:RE.setVerticalAlign(\"top\")");
break;
case Gravity.BOTTOM:
exec("javascript:RE.setVerticalAlign(\"bottom\")");
break;
case Gravity.CENTER_VERTICAL:
exec("javascript:RE.setVerticalAlign(\"middle\")");
break;
case Gravity.CENTER_HORIZONTAL:
exec("javascript:RE.setTextAlign(\"center\")");
break;
case Gravity.CENTER:
exec("javascript:RE.setVerticalAlign(\"middle\")");
exec("javascript:RE.setTextAlign(\"center\")");
break;
}
ta.recycle();
}
public void setHtml(String contents, boolean isLoadTbImage) {
if (contents == null) {
contents = "";
}
try {
exec("javascript:RE.setHtml('" + URLEncoder.encode(contents, "UTF-8") + "');");
if (isLoadTbImage && !NetworkUtils.isWifiConnected(getContext())) {
exec("javascript:RE.replaceTbImage()");
}
exec("javascript:RE.ImageClickListener()");
callback(contents);
} catch (UnsupportedEncodingException e) {
// No handling
}
mContents = contents;
}
// public void replaceTbImage() {
// exec("javascript:RE.replaceTbImage()");
// }
public String getHtml() {
return mContents;
}
public void setEditorFontColor(int color) {
String hex = convertHexColorString(color);
exec("javascript:RE.setBaseTextColor('" + hex + "');");
}
public void setEditorFontSize(int px) {
exec("javascript:RE.setBaseFontSize('" + px + "px');");
}
@Override
public void setPadding(int left, int top, int right, int bottom) {
super.setPadding(left, top, right, bottom);
exec("javascript:RE.setPadding('" + left + "px', '" + top + "px', '" + right + "px', '" + bottom
+ "px');");
}
@Override
public void setPaddingRelative(int start, int top, int end, int bottom) {
// still not support RTL.
setPadding(start, top, end, bottom);
}
public void setEditorBackgroundColor(int color) {
setBackgroundColor(color);
}
@Override
public void setBackgroundColor(int color) {
super.setBackgroundColor(color);
}
@Override
public void setBackgroundResource(int resid) {
Bitmap bitmap = RichEditorUtils.decodeResource(getContext(), resid);
String base64 = RichEditorUtils.toBase64(bitmap);
bitmap.recycle();
exec("javascript:RE.setBackgroundImage('url(data:image/png;base64," + base64 + ")');");
}
@Override
public void setBackground(Drawable background) {
Bitmap bitmap = RichEditorUtils.toBitmap(background);
String base64 = RichEditorUtils.toBase64(bitmap);
bitmap.recycle();
exec("javascript:RE.setBackgroundImage('url(data:image/png;base64," + base64 + ")');");
}
public void setBackground(String url) {
exec("javascript:RE.setBackgroundImage('url(" + url + ")');");
}
public void setEditorWidth(int px) {
exec("javascript:RE.setWidth('" + px + "px');");
}
public void setEditorHeight(int px) {
exec("javascript:RE.setHeight('" + px + "px');");
}
public void setPlaceholder(String placeholder) {
exec("javascript:RE.setPlaceholder('" + placeholder + "');");
}
public void setEditorFocus() {
exec("javascript:RE.setEditorFocus();");
}
public void setInputEnabled(Boolean inputEnabled) {
exec("javascript:RE.setInputEnabled(" + inputEnabled + ")");
}
public void replaceAllDfImage() {
exec("javascript:RE.replaceAllDfImage()");
}
public void setFocusByEnd() {
exec("javascript:RE.setFocusByEnd()");
}
public void replaceDfImageByUrl(String imgUrl) {
exec("javascript:RE.replaceDfImageByUrl('" + imgUrl + "');");
}
public void loadCSS(String cssFile) {
String jsCSSImport = "(function() {" +
" var head = document.getElementsByTagName(\"head\")[0];" +
" var link = document.createElement(\"link\");" +
" link.rel = \"stylesheet\";" +
" link.type = \"text/css\";" +
" link.href = \"" + cssFile + "\";" +
" link.media = \"all\";" +
" head.appendChild(link);" +
"}) ();";
exec("javascript:" + jsCSSImport + "");
}
public void undo() {
exec("javascript:RE.undo();");
}
public void redo() {
exec("javascript:RE.redo();");
}
public void setBold() {
exec("javascript:RE.setBold();");
}
public void setItalic() {
exec("javascript:RE.setItalic();");
}
public void setSubscript() {
exec("javascript:RE.setSubscript();");
}
public void setSuperscript() {
exec("javascript:RE.setSuperscript();");
}
public void setStrikeThrough() {
exec("javascript:RE.setStrikeThrough();");
}
public void setUnderline() {
exec("javascript:RE.setUnderline();");
}
public void setTextColor(int color) {
exec("javascript:RE.prepareInsert();");
String hex = convertHexColorString(color);
exec("javascript:RE.setTextColor('" + hex + "');");
}
public void setTextBackgroundColor(int color) {
exec("javascript:RE.prepareInsert();");
String hex = convertHexColorString(color);
exec("javascript:RE.setTextBackgroundColor('" + hex + "');");
}
public void setFontSize(int fontSize) {
if (fontSize > 7 || fontSize < 1) {
Log.e("RichEditor", "Font size should have a value between 1-7");
}
exec("javascript:RE.setFontSize('" + fontSize + "');");
}
public void removeFormat() {
exec("javascript:RE.removeFormat();");
}
public void setHeading(int heading) {
exec("javascript:RE.setHeading('" + heading + "');");
}
public void setIndent() {
exec("javascript:RE.setIndent();");
}
public void setOutdent() {
exec("javascript:RE.setOutdent();");
}
public void setAlignLeft() {
exec("javascript:RE.setJustifyLeft();");
}
public void setAlignCenter() {
exec("javascript:RE.setJustifyCenter();");
}
public void setAlignRight() {
exec("javascript:RE.setJustifyRight();");
}
public void setBlockquote() {
exec("javascript:RE.setBlockquote();");
}
public void setBullets() {
exec("javascript:RE.setBullets();");
}
public void setNumbers() {
exec("javascript:RE.setNumbers();");
}
public void insertImage(String url) {
exec("javascript:RE.prepareInsert();");
exec("javascript:RE.insertImage('" + url + "');");
}
public void insertLink(String href, String title) {
exec("javascript:RE.prepareInsert();");
exec("javascript:RE.insertLink('" + href + "', '" + title + "');");
}
public void insertTodo() {
exec("javascript:RE.prepareInsert();");
exec("javascript:RE.setTodo('" + RichEditorUtils.getCurrentTime() + "');");
}
public void focusEditor() {
requestFocus();
exec("javascript:RE.focus();");
}
public void clearFocusEditor() {
exec("javascript:RE.blurFocus();");
}
public String getText() {
return AskUtils.stripHtml(mContents);
}
private String convertHexColorString(int color) {
return String.format("#%06X", (0xFFFFFF & color));
}
protected void exec(final String trigger) {
if (isReady) {
load(trigger);
} else {
postDelayed(new Runnable() {
@Override
public void run() {
exec(trigger);
}
}, 100);
}
}
private void load(String trigger) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
evaluateJavascript(trigger, null);
} else {
loadUrl(trigger);
}
}
protected class EditorWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
isReady = url.equalsIgnoreCase(SETUP_HTML);
if (mLoadListener != null) {
mLoadListener.onAfterInitialLoad(isReady);
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String decode;
try {
decode = URLDecoder.decode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
// No handling
return false;
}
if (TextUtils.indexOf(url, CALLBACK_SCHEME) == 0) {
callback(decode);
return true;
} else if (TextUtils.indexOf(url, STATE_SCHEME) == 0) {
stateCheck(decode);
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
}
}

View File

@ -0,0 +1,178 @@
package com.gh.common.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import com.gh.common.util.DisplayUtils;
import com.gh.gamecenter.R;
/**
* Created by khy on 2/12/17.
*/
public class TabIndicatorView extends View implements ViewPager.OnPageChangeListener {
private TabLayout mTabLayout;
private int mIndicatorSpace;
private int mIndicatorHeight;
private int mIndicatorWidth;
public TabIndicatorView(Context context) {
this(context, null);
}
public TabIndicatorView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TabIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mIndicatorHeight = MeasureSpec.getSize(heightMeasureSpec);
}
public void setupWithTabLayout(final TabLayout tableLayout) {
mTabLayout = tableLayout;
tableLayout.setSelectedTabIndicatorColor(Color.TRANSPARENT);
tableLayout.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (mTabLayout.getScrollX() != getScrollX())
scrollTo(mTabLayout.getScrollX(), mTabLayout.getScrollY());
}
});
ViewCompat.setElevation(this, ViewCompat.getElevation(mTabLayout));
//清除Tab background
for (int tab = 0; tab < tableLayout.getTabCount(); tab++) {
View tabView = getTabViewByPosition(tab);
if (tabView != null) tabView.setBackgroundResource(0);
}
}
public void setupWithViewPager(ViewPager viewPager) {
viewPager.addOnPageChangeListener(this);
}
public void setIndicatorWidth(int width) {
if (width > 0) this.mIndicatorWidth = DisplayUtils.dip2px(getContext(), width);
}
public void setIndicatorSpace(int space) {
this.mIndicatorSpace = DisplayUtils.dip2px(getContext(), space);
}
private int getIndicatorSpace() {
if (mIndicatorSpace != 0) return mIndicatorSpace;
if (mIndicatorWidth != 0) {
View tag = getTabViewByPosition(0);
if (tag != null) return (tag.getWidth() - mIndicatorWidth) / 2;
}
return 0;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Drawable drawable = getResources().getDrawable(R.drawable.ask_tab_indicator_bg); // 固定Indicator背景 有需要可以自行更改
drawable.setBounds(l, t, r, b);
drawable.draw(canvas);
}
int l;
int t;
int r;
int b;
private void generatePath(int position, float positionOffset) {
RectF range = new RectF();
View tabView = getTabViewByPosition(position);
if (tabView == null)
return;
int left, top, right, bottom;
left = top = right = bottom = 0;
if (positionOffset > 0.f && position < mTabLayout.getTabCount() - 1) {
View nextTabView = getTabViewByPosition(position + 1);
if (nextTabView != null) {
left += (int) (nextTabView.getLeft() * positionOffset + tabView.getLeft() * (1.f - positionOffset));
right += (int) (nextTabView.getRight() * positionOffset + tabView.getRight() * (1.f - positionOffset));
}
left += getIndicatorSpace();
right -= getIndicatorSpace();
top = tabView.getTop() + getPaddingTop();
bottom = tabView.getBottom() - getPaddingBottom();
range.set(left, top, right, bottom);
} else {
left = tabView.getLeft() + getIndicatorSpace();
right = tabView.getRight() - getIndicatorSpace();
top = tabView.getTop() + getPaddingTop();
bottom = tabView.getBottom() - getPaddingBottom();
range.set(left, top, right, bottom);
if (range.isEmpty())
return;
}
r = right;
l = left;
t = top;
b = top + mIndicatorHeight;
}
private View getTabViewByPosition(int position) {
if (mTabLayout != null && mTabLayout.getTabCount() > 0) {
ViewGroup tabStrip = (ViewGroup) mTabLayout.getChildAt(0);
return tabStrip != null ? tabStrip.getChildAt(position) : null;
}
return null;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
generatePath(position, positionOffset);
invalidate();
}
@Override
public void onPageSelected(int position) {
if (mTabLayout.getSelectedTabPosition() != position) {
TabLayout.Tab tab = mTabLayout.getTabAt(position);
if (tab != null) tab.select();
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
}

View File

@ -15,13 +15,13 @@ public class VerticalItemDecoration extends RecyclerView.ItemDecoration {
private Paint paint;
private int mInterval = 0;
private boolean isShowIntervalTop;
private boolean mIsShowIntervalTop;
public VerticalItemDecoration(Context context, int interval, boolean isShowIntervalTop) {
paint = new Paint();
paint.setColor(ContextCompat.getColor(context, R.color.background));
mInterval = DisplayUtils.dip2px(context, interval);
this.isShowIntervalTop = isShowIntervalTop;
mIsShowIntervalTop = isShowIntervalTop;
}
@Override
@ -35,7 +35,7 @@ public class VerticalItemDecoration extends RecyclerView.ItemDecoration {
int top = child.getBottom() + layoutParams.bottomMargin;
int bottom = top + mInterval;
if (i == 0 && isShowIntervalTop) {
if (i == 0 && mIsShowIntervalTop) {
c.drawRect(left, 0, right, bottom, paint);
} else {
c.drawRect(left, top, right, bottom, paint);
@ -47,7 +47,7 @@ public class VerticalItemDecoration extends RecyclerView.ItemDecoration {
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
int position = parent.getChildPosition(view);
if (position == 0 && isShowIntervalTop) {
if (position == 0 && mIsShowIntervalTop) {
outRect.set(0, mInterval, 0, mInterval);
} else {
outRect.set(0, 0, 0, mInterval);

View File

@ -52,10 +52,7 @@ public class DownloadManager implements DownloadStatusListener {
private ArrayMap<String, LinkedBlockingQueue<String>> platformMap;
private ArrayMap<String, ArrayMap<String, DownloadEntity>> gameMap;
/**
* TODO change to {@link DownloadStatus}
*/
private ArrayMap<String, String> statusMap;
private ArrayMap<String, DownloadStatus> statusMap;
private ArrayMap<String, DownloadEntity> downloadingMap;
private DownloadDao mDownloadDao;
@ -69,7 +66,7 @@ public class DownloadManager implements DownloadStatusListener {
DownloadNotification.showDownloadingNotification(mContext);
DownloadManager.getInstance(mContext).putStatus(entity.getUrl(), "delete");
DownloadManager.getInstance(mContext).putStatus(entity.getUrl(), DownloadStatus.delete);
downloadingMap.remove(entity.getUrl());
}
@ -131,12 +128,13 @@ public class DownloadManager implements DownloadStatusListener {
String url = (String) msg.obj;
switch (msg.what) {
case DownloadConfig.CONTINUE_DOWNLOAD_TASK:
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
resume(url);
if (lastTimeMap.get(url) != null && System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
DownloadEntity downloadEntity = getDownloadEntityByUrl(url);
if (downloadEntity != null) add(downloadEntity);
}
break;
case DownloadConfig.PAUSE_DOWNLOAD_TASK:
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
if (lastTimeMap.get(url) != null && System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
pause(url);
}
break;
@ -156,7 +154,7 @@ public class DownloadManager implements DownloadStatusListener {
List<DownloadEntity> list = getAll();
for (DownloadEntity downloadEntity : list) {
statusMap.put(downloadEntity.getUrl(), downloadEntity.getStatus().name());
statusMap.put(downloadEntity.getUrl(), downloadEntity.getStatus());
if (!DownloadStatus.done.equals(downloadEntity.getStatus())) {
downloadingMap.put(downloadEntity.getUrl(), downloadEntity);
}
@ -221,6 +219,7 @@ public class DownloadManager implements DownloadStatusListener {
downloadEntity.setGameId(gameEntity.getId());
downloadEntity.setEntrance(entrance);
downloadEntity.setLocation(location);
downloadEntity.setVersionName(apkEntity.getVersion());
int installed = 0;
for (ApkEntity apk : gameEntity.getApk()) {
if (PackageManager.isInstalled(apk.getPackageName())) {
@ -242,7 +241,7 @@ public class DownloadManager implements DownloadStatusListener {
}
//TODO remove
DownloadManager.getInstance(context).putStatus(downloadEntity.getUrl(), "downloading");
DownloadManager.getInstance(context).putStatus(downloadEntity.getUrl(), DownloadStatus.downloading);
// 收集下载数据
DataCollectionUtils.uploadDownload(context, downloadEntity, "开始");
@ -264,7 +263,7 @@ public class DownloadManager implements DownloadStatusListener {
mContext.startService(getIntent(downloadEntity, DownloadStatus.add));
}
put(url, System.currentTimeMillis());
putStatus(url, DownloadStatus.downloading.name());
putStatus(url, DownloadStatus.downloading);
}
Utils.log(DownloadManager.class.getSimpleName(), "add");
}
@ -397,16 +396,16 @@ public class DownloadManager implements DownloadStatusListener {
return gameMap.get(name);
}
void putStatus(String url, String status) {
private void putStatus(String url, DownloadStatus status) {
statusMap.put(url, status);
onTaskStatusChanged(getDownloadEntityByUrl(url));
}
public String getStatus(String url) {
public DownloadStatus getStatus(String url) {
return statusMap.get(url);
}
public ArrayMap<String, String> getStatusMap() {
public ArrayMap<String, DownloadStatus> getStatusMap() {
return statusMap;
}
@ -414,32 +413,6 @@ public class DownloadManager implements DownloadStatusListener {
mHandler.sendMessageDelayed(msg, delayMillis);
}
/**
* 根据url恢复下载 //TODO 这个可以删除的全都在add判断add的时候不需要关注任务真实状态
*
* @param url
*/
@Deprecated
void resume(String url) {
DownloadEntity entry = getDownloadEntityByUrl(url);
// 暂停任务后,把文件删除,然后点继续,文件不存在,需要重新加入下载队列进行下载
if (checkDownloadEntryRecordValidate(url)) {
Utils.toast(mContext, "文件不存在!已重新加入下载队列");
add(entry);
} else {
if (entry != null) {
if (isFileCompleted(url)) {
entry.setStatus(DownloadStatus.done);
DataChanger.INSTANCE.notifyDataChanged(entry);
} else if (!isTaskDownloading(url)) {
mContext.startService(getIntent(entry, DownloadStatus.resume));
}
}
}
Utils.log(DownloadManager.class.getSimpleName(), "resume");
}
/**
* 根据url取消下载并删除已下载的文件
*
@ -506,7 +479,7 @@ public class DownloadManager implements DownloadStatusListener {
if (entry != null) {
mContext.startService(getIntent(entry, DownloadStatus.pause));
put(url, System.currentTimeMillis());
statusMap.put(url, DownloadStatus.pause.name());
statusMap.put(url, DownloadStatus.pause);
}
Utils.log(DownloadManager.class.getSimpleName(), "pause");
}

View File

@ -2,114 +2,22 @@ package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.gh.base.BaseActivity;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.StringUtils;
import com.gh.gamecenter.manager.UpdateManager;
import com.tencent.bugly.beta.tinker.TinkerManager;
import java.lang.ref.WeakReference;
import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnLongClick;
import com.halo.assistant.fragment.AboutFragment;
/**
* Created by khy on 2017/2/28.
*/
public class AboutActivity extends BaseActivity {
@BindView(R.id.about_version_tv)
TextView mAboutVersion;
@BindView(R.id.setting_rl_update)
RelativeLayout mAboutUpdateRl;
@BindView(R.id.about_version_pb)
ProgressBar mAboutPb;
@BindView(R.id.about_tv_version)
TextView mVersionName;
private Handler handler = new MyHandler(this);
public class AboutActivity extends NormalActivity {
@NonNull
public static Intent getIntent(Context context) {
Intent intent = new Intent(context, AboutActivity.class);
return intent;
// return new IntentFactory.Builder(context)
// .setActivity(AboutActivity.class)
// .setFragment(AboutFragment.class).build();
return getTargetIntent(context, AboutActivity.class, AboutFragment.class);
}
@Override
protected int getLayoutId() {
return R.layout.activity_about;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_about));
// ((TextView) findViewById(R.id.about_tv_version)).setText("V" + PackageUtils.getVersionName(this));
mVersionName.setText("V" + PackageUtils.getPatchVersionName()); // TODO 版本号暂时与gradle versionName不一致
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
}
@OnClick({R.id.about_shengming, R.id.setting_rl_update})
public void OnClick(View view) {
if (view.getId() == R.id.setting_rl_update) {
UpdateManager.getInstance(AboutActivity.this).checkUpdate(false, handler); // 检出更新
} else if (view.getId() == R.id.about_shengming) {
Intent intent = WebActivity.getWebIntent(this);
startActivity(intent);
}
}
@OnLongClick(R.id.about_tv_version)
public boolean OnLongClick(View view) {
if (view.getId() == R.id.about_tv_version) {
String tinkerId = TinkerManager.getNewTinkerId();
if (!TextUtils.isEmpty(tinkerId)) {
mVersionName.setText("V" + PackageUtils.getPatchVersionName() + "." + tinkerId);
} else {
Toast.makeText(getApplicationContext(), R.string.toast_upload_latest, Toast.LENGTH_SHORT).show();
}
}
return false;
}
private static class MyHandler extends Handler {
private WeakReference<AboutActivity> mWeakReference;
public MyHandler(AboutActivity activity) {
mWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
final AboutActivity activity = mWeakReference.get();
if (activity != null) {
if (msg.what == 0) {
final String version = (String) msg.obj;
activity.mAboutVersion.setText(StringUtils.buildString("发现新版本 V", version));
} else if (msg.what == 1) {
activity.mAboutVersion.setText(R.string.toast_upload_latest);
}
}
}
}
}

View File

@ -0,0 +1,31 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.ask.AnswerDetailFragment;
/**
* Created by khy on 10/04/18.
*/
public class AnswerDetailActivity extends NormalActivity {
public static final String TAG = "AnswerDetailActivity";
@NonNull
public static Intent getIntent(Context context, String answerId, String entrance) {
return getIntent(context, answerId, entrance, false);
}
@NonNull
public static Intent getIntent(Context context, String answerId, String entrance, boolean isOpenCommentManager) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ANSWER_ID, answerId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, isOpenCommentManager);
return getTargetIntent(context, AnswerDetailActivity.class, AnswerDetailFragment.class, bundle);
}
}

View File

@ -0,0 +1,48 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.ask.questionsdetail.AnswerEditFragment;
/**
* Created by khy on 10/04/18.
*/
public class AnswerEditActivity extends NormalActivity {
public static Intent getIntent(Context context, String questionId, String questionTitle, boolean showInNewPage) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questionId);
bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, questionTitle);
bundle.putBoolean(EntranceUtils.KEY_ANSWER_OPEN_IN_NEW_PAGE, showInNewPage);
return getTargetIntent(context, AnswerEditActivity.class, AnswerEditFragment.class, bundle);
}
public static Intent getIntent(Context context, String questionId, String questionTitle, String draftId, boolean showInNewPage) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questionId);
bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, questionTitle);
bundle.putBoolean(EntranceUtils.KEY_ANSWER_OPEN_IN_NEW_PAGE, showInNewPage);
bundle.putString(EntranceUtils.KEY_DRAFT_ID, draftId);
return getTargetIntent(context, AnswerEditActivity.class, AnswerEditFragment.class, bundle);
}
public static Intent getIntent(Context context, String questionId, String questionTitle) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questionId);
bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, questionTitle);
return getTargetIntent(context, AnswerEditActivity.class, AnswerEditFragment.class, bundle);
}
public static Intent getIntent(Context context, String answerId, String questionTitle, String content) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ANSWER_ID, answerId);
bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, questionTitle);
bundle.putString(EntranceUtils.KEY_ANSWER_CONTENT, content);
return getTargetIntent(context, AnswerEditActivity.class, AnswerEditFragment.class, bundle);
}
}

View File

@ -0,0 +1,23 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.ask.questionsdetail.AnswerFoldFragment;
/**
* Created by khy on 10/04/18.
*/
public class AnswerFoldActivity extends NormalActivity {
public static Intent getIntent(Context context, String questionsId, String entrance) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questionsId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
return getTargetIntent(context, AnswerFoldActivity.class, AnswerFoldFragment.class, bundle);
}
}

View File

@ -0,0 +1,126 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import com.gh.base.BaseActivity;
import com.gh.common.util.CheckLoginUtils;
import com.gh.gamecenter.ask.search.AskSearchFragment;
import com.lightgame.utils.Util_System_Keyboard;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by khy on 8/12/17.
*/
public class AskSearchActivity extends BaseActivity {
@BindView(R.id.etSearch)
EditText mSearchEt;
@BindView(R.id.ivDeleteText)
ImageView mSearchCancel;
@BindView(R.id.btnQuestions)
View mQuestionsBtn;
private AskSearchFragment mAskSearchFragment;
private String mSearchKey;
public static Intent getIntent(Context context) {
return new Intent(context, AskSearchActivity.class);
}
@Override
protected void handleMessage(Message msg) {
if (msg.what == 1) search();
}
@Override
protected int getLayoutId() {
return R.layout.activity_ask_search;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAskSearchFragment = new AskSearchFragment();
getSupportFragmentManager().beginTransaction().replace(
R.id.layout_fragment_content, mAskSearchFragment).commitAllowingStateLoss();
findViewById(R.id.btnGoBack).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mSearchEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
Util_System_Keyboard.hideSoftKeyboard(AskSearchActivity.this);
search();
}
return false;
}
});
mSearchEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 0) {
mSearchCancel.setVisibility(View.VISIBLE);
} else {
mSearchCancel.setVisibility(View.GONE);
}
}
@Override
public void afterTextChanged(Editable s) {
String newSearchKey = s.toString().trim();
if (!newSearchKey.equals(mSearchKey)) {
mBaseHandler.removeMessages(1);
mSearchKey = newSearchKey;
if (mSearchKey.length() >= 0) {
mBaseHandler.sendEmptyMessageDelayed(1, 300);
}
}
}
});
}
@OnClick({R.id.ivDeleteText, R.id.btnQuestions})
public void onClick(View v) {
if (v.getId() == R.id.ivDeleteText) {
mSearchCancel.setVisibility(View.GONE);
mSearchEt.setText("");
} else if (v.getId() == R.id.btnQuestions) {
CheckLoginUtils.checkLogin(this, () -> {
startActivity(QuestionEditActivity.getIntent(this, mSearchKey));
});
}
}
private void search() {
if (mAskSearchFragment != null) {
mAskSearchFragment.search(mSearchKey);
}
}
}

View File

@ -0,0 +1,17 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import com.gh.gamecenter.ask.AskTabOrderFragment;
/**
* Created by khy on 10/04/18.
*/
public class AskTabOrderActivity extends NormalActivity {
public static Intent getIntent(Context context) {
return getTargetIntent(context, AskTabOrderActivity.class, AskTabOrderFragment.class);
}
}

View File

@ -12,7 +12,6 @@ import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.text.Html;
import android.view.Gravity;
import android.view.View;
@ -93,8 +92,6 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
TextView mScanUser;
@BindView(R.id.scan_user_des)
TextView mScanUserDes;
@BindView(R.id.reuse_actionbar)
RelativeLayout mActionbar;
@BindView(R.id.scan_hint)
TextView mScanHint;
@BindView(R.id.choosereceiver_roket_anim)
@ -109,11 +106,6 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
ImageView mRoketAnimLeft;
@BindView(R.id.choosereceiver_roket_right)
ImageView mRoketAnimRight;
@BindView(R.id.actionbar_iv_back)
ImageView mBackIv;
@BindView(R.id.actionbar_tv_title)
TextView mTitleTv;
private static final String KET_SHOWCONNHINTDIALOG = "showConnHintDialog";
@ -144,24 +136,13 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
@Override
protected int getLayoutId() {
return R.layout.activity_choosereceiver;
}
@Override
public void onBackPressed() {
super.onBackPressed();
closeSocket();
HaloApp.remove("FileInfo");
return R.layout.activity_receive_choose;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_choose_activity));
mTitleTv.setTextColor(Color.WHITE);
mBackIv.setImageResource(R.drawable.reuse_kc_back);
setNavigationTitle(R.string.title_choose_activity, android.R.color.white);
// 添加分享图标
TextView hintTv = new TextView(this);
@ -173,17 +154,9 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
RelativeLayout reuse_actionbar = (RelativeLayout) mContentView.findViewById(
R.id.reuse_actionbar);
RelativeLayout reuse_actionbar = (RelativeLayout) findViewById(R.id.reuse_actionbar);
reuse_actionbar.addView(hintTv, params);
//修改沉浸栏以及ActionBar 颜色
mActionbar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.scan_bg));
// SystemBarTintManager tintManager = getTintManager(); // TODO: 27/09/17 更改沉浸栏颜色??
// if (tintManager != null) {
// tintManager.setStatusBarTintResource(R.color.scan_bg);
// }
//
init();
hintTv.setOnClickListener(new View.OnClickListener() {
@ -303,11 +276,11 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
@Override
protected void onDestroy() {
super.onDestroy();
mRadarView.setSearching(false);
isDestroy = true;
isStopScan = true;
handler.removeCallbacksAndMessages(null);
super.onDestroy();
}
@Override
@ -377,14 +350,16 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
createSendMsgToServerRunnable(WifiMgr.getInstance(this).getIpAddressFromHotspot());
}
@OnClick(R.id.actionbar_rl_back)
public void onBackListener() {
@Override
public boolean onHandleBackPressed() {
closeSocket();
HaloApp.remove("FileInfo");
} //发送UDP通知信息到 文件接收方 开启ServerSocketRunnable
HaloApp.remove(KcSelectGameActivity.KEY_FILE_INFO);
return false;
}
//发送UDP通知信息到 文件接收方 开启ServerSocketRunnable
private void createSendMsgToServerRunnable(final String ipAddress) {
HaloApp.MAIN_EXECUTOR.execute(new Runnable() {
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@ -509,7 +484,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
}
private void sendFileInfoListToFileReceiverWithUdp(int serverPort, InetAddress ipAddress) {
List<FileInfo> fileInfoList = (List<FileInfo>) HaloApp.get("FileInfo", false);
List<FileInfo> fileInfoList = (List<FileInfo>) HaloApp.get(KcSelectGameActivity.KEY_FILE_INFO, false);
if (fileInfoList == null) {
return;
}
@ -529,7 +504,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
// 连接中-动画
private void readyAnimView() {
mActionbar.setVisibility(View.GONE);
getSupportActionBar().hide();
mRoketRl.setVisibility(View.VISIBLE);
mRoketRl.animate()
.alpha(1f)
@ -617,8 +592,8 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
// 连接失败-动画
private void connFailedAnimView() {
mActionbar.setVisibility(View.VISIBLE);
Utils.toast(ChooseReceiverActivity.this, "连接失败");
getSupportActionBar().show();
toast("连接失败");
if (mScaleAnimation != null) {
mScaleAnimation.cancel();
}

View File

@ -2,240 +2,23 @@ package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.gh.base.BaseActivity;
import com.gh.common.util.DialogUtils;
import com.gh.common.view.VerticalItemDecoration;
import com.gh.gamecenter.adapter.CleanApkAdapter;
import com.gh.gamecenter.entity.InstallGameEntity;
import com.gh.gamecenter.eventbus.EBSkip;
import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.EventBus;
import java.io.File;
import java.text.DecimalFormat;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import com.halo.assistant.fragment.ApkCleanerFragment;
/**
* Created by khy on 2017/1/24.
*/
public class CleanApkActivity extends BaseActivity implements CleanApkAdapter.OnScanListener {
@BindView(R.id.apk_count)
TextView mApkCount;
@BindView(R.id.apk_rv)
RecyclerView mApkRv;
@BindView(R.id.delete_btn)
TextView mApkDeleteBtn;
@BindView(R.id.select_game_all)
CheckBox mApkSelectAll;
@BindView(R.id.scan_pb)
ProgressBar mScanPb;
@BindView(R.id.reuse_nodata_skip_tv_hint)
TextView mNodataSkipTv;
@BindView(R.id.reuse_nodata_skip_tv_btn)
TextView mNodataSkipBtn;
@BindView(R.id.reuse_nodata_skip)
LinearLayout mNodataSkipLl;
@BindView(R.id.delete_bottom)
LinearLayout mDeleteBottom;
@BindView(R.id.select_game_installed_ll)
RelativeLayout mInstallAllData;
private CleanApkAdapter mAdapter;
public class CleanApkActivity extends NormalActivity {
@NonNull
public static Intent getIntent(Context context) {
Intent intent = new Intent(context, CleanApkActivity.class);
return intent;
// Intent intent = new Intent(context, CleanApkActivity.class);
// return new IntentFactory.Builder(context)
// .setActivity(CleanApkActivity.class)
// .setFragment(ApkCleanerFragment.class).build();
return getTargetIntent(context, CleanApkActivity.class, ApkCleanerFragment.class);
}
@Override
protected int getLayoutId() {
return R.layout.activity_clean_apk;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_clean_apk));
mNodataSkipLl.setVisibility(View.GONE);
mAdapter = new CleanApkAdapter(this, this, mApkDeleteBtn, mApkSelectAll);
mApkRv.setLayoutManager(new LinearLayoutManager(this));
mApkRv.addItemDecoration(new VerticalItemDecoration(this, 8, true));
mApkRv.setAdapter(mAdapter);
mApkSelectAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ArrayMap<Integer, Boolean> selectPosition = new ArrayMap<>();
ArrayMap<Integer, Boolean> selectPosition1 = mAdapter.getSelectPosition();
int itemCount = mAdapter.getItemCount();
if (isChecked) {
for (int i = 0; i < itemCount; i++) {
selectPosition.put(i, true);
}
} else {
int selectCount = 0;
for (Integer integer : selectPosition1.keySet()) {
if (selectPosition1.get(integer)) {
selectCount++;
}
}
if (selectCount != itemCount) {
return;
}
for (int i = 0; i < itemCount; i++) {
selectPosition.put(i, false);
}
}
mAdapter.setSelectPosition(selectPosition);
mAdapter.notifyItemRangeChanged(0, itemCount);
mAdapter.checkBoxControl(isChecked, 0);
}
});
mNodataSkipBtn.setText("去首页看看");
mNodataSkipTv.setText("安装包已清理干净\n快去发现更多好玩的游戏吧");
mNodataSkipTv.setLineSpacing(0, 1.5f);
}
@OnClick({R.id.delete_btn, R.id.reuse_nodata_skip_tv_btn})
public void onClick(View view) {
switch (view.getId()) {
case R.id.delete_btn: {
String s = mApkDeleteBtn.getText().toString();
if ("停止扫描".equals(s)) {
mAdapter.isStopScan();
} else {
if ("一键删除".equals(s)) {
Utils.toast(CleanApkActivity.this, "请选择需要删除的安装包");
return;
}
final List<InstallGameEntity> apkList = mAdapter.getApkList();
final ArrayMap<Integer, Boolean> selectPosition = mAdapter.getSelectPosition();
for (int i = 0; i < apkList.size(); i++) {
if (selectPosition.get(i) && apkList.get(i).getInstallStatus() == 1) {
DialogUtils.showWarningDialog(CleanApkActivity.this, "删除安装包"
, Html.fromHtml(getString(R.string.delete_apk_hint))
, "取消 ", "确定"
, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
deleteApk(apkList, selectPosition);
}
}, null);
return;
}
}
deleteApk(apkList, selectPosition);
}
break;
}
case R.id.reuse_nodata_skip_tv_btn: {
Intent intent = MainActivity.getMainIntent(this);
startActivity(intent);
mNodataSkipBtn.postDelayed(new Runnable() {
@Override
public void run() {
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_GAMEFRAGMENT, 0));
}
}, 300);
break;
}
}
}
private void deleteApk(List<InstallGameEntity> apkList, ArrayMap<Integer, Boolean> selectPosition) {
long size = 0;
for (int i = 0; i < apkList.size(); i++) {
if (selectPosition.get(i)) {
InstallGameEntity installGameEntity = apkList.get(i);
size = size + installGameEntity.getGameSize();
File file = new File(installGameEntity.getGamePath());
if (file.isFile() && file.exists()) {
file.delete();
mAdapter.deleteApk(i);
i--;
}
}
}
double allSize = (((float) size / 1024) / 1024);
DecimalFormat df = new DecimalFormat("#.00");
String sizeName = df.format(allSize) + "MB";
Utils.toast(CleanApkActivity.this, "删除成功,已为您节省" + sizeName + "空间");
mApkDeleteBtn.setText("一键删除");
mAdapter.notifyDataSetChanged(); // 刷新Adapter position
updateScanData();
if (apkList.size() == 0) { // 全部删除
mNodataSkipLl.setVisibility(View.VISIBLE);
mInstallAllData.setVisibility(View.GONE);
mDeleteBottom.setVisibility(View.GONE);
}
}
private void updateScanData() {
long allSize = 0;
List<InstallGameEntity> apkList = mAdapter.getApkList();
for (InstallGameEntity installGameEntity : apkList) {
allSize = allSize + installGameEntity.getGameSize();
}
double size = (((float) allSize / 1024) / 1024);
DecimalFormat df = new DecimalFormat("0.00");
String sizeName = df.format(size) + "MB";
mApkCount.setText(Html.fromHtml(getString(R.string.clean_apk_count, apkList.size(), sizeName)));
}
@Override
public void onScanOver() {
mApkDeleteBtn.setText("立即删除");
mApkDeleteBtn.setBackgroundResource(R.drawable.game_item_btn_red_style);
updateScanData();
mScanPb.setVisibility(View.GONE);
mApkSelectAll.setVisibility(View.VISIBLE);
mApkSelectAll.setChecked(true);
}
@Override
public void noData() {
mNodataSkipBtn.setText("去首页看看");
mNodataSkipTv.setText("暂无安装包");
mNodataSkipLl.setVisibility(View.VISIBLE);
mInstallAllData.setVisibility(View.GONE);
mDeleteBottom.setVisibility(View.GONE);
}
}

View File

@ -2,34 +2,23 @@ package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import com.gh.base.BaseActivity;
import com.gh.gamecenter.collection.CollectionFragment;
import com.gh.gamecenter.collection.CollectionWrapperFragment;
/**
* Created by khy on 18/07/17.
*/
public class CollectionActivity extends NormalActivity {
public class CollectionActivity extends BaseActivity {
public static final Intent getCollectionActivity(Context context) {
Intent intent = new Intent(context, CollectionActivity.class);
return intent;
@NonNull
public static Intent getCollectionActivity(Context context) {
// Bundle args = new Bundle();
// args.putInt(BaseFragment_TabLayout.PAGE_INDEX, CollectionWrapperFragment.INDEX_TOOL);
// return new IntentFactory.Builder(context)
// .setActivity(CollectionActivity.class)
// .setFragment(CollectionWrapperFragment.class).setArgs(args).build();
return getTargetIntent(context, CollectionActivity.class, CollectionWrapperFragment.class);
}
@Override
protected int getLayoutId() {
return R.layout.activity_collection;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle("我的收藏");
getSupportFragmentManager().beginTransaction().replace(
R.id.layout_fragment_content, CollectionFragment.newInstance(0)).commitAllowingStateLoss();
}
}

View File

@ -1,241 +1,35 @@
package com.gh.gamecenter;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.BaseActivity;
import com.gh.common.util.CheckLoginUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.LoginUtils;
import com.gh.common.util.PostCommentUtils;
import com.gh.gamecenter.adapter.CommentDetailAdapter;
import com.gh.gamecenter.adapter.OnCommentCallBackListener;
import com.gh.gamecenter.entity.CommentEntity;
import com.gh.gamecenter.entity.UserInfoEntity;
import com.lightgame.utils.Utils;
import org.json.JSONException;
import org.json.JSONObject;
import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnTouch;
import retrofit2.HttpException;
import com.gh.gamecenter.ask.viewmodel.AnswerCommentConversationFragment;
import com.halo.assistant.fragment.comment.CommentDetailFragment;
/**
* Created by khy on 2017/3/22.
*/
public class CommentDetailActivity extends NormalActivity {
// TODO: 16/11/17 时间比较紧 先暂时这么做 最好发表评论那块和评论详情整合
public class CommentDetailActivity extends BaseActivity implements OnCommentCallBackListener {
@BindView(R.id.comment_detail_rv)
RecyclerView mRecyclerView;
@BindView(R.id.comment_detail_close_comment)
View mCommentDetailCloseComment;
@BindView(R.id.comment_detail_comment_et)
EditText mCommentDetailCommentEt;
@BindView(R.id.comment_user_icon)
SimpleDraweeView mCommentUserIcon;
@BindView(R.id.comment_user_name)
TextView mCommentUserName;
@BindView(R.id.comment_send)
TextView mCommentSend;
@BindView(R.id.comment_detail_user_rl)
RelativeLayout mCommentDetailUserRl;
@BindView(R.id.comment_detail_comment_rl)
RelativeLayout mCommentDetailCommentRl;
@BindView(R.id.comment_detail_sv)
ScrollView mCommentDetailSv;
@BindView(R.id.reuse_none_data)
View mNoData;
private Dialog mSendingDialog;
private UserInfoEntity mUserInfo;
private CommentEntity mCommentEntity; // 回复评论的实体 用完马上清空
private CommentDetailAdapter mAdapter;
private LinearLayoutManager mLayoutManager;
public static Intent getCommentDetailIntent(Context context, String commentId) {
Intent intent = new Intent(context, CommentDetailActivity.class);
intent.putExtra(EntranceUtils.KEY_COMMENTID, commentId);
return intent;
public static Intent getIntent(Context context, String commentId) {
Bundle args = new Bundle();
args.putString(EntranceUtils.KEY_COMMENTID, commentId);
// return new IntentFactory.Builder(context)
// .setActivity(CommentDetailActivity.class)
// .setFragment(CommentDetailFragment.class).setArgs(args).build();
return getTargetIntent(context, CommentDetailActivity.class, CommentDetailFragment.class, args);
}
@Override
protected int getLayoutId() {
return R.layout.activity_comment_detail;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_comment_detail));
String commentId = getIntent().getStringExtra(EntranceUtils.KEY_COMMENTID);
mAdapter = new CommentDetailAdapter(this, commentId, this, mNoData, mRecyclerView);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE && !mAdapter.isOver() && !mAdapter.isLoading()) {
mAdapter.loadData(mAdapter.getItemCount());
}
}
});
mUserInfo = LoginUtils.getUserInfo(this);
if (mUserInfo != null) {
ImageUtils.Companion.display(mCommentUserIcon, mUserInfo.getIcon());
mCommentUserName.setText(mUserInfo.getName());
}
}
@Override
public void onCommentCallback(CommentEntity entity) {
mCommentEntity = entity;
setSoftInput(true);
}
@OnTouch(R.id.comment_detail_close_comment)
public boolean OnRecyclerTouchListener() {
if (mCommentDetailCloseComment.getVisibility() == View.VISIBLE) {
setSoftInput(false);
}
return true;
}
@OnClick(R.id.comment_send)
public void OnSendCommentListener() {
final String content = mCommentDetailCommentEt.getText().toString();
if (content.length() == 0) {
Utils.toast(this, "评论内容不能为空!");
return;
}
mSendingDialog = DialogUtils.showWaitDialog(this, "正在提交");
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("content", content);
} catch (JSONException e) {
e.printStackTrace();
}
if (mCommentEntity != null && mCommentEntity.getId() == null) {
Utils.toast(this, "评论异常 id null");
mSendingDialog.cancel();
return;
}
PostCommentUtils.addCommentData(CommentDetailActivity.this, null, jsonObject.toString(), mCommentEntity,
new PostCommentUtils.PostCommentListener() {
@Override
public void postSuccess(JSONObject response) {
mSendingDialog.dismiss();
toast("发表成功");
mCommentDetailCommentEt.setText("");
setSoftInput(false);
}
@Override
public void postFailed(Throwable e) {
mSendingDialog.dismiss();
if (e instanceof HttpException) {
HttpException exception = (HttpException) e;
if (exception.code() == 403) {
try {
JSONObject errorJson = new JSONObject(exception.response().errorBody().string());
String detail = errorJson.getString("detail");
switch (detail) {
case "too frequent":
toast("别话痨哦~休息一会再来评论吧~");
break;
case "user blocked":
toast("账号状态异常,暂时无法发表评论");
break;
case "article blocked":
toast("文章异常,无法发表评论");
setSoftInput(false);
break;
case "illegal":
toast("评论内容可能包括敏感信息,请修改后再发表");
break;
default:
toast("评论失败,未知原因");
break;
}
} catch (Exception ex) {
ex.printStackTrace();
toast("评论异常");
}
return;
}
}
toast("提交失败,请检查网络设置");
}
});
}
//软键盘控制
private void setSoftInput(boolean isShow) {
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (isShow) {
CheckLoginUtils.checkLogin(this, new CheckLoginUtils.OnLoggenInListener() {
@Override
public void onLoggedIn() {
imm.showSoftInputFromInputMethod(mCommentDetailCommentEt.getWindowToken(), 0);
imm.toggleSoftInputFromWindow(mCommentDetailCommentEt.getWindowToken(), 0, InputMethodManager.HIDE_NOT_ALWAYS);
mCommentDetailCommentRl.setVisibility(View.VISIBLE);
mCommentDetailCommentEt.setFocusable(true);
mCommentDetailCommentEt.setFocusableInTouchMode(true);
mCommentDetailCommentEt.requestFocus();
mCommentDetailCloseComment.setVisibility(View.VISIBLE);
if (mCommentEntity != null && mCommentEntity.getUser() != null) {
mCommentDetailCommentEt.setHint("回复" + mCommentEntity.getUser().getName() + "");
} else {
mCommentDetailCommentEt.setHint("优质评论会被优先展示");
}
}
});
} else {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
mCommentDetailCloseComment.setVisibility(View.GONE);
mCommentDetailCommentRl.setVisibility(View.GONE);
if (mCommentEntity != null) {
mCommentEntity = null; // 清空当前评论实体
mCommentDetailCommentEt.setHint("优质评论会被优先展示");
mCommentDetailCommentEt.setText("");
}
}
public static Intent getAnswerCommentIntent(Context context, String commentId, String answerId) {
Bundle args = new Bundle();
args.putString(EntranceUtils.KEY_COMMENTID, commentId);
args.putString(EntranceUtils.KEY_ANSWER_ID, answerId);
// return new IntentFactory.Builder(context)
// .setActivity(CommentDetailActivity.class)
// .setFragment(CommentDetailFragment.class).setArgs(args).build();
return getTargetIntent(context, CommentDetailActivity.class, AnswerCommentConversationFragment.class, args);
}
}

View File

@ -1,18 +1,38 @@
package com.gh.gamecenter;
import com.gh.base.BaseAppCompatToolBarActivity;
import android.view.MenuItem;
public class CommonActivity extends BaseAppCompatToolBarActivity {
import com.gh.base.BaseToolBarActivity;
import com.gh.gamecenter.normal.ToolbarController;
public class CommonActivity extends BaseToolBarActivity implements ToolbarController {
@Override
protected int getLayoutId() {
return R.layout.layout_wrapper_toolbar;
return R.layout.layout_wrapper_activity_toolbar;
}
@Override
protected boolean onNavigationIconClicked() {
finish();
onBackPressed();
return true;
}
@Override
public void setNavigationTitle(int res) {
}
@Override
public void setToolbarMenu(int res) {
}
@Deprecated
@Override
public MenuItem getMenuItem(int res) {
return null;
}
}

View File

@ -0,0 +1,17 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import com.gh.gamecenter.ask.SelectGameFragment;
/**
* Created by khy on 10/04/18.
*/
public class CommunitiesSelectActivity extends NormalActivity {
public static Intent getIntent(Context context) {
return getTargetIntent(context, CommunitiesSelectActivity.class, SelectGameFragment.class);
}
}

View File

@ -0,0 +1,21 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.gh.gamecenter.ask.entity.AskSubjectEntity;
import com.gh.gamecenter.ask.subject.AskSubjectFragment;
/**
* Created by khy on 10/04/18.
*/
public class CommunitySubjectActivity extends NormalActivity {
public static Intent getIntent(Context context, AskSubjectEntity entity) {
Bundle bundle = new Bundle();
bundle.putParcelable(AskSubjectEntity.TAG, entity);
return getTargetIntent(context, CommunitySubjectActivity.class, AskSubjectFragment.class, bundle);
}
}

View File

@ -4,209 +4,24 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.gh.base.BaseActivity;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.util.EntranceUtils;
import com.gh.common.view.Concern_LinearLayout;
import com.gh.gamecenter.adapter.ConcernAdapter;
import com.gh.gamecenter.adapter.ConcernRecommendAdapter;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.eventbus.EBConcernChanged;
import com.gh.gamecenter.eventbus.EBReuse;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG;
public class ConcernActivity extends BaseActivity implements OnClickListener, OnRequestCallBackListener {
@BindView(R.id.concern_rv_show)
RecyclerView mConcernRv;
@BindView(R.id.concern_rv_recommend)
RecyclerView mConcernRecommendRv;
@BindView(R.id.concern_rl_title)
RelativeLayout mConcernTitleRl;
@BindView(R.id.reuse_none_data)
LinearLayout mNoneData;
@BindView(R.id.reuse_tv_none_data)
TextView mNoDataTv;
@BindView(R.id.reuse_no_connection)
LinearLayout mNoConn;
private ConcernAdapter concernAdapter;
private ConcernRecommendAdapter concernRecommendAdapter;
import com.halo.assistant.fragment.myconcern.MyConcernFragment;
/**
* 我的关注页面
*/
public class ConcernActivity extends NormalActivity {
@NonNull
public static Intent getIntent(Context context, String entrance) {
Intent intent = new Intent(context, ConcernActivity.class);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
return intent;
Bundle args = new Bundle();
args.putString(EntranceUtils.KEY_ENTRANCE, entrance);
// return new IntentFactory.Builder(context)
// .setActivity(ConcernActivity.class)
// .setFragment(MyConcernFragment.class).setArgs(args).build();
return getTargetIntent(context, ConcernActivity.class, MyConcernFragment.class, args);
}
@Override
protected int getLayoutId() {
return R.layout.activity_concern;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_concern));
mConcernTitleRl.setOnClickListener(this);
mConcernRv.setHasFixedSize(true);
mConcernRv.setLayoutManager(new GridLayoutManager(this, 3));
concernAdapter = new ConcernAdapter(this, this, mEntrance);
mConcernRv.setAdapter(concernAdapter);
mConcernRecommendRv.setHasFixedSize(true);
mConcernRecommendRv.setLayoutManager(new GridLayoutManager(this, 4));
}
@Override
public void loadDone() { // 关注推荐 回调
mConcernTitleRl.setVisibility(View.VISIBLE);
mConcernRecommendRv.setVisibility(View.VISIBLE);
int size = concernRecommendAdapter.getRecommendGameList().size();
mConcernRecommendRv.setLayoutManager(new GridLayoutManager(this, size > 4 ? 4 : size));
mConcernRecommendRv.getAdapter().notifyDataSetChanged();
}
// 关注的游戏加载完成 再加载热门推荐(根据已关注的游戏过滤)
@Override
public void loadDone(Object obj) {
mNoConn.setVisibility(View.GONE);
mNoneData.setVisibility(View.GONE);
concernRecommendAdapter = new ConcernRecommendAdapter(this, this, (List<GameEntity>)obj, mEntrance);
mConcernRecommendRv.setAdapter(concernRecommendAdapter);
if (obj == null) { // 未登录状态
mNoneData.setVisibility(View.VISIBLE);
mConcernRv.setVisibility(View.GONE);
mNoDataTv.setText(R.string.login_hint);
mNoDataTv.setTextColor(ContextCompat.getColor(ConcernActivity.this, R.color.theme));
}
}
@Override
public void loadError() {
mNoConn.setVisibility(View.VISIBLE);
mNoneData.setVisibility(View.GONE);
}
@Override
public void loadEmpty() {
if (concernAdapter.getConcernGameList() == null
|| concernAdapter.getConcernGameList().isEmpty()) {
mNoneData.setVisibility(View.VISIBLE);
mConcernRv.setVisibility(View.GONE);
mNoDataTv.setText(R.string.game_empty);
mNoDataTv.setTextColor(ContextCompat.getColor(ConcernActivity.this, R.color.c7c7c7));
}
if (concernRecommendAdapter.getRecommendGameList() == null
|| concernRecommendAdapter.getRecommendGameList().isEmpty()) {
mConcernTitleRl.setVisibility(View.GONE);
mConcernRecommendRv.setVisibility(View.GONE);
} else {
if (concernRecommendAdapter.getRecommendGameList().size() < 4) {
mConcernRecommendRv.setLayoutManager(
new GridLayoutManager(this, concernRecommendAdapter.getRecommendGameList().size()));
}
}
}
@OnClick({R.id.concern_rl_title, R.id.reuse_tv_none_data})
public void onClick(View v) {
switch (v.getId()) {
case R.id.concern_rl_title:
if (mConcernRecommendRv.getVisibility() == View.VISIBLE) {
((Concern_LinearLayout) mContentView).hideRecyclerView();
} else {
((Concern_LinearLayout) mContentView).showRecyclerView();
}
break;
case R.id.reuse_tv_none_data:
String hint = getString(R.string.login_hint);
if (hint.equals(mNoDataTv.getText().toString()))
startActivity(LoginActivity.getIntent(this, false));
break;
}
}
// 关注事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBConcernChanged changed) {
if (!changed.isSingle()) {
return;
}
if (changed.isConcern()) {
GameEntity concernGame = concernRecommendAdapter.concernGame(changed.getGameId());
if (concernGame != null) {
concernAdapter.getConcernGameList().add(0, concernGame);
concernAdapter.notifyDataSetChanged();
if (mNoneData.getVisibility() == View.VISIBLE) {
mNoneData.setVisibility(View.GONE);
mConcernRv.setVisibility(View.VISIBLE);
}
}
for (int i = 0, size = concernRecommendAdapter.getRecommendGameList().size(); i < size; i++) {
if (changed.getGameId().equals(concernRecommendAdapter.getRecommendGameList().get(i).getId())) {
concernRecommendAdapter.getRecommendGameList().remove(i);
concernRecommendAdapter.notifyItemRemoved(i); // 删除动画
concernRecommendAdapter.notifyDataSetChanged(); // 防止列表串行
if (concernRecommendAdapter.getRecommendGameList().isEmpty()) {
mConcernTitleRl.setVisibility(View.GONE);
mConcernRecommendRv.setVisibility(View.GONE);
}
break;
}
}
} else {
GameEntity gameEntity = concernAdapter.cancelConcern(changed.getGameId());
if (gameEntity != null) {
concernRecommendAdapter.getRecommendGameList().add(0, gameEntity);
concernRecommendAdapter.notifyDataSetChanged();
}
if (concernRecommendAdapter.getRecommendGameList().isEmpty()) {
mConcernTitleRl.setVisibility(View.GONE);
mConcernRecommendRv.setVisibility(View.GONE);
} else {
mConcernTitleRl.setVisibility(View.VISIBLE);
mConcernRecommendRv.setVisibility(View.VISIBLE);
}
}
}
// 登录事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBReuse reuse) {
if (reuse.getType().equals(LOGIN_TAG)) { // 登入
concernAdapter = new ConcernAdapter(this, this, mEntrance);
mConcernRv.setAdapter(concernAdapter);
mConcernRv.setVisibility(View.VISIBLE);
}
}
}

View File

@ -0,0 +1,17 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import com.gh.gamecenter.info.ConcernFragment;
/**
* Created by khy on 10/04/18.
*/
public class ConcernInfoActivity extends NormalActivity {
public static Intent getIntent(Context context) {
return getTargetIntent(context, ConcernInfoActivity.class, ConcernFragment.class);
}
}

View File

@ -25,8 +25,8 @@ import com.gh.common.util.BitmapUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.LoginUtils;
import com.gh.common.view.CropImageCustom;
import com.gh.gamecenter.manager.UserManager;
import com.lightgame.download.FileUtils;
import org.json.JSONException;
@ -54,6 +54,8 @@ public class CropImageActivity extends BaseActivity {
private SharedPreferences sp;
private UserManager mUserManager;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
@ -88,10 +90,12 @@ public class CropImageActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_crop_image));
setNavigationTitle(getString(R.string.title_crop_image));
sp = PreferenceManager.getDefaultSharedPreferences(this);
mUserManager = UserManager.getInstance();
RelativeLayout reuse_actionbar = (RelativeLayout) findViewById(R.id.reuse_actionbar);
TextView confirm = new TextView(this);
@ -119,13 +123,13 @@ public class CropImageActivity extends BaseActivity {
handler.sendEmptyMessage(1);
return null;
}
return Observable.just(LoginUtils.getToken(CropImageActivity.this));
return Observable.just(mUserManager.getToken());
}
}).flatMap(new Func1<String, Observable<JSONObject>>() {
@Override
public Observable<JSONObject> call(String token) {
if (token != null) {
return Observable.just(FileUtils.uploadFile(Config.API_HOST + "support/upload/img?type=icon", path, token));
return Observable.just(FileUtils.uploadFile(Config.API_HOST + "images?type=icon", path, token));
}
dialog.dismiss();
handler.sendEmptyMessage(1);
@ -137,7 +141,7 @@ public class CropImageActivity extends BaseActivity {
if (result != null) {
try {
if (result.getInt("statusCode") == 401) {
return Observable.just(FileUtils.uploadFile(Config.API_HOST + "support/upload/img?type=icon", path, LoginUtils.getToken(CropImageActivity.this)));
return Observable.just(FileUtils.uploadFile(Config.API_HOST + "images?type=icon", path,mUserManager.getToken()));
}
} catch (JSONException e) {
e.printStackTrace();
@ -184,7 +188,7 @@ public class CropImageActivity extends BaseActivity {
sp.edit().putString("updateIconCount", jsonObject.toString()).apply();
Intent data = new Intent();
data.putExtra(EntranceUtils.KEY_URL, result.getString("icon"));
data.putExtra(EntranceUtils.KEY_URL, result.getString("url"));
setResult(RESULT_OK, data);
finish();

View File

@ -4,7 +4,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.gh.base.BaseActivity;
import com.gh.base.fragment.BaseFragment_TabLayout;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.download.DownloadFragment;
@ -13,7 +13,7 @@ import com.gh.gamecenter.download.DownloadFragment;
*
* @author 黄壮华
*/
public class DownloadManagerActivity extends BaseActivity {
public class DownloadManagerActivity extends NormalActivity {
public static final int INDEX_DOWNLOAD = 0;
public static final int INDEX_UPDATE = 1;
@ -21,52 +21,69 @@ public class DownloadManagerActivity extends BaseActivity {
public static final String TAG = "DownloadManagerActivity";
@Override
protected Intent provideNormalIntent() {
return getTargetIntent(this, DownloadManagerActivity.class, DownloadFragment.class);
}
// TODO: 20/09/17 增加currentItem 入口 插件更新可能需要
public static Intent getDownloadMangerIntent(Context context, String url, String entrance) {
Intent intent = new Intent(context, DownloadManagerActivity.class);
intent.putExtra(EntranceUtils.KEY_URL, url);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
return intent;
// Intent intent = new Intent(context, DownloadManagerActivity.class);
// intent.putExtra(EntranceUtils.KEY_URL, url);
// intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_URL, url);
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
return getTargetIntent(context, DownloadManagerActivity.class, DownloadFragment.class, bundle);
}
public static void startDownloadManagerActivity(Context context, String url, String entrance) {
Intent intent = new Intent(context, DownloadManagerActivity.class);
intent.putExtra(EntranceUtils.KEY_URL, url);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
public static Intent getDownloadMangerIntent(Context context, int position, String entrance) {
// Intent intent = new Intent(context, DownloadManagerActivity.class);
// intent.putExtra(EntranceUtils.KEY_URL, url);
// intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putInt(BaseFragment_TabLayout.PAGE_INDEX, position);
return getTargetIntent(context, DownloadManagerActivity.class, DownloadFragment.class, bundle);
}
@Override
protected int getLayoutId() {
return R.layout.activity_downloadmanager;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// public static void startDownloadManagerActivity(Context context, String url, String entrance) {
// Intent intent = new Intent(context, DownloadManagerActivity.class);
// intent.putExtra(EntranceUtils.KEY_URL, url);
// intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(intent);
// }
//
// @Override
// protected int getLayoutId() {
// return R.layout.activity_downloadmanager;
// }
initTitle(getString(R.string.title_downloadmanager));
startDownloadFragment();
}
private void startDownloadFragment() {
int currentItem = getIntent().getIntExtra(EntranceUtils.KEY_CURRENTITEM, 0);
Bundle data = getIntent().getBundleExtra(EntranceUtils.KEY_DATA);
if (data != null) {
currentItem = data.getInt(EntranceUtils.KEY_CURRENTITEM, 0);
}
getSupportFragmentManager().beginTransaction().replace(
R.id.layout_fragment_content, DownloadFragment.newInstance(currentItem)).commitAllowingStateLoss();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
startDownloadFragment();
setIntent(intent);
}
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
//
// setNavigationTitle(getString(R.string.title_downloadmanager));
//
// startDownloadFragment();
// }
//
// private void startDownloadFragment() {
// int currentItem = getIntent().getIntExtra(EntranceUtils.KEY_CURRENTITEM, 0);
// Bundle data = getIntent().getBundleExtra(EntranceUtils.KEY_DATA);
// if (data != null) {
// currentItem = data.getInt(EntranceUtils.KEY_CURRENTITEM, 0);
// }
//
// getSupportFragmentManager().beginTransaction().replace(
// R.id.layout_fragment_content, DownloadFragment.newInstance(currentItem)).commitAllowingStateLoss();
// }
//
// @Override
// protected void onNewIntent(Intent intent) {
// super.onNewIntent(intent);
// startDownloadFragment();
// setIntent(intent);
// }
}

View File

@ -15,7 +15,6 @@ import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
@ -70,7 +69,7 @@ import butterknife.OnClick;
/**
* Created by khy on 2017/1/20.
*/
public class FileReceiverActivity extends BaseActivity implements OnReceiverCancelListener, OnClickListener {
public class FileReceiverActivity extends BaseActivity implements OnReceiverCancelListener {
@BindView(R.id.sender_rv)
RecyclerView mReceiverRv;
@ -125,7 +124,7 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
int index = getCurrentFileInfoIndex();
if (index == -100) {
Utils.toast(FileReceiverActivity.this, "接收失败");
colsePage();
closePage();
return;
}
@ -184,30 +183,32 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
@Override
protected int getLayoutId() {
return R.layout.activity_file_sender;
return R.layout.activity_receive_send;
}
@Override
public void onBackPressed() {
public boolean onHandleBackPressed() {
backHint();
return true;
}
private void backHint() {
if (isReceivesOver) {
colsePage();
closePage();
} else {
DialogUtils.showWarningDialog(FileReceiverActivity.this, "退出提示", "退出会中断接收,确定要退出吗?"
, "取消", "确定"
, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
colsePage();
closePage();
}
}, null);
}
}
private void colsePage() {
private void closePage() {
if (mDatagramSocket != null) {
// mDatagramSocket.disconnect();
@ -249,7 +250,7 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
EventBus.getDefault().post(new EBDownloadStatus("download"));
mReceiverServer.close();
// HaloApp.remove("FileInfo");
// HaloApp.remove(KcSelectGameActivity.KEY_FILE_INFO);
mFileInfos.clear();
HaloApp.put("sendData", sendData);
@ -260,11 +261,11 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_file_receive));
setNavigationTitle(R.string.title_file_receive, android.R.color.white);
isDestroy = false;
// mFileInfos = (List<FileInfo>) HaloApp.get("FileInfo", false);
// mFileInfos = (List<FileInfo>) HaloApp.get(KcSelectGameActivity.KEY_FILE_INFO, false);
sendData = new ArrayList<>();
@ -278,7 +279,6 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
mReceiverRv.addItemDecoration(new VerticalItemDecoration(this, 8, true));
mReceiverRv.setAdapter(mFileReceiverAdapter);
mKeepReceiverTv.setText("继续接收");
sp = PreferenceManager.getDefaultSharedPreferences(this);
@ -292,7 +292,6 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
initServer(); //启动接收服务
}
findViewById(R.id.actionbar_rl_back).setOnClickListener(this);
}
private void initUserData() {
@ -321,9 +320,9 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
*/
private void initServer() {
mReceiverServer = new ServerRunnable(Constant.DEFAULT_SERVER_PORT);
HaloApp.MAIN_EXECUTOR.execute(mReceiverServer);
HaloApp.getInstance().getMainExecutor().execute(mReceiverServer);
HaloApp.MAIN_EXECUTOR.execute(new Runnable() {
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@ -371,7 +370,7 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
}
private void sendMessageToSender(final String sendData) throws Exception {
HaloApp.MAIN_EXECUTOR.execute(new Runnable() {
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@ -394,12 +393,12 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
* @param msg
*/
private void parseFileInfo(String msg) {
// mFileInfos = (List<FileInfo>) HaloApp.get("FileInfo", false); // mFileInfos 数据异常 需要重新获取
// mFileInfos = (List<FileInfo>) HaloApp.get(KcSelectGameActivity.KEY_FILE_INFO, false); // mFileInfos 数据异常 需要重新获取
FileInfo fileInfo = FileInfo.toObject(msg);
if (fileInfo != null && fileInfo.getFilePath() != null) {
mFileInfos.add(fileInfo);
Utils.log("FileReceiverActivity 添加一条数据::" + msg);
// HaloApp.put("FileInfo", mFileInfos);
// HaloApp.put(KcSelectGameActivity.KEY_FILE_INFO, mFileInfos);
}
}
@ -496,12 +495,15 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
}
@OnClick({R.id.actionbar_rl_back, R.id.sender_keep_send, R.id.sender_back})
@Override
protected boolean onNavigationIconClicked() {
backHint();
return true;
}
@OnClick({R.id.sender_keep_send, R.id.sender_back})
public void back(View view) {
switch (view.getId()) {
case R.id.actionbar_rl_back:
backHint();
break;
case R.id.sender_back:
backHint();
break;
@ -518,15 +520,6 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.actionbar_rl_back:
backHint();
break;
}
}
/**
* ServerSocket启动线程
*/
@ -549,7 +542,9 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
} catch (IOException e) {
}
}
} @Override
}
@Override
public void run() {
Utils.log("接收线程Socket已经开启");
try {
@ -650,7 +645,7 @@ public class FileReceiverActivity extends BaseActivity implements OnReceiverCanc
}
});
HaloApp.MAIN_EXECUTOR.execute(mFileReceiver);
HaloApp.getInstance().getMainExecutor().execute(mFileReceiver);
}
} catch (IOException e) {
e.printStackTrace();

View File

@ -41,6 +41,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import butterknife.BindView;
import butterknife.OnClick;
@ -80,6 +82,9 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
private long mStartTime;
// 快传文件发送单线程
private Executor SINGLE_EXECUTOR = Executors.newSingleThreadExecutor();
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
@ -117,7 +122,7 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
@Override
protected int getLayoutId() {
return R.layout.activity_file_sender;
return R.layout.activity_receive_send;
}
@Override
@ -126,7 +131,7 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
if (resultCode == KC_REPEAT_RESULT && requestCode == KC_REPEAT_RESULT) {
mSenderAdapter.notifyDataSetChanged();
initUserData();
HaloApp.MAIN_EXECUTOR.execute(new Runnable() {
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@ -166,16 +171,17 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
}
@Override
public void onBackPressed() {
public boolean onHandleBackPressed() {
backHint();
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_file_sender));
setNavigationTitle(R.string.title_file_sender, android.R.color.white);
mFileInfos = (List<FileInfo>) HaloApp.get("FileInfo", false);
mFileInfos = (List<FileInfo>) HaloApp.get(KcSelectGameActivity.KEY_FILE_INFO, false);
isDestroy = false;
@ -188,12 +194,14 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
init();
findViewById(R.id.actionbar_rl_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
backHint();
}
});
}
@Override
protected boolean onNavigationIconClicked() {
backHint();
return true;
}
private void init() {
@ -218,20 +226,17 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
private void backHint() {
if (!isSendOver) {
DialogUtils.showWarningDialog(FileSenderActivity.this, "退出传送", "退出会中断所有游戏的传送,确定要退出吗?"
, "取消", "确定"
, new DialogUtils.ConfirmListener() {
DialogUtils.showWarningDialog(FileSenderActivity.this,
"退出传送", "退出会中断所有游戏的传送,确定要退出吗?", "取消", "确定", new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
colsePage();
closePage();
}
}, null);
} else {
colsePage();
closePage();
}
}
//初始化用户数据
@ -327,12 +332,12 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
});
mFileSenderList.add(fileSender);
HaloApp.FILE_SENDER_EXECUTOR.execute(fileSender);
SINGLE_EXECUTOR.execute(fileSender);
}
}
private void startReceiver() {
HaloApp.MAIN_EXECUTOR.execute(new Runnable() {
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@ -344,7 +349,7 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
});
}
public void colsePage() {
public void closePage() {
if (mDatagramSocket != null) {
// mDatagramSocket.disconnect();
mDatagramSocket.close();
@ -352,10 +357,10 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
}
stopAllFileSendingTask();
HaloApp.remove("FileInfo");
HaloApp.remove(KcSelectGameActivity.KEY_FILE_INFO);
HaloApp.put("sendData", sendData);
FileSenderActivity.this.finish();
finish();
}
private int getCurrentFileInfoIndex(FileInfo curFileInfo) {
@ -466,6 +471,7 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
@Override
public void OnCancelPosition(int position) {
if (position >= mFileSenderList.size()) return;
FileSender fileSender = mFileSenderList.get(position);
Utils.log("发送方准备取消发送" + position);
if (fileSender != null && fileSender.isRunning()) {
@ -474,10 +480,9 @@ public class FileSenderActivity extends BaseActivity implements FileSenderAdapte
}
}
@OnClick({R.id.actionbar_rl_back, R.id.sender_keep_send, R.id.sender_back})
@OnClick({R.id.sender_keep_send, R.id.sender_back})
public void onClick(View view) {
switch (view.getId()) {
case R.id.actionbar_rl_back:
case R.id.sender_back:
backHint();
break;

View File

@ -2,646 +2,61 @@ package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.BaseActivity;
import com.gh.base.adapter.FragmentAdapter;
import com.gh.common.util.ApkActiveUtils;
import com.gh.common.util.AppDebugConfig;
import com.gh.common.util.CheckLoginUtils;
import com.gh.common.util.ConcernUtils;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DetailDownloadUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.ShareUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.adapter.viewholder.DetailViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameDetailEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.UserDataEntity;
import com.gh.gamecenter.eventbus.EBConcernChanged;
import com.gh.gamecenter.eventbus.EBDownloadStatus;
import com.gh.gamecenter.eventbus.EBPackage;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.gamedetail.FuliFragment;
import com.gh.gamecenter.gamedetail.XinXiFragment;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.jakewharton.rxbinding.view.RxView;
import com.lightgame.download.DataWatcher;
import com.lightgame.download.DownloadEntity;
import com.lightgame.utils.Utils;
import com.lightgame.view.NoScrollableViewPager;
import com.tencent.tauth.Tencent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.OnClick;
import retrofit2.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import com.gh.gamecenter.gamedetail.GameDetailFragment;
/**
* Created by khy on 2017/3/24.
* 游戏详情适配器
*/
public class GameDetailActivity extends BaseActivity {
public class GameDetailActivity extends NormalActivity {
public static final String SKIP_XINXI = "skipXinxi";
public static final String SKIP_FULI = "skipFuli";
public static final String OPEN_APPBAR = "openappbar";
public static final String SCROLL_TO_KAIFU = "scrollToKaiFu";
@BindView(R.id.gamedetail_vp)
NoScrollableViewPager mViewPager;
@BindView(R.id.reuse_ll_loading)
LinearLayout mLoading;
@BindView(R.id.reuse_no_connection)
LinearLayout mNoConnection;
@BindView(R.id.actionbar_tv_title)
TextView mTitle;
@BindView(R.id.gamedetail_iv_thumb)
SimpleDraweeView mGameIcon;
@BindView(R.id.gamedetail_tv_name)
TextView mGameName;
@BindView(R.id.gamedetail_tv_info)
TextView mGameInfo;
@BindView(R.id.gamedetail_tv_concern)
TextView mGameConcern;
@BindView(R.id.gamedetail_tabbar)
LinearLayout mTabBar;
@BindView(R.id.gamedetail_tabbar_fuli_tv)
TextView mTanBarFuLiTv;
@BindView(R.id.gamedetail_tabbar_xinxi_tv)
TextView mTanBarXinXiTv;
@BindView(R.id.gamedetail_appbar)
AppBarLayout mAppBarLayout;
@BindView(R.id.gamedetail_kaifu_hint)
View mKaifuHint;
@BindView(R.id.gamedetail_iv_libao)
View mLibaoIcon;
@BindView(R.id.gamedetail_game_server_type)
TextView mServerType;
View mShareIv;
private String mGameId;
private GameEntity mGameEntity;
private DownloadEntity mDownloadEntity;
private GameDetailEntity mGameDetailEntity;
private String downloadAddWord;
private String downloadOffText;
private String name; // 页面位置
private String title; // 页面标题
private String shareCode;
private boolean mIsTouchScreen = false;
private boolean mIsShowKaifuHint;
private boolean mIsScrollToKaiFu;
private int mCurVpPosition;
private DataWatcher dataWatcher = new DataWatcher() {
@Override
public void onDataChanged(DownloadEntity downloadEntity) {
if (mGameEntity != null && mGameEntity.getApk().size() == 1) {
String url = mGameEntity.getApk().get(0).getUrl();
if (url.equals(downloadEntity.getUrl())) {
if (!"pause".equals(DownloadManager.getInstance(GameDetailActivity.this).
getStatus(downloadEntity.getUrl()))) {
mDownloadEntity = downloadEntity;
DetailDownloadUtils.detailInvalidate(getDetailViewHolder());
}
}
}
}
};
private DetailViewHolder getDetailViewHolder() {
// 每次获取需要重新创建, 防止数据刷新
return new DetailViewHolder(mContentView, mGameEntity, mDownloadEntity, downloadOffText, downloadAddWord,
false, mEntrance, name, title); // 下载按钮ViewHolder
@Override
protected Intent provideNormalIntent() {
return getTargetIntent(this, GameDetailActivity.class, GameDetailFragment.class);
}
/**
* 启动游戏详情页面
*/
public static void startGameDetailActivity(Context context, GameEntity gameEntity, String entrance) {
Intent intent = new Intent(context, GameDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
intent.putExtra(GameEntity.class.getSimpleName(), gameEntity);
context.startActivity(intent);
DataUtils.onMtaEvent(context, "详情页面", "游戏详情", gameEntity != null ? gameEntity.getName() : "");
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putParcelable(GameEntity.TAG, gameEntity);
// context.startActivity(new IntentFactory.Builder(context).setActivity(GameDetailActivity.class)
// .setFragment(GameDetailFragment.class).setArgs(bundle).build());
context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle));
}
/**
* 启动游戏详情页面
*/
public static void startGameDetailActivity(Context context, String gameId, String entrance) {
Intent intent = new Intent(context, GameDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(EntranceUtils.KEY_GAMEID, gameId);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
context.startActivity(intent);
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_GAMEID, gameId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
// context.startActivity(new IntentFactory.Builder(context).setActivity(GameDetailActivity.class)
// .setFragment(GameDetailFragment.class).setArgs(bundle).build());
context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle));
}
@Override
protected int getLayoutId() {
return R.layout.activity_gamedetail;
}
//接收QQ或者QQ空间分享回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == com.tencent.connect.common.Constants.REQUEST_QQ_SHARE
|| requestCode == com.tencent.connect.common.Constants.REQUEST_QZONE_SHARE) {
Tencent.onActivityResultData(requestCode, resultCode, data, ShareUtils.getInstance(this).QqShareListener);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle("");
// 增加actionBar Button
RelativeLayout reuse_actionbar = mContentView.findViewById(R.id.reuse_actionbar);
mShareIv = LayoutInflater.from(this).inflate(R.layout.menu_action_share, reuse_actionbar, false); // 绑定parentView 否则会丢失宽高
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mShareIv.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
reuse_actionbar.addView(mShareIv, params);
mViewPager.setScrollable(true);
name = "游戏详情";
mGameId = getIntent().getStringExtra(EntranceUtils.KEY_GAMEID);
mEntrance = getIntent().getStringExtra(EntranceUtils.KEY_ENTRANCE);
Bundle data = getIntent().getBundleExtra(EntranceUtils.KEY_DATA);
if (data != null) {
mGameId = data.getString(EntranceUtils.KEY_GAMEID);
}
if (mGameId == null) {
mGameEntity = getIntent().getParcelableExtra(GameEntity.class.getSimpleName());
if (mGameEntity != null) {
mGameId = mGameEntity.getId();
mTitle.setText(mGameEntity.getName());
title = mGameEntity.getName();
}
}
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this, getIntent().toUri(Intent.URI_INTENT_SCHEME), mGameId, mGameEntity);
}
if (mGameEntity != null) {
getGameDetail();
} else if (mGameId != null) {
getGameDigest();
} else {
mLoading.setVisibility(View.GONE);
mNoConnection.setVisibility(View.VISIBLE);
}
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mCurVpPosition = position;
if (position == 0) {
if (mIsShowKaifuHint) {
mKaifuHint.setVisibility(View.VISIBLE);
}
mTanBarFuLiTv.setTextColor(Color.WHITE);
mTanBarFuLiTv.setBackgroundResource(R.drawable.tabbar_left_bg);
mTanBarXinXiTv.setTextColor(Color.BLACK);
mTanBarXinXiTv.setBackgroundDrawable(new ColorDrawable(0));
} else {
mKaifuHint.setVisibility(View.GONE);
mTanBarXinXiTv.setTextColor(Color.WHITE);
mTanBarXinXiTv.setBackgroundResource(R.drawable.tabbar_right_bg);
mTanBarFuLiTv.setTextColor(Color.BLACK);
mTanBarFuLiTv.setBackgroundDrawable(new ColorDrawable(0));
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
int total = appBarLayout.getTotalScrollRange();
if (Math.abs(verticalOffset) > total / 2) {
mTitle.setVisibility(View.VISIBLE);
} else {
mTitle.setVisibility(View.GONE);
}
if (Math.abs(verticalOffset) == total && mIsScrollToKaiFu) {
mIsScrollToKaiFu = false;
EventBus.getDefault().post(new EBReuse("scrollToKaiFu"));
}
}
});
// 防抖处理
RxView.clicks(mShareIv)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
if (TextUtils.isEmpty(shareCode)) return;
Map<String, Object> kv = new HashMap<>();
kv.put("点击", "分享");
DataUtils.onEvent(GameDetailActivity.this, "插件数据", mGameEntity.getName(), kv);
DataCollectionUtils.uploadClick(GameDetailActivity.this, "分享", "游戏详情", mGameEntity.getName());
String url = "http://www.ghzs666.com/game/" + shareCode;
showShare(url, mGameEntity.getName(), mGameEntity.getIcon(), null, mGameEntity.getTag(), false);
}
});
}
@Override
protected void onPause() {
super.onPause();
DownloadManager.getInstance(this).removeObserver(dataWatcher);
}
@Override
protected void onResume() {
super.onResume();
if (mGameEntity != null
&& mGameEntity.getApk() != null
&& mGameEntity.getApk().size() == 1) {
DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), true);
}
DownloadManager.getInstance(this).addObserver(dataWatcher);
}
private void initGameDetailTop() {
mLoading.setVisibility(View.GONE);
mAppBarLayout.setVisibility(View.VISIBLE);
if (mGameDetailEntity.getUserData() != null && mGameDetailEntity.getUserData().isGameConcerned()) {
mGameConcern.setText(getString(R.string.cancel_concern));
mGameConcern.setBackgroundResource(R.drawable.border_red_bg);
mGameConcern.setTextColor(ContextCompat.getColor(this, R.color.red));
} else {
mGameConcern.setText(getString(R.string.concern));
mGameConcern.setBackgroundResource(R.drawable.textview_concern_red_style);
mGameConcern.setTextColor(0xffffffff);
}
mGameName.setText(mGameEntity.getName());
ImageUtils.Companion.display(mGameIcon, mGameEntity.getIcon());
if (mGameEntity.getApk() == null || mGameEntity.getApk().isEmpty()) {
mGameInfo.setText("");
} else {
ApkEntity apkEntity = mGameEntity.getApk().get(0);
mGameInfo.setText(String.format("V%s | %s", apkEntity.getVersion(), apkEntity.getSize()));
}
int paddRight = 0;
String serverType = mGameEntity.getServerType();
if (TextUtils.isEmpty(serverType)) {
mServerType.setVisibility(View.GONE);
} else {
mServerType.setVisibility(View.VISIBLE);
mServerType.setText(serverType);
if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) {
mServerType.setBackgroundResource(R.drawable.textview_server_tag);
if ("删档内测".equals(serverType)) {
paddRight = DisplayUtils.dip2px(this, 50);
} else {
paddRight = DisplayUtils.dip2px(this, 60);
}
} else {
mServerType.setBackgroundResource(R.drawable.textview_orange_up);
paddRight = DisplayUtils.dip2px(this, 30);
}
}
mGameName.setPadding(0, 0, paddRight, 0);
if (mGameEntity.isLibaoExists()) {
mLibaoIcon.setVisibility(View.VISIBLE);
} else {
mLibaoIcon.setVisibility(View.GONE);
}
}
// 获取游戏摘要
private void getGameDigest() {
RetrofitManager.getInstance(this).getApi().getGameDigest(mGameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<GameEntity>() {
@Override
public void onResponse(GameEntity response) {
ApkActiveUtils.filterHideApk(response);
mGameEntity = response;
mTitle.setText(mGameEntity.getName());
mGameId = response.getId();
title = mGameEntity.getName();
getGameDetail();
}
@Override
public void onFailure(HttpException e) {
mLoading.setVisibility(View.GONE);
mNoConnection.setVisibility(View.VISIBLE);
}
});
}
// 获取游戏详情
public void getGameDetail() {
RetrofitManager.getInstance(this).getApi().getGameDetail(mGameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<GameDetailEntity>() {
@Override
public void onError(Throwable e) {
super.onError(e);
mLoading.setVisibility(View.GONE);
mNoConnection.setVisibility(View.VISIBLE);
Utils.log("onError::getGameDetail" + e.toString() + "&&id::" + mGameId);
}
@Override
public void onResponse(GameDetailEntity response) {
mGameDetailEntity = response;
// 过滤过期公告
if (response.getNotice() != null && response.getNotice().size() > 0) {
long l = System.currentTimeMillis();
for (int i = 0; i < response.getNotice().size(); i++) {
if (l > (response.getNotice().get(i).getOvertime() * 1000)) {
response.getNotice().remove(i);
i--;
}
}
}
downloadAddWord = response.getDownloadAddWord();
downloadOffText = response.getDownloadOffText();
shareCode = response.getShareCode();
Bundle args = new Bundle();
args.putParcelable(GameEntity.class.getSimpleName(), mGameEntity);
args.putParcelable(GameDetailEntity.class.getSimpleName(), response);
List<Fragment> list = new ArrayList<>();
FuliFragment fuliFragment = new FuliFragment();
fuliFragment.setArguments(args);
list.add(fuliFragment);
XinXiFragment xinXiFragment = new XinXiFragment();
xinXiFragment.setArguments(args);
list.add(xinXiFragment);
mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), list));
initGameDetailTop();
DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), true);
if (mGameDetailEntity.getUserData() == null || !mGameDetailEntity.getUserData().isGameConcerned()) {
mTanBarXinXiTv.performClick();
}
}
});
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mIsTouchScreen = true;
break;
case MotionEvent.ACTION_UP:
mIsTouchScreen = false;
break;
}
return super.dispatchTouchEvent(ev);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBReuse reuse) {
if (SKIP_XINXI.equals(reuse.getType())) {
mViewPager.setCurrentItem(1);
} else if (OPEN_APPBAR.equals(reuse.getType()) && !mIsTouchScreen) {
mAppBarLayout.setExpanded(true, true);
} else if (SKIP_FULI.equals(reuse.getType())) {
mViewPager.setCurrentItem(0);
} else if ("hideKaifuHint".equals(reuse.getType())) {
mIsShowKaifuHint = false;
mKaifuHint.setVisibility(View.GONE);
} else if ("showKaifuHint".equals(reuse.getType())) {
mIsShowKaifuHint = true;
if (mCurVpPosition == 0) {
mKaifuHint.post(new Runnable() {
@Override
public void run() {
mKaifuHint.setVisibility(View.VISIBLE);
}
});
}
}
}
// 接收下载被删除消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(EBDownloadStatus status) {
if ("delete".equals(status.getStatus())
&& mGameEntity != null
&& mGameEntity.getApk() != null
&& mGameEntity.getApk().size() == 1) {
String url = mGameEntity.getApk().get(0).getUrl();
if (url.equals(status.getUrl())) {
DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false);
}
}
}
// 接受安装、卸载消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBPackage busFour) {
if (mGameEntity != null
&& mGameEntity.getApk() != null
&& mGameEntity.getApk().size() > 0) {
for (ApkEntity apkEntity : mGameEntity.getApk()) {
String packageName = apkEntity.getPackageName();
if (packageName.equals(busFour.getPackageName())) {
ApkActiveUtils.filterHideApk(mGameEntity);
DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false);
}
}
}
}
// 关注事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBConcernChanged changed) {
if (mGameDetailEntity != null && mGameEntity != null && changed.isSingle() && changed.getGameId().equals(mGameEntity.getId())) {
if (mGameDetailEntity.getUserData() == null) {
mGameDetailEntity.setUserData(new UserDataEntity());
}
mGameDetailEntity.getUserData().setGameConcerned(changed.isConcern());
initGameDetailTop();
}
}
@OnClick({R.id.detail_tv_download, R.id.detail_pb_progressbar, R.id.reuse_no_connection
, R.id.detail_tv_per, R.id.gamedetail_tabbar_xinxi_tv, R.id.gamedetail_tabbar_fuli_tv
, R.id.gamedetail_kaifu_hint, R.id.gamedetail_tv_concern})
public void onClick(View v) {
switch (v.getId()) {
case R.id.gamedetail_tabbar_fuli_tv:
mViewPager.setCurrentItem(0);
break;
case R.id.gamedetail_tabbar_xinxi_tv:
mViewPager.setCurrentItem(1);
break;
case R.id.reuse_no_connection:
mLoading.setVisibility(View.VISIBLE);
mNoConnection.setVisibility(View.GONE);
if (mGameEntity != null) {
getGameDetail();
} else if (mGameId != null) {
getGameDigest();
}
break;
case R.id.gamedetail_tv_concern:
CheckLoginUtils.checkLogin(GameDetailActivity.this, new CheckLoginUtils.OnLoggenInListener() {
@Override
public void onLoggedIn() {
mGameConcern.setEnabled(false);
if (getString(R.string.concern).equals(mGameConcern.getText().toString())) {
// 添加关注
ConcernUtils.INSTANCE.postConcernGameId(GameDetailActivity.this, mGameEntity.getId()
, new ConcernUtils.onConcernListener() {
@Override
public void onSuccess() {
Map<String, Object> kv = new HashMap<>();
kv.put("状态", R.string.concern);
DataUtils.onEvent(GameDetailActivity.this, "游戏关注", mGameEntity.getName(), kv);
Map<String, Object> kv2 = new HashMap<>();
kv2.put("点击", R.string.concern);
DataUtils.onEvent(GameDetailActivity.this, "插件数据", mGameEntity.getName(), kv2);
DataCollectionUtils.uploadConcern(GameDetailActivity.this, mGameEntity.getName(), mGameEntity.getId(), "关注");
mGameConcern.setText(R.string.cancel_concern);
mGameConcern.setBackgroundResource(R.drawable.border_red_bg);
mGameConcern.setTextColor(ContextCompat.getColor(GameDetailActivity.this, R.color.red));
toast(R.string.concern_success);
mGameConcern.setEnabled(true);
}
@Override
public void onError() {
mGameConcern.setEnabled(true);
toast(R.string.concern_failure);
}
});
} else {
Map<String, Object> kv2 = new HashMap<>();
kv2.put("点击", "取消关注");
DataUtils.onEvent(GameDetailActivity.this, "插件数据", mGameEntity.getName(), kv2);
DialogUtils.showCancelDialog(GameDetailActivity.this, new DialogUtils.ConfirmListener() {
@Override
public void onConfirm() {
// 取消关注
ConcernUtils.INSTANCE.deleteConcernData(GameDetailActivity.this, mGameEntity.getId()
, new ConcernUtils.onConcernListener() {
@Override
public void onSuccess() {
Map<String, Object> kv = new HashMap<>();
kv.put("状态", "取消关注");
DataUtils.onEvent(GameDetailActivity.this, "游戏关注", mGameEntity.getName(), kv);
DataCollectionUtils.uploadConcern(GameDetailActivity.this,
mGameEntity.getName(), mGameEntity.getId(), "取消关注");
mGameConcern.setText(getString(R.string.concern));
mGameConcern.setBackgroundResource(R.drawable.textview_concern_red_style);
mGameConcern.setTextColor(0xffffffff);
mGameConcern.setEnabled(true);
}
@Override
public void onError() {
mGameConcern.setEnabled(true);
toast(R.string.cancel_concern_failure);
}
});
}
}, new DialogUtils.CancelListener() {
@Override
public void onCancel() {
mGameConcern.setEnabled(true);
}
});
}
}
});
break;
case R.id.gamedetail_kaifu_hint:
mAppBarLayout.setExpanded(false, true);
mIsScrollToKaiFu = true;
break;
}
/**
* @param switchToFirstTag 是否跳转到动态 tab
*/
public static void startGameDetailActivity(Context context, String gameId, String entrance, boolean switchToFirstTag) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_GAMEID, gameId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putBoolean(EntranceUtils.KEY_TARGET, switchToFirstTag);
// context.startActivity(new IntentFactory.Builder(context).setActivity(GameDetailActivity.class)
// .setFragment(GameDetailFragment.class).setArgs(bundle).build());
context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle));
}
}

View File

@ -4,216 +4,33 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.gh.base.BaseActivity;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.adapter.GameNewsAdapter;
import com.gh.gamecenter.adapter.GameNewsTypeListAdapter;
import com.gh.gamecenter.eventbus.EBTypeChange;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import retrofit2.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import com.halo.assistant.fragment.game.GameNewsSearchFragment;
/**
* Created by LGT on 2016/8/29.
* 游戏新闻界面
* 游戏新闻界面由于MTA界面统计未重新记录的原因暂留此傀儡连名字都不能改真是可怕
*/
public class GameNewsActivity extends BaseActivity implements View.OnClickListener {
@BindView(R.id.game_news_list)
RecyclerView mGameNewsRv;
@BindView(R.id.game_news_top_type_list)
RecyclerView mGameNewsTypeRv;
@BindView(R.id.reuse_none_data)
LinearLayout mNoDataLl;
@BindView(R.id.reuse_tv_none_data)
TextView mNoDataTv;
private GameNewsAdapter adapter;
private GameNewsTypeListAdapter typeListAdapter;
private LinearLayoutManager layoutManager;
private ImageView ivSearch;
private ArrayMap<String, GameNewsAdapter> adapterMap;
private List<String> typeList;
private String gameId;
private float startY = 0;
@Deprecated
public class GameNewsActivity extends NormalActivity {
@NonNull
public static Intent getIntent(Context context, String gameName, String gameId, String entrance) {
Intent intent = new Intent(context, GameNewsActivity.class);
intent.putExtra(EntranceUtils.KEY_GAMENAME, gameName);
intent.putExtra(EntranceUtils.KEY_GAMEID, gameId);
intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
return intent;
// Intent intent = new Intent(context, GameNewsActivity.class);
// intent.putExtra(EntranceUtils.KEY_GAMENAME, gameName);
// intent.putExtra(EntranceUtils.KEY_GAMEID, gameId);
// intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance);
// return intent;
final Bundle args = new Bundle();
args.putString(EntranceUtils.KEY_GAMENAME, gameName);
args.putString(EntranceUtils.KEY_GAMEID, gameId);
args.putString(EntranceUtils.KEY_ENTRANCE, entrance);
// return new IntentFactory.Builder(context)
// .setActivity(GameNewsActivity.class)
// .setFragment(GameNewsSearchFragment.class).setArgs(args).build();
return getTargetIntent(context, GameNewsActivity.class, GameNewsSearchFragment.class, args);
}
@Override
protected int getLayoutId() {
return R.layout.activity_game_news;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ivSearch = new ImageView(this);
ivSearch.setImageResource(R.drawable.ic_search_white);
RelativeLayout.LayoutParams ivSearchParams = new RelativeLayout.LayoutParams(
DisplayUtils.dip2px(this, 20), DisplayUtils.dip2px(this, 20));
ivSearchParams.addRule(RelativeLayout.CENTER_VERTICAL);
ivSearchParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
ivSearchParams.setMargins(0, 0, DisplayUtils.dip2px(this, 10), 0);
RelativeLayout reuse_actionbar = (RelativeLayout) mContentView.findViewById(R.id.reuse_actionbar);
reuse_actionbar.addView(ivSearch, ivSearchParams);
ivSearch.setOnClickListener(this);
ivSearch.setVisibility(View.GONE);
String gameName = getIntent().getStringExtra(EntranceUtils.KEY_GAMENAME);
initTitle(gameName);
mNoDataTv.setText("暂无内容");
adapterMap = new ArrayMap<>();
typeList = new ArrayList<>();
gameId = getIntent().getStringExtra(EntranceUtils.KEY_GAMEID);
mGameNewsRv.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
mGameNewsRv.setLayoutManager(layoutManager);
mGameNewsRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (adapter != null && newState == RecyclerView.SCROLL_STATE_IDLE
&& layoutManager.findLastVisibleItemPosition() == adapter.getItemCount() - 1) {
if (!adapter.isRemove() && !adapter.isLoading() && !adapter.isNetworkError()) {
adapter.addList(adapter.getNewsList().size());
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (layoutManager.findFirstVisibleItemPosition() >= 1) {
mGameNewsTypeRv.setVisibility(View.VISIBLE);
ivSearch.setVisibility(View.VISIBLE);
} else {
mGameNewsTypeRv.setVisibility(View.GONE);
ivSearch.setVisibility(View.GONE);
}
}
});
mGameNewsTypeRv.setHasFixedSize(true);
mGameNewsTypeRv.setLayoutManager(new GridLayoutManager(this, 5));
//禁止由于滑动出现的阴影
mGameNewsTypeRv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startY = event.getY();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (Math.abs(startY - event.getY()) > 0) {
return true;
}
}
return false;
}
});
if (!TextUtils.isEmpty(gameId)) {
getGameArticleType();
}
}
private void getGameArticleType() {
RetrofitManager.getInstance(this).getApi()
.getGameArticleType(gameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<String>>() {
@Override
public void onResponse(List<String> response) {
super.onResponse(response);
typeList = response;
typeList.add(0, "全部");
adapter = new GameNewsAdapter(GameNewsActivity.this, typeList, mGameNewsRv, gameId, "全部", mEntrance, mNoDataLl);
adapterMap.put("全部", adapter);
mGameNewsRv.setAdapter(adapter);
typeListAdapter = new GameNewsTypeListAdapter(GameNewsActivity.this, typeList, "全部");
mGameNewsTypeRv.setAdapter(typeListAdapter);
ViewGroup.LayoutParams params = mGameNewsTypeRv.getLayoutParams();
params.height = (int) Math.ceil(typeList.size() / 5f) * DisplayUtils.dip2px(GameNewsActivity.this, 35)
+ DisplayUtils.dip2px(GameNewsActivity.this, 12);
mGameNewsTypeRv.setLayoutParams(params);
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBTypeChange change) {
adapter = adapterMap.get(change.getType());
if (adapter == null) {
adapter = new GameNewsAdapter(GameNewsActivity.this, typeList, mGameNewsRv, gameId, change.getType(), mEntrance, mNoDataLl);
adapterMap.put(change.getType(), adapter);
}
mGameNewsRv.setAdapter(adapter);
mGameNewsTypeRv.setVisibility(View.GONE);
ivSearch.setVisibility(View.GONE);
typeListAdapter.setNewsType(change.getType(), change.getPosition());
}
@Override
public void onClick(View v) {
if (v == ivSearch) {
mGameNewsRv.scrollToPosition(0);
mGameNewsTypeRv.setVisibility(View.GONE);
ivSearch.setVisibility(View.GONE);
adapter.openKeyBoard();
}
}
}

View File

@ -0,0 +1,16 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import com.gh.gamecenter.info.InfoWrapperFragment;
/**
* Created by khy on 10/04/18.
*/
public class InfoActivity extends NormalActivity {
public static Intent getIntent(Context context) {
return getTargetIntent(context, InfoActivity.class, InfoWrapperFragment.class);
}
}

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