Compare commits

...

208 Commits

Author SHA1 Message Date
ZhanGSKen
c03568e1f5 <powerbell>APK 15.4.6 release Publish. 2025-06-23 20:04:59 +08:00
ZhanGSKen
0e57ce679e <powerbell>APK 15.4.5 release Publish. 2025-06-23 14:49:46 +08:00
ZhanGSKen
f9211a8eb4 优化背景像素拾取UI 2025-06-23 14:48:24 +08:00
ZhanGSKen
4c31ff9b54 调整窗口切换模式 2025-06-23 14:29:59 +08:00
ZhanGSKen
8cf610962e <powerbell>APK 15.4.4 release Publish. 2025-06-22 16:21:12 +08:00
ZhanGSKen
3071d186ec 添加图片像素拾取并可以设置像素为图片背景 2025-06-22 16:19:24 +08:00
ZhanGSKen
df10306059 <powerbell>APK 15.4.3 release Publish. 2025-06-19 21:16:18 +08:00
ZhanGSKen
ccdb9c5abd UI美化,应用视图布局调整。 2025-06-19 21:14:22 +08:00
ZhanGSKen
f27209ab87 Merge remote-tracking branch 'origin/appbase' into powerbell 2025-06-19 20:58:26 +08:00
ZhanGSKen
e8682ce410 Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-06-19 20:56:32 +08:00
ZhanGSKen
2e4003dae0 编译调试 2025-06-19 20:52:02 +08:00
ZhanGSKen
198b0975ce <libaes>Library Release 15.9.1 2025-06-19 20:42:45 +08:00
ZhanGSKen
24a578a9d2 <aes>APK 15.9.1 release Publish. 2025-06-19 20:42:26 +08:00
ZhanGSKen
46de24447f 编译调试 2025-06-19 20:40:41 +08:00
ZhanGSKen
2a819e94e4 <powerbell>APK 15.4.2 release Publish. 2025-06-19 10:22:12 +08:00
ZhanGSKen
6635358ec5 设置图片临时剪裁路径保存在Pictures。 2025-06-19 10:19:10 +08:00
ZhanGSKen
1320984829 修改项目关键设置说明 2025-06-09 11:17:21 +08:00
ZhanGSKen
abf1e5ba42 添加 WinBoLL 应用签名密钥配置说明。 2025-06-09 11:07:59 +08:00
ZhanGSKen
1cd2f88038 标记重点与选项 2025-06-09 10:49:23 +08:00
ZhanGSKen
3f6e583d68 添加应用签名密钥配置说明。 2025-06-09 10:47:38 +08:00
ZhanGSKen
271456bfcd <appbase>APK 15.8.8 release Publish. 2025-06-09 09:38:21 +08:00
ZhanGSKen
ee5458d82c 忽略GitHub工作流启动标记与执行 2025-06-09 09:37:15 +08:00
ZhanGSKen
3a83367f71 与NumTable模块建立时的变更源码合并,并且修复AES模块编译参数。 2025-06-09 01:56:31 +08:00
ZhanGSKen
74b9350a6a <aes>APK 15.9.0 release Publish. 2025-06-09 01:44:30 +08:00
ZhanGSKen
d2858f23f7 准备与NumTable模块项目合并。先提升AES模块版本号,掌控模块源码版本控制优先权。 2025-06-09 01:42:49 +08:00
ZhanGSKen
40a5b9c339 <numtable>APK 15.1.0 release Publish. 2025-06-08 21:21:12 +08:00
ZhanGSKen
fd79113572 设置NumTable版本号 2025-06-08 21:19:54 +08:00
ZhanGSKen
9b911b583c <numtable>APK 15.0.0 release Publish. 2025-06-08 21:16:53 +08:00
ZhanGSKen
37817c3e8c <numtable>Start New Stage Version. 2025-06-08 21:14:54 +08:00
ZhanGSKen
0b5402f5f3 设置应用图标方案 2025-06-08 21:10:47 +08:00
ZhanGSKen
bea22e3853 添加NumTable项目 2025-06-08 20:19:58 +08:00
ZhanGSKen
7e2ad0c01d 精简代码 2025-06-05 17:00:28 +08:00
ZhanGSKen
476ce02fc8 Json数据适配吻合 2025-06-05 15:06:55 +08:00
ZhanGSKen
bc697279ad 编译参数修复 2025-06-05 12:03:14 +08:00
ZhanGSKen
dee01f1179 接口初步对接,正在调试数据处理方法... 2025-06-05 11:59:36 +08:00
ZhanGSKen
a500decc7a 登录数据加密解密成功 2025-06-05 09:52:04 +08:00
ZhanGSKen
5099d00050 <appbase>APK 15.8.7 release Publish. 2025-06-04 15:04:39 +08:00
ZhanGSKen
515d14e896 编译测试 2025-06-04 15:04:01 +08:00
ZhanGSKen
f630e27ed8 编译参数修复 2025-06-04 15:03:06 +08:00
ZhanGSKen
cd7ed01216 添加Logon框和RSA加密模块。 2025-06-04 14:58:01 +08:00
ZhanGSKen
bb24bbfbd1 <appbase>APK 15.8.6 release Publish. 2025-06-04 13:17:34 +08:00
ZhanGSKen
2ba2f88510 添加调试模块 2025-06-04 13:16:51 +08:00
ZhanGSKen
db3a3644a8 <appbase>APK 15.8.5 release Publish. 2025-06-04 12:14:48 +08:00
ZhanGSKen
556bfa7024 添加主机识别 2025-06-04 12:11:19 +08:00
ZhanGSKen
4842a1ec30 添加云宝云测试接口 2025-06-04 11:21:26 +08:00
ZhanGSKen
b0388a2972 Merge remote-tracking branch 'origin/powerbell' into appbase 2025-06-03 20:17:33 +08:00
ZhanGSKen
bd5a1f18ce Merge remote-tracking branch 'origin/ollama' into appbase 2025-06-03 20:17:27 +08:00
ZhanGSKen
99798b4816 Merge branch 'androidxdemo' into appbase 2025-06-03 20:11:30 +08:00
ZhanGSKen
f93b6047a8 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-06-03 20:07:55 +08:00
ZhanGSKen
daa3f858a0 Merge remote-tracking branch 'origin/aes' into appbase 2025-06-03 20:07:49 +08:00
ZhanGSKen
3fded32426 Merge remote-tracking branch 'origin/apputils' into appbase 2025-06-03 20:07:42 +08:00
ZhanGSKen
8f85006040 Merge branch 'androiddemo' into appbase 2025-06-03 20:05:45 +08:00
ZhanGSKen
e28b0bd75e <libaes>Library Release 15.8.1 2025-06-03 19:17:10 +08:00
ZhanGSKen
af1d6d3439 <aes>APK 15.8.1 release Publish. 2025-06-03 19:16:41 +08:00
ZhanGSKen
470d1ffa1f 编译测试 2025-06-03 19:13:16 +08:00
ZhanGSKen
49ae869df1 Merge remote-tracking branch 'origin/aes' into appbase 2025-06-03 17:54:27 +08:00
ZhanGSKen
77e98bafe4 <libapputils>Library Release 15.8.4 2025-06-03 15:05:54 +08:00
ZhanGSKen
ff14d0c0c3 <apputils>APK 15.8.4 release Publish. 2025-06-03 15:05:42 +08:00
ZhanGSKen
950be3a182 <libapputils>Library Release 15.8.3 2025-06-03 14:35:23 +08:00
ZhanGSKen
1f20fca9be <apputils>APK 15.8.3 release Publish. 2025-06-03 14:35:00 +08:00
ZhanGSKen
8d29d11078 Merge branch 'apputils' into m2 2025-06-03 13:50:51 +08:00
ZhanGSKen
7534881f50 <libappbase>Library Release 15.8.4 2025-06-03 13:40:13 +08:00
ZhanGSKen
ef992dcd7c <appbase>APK 15.8.4 release Publish. 2025-06-03 13:40:01 +08:00
ZhanGSKen
71c1baa4ba <libappbase>Library Release 15.8.3 2025-06-03 13:26:16 +08:00
ZhanGSKen
9e149037db <appbase>APK 15.8.3 release Publish. 2025-06-03 13:25:47 +08:00
ZhanGSKen
89df24f736 更新秘钥库 2025-06-03 13:24:10 +08:00
ZhanGSKen
2118495bc8 更新秘钥库 2025-06-03 13:13:54 +08:00
ZhanGSKen
1dd614bd68 更新秘钥库 2025-06-03 12:58:51 +08:00
ZhanGSKen
b793c74e81 修改应用秘钥配置 2025-06-03 12:04:39 +08:00
ZhanGSKen
8d1872a893 应用介绍页,完成论坛与Git仓库连接跳转。 2025-06-01 20:50:03 +08:00
ZhanGSKen
5c58ee34e7 添加说明书 2025-06-01 20:24:36 +08:00
ZhanGSKen
e530403af7 Merge remote-tracking branch 'origin/appbase' into aes 2025-06-01 16:29:05 +08:00
ZhanGSKen
264ab802c5 更新Git项目名称 2025-06-01 16:28:28 +08:00
ZhanGSKen
7c1832dc05 更新类库 2025-06-01 16:06:12 +08:00
ZhanGSKen
9a0ee889ba 更新类库 2025-06-01 16:04:21 +08:00
ZhanGSKen
c40066ca4d 更新类库 2025-06-01 16:03:16 +08:00
ZhanGSKen
5348d1ef6d <libapputils>Library Release 15.8.2 2025-06-01 16:01:39 +08:00
ZhanGSKen
063c997bbb <apputils>APK 15.8.2 release Publish. 2025-06-01 16:01:19 +08:00
ZhanGSKen
1376ca7ebb Merge remote-tracking branch 'origin/appbase' into apputils 2025-06-01 15:59:59 +08:00
ZhanGSKen
92e271b569 更新类库 2025-06-01 15:58:12 +08:00
ZhanGSKen
a5083cc52f 更新类库 2025-06-01 15:43:48 +08:00
ZhanGSKen
0692d4efb2 <libappbase>Library Release 15.8.2 2025-06-01 15:41:59 +08:00
ZhanGSKen
f10438d3d3 <appbase>APK 15.8.2 release Publish. 2025-06-01 15:41:38 +08:00
ZhanGSKen
1e697bc12d 添加调试信息 2025-06-01 15:03:44 +08:00
ZhanGSKen
d5a3c626b3 修复多窗口重复创建问题 2025-06-01 14:02:56 +08:00
ZhanGSKen
56692db142 20250531_213355_576 2025-05-31 21:34:04 +08:00
ZhanGSKen
934d54963a 添加日志窗口打开功能 2025-05-30 09:42:36 +08:00
ZhanGSKen
c105123e7b 0922 2025-05-30 09:22:42 +08:00
ZhanGSKen
d8c534bbc8 更新适配系统介绍 2025-05-30 09:00:59 +08:00
ZhanGSKen
6cce9c4d3f <powerbell>APK 15.4.1 release Publish. 2025-05-29 09:43:37 +08:00
ZhanGSKen
df18c34976 <powerbell>APK 15.4.0 release Publish. 2025-05-29 09:43:12 +08:00
ZhanGSKen
22ca83b5b7 版本号调整 2025-05-29 09:38:25 +08:00
ZhanGSKen
98233ce148 编译测试 2025-05-29 09:31:28 +08:00
ZhanGSKen
41fd9b171b 更新联系邮件 2025-05-29 09:28:13 +08:00
ZhanGSKen
330e5032df Merge remote-tracking branch 'origin/mymessagemanager' into appbase 2025-05-21 01:14:52 +08:00
ZhanGSKen
76420ff5f4 <mymessagemanager>APK 15.2.5 release Publish. 2025-05-20 20:39:06 +08:00
ZhanGSKen
ee3553716c 编译调试 2025-05-20 20:31:06 +08:00
ZhanGSKen
02da4c3db9 Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-20 20:21:52 +08:00
ZhanGSKen
d689db61ff 分支合并修整 2025-05-20 20:16:03 +08:00
ZhanGSKen
2b090e5c8e <contacts>APK 15.3.2 release Publish. 2025-05-20 13:02:18 +08:00
ZhanGSKen
309214ecf3 更新类库 2025-05-20 12:54:44 +08:00
ZhanGSKen
d29c9de3b4 合并20250520_122311_006 2025-05-20 12:23:15 +08:00
ZhanGSKen
d7efdb6c02 编译调试 2025-05-20 11:28:25 +08:00
ZhanGSKen
20b36dd63b Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-05-20 05:46:28 +08:00
ZhanGSKen
a40450c085 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-05-20 05:46:23 +08:00
ZhanGSKen
e7a7a4438c 更新类库 2025-05-20 05:45:52 +08:00
ZhanGSKen
3e6de13fa3 更新类库 2025-05-20 05:44:07 +08:00
ZhanGSKen
af848809e9 <libappbase>Library Release 15.8.1 2025-05-20 05:41:16 +08:00
ZhanGSKen
2c7026a635 <appbase>APK 15.8.1 release Publish. 2025-05-20 05:40:58 +08:00
ZhanGSKen
6278c3f945 修复次级窗口打开时传递的参数缺失问题 2025-05-20 05:39:48 +08:00
ZhanGSKen
bc3a320433 移除WinBoLL应用模块 2025-05-13 12:01:35 +08:00
ZhanGSKen
e03b8d4745 Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-05-13 11:52:23 +08:00
ZhanGSKen
d5fb348134 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-05-13 11:52:17 +08:00
ZhanGSKen
5c7437b19c Merge remote-tracking branch 'origin/aes' into appbase 2025-05-13 11:52:11 +08:00
ZhanGSKen
bf09def10b 更新适配系统版本 2025-05-13 11:44:39 +08:00
ZhanGSKen
8431d7dfa9 更新适配系统版本 2025-05-13 11:43:25 +08:00
ZhanGSKen
6aadaf87af 更新类库版本 2025-05-13 11:40:34 +08:00
ZhanGSKen
6a2943420f 更新类库版本 2025-05-13 11:34:56 +08:00
ZhanGSKen
dc704e292a <libaes>Library Release 15.8.0 2025-05-13 11:22:45 +08:00
ZhanGSKen
1087a7837c <aes>APK 15.8.0 release Publish. 2025-05-13 11:22:24 +08:00
ZhanGSKen
59876a2353 设置基础版本号 2025-05-13 11:21:27 +08:00
ZhanGSKen
053b45e87e <libapputils>Library Release 15.8.1 2025-05-13 11:18:15 +08:00
ZhanGSKen
58e49ed371 <apputils>APK 15.8.1 release Publish. 2025-05-13 11:17:53 +08:00
ZhanGSKen
90a6eb266b 编译调试 2025-05-13 11:17:24 +08:00
ZhanGSKen
f0a564c9bb <apputils>Start New Stage Version. 2025-05-13 11:11:32 +08:00
ZhanGSKen
46b21331af Merge remote-tracking branch 'origin/appbase' into apputils 2025-05-13 11:10:47 +08:00
ZhanGSKen
6221cc30ac <libapputils>Library Release 15.8.0 2025-05-13 11:10:23 +08:00
ZhanGSKen
8489ee6447 <apputils>APK 15.8.0 release Publish. 2025-05-13 11:09:58 +08:00
ZhanGSKen
9205af4aa9 编译调试 2025-05-13 11:08:42 +08:00
ZhanGSKen
780e730a38 设置基础版本号 2025-05-13 11:08:04 +08:00
ZhanGSKen
429499885b <libappbase>Library Release 15.8.0 2025-05-13 11:05:19 +08:00
ZhanGSKen
fcf4ad2fc0 <appbase>APK 15.8.0 release Publish. 2025-05-13 11:05:02 +08:00
ZhanGSKen
7635f6f084 设置基础版本号 2025-05-13 11:03:55 +08:00
ZhanGSKen
e49935f772 <libappbase>Library Release 15.7.7 2025-05-13 10:29:25 +08:00
ZhanGSKen
381ddf9e40 <appbase>APK 15.7.7 release Publish. 2025-05-13 10:28:56 +08:00
ZhanGSKen
7774317c3b Merge remote-tracking branch 'origin/appbase' into aes 2025-05-13 09:55:12 +08:00
ZhanGSKen
16f45aabe4 <aes>APK 15.6.3 release Publish. 2025-05-12 18:10:35 +08:00
ZhanGSKen
f770ea5aa0 Merge remote-tracking branch 'origin/aes' into appbase 2025-05-12 18:04:01 +08:00
ZhanGSKen
9d0bdb803b Merge remote-tracking branch 'origin/aes' into appbase 2025-05-12 15:19:29 +08:00
ZhanGSKen
af0b8859f0 编译调试 2025-05-12 03:37:14 +08:00
ZhanGSKen
275330f553 Merge remote-tracking branch 'origin/aes' into appbase 2025-05-12 03:35:32 +08:00
ZhanGSKen
fa72983f54 编译调试 2025-05-10 11:17:04 +08:00
ZhanGSKen
35825d5ead 更换联系方式 2025-05-10 09:32:55 +08:00
ZhanGSKen
577237bc9e 修整说明书 2025-05-09 20:11:14 +08:00
ZhanGSKen
8ef41b9f1b 再次修复一下 2025-05-09 20:08:32 +08:00
ZhanGSKen
36733e362b 恢复到77bdf886e9ab348cb2853d42dd80a7e4bfa43d7d提交点 2025-05-09 19:58:52 +08:00
ZhanGSKen
fbf71e6998 设置OriginMaster提交点合并APPBase源码。 2025-05-08 17:56:09 +08:00
ZhanGSKen
77bdf886e9 Initial commit 2025-05-08 17:43:51 +08:00
ZhanGSKen
c687b5513d 更新说明书 2025-05-07 00:31:11 +08:00
ZhanGSKen
7c7554133b <contacts>APK 15.3.1 release Publish. 2025-05-05 03:56:16 +08:00
ZhanGSKen
98f6d0019b 修复盾牌参数问题 2025-05-05 03:55:03 +08:00
ZhanGSKen
fc9c82921d 修复盾牌参数不同步问题 2025-05-05 03:51:07 +08:00
ZhanGSKen
1ac0ad96e1 云盾规则修复 2025-05-05 03:44:52 +08:00
ZhanGSKen
9060cb51ff <contacts>APK 15.3.0 release Publish. 2025-05-04 21:09:15 +08:00
ZhanGSKen
7951d0a8d6 类库更新,BugFix. 2025-05-04 21:07:56 +08:00
ZhanGSKen
ded775ae01 类库更新,BugFix。 2025-05-04 21:01:31 +08:00
ZhanGSKen
82258f1763 <contacts>Start New Stage Version. 2025-05-04 20:57:46 +08:00
ZhanGSKen
99bf53f27d 把 WinBoll 改为 WinBoLL 2025-05-04 20:08:37 +08:00
ZhanGSKen
ddb6b53189 Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-04 19:49:28 +08:00
ZhanGSKen
ae8da772c0 常驻通知栏UI优化。 2025-05-03 20:50:53 +08:00
ZhanGSKen
b2555ebfd3 类库升级,源码编译整理。 2025-05-03 20:48:33 +08:00
ZhanGSKen
82d9aabf33 Merge remote-tracking branch 'origin/appbase' into mymessagemanager 2025-05-03 16:50:15 +08:00
ZhanGSKen
e045bbb71c Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-02 06:16:49 +08:00
ZhanGSKen
d5782da040 Merge remote-tracking branch 'origin/appbase' into contacts 2025-05-02 06:12:40 +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
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
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
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
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
447 changed files with 6238 additions and 3645 deletions

3
.gitmodules vendored
View File

@@ -1,3 +1,6 @@
[submodule "libjc/jcc/libs"]
path = libjc/jcc/libs
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已经提交了所有代码就执行标签和应用发布操作
# 预先询问是否添加工作流标签
echo "Add Github Workflows Tag? (yes/No)"
result=$(askAddWorkflowsTag)
nAskAddWorkflowsTag=$?
echo $result
#echo "Add Github Workflows Tag? (yes/No)"
#result=$(askAddWorkflowsTag)
#nAskAddWorkflowsTag=$?
#echo $result
# 发布应用
echo "Publishing WinBoLL APK ..."
@@ -138,17 +138,17 @@ if [[ $? -eq 0 ]]; then
fi
# 添加 GitHub 工作流标签
if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
#if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
# 如果用户选择添加工作流标签
result=$(addWorkflowsTag $1)
if [[ $? -eq 0 ]]; then
echo $result
#result=$(addWorkflowsTag $1)
#if [[ $? -eq 0 ]]; then
# echo $result
# 工作流标签添加成功
else
echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
exit 1 # addWorkflowsTag 异常
fi
fi
#else
#echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
#exit 1 # addWorkflowsTag 异常
#fi
#fi
## 清理更新描述文件内容
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
Version 2.0, January 2004
http://www.apache.org/licenses/
Apache License
Version 2.0, January 2004
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");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,4 +1,8 @@
# ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# OriginMaster
【OriginMaster】WinBoLL 源生态计划。正如话,我需要一个 Point, 去撬动成个地球。
########
## ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
@@ -110,9 +114,11 @@
# 本项目要实际运用需要注意以下几个步骤:
# 在项目根目录下:
## 1. 项目模块编译环境设置(必须)settings.gradle-demo 要复制为 settings.gradle并取消相应项目模块的注释。
## 2. 项目 Android SDK 编译环境设置(可选)local.properties-demo 要复制为 local.properties并按需要设置 Android SDK 目录。
## 3. 类库型模块编译环境设置(可选)winboll.properties-demo 要复制为 winboll.properties并按需要设置 WinBoLL Maven 库登录用户信息
## . 项目模块编译环境设置(必须)settings.gradle-demo 要复制为 settings.gradle并取消相应项目模块的注释。
## . 项目 Android SDK 编译环境设置(可选)local.properties-demo 要复制为 local.properties并按需要设置 Android SDK 目录。
## . 应用签名密钥 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 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.6"
versionName "15.9"
if(true) {
versionName = genVersionName("${versionName}")
}

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Mon May 12 18:10:02 HKT 2025
stageCount=3
#Thu Jun 19 20:42:40 HKT 2025
stageCount=2
libraryProject=libaes
baseVersion=15.6
publishVersion=15.6.2
baseVersion=15.9
publishVersion=15.9.1
buildCount=0
baseBetaVersion=15.6.3
baseBetaVersion=15.9.2

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.aes;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/24 23:52:29
* @Describe AES应用介绍窗口
*/
@@ -79,11 +79,11 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity
appInfo.setAppName("AES");
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
appInfo.setAppDescription("AES Description");
appInfo.setAppGitName("APP");
appInfo.setAppGitName("APPBase");
appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(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.setAppAPKFolderName("AES");
//appInfo.setIsAddDebugTools(false);

View File

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

View File

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

View File

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

View File

@@ -1,8 +1,8 @@
#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
libraryProject=
baseVersion=15.0
publishVersion=15.0.0
buildCount=21
buildCount=27
baseBetaVersion=15.0.1

View File

@@ -24,7 +24,7 @@ android {
defaultConfig {
applicationId "cc.winboll.studio.androidxdemo"
minSdkVersion 24
targetSdkVersion 29
targetSdkVersion 30
versionCode 1
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
@@ -67,7 +67,7 @@ dependencies {
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0'
api 'cc.winboll.studio:libaes:15.2.6'
api 'cc.winboll.studio:libapputils:15.2.2'
api 'cc.winboll.studio:libappbase:15.2.2'
api 'cc.winboll.studio:libaes:15.8.0'
api 'cc.winboll.studio:libapputils:15.8.2'
api 'cc.winboll.studio:libappbase:15.8.2'
}

View File

@@ -1,8 +1,8 @@
#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
libraryProject=
baseVersion=15.0
publishVersion=15.0.0
buildCount=18
buildCount=26
baseBetaVersion=15.0.1

View File

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

View File

@@ -30,7 +30,7 @@ android {
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.7"
versionName "15.8"
if(true) {
versionName = genVersionName("${versionName}")
}

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Sat May 03 10:32:21 GMT 2025
stageCount=7
#Mon Jun 09 09:38:19 HKT 2025
stageCount=9
libraryProject=libappbase
baseVersion=15.7
publishVersion=15.7.6
buildCount=4
baseBetaVersion=15.7.7
baseVersion=15.8
publishVersion=15.8.8
buildCount=0
baseBetaVersion=15.8.9

View File

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

View File

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

View File

@@ -11,6 +11,7 @@ import android.widget.CheckBox;
import android.widget.Toolbar;
import cc.winboll.studio.appbase.R;
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.TestDemoBindService;
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.GlobalCrashActivity;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.widgets.StatusWidget;
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";
@@ -38,7 +40,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
}
Toolbar mToolbar;
//LogView mLogView;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -51,29 +52,25 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
cbIsDebugMode.setChecked(GlobalApplication.isDebuging());
//mLogView = findViewById(R.id.activitymainLogView1);
// if (GlobalApplication.isDebuging()) {
// mLogView.start();
// ToastUtils.show("LogView start.");
// }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu);
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
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。
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
super.onDestroy();
@@ -87,7 +84,7 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
GlobalApplication.setIsDebuging(isDebuging);
GlobalApplication.saveDebugStatus();
}
public void onPreviewGlobalCrashActivity(View view) {
Intent intent = new Intent(this, GlobalCrashActivity.class);
intent.putExtra(CrashHandler.EXTRA_CRASH_INFO, "Demo log...");
@@ -137,8 +134,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
startService(intent);
}
public void onStopTestDemoService(View view) {
Intent intent = new Intent(this, TestDemoService.class);
@@ -179,5 +174,10 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class);
}
@Override
protected void onResume() {
super.onResume();
}
}

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/25 11:46:40
* @Describe 测试窗口2
*/
@@ -12,11 +12,10 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Toolbar;
import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.WinBoLLActivityBase;
import cc.winboll.studio.libappbase.GlobalApplication;
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";
@@ -67,16 +66,11 @@ public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivit
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu);
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
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。
return super.onOptionsItemSelected(item);
}

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/25 05:04:22
*/
import android.app.Activity;
@@ -11,11 +11,10 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Toolbar;
import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.WinBoLLActivityBase;
import cc.winboll.studio.libappbase.GlobalApplication;
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";
@@ -65,16 +64,11 @@ public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu);
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
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。
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;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/14 03:51:40
*/
import android.os.Handler;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.appbase.services;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 06:56:41
* @Describe 拨号主服务
* 参考:
@@ -18,15 +18,16 @@ import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
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.models.MainServiceBean;
import cc.winboll.studio.appbase.receivers.MainReceiver;
import cc.winboll.studio.appbase.services.AssistantService;
import cc.winboll.studio.appbase.threads.MainServiceThread;
import cc.winboll.studio.appbase.widgets.APPNewsWidget;
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 cc.winboll.studio.libappbase.sos.APPModel;
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(...)");
// 清理旧的绑定链接
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);
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());
sendBroadcast(intentWidget);
}
@@ -212,7 +213,7 @@ public class MainService extends Service {
ComponentName mComponentName;
boolean isBindToAPP(APPModel bean) {
boolean isBindToAPP(WinBoLLModel bean) {
return mComponentName != null
&& mComponentName.getClassName().equals(bean.getAppMainServiveName())
&& mComponentName.getPackageName().equals(bean.getAppPackageName());

View File

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

View File

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

View File

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

View File

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

View File

@@ -32,13 +32,19 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, WinBoLL!"/>
<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但可能需要注意兼容性和配置问题。"/>
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连接问题。"/>
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -211,6 +217,5 @@
</LinearLayout>
</ScrollView>
</LinearLayout>

View File

@@ -1,6 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
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>

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

@@ -29,7 +29,7 @@ android {
// versionName 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.3"
versionName "15.8"
if(true) {
versionName = genVersionName("${versionName}")
}

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Tue Apr 29 15:04:17 HKT 2025
#Tue Jun 03 15:05:48 HKT 2025
stageCount=5
libraryProject=libapputils
baseVersion=15.3
publishVersion=15.3.4
baseVersion=15.8
publishVersion=15.8.4
buildCount=0
baseBetaVersion=15.3.5
baseBetaVersion=15.8.5

View File

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

View File

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

View File

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

View File

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

View File

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

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,7 +1,7 @@
package cc.winboll.studio.autoinstaller;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/04/28 02:39:58
* @Describe 全局应用类
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/15 09:24:46
* @Describe 磁贴工具服务类
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller.models;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/02 20:50:29
* @Describe 监控的 APK 安装文件对应的应用信息数据模型
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller.models;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/05/27 17:36:01
* @Describe 应用配置数据类
*/

View File

@@ -5,7 +5,7 @@ import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/15 09:27:39
* @Describe MainServiceBean
*/

View File

@@ -9,7 +9,7 @@ import cc.winboll.studio.autoinstaller.services.MainService;
import cc.winboll.studio.libappbase.LogUtils;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/06/06 13:19:38
* @Describe 应用消息接收类
*/

View File

@@ -10,7 +10,7 @@ import cc.winboll.studio.autoinstaller.models.AppConfigs;
import cc.winboll.studio.autoinstaller.utils.ServiceUtil;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/05/27 20:16:00
* @Describe MainService 守护进程服务
*/

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.autoinstaller.utils;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/12/11 06:28:50
* @Describe 一个获取安卓APK安装文件的应用包名的函数
*/

View File

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

View File

@@ -72,7 +72,7 @@ allprojects {
bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh"
winbollFilePath = "winboll.properties"
keyPropsFilePath = "current.keystore"
keyPropsFilePath = "appkey.keystore"
// 定义 lint 输出文件
lintXmlReportFilePath = "build/reports/lint-results.xml"
lintHTMLReportFilePath = "build/reports/lint-results.html"

View File

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

View File

@@ -24,12 +24,12 @@ android {
defaultConfig {
applicationId "cc.winboll.studio.contacts"
minSdkVersion 24
targetSdkVersion 29
targetSdkVersion 30
versionCode 1
// versionName 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.2"
versionName "15.3"
if(true) {
versionName = genVersionName("${versionName}")
}
@@ -45,6 +45,9 @@ android {
dependencies {
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
api 'com.github.getActivity:XXPermissions:18.63'
@@ -81,8 +84,4 @@ dependencies {
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated: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
#Sun Apr 13 02:46:09 HKT 2025
stageCount=8
#Tue May 20 13:02:18 HKT 2025
stageCount=3
libraryProject=
baseVersion=15.2
publishVersion=15.2.7
baseVersion=15.3
publishVersion=15.3.2
buildCount=0
baseBetaVersion=15.2.8
baseBetaVersion=15.3.3

View File

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

View File

@@ -1,13 +1,13 @@
package cc.winboll.studio.contacts;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/12/08 15:10:51
* @Describe 全局应用类
*/
import android.view.Gravity;
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;
public class App extends GlobalApplication {
@@ -20,8 +20,8 @@ public class App extends GlobalApplication {
// 这样可以预先设置日志与数据的存储根目录。
//setIsDebuging(BuildConfig.DEBUG);
super.onCreate();
// 设置 WinBoll 应用 UI 类型
WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication);
// 设置 WinBoLL 应用 UI 类型
getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Aplication);
//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.LogFragment;
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.LogView;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList;
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 int REQUEST_HOME_ACTIVITY = 0;
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;
LogView mLogView;
@@ -71,10 +70,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
private static final int DIALER_REQUEST_CODE = 1;
@Override
public Activity getActivity() {
return this;
}
// @Override
// public Activity getActivity() {
// return this;
// }
// @Override
// public APPInfo getAppInfo() {
@@ -95,6 +94,17 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// return null;
// }
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回
@@ -111,7 +121,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// // 显示后退按钮
// getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// }
getSupportActionBar().setSubtitle(getTag());
getSupportActionBar().setSubtitle(TAG);
tabLayout = findViewById(R.id.tabLayout);
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)) {
// try {
// WinBollActivity clazzActivity = UnitTestActivity.class.newInstance();
// WinBoLLActivity clazzActivity = UnitTestActivity.class.newInstance();
// String tag = clazzActivity.getTag();
// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag);
// 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()));
// //startWinBollActivity(subIntent, tag);
// WinBollActivityManager.getInstance(this).startWinBollActivity(this, subIntent, UnitTestActivity.class);
// //startWinBoLLActivity(subIntent, tag);
// WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, subIntent, UnitTestActivity.class);
// } catch (IllegalAccessException | InstantiationException | IOException e) {
// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// // 函数处理异常返回失败
@@ -371,10 +381,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// return true;
// }
@Override
public String getTag() {
return TAG;
}
// @Override
// public String getTag() {
// return TAG;
// }
// @Override
// public void onBackPressed() {
@@ -386,7 +396,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
//
// @Override
// public void onYes() {
// WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
// WinBoLLActivityManager.getInstance(getApplicationContext()).finishAll();
// }
//
// @Override
@@ -408,7 +418,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
if (item.getItemId() == R.id.item_settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class);
//WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, CallActivity.class);
}
// } else
// if (item.getItemId() == R.id.item_exit) {

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/21 05:37:42
*/
import android.content.Context;
@@ -24,6 +24,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.App;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter;
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.services.MainService;
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.winboll.IWinBollActivity;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import com.hjq.toast.ToastUtils;
import java.lang.reflect.Field;
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";
@@ -177,6 +176,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
etDunResumeSecondCount.setEnabled(!isEnableDun);
etDunResumeCount.setEnabled(!isEnableDun);
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
}
public static void notifyDunInfoUpdate() {
@@ -201,6 +202,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
settingsModel.setIsEnableDun(isEnableDun);
Rules.getInstance(this).saveDun();
Rules.getInstance(this).reload();
// 重新加载盾牌参数
etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
}
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) {
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);
new Thread(new Runnable() {
@Override
@@ -247,8 +264,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
}).start();
}
public void onSearchBoBullToonPhone(View view) {
TomCat tomCat = TomCat.getInstance(this);
EditText etPhone = findViewById(R.id.activitysettingsEditText1);
@@ -311,8 +326,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
}
}
}
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;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 16:07:04
*/
public class UnitTestActivity extends Activity {

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/31 15:16:45
* @Describe 应用窗口基类
*/
@@ -11,9 +11,9 @@ import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.libaes.beans.AESThemeBean;
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";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.dun;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/21 06:15:10
* @Describe 云盾防御规则
*/
@@ -18,6 +18,7 @@ import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Pattern;
import cc.winboll.studio.contacts.bobulltoon.TomCat;
public class Rules {
@@ -84,6 +85,20 @@ public class Rules {
PhoneConnectRuleModel.saveBeanList(mContext, _PhoneConnectRuleModelList, PhoneConnectRuleModel.class);
}
public void resetDefaultBoBullToonURL() {
mSettingsModel.setBoBullToon_URL(TomCat.getInstance(mContext).getDefaultBobulltoonUrl());
saveDun();
}
public void setBoBullToonURL(String szUrl) {
mSettingsModel.setBoBullToon_URL(szUrl);
saveDun();
}
public String getBoBullToonURL() {
return mSettingsModel.getBoBullToon_URL();
}
public void loadDun() {
mSettingsModel = SettingsModel.loadBean(mContext, SettingsModel.class);
if (mSettingsModel == null) {
@@ -109,8 +124,12 @@ public class Rules {
boolean isDefend = false; // 盾牌是否生效
boolean isConnect = true; // 防御结果是否连接
// 进行盾牌层数预计缩减计算
int nDunCurrentCount = mSettingsModel.getDunCurrentCount() - 1;
LogUtils.d(TAG, String.format("nDunCurrentCount : %d", nDunCurrentCount));
// 如果盾值小于1则解除防御
if (!isDefend && mSettingsModel.getDunCurrentCount() < 1) {
if (!isDefend && nDunCurrentCount < 1) {
// 盾层为1以下防御解除
LogUtils.d(TAG, "盾层为1以下防御解除");
isDefend = true;
@@ -174,17 +193,17 @@ public class Rules {
// 就减少防御盾牌层数。
// 每校验一次规则云盾防御层数减1
// 当云盾防御层数为0时再次进行以下程序段则恢复满值防御。
int newDunCount = mSettingsModel.getDunCurrentCount() - 1;
int newDunCount = nDunCurrentCount;
LogUtils.d(TAG, String.format("新的防御层数预计为 %d", newDunCount));
// 保证盾值在[0DunTotalCount]之内其他值一律重置为 DunTotalCount。
if (newDunCount < 0 || newDunCount > mSettingsModel.getDunTotalCount()) {
mSettingsModel.setDunCurrentCount(mSettingsModel.getDunTotalCount());
LogUtils.d(TAG, String.format("盾值不在[0%d]区间,恢复防御最大值%d", mSettingsModel.getDunTotalCount(), mSettingsModel.getDunTotalCount()));
} else {
// 保证盾值在[1DunTotalCount]之内其他值一律重置为 DunTotalCount。
if (newDunCount > 0 && newDunCount < mSettingsModel.getDunTotalCount()) {
mSettingsModel.setDunCurrentCount(newDunCount);
LogUtils.d(TAG, String.format("设置防御层数为 %d", newDunCount));
}
} else {
mSettingsModel.setDunCurrentCount(mSettingsModel.getDunTotalCount());
LogUtils.d(TAG, String.format("盾值不在[0%d]区间,恢复防御最大值%d", mSettingsModel.getDunTotalCount(), mSettingsModel.getDunTotalCount()));
}
saveDun();
SettingsActivity.notifyDunInfoUpdate();

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.fragments;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/20 12:57:00
* @Describe 拨号
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.fragments;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/20 12:57:50
* @Describe 联系人
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.fragments;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/20 12:58:15
* @Describe 应用日志
*/

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.receivers;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 06:58:04
* @Describe 主要广播接收器
*/

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.services;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/13 06:56:41
* @Describe 拨号主服务
* 参考:
@@ -18,6 +18,7 @@ import android.content.ServiceConnection;
import android.media.AudioManager;
import android.os.Binder;
import android.os.IBinder;
import cc.winboll.studio.contacts.App;
import cc.winboll.studio.contacts.beans.MainServiceBean;
import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.contacts.bobulltoon.TomCat;
@@ -29,11 +30,9 @@ import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.contacts.threads.MainServiceThread;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.winboll.WinBoLL;
import java.util.Timer;
import java.util.TimerTask;
import cc.winboll.studio.libappbase.sos.WinBoll;
import cc.winboll.studio.contacts.App;
import cc.winboll.studio.libappbase.sos.APPModel;
public class MainService extends Service {
@@ -129,11 +128,11 @@ public class MainService extends Service {
isServiceRunning = true;
// 唤醒守护进程
wakeupAndBindAssistant();
// 召唤 WinBoll APP 绑定本服务
// 召唤 WinBoLL APP 绑定本服务
if (App.isDebuging()) {
WinBoll.bindToAPPBaseBeta(this, MainService.class.getName());
WinBoLL.bindToAPPBaseBeta(this, MainService.class.getName());
} else {
WinBoll.bindToAPPBase(this, MainService.class.getName());
WinBoLL.bindToAPPBase(this, MainService.class.getName());
}
// 初始化服务运行参数

View File

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

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.utils;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/06 21:08:16
* @Describe ContactUtils
*/

View File

@@ -3,7 +3,7 @@ import android.widget.EditText;
import cc.winboll.studio.libappbase.LogUtils;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/13 00:59:13
* @Describe Int类型数字输入框工具集
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.utils;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/04/13 01:16:28
* @Describe Int数字操作工具集
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.utils;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/02/26 15:21:48
* @Describe PhoneUtils
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.utils;
/**
* @Author ZhanGSKen@QQ.COM
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2024/12/09 19:00:21
* @Describe .* 前置预防针
regex pointer preventive injection

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.views;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 21:11:03
* @Describe 云盾防御信息
*/

View File

@@ -1,7 +1,7 @@
package cc.winboll.studio.contacts.views;
/**
* @Author ZhanGSKen@AliYun.Com
* @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/04 10:51:50
* @Describe CustomHorizontalScrollView
*/

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