Compare commits

..

332 Commits

Author SHA1 Message Date
c4e88e9593 编译配置初始化 2025-06-24 19:18:23 +08:00
08d9d92ae4 <autoinstaller>APK 15.2.2 release Publish. 2025-06-24 09:54:47 +08:00
74841c08dc 编译参数修复 2025-06-24 09:52:39 +08:00
945bacb825 <autoinstaller>APK 15.2.1 release Publish. 2025-06-24 09:49:39 +08:00
0e464495fd 编译调试 2025-06-24 09:45:47 +08:00
e8682ce410 Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-06-19 20:56:32 +08:00
2e4003dae0 编译调试 2025-06-19 20:52:02 +08:00
198b0975ce <libaes>Library Release 15.9.1 2025-06-19 20:42:45 +08:00
24a578a9d2 <aes>APK 15.9.1 release Publish. 2025-06-19 20:42:26 +08:00
46de24447f 编译调试 2025-06-19 20:40:41 +08:00
1320984829 修改项目关键设置说明 2025-06-09 11:17:21 +08:00
abf1e5ba42 添加 WinBoLL 应用签名密钥配置说明。 2025-06-09 11:07:59 +08:00
1cd2f88038 标记重点与选项 2025-06-09 10:49:23 +08:00
3f6e583d68 添加应用签名密钥配置说明。 2025-06-09 10:47:38 +08:00
271456bfcd <appbase>APK 15.8.8 release Publish. 2025-06-09 09:38:21 +08:00
ee5458d82c 忽略GitHub工作流启动标记与执行 2025-06-09 09:37:15 +08:00
3a83367f71 与NumTable模块建立时的变更源码合并,并且修复AES模块编译参数。 2025-06-09 01:56:31 +08:00
74b9350a6a <aes>APK 15.9.0 release Publish. 2025-06-09 01:44:30 +08:00
d2858f23f7 准备与NumTable模块项目合并。先提升AES模块版本号,掌控模块源码版本控制优先权。 2025-06-09 01:42:49 +08:00
40a5b9c339 <numtable>APK 15.1.0 release Publish. 2025-06-08 21:21:12 +08:00
fd79113572 设置NumTable版本号 2025-06-08 21:19:54 +08:00
9b911b583c <numtable>APK 15.0.0 release Publish. 2025-06-08 21:16:53 +08:00
37817c3e8c <numtable>Start New Stage Version. 2025-06-08 21:14:54 +08:00
0b5402f5f3 设置应用图标方案 2025-06-08 21:10:47 +08:00
bea22e3853 添加NumTable项目 2025-06-08 20:19:58 +08:00
7e2ad0c01d 精简代码 2025-06-05 17:00:28 +08:00
476ce02fc8 Json数据适配吻合 2025-06-05 15:06:55 +08:00
bc697279ad 编译参数修复 2025-06-05 12:03:14 +08:00
dee01f1179 接口初步对接,正在调试数据处理方法... 2025-06-05 11:59:36 +08:00
a500decc7a 登录数据加密解密成功 2025-06-05 09:52:04 +08:00
5099d00050 <appbase>APK 15.8.7 release Publish. 2025-06-04 15:04:39 +08:00
515d14e896 编译测试 2025-06-04 15:04:01 +08:00
f630e27ed8 编译参数修复 2025-06-04 15:03:06 +08:00
cd7ed01216 添加Logon框和RSA加密模块。 2025-06-04 14:58:01 +08:00
bb24bbfbd1 <appbase>APK 15.8.6 release Publish. 2025-06-04 13:17:34 +08:00
2ba2f88510 添加调试模块 2025-06-04 13:16:51 +08:00
db3a3644a8 <appbase>APK 15.8.5 release Publish. 2025-06-04 12:14:48 +08:00
556bfa7024 添加主机识别 2025-06-04 12:11:19 +08:00
4842a1ec30 添加云宝云测试接口 2025-06-04 11:21:26 +08:00
b0388a2972 Merge remote-tracking branch 'origin/powerbell' into appbase 2025-06-03 20:17:33 +08:00
bd5a1f18ce Merge remote-tracking branch 'origin/ollama' into appbase 2025-06-03 20:17:27 +08:00
99798b4816 Merge branch 'androidxdemo' into appbase 2025-06-03 20:11:30 +08:00
f93b6047a8 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-06-03 20:07:55 +08:00
daa3f858a0 Merge remote-tracking branch 'origin/aes' into appbase 2025-06-03 20:07:49 +08:00
3fded32426 Merge remote-tracking branch 'origin/apputils' into appbase 2025-06-03 20:07:42 +08:00
8f85006040 Merge branch 'androiddemo' into appbase 2025-06-03 20:05:45 +08:00
e28b0bd75e <libaes>Library Release 15.8.1 2025-06-03 19:17:10 +08:00
af1d6d3439 <aes>APK 15.8.1 release Publish. 2025-06-03 19:16:41 +08:00
470d1ffa1f 编译测试 2025-06-03 19:13:16 +08:00
49ae869df1 Merge remote-tracking branch 'origin/aes' into appbase 2025-06-03 17:54:27 +08:00
77e98bafe4 <libapputils>Library Release 15.8.4 2025-06-03 15:05:54 +08:00
ff14d0c0c3 <apputils>APK 15.8.4 release Publish. 2025-06-03 15:05:42 +08:00
950be3a182 <libapputils>Library Release 15.8.3 2025-06-03 14:35:23 +08:00
1f20fca9be <apputils>APK 15.8.3 release Publish. 2025-06-03 14:35:00 +08:00
8d29d11078 Merge branch 'apputils' into m2 2025-06-03 13:50:51 +08:00
7534881f50 <libappbase>Library Release 15.8.4 2025-06-03 13:40:13 +08:00
ef992dcd7c <appbase>APK 15.8.4 release Publish. 2025-06-03 13:40:01 +08:00
71c1baa4ba <libappbase>Library Release 15.8.3 2025-06-03 13:26:16 +08:00
9e149037db <appbase>APK 15.8.3 release Publish. 2025-06-03 13:25:47 +08:00
89df24f736 更新秘钥库 2025-06-03 13:24:10 +08:00
2118495bc8 更新秘钥库 2025-06-03 13:13:54 +08:00
1dd614bd68 更新秘钥库 2025-06-03 12:58:51 +08:00
b793c74e81 修改应用秘钥配置 2025-06-03 12:04:39 +08:00
8d1872a893 应用介绍页,完成论坛与Git仓库连接跳转。 2025-06-01 20:50:03 +08:00
5c58ee34e7 添加说明书 2025-06-01 20:24:36 +08:00
e530403af7 Merge remote-tracking branch 'origin/appbase' into aes 2025-06-01 16:29:05 +08:00
264ab802c5 更新Git项目名称 2025-06-01 16:28:28 +08:00
7c1832dc05 更新类库 2025-06-01 16:06:12 +08:00
9a0ee889ba 更新类库 2025-06-01 16:04:21 +08:00
c40066ca4d 更新类库 2025-06-01 16:03:16 +08:00
5348d1ef6d <libapputils>Library Release 15.8.2 2025-06-01 16:01:39 +08:00
063c997bbb <apputils>APK 15.8.2 release Publish. 2025-06-01 16:01:19 +08:00
1376ca7ebb Merge remote-tracking branch 'origin/appbase' into apputils 2025-06-01 15:59:59 +08:00
92e271b569 更新类库 2025-06-01 15:58:12 +08:00
a5083cc52f 更新类库 2025-06-01 15:43:48 +08:00
0692d4efb2 <libappbase>Library Release 15.8.2 2025-06-01 15:41:59 +08:00
f10438d3d3 <appbase>APK 15.8.2 release Publish. 2025-06-01 15:41:38 +08:00
1e697bc12d 添加调试信息 2025-06-01 15:03:44 +08:00
d5a3c626b3 修复多窗口重复创建问题 2025-06-01 14:02:56 +08:00
56692db142 20250531_213355_576 2025-05-31 21:34:04 +08:00
934d54963a 添加日志窗口打开功能 2025-05-30 09:42:36 +08:00
c105123e7b 0922 2025-05-30 09:22:42 +08:00
d8c534bbc8 更新适配系统介绍 2025-05-30 09:00:59 +08:00
6cce9c4d3f <powerbell>APK 15.4.1 release Publish. 2025-05-29 09:43:37 +08:00
df18c34976 <powerbell>APK 15.4.0 release Publish. 2025-05-29 09:43:12 +08:00
22ca83b5b7 版本号调整 2025-05-29 09:38:25 +08:00
98233ce148 编译测试 2025-05-29 09:31:28 +08:00
41fd9b171b 更新联系邮件 2025-05-29 09:28:13 +08:00
330e5032df Merge remote-tracking branch 'origin/mymessagemanager' into appbase 2025-05-21 01:14:52 +08:00
76420ff5f4 <mymessagemanager>APK 15.2.5 release Publish. 2025-05-20 20:39:06 +08:00
ee3553716c 编译调试 2025-05-20 20:31:06 +08:00
02da4c3db9 Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-20 20:21:52 +08:00
d689db61ff 分支合并修整 2025-05-20 20:16:03 +08:00
2b090e5c8e <contacts>APK 15.3.2 release Publish. 2025-05-20 13:02:18 +08:00
309214ecf3 更新类库 2025-05-20 12:54:44 +08:00
d29c9de3b4 合并20250520_122311_006 2025-05-20 12:23:15 +08:00
d7efdb6c02 编译调试 2025-05-20 11:28:25 +08:00
20b36dd63b Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-05-20 05:46:28 +08:00
a40450c085 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-05-20 05:46:23 +08:00
e7a7a4438c 更新类库 2025-05-20 05:45:52 +08:00
3e6de13fa3 更新类库 2025-05-20 05:44:07 +08:00
af848809e9 <libappbase>Library Release 15.8.1 2025-05-20 05:41:16 +08:00
2c7026a635 <appbase>APK 15.8.1 release Publish. 2025-05-20 05:40:58 +08:00
6278c3f945 修复次级窗口打开时传递的参数缺失问题 2025-05-20 05:39:48 +08:00
bc3a320433 移除WinBoLL应用模块 2025-05-13 12:01:35 +08:00
e03b8d4745 Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-05-13 11:52:23 +08:00
d5fb348134 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-05-13 11:52:17 +08:00
5c7437b19c Merge remote-tracking branch 'origin/aes' into appbase 2025-05-13 11:52:11 +08:00
bf09def10b 更新适配系统版本 2025-05-13 11:44:39 +08:00
8431d7dfa9 更新适配系统版本 2025-05-13 11:43:25 +08:00
6aadaf87af 更新类库版本 2025-05-13 11:40:34 +08:00
6a2943420f 更新类库版本 2025-05-13 11:34:56 +08:00
dc704e292a <libaes>Library Release 15.8.0 2025-05-13 11:22:45 +08:00
1087a7837c <aes>APK 15.8.0 release Publish. 2025-05-13 11:22:24 +08:00
59876a2353 设置基础版本号 2025-05-13 11:21:27 +08:00
053b45e87e <libapputils>Library Release 15.8.1 2025-05-13 11:18:15 +08:00
58e49ed371 <apputils>APK 15.8.1 release Publish. 2025-05-13 11:17:53 +08:00
90a6eb266b 编译调试 2025-05-13 11:17:24 +08:00
f0a564c9bb <apputils>Start New Stage Version. 2025-05-13 11:11:32 +08:00
46b21331af Merge remote-tracking branch 'origin/appbase' into apputils 2025-05-13 11:10:47 +08:00
6221cc30ac <libapputils>Library Release 15.8.0 2025-05-13 11:10:23 +08:00
429499885b <libappbase>Library Release 15.8.0 2025-05-13 11:05:19 +08:00
fcf4ad2fc0 <appbase>APK 15.8.0 release Publish. 2025-05-13 11:05:02 +08:00
7635f6f084 设置基础版本号 2025-05-13 11:03:55 +08:00
e49935f772 <libappbase>Library Release 15.7.7 2025-05-13 10:29:25 +08:00
381ddf9e40 <appbase>APK 15.7.7 release Publish. 2025-05-13 10:28:56 +08:00
7774317c3b Merge remote-tracking branch 'origin/appbase' into aes 2025-05-13 09:55:12 +08:00
16f45aabe4 <aes>APK 15.6.3 release Publish. 2025-05-12 18:10:35 +08:00
8190f4818f <aes>APK 15.6.2 release Publish. 2025-05-12 18:10:02 +08:00
f339733d4b <aes>APK 15.6.1 release Publish. 2025-05-12 18:07:00 +08:00
f770ea5aa0 Merge remote-tracking branch 'origin/aes' into appbase 2025-05-12 18:04:01 +08:00
0a993ccb9b 设置 Gradle 编译时的本地 Maven 库路径 2025-05-12 18:03:14 +08:00
9d0bdb803b Merge remote-tracking branch 'origin/aes' into appbase 2025-05-12 15:19:29 +08:00
9bd4c41b75 添加 Maven 库紧急备用通道 2025-05-12 15:19:02 +08:00
af0b8859f0 编译调试 2025-05-12 03:37:14 +08:00
275330f553 Merge remote-tracking branch 'origin/aes' into appbase 2025-05-12 03:35:32 +08:00
42256fd0e4 更新 Maven 库引用方案 2025-05-12 03:34:18 +08:00
fa72983f54 编译调试 2025-05-10 11:17:04 +08:00
35825d5ead 更换联系方式 2025-05-10 09:32:55 +08:00
577237bc9e 修整说明书 2025-05-09 20:11:14 +08:00
8ef41b9f1b 再次修复一下 2025-05-09 20:08:32 +08:00
36733e362b 恢复到77bdf886e9ab348cb2853d42dd80a7e4bfa43d7d提交点 2025-05-09 19:58:52 +08:00
fbf71e6998 设置OriginMaster提交点合并APPBase源码。 2025-05-08 17:56:09 +08:00
ZhanGSKen
77bdf886e9
Initial commit 2025-05-08 17:43:51 +08:00
2a11205468 添加 gradle 调试码 2025-05-07 20:00:44 +08:00
bb9f46373a Merge remote-tracking branch 'origin/timestamp' into appbase 2025-05-07 19:23:19 +08:00
af797743d4 <timestamp>APK 15.1.1 release Publish. 2025-05-07 15:07:02 +08:00
1b37f1bd11 修改图标资源 2025-05-07 15:06:16 +08:00
00177284c1 <timestamp>APK 15.1.0 release Publish. 2025-05-07 14:54:01 +08:00
178e00f8b4 更新版本号 2025-05-07 14:53:32 +08:00
743a5d5299 <timestamp>Start New Stage Version. 2025-05-07 14:51:24 +08:00
30f75f2394 <timestamp>Start New Stage Version. 2025-05-07 14:51:14 +08:00
9d66934694 图标资源修改 2025-05-07 14:48:50 +08:00
c7177f5fa5 <timestamp>APK 15.0.16 release Publish. 2025-05-07 14:44:06 +08:00
9e8263ae8f 分开应用图标和调试图标 2025-05-07 14:43:20 +08:00
5ee9da1982 <timestamp>APK 15.0.15 release Publish. 2025-05-07 14:05:50 +08:00
f59f7676b7 调整通知栏显示信息 2025-05-07 14:05:12 +08:00
19b8251182 <timestamp>APK 15.0.14 release Publish. 2025-05-07 13:59:51 +08:00
4dadb15c0c <timestamp>APK 15.0.13 release Publish. 2025-05-07 13:59:38 +08:00
21b5487513 设置时间戳初始数据 2025-05-07 13:58:56 +08:00
f49c8141a8 <timestamp>APK 15.0.12 release Publish. 2025-05-07 13:48:06 +08:00
6f3ce092ca 调整调试版与阶段版的消息发送 2025-05-07 13:47:26 +08:00
29785be88d 修复信息显示 2025-05-07 13:46:21 +08:00
bf0a70e056 Merge remote-tracking branch 'origin/timestamp' into appbase 2025-05-07 13:34:00 +08:00
3f809e4c7a <timestamp>APK 15.0.11 release Publish. 2025-05-07 13:33:12 +08:00
9c3c485ecd 更新Maven库地址 2025-05-07 13:32:10 +08:00
336511931d <timestamp>APK 15.0.10 release Publish. 2025-05-07 12:09:48 +08:00
d3da3304ee 统一时间戳数据生成方法 2025-05-07 11:58:48 +08:00
a5295a0744 更新Maven库地址 2025-05-07 11:58:14 +08:00
9b761b35ce <timestamp>APK 15.0.9 release Publish. 2025-05-07 10:56:24 +08:00
5206f8781e 初始数据 BugFix. 2025-05-07 10:55:46 +08:00
2c0a5bfe65 更新默认时间戳显示格式 2025-05-07 10:51:48 +08:00
49bce0f773 <timestamp>APK 15.0.8 release Publish. 2025-05-07 10:48:11 +08:00
07c6778212 优化UI显示 2025-05-07 10:47:19 +08:00
1cdad9ac7d <timestamp>APK 15.0.7 release Publish. 2025-05-07 02:58:13 +08:00
986922c1fa 添加自定义应用内铃声 2025-05-07 02:57:08 +08:00
bff40d2a64 重构通知栏消息,添加铃声。 2025-05-07 02:35:51 +08:00
c687b5513d 更新说明书 2025-05-07 00:31:11 +08:00
13e0ad3f03 <timestamp>APK 15.0.6 release Publish. 2025-05-06 20:37:48 +08:00
be85ef923e 更新应用图标,优化状态栏UI。 2025-05-06 20:36:51 +08:00
9a3383a43b <timestamp>APK 15.0.5 release Publish. 2025-05-06 18:33:59 +08:00
d875b6965d <timestamp>APK 15.0.4 release Publish. 2025-05-06 18:33:32 +08:00
bc873852c2 修复时间戳复制格式设置未保存问题 2025-05-06 18:32:51 +08:00
b032de55dc 添加说明书 2025-05-06 18:14:34 +08:00
8fa20b56ec <timestamp>APK 15.0.3 release Publish. 2025-05-06 18:01:46 +08:00
1ca93a610e 优化常驻通知电量消耗 2025-05-06 17:59:57 +08:00
6555346618 重构通知栏模块 2025-05-06 17:04:14 +08:00
df6633046c <timestamp>APK 15.0.2 release Publish. 2025-05-06 11:34:02 +08:00
7d35d5a9b8 添加通知栏打开主窗口功能 2025-05-06 11:33:28 +08:00
ddce5646bd <timestamp>APK 15.0.1 release Publish. 2025-05-06 11:27:46 +08:00
3607a99053 添加通知栏清理功能 2025-05-06 11:27:09 +08:00
b44e5575b3 Merge remote-tracking branch 'origin/timestamp' into appbase 2025-05-06 11:18:33 +08:00
6a101d8843 <timestamp>Start New Stage Version. 2025-05-06 11:17:47 +08:00
c5e5e76bbf <timestamp>APK 15.0.0 release Publish. 2025-05-06 11:17:44 +08:00
6d05808a2a 设置目标版本 2025-05-06 11:13:35 +08:00
2625ffe6a6 通知栏优先级设置调试 2025-05-06 11:11:45 +08:00
9c4c1320aa 添加拷贝时间戳到剪贴板功能 2025-05-06 11:07:28 +08:00
551b424960 添加时间戳拷贝与显示的格式设置功能 2025-05-06 10:48:53 +08:00
1062c7d2ee 重构常驻通知栏 2025-05-06 10:09:34 +08:00
e958556073 0937 2025-05-05 21:37:22 +08:00
466e061aa8 0343 2025-05-05 15:43:41 +08:00
2f2512cd76 修复时间戳复制按钮响应 2025-05-05 12:39:45 +08:00
d26de8f2f7 1153 2025-05-05 11:53:48 +08:00
2e9b6ae263 添加通知栏时间戳显示 2025-05-05 11:30:41 +08:00
f0a29dc7a9 添加常驻通知栏 2025-05-05 10:45:25 +08:00
7c7554133b <contacts>APK 15.3.1 release Publish. 2025-05-05 03:56:16 +08:00
98f6d0019b 修复盾牌参数问题 2025-05-05 03:55:03 +08:00
fc9c82921d 修复盾牌参数不同步问题 2025-05-05 03:51:07 +08:00
1ac0ad96e1 云盾规则修复 2025-05-05 03:44:52 +08:00
125c2b4431 初始化 TimeStamp 时间戳应用。 2025-05-04 22:03:06 +08:00
9060cb51ff <contacts>APK 15.3.0 release Publish. 2025-05-04 21:09:15 +08:00
7951d0a8d6 类库更新,BugFix. 2025-05-04 21:07:56 +08:00
ded775ae01 类库更新,BugFix。 2025-05-04 21:01:31 +08:00
82258f1763 <contacts>Start New Stage Version. 2025-05-04 20:57:46 +08:00
99bf53f27d 把 WinBoll 改为 WinBoLL 2025-05-04 20:08:37 +08:00
ddb6b53189 Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-04 19:49:28 +08:00
4a4e20a6bd 常驻通知栏点击BugFix. 2025-05-04 13:33:15 +08:00
4c0d825d7b Merge remote-tracking branch 'origin/appbase' into autoinstaller 2025-05-04 13:29:22 +08:00
ae111b3a99 2025-05-04 13:27:55 +08:00
03ceaf3e2a Merge remote-tracking branch 'origin/powerbell' into appbase 2025-05-04 13:23:10 +08:00
ae8da772c0 常驻通知栏UI优化。 2025-05-03 20:50:53 +08:00
b2555ebfd3 类库升级,源码编译整理。 2025-05-03 20:48:33 +08:00
7ff2cab615 源码整理 2025-05-03 19:36:03 +08:00
954139f0c9 Merge remote-tracking branch 'origin/appbase' into aes 2025-05-03 18:34:10 +08:00
027dc23060 更新Maven库地址设置 2025-05-03 18:33:41 +08:00
82d9aabf33 Merge remote-tracking branch 'origin/appbase' into mymessagemanager 2025-05-03 16:50:15 +08:00
640f0c39e9 常驻通知栏UI优化。 2025-05-03 16:44:32 +08:00
9816167e87 优化通知栏显示文字 2025-05-03 14:22:27 +08:00
512c321b76 优化常驻通知栏显示UI 2025-05-03 14:19:32 +08:00
482c007481 应用服务启动后延迟2秒执行提醒任务 2025-05-03 14:01:56 +08:00
609182f909 编译测试 2025-05-03 13:53:48 +08:00
eb69a473a3 调整类库引用顺序 2025-05-03 13:53:32 +08:00
38e4deb425 修复应用不能打开的Bug. 2025-05-03 13:46:46 +08:00
d06023d023 (打开应用)的按钮修复 2025-05-03 13:21:32 +08:00
cb486bb90c 更新类库,BugFix。 2025-05-03 11:52:00 +08:00
2cbf9e5669 Merge remote-tracking branch 'origin/appbase' into autoinstaller 2025-05-03 10:09:42 +08:00
e045bbb71c Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-02 06:16:49 +08:00
e772563fc0 模块清理 2025-05-02 06:16:08 +08:00
d5782da040 Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-02 06:12:40 +08:00
55ce968053 <powerbell>APK 15.3.0 release Publish. 2025-04-29 21:00:39 +08:00
502d3ad23d 升级版本号,升级引用类库。设置适配的Android API为30. 2025-04-29 20:42:50 +08:00
103c1101ce Merge remote-tracking branch 'origin/appbase' into powerbell 2025-04-29 20:08:31 +08:00
ZhanGSKen
4612593d88 添加调试日志 2025-04-15 20:47:23 +08:00
ZhanGSKen
0460613aea 固定参数属性初始化方法综合 2025-04-15 20:43:18 +08:00
ZhanGSKen
e1dadfa41c 源码检查,辅助提交。 2025-04-15 19:45:34 +08:00
ZhanGSKen
1a7134711e 实现磁贴工具静态挂载... 2025-04-15 18:22:17 +08:00
ZhanGSKen
dabd1271fd 重构磁贴状态更新方法 2025-04-15 17:23:19 +08:00
ZhanGSKen
0d3d691d8a 添加应用图标文件 2025-04-15 17:10:01 +08:00
ZhanGSKen
f3198de003 源码整理 2025-04-15 16:18:26 +08:00
ZhanGSKen
df179242f0 清理冗余注释 2025-04-15 16:09:39 +08:00
ZhanGSKen
1ae3fdf2b7 取消磁贴状态更新 2025-04-15 16:07:49 +08:00
ZhanGSKen
7edc341f15 整理代码 2025-04-15 16:03:45 +08:00
ZhanGSKen
f1669f9e41 更新应用实例参数上下文 2025-04-15 16:00:42 +08:00
ZhanGSKen
63b1d2dece 添加磁贴工具... 2025-04-15 10:57:19 +08:00
ZhanGSKen
6a0510e76c 取消用应用外部的路径作为临时目录,转为应用内部缓存目录里的文件夹作为临时目录。 2025-04-14 21:01:46 +08:00
ZhanGSKen
840da14438 资源化配置Bobulltoon数据地址。 2025-04-14 20:11:47 +08:00
ZhanGSKen
31595fe1ae 添加HTTP明文传输配置 2025-04-14 19:53:33 +08:00
ZhanGSKen
2c91d32e41 在号码识别对比中,兼容当前区域号码。 2025-04-14 16:36:24 +08:00
ZhanGSKen
58dabb7138 保持现有Contacts分支,加入紧急修复分支。 2025-04-13 02:59:21 +08:00
ZhanGSKen
3432575aa7 添加BoBullToon URL 自定义功能... 2025-04-12 21:14:33 +08:00
ZhanGSKen
c302179960 <autoinstaller>APK 15.2.0 release Publish. 2025-04-02 21:25:51 +08:00
ZhanGSKen
df55608eb3 更新应用打开按钮的启动数据。 2025-04-02 21:23:49 +08:00
ZhanGSKen
b64a229ab1 数据模型命名空间重构 2025-04-02 20:48:37 +08:00
ZhanGSKen
d507d4ac06 调整全局吐司风格 2025-04-02 20:45:25 +08:00
ZhanGSKen
e815c08970 更新类库,去掉主窗口启动时的吐司提示。 2025-04-02 20:41:05 +08:00
ZhanGSKen
d780116031 Merge remote-tracking branch 'origin/appbase' into autoinstaller 2025-04-02 20:31:31 +08:00
ZhanGSKen
fa43d43110 <mymessagemanager>APK 15.2.4 release Publish. 2025-04-01 19:55:49 +08:00
ZhanGSKen
8f8e7d98c7 通知调试完成,添加旧通知设置清理按钮。 2025-04-01 19:54:30 +08:00
ZhanGSKen
af39f98a51 通知模块调试ing... 2025-04-01 15:20:02 +08:00
ZhanGSKen
8dd41a0c3a <powerbell>APK 15.2.2 release Publish. 2025-03-31 20:11:58 +08:00
ZhanGSKen
ca4814744f 更新类库,修复调试模式设置。 2025-03-31 20:11:08 +08:00
ZhanGSKen
5a1d557683 <mymessagemanager>APK 15.2.3 release Publish. 2025-03-31 20:04:51 +08:00
ZhanGSKen
39116f0912 更新类库,修复调试模式保存问题。 2025-03-31 20:03:40 +08:00
ZhanGSKen
5a9ee81c30 <powerbell>APK 15.2.1 release Publish. 2025-03-31 15:08:28 +08:00
ZhanGSKen
841d526b0d <powerbell>APK 15.2.0 release Publish. 2025-03-31 15:06:43 +08:00
ZhanGSKen
11d2db6bf9 更新应用简介。 2025-03-31 15:05:02 +08:00
ZhanGSKen
93d8fa15db 修改主题配置,修复日志菜单栏显示问题。 2025-03-31 14:59:54 +08:00
ZhanGSKen
99ff741a22 更新类库,设置版本号。 2025-03-31 14:53:33 +08:00
ZhanGSKen
5bc7581db1 Merge remote-tracking branch 'origin/androidxdemo' into powerbell 2025-03-31 14:39:31 +08:00
ZhanGSKen
fde0712439 Merge remote-tracking branch 'origin/appbase' into powerbell 2025-03-31 14:39:26 +08:00
ZhanGSKen
a6b711b38b <mymessagemanager>APK 15.2.2 release Publish. 2025-03-31 02:36:56 +08:00
ZhanGSKen
d1703551f5 更新应用调试模式设置方法 2025-03-31 02:36:15 +08:00
ZhanGSKen
d63f7d3d83 <mymessagemanager>APK 15.2.1 release Publish. 2025-03-31 02:29:38 +08:00
ZhanGSKen
06b399846d Merge remote-tracking branch 'origin/appbase' into mymessagemanager 2025-03-31 02:27:33 +08:00
ZhanGSKen
e06efea08e <mymessagemanager>APK 15.2.0 release Publish. 2025-03-31 02:27:06 +08:00
ZhanGSKen
890ff6eda9 更新类库,添加更新日志查看方式和应用介绍窗口。 2025-03-31 02:24:50 +08:00
ZhanGSKen
e5a5eda9b6 1225 2025-03-29 12:25:04 +08:00
ZhanGSKen
174a052088 更新类库引用次序,预防资源引用次序混乱。 2025-03-29 12:24:14 +08:00
ZhanGSKen
fbd8441264 更新类库解决应用介绍窗口资源引用冲突问题 2025-03-29 12:19:26 +08:00
ZhanGSKen
fb92e9f673 更新类库 2025-03-29 11:53:35 +08:00
ZhanGSKen
d34d1e2796 设置版本号 2025-03-29 10:20:29 +08:00
ZhanGSKen
36fb8b41a4 1017 2025-03-29 10:17:55 +08:00
ZhanGSKen
fe70a18547 Merge branch 'appbase' into mymessagemanager 2025-03-29 09:45:00 +08:00
ZhanGSKen
b61c63c426 <ollama>Start New Stage Version. 2025-03-28 05:09:23 +08:00
ZhanGSKen
f02dc215ca <ollama>APK 15.0.0 release Publish. 2025-03-28 05:09:21 +08:00
ZhanGSKen
1c27d0ccdc Ollama 问答模块完成。 2025-03-28 05:04:15 +08:00
ZhanGSKen
803745d12e 添加简单http访问功能 2025-03-27 20:45:57 +08:00
ZhanGSKen
a66be9cd37 添加WinBoll Ollama 访问项目。 2025-03-27 19:39:54 +08:00
ZhanGSKen
46e4ee7fb7 <mymessagemanager>APK 15.0.0 release Publish. 2025-03-26 17:54:55 +08:00
ZhanGSKen
b2b959232c 去掉二级窗口分屏模式 2025-03-26 17:52:10 +08:00
ZhanGSKen
b11f814c41 Merge remote-tracking branch 'origin/appbase' into mymessagemanager 2025-03-26 17:49:04 +08:00
ZhanGSKen
1e991aed7e 适配小米15,设置编译参数。 2025-03-25 19:39:21 +08:00
ZhanGSKen
f56125f82a Merge branch 'appbase' into mymessagemanager 2025-03-25 19:29:33 +08:00
ZhanGSKen
4ff54c785e <powerbell>APK 15.0.3 release Publish. 2025-03-25 02:43:07 +08:00
ZhanGSKen
b961468e1e <powerbell>APK 15.0.2 release Publish. 2025-03-25 02:42:42 +08:00
ZhanGSKen
575ef9aac0 内容提供配置调整 2025-03-25 02:42:10 +08:00
ZhanGSKen
16b118f83b <powerbell>APK 15.0.1 release Publish. 2025-03-25 02:36:56 +08:00
ZhanGSKen
1eeba4e4c6 <powerbell>APK 15.0.0 release Publish. 2025-03-25 02:34:56 +08:00
ZhanGSKen
66eb8e06ea 应用介绍页基本调试完成 2025-03-25 02:30:45 +08:00
ZhanGSKen
51775620db 更新类库,调试应用介绍... 2025-03-24 20:24:31 +08:00
ZhanGSKen
deaa9caadd Merge remote-tracking branch 'origin/appbase' into powerbell 2025-03-24 14:33:17 +08:00
ZhanGSKen
58af5ba074 <powerbell>APK 4.0.7 release Publish. 2025-03-22 16:06:33 +08:00
ZhanGSKen
19743d30ef 修复编译参数 2025-03-22 16:05:10 +08:00
ZhanGSKen
3c2b720e20 调整背景图片设置窗口按钮布局 2025-03-22 16:03:08 +08:00
ZhanGSKen
5a052e4b22 添加电池报告窗口雏形 2025-03-22 15:54:18 +08:00
ZhanGSKen
4ccf6824a6 <powerbell>APK 4.0.6 release Publish. 2025-03-22 06:01:46 +08:00
ZhanGSKen
508c8b0b97 适配小米15,修改通知模块。 2025-03-22 05:53:58 +08:00
ZhanGSKen
0d21994291 编译配置精简 2025-03-22 03:06:40 +08:00
ZhanGSKen
5714aed761 <autoinstaller>APK 15.0.0 release Publish. 2025-03-15 15:38:45 +08:00
ZhanGSKen
f04f5cf77c 更新安卓适配版本 2025-03-15 15:33:36 +08:00
ZhanGSKen
6ccbaf8c32 更新类库 2025-03-15 15:21:41 +08:00
ZhanGSKen
33b7b65239 <mymessagemanager>APK 4.1.18 release Publish. 2025-03-01 14:11:49 +08:00
ZhanGSKen
664d14ad84 编译配置修复 2025-03-01 14:09:49 +08:00
ZhanGSKen
47cb393f76 更新短信接收规则设定:
1.启用了只接受通讯录,通讯录里有记录
2.如果不是数字通讯地址,但是在通讯录内
3.通讯地址是数字,并且在短信接收规则内。
以上3种情况就接收,其他一律放到回收站。
2025-03-01 14:01:13 +08:00
ZhanGSKen
6495f1c66e <mymessagemanager>APK 4.1.17 release Publish. 2025-03-01 13:39:17 +08:00
ZhanGSKen
f0c52d1e02 修复格式化通信录地址后的短信浏览BUG。 2025-03-01 13:38:37 +08:00
ZhanGSKen
d948f31331 <mymessagemanager>APK 4.1.16 release Publish. 2025-03-01 13:27:26 +08:00
ZhanGSKen
e1b3087020 格式化通讯地址显示 2025-03-01 13:25:22 +08:00
ZhanGSKen
03e21ab81c <mymessagemanager>APK 4.1.15 release Publish. 2025-02-25 20:51:01 +08:00
ZhanGSKen
ac72132969 添加电话号码前面有+号的检测兼容。 2025-02-25 20:50:03 +08:00
ZhanGSKen
cedb5f521b <mymessagemanager>APK 4.1.14 release Publish. 2025-02-25 20:25:31 +08:00
ZhanGSKen
396df6713c 添加单元测试模块,增加电话号码是否是数字的检测。 2025-02-25 20:19:54 +08:00
524 changed files with 8436 additions and 4787 deletions

6
.gitmodules vendored
View File

@ -1,6 +1,6 @@
[submodule "winboll-x"]
path = winboll-x
url = https://gitea.winboll.cc/Studio/WinBollX.git
[submodule "libjc/jcc/libs"] [submodule "libjc/jcc/libs"]
path = libjc/jcc/libs path = libjc/jcc/libs
url = https://gitea.winboll.cc/Studio/APP_libjc_jcc_libs.git url = https://gitea.winboll.cc/Studio/APP_libjc_jcc_libs.git
[submodule "keystore"]
path = keystore
url = https://gitea.winboll.cc/Studio/keystore.git

View File

@ -1,3 +0,0 @@
#!/bin/usr/bash
## Change Back To Beta KeyStore in keystore module.
cd keystore;git reset --hard f5bc75ff45fcb8894b5bd3f49b91bdd8fe3c317e;cd ..

View File

@ -1,3 +0,0 @@
#!/bin/usr/bash
## Change Back To StageMG KeyStore in keystore module.
cd keystore;git reset --hard d22519b11253f85f495400b01b6373e9657defb4;cd ..

View File

@ -113,10 +113,10 @@ if [[ $? -eq 0 ]]; then
# 如果Git已经提交了所有代码就执行标签和应用发布操作 # 如果Git已经提交了所有代码就执行标签和应用发布操作
# 预先询问是否添加工作流标签 # 预先询问是否添加工作流标签
echo "Add Github Workflows Tag? (yes/No)" #echo "Add Github Workflows Tag? (yes/No)"
result=$(askAddWorkflowsTag) #result=$(askAddWorkflowsTag)
nAskAddWorkflowsTag=$? #nAskAddWorkflowsTag=$?
echo $result #echo $result
# 发布应用 # 发布应用
echo "Publishing WinBoLL APK ..." echo "Publishing WinBoLL APK ..."
@ -138,17 +138,17 @@ if [[ $? -eq 0 ]]; then
fi fi
# 添加 GitHub 工作流标签 # 添加 GitHub 工作流标签
if [[ $nAskAddWorkflowsTag -eq 1 ]]; then #if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
# 如果用户选择添加工作流标签 # 如果用户选择添加工作流标签
result=$(addWorkflowsTag $1) #result=$(addWorkflowsTag $1)
if [[ $? -eq 0 ]]; then #if [[ $? -eq 0 ]]; then
echo $result # echo $result
# 工作流标签添加成功 # 工作流标签添加成功
else #else
echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel." #echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
exit 1 # addWorkflowsTag 异常 #exit 1 # addWorkflowsTag 异常
fi #fi
fi #fi
## 清理更新描述文件内容 ## 清理更新描述文件内容
echo "" > $1/app_update_description.txt echo "" > $1/app_update_description.txt

View File

@ -0,0 +1,49 @@
#!/bin/bash
# 应用秘钥创建脚本
# Linux 命令行创建JKS秘钥alias和keyAlias可配置文件名含时间戳
# 可配置参数(按需修改)
ALIAS="WinBoLL.CC_Debug" # 别名与keyAlias一致
STORE_PASS="androiddebugkey"
KEY_PASS="androiddebugkey"
COUNTRY="CN" # 国家代码
# 获取当前时间戳
TIMESTAMP=$(date +%Y%m%d%H%M%S)
FILENAME="${ALIAS}_${TIMESTAMP}.jks"
STORENAME="${ALIAS}_${TIMESTAMP}.keystore"
# 生成JKS文件alias与keyAlias同步
keytool -genkeypair \
-alias "${ALIAS}" \
-keyalg RSA \
-keysize 2048 \
-validity 1 \
-keystore "${FILENAME}" \
-dname "CN=WBFans, OU=Studio, O=WinBoLL, L=Shanwei, ST=Guangdong, C=${COUNTRY}" \
-storepass "${STORE_PASS}" \
-keypass "${KEY_PASS}"
# 写入配置文件
cat <<EOF > ${STORENAME}
keyAlias=${ALIAS}
keyPassword=${KEY_PASS}
storeFile=../appkey.jks
storePassword=${STORE_PASS}
EOF
echo "已生成秘钥:${FILENAME}"
echo "配置已写入 ${STORENAME}keyAlias=${ALIAS}"
# 询问是否复制文件
read -p "是否需要将文件复制为 appkey.jks 和 appkey.keystore(y/n): " CONFIRM
if [[ $CONFIRM =~ ^[Yy]$ ]]; then
# 复制 jks 文件为 appkey.jks
cp -v ${FILENAME} ../appkey.jks
# 复制 keystore 文件为 appkey.keystore
cp -v ${STORENAME} ../appkey.keystore
echo "文件复制完成"
else
echo "已取消文件复制"
fi

210
LICENSE
View File

@ -1,73 +1,201 @@
Apache License Apache License
Version 2.0, January 2004 Version 2.0, January 2004
http://www.apache.org/licenses/ http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions. 1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. "Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and (b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. (d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work. APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2024 ZhanGSKen Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@ -1,4 +1,8 @@
# ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # OriginMaster
【OriginMaster】WinBoLL 源生态计划。正如话,我需要一个 Point, 去撬动成个地球。
########
## ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
@ -110,9 +114,11 @@
# 本项目要实际运用需要注意以下几个步骤: # 本项目要实际运用需要注意以下几个步骤:
# 在项目根目录下: # 在项目根目录下:
## 1. 项目模块编译环境设置(必须)settings.gradle-demo 要复制为 settings.gradle并取消相应项目模块的注释。 ## ★. 项目模块编译环境设置(必须)settings.gradle-demo 要复制为 settings.gradle并取消相应项目模块的注释。
## 2. 项目 Android SDK 编译环境设置(可选)local.properties-demo 要复制为 local.properties并按需要设置 Android SDK 目录。 ## ★. 项目 Android SDK 编译环境设置(可选)local.properties-demo 要复制为 local.properties并按需要设置 Android SDK 目录。
## 3. 类库型模块编译环境设置(可选)winboll.properties-demo 要复制为 winboll.properties并按需要设置 WinBoLL Maven 库登录用户信息。 ## ★. 应用签名密钥 keystore 设置问题。一般调试编译只需用【Termux】cd 进 GenKeyStore 目录执行 $ bash gen_debug_keystore.sh 命令即可完成设置。
## ☆. 应用 WiBoLL 签名密钥配置问题<非必须考虑>。设置时需要 clone 【keystore】模块源码并拷贝模块目录的 appkey.jks 与 appkey.keystore 到项目根目录即可。
## ☆. 类库型模块编译环境设置(可选)winboll.properties-demo 要复制为 winboll.properties并按需要设置 WinBoLL Maven 库登录用户信息。
# ☆类库型项目编译方法 # ☆类库型项目编译方法

35
aes/README.md Normal file
View File

@ -0,0 +1,35 @@
# AES
#### 介绍
安卓视图元素类库
#### 软件架构
适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。
#### Gradle 编译说明
调试版编译命令 gradle assembleBetaDebug
阶段版编译命令 bash .winboll/bashPublishAPKAddTag.sh aes
阶段版类库发布命令 git pull &&bash .winboll/bashPublishLIBAddTag.sh libaes
#### 使用说明
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
#### 参考文档

View File

@ -29,7 +29,7 @@ android {
// versionName // versionName
// build.gradle stageCount=0 // build.gradle stageCount=0
// Gradle编译环境下合起来的 versionName "${versionName}.0" // Gradle编译环境下合起来的 versionName "${versionName}.0"
versionName "15.6" versionName "15.9"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue Apr 29 15:14:41 HKT 2025 #Thu Jun 19 20:42:40 HKT 2025
stageCount=1 stageCount=2
libraryProject=libaes libraryProject=libaes
baseVersion=15.6 baseVersion=15.9
publishVersion=15.6.0 publishVersion=15.9.1
buildCount=0 buildCount=0
baseBetaVersion=15.6.1 baseBetaVersion=15.9.2

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.aes; package cc.winboll.studio.aes;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/24 23:52:29 * @Date 2025/03/24 23:52:29
* @Describe AES应用介绍窗口 * @Describe AES应用介绍窗口
*/ */
@ -10,13 +10,14 @@ import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libaes.winboll.APPInfo; import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libaes.winboll.AboutView; import cc.winboll.studio.libaes.winboll.AboutView;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity { public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity {
public static final String TAG = "AboutActivity"; public static final String TAG = "AboutActivity";
@ -78,11 +79,11 @@ public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
appInfo.setAppName("AES"); appInfo.setAppName("AES");
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll); appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
appInfo.setAppDescription("AES Description"); appInfo.setAppDescription("AES Description");
appInfo.setAppGitName("APP"); appInfo.setAppGitName("APPBase");
appInfo.setAppGitOwner("Studio"); appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(szBranchName); appInfo.setAppGitAPPBranch(szBranchName);
appInfo.setAppGitAPPSubProjectFolder(szBranchName); appInfo.setAppGitAPPSubProjectFolder(szBranchName);
appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=AES"); appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=2&fromuid=1");
appInfo.setAppAPKName("AES"); appInfo.setAppAPKName("AES");
appInfo.setAppAPKFolderName("AES"); appInfo.setAppAPKFolderName("AES");
//appInfo.setIsAddDebugTools(false); //appInfo.setIsAddDebugTools(false);

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.aes; package cc.winboll.studio.aes;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/06/13 19:03:58 * @Date 2024/06/13 19:03:58
* @Describe AES应用类 * @Describe AES应用类
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.aes; package cc.winboll.studio.aes;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/06/13 19:05:52 * @Date 2024/06/13 19:05:52
* @Describe 应用主窗口 * @Describe 应用主窗口
*/ */

View File

@ -24,7 +24,7 @@ android {
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.androiddemo" applicationId "cc.winboll.studio.androiddemo"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 30
versionCode 1 versionCode 1
// versionName // versionName
// .winboll/winbollBuildProps.properties stageCount=0 // .winboll/winbollBuildProps.properties stageCount=0
@ -67,6 +67,6 @@ dependencies {
// https://mvnrepository.com/artifact/com.android.support/recyclerview-v7 // https://mvnrepository.com/artifact/com.android.support/recyclerview-v7
api 'com.android.support:recyclerview-v7:28.0.0' api 'com.android.support:recyclerview-v7:28.0.0'
api 'cc.winboll.studio:libapputils:15.2.2' api 'cc.winboll.studio:libapputils:15.8.2'
api 'cc.winboll.studio:libappbase:15.2.2' api 'cc.winboll.studio:libappbase:15.8.2'
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Thu Apr 03 03:17:18 GMT 2025 #Sun Jun 01 08:02:46 GMT 2025
stageCount=0 stageCount=0
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.0
publishVersion=15.0.0 publishVersion=15.0.0
buildCount=21 buildCount=27
baseBetaVersion=15.0.1 baseBetaVersion=15.0.1

View File

@ -24,7 +24,7 @@ android {
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.androidxdemo" applicationId "cc.winboll.studio.androidxdemo"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 30
versionCode 1 versionCode 1
// versionName // versionName
// .winboll/winbollBuildProps.properties stageCount=0 // .winboll/winbollBuildProps.properties stageCount=0
@ -67,7 +67,7 @@ dependencies {
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0' //api 'androidx.fragment:fragment:1.1.0'
api 'cc.winboll.studio:libaes:15.2.6' api 'cc.winboll.studio:libaes:15.8.0'
api 'cc.winboll.studio:libapputils:15.2.2' api 'cc.winboll.studio:libapputils:15.8.2'
api 'cc.winboll.studio:libappbase:15.2.2' api 'cc.winboll.studio:libappbase:15.8.2'
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Thu Apr 03 03:15:55 GMT 2025 #Thu Jun 19 12:49:47 GMT 2025
stageCount=0 stageCount=0
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.0
publishVersion=15.0.0 publishVersion=15.0.0
buildCount=18 buildCount=26
baseBetaVersion=15.0.1 baseBetaVersion=15.0.1

View File

@ -22,9 +22,9 @@ import android.widget.HorizontalScrollView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import cc.winboll.studio.androidxdemo.R;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import com.hjq.toast.style.WhiteToastStyle;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.Closeable; import java.io.Closeable;
@ -53,8 +53,8 @@ public class App extends GlobalApplication {
// 初始化 Toast 框架 // 初始化 Toast 框架
ToastUtils.init(this); ToastUtils.init(this);
// 设置 Toast 布局样式 // 设置 Toast 布局样式
ToastUtils.setView(R.layout.view_toast); //ToastUtils.setView(R.layout.view_toast);
//ToastUtils.setStyle(new WhiteToastStyle()); ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
//CrashHandler.getInstance().registerGlobal(this); //CrashHandler.getInstance().registerGlobal(this);

View File

@ -30,7 +30,7 @@ android {
// versionName // versionName
// .winboll/winbollBuildProps.properties stageCount=0 // .winboll/winbollBuildProps.properties stageCount=0
// Gradle编译环境下合起来的 versionName "${versionName}.0" // Gradle编译环境下合起来的 versionName "${versionName}.0"
versionName "15.7" versionName "15.8"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue Apr 29 14:47:34 HKT 2025 #Mon Jun 09 09:38:19 HKT 2025
stageCount=7 stageCount=9
libraryProject=libappbase libraryProject=libappbase
baseVersion=15.7 baseVersion=15.8
publishVersion=15.7.6 publishVersion=15.8.8
buildCount=0 buildCount=0
baseBetaVersion=15.7.7 baseBetaVersion=15.8.9

View File

@ -9,7 +9,8 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/MyAPPBaseTheme" android:theme="@style/MyAPPBaseTheme"
android:resizeableActivity="true" android:resizeableActivity="true"
android:process=":App"> android:process=":App"
android:networkSecurityConfig="@xml/network_security_config">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
@ -39,7 +40,8 @@
android:resizeableActivity="true" android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/> android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
<activity android:name=".activities.New2Activity" <activity
android:name=".activities.New2Activity"
android:label="New2Activity" android:label="New2Activity"
android:exported="true" android:exported="true"
android:resizeableActivity="true" android:resizeableActivity="true"
@ -74,7 +76,8 @@
<service android:name=".services.AssistantService"/> <service android:name=".services.AssistantService"/>
<receiver android:name="cc.winboll.studio.appbase.receivers.MainReceiver" <receiver
android:name="cc.winboll.studio.appbase.receivers.MainReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
@ -105,7 +108,8 @@
</receiver> </receiver>
<receiver android:name=".receivers.APPNewsWidgetClickListener" <receiver
android:name=".receivers.APPNewsWidgetClickListener"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
@ -122,7 +126,6 @@
android:name="android.max_aspect" android:name="android.max_aspect"
android:value="4.0"/> android:value="4.0"/>
</application> </application>
</manifest> </manifest>

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase; package cc.winboll.studio.appbase;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/01/05 09:54:42 * @Date 2025/01/05 09:54:42
* @Describe APPbase 应用类 * @Describe APPbase 应用类
*/ */

View File

@ -11,6 +11,7 @@ import android.widget.CheckBox;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.activities.NewActivity; import cc.winboll.studio.appbase.activities.NewActivity;
import cc.winboll.studio.appbase.activities.WinBoLLActivity;
import cc.winboll.studio.appbase.services.MainService; import cc.winboll.studio.appbase.services.MainService;
import cc.winboll.studio.appbase.services.TestDemoBindService; import cc.winboll.studio.appbase.services.TestDemoBindService;
import cc.winboll.studio.appbase.services.TestDemoService; import cc.winboll.studio.appbase.services.TestDemoService;
@ -18,12 +19,13 @@ import cc.winboll.studio.libappbase.CrashHandler;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.GlobalCrashActivity; import cc.winboll.studio.libappbase.GlobalCrashActivity;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.widgets.StatusWidget; import cc.winboll.studio.libappbase.widgets.StatusWidget;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivity { public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
@ -38,7 +40,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
} }
Toolbar mToolbar; Toolbar mToolbar;
//LogView mLogView;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -51,29 +52,25 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1); CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
cbIsDebugMode.setChecked(GlobalApplication.isDebuging()); cbIsDebugMode.setChecked(GlobalApplication.isDebuging());
//mLogView = findViewById(R.id.activitymainLogView1);
// if (GlobalApplication.isDebuging()) {
// mLogView.start();
// ToastUtils.show("LogView start.");
// }
} }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu); getMenuInflater().inflate(R.menu.toolbar_main, menu);
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.item_yun) {
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, cc.winboll.studio.libappbase.activities.YunActivity.class);
} else if(item.getItemId() == R.id.item_logon) {
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, cc.winboll.studio.libappbase.activities.LogonActivity.class);
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false // 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
@ -138,8 +135,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
} }
public void onStopTestDemoService(View view) { public void onStopTestDemoService(View view) {
Intent intent = new Intent(this, TestDemoService.class); Intent intent = new Intent(this, TestDemoService.class);
intent.setAction(TestDemoService.ACTION_DISABLE); intent.setAction(TestDemoService.ACTION_DISABLE);
@ -179,5 +174,10 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class); GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class);
} }
@Override
protected void onResume() {
super.onResume();
}
} }

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase; package cc.winboll.studio.appbase;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 19:30:10 * @Date 2025/02/13 19:30:10
*/ */
import android.content.Context; import android.content.Context;

View File

@ -1,81 +0,0 @@
package cc.winboll.studio.appbase;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/28 15:34:16
* @Describe 应用活动窗口基类
*/
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.MenuItem;
import cc.winboll.studio.appbase.App;
import cc.winboll.studio.appbase.R;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
public class WinBoLLActivityBase extends Activity implements IWinBoLLActivity {
public static final String TAG = "WinBoLLActivityBase";
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
WinBoLLActivityManager getWinBoLLActivityManager() {
return WinBoLLActivityManager.getInstance(GlobalApplication.getInstance());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWinBoLLActivityManager().add(this);
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
return true;
} else if(item.getItemId() == cc.winboll.studio.appbase.R.id.item_minimal) {
//moveTaskToBack(true);
exit();
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false
return super.onOptionsItemSelected(item);
}
void exit() {
YesNoAlertDialog.show(this, "Exit " + getString(R.string.app_name), "Close all activity and exit?", new YesNoAlertDialog.OnDialogResultListener(){
@Override
public void onYes() {
App.getWinBoLLActivityManager().finishAll();
}
@Override
public void onNo() {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
getWinBoLLActivityManager().registeRemove(this);
}
}

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.activities; package cc.winboll.studio.appbase.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/25 11:46:40 * @Date 2025/03/25 11:46:40
* @Describe 测试窗口2 * @Describe 测试窗口2
*/ */
@ -12,11 +12,10 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.WinBoLLActivityBase;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivity { public class New2Activity extends WinBoLLActivity implements IWinBoLLActivity {
public static final String TAG = "New2Activity"; public static final String TAG = "New2Activity";
@ -67,16 +66,11 @@ public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivit
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu); getMenuInflater().inflate(R.menu.toolbar_main, menu);
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
return true;
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false // 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.activities; package cc.winboll.studio.appbase.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/25 05:04:22 * @Date 2025/03/25 05:04:22
*/ */
import android.app.Activity; import android.app.Activity;
@ -11,11 +11,10 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.WinBoLLActivityBase;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity { public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity {
public static final String TAG = "NewActivity"; public static final String TAG = "NewActivity";
@ -65,16 +64,11 @@ public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu); getMenuInflater().inflate(R.menu.toolbar_main, menu);
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
return true;
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false // 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

View File

@ -0,0 +1,61 @@
package cc.winboll.studio.appbase.activities;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/05/10 09:48
* @Describe WinBoLL 窗口基础类
*/
import android.app.Activity;
import android.os.Bundle;
import android.view.MenuItem;
import cc.winboll.studio.appbase.MainActivity;
import cc.winboll.studio.appbase.R;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class WinBoLLActivity extends Activity implements IWinBoLLActivity {
public static final String TAG = "WinBoLLActivity";
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onResume() {
super.onResume();
LogUtils.d(TAG, String.format("onResume %s", getTag()));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.item_log) {
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
return true;
} else if (item.getItemId() == R.id.item_home) {
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class);
return true;
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
GlobalApplication.getWinBoLLActivityManager().add(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
}
}

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.handlers; package cc.winboll.studio.appbase.handlers;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/14 03:51:40 * @Date 2025/02/14 03:51:40
*/ */
import android.os.Handler; import android.os.Handler;

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.models; package cc.winboll.studio.appbase.models;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 07:06:13 * @Date 2025/02/13 07:06:13
*/ */
import android.util.JsonReader; import android.util.JsonReader;

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.models; package cc.winboll.studio.appbase.models;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/07 12:47:22 * @Date 2025/03/07 12:47:22
* @Describe TestServiceBean * @Describe TestServiceBean
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.models; package cc.winboll.studio.appbase.models;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/07 12:49:21 * @Date 2025/03/07 12:49:21
* @Describe TestDemoServiceBean * @Describe TestDemoServiceBean
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.receivers; package cc.winboll.studio.appbase.receivers;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/24 07:11:44 * @Date 2025/03/24 07:11:44
*/ */
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.receivers; package cc.winboll.studio.appbase.receivers;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 06:58:04 * @Date 2025/02/13 06:58:04
* @Describe 主要广播接收器 * @Describe 主要广播接收器
*/ */
@ -10,16 +10,18 @@ import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import cc.winboll.studio.appbase.models.WinBoLLNewsBean;
import cc.winboll.studio.appbase.services.MainService; import cc.winboll.studio.appbase.services.MainService;
import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.appbase.widgets.APPNewsWidget;
import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.AppUtils;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.APPModel; import cc.winboll.studio.libappbase.models.APPModel;
import cc.winboll.studio.libappbase.models.WinBoLLModel;
import cc.winboll.studio.libappbase.models.WinBoLLNewsBean;
import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.sos.SOSObject; import cc.winboll.studio.libappbase.sos.SOSObject;
import cc.winboll.studio.libappbase.sos.WinBoLL;
import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import cc.winboll.studio.libappbase.winboll.WinBoLL;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -42,21 +44,21 @@ public class MainReceiver extends BroadcastReceiver {
String szAction = intent.getAction(); String szAction = intent.getAction();
if (szAction.equals(ACTION_BOOT_COMPLETED)) { if (szAction.equals(ACTION_BOOT_COMPLETED)) {
ToastUtils.show("ACTION_BOOT_COMPLETED"); ToastUtils.show("ACTION_BOOT_COMPLETED");
} else if (szAction.equals(WinBoLL.ACTION_BIND)) { } else if (szAction.equals(IWinBoLLActivity.ACTION_BIND)) {
LogUtils.d(TAG, "ACTION_BIND"); LogUtils.d(TAG, "ACTION_BIND");
LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName())); LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName()));
LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction())); LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction()));
String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL); String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); LogUtils.d(TAG, String.format("szAPPModel %s", szWinBoLLModel));
if (szAPPModel != null && !szAPPModel.equals("")) { if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
try { try {
APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
if (bean != null) { if (bean != null) {
String szAppPackageName = bean.getAppPackageName(); String szAppPackageName = bean.getAppPackageName();
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
String szAppMainServiveName = bean.getAppMainServiveName(); String szAppMainServiveName = bean.getAppMainServiveName();
LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName)); LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
mwrService.get().bindAPPModelConnection(bean); mwrService.get().bindWinBoLLModelConnection(bean);
} }
} catch (IOException e) { } catch (IOException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.services; package cc.winboll.studio.appbase.services;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/14 03:38:31 * @Date 2025/02/14 03:38:31
* @Describe 守护进程服务 * @Describe 守护进程服务
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.services; package cc.winboll.studio.appbase.services;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 06:56:41 * @Date 2025/02/13 06:56:41
* @Describe 拨号主服务 * @Describe 拨号主服务
* 参考: * 参考:
@ -18,15 +18,16 @@ import android.content.ServiceConnection;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.appbase.MyTileService; import cc.winboll.studio.appbase.MyTileService;
import cc.winboll.studio.appbase.models.MainServiceBean;
import cc.winboll.studio.appbase.handlers.MainServiceHandler; import cc.winboll.studio.appbase.handlers.MainServiceHandler;
import cc.winboll.studio.appbase.models.MainServiceBean;
import cc.winboll.studio.appbase.receivers.MainReceiver; import cc.winboll.studio.appbase.receivers.MainReceiver;
import cc.winboll.studio.appbase.services.AssistantService; import cc.winboll.studio.appbase.services.AssistantService;
import cc.winboll.studio.appbase.threads.MainServiceThread; import cc.winboll.studio.appbase.threads.MainServiceThread;
import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.appbase.widgets.APPNewsWidget;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.models.APPModel;
import cc.winboll.studio.libappbase.models.WinBoLLModel;
import java.util.ArrayList; import java.util.ArrayList;
import cc.winboll.studio.libappbase.sos.APPModel;
public class MainService extends Service { public class MainService extends Service {
@ -182,7 +183,7 @@ public class MainService extends Service {
} }
} }
public void bindAPPModelConnection(APPModel bean) { public void bindWinBoLLModelConnection(WinBoLLModel bean) {
LogUtils.d(TAG, "bindAPPModelConnection(...)"); LogUtils.d(TAG, "bindAPPModelConnection(...)");
// 清理旧的绑定链接 // 清理旧的绑定链接
for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) { for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) {
@ -203,7 +204,7 @@ public class MainService extends Service {
Intent intentWidget = new Intent(this, APPNewsWidget.class); Intent intentWidget = new Intent(this, APPNewsWidget.class);
intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE); intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE);
APPModel appSOSBean = new APPModel(bean.getAppPackageName(), bean.getAppMainServiveName()); WinBoLLModel appSOSBean = new WinBoLLModel(bean.getAppPackageName(), bean.getAppMainServiveName());
intentWidget.putExtra("APPSOSBean", appSOSBean.toString()); intentWidget.putExtra("APPSOSBean", appSOSBean.toString());
sendBroadcast(intentWidget); sendBroadcast(intentWidget);
} }
@ -212,7 +213,7 @@ public class MainService extends Service {
ComponentName mComponentName; ComponentName mComponentName;
boolean isBindToAPP(APPModel bean) { boolean isBindToAPP(WinBoLLModel bean) {
return mComponentName != null return mComponentName != null
&& mComponentName.getClassName().equals(bean.getAppMainServiveName()) && mComponentName.getClassName().equals(bean.getAppMainServiveName())
&& mComponentName.getPackageName().equals(bean.getAppPackageName()); && mComponentName.getPackageName().equals(bean.getAppPackageName());

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.services; package cc.winboll.studio.appbase.services;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/07 12:45:49 * @Date 2025/03/07 12:45:49
* @Describe 启动时申请绑定到APPBase主服务的服务示例 * @Describe 启动时申请绑定到APPBase主服务的服务示例
*/ */
@ -10,11 +10,12 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.appbase.models.TestDemoBindServiceBean;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.WinBoLL;
import cc.winboll.studio.appbase.App; import cc.winboll.studio.appbase.App;
import cc.winboll.studio.appbase.models.TestDemoBindServiceBean;
import cc.winboll.studio.appbase.services.TestDemoBindService;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.winboll.WinBoLL;
public class TestDemoBindService extends Service { public class TestDemoBindService extends Service {

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.services; package cc.winboll.studio.appbase.services;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/07 12:39:24 * @Date 2025/03/07 12:39:24
* @Describe 普通服务示例 * @Describe 普通服务示例
*/ */
@ -12,7 +12,6 @@ import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.appbase.models.TestDemoServiceBean; import cc.winboll.studio.appbase.models.TestDemoServiceBean;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.WinBoLL;
public class TestDemoService extends Service { public class TestDemoService extends Service {

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.threads; package cc.winboll.studio.appbase.threads;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/14 03:46:44 * @Date 2025/02/14 03:46:44
*/ */
import android.content.Context; import android.content.Context;

View File

@ -1,6 +1,6 @@
package cc.winboll.studio.appbase.widgets; package cc.winboll.studio.appbase.widgets;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/15 14:41:25 * @Date 2025/02/15 14:41:25
* @Describe TimeWidget * @Describe TimeWidget
*/ */
@ -12,16 +12,17 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.models.WinBoLLNewsBean;
import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener; import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener;
import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.AppUtils;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.APPModel; import cc.winboll.studio.libappbase.models.APPModel;
import cc.winboll.studio.libappbase.sos.WinBoLL; import cc.winboll.studio.libappbase.models.WinBoLLNewsBean;
import cc.winboll.studio.libappbase.winboll.WinBoLL;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import cc.winboll.studio.libappbase.models.WinBoLLModel;
public class APPNewsWidget extends AppWidgetProvider { public class APPNewsWidget extends AppWidgetProvider {
@ -57,11 +58,11 @@ public class APPNewsWidget extends AppWidgetProvider {
} }
}else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) { }else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) {
LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE"); LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE");
String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL); String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel));
if (szAPPModel != null && !szAPPModel.equals("")) { if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
try { try {
APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
if (bean != null) { if (bean != null) {
String szAppPackageName = bean.getAppPackageName(); String szAppPackageName = bean.getAppPackageName();
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));

View File

@ -32,12 +32,18 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Hello, WinBoLL!"/> android:text="安卓R对应的是Android 11其API级别是30。以下是Android 11中一些重要的API相关特性
\n- 隐私保护方面:引入单次授权,让用户可以选择授予应用对位置信息、麦克风和摄像头的临时访问权限。还增加了数据访问审核功能,能让开发者深入了解应用在何处访问私密数据。
\n- 系统功能方面提供了ControlsProviderService API用于向连接的外部设备提供控件这些控件显示于Android电源菜单中的设备控件下。媒体控件也得到更新显示于快捷设置旁来自多个应用的会话排列在一个可滑动的轮播界面中。
\n- 硬件支持方面提供了一些API以支持瀑布屏通过将窗口布局属性  layoutInDisplayCutoutMode  设为  LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS 可允许窗口延伸到屏幕各个边缘上的刘海和瀑布区域。对于合页式屏幕配置的设备提供了具有  TYPE_HINGE_ANGLE  的新传感器以及新的  SensorEvent 用于监控合页角度。
\n- 安全方面:对生物识别身份验证机制进行了更新,引入了  BiometricManager.Authenticators  接口,定义了  BIOMETRIC_STRONG  BIOMETRIC_WEAK  DEVICE_CREDENTIAL  等身份验证类型。还在  BiometricPrompt  类中提供了对“每次使用时进行身份验证”密钥的更多支持。
\n- 性能和质量方面支持无线调试通过Android调试桥adb从工作站以无线方式部署和调试应用避免了常见的USB连接问题。"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android版本10的代号是“Q”API级别是29。 Android 10开始谷歌不再公开使用甜品作为版本代号但内部仍保留了大量与“Q”相关的元素。Android 10本身并没有严格对应某个特定的Java版本但在开发Android 10应用时通常可以使用Java 8或更高版本。 Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性能提高开发效率和代码可读性与Android 10开发适配良好。Java 9及更高版本也可用于Android 10开发能使用一些新的语言特性和API但可能需要注意兼容性和配置问题。"/>
<HorizontalScrollView <HorizontalScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
@ -211,6 +217,5 @@
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
</LinearLayout> </LinearLayout>

View File

@ -1,6 +1,20 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/item_home"
android:title="HOME"
android:icon="@drawable/ic_winboll"/>
<item
android:id="@+id/item_yun"
android:title="YUN"
android:icon="@drawable/ic_winboll"/>
<item
android:id="@+id/item_logon"
android:title="Logon"
android:icon="@drawable/ic_winboll"/>
<item
android:id="@+id/item_log"
android:title="LOG"
android:icon="@drawable/ic_winboll_log"/>
</menu> </menu>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 允许访问 winboll.cc 及其子域名(原配置) -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">winboll.cc</domain>
</domain-config>
<!-- **新增:允许访问 IP 地址 10.8.0.250** -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">10.8.0.250</domain> <!-- 不包含子域名 -->
</domain-config>
</network-security-config>

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue May 13 11:09:58 HKT 2025 #Tue Jun 03 15:05:48 HKT 2025
stageCount=1 stageCount=5
libraryProject=libapputils libraryProject=libapputils
baseVersion=15.8 baseVersion=15.8
publishVersion=15.8.0 publishVersion=15.8.4
buildCount=0 buildCount=0
baseBetaVersion=15.8.1 baseBetaVersion=15.8.5

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.apputils; package cc.winboll.studio.apputils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/12/08 15:10:51 * @Date 2024/12/08 15:10:51
* @Describe 全局应用类 * @Describe 全局应用类
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.apputils; package cc.winboll.studio.apputils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/01/03 11:02:49 * @Date 2025/01/03 11:02:49
* @Describe 一个可以浏览随 APP 附带的 Html 文档的窗口 * @Describe 一个可以浏览随 APP 附带的 Html 文档的窗口
*/ */
@ -20,18 +20,7 @@ import cc.winboll.studio.libapputils.views.SimpleWebView;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
public class AssetsHtmlActivity extends WinBoLLActivityBase implements IWinBoLLActivity { public class AssetsHtmlActivity extends WinBoLLActivity implements IWinBoLLActivity {
@Override
public Activity getActivity() {
return super.getActivity();
}
@Override
public String getTag() {
return TAG;
}
public static final String TAG = "AssetsHtmlActivity"; public static final String TAG = "AssetsHtmlActivity";
@ -43,11 +32,16 @@ public class AssetsHtmlActivity extends WinBoLLActivityBase implements IWinBoLLA
// Assets 文件夹里的 Html 文件的名称 // Assets 文件夹里的 Html 文件的名称
String mszHtmlFileName; String mszHtmlFileName;
//
// @Override @Override
// public Activity getActivity() { public Activity getActivity() {
// return this; return this;
// } }
@Override
public String getTag() {
return TAG;
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {

View File

@ -217,10 +217,10 @@ final public class MainActivity extends Activity {
if (item.getItemId() == R.id.item_exit) { if (item.getItemId() == R.id.item_exit) {
//exit(); //exit();
return true; return true;
} else if (item.getItemId() == R.id.item_teststringtoqrcodeview) { // } else if (item.getItemId() == R.id.item_teststringtoqrcodeview) {
Intent intent = new Intent(this, TestStringToQRCodeViewActivity.class); // Intent intent = new Intent(this, TestStringToQRCodeViewActivity.class);
startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); // startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);
//WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, TestStringToQrCodeViewActivity.class); // //WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, TestStringToQrCodeViewActivity.class);
} else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) { } else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) {
Intent intent = new Intent(this, QRCodeDecodeActivity.class); Intent intent = new Intent(this, QRCodeDecodeActivity.class);
startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.apputils; package cc.winboll.studio.apputils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/01/18 10:32:21 * @Date 2025/01/18 10:32:21
* @Describe 二维码扫码解码窗口 * @Describe 二维码扫码解码窗口
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.apputils; package cc.winboll.studio.apputils;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/23 16:14:45 * @Date 2025/03/23 16:14:45
*/ */
import android.app.Activity; import android.app.Activity;

View File

@ -1,36 +0,0 @@
package cc.winboll.studio.apputils;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2025/01/17 19:50:46
*/
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toolbar;
import cc.winboll.studio.apputils.R;
import cc.winboll.studio.libapputils.views.StringToQrCodeView;
public class TestStringToQRCodeViewActivity extends Activity {
public static final String TAG = "TestStringToQrCodeViewActivity";
StringToQrCodeView mStringToQrCodeView;
//
// @Override
// public Activity getActivity() {
// return this;
// }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_teststringtoqrcodeview);
// 初始化工具栏
Toolbar mToolbar = findViewById(R.id.toolbar);
mToolbar.setSubtitle(TAG);
setActionBar(mToolbar);
mStringToQrCodeView = findViewById(R.id.activityteststringtoqrcodeviewStringToQrCodeView1);
}
}

View File

@ -0,0 +1,24 @@
package cc.winboll.studio.apputils;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/05/13 11:15
* @Describe WinBoLLActivity
*/
import android.app.Activity;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class WinBoLLActivity extends Activity implements IWinBoLLActivity {
public static final String TAG = "WinBoLLActivity";
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
}

View File

@ -1,51 +0,0 @@
package cc.winboll.studio.apputils;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/28 17:11:37
* @Describe 应用活动窗口基类
*/
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
public class WinBoLLActivityBase extends Activity implements IWinBoLLActivity {
public static final String TAG = "WinBoLLActivityBase";
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
WinBoLLActivityManager getWinBoLLActivityManager() {
return WinBoLLActivityManager.getInstance(GlobalApplication.getInstance());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWinBoLLActivityManager().add(this);
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
}
@Override
protected void onDestroy() {
super.onDestroy();
getWinBoLLActivityManager().registeRemove(this);
}
}

View File

@ -19,7 +19,7 @@ def genVersionName(def versionName){
android { android {
compileSdkVersion 32 compileSdkVersion 32
buildToolsVersion "33.0.3" buildToolsVersion "32.0.0"
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.autoinstaller" applicationId "cc.winboll.studio.autoinstaller"
@ -29,7 +29,7 @@ android {
// versionName // versionName
// .winboll/winbollBuildProps.properties stageCount=0 // .winboll/winbollBuildProps.properties stageCount=0
// Gradle编译环境下合起来的 versionName "${versionName}.0" // Gradle编译环境下合起来的 versionName "${versionName}.0"
versionName "5.0" versionName "15.2"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@ -41,30 +41,33 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
} }
dependencies { dependencies {
api 'cc.winboll.studio:winboll-shared:1.1.0'
api 'io.github.medyo:android-about-page:2.0.0'
api 'com.github.getActivity:ToastUtils:10.5'
api 'com.jcraft:jsch:0.1.55'
api 'org.jsoup:jsoup:1.13.1'
api 'com.squareup.okhttp3:okhttp:4.4.1'
api 'androidx.appcompat:appcompat:1.0.0'
api 'androidx.fragment:fragment:1.0.0'
api 'com.google.android.material:material:1.0.0'
api 'androidx.vectordrawable:vectordrawable-animated:1.0.0'
api 'androidx.lifecycle:lifecycle-livedata:1.0.0'
//api 'cc.winboll.studio:libaes:6.3.2'
//api 'cc.winboll.studio:libapputils:8.3.8'
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
api 'cc.winboll.studio:libaes:15.6.0'
api 'cc.winboll.studio:libapputils:15.3.4'
api 'cc.winboll.studio:libappbase:15.7.6'
// SSH
api 'com.jcraft:jsch:0.1.55'
// Html
api 'org.jsoup:jsoup:1.13.1'
//
api 'com.google.zxing:core:3.4.1'
api 'com.journeyapps:zxing-android-embedded:3.6.0'
//
api 'io.github.medyo:android-about-page:2.0.0'
//
api 'com.github.getActivity:ToastUtils:10.5'
//
api 'com.squareup.okhttp3:okhttp:4.4.1'
// AndroidX
api 'androidx.appcompat:appcompat:1.1.0'
api 'com.google.android.material:material:1.4.0'
//api 'androidx.viewpager:viewpager:1.0.0'
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0'
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Thu Jan 02 02:39:56 HKT 2025 #Tue Jun 24 09:54:47 HKT 2025
stageCount=4 stageCount=3
libraryProject= libraryProject=
baseVersion=5.0 baseVersion=15.2
publishVersion=5.0.3 publishVersion=15.2.2
buildCount=0 buildCount=0
baseBetaVersion=5.0.4 baseBetaVersion=15.2.3

View File

@ -24,6 +24,8 @@
<!-- MANAGE_EXTERNAL_STORAGE --> <!-- MANAGE_EXTERNAL_STORAGE -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<application <application
android:name=".App" android:name=".App"
android:allowBackup="true" android:allowBackup="true"
@ -33,7 +35,7 @@
android:persistent="true" android:persistent="true"
android:supportsRtl="true" android:supportsRtl="true"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.Application"> android:theme="@style/MyAppTheme">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
@ -54,6 +56,21 @@
<service android:name=".services.AssistantService"/> <service android:name=".services.AssistantService"/>
<service
android:name=".AppBaseTileService"
android:exported="true"
android:label="@string/tileservice_name"
android:icon="@drawable/ic_launcher"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE"/>
</intent-filter>
</service>
<receiver <receiver
android:name=".receivers.MainReceiver" android:name=".receivers.MainReceiver"
android:enabled="true" android:enabled="true"

View File

@ -1,27 +1,28 @@
package cc.winboll.studio.autoinstaller; package cc.winboll.studio.autoinstaller;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/04/28 02:39:58 * @Date 2024/04/28 02:39:58
* @Describe 全局应用类 * @Describe 全局应用类
*/ */
import android.view.Gravity; import android.view.Gravity;
import cc.winboll.studio.libappbase.GlobalApplication;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import cc.winboll.studio.shared.app.WinBollApplication; import com.hjq.toast.style.WhiteToastStyle;
public class App extends WinBollApplication { public class App extends GlobalApplication {
public static final String TAG = "App"; public static final String TAG = "App";
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
setIsDebug(BuildConfig.DEBUG);
// 初始化 Toast 框架 // 初始化 Toast 框架
ToastUtils.init(this); ToastUtils.init(this);
// 设置 Toast 布局样式 // 设置 Toast 布局样式
ToastUtils.setView(R.layout.toast_custom_view); //ToastUtils.setView(R.layout.view_toast);
//ToastUtils.setStyle(new WhiteToastStyle()); ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
} }
} }

View File

@ -0,0 +1,12 @@
package cc.winboll.studio.autoinstaller;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/15 09:24:46
* @Describe 磁贴工具服务类
*/
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import cc.winboll.studio.autoinstaller.models.AppConfigs;

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller; package cc.winboll.studio.autoinstaller;
import android.os.FileObserver; import android.os.FileObserver;
import cc.winboll.studio.shared.log.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
public class FileListener extends FileObserver { public class FileListener extends FileObserver {
public final static String TAG = "FileListener"; public final static String TAG = "FileListener";

View File

@ -6,21 +6,24 @@ import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View; import android.view.View;
import android.widget.EditText; import android.widget.EditText;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.SimpleAdapter; import android.widget.SimpleAdapter;
import android.widget.Switch; import android.widget.Switch;
import android.widget.TextClock; import android.widget.TextClock;
import android.widget.Toast;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import cc.winboll.studio.shared.log.LogUtils;
import cc.winboll.studio.shared.log.LogView;
import cc.winboll.studio.autoinstaller.MainActivity; import cc.winboll.studio.autoinstaller.MainActivity;
import cc.winboll.studio.autoinstaller.beans.AppConfigs; import cc.winboll.studio.autoinstaller.models.APKModel;
import cc.winboll.studio.autoinstaller.models.AppConfigs;
import cc.winboll.studio.autoinstaller.services.MainService; import cc.winboll.studio.autoinstaller.services.MainService;
import cc.winboll.studio.autoinstaller.utils.NotificationUtil; import cc.winboll.studio.autoinstaller.utils.NotificationUtil;
import cc.winboll.studio.autoinstaller.utils.PackageUtil;
import cc.winboll.studio.autoinstaller.views.ListViewForScrollView; import cc.winboll.studio.autoinstaller.views.ListViewForScrollView;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
@ -30,8 +33,13 @@ import java.util.Map;
public class MainActivity extends Activity { public class MainActivity extends Activity {
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
public static final int MSG_UPDATE_STATUS = 0;
private static final int INSTALL_PERMISSION_CODE = 1; private static final int INSTALL_PERMISSION_CODE = 1;
static MainActivity _MainActivity;
ArrayList<APKModel> _APKModelList = new ArrayList<APKModel>();
LogView mLogView; LogView mLogView;
TextClock mTextClock; TextClock mTextClock;
EditText mEditText; EditText mEditText;
@ -60,9 +68,11 @@ public class MainActivity extends Activity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
_MainActivity = this;
initView(); initView();
if (getIntent().getAction().equals(ACTION_NEW_INSTALLTASK)) { String action = getIntent().getAction();
if ((action != null) && action.equals(ACTION_NEW_INSTALLTASK)) {
mszInstalledPackageName = getIntent().getStringExtra(EXTRA_INSTALLED_PACKAGENAME); mszInstalledPackageName = getIntent().getStringExtra(EXTRA_INSTALLED_PACKAGENAME);
mszInstalledAPKFilePath = getIntent().getStringExtra(EXTRA_INSTALLED_APKFILEPATH); mszInstalledAPKFilePath = getIntent().getStringExtra(EXTRA_INSTALLED_APKFILEPATH);
installAPK(); installAPK();
@ -76,11 +86,7 @@ public class MainActivity extends Activity {
mLogView = findViewById(R.id.logview); mLogView = findViewById(R.id.logview);
mLogView.start(); mLogView.start();
AppConfigs appConfigs = AppConfigs.loadAppConfigs(this); AppConfigs appConfigs = AppConfigs.getInstance(this).loadAppConfigs(this);
if (appConfigs == null) {
appConfigs = new AppConfigs();
AppConfigs.saveAppConfigs(this, appConfigs);
}
if (appConfigs.getSetupMode() == AppConfigs.SetupMode.WATCHOUTPUTINSTALLER) { if (appConfigs.getSetupMode() == AppConfigs.SetupMode.WATCHOUTPUTINSTALLER) {
((RadioButton)findViewById(R.id.activitymainRadioButton1)).setChecked(true); ((RadioButton)findViewById(R.id.activitymainRadioButton1)).setChecked(true);
@ -131,23 +137,44 @@ public class MainActivity extends Activity {
} }
String getLastApkPackageName() {
APKModel.loadBeanList(this, _APKModelList, APKModel.class);
if (_APKModelList.size() > 0) {
return _APKModelList.get(_APKModelList.size() - 1).getApkPackageName();
}
return "";
}
public void onOpenAPP(View view) { public void onOpenAPP(View view) {
if (mszInstalledPackageName.trim().equals("")) { String szInstalledPackageName = getLastApkPackageName();
LogUtils.d(TAG, "szInstalledPackageName : " + szInstalledPackageName);
if (szInstalledPackageName.trim().equals("")) {
ToastUtils.show("Installed APP package name is null."); ToastUtils.show("Installed APP package name is null.");
return; return;
} }
Intent intent = getPackageManager().getLaunchIntentForPackage(mszInstalledPackageName); PackageUtil.openAPP(this, szInstalledPackageName);
if (intent != null) {
startActivity(intent);
} else {
// 若没能获取到启动意图可进行相应提示等操作比如跳转到应用商店让用户下载该应用示例
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id=" + mszInstalledPackageName));
startActivity(marketIntent);
}
} }
// public void onOpenAPP(View view) {
// String szInstalledPackageName = getLastApkPackageName();
// if (szInstalledPackageName.trim().equals("")) {
// ToastUtils.show("Installed APP package name is null.");
// return;
// }
//
// Intent intent = getPackageManager().getLaunchIntentForPackage(mszInstalledPackageName);
// if (intent != null) {
// //ToastUtils.show("startActivity");
// startActivity(intent);
// } else {
// // 若没能获取到启动意图可进行相应提示等操作比如跳转到应用商店让用户下载该应用示例
// Intent marketIntent = new Intent(Intent.ACTION_VIEW);
// marketIntent.setData(Uri.parse("market://details?id=" + mszInstalledPackageName));
// startActivity(marketIntent);
// }
// }
public void onInstallAPK(View view) { public void onInstallAPK(View view) {
installAPK(); installAPK();
} }
@ -185,17 +212,22 @@ public class MainActivity extends Activity {
} }
public void onLockPath(View view) { public void onLockPath(View view) {
AppConfigs appConfigs = AppConfigs.loadAppConfigs(this);
Switch sw = (Switch)view; Switch sw = (Switch)view;
if (sw.isChecked()) { setMainServiceStatus(sw.isChecked());
}
public void setMainServiceStatus(boolean isEnable) {
AppConfigs appConfigs = AppConfigs.getInstance(this).loadAppConfigs(this);
Switch sw = (Switch)findViewById(R.id.activitymainSwitch1);
if (isEnable) {
String szFilePath = mEditText.getText().toString(); String szFilePath = mEditText.getText().toString();
// 设置空路径时退出 // 设置空路径时退出
// //
if (szFilePath.trim().equals("")) { if (szFilePath.trim().equals("")) {
sw.setChecked(false); sw.setChecked(false);
Toast.makeText(getApplication(), "监控路径为空。", Toast.LENGTH_SHORT).show(); ToastUtils.show("监控路径为空。");
return; return;
} }
@ -236,7 +268,7 @@ public class MainActivity extends Activity {
stopWatchingFile(); stopWatchingFile();
} }
AppConfigs.saveAppConfigs(this, appConfigs); AppConfigs.getInstance(this).saveAppConfigs(this, appConfigs);
} }
void stopWatchingFile() { void stopWatchingFile() {
@ -251,8 +283,6 @@ public class MainActivity extends Activity {
Intent intentService = new Intent(MainActivity.this, MainService.class); Intent intentService = new Intent(MainActivity.this, MainService.class);
//intentService.putExtra(MainService.EXTRA_APKFILEPATH, szAPKFilePath); //intentService.putExtra(MainService.EXTRA_APKFILEPATH, szAPKFilePath);
startService(intentService); startService(intentService);
} }
/* /*
@ -298,7 +328,7 @@ public class MainActivity extends Activity {
}*/ }*/
public void onChangeSetupMode(View view) { public void onChangeSetupMode(View view) {
AppConfigs appConfigs = AppConfigs.loadAppConfigs(this); AppConfigs appConfigs = AppConfigs.getInstance(this).loadAppConfigs(this);
if (view.getId() == R.id.activitymainRadioButton1) { if (view.getId() == R.id.activitymainRadioButton1) {
appConfigs.setSetupMode(AppConfigs.SetupMode.WATCHOUTPUTINSTALLER); appConfigs.setSetupMode(AppConfigs.SetupMode.WATCHOUTPUTINSTALLER);
@ -307,6 +337,42 @@ public class MainActivity extends Activity {
appConfigs.setSetupMode(AppConfigs.SetupMode.NEWAPKINFONEWAPKINFO); appConfigs.setSetupMode(AppConfigs.SetupMode.NEWAPKINFONEWAPKINFO);
((RadioButton)findViewById(R.id.activitymainRadioButton1)).setChecked(false); ((RadioButton)findViewById(R.id.activitymainRadioButton1)).setChecked(false);
} }
AppConfigs.saveAppConfigs(this, appConfigs); AppConfigs.getInstance(this).saveAppConfigs(this, appConfigs);
}
// 定义Handler
static Handler _Handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == MSG_UPDATE_STATUS) {
if (_MainActivity != null) {
boolean isEnableMainService = (boolean)msg.obj;
// 处理消息这里更新 MainService 的状态
_MainActivity.setMainServiceStatus(isEnableMainService);
}
}
}
};
static void updateMainServiceStatus(boolean isEnable) {
if (_Handler != null) {
Message msg = new Message();
msg.obj = isEnable;
msg.what = MSG_UPDATE_STATUS;
_Handler.sendMessage(msg);
}
}
public static void stopMainService() {
if (_MainActivity != null && _Handler != null) {
updateMainServiceStatus(false);
}
}
public static void startMainService() {
if (_MainActivity != null && _Handler != null) {
updateMainServiceStatus(true);
}
} }
} }

View File

@ -1,54 +1,57 @@
package cc.winboll.studio.appbase.models; package cc.winboll.studio.autoinstaller.models;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/17 10:05:09 * @Date 2025/04/02 20:50:29
* @Describe APPSOSReportBean * @Describe 监控的 APK 安装文件对应的应用信息数据模型
*/ */
import android.util.JsonReader; import android.util.JsonReader;
import android.util.JsonWriter; import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean; import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException; import java.io.IOException;
public class WinBollNewsBean extends BaseBean { public class APKModel extends BaseBean {
public static final String TAG = "WinBollNewsBean"; public static final String TAG = "APPModel";
protected String message; // 每次更新的 APK 文件对应的应用包名称
String apkPackageName;
public WinBollNewsBean() { public APKModel() {
this.message = ""; this.apkPackageName = "";
} }
public WinBollNewsBean(String message) { public APKModel(String apkPackageName) {
this.message = message; this.apkPackageName = apkPackageName;
} }
public void setMessage(String message) { public void setApkPackageName(String apkPackageName) {
this.message = message; this.apkPackageName = apkPackageName;
} }
public String getMessage() { public String getApkPackageName() {
return message; return apkPackageName;
} }
@Override @Override
public String getName() { public String getName() {
return WinBollNewsBean.class.getName(); return APKModel.class.getName();
} }
@Override @Override
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
super.writeThisToJsonWriter(jsonWriter); super.writeThisToJsonWriter(jsonWriter);
jsonWriter.name("message").value(getMessage()); jsonWriter.name("appPackageName").value(getApkPackageName());
} }
@Override @Override
public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
if (name.equals("message")) { if (name.equals("appPackageName")) {
setMessage(jsonReader.nextString()); setApkPackageName(jsonReader.nextString());
} else { } else {
return false; return false;
} }

View File

@ -1,20 +1,21 @@
package cc.winboll.studio.autoinstaller.beans; package cc.winboll.studio.autoinstaller.models;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/05/27 17:36:01 * @Date 2024/05/27 17:36:01
* @Describe 应用配置数据类 * @Describe 应用配置数据类
*/ */
import android.content.Context; import android.content.Context;
import android.util.JsonReader; import android.util.JsonReader;
import android.util.JsonWriter; import android.util.JsonWriter;
import cc.winboll.studio.autoinstaller.beans.AppConfigs; import cc.winboll.studio.autoinstaller.models.AppConfigs;
import cc.winboll.studio.autoinstaller.utils.FileUtil; import cc.winboll.studio.autoinstaller.utils.FileUtil;
import cc.winboll.studio.libappbase.LogUtils;
import com.hjq.toast.ToastUtils;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import cc.winboll.studio.shared.log.LogUtils;
public class AppConfigs implements Serializable { public class AppConfigs implements Serializable {
@ -26,6 +27,21 @@ public class AppConfigs implements Serializable {
NEWAPKINFONEWAPKINFO // 调用[应用信息查看器]打开应用包 NEWAPKINFONEWAPKINFO // 调用[应用信息查看器]打开应用包
}; };
static volatile AppConfigs _AppConfigs;
Context mContext;
AppConfigs(Context context) {
mContext = context.getApplicationContext();
}
public static synchronized AppConfigs getInstance(Context context) {
if (_AppConfigs == null) {
_AppConfigs = new AppConfigs(context);
_AppConfigs.loadAppConfigs(_AppConfigs.mContext);
}
return _AppConfigs;
}
// 监控文件路径 // 监控文件路径
private String watchingFilePath = ""; private String watchingFilePath = "";
@ -85,8 +101,8 @@ public class AppConfigs implements Serializable {
return ""; return "";
} }
public static AppConfigs parseAppConfigs(String szAppConfigs) { public AppConfigs parseAppConfigs(String szAppConfigs) {
AppConfigs appConfigs = new AppConfigs(); AppConfigs appConfigs = new AppConfigs(mContext);
// 创建 JsonWriter 对象 // 创建 JsonWriter 对象
StringReader stringReader = new StringReader(szAppConfigs); StringReader stringReader = new StringReader(szAppConfigs);
JsonReader jsonReader = new JsonReader jsonReader = new
@ -122,19 +138,34 @@ public class AppConfigs implements Serializable {
return context.getExternalFilesDir(TAG) + "/" + TAG + ".json"; return context.getExternalFilesDir(TAG) + "/" + TAG + ".json";
} }
public static AppConfigs loadAppConfigs(Context context) { public AppConfigs loadAppConfigs() {
AppConfigs appConfigs = null; AppConfigs appConfigs = null;
try { try {
String szJson = FileUtil.readFile(getDataPath(context)); String szJson = FileUtil.readFile(getDataPath(mContext));
appConfigs = AppConfigs.parseAppConfigs(szJson); appConfigs = AppConfigs.getInstance(mContext).parseAppConfigs(szJson);
} catch (IOException e) { } catch (IOException e) {
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace());
} }
return appConfigs; return appConfigs;
} }
public static void saveAppConfigs(Context context, AppConfigs appConfigs) { public AppConfigs loadAppConfigs(Context context) {
AppConfigs appConfigs = null;
try { try {
String szJson = FileUtil.readFile(getDataPath(context.getApplicationContext()));
appConfigs = AppConfigs.getInstance(mContext).parseAppConfigs(szJson);
if(appConfigs != null) {
_AppConfigs = appConfigs;
}
} catch (IOException e) {
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace());
}
return _AppConfigs;
}
public void saveAppConfigs(Context context, AppConfigs appConfigs) {
try {
ToastUtils.show(String.format("AppConfigs set enable service to %s", appConfigs.isEnableService()));
//LogUtils.d(TAG, "appConfigs is : " + appConfigs.toString()); //LogUtils.d(TAG, "appConfigs is : " + appConfigs.toString());
String szJson = appConfigs.toString(); String szJson = appConfigs.toString();
FileUtil.writeFile(getDataPath(context), szJson); FileUtil.writeFile(getDataPath(context), szJson);
@ -142,4 +173,8 @@ public class AppConfigs implements Serializable {
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace());
} }
} }
public void saveAppConfigs() {
saveAppConfigs(mContext, this);
}
} }

View File

@ -1,14 +1,14 @@
package cc.winboll.studio.appbase.models; package cc.winboll.studio.autoinstaller.models;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/13 07:06:13
*/
import android.util.JsonReader; import android.util.JsonReader;
import android.util.JsonWriter; import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean; import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException; import java.io.IOException;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/15 09:27:39
* @Describe MainServiceBean
*/
public class MainServiceBean extends BaseBean { public class MainServiceBean extends BaseBean {
public static final String TAG = "MainServiceBean"; public static final String TAG = "MainServiceBean";

View File

@ -4,12 +4,12 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build; import android.os.Build;
import cc.winboll.studio.autoinstaller.beans.AppConfigs; import cc.winboll.studio.autoinstaller.models.AppConfigs;
import cc.winboll.studio.autoinstaller.services.MainService; import cc.winboll.studio.autoinstaller.services.MainService;
import cc.winboll.studio.shared.log.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/06/06 13:19:38 * @Date 2024/06/06 13:19:38
* @Describe 应用消息接收类 * @Describe 应用消息接收类
*/ */
@ -23,7 +23,7 @@ public class MainReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String szAction = intent.getAction(); String szAction = intent.getAction();
if (szAction.equals(ACTION_BOOT_COMPLETED)) { if (szAction.equals(ACTION_BOOT_COMPLETED)) {
AppConfigs appConfigs = AppConfigs.loadAppConfigs(context); AppConfigs appConfigs = AppConfigs.getInstance(context).loadAppConfigs(context);
if (appConfigs.isEnableService()) { if (appConfigs.isEnableService()) {
Intent intentService = new Intent(context, MainService.class); Intent intentService = new Intent(context, MainService.class);
//intentService.putExtra(MainService.EXTRA_APKFILEPATH, appConfigs.getWatchingFilePath()); //intentService.putExtra(MainService.EXTRA_APKFILEPATH, appConfigs.getWatchingFilePath());

View File

@ -6,11 +6,11 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.autoinstaller.beans.AppConfigs; import cc.winboll.studio.autoinstaller.models.AppConfigs;
import cc.winboll.studio.autoinstaller.utils.ServiceUtil; import cc.winboll.studio.autoinstaller.utils.ServiceUtil;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/05/27 20:16:00 * @Date 2024/05/27 20:16:00
* @Describe MainService 守护进程服务 * @Describe MainService 守护进程服务
*/ */
@ -46,7 +46,7 @@ public class AssistantService extends Service {
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
//LogUtils.d(TAG, "call onStartCommand(...)"); //LogUtils.d(TAG, "call onStartCommand(...)");
run(); run();
AppConfigs appConfigs = AppConfigs.loadAppConfigs(AssistantService.this); AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(AssistantService.this);
return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
} }
@ -68,7 +68,7 @@ public class AssistantService extends Service {
// //
void run() { void run() {
//LogUtils.d(TAG, "call run()"); //LogUtils.d(TAG, "call run()");
AppConfigs appConfigs = AppConfigs.loadAppConfigs(AssistantService.this); AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(AssistantService.this);
if (appConfigs.isEnableService()) { if (appConfigs.isEnableService()) {
if (mIsThreadAlive == false) { if (mIsThreadAlive == false) {
// 设置运行状态 // 设置运行状态
@ -101,7 +101,7 @@ public class AssistantService extends Service {
@Override @Override
public void onServiceDisconnected(ComponentName name) { public void onServiceDisconnected(ComponentName name) {
//LogUtils.d(TAG, "call onServiceDisconnected(...)"); //LogUtils.d(TAG, "call onServiceDisconnected(...)");
AppConfigs appConfigs = AppConfigs.loadAppConfigs(AssistantService.this); AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(AssistantService.this);
if (appConfigs.isEnableService()) { if (appConfigs.isEnableService()) {
wakeupAndBindMain(); wakeupAndBindMain();
} }

View File

@ -10,25 +10,32 @@ import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Message; import android.os.Message;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.widget.Toast; import android.widget.Toast;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import cc.winboll.studio.shared.log.LogUtils;
import cc.winboll.studio.autoinstaller.FileListener; import cc.winboll.studio.autoinstaller.FileListener;
import cc.winboll.studio.autoinstaller.MainActivity; import cc.winboll.studio.autoinstaller.MainActivity;
import cc.winboll.studio.autoinstaller.beans.AppConfigs; import cc.winboll.studio.autoinstaller.R;
import cc.winboll.studio.autoinstaller.models.APKModel;
import cc.winboll.studio.autoinstaller.models.AppConfigs;
import cc.winboll.studio.autoinstaller.services.AssistantService; import cc.winboll.studio.autoinstaller.services.AssistantService;
import cc.winboll.studio.autoinstaller.services.MainService; import cc.winboll.studio.autoinstaller.services.MainService;
import cc.winboll.studio.autoinstaller.utils.NotificationUtil; import cc.winboll.studio.autoinstaller.utils.NotificationUtil;
import cc.winboll.studio.autoinstaller.utils.PackageUtil; import cc.winboll.studio.autoinstaller.utils.PackageUtil;
import cc.winboll.studio.autoinstaller.utils.ServiceUtil; import cc.winboll.studio.autoinstaller.utils.ServiceUtil;
import com.hjq.toast.ToastUtils; import cc.winboll.studio.libappbase.LogUtils;
import java.io.File; import java.io.File;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList;
public class MainService extends Service { public class MainService extends Service {
public static String TAG = "MainService"; public static String TAG = "MainService";
Context mContext;
ArrayList<APKModel> _APKModelList = new ArrayList<APKModel>();
private static boolean _mIsServiceAlive; private static boolean _mIsServiceAlive;
//String mszAPKFilePath; //String mszAPKFilePath;
//String mszAPKFileName; //String mszAPKFileName;
@ -47,6 +54,7 @@ public class MainService extends Service {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mContext = this;
LogUtils.d(TAG, "onCreate()"); LogUtils.d(TAG, "onCreate()");
_mIsServiceAlive = false; _mIsServiceAlive = false;
mHandler = new MyHandler(MainService.this); mHandler = new MyHandler(MainService.this);
@ -55,11 +63,14 @@ public class MainService extends Service {
} }
run(); run();
// 初始化磁贴工具服务
MainTileService mainTileService = new MainTileService(this);
} }
private void run() { private void run() {
AppConfigs appConfigs = AppConfigs.loadAppConfigs(MainService.this); AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(MainService.this);
if (appConfigs.isEnableService()) { if (appConfigs.isEnableService()) {
if (_mIsServiceAlive == false) { if (_mIsServiceAlive == false) {
// 设置运行状态 // 设置运行状态
@ -74,7 +85,8 @@ public class MainService extends Service {
startWatchingFile(appConfigs.getWatchingFilePath()); startWatchingFile(appConfigs.getWatchingFilePath());
LogUtils.d(TAG, "running..."); //LogUtils.d(TAG, "running...");
//ToastUtils.show("running...");
} else { } else {
LogUtils.d(TAG, "_mIsServiceAlive is " + Boolean.toString(_mIsServiceAlive)); LogUtils.d(TAG, "_mIsServiceAlive is " + Boolean.toString(_mIsServiceAlive));
@ -94,6 +106,7 @@ public class MainService extends Service {
} }
_mIsServiceAlive = false; _mIsServiceAlive = false;
LogUtils.d(TAG, "onDestroy()"); LogUtils.d(TAG, "onDestroy()");
mContext = null;
} }
@Override @Override
@ -101,7 +114,7 @@ public class MainService extends Service {
LogUtils.d(TAG, "onStartCommand"); LogUtils.d(TAG, "onStartCommand");
run(); run();
AppConfigs appConfigs = AppConfigs.loadAppConfigs(MainService.this); AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(MainService.this);
return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
} }
@ -118,7 +131,7 @@ public class MainService extends Service {
@Override @Override
public void onServiceDisconnected(ComponentName name) { public void onServiceDisconnected(ComponentName name) {
//LogUtils.d(TAG, "call onServiceConnected(...)"); //LogUtils.d(TAG, "call onServiceConnected(...)");
AppConfigs appConfigs = AppConfigs.loadAppConfigs(MainService.this); AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(MainService.this);
if (appConfigs.isEnableService()) { if (appConfigs.isEnableService()) {
// 唤醒守护进程 // 唤醒守护进程
wakeupAndBindAssistant(); wakeupAndBindAssistant();
@ -160,7 +173,7 @@ public class MainService extends Service {
}); });
mFileListener.startWatching(); mFileListener.startWatching();
ToastUtils.show("Start watching."); //ToastUtils.show("Start watching.");
} else { } else {
// 父级文件夹不存在就提示用户 // 父级文件夹不存在就提示用户
Toast.makeText(getApplication(), fParentDir.toString() + " no exist.", Toast.LENGTH_SHORT).show(); Toast.makeText(getApplication(), fParentDir.toString() + " no exist.", Toast.LENGTH_SHORT).show();
@ -176,6 +189,9 @@ public class MainService extends Service {
// 调用[应用信息查看器]打开应用包 // 调用[应用信息查看器]打开应用包
// //
private void installAPK(String szAPKFilePath) { private void installAPK(String szAPKFilePath) {
String szAPKPackageName = PackageUtil.getPackageNameFromApk(this, szAPKFilePath);
saveAPKInfo(szAPKPackageName);
long nTimeNow = System.currentTimeMillis(); long nTimeNow = System.currentTimeMillis();
/*SimpleDateFormat dateFormat = new SimpleDateFormat( /*SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()); "yyyy-MM-dd HH:mm:ss", Locale.getDefault());
@ -210,15 +226,24 @@ public class MainService extends Service {
// //
void installAPK2(String szAPKFilePath) { void installAPK2(String szAPKFilePath) {
LogUtils.d(TAG, "installAPK2()"); LogUtils.d(TAG, "installAPK2()");
String szAPKPackageName = PackageUtil.getPackageNameFromApk(this, szAPKFilePath);
saveAPKInfo(szAPKPackageName);
Intent intent = new Intent(this, MainActivity.class); Intent intent = new Intent(this, MainActivity.class);
intent.setAction(MainActivity.ACTION_NEW_INSTALLTASK); intent.setAction(MainActivity.ACTION_NEW_INSTALLTASK);
intent.putExtra(MainActivity.EXTRA_INSTALLED_PACKAGENAME, PackageUtil.getPackageNameFromApk(this, szAPKFilePath)); intent.putExtra(MainActivity.EXTRA_INSTALLED_PACKAGENAME, szAPKPackageName);
intent.putExtra(MainActivity.EXTRA_INSTALLED_APKFILEPATH, szAPKFilePath); intent.putExtra(MainActivity.EXTRA_INSTALLED_APKFILEPATH, szAPKFilePath);
// Intent.ACTION_VIEW); // Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent); this.startActivity(intent);
} }
void saveAPKInfo(String szApkPackageName) {
APKModel.loadBeanList(this, _APKModelList, APKModel.class);
_APKModelList.add(new APKModel(szApkPackageName));
APKModel.saveBeanList(this, _APKModelList, APKModel.class);
}
// //
// //
static class MyHandler extends Handler { static class MyHandler extends Handler {
@ -231,7 +256,7 @@ public class MainService extends Service {
switch (message.what) { switch (message.what) {
case MSG_INSTALL_APK: case MSG_INSTALL_APK:
{ {
AppConfigs appConfigs = AppConfigs.loadAppConfigs(theActivity); AppConfigs appConfigs = AppConfigs.getInstance(theActivity).loadAppConfigs(theActivity);
if (appConfigs.getSetupMode() == AppConfigs.SetupMode.WATCHOUTPUTINSTALLER) { if (appConfigs.getSetupMode() == AppConfigs.SetupMode.WATCHOUTPUTINSTALLER) {
theActivity.installAPK2((String)message.obj); theActivity.installAPK2((String)message.obj);
} else if (appConfigs.getSetupMode() == AppConfigs.SetupMode.NEWAPKINFONEWAPKINFO) { } else if (appConfigs.getSetupMode() == AppConfigs.SetupMode.NEWAPKINFONEWAPKINFO) {
@ -245,4 +270,21 @@ public class MainService extends Service {
super.handleMessage(message); super.handleMessage(message);
} }
} }
static class MainTileService extends TileService {
Context mContext;
MainTileService(Context context) {
mContext = context;
}
@Override
public void onStartListening() {
super.onStartListening();
Tile tile = getQsTile();
tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_android));
// 更新磁贴状态
tile.setState((mContext == null || mContext.getApplicationContext() == null )?Tile.STATE_INACTIVE: Tile.STATE_ACTIVE);
tile.updateTile();
}
}
} }

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller.utils; package cc.winboll.studio.autoinstaller.utils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/05/27 17:56:31 * @Date 2024/05/27 17:56:31
* @Describe 文件管理类 * @Describe 文件管理类
*/ */

View File

@ -55,8 +55,9 @@ public class NotificationUtil {
Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID) Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID)
.setAutoCancel(true) .setAutoCancel(true)
.setContentTitle(service.getString(R.string.app_name)) //.setContentTitle(service.getString(R.string.app_name))
.setContentText(service.TAG + " is started.") .setContentTitle(service.TAG + " is started.")
//.setContentText(service.TAG + " is started.")
.setWhen(System.currentTimeMillis()) .setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.ic_launcher)
//设置红色 //设置红色

View File

@ -1,14 +1,16 @@
package cc.winboll.studio.autoinstaller.utils; package cc.winboll.studio.autoinstaller.utils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/12/11 06:28:50 * @Date 2024/12/11 06:28:50
* @Describe 一个获取安卓APK安装文件的应用包名的函数 * @Describe 一个获取安卓APK安装文件的应用包名的函数
*/ */
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import cc.winboll.studio.shared.log.LogUtils; import android.content.pm.ResolveInfo;
import cc.winboll.studio.libappbase.LogUtils;
public class PackageUtil { public class PackageUtil {
@ -27,4 +29,20 @@ public class PackageUtil {
} }
return ""; return "";
} }
public static void openAPP(Context context, String packageName) {
// 这里假设要打开微信微信的包名是com.tencent.mm
//String packageName = "com.tencent.mm";
LogUtils.d(TAG, "packageName : " + packageName);
PackageManager packageManager = context.getPackageManager();
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
if (intent != null) {
ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfo != null) {
LogUtils.d(TAG, "startActivity...");
context.startActivity(intent);
}
}
}
} }

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller.utils; package cc.winboll.studio.autoinstaller.utils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/05/27 20:20:03 * @Date 2024/05/27 20:20:03
* @Describe 服务类工具 * @Describe 服务类工具
*/ */

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FF000000"
android:pathData="M16.61,15.15C16.15,15.15 15.77,14.78 15.77,14.32S16.15,13.5 16.61,13.5H16.61C17.07,13.5 17.45,13.86 17.45,14.32C17.45,14.78 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,14.78 6.57,14.32C6.57,13.86 6.95,13.5 7.41,13.5H7.41C7.87,13.5 8.24,13.86 8.24,14.32C8.24,14.78 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14H16.91Z"/>
</vector>

View File

@ -132,7 +132,7 @@
</LinearLayout> </LinearLayout>
<cc.winboll.studio.shared.log.LogView <cc.winboll.studio.libappbase.LogView
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="200dp"

View File

@ -1,3 +1,4 @@
<resources> <resources>
<string name="app_name">AutoInstaller</string> <string name="app_name">AutoInstaller</string>
<string name="tileservice_name">AutoInstaller</string>
</resources> </resources>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools">
<resources> <style name="MyAppTheme" parent="APPBaseTheme">
<style name="MyAPPBaseTheme" parent="APPBaseTheme">
<item name="attrColorPrimary">@color/colorPrimary</item> <item name="attrColorPrimary">@color/colorPrimary</item>
<item name="themeGlobalCrashActivity">@style/MyGlobalCrashActivityTheme</item> <item name="themeGlobalCrashActivity">@style/MyGlobalCrashActivityTheme</item>
</style> </style>

View File

@ -1,14 +0,0 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Application" parent="android:Theme.Material.Light.DarkActionBar">
<!-- Primary brand color. -->
<item name="android:colorPrimary">@color/purple_500</item>
<!-- Secondary brand color. -->
<item name="android:colorSecondary">@color/teal_200</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">@color/purple_700</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@ -1,11 +1,10 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
// Maven ~/.m2/repository mavenLocal {
mavenLocal() // Maven仓库路径
// url 'file:///sdcard/.m2/repository/'
maven { url "file:///sdcard/.m2/repository" } }
// Nexus Maven // Nexus Maven
// "WinBoLL Release" // "WinBoLL Release"
maven { url "https://nexus.winboll.cc/repository/maven-public/" } maven { url "https://nexus.winboll.cc/repository/maven-public/" }
@ -20,7 +19,13 @@ buildscript {
maven { url "https://jitpack.io" } maven { url "https://jitpack.io" }
mavenCentral() mavenCentral()
google() google()
//println "mavenLocal : ==========="
//println mavenLocal().url
//println "mavenLocal : ==========="
//mavenLocal() //mavenLocal()
// WinBoLL.CC Maven
maven { url 'https://spare-maven.winboll.cc/repository/' }
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.2.1' // compileSdkVersion 32 classpath 'com.android.tools.build:gradle:7.2.1' // compileSdkVersion 32
@ -31,6 +36,11 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
mavenLocal {
// Maven仓库路径
url 'file:///sdcard/.m2/repository/'
}
// Nexus Maven // Nexus Maven
// "WinBoLL Release" // "WinBoLL Release"
maven { url "https://nexus.winboll.cc/repository/maven-public/" } maven { url "https://nexus.winboll.cc/repository/maven-public/" }
@ -45,7 +55,13 @@ allprojects {
maven { url "https://jitpack.io" } maven { url "https://jitpack.io" }
mavenCentral() mavenCentral()
google() google()
mavenLocal() //println "mavenLocal : ==========="
//println mavenLocal().url
//println "mavenLocal : ==========="
//mavenLocal()
// WinBoLL.CC Maven
maven { url 'https://spare-maven.winboll.cc/repository/' }
} }
ext { ext {
// //
@ -56,7 +72,7 @@ allprojects {
bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh" bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh"
winbollFilePath = "winboll.properties" winbollFilePath = "winboll.properties"
keyPropsFilePath = "current.keystore" keyPropsFilePath = "appkey.keystore"
// lint // lint
lintXmlReportFilePath = "build/reports/lint-results.xml" lintXmlReportFilePath = "build/reports/lint-results.xml"
lintHTMLReportFilePath = "build/reports/lint-results.html" lintHTMLReportFilePath = "build/reports/lint-results.html"

View File

@ -24,7 +24,7 @@ https://github.com/aJIEw/PhoneCallApp.git
1. Fork 本仓库 1. Fork 本仓库
2. 新建 Feat_xxx 分支 2. 新建 Feat_xxx 分支
3. 提交代码 : ZhanGSKen(ZhanGSKen@AliYun.Com) 3. 提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
4. 新建 Pull Request 4. 新建 Pull Request

View File

@ -24,12 +24,12 @@ android {
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.contacts" applicationId "cc.winboll.studio.contacts"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 30
versionCode 1 versionCode 1
// versionName // versionName
// build.gradle stageCount=0 // build.gradle stageCount=0
// Gradle编译环境下合起来的 versionName "${versionName}.0" // Gradle编译环境下合起来的 versionName "${versionName}.0"
versionName "15.2" versionName "15.3"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@ -45,6 +45,9 @@ android {
dependencies { dependencies {
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
api 'cc.winboll.studio:libaes:15.8.0'
api 'cc.winboll.studio:libapputils:15.8.1'
api 'cc.winboll.studio:libappbase:15.8.1'
// https://github.com/getActivity/XXPermissions // https://github.com/getActivity/XXPermissions
api 'com.github.getActivity:XXPermissions:18.63' api 'com.github.getActivity:XXPermissions:18.63'
@ -81,8 +84,4 @@ dependencies {
//api 'androidx.vectordrawable:vectordrawable:1.1.0' //api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0' //api 'androidx.fragment:fragment:1.1.0'
api 'cc.winboll.studio:libaes:15.2.4'
api 'cc.winboll.studio:libapputils:15.2.1'
api 'cc.winboll.studio:libappbase:15.2.2'
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sun Apr 13 02:46:09 HKT 2025 #Tue May 20 13:02:18 HKT 2025
stageCount=8 stageCount=3
libraryProject= libraryProject=
baseVersion=15.2 baseVersion=15.3
publishVersion=15.2.7 publishVersion=15.3.2
buildCount=0 buildCount=0
baseBetaVersion=15.2.8 baseBetaVersion=15.3.3

View File

@ -42,7 +42,8 @@
android:icon="@drawable/ic_winboll" android:icon="@drawable/ic_winboll"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/MyAppTheme" android:theme="@style/MyAppTheme"
android:supportsRtl="true"> android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"

View File

@ -1,13 +1,13 @@
package cc.winboll.studio.contacts; package cc.winboll.studio.contacts;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/12/08 15:10:51 * @Date 2024/12/08 15:10:51
* @Describe 全局应用类 * @Describe 全局应用类
*/ */
import android.view.Gravity; import android.view.Gravity;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.WinBollActivityManager; import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
public class App extends GlobalApplication { public class App extends GlobalApplication {
@ -20,8 +20,8 @@ public class App extends GlobalApplication {
// 这样可以预先设置日志与数据的存储根目录 // 这样可以预先设置日志与数据的存储根目录
//setIsDebuging(BuildConfig.DEBUG); //setIsDebuging(BuildConfig.DEBUG);
super.onCreate(); super.onCreate();
// 设置 WinBoll 应用 UI 类型 // 设置 WinBoLL 应用 UI 类型
WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication); getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Aplication);
//LogUtils.d(TAG, "onCreate"); //LogUtils.d(TAG, "onCreate");

View File

@ -32,22 +32,21 @@ import cc.winboll.studio.contacts.fragments.CallLogFragment;
import cc.winboll.studio.contacts.fragments.ContactsFragment; import cc.winboll.studio.contacts.fragments.ContactsFragment;
import cc.winboll.studio.contacts.fragments.LogFragment; import cc.winboll.studio.contacts.fragments.LogFragment;
import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { final public class MainActivity extends AppCompatActivity implements IWinBoLLActivity, ViewPager.OnPageChangeListener, View.OnClickListener {
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
public static final int REQUEST_HOME_ACTIVITY = 0; public static final int REQUEST_HOME_ACTIVITY = 0;
public static final int REQUEST_ABOUT_ACTIVITY = 1; public static final int REQUEST_ABOUT_ACTIVITY = 1;
public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoll.ACTION_SOS"; public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoLL.ACTION_SOS";
static MainActivity _MainActivity; static MainActivity _MainActivity;
LogView mLogView; LogView mLogView;
@ -71,10 +70,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
private static final int DIALER_REQUEST_CODE = 1; private static final int DIALER_REQUEST_CODE = 1;
@Override // @Override
public Activity getActivity() { // public Activity getActivity() {
return this; // return this;
} // }
// @Override // @Override
// public APPInfo getAppInfo() { // public APPInfo getAppInfo() {
@ -95,6 +94,17 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// return null; // return null;
// } // }
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
// 接收并处理 Intent 数据函数 Intent 处理接收就直接返回 // 接收并处理 Intent 数据函数 Intent 处理接收就直接返回
@ -111,7 +121,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// // 显示后退按钮 // // 显示后退按钮
// getSupportActionBar().setDisplayHomeAsUpEnabled(true); // getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// } // }
getSupportActionBar().setSubtitle(getTag()); getSupportActionBar().setSubtitle(TAG);
tabLayout = findViewById(R.id.tabLayout); tabLayout = findViewById(R.id.tabLayout);
viewPager = findViewById(R.id.viewPager); viewPager = findViewById(R.id.viewPager);
@ -339,7 +349,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// //
// if (intent.getAction().equals(StringToQrCodeView.ACTION_UNITTEST_QRCODE)) { // if (intent.getAction().equals(StringToQrCodeView.ACTION_UNITTEST_QRCODE)) {
// try { // try {
// WinBollActivity clazzActivity = UnitTestActivity.class.newInstance(); // WinBoLLActivity clazzActivity = UnitTestActivity.class.newInstance();
// String tag = clazzActivity.getTag(); // String tag = clazzActivity.getTag();
// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag); // LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag);
// Intent subIntent = new Intent(this, UnitTestActivity.class); // Intent subIntent = new Intent(this, UnitTestActivity.class);
@ -357,8 +367,8 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// } // }
// //
// Files.copy(Paths.get(szSrcPath), Paths.get(file.getPath())); // Files.copy(Paths.get(szSrcPath), Paths.get(file.getPath()));
// //startWinBollActivity(subIntent, tag); // //startWinBoLLActivity(subIntent, tag);
// WinBollActivityManager.getInstance(this).startWinBollActivity(this, subIntent, UnitTestActivity.class); // WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, subIntent, UnitTestActivity.class);
// } catch (IllegalAccessException | InstantiationException | IOException e) { // } catch (IllegalAccessException | InstantiationException | IOException e) {
// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); // LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// // 函数处理异常返回失败 // // 函数处理异常返回失败
@ -371,10 +381,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// return true; // return true;
// } // }
@Override // @Override
public String getTag() { // public String getTag() {
return TAG; // return TAG;
} // }
// @Override // @Override
// public void onBackPressed() { // public void onBackPressed() {
@ -386,7 +396,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// //
// @Override // @Override
// public void onYes() { // public void onYes() {
// WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); // WinBoLLActivityManager.getInstance(getApplicationContext()).finishAll();
// } // }
// //
// @Override // @Override
@ -408,7 +418,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
if (item.getItemId() == R.id.item_settings) { if (item.getItemId() == R.id.item_settings) {
Intent intent = new Intent(this, SettingsActivity.class); Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent); startActivity(intent);
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class); //WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, CallActivity.class);
} }
// } else // } else
// if (item.getItemId() == R.id.item_exit) { // if (item.getItemId() == R.id.item_exit) {

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities; package cc.winboll.studio.contacts.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/31 15:15:54 * @Date 2025/03/31 15:15:54
* @Describe 应用介绍窗口 * @Describe 应用介绍窗口
*/ */
@ -10,14 +10,15 @@ import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.R;
import cc.winboll.studio.libaes.winboll.APPInfo; import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libaes.winboll.AboutView; import cc.winboll.studio.libaes.winboll.AboutView;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class AboutActivity extends WinBollActivity implements IWinBollActivity { public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity {
public static final String TAG = "AboutActivity"; public static final String TAG = "AboutActivity";
@ -64,13 +65,13 @@ public class AboutActivity extends WinBollActivity implements IWinBollActivity {
); );
layout.addView(aboutView, params); layout.addView(aboutView, params);
GlobalApplication.getWinBollActivityManager().add(this); GlobalApplication.getWinBoLLActivityManager().add(this);
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
GlobalApplication.getWinBollActivityManager().registeRemove(this); GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
} }
public AboutView CreateAboutView() { public AboutView CreateAboutView() {

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities; package cc.winboll.studio.contacts.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/20 17:15:46 * @Date 2025/02/20 17:15:46
* @Describe 拨号窗口 * @Describe 拨号窗口
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities; package cc.winboll.studio.contacts.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/20 20:18:26 * @Date 2025/02/20 20:18:26
*/ */
import android.content.Intent; import android.content.Intent;

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities; package cc.winboll.studio.contacts.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/21 05:37:42 * @Date 2025/02/21 05:37:42
*/ */
import android.content.Context; import android.content.Context;
@ -24,6 +24,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.App;
import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter; import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter;
import cc.winboll.studio.contacts.beans.MainServiceBean; import cc.winboll.studio.contacts.beans.MainServiceBean;
@ -34,15 +35,13 @@ import cc.winboll.studio.contacts.bobulltoon.TomCat;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.contacts.views.DuInfoTextView; import cc.winboll.studio.contacts.views.DuInfoTextView;
import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import cc.winboll.studio.contacts.App;
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity { public class SettingsActivity extends AppCompatActivity implements IWinBoLLActivity {
public static final String TAG = "SettingsActivity"; public static final String TAG = "SettingsActivity";
@ -177,6 +176,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
etDunResumeSecondCount.setEnabled(!isEnableDun); etDunResumeSecondCount.setEnabled(!isEnableDun);
etDunResumeCount.setEnabled(!isEnableDun); etDunResumeCount.setEnabled(!isEnableDun);
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
} }
public static void notifyDunInfoUpdate() { public static void notifyDunInfoUpdate() {
@ -201,6 +202,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
settingsModel.setIsEnableDun(isEnableDun); settingsModel.setIsEnableDun(isEnableDun);
Rules.getInstance(this).saveDun(); Rules.getInstance(this).saveDun();
Rules.getInstance(this).reload(); Rules.getInstance(this).reload();
// 重新加载盾牌参数
etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
} }
void updateStreamVolumeTextView() { void updateStreamVolumeTextView() {
@ -233,7 +239,18 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
} }
} }
public void onResetBoBullToonURL(View view) {
Rules.getInstance(this).resetDefaultBoBullToonURL();
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
}
public void onDownloadBoBullToon(View view) { public void onDownloadBoBullToon(View view) {
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
if (!etBoBullToonURL.getText().toString().trim().equals(Rules.getInstance(this).getBoBullToonURL())) {
Rules.getInstance(this).setBoBullToonURL(etBoBullToonURL.getText().toString().trim());
}
final TomCat tomCat = TomCat.getInstance(this); final TomCat tomCat = TomCat.getInstance(this);
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
@ -247,8 +264,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
}).start(); }).start();
} }
public void onSearchBoBullToonPhone(View view) { public void onSearchBoBullToonPhone(View view) {
TomCat tomCat = TomCat.getInstance(this); TomCat tomCat = TomCat.getInstance(this);
EditText etPhone = findViewById(R.id.activitysettingsEditText1); EditText etPhone = findViewById(R.id.activitysettingsEditText1);
@ -313,6 +328,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
} }
public void onAbout(View view) { public void onAbout(View view) {
App.getWinBollActivityManager().startWinBollActivity(this, AboutActivity.class); App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class);
} }
} }

View File

@ -11,7 +11,7 @@ import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.LogView;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 16:07:04 * @Date 2025/03/02 16:07:04
*/ */
public class UnitTestActivity extends Activity { public class UnitTestActivity extends Activity {

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities; package cc.winboll.studio.contacts.activities;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/31 15:16:45 * @Date 2025/03/31 15:16:45
* @Describe 应用窗口基类 * @Describe 应用窗口基类
*/ */
@ -11,9 +11,9 @@ import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.libaes.beans.AESThemeBean; import cc.winboll.studio.libaes.beans.AESThemeBean;
import cc.winboll.studio.libaes.utils.AESThemeUtil; import cc.winboll.studio.libaes.utils.AESThemeUtil;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
public class WinBollActivity extends AppCompatActivity implements IWinBollActivity { public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity {
public static final String TAG = "WinBollActivity"; public static final String TAG = "WinBollActivity";

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.adapters; package cc.winboll.studio.contacts.adapters;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/26 13:09:32 * @Date 2025/02/26 13:09:32
* @Describe CallLogAdapter * @Describe CallLogAdapter
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.adapters; package cc.winboll.studio.contacts.adapters;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/26 13:35:44 * @Date 2025/02/26 13:35:44
* @Describe ContactAdapter * @Describe ContactAdapter
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.adapters; package cc.winboll.studio.contacts.adapters;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/20 14:20:38 * @Date 2025/02/20 14:20:38
* @Describe ImagePagerAdapter * @Describe ImagePagerAdapter
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.adapters; package cc.winboll.studio.contacts.adapters;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 17:27:41 * @Date 2025/03/02 17:27:41
* @Describe PhoneConnectRuleAdapter * @Describe PhoneConnectRuleAdapter
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.beans; package cc.winboll.studio.contacts.beans;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/26 13:10:57 * @Date 2025/02/26 13:10:57
* @Describe CallLogModel * @Describe CallLogModel
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.beans; package cc.winboll.studio.contacts.beans;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/26 13:37:00 * @Date 2025/02/26 13:37:00
* @Describe ContactModel * @Describe ContactModel
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.beans; package cc.winboll.studio.contacts.beans;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 07:06:13 * @Date 2025/02/13 07:06:13
*/ */
import android.util.JsonReader; import android.util.JsonReader;

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.beans; package cc.winboll.studio.contacts.beans;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/21 09:52:10 * @Date 2025/02/21 09:52:10
* @Describe 电话黑名单规则 * @Describe 电话黑名单规则
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.beans; package cc.winboll.studio.contacts.beans;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/24 18:47:11 * @Date 2025/02/24 18:47:11
* @Describe 手机铃声设置参数类 * @Describe 手机铃声设置参数类
*/ */

View File

@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.beans; package cc.winboll.studio.contacts.beans;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 19:51:40 * @Date 2025/03/02 19:51:40
* @Describe SettingsModel * @Describe SettingsModel
*/ */
@ -14,6 +14,7 @@ import cc.winboll.studio.contacts.utils.IntUtils;
public class SettingsModel extends BaseBean { public class SettingsModel extends BaseBean {
public static final String TAG = "SettingsModel"; public static final String TAG = "SettingsModel";
public static final int MAX_INTRANGE = 666666; public static final int MAX_INTRANGE = 666666;
public static final int MIN_INTRANGE = 1; public static final int MIN_INTRANGE = 1;
@ -27,6 +28,8 @@ public class SettingsModel extends BaseBean {
int dunResumeCount; int dunResumeCount;
// 是否启用云盾 // 是否启用云盾
boolean isEnableDun; boolean isEnableDun;
// BoBullToon 应用模块数据请求地址
String szBoBullToon_URL;
public SettingsModel() { public SettingsModel() {
this.dunTotalCount = 6; this.dunTotalCount = 6;
@ -34,14 +37,24 @@ public class SettingsModel extends BaseBean {
this.dunResumeSecondCount = 60; this.dunResumeSecondCount = 60;
this.dunResumeCount = 1; this.dunResumeCount = 1;
this.isEnableDun = false; this.isEnableDun = false;
this.szBoBullToon_URL = "";
} }
public SettingsModel(int dunTotalCount, int dunCurrentCount, int dunResumeSecondCount, int dunResumeCount, boolean isEnableDun) { public SettingsModel(int dunTotalCount, int dunCurrentCount, int dunResumeSecondCount, int dunResumeCount, boolean isEnableDun, String szBoBullToon_URL) {
this.dunTotalCount = getSettingsModelRangeInt(dunTotalCount); this.dunTotalCount = getSettingsModelRangeInt(dunTotalCount);
this.dunCurrentCount = getSettingsModelRangeInt(dunCurrentCount); this.dunCurrentCount = getSettingsModelRangeInt(dunCurrentCount);
this.dunResumeSecondCount = getSettingsModelRangeInt(dunResumeSecondCount); this.dunResumeSecondCount = getSettingsModelRangeInt(dunResumeSecondCount);
this.dunResumeCount = getSettingsModelRangeInt(dunResumeCount); this.dunResumeCount = getSettingsModelRangeInt(dunResumeCount);
this.isEnableDun = isEnableDun; this.isEnableDun = isEnableDun;
this.szBoBullToon_URL = szBoBullToon_URL;
}
public void setBoBullToon_URL(String boBullToon_URL) {
this.szBoBullToon_URL = boBullToon_URL;
}
public String getBoBullToon_URL() {
return szBoBullToon_URL;
} }
public void setDunTotalCount(int dunTotalCount) { public void setDunTotalCount(int dunTotalCount) {
@ -102,6 +115,7 @@ public class SettingsModel extends BaseBean {
jsonWriter.name("dunResumeSecondCount").value(getDunResumeSecondCount()); jsonWriter.name("dunResumeSecondCount").value(getDunResumeSecondCount());
jsonWriter.name("dunResumeCount").value(getDunResumeCount()); jsonWriter.name("dunResumeCount").value(getDunResumeCount());
jsonWriter.name("isEnableDun").value(isEnableDun()); jsonWriter.name("isEnableDun").value(isEnableDun());
jsonWriter.name("szBoBullToon_URL").value(getBoBullToon_URL());
} }
@ -118,6 +132,8 @@ public class SettingsModel extends BaseBean {
setDunResumeCount(getSettingsModelRangeInt(jsonReader.nextInt())); setDunResumeCount(getSettingsModelRangeInt(jsonReader.nextInt()));
} else if (name.equals("isEnableDun")) { } else if (name.equals("isEnableDun")) {
setIsEnableDun(jsonReader.nextBoolean()); setIsEnableDun(jsonReader.nextBoolean());
} else if (name.equals("szBoBullToon_URL")) {
setBoBullToon_URL(jsonReader.nextString());
} else { } else {
return false; return false;
} }

View File

@ -1,11 +1,13 @@
package cc.winboll.studio.contacts.bobulltoon; package cc.winboll.studio.contacts.bobulltoon;
/** /**
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 13:47:48 * @Date 2025/03/02 13:47:48
* @Describe 汤姆猫管家 使用 BoBullToon 项目对通讯地址进行筛选判断的好朋友 * @Describe 汤姆猫管家 使用 BoBullToon 项目对通讯地址进行筛选判断的好朋友
*/ */
import android.content.Context; import android.content.Context;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.io.File; import java.io.File;
@ -28,6 +30,7 @@ public class TomCat {
public static final String TAG = "TomCat"; public static final String TAG = "TomCat";
List<String> listPhoneBoBullToon = new ArrayList<String>(); List<String> listPhoneBoBullToon = new ArrayList<String>();
String mszBoBullToon_URL;
static volatile TomCat _TomCat; static volatile TomCat _TomCat;
Context mContext; Context mContext;
@ -42,7 +45,11 @@ public class TomCat {
return _TomCat; return _TomCat;
} }
void downloadAndExtractZip(String zipUrl, String destinationFolder) throws IOException { public String getDefaultBobulltoonUrl() {
return mContext.getString(R.string.default_bobulltoon_url);
}
boolean downloadAndExtractZip(String zipUrl, String destinationFolder) throws IOException {
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() Request request = new Request.Builder()
.url(zipUrl) .url(zipUrl)
@ -95,13 +102,16 @@ public class TomCat {
// 删除临时 ZIP 文件 // 删除临时 ZIP 文件
tempZipFile.delete(); tempZipFile.delete();
LogUtils.d(TAG, "已更新 BoBullToon 数据"); LogUtils.d(TAG, "已更新 BoBullToon 数据");
return true;
} catch (Exception e) { } catch (Exception e) {
ToastUtils.show(e.getMessage());
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
return false;
} }
} }
public boolean downloadBoBullToon() { public boolean downloadBoBullToon() {
String zipUrl = "http://10.8.0.12:3000/Studio/BoBullToon/archive/main.zip"; // 替换为实际的 ZIP 文件 URL String zipUrl = Rules.getInstance(mContext).getBoBullToonURL(); // 替换为实际的 ZIP 文件 URL
String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径 String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径
try { try {
// 删除旧文件 // 删除旧文件
@ -113,9 +123,11 @@ public class TomCat {
} }
// 更新新文件 // 更新新文件
downloadAndExtractZip(zipUrl, destinationFolder); if(downloadAndExtractZip(zipUrl, destinationFolder)) {
LogUtils.d(TAG, "ZIP 文件下载并解压成功。"); LogUtils.d(TAG, "ZIP 文件下载并解压成功。");
return true; return true;
}
return false;
} catch (IOException e) { } catch (IOException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
} }

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