Compare commits

..

441 Commits

Author SHA1 Message Date
ZhanGSKen
32a0e47c87 <appbase>APK 15.7.3 release Publish. 2025-04-28 21:17:52 +08:00
ZhanGSKen
82af906fed <appbase>APK 15.7.2 release Publish. 2025-04-28 21:14:11 +08:00
ZhanGSKen
d13a8a445e <appbase>APK 15.7.1 release Publish. 2025-04-28 21:13:53 +08:00
ZhanGSKen
6d02c9fc49 <appbase>APK 15.7.0 release Publish. 2025-04-28 21:13:29 +08:00
ZhanGSKen
10a8c2c1ed <appbase>Start New Stage Version. 2025-04-28 21:08:18 +08:00
ZhanGSKen
bff0ec4e57 设定版本号 2025-04-28 21:07:08 +08:00
ZhanGSKen
aa101977f0 把 WinBoll 名称改为 WinBoLL 2025-04-28 21:04:17 +08:00
ZhanGSKen
a88e1b2d99 git repos fix 2025-04-28 20:12:28 +08:00
ZhanGSKen
363fa0c3b3 <appbase>Start New Stage Version. 2025-04-28 20:06:05 +08:00
ZhanGSKen
ebb0df2a74 <appbase>Start New Stage Version. 2025-04-28 20:05:46 +08:00
ZhanGSKen
ed193119f6 设定版本号(baseBetaVersion 版本要比publishVersion 版本加多 1 个版本) 2025-04-28 00:36:58 +08:00
ZhanGSKen
f4a054663e 设定版本号 2025-04-27 21:02:50 +08:00
ZhanGSKen
d17dd8073d 编译测试 2025-04-27 21:00:31 +08:00
ZhanGSKen
7150974d01 根目录 Gradle 配置回复,移除就的秘钥配置文件。 2025-04-27 20:42:01 +08:00
ZhanGSKen
c2794e7322 回复先前版本 2025-04-27 20:28:37 +08:00
ZhanGSKen
4737ce92e1 <apputils>Start New Stage Version. 2025-04-27 11:14:42 +08:00
ZhanGSKen
839bf72eca <libappbase>Library Release 15.4.8 2025-04-27 11:03:44 +08:00
ZhanGSKen
3f2ec872f8 <appbase>APK 15.4.8 release Publish. 2025-04-27 11:03:35 +08:00
ZhanGSKen
b62cbc043b 移除类库依赖 2025-04-27 11:02:06 +08:00
ZhanGSKen
d0e7f1f56c <libappbase>Library Release 15.4.7 2025-04-27 10:06:01 +08:00
ZhanGSKen
39fe25f34f <appbase>APK 15.4.7 release Publish. 2025-04-27 10:05:40 +08:00
ZhanGSKen
94f444d6c7 更新版本号 2025-04-27 10:05:16 +08:00
ZhanGSKen
33952a90de <appbase>APK 15.2.6 release Publish. 2025-04-27 10:02:38 +08:00
ZhanGSKen
4c1fece9f0 更新秘钥配置方式 2025-04-27 09:59:15 +08:00
ZhanGSKen
b60de856ca Merge branch 'appbase' into winboll 2025-04-26 21:16:41 +08:00
ZhanGSKen
37d5d1efe0 更新秘钥配置方式,更新APK文件输出目录,更新说明书。 2025-04-26 20:29:31 +08:00
ZhanGSKen
c11102d729 开发者联系邮箱 2025-04-26 19:16:10 +08:00
ZhanGSKen
6cc04f8e6f 修正说明书标题部分 2025-04-26 17:52:58 +08:00
ZhanGSKen
2bc7db1dca 将appbase子项目拷贝为winboll子项目。 2025-04-24 20:19:19 +08:00
ZhanGSKen
96f31e252c 设置类库资源地址引用顺序。 2025-04-24 20:11:58 +08:00
ZhanGSKen
f9bfdd3de8 Merge branch 'app_important_fix' into appbase 2025-04-13 03:04:52 +08:00
ZhanGSKen
0f787de4d9 <contacts>APK 15.2.7 release Publish. 2025-04-13 02:46:10 +08:00
ZhanGSKen
c476792d7c 定义云盾参数有效区域值 2025-04-13 02:04:48 +08:00
ZhanGSKen
ee421d1019 Merge branch 'contacts' into app_important_fix 2025-04-13 00:45:42 +08:00
ZhanGSKen
cd277497a3 Merge remote-tracking branch 'origin/contacts' into appbase 2025-04-13 00:45:11 +08:00
ZhanGSKen
29300da793 <appbase>APK 15.2.5 release Publish. 2025-04-12 15:06:52 +08:00
ZhanGSKen
74bfb6d227 <appbase>APK 15.2.4 release Publish. 2025-04-12 15:00:29 +08:00
ZhanGSKen
43af33c21d <appbase>APK 15.2.3 release Publish. 2025-04-12 14:57:53 +08:00
ZhanGSKen
8452680514 更换 BoBullToon 数据请求地址 2025-04-12 12:26:08 +08:00
ZhanGSKen
1338e1a6a5 疑似APP模块项目命名问题,系统出现病毒报错。现在移除该模块项目。 2025-04-11 12:28:20 +08:00
ZhanGSKen
398db803cf Merge branch 'app' into appbase 2025-04-11 12:23:47 +08:00
ZhanGSKen
39cb0bfe36 <app>APK 15.0.3 release Publish. 2025-04-11 12:16:58 +08:00
ZhanGSKen
84fa0005b8 <app>APK 15.0.2 release Publish. 2025-04-11 12:12:12 +08:00
ZhanGSKen
e2bccd3a7c APP_15.0.1.apk版本,手机系统发出病毒报错。现在重新编译扫毒检查。再次发布。 2025-04-11 12:05:28 +08:00
ZhanGSKen
0f8e66506e 清理过期项目 2025-04-08 01:03:07 +08:00
ZhanGSKen
d8f9545ed2 Merge branch 'positions' into appbase 2025-04-08 01:01:36 +08:00
ZhanGSKen
ce75de5a68 项目源码停止公开发布。列入私有应用项目计划。 2025-04-08 00:43:04 +08:00
ZhanGSKen
0ed96d6a33 重新排版任务提醒总开关位置 2025-04-08 00:14:39 +08:00
ZhanGSKen
5774c1484d 调整任务列表高度。 2025-04-07 19:07:31 +08:00
ZhanGSKen
f251fe5326 添加任务列表附加功能按钮 2025-04-07 13:59:41 +08:00
ZhanGSKen
5d15b11282 设计单一任务数据模型 2025-04-07 13:57:14 +08:00
ZhanGSKen
f85af921d7 添加Task UI 简要设计 2025-04-05 18:06:34 +08:00
ZhanGSKen
3db85b9878 位置项添加功能测试完成 2025-04-05 15:05:37 +08:00
ZhanGSKen
489bc87959 解决LeftScrollView内容宽度设置问题,使用parent.getMeasuredWidth()解决。 2025-04-05 14:21:15 +08:00
ZhanGSKen
029d4193e1 位置项编辑框UI优化 2025-04-05 13:44:47 +08:00
ZhanGSKen
4cafbae077 精简源码,位置列表框UI优化 2025-04-05 12:32:46 +08:00
ZhanGSKen
4b9f34b946 修复列表项宽度初始化问题 2025-04-05 10:52:24 +08:00
ZhanGSKen
5cb4f6c409 更换类库,解决编译报错问题。 2025-04-04 13:22:41 +08:00
ZhanGSKen
f9e48a159d 添加位置模型数据添加功能 2025-04-03 21:25:09 +08:00
ZhanGSKen
65f182c235 调整定位显示和提示。 2025-04-03 19:20:22 +08:00
ZhanGSKen
d9bf0f2297 添加腾讯地图定位按钮 2025-04-03 14:42:48 +08:00
ZhanGSKen
d025fb4f13 更新定位服务数据请求结构 2025-04-03 14:11:40 +08:00
ZhanGSKen
58ae10f93d 更新类库 2025-04-03 11:20:00 +08:00
ZhanGSKen
2e02cd3553 Merge remote-tracking branch 'origin/aes' into appbase 2025-04-03 11:18:22 +08:00
ZhanGSKen
af48d36e7d Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-04-03 11:18:15 +08:00
ZhanGSKen
e0c754a056 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-04-03 11:18:08 +08:00
ZhanGSKen
e65e184077 更新类库 2025-04-03 11:17:39 +08:00
ZhanGSKen
4cbd57704b 更新类库 2025-04-03 11:16:20 +08:00
ZhanGSKen
09b8e9b034 <libaes>Library Release 15.2.6 2025-04-03 11:14:12 +08:00
ZhanGSKen
4449fe6598 <aes>APK 15.2.6 release Publish. 2025-04-03 11:13:53 +08:00
ZhanGSKen
1e2661f640 更新至精简应用介绍模块资源后的类库 2025-04-03 11:13:05 +08:00
ZhanGSKen
1d2b595859 添加应用介绍窗口调试工具添加开关 2025-04-03 11:04:06 +08:00
ZhanGSKen
89f8404dc9 清理源码 2025-04-03 02:34:51 +08:00
ZhanGSKen
8011456fc1 Merge remote-tracking branch 'origin/apputils' into appbase 2025-04-02 20:24:06 +08:00
ZhanGSKen
1254c51ef8 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-04-02 20:23:33 +08:00
ZhanGSKen
4ea010ab21 类库引用方法更新 2025-04-02 20:23:01 +08:00
ZhanGSKen
f4d21d7b1a Merge remote-tracking branch 'origin/aes' into appbase 2025-04-02 20:15:59 +08:00
ZhanGSKen
030012476f Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-04-02 20:15:49 +08:00
ZhanGSKen
652cc2fb81 更新类库,添加吐司示例 2025-04-02 20:14:49 +08:00
ZhanGSKen
4afc4aafa9 <libaes>Library Release 15.2.5 2025-04-02 20:09:13 +08:00
ZhanGSKen
bd6eae16e3 <aes>APK 15.2.5 release Publish. 2025-04-02 20:08:50 +08:00
ZhanGSKen
5b82baead5 修改吐司提示风格 2025-04-02 20:05:52 +08:00
ZhanGSKen
a9ce480f9f 服务器 Http访问验证部分代码整理 2025-04-02 19:44:42 +08:00
ZhanGSKen
ce1a2715f9 移除冗余示例 2025-04-02 09:41:41 +08:00
ZhanGSKen
0052023037 Merge remote-tracking branch 'origin/app' into appbase 2025-04-02 09:40:42 +08:00
ZhanGSKen
fcbe812f89 移除过期应用示例 2025-04-02 09:40:04 +08:00
ZhanGSKen
05806ccef1 更新类库 2025-04-01 21:16:04 +08:00
ZhanGSKen
18e1369534 Merge remote-tracking branch 'origin/appbase' into positions 2025-04-01 21:08:44 +08:00
ZhanGSKen
3ce6746e50 <contacts>APK 15.2.6 release Publish. 2025-04-01 17:48:43 +08:00
ZhanGSKen
c06b157332 更新应用介绍窗口标题栏风格 2025-04-01 17:47:31 +08:00
ZhanGSKen
6b57d65ef4 <app>APK 15.0.1 release Publish. 2025-04-01 13:50:28 +08:00
ZhanGSKen
7fa2c658b6 <app>APK 15.0.0 release Publish. 2025-04-01 13:47:21 +08:00
ZhanGSKen
96f5a892d5 设置应用介绍 2025-04-01 13:43:42 +08:00
ZhanGSKen
d977b8fe28 更新类库,重新初始化项目。 2025-04-01 13:38:23 +08:00
ZhanGSKen
693f7f48a7 更新Git仓库与用户信息描述部分信息。 2025-04-01 10:44:29 +08:00
ZhanGSKen
1f8f7fd405 <contacts>APK 15.2.5 release Publish. 2025-03-31 19:51:50 +08:00
ZhanGSKen
60ddae0950 更新类库,修复应用简介窗口设置应用调试模式没有保存的问题。 2025-03-31 19:51:02 +08:00
ZhanGSKen
3d23a095fe Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-03-31 19:47:30 +08:00
ZhanGSKen
f13caa90ff Merge remote-tracking branch 'origin/aes' into appbase 2025-03-31 19:47:11 +08:00
ZhanGSKen
c7677764a3 Merge branch 'appbase' of https://gitea.winboll.cc/Studio/APP.git into appbase 2025-03-31 19:43:28 +08:00
ZhanGSKen
57114f76fe 更新类库 2025-03-31 19:42:43 +08:00
ZhanGSKen
7fd10086eb <libaes>Library Release 15.2.4 2025-03-31 19:41:27 +08:00
ZhanGSKen
d65dc665a0 <aes>APK 15.2.4 release Publish. 2025-03-31 19:41:08 +08:00
ZhanGSKen
2f22b6602b 修复应用介绍页调试模式设置没有保存的问题。 2025-03-31 19:39:51 +08:00
ZhanGSKen
79b680f9f3 <contacts>APK 15.2.4 release Publish. 2025-03-31 15:43:06 +08:00
ZhanGSKen
f572c488e6 修改调试模式配置方法 2025-03-31 15:42:33 +08:00
ZhanGSKen
a018958899 <contacts>APK 15.2.3 release Publish. 2025-03-31 15:25:52 +08:00
ZhanGSKen
87dfa4872d <contacts>APK 15.2.2 release Publish. 2025-03-31 15:25:32 +08:00
ZhanGSKen
935a663cee 在设置窗口里添加应用介绍按钮 2025-03-31 15:23:41 +08:00
ZhanGSKen
6a6a6ad051 添加二级窗口后退按钮响应 2025-03-31 14:37:29 +08:00
ZhanGSKen
ea3f0190a8 加入最新aes源码 2025-03-31 14:23:27 +08:00
ZhanGSKen
c47639484d <contacts>APK 15.2.1 release Publish. 2025-03-31 13:11:08 +08:00
ZhanGSKen
f053218932 添加通话记录数据更新功能。在长期打开主窗口后,通话记录可以实时更新。 2025-03-31 13:07:40 +08:00
ZhanGSKen
bec4041b87 修复日志视图再打开第二个日志后,第一个日志回显时停顿问题。 2025-03-31 12:09:46 +08:00
ZhanGSKen
0d540c422e 更新类库 2025-03-31 12:05:11 +08:00
ZhanGSKen
5e4f831d00 Merge remote-tracking branch 'origin/appbase' into androidxdemo 2025-03-31 12:01:58 +08:00
ZhanGSKen
2a4c4be5c6 Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-03-31 12:01:35 +08:00
ZhanGSKen
ba2f5c4037 更新适配系统版本范围,更新类库。 2025-03-31 11:58:52 +08:00
ZhanGSKen
62b39988fd Merge remote-tracking branch 'origin/appbase' into contacts 2025-03-31 11:50:44 +08:00
ZhanGSKen
58a232fd48 <libaes>Library Release 15.2.3 2025-03-31 02:04:53 +08:00
ZhanGSKen
de1b3657f8 <aes>APK 15.2.3 release Publish. 2025-03-31 02:04:35 +08:00
ZhanGSKen
6b70019208 服务访问属性调整 2025-03-31 02:03:57 +08:00
ZhanGSKen
641cc0d828 <libaes>Library Release 15.2.2 2025-03-31 00:48:11 +08:00
ZhanGSKen
89ee16a69f <aes>APK 15.2.2 release Publish. 2025-03-31 00:47:52 +08:00
ZhanGSKen
4f44034b72 完成服务器连接与断开逻辑 2025-03-31 00:46:16 +08:00
ZhanGSKen
9d37de4bfc 服务连接函数重构 2025-03-30 14:08:17 +08:00
ZhanGSKen
619fd39a92 调整调试信息 2025-03-30 04:08:09 +08:00
ZhanGSKen
d51ebbd550 调试网站状态图标调试完成 2025-03-30 03:59:55 +08:00
ZhanGSKen
d474eb6158 开发站与公开站API接口调试完成 2025-03-30 01:36:24 +08:00
ZhanGSKen
b1e2a018d8 完善应用介绍页UI风格 2025-03-30 01:01:09 +08:00
ZhanGSKen
81d538589f 初步完成服务访问连接 2025-03-29 17:34:01 +08:00
ZhanGSKen
2870ca911c 改进类库引用方法 2025-03-29 12:37:13 +08:00
ZhanGSKen
d87fac0270 Merge remote-tracking branch 'origin/androidxdemo' into androiddemo 2025-03-29 12:32:57 +08:00
ZhanGSKen
4e04d022fa Merge remote-tracking branch 'origin/appbase' into androiddemo 2025-03-29 12:32:51 +08:00
ZhanGSKen
ec107dfebf 更新类库和类库引用次序。 2025-03-29 12:29:54 +08:00
ZhanGSKen
141e01b4df <libapputils>Library Release 15.2.1 2025-03-29 12:15:01 +08:00
ZhanGSKen
a3994ccd07 <apputils>APK 15.2.1 release Publish. 2025-03-29 12:14:39 +08:00
ZhanGSKen
2154f5e4a2 移除应用介绍冗余代码,应用介绍所有资源文件已移至AES项目。 2025-03-29 12:13:32 +08:00
ZhanGSKen
0735783811 <libaes>Library Release 15.2.1 2025-03-29 12:08:10 +08:00
ZhanGSKen
156329707d <aes>APK 15.2.1 release Publish. 2025-03-29 12:07:46 +08:00
ZhanGSKen
3835800d24 类库引用版本调整测试 2025-03-29 12:06:17 +08:00
ZhanGSKen
b0e53d1691 <libappbase>Library Release 15.2.2 2025-03-29 11:28:08 +08:00
ZhanGSKen
9b882d14ab <appbase>APK 15.2.2 release Publish. 2025-03-29 11:27:54 +08:00
ZhanGSKen
1074a47ae7 编译参数修复,BugFix. 2025-03-29 11:27:06 +08:00
ZhanGSKen
721a4034dd <libappbase>Library Release 15.2.1 2025-03-29 11:20:41 +08:00
ZhanGSKen
07959be091 <appbase>APK 15.2.1 release Publish. 2025-03-29 11:20:21 +08:00
ZhanGSKen
3e1531d356 BugFix 2025-03-29 11:19:35 +08:00
ZhanGSKen
82d8cd7f17 <contacts>APK 15.2.0 release Publish. 2025-03-29 09:34:54 +08:00
ZhanGSKen
5465b8eb34 编译测试 2025-03-29 09:34:09 +08:00
ZhanGSKen
35d7716778 编译参数修复 2025-03-29 09:33:05 +08:00
ZhanGSKen
256b9ec99c 设置版本号 2025-03-29 09:22:32 +08:00
ZhanGSKen
2aacb0e70d <contacts>APK 15.2.22 release Publish. 2025-03-29 09:16:58 +08:00
ZhanGSKen
266009de85 Merge remote-tracking branch 'origin/appbase' into contacts 2025-03-29 09:15:52 +08:00
ZhanGSKen
1a571684ca 更新类库版本 2025-03-29 09:13:14 +08:00
ZhanGSKen
5d796c4aba <libaes>Library Release 15.2.0 2025-03-29 08:57:51 +08:00
ZhanGSKen
1891c24d4f <aes>APK 15.2.0 release Publish. 2025-03-29 08:57:30 +08:00
ZhanGSKen
892f9f0d6c 开展新命名空间下的版本调试,更新版本号设置 2025-03-29 08:57:03 +08:00
ZhanGSKen
9f84f8b800 <libapputils>Library Release 15.2.0 2025-03-29 08:48:40 +08:00
ZhanGSKen
02e218ee88 <apputils>APK 15.2.0 release Publish. 2025-03-29 08:48:13 +08:00
ZhanGSKen
5e54f0f4c7 开展新命名空间下的版本调试 2025-03-29 08:47:02 +08:00
ZhanGSKen
4a0b58feda <libappbase>Library Release 15.2.0 2025-03-29 08:43:50 +08:00
ZhanGSKen
28ae2631a6 <appbase>APK 15.2.0 release Publish. 2025-03-29 08:43:25 +08:00
ZhanGSKen
87d23829ae 开展新命名空间下的版本调试 2025-03-29 08:42:10 +08:00
ZhanGSKen
76dabc9ef7 <libapputils>Library Release 15.0.19 2025-03-28 20:25:34 +08:00
ZhanGSKen
73ddef7738 <apputils>APK 15.0.19 release Publish. 2025-03-28 20:25:11 +08:00
ZhanGSKen
2a9ec064f9 命名空间调整 2025-03-28 20:23:58 +08:00
ZhanGSKen
07bfd44c65 <libappbase>Library Release 15.1.4 2025-03-28 20:05:54 +08:00
ZhanGSKen
32a8c0dfa1 <appbase>APK 15.1.4 release Publish. 2025-03-28 20:05:24 +08:00
ZhanGSKen
0a8707b02b 简化吐司提示 2025-03-28 19:49:30 +08:00
ZhanGSKen
6e8e32c497 <libapputils>Library Release 15.0.18 2025-03-28 18:48:49 +08:00
ZhanGSKen
abb0c1f73a <apputils>APK 15.0.18 release Publish. 2025-03-28 18:48:07 +08:00
ZhanGSKen
18fc20b4c5 Merge remote-tracking branch 'origin/appbase' into apputils 2025-03-28 18:46:37 +08:00
ZhanGSKen
9ef0b0894c 清理类库的活动窗口类到测试项目文件夹。 2025-03-28 18:35:01 +08:00
ZhanGSKen
3ef885e8c1 <libappbase>Library Release 15.1.3 2025-03-28 18:20:38 +08:00
ZhanGSKen
d9b99ee371 <appbase>APK 15.1.3 release Publish. 2025-03-28 18:20:22 +08:00
ZhanGSKen
6f7414b576 完成应用退出的菜单按钮逻辑 2025-03-28 18:10:31 +08:00
ZhanGSKen
888e2c7a4d Merge remote-tracking branch 'origin/appbase' into apputils 2025-03-28 15:51:48 +08:00
ZhanGSKen
2f6e297bab <libappbase>Library Release 15.1.2 2025-03-28 15:50:29 +08:00
ZhanGSKen
e35a6b9a7f <appbase>APK 15.1.2 release Publish. 2025-03-28 15:50:14 +08:00
ZhanGSKen
e71e5a852d 调整活动窗口基类为应用自己定义,增强窗口的AppCompatActivity特性引用。 2025-03-28 15:48:33 +08:00
ZhanGSKen
a5324d557f Merge remote-tracking branch 'origin/androiddemo' into apputils 2025-03-28 14:55:30 +08:00
ZhanGSKen
0dc38b0fa1 Merge remote-tracking branch 'origin/appbase' into apputils 2025-03-28 14:55:24 +08:00
ZhanGSKen
4ea48a051d <libappbase>Library Release 15.1.1 2025-03-28 14:53:36 +08:00
ZhanGSKen
ae680b5b48 <appbase>APK 15.1.1 release Publish. 2025-03-28 14:53:11 +08:00
ZhanGSKen
f2d8902b4c 改进类库引用方法 2025-03-28 14:29:03 +08:00
ZhanGSKen
80767ca5b5 修复编译警告问题 2025-03-28 14:25:26 +08:00
ZhanGSKen
be5ed936df 设置窗口任务栏显示信息 2025-03-28 13:57:26 +08:00
ZhanGSKen
b3075f778d 修复窗口切换问题 2025-03-28 13:45:45 +08:00
ZhanGSKen
ce05d69132 修复Support风格的应用崩溃报告窗口 2025-03-28 13:27:03 +08:00
ZhanGSKen
6a9434b194 取消窗口管理模块,修复应用崩溃调试模块。 2025-03-28 13:18:55 +08:00
ZhanGSKen
6ca7b210a6 简化配置 2025-03-28 12:17:48 +08:00
ZhanGSKen
d83d460342 调试到 _GlobalApplication 实例化次数与现有实例问题... 2025-03-27 19:06:51 +08:00
ZhanGSKen
9a53d04050 窗口判断与添加测试结束,进入resumeActivity调试阶段... 2025-03-27 14:39:26 +08:00
ZhanGSKen
ada664f4ab 添加Base工具栏 2025-03-27 12:32:24 +08:00
ZhanGSKen
92a9bbb455 整理代码 2025-03-27 11:46:36 +08:00
ZhanGSKen
211eef7232 整理代码 2025-03-27 11:46:11 +08:00
ZhanGSKen
31bad8a279 调试信息调整 2025-03-27 11:45:40 +08:00
ZhanGSKen
bc0eb69edf 增加应用适配系统范围 2025-03-27 11:44:58 +08:00
ZhanGSKen
08f990de65 添加日志窗口标签查找功能 2025-03-27 10:42:58 +08:00
ZhanGSKen
e2b6fadd43 日志分屏比例切换失效时,需要手动切换出任务栏视图再回到分屏任务窗口,这时就可以切换比例。修复了应用调出二级窗口弹出时不在原应用窗口弹出问题。 2025-03-27 01:05:52 +08:00
ZhanGSKen
2074f68ef3 日志窗口函数重构 2025-03-26 19:32:21 +08:00
ZhanGSKen
56a13b4a40 <libappbase>Library Release 15.1.0 2025-03-26 15:43:27 +08:00
ZhanGSKen
8bdd42ce68 <appbase>APK 15.1.0 release Publish. 2025-03-26 15:43:05 +08:00
ZhanGSKen
d4986c6ba4 设定使用Support V7 版安卓库的应用版本号。 2025-03-26 15:39:37 +08:00
ZhanGSKen
529f420668 精简配置 2025-03-26 15:36:49 +08:00
ZhanGSKen
b3439aa36a 添加Support库支持 2025-03-26 15:34:52 +08:00
ZhanGSKen
7488fa7af2 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-03-26 15:25:06 +08:00
ZhanGSKen
d4e4541bfd 添加AppCompatActivity类库 2025-03-26 15:24:26 +08:00
ZhanGSKen
ac627e53b1 编译参数配置确定,Log分屏测试完成。 2025-03-26 14:39:37 +08:00
ZhanGSKen
42a2e6d559 Merge remote-tracking branch 'origin/androiddemo' into appbase 2025-03-26 12:48:29 +08:00
ZhanGSKen
0d44734c0b Merge remote-tracking branch 'origin/androidxdemo' into appbase 2025-03-26 12:48:23 +08:00
ZhanGSKen
e89873046b 日志分屏方案设定完成 2025-03-26 02:02:49 +08:00
ZhanGSKen
f3ef7226d8 优化调试框架 2025-03-25 20:59:55 +08:00
ZhanGSKen
9706a39f41 WinBollActivityManager测试.. 2025-03-25 05:31:06 +08:00
ZhanGSKen
a65829a1d2 <libapputils>Library Release 15.0.17 2025-03-25 03:48:47 +08:00
ZhanGSKen
abb5d750c1 <apputils>APK 15.0.17 release Publish. 2025-03-25 03:48:30 +08:00
ZhanGSKen
dc000567cd 简化代码 2025-03-25 03:47:45 +08:00
ZhanGSKen
c3ccfd3c23 <libapputils>Library Release 15.0.16 2025-03-25 03:30:43 +08:00
ZhanGSKen
d2c649fe65 <apputils>APK 15.0.16 release Publish. 2025-03-25 03:30:22 +08:00
ZhanGSKen
3b61a93402 移动应用基础数据模型到 APPBase 类库。 2025-03-25 03:28:39 +08:00
ZhanGSKen
e85cbd803e <libappbase>Library Release 15.0.10 2025-03-25 03:25:08 +08:00
ZhanGSKen
00a9ec1d66 <appbase>APK 15.0.10 release Publish. 2025-03-25 03:24:44 +08:00
ZhanGSKen
64051bb9fe 添加应用基础数据模型 2025-03-25 03:23:45 +08:00
ZhanGSKen
a9aee97e41 <libapputils>Library Release 15.0.15 2025-03-24 17:14:56 +08:00
ZhanGSKen
6f2bfa66eb <apputils>APK 15.0.15 release Publish. 2025-03-24 17:14:43 +08:00
ZhanGSKen
0f5eac2a01 移除应用介绍数据模型 2025-03-24 17:14:24 +08:00
ZhanGSKen
eaf83a931e <libapputils>Library Release 15.0.14 2025-03-24 17:08:05 +08:00
ZhanGSKen
3d287757a1 <apputils>APK 15.0.14 release Publish. 2025-03-24 17:07:52 +08:00
ZhanGSKen
f9f6ec746a <libapputils>Library Release 15.0.13 2025-03-24 17:07:24 +08:00
ZhanGSKen
cf7bdebbb3 <apputils>APK 15.0.13 release Publish. 2025-03-24 17:07:03 +08:00
ZhanGSKen
737150da8d 移除应用介绍模块,移动至AES。 2025-03-24 17:05:49 +08:00
ZhanGSKen
ac02880344 <libapputils>Library Release 15.0.12 2025-03-24 14:42:28 +08:00
ZhanGSKen
c9980db1d5 <apputils>APK 15.0.12 release Publish. 2025-03-24 14:42:07 +08:00
ZhanGSKen
ec08e89418 精简数据模型 2025-03-24 14:41:21 +08:00
ZhanGSKen
dd7600d617 更新类库,优化日志标题。 2025-03-24 14:08:48 +08:00
ZhanGSKen
75c2f6304c 更新应用基类 2025-03-24 13:57:52 +08:00
ZhanGSKen
ec6926f629 设定应用版本与系统版本一致。 2025-03-24 13:31:45 +08:00
ZhanGSKen
3fe1ea7ff2 修改AndroidDemo类库依赖方式。 2025-03-24 13:21:11 +08:00
ZhanGSKen
7391091480 <libapputils>Library Release 15.0.11 2025-03-24 09:46:41 +08:00
ZhanGSKen
133964aaf1 <apputils>APK 15.0.11 release Publish. 2025-03-24 09:46:26 +08:00
ZhanGSKen
a96696f261 整体UI优化 2025-03-24 09:44:18 +08:00
ZhanGSKen
f96fcbfe13 添加二维码测试窗口调用 2025-03-24 08:52:50 +08:00
ZhanGSKen
ad6e1bd51b 添加应用自带Html资源窗口测试 2025-03-24 08:47:04 +08:00
ZhanGSKen
0fa55b0291 添加日日志窗口测试 2025-03-24 08:43:35 +08:00
ZhanGSKen
32082c4dd0 移除冗余模块,其模块已转移至AES。 2025-03-24 08:41:06 +08:00
ZhanGSKen
3be42fbd59 <libapputils>Library Release 15.0.10 2025-03-24 08:10:15 +08:00
ZhanGSKen
85f8466450 <apputils>APK 15.0.10 release Publish. 2025-03-24 08:10:00 +08:00
ZhanGSKen
407f2b38ae <libapputils>Library Release 15.0.9 2025-03-24 08:09:51 +08:00
ZhanGSKen
550410d913 <apputils>APK 15.0.9 release Publish. 2025-03-24 08:09:02 +08:00
ZhanGSKen
6daa3bbd0f <apputils>APK 15.0.8 release Publish. 2025-03-24 08:08:19 +08:00
ZhanGSKen
8a29735130 更新编译工具版本 2025-03-24 08:06:52 +08:00
ZhanGSKen
272dd15427 Merge remote-tracking branch 'origin/appbase' into apputils 2025-03-24 08:05:24 +08:00
ZhanGSKen
7c7b159a80 更新编译工具版本 2025-03-24 07:57:04 +08:00
ZhanGSKen
da23546bb4 Merge branch 'appbase' into apputils 2025-03-24 07:48:04 +08:00
ZhanGSKen
fe12cf7ffe 添加BB工具集示例源码 2025-03-23 17:12:03 +08:00
ZhanGSKen
3192ae55b1 设置 Gradle 类库引用方式为 API 传递依赖。 2025-03-23 13:26:28 +08:00
ZhanGSKen
6bfaa7ae92 简化应用提示 2025-03-22 20:47:27 +08:00
ZhanGSKen
f3577c7e78 添加服务启动按钮 2025-03-21 21:21:14 +08:00
ZhanGSKen
395674d302 修复定位数据锁定错误问题 2025-03-21 21:07:20 +08:00
ZhanGSKen
5e66647495 添加手动输入定位信息,并且显示位置功能。 2025-03-21 17:05:02 +08:00
ZhanGSKen
1113503a23 添加腾旭地图数据与手机GPS位置修复模型 2025-03-21 11:17:57 +08:00
ZhanGSKen
f12496f5ad Merge branch 'appbase' into positions 2025-03-21 01:39:22 +08:00
ZhanGSKen
d44d553818 20250321 2025-03-21 01:38:52 +08:00
ZhanGSKen
67d91aaf6c Merge branch 'appbase' into apputils 2025-03-21 01:15:54 +08:00
ZhanGSKen
76d6e7cf46 定位数据生成与定位完成 2025-03-20 05:42:02 +08:00
ZhanGSKen
d2b4213e9b 更新类库 2025-03-20 05:14:46 +08:00
ZhanGSKen
44418d7618 Merge branch 'appbase' into positions 2025-03-20 03:48:16 +08:00
ZhanGSKen
e91bf7d422 <libapputils>Library Release 15.0.7 2025-03-20 01:24:10 +08:00
ZhanGSKen
a73b5a9199 <apputils>APK 15.0.7 release Publish. 2025-03-20 01:23:48 +08:00
ZhanGSKen
fe943fef85 更新类库,窗口管理模块置闲。 2025-03-20 01:22:05 +08:00
ZhanGSKen
473dd627fe 添加云盾的防御功能临时暂停控件 2025-03-19 14:28:35 +08:00
ZhanGSKen
dc8dcc35dd <contacts>APK 1.0.21 release Publish. 2025-03-19 11:09:14 +08:00
ZhanGSKen
80c00a86b0 修正联系人信息提示语法问题。 2025-03-19 11:08:12 +08:00
ZhanGSKen
35c639e7c9 <contacts>APK 1.0.20 release Publish. 2025-03-19 08:51:20 +08:00
ZhanGSKen
05cc5c72f8 添加联系人查询,在联系人名单内就允许连接。 2025-03-19 08:48:03 +08:00
ZhanGSKen
dc1b138dd7 20250319_0130 2025-03-19 01:30:40 +08:00
ZhanGSKen
e867433f9c <libapputils>Library Release 15.0.6 2025-03-18 12:18:37 +08:00
ZhanGSKen
33eb58f33c <apputils>APK 15.0.6 release Publish. 2025-03-18 12:18:23 +08:00
ZhanGSKen
915c440cdd 主题配置方案尝试 2025-03-18 12:13:42 +08:00
ZhanGSKen
d21c92683d <libapputils>Library Release 15.0.5 2025-03-18 10:56:21 +08:00
ZhanGSKen
fe7ba6d38d <apputils>APK 15.0.5 release Publish. 2025-03-18 10:56:08 +08:00
ZhanGSKen
b3548bf1df 类库主题属性继承名称尝试 2025-03-18 10:55:13 +08:00
ZhanGSKen
d4b8b3bb35 <libapputils>Library Release 15.0.4 2025-03-18 10:46:52 +08:00
ZhanGSKen
d6a0d86e24 <apputils>APK 15.0.4 release Publish. 2025-03-18 10:46:39 +08:00
ZhanGSKen
20f1c29055 简化类库主题设置,避免attr属性增多。 2025-03-18 10:46:08 +08:00
ZhanGSKen
d8e7b35ec3 <libapputils>Library Release 15.0.3 2025-03-18 10:38:34 +08:00
ZhanGSKen
ccc5a995af <apputils>APK 15.0.3 release Publish. 2025-03-18 10:38:22 +08:00
ZhanGSKen
b46ee47e06 简化类库主题设置 2025-03-18 10:37:54 +08:00
ZhanGSKen
b11b06fad5 <libapputils>Library Release 15.0.2 2025-03-18 10:22:46 +08:00
ZhanGSKen
20af88fdd2 <apputils>APK 15.0.2 release Publish. 2025-03-18 10:22:27 +08:00
ZhanGSKen
9a70fe7c0f 更新类库,分开应用与类库主题设置。 2025-03-18 10:21:32 +08:00
ZhanGSKen
c62f3f1bea <libapputils>Library Release 15.0.1 2025-03-18 09:52:51 +08:00
ZhanGSKen
0e339c0f51 <apputils>APK 15.0.1 release Publish. 2025-03-18 09:52:37 +08:00
ZhanGSKen
c20975cfca 设置主题配置为模块化独立风格,添加应用异常测试。 2025-03-18 09:52:06 +08:00
ZhanGSKen
ed5f91f299 <libapputils>Library Release 15.0.0 2025-03-18 08:45:52 +08:00
ZhanGSKen
0031100219 <apputils>APK 15.0.0 release Publish. 2025-03-18 08:44:48 +08:00
ZhanGSKen
f9e7d362b7 调整测试窗口日志 2025-03-18 08:42:14 +08:00
ZhanGSKen
8d9d308c68 去除support依赖 2025-03-18 08:32:17 +08:00
ZhanGSKen
3eaec5ed73 Merge branch 'appbase' into contacts 2025-03-17 09:54:20 +08:00
ZhanGSKen
d3b12207e0 Merge branch 'appbase' into apputils 2025-03-15 19:38:11 +08:00
ZhanGSKen
a2e963b53e Merge branch 'appbase' into apputils 2025-03-15 12:57:46 +08:00
ZhanGSKen
8ba0c3937d 添加定位加权平均算法 2025-03-11 11:02:57 +08:00
ZhanGSKen
4fd636090e 添加初步联合定位功能 2025-03-10 21:11:05 +08:00
ZhanGSKen
96332c9986 Merge branch 'appbase' into positions 2025-03-10 19:50:59 +08:00
ZhanGSKen
486a17d4b2 <contacts>APK 1.0.19 release Publish. 2025-03-09 20:33:54 +08:00
ZhanGSKen
6cde3be042 更新类库 2025-03-09 20:31:51 +08:00
ZhanGSKen
445bf47e38 <contacts>APK 1.0.18 release Publish. 2025-03-09 20:06:59 +08:00
ZhanGSKen
322e1426d7 修复拉动拨号控件在列表滚动时图标位置不稳定的BUG. 2025-03-09 20:05:52 +08:00
ZhanGSKen
9ff752b652 <contacts>APK 1.0.17 release Publish. 2025-03-09 17:42:52 +08:00
ZhanGSKen
95cba7166e UI优化 2025-03-09 17:41:19 +08:00
ZhanGSKen
ba4354ad59 <contacts>APK 1.0.16 release Publish. 2025-03-09 14:02:13 +08:00
ZhanGSKen
69fd92f4a0 Merge branch 'appbase' into contacts 2025-03-09 14:01:10 +08:00
ZhanGSKen
73608ed6e6 更新拉动拨号控件 2025-03-09 14:00:36 +08:00
ZhanGSKen
5746ef4569 Merge branch 'contacts' into appbase 2025-03-09 11:43:12 +08:00
ZhanGSKen
ad745a9cc1 更新类库 2025-03-09 11:42:53 +08:00
ZhanGSKen
41c0394c4a <libapputils>Library Release 9.4.4 2025-03-09 09:34:30 +08:00
ZhanGSKen
d2a84f554b <apputils>APK 9.4.4 release Publish. 2025-03-09 09:34:16 +08:00
ZhanGSKen
d1e3e27f20 更新类库 2025-03-09 09:33:15 +08:00
ZhanGSKen
f9242bfc9a 编译参数修复 2025-03-09 09:29:39 +08:00
ZhanGSKen
bf37eb61bb Merge branch 'apputils' of https://gitea.winboll.cc/Studio/APP.git into apputils 2025-03-09 09:26:28 +08:00
ZhanGSKen
6fd1513d6b <libapputils>Library Release 9.4.3 2025-03-09 09:21:00 +08:00
ZhanGSKen
394d75e5a2 <apputils>APK 9.4.3 release Publish. 2025-03-09 09:20:34 +08:00
ZhanGSKen
378e9168b6 更新类库 2025-03-09 09:19:23 +08:00
ZhanGSKen
a3fa570b50 Merge branch 'appbase' into apputils 2025-03-09 09:16:39 +08:00
ZhanGSKen
e3571ae39f <contacts>APK 1.0.15 release Publish. 2025-03-08 04:50:59 +08:00
ZhanGSKen
261c87a42d 修复应用日志时间显示BUG 2025-03-08 04:49:35 +08:00
ZhanGSKen
0db31c07ba <contacts>APK 1.0.14 release Publish. 2025-03-08 04:37:47 +08:00
ZhanGSKen
87dea88e36 <contacts>APK 1.0.13 release Publish. 2025-03-08 04:37:15 +08:00
ZhanGSKen
5779f195f8 设置UI为拖动拨号方式 2025-03-08 04:36:07 +08:00
ZhanGSKen
7662d1c153 <libapputils>Library Release 9.4.2 2025-03-08 03:59:18 +08:00
ZhanGSKen
ac7b5bb1a2 <apputils>APK 9.4.2 release Publish. 2025-03-08 03:59:02 +08:00
ZhanGSKen
eeae184e7e 更改类库引用方式,更新类库。 2025-03-08 03:58:06 +08:00
ZhanGSKen
d5f34ad618 <libapputils>Library Release 9.4.1 2025-03-08 03:43:49 +08:00
ZhanGSKen
3ad1863a5f <apputils>APK 9.4.1 release Publish. 2025-03-08 03:43:19 +08:00
ZhanGSKen
291080aa15 更改类库引用方式,更新类库。 2025-03-08 03:42:12 +08:00
ZhanGSKen
973a0ff94f <libapputils>Library Release 9.4.0 2025-03-08 03:14:44 +08:00
ZhanGSKen
e04ea7f035 <apputils>APK 9.4.0 release Publish. 2025-03-08 03:14:21 +08:00
ZhanGSKen
ecbaf639a0 更新类库 2025-03-08 03:12:28 +08:00
ZhanGSKen
02f2d4f0bc <contacts>APK 1.0.12 release Publish. 2025-03-06 21:44:44 +08:00
ZhanGSKen
f6bece28ac 添加通信记录联系人显示 2025-03-06 21:43:50 +08:00
ZhanGSKen
559f1c58ba <contacts>APK 1.0.11 release Publish. 2025-03-06 20:00:52 +08:00
ZhanGSKen
4bb814308b 添加单号码单元测试 2025-03-06 19:59:11 +08:00
ZhanGSKen
05a9fc5275 <contacts>APK 1.0.10 release Publish. 2025-03-05 20:51:08 +08:00
ZhanGSKen
74d5239898 添加规则删除确认框。 2025-03-05 20:49:39 +08:00
ZhanGSKen
948141d5a9 规则编辑列表的项滑动逻辑完成。 2025-03-05 20:41:29 +08:00
ZhanGSKen
3535df8b3e <contacts>APK 1.0.9 release Publish. 2025-03-05 17:21:57 +08:00
ZhanGSKen
bd4ba7b291 连接规则记录操作接口完成 2025-03-05 17:20:00 +08:00
ZhanGSKen
9ff8b1ed80 1629 2025-03-05 16:29:55 +08:00
ZhanGSKen
859238a173 1852 2025-03-04 18:52:16 +08:00
ZhanGSKen
53eced104e <contacts>APK 1.0.8 release Publish. 2025-03-04 01:25:27 +08:00
ZhanGSKen
b45119b487 添加调试信息 2025-03-04 01:24:16 +08:00
ZhanGSKen
fdddde33b5 <contacts>APK 1.0.7 release Publish. 2025-03-03 20:51:18 +08:00
ZhanGSKen
f263733609 UI界面优化 2025-03-03 20:42:00 +08:00
ZhanGSKen
51a1cf1e26 重构为Java7语法 2025-03-03 20:23:00 +08:00
ZhanGSKen
093772c824 <contacts>APK 1.0.6 release Publish. 2025-03-03 17:39:16 +08:00
ZhanGSKen
bf3e9bdc91 云盾防御体系成型 2025-03-03 17:37:42 +08:00
ZhanGSKen
0f72817b50 <contacts>APK 1.0.5 release Publish. 2025-03-02 18:48:57 +08:00
ZhanGSKen
c827b2cbad 完成电话连接规则的编辑和保存 2025-03-02 18:26:45 +08:00
ZhanGSKen
23892192b9 设置本机GPS和腾讯SDK两种定位方法。 2025-03-01 11:09:34 +08:00
ZhanGSKen
e1b48fb6c5 1957 2025-02-28 19:57:42 +08:00
ZhanGSKen
6dc042e0ec 代码清理 2025-02-28 11:14:12 +08:00
ZhanGSKen
53a74cc9ea 清理冗余菜单 2025-02-28 11:11:44 +08:00
ZhanGSKen
1ac91f5c1e 分页菜单设计完成 2025-02-28 11:08:29 +08:00
ZhanGSKen
e0e001c417 应用布局基本设定 2025-02-28 10:43:35 +08:00
ZhanGSKen
02673d19dd <contacts>APK 1.0.4 release Publish. 2025-02-26 19:10:28 +08:00
ZhanGSKen
38884d3457 基本拨号功能完成 2025-02-26 19:07:55 +08:00
ZhanGSKen
ecb56df773 1821 2025-02-26 18:22:10 +08:00
ZhanGSKen
a15f6bad8f 1509 2025-02-26 15:09:29 +08:00
ZhanGSKen
2f0293103c 添加通话记录和联系人 2025-02-26 14:10:16 +08:00
ZhanGSKen
d4135f0104 <contacts>APK 1.0.3 release Publish. 2025-02-26 05:10:50 +08:00
ZhanGSKen
bdb9bc7637 性能优化 2025-02-26 05:08:56 +08:00
ZhanGSKen
e7633e53ed <contacts>APK 1.0.2 release Publish. 2025-02-26 04:37:18 +08:00
ZhanGSKen
3734a659ff 添加主要服务启动设置 2025-02-26 04:35:14 +08:00
ZhanGSKen
b9f740c386 添加系统设置静音时的权限异常处理,添加固定的应用铃声音量设置。忽略其他应用设置的铃声音量。 2025-02-26 03:40:41 +08:00
ZhanGSKen
050fd46d81 <libapputils>Library Release 9.3.2 2025-02-12 19:50:26 +08:00
ZhanGSKen
d4ea79b950 <apputils>APK 9.3.2 release Publish. 2025-02-12 19:50:03 +08:00
ZhanGSKen
06a40a4298 更新类库,精简代码。 2025-02-12 19:48:45 +08:00
ZhanGSKen
35835d746e 更新类库,应用崩溃报告风格化设置。 2025-02-12 15:21:27 +08:00
ZhanGSKen
5f3d03ba7d 更新类库 2025-02-09 15:14:33 +08:00
ZhanGSKen
1d372ff9ae 更新类库 2025-02-09 13:13:35 +08:00
ZhanGSKen
4a1e398755 更新类库 2025-02-09 11:43:53 +08:00
ZhanGSKen
107be6d6ad <libapputils>Library Release 9.3.1 2025-02-06 11:03:07 +08:00
ZhanGSKen
19db567a7d <apputils>APK 9.3.1 release Publish. 2025-02-06 11:02:45 +08:00
ZhanGSKen
b14add854e 应用介绍模块更新 2025-02-06 11:00:51 +08:00
ZhanGSKen
104d9fa283 更新类库,重构基础活动窗口类为实际活动窗口类。 2025-02-06 07:37:15 +08:00
ZhanGSKen
dd041e5d78 WinBollActivity 类型重构 2025-02-05 10:37:54 +08:00
ZhanGSKen
2f019ae176 重构 WinBollActivity 2025-02-04 12:21:09 +08:00
ZhanGSKen
b5b4fbd3f5 <libapputils>Library Release 9.3.0 2025-02-04 08:54:24 +08:00
ZhanGSKen
548dcf74ed <apputils>APK 9.3.0 release Publish. 2025-02-04 08:54:03 +08:00
ZhanGSKen
547bf894c6 更新类库 2025-02-04 08:53:03 +08:00
ZhanGSKen
09e6429726 <libapputils>Library Release 9.2.17 2025-01-23 14:51:10 +08:00
ZhanGSKen
3ad9bb262e <apputils>APK 9.2.17 release Publish. 2025-01-23 14:50:49 +08:00
ZhanGSKen
15992da22f 添加Application返回函数 2025-01-23 14:49:56 +08:00
ZhanGSKen
7fb4e665f9 <libapputils>Library Release 9.2.16 2025-01-23 14:30:38 +08:00
ZhanGSKen
6a82889926 <apputils>APK 9.2.16 release Publish. 2025-01-23 14:30:15 +08:00
ZhanGSKen
7272cc4e5b 更新类库,添加应用上下文函数 2025-01-23 14:28:54 +08:00
ZhanGSKen
1f7d112a8a <libapputils>Library Release 9.2.15 2025-01-23 14:03:05 +08:00
ZhanGSKen
936e214015 <apputils>APK 9.2.15 release Publish. 2025-01-23 14:02:45 +08:00
ZhanGSKen
46e95d1b1f 增加容错调试能力 2025-01-23 14:01:42 +08:00
ZhanGSKen
15173f7af3 <libapputils>Library Release 9.2.14 2025-01-23 04:27:34 +08:00
ZhanGSKen
6f3b6c40af <apputils>APK 9.2.14 release Publish. 2025-01-23 04:27:21 +08:00
ZhanGSKen
42ffba69e5 更新联系邮件 2025-01-23 04:26:52 +08:00
ZhanGSKen
f021e8a1a3 <libapputils>Library Release 9.2.13 2025-01-23 04:05:47 +08:00
ZhanGSKen
02ce7dedb0 <apputils>APK 9.2.13 release Publish. 2025-01-23 04:05:32 +08:00
ZhanGSKen
8e290cd5e6 应用介绍添加 Gitea 拥有者属性 2025-01-23 04:04:45 +08:00
ZhanGSKen
37f2aa5f1b <libapputils>Library Release 9.2.12 2025-01-23 03:47:38 +08:00
ZhanGSKen
10cc69940b <apputils>APK 9.2.12 release Publish. 2025-01-23 03:47:26 +08:00
ZhanGSKen
bfdff9ff2f 日志类BugFix 2025-01-23 03:46:57 +08:00
ZhanGSKen
12c6129a61 <libapputils>Library Release 9.2.11 2025-01-23 03:34:10 +08:00
ZhanGSKen
ea10d1b540 <apputils>APK 9.2.11 release Publish. 2025-01-23 03:33:58 +08:00
ZhanGSKen
81f6ff592e 应用类调整 2025-01-23 03:33:26 +08:00
ZhanGSKen
e6f22e9212 <libapputils>Library Release 9.2.10 2025-01-23 03:05:52 +08:00
ZhanGSKen
8ce8f383fa <apputils>APK 9.2.10 release Publish. 2025-01-23 03:05:41 +08:00
ZhanGSKen
35d32b384f 应用类重构 2025-01-23 03:05:08 +08:00
ZhanGSKen
85e86ddf05 <libapputils>Library Release 9.2.9 2025-01-23 02:44:03 +08:00
ZhanGSKen
99bf804625 <apputils>APK 9.2.9 release Publish. 2025-01-23 02:43:51 +08:00
ZhanGSKen
261259e61e 应用类重构 2025-01-23 02:43:15 +08:00
ZhanGSKen
9aaf3433bd <libapputils>Library Release 9.2.8 2025-01-23 02:30:30 +08:00
ZhanGSKen
b739510951 <apputils>APK 9.2.8 release Publish. 2025-01-23 02:30:17 +08:00
ZhanGSKen
903359d9a2 <libapputils>Library Release 9.2.7 2025-01-23 02:17:45 +08:00
ZhanGSKen
69e7e72ed8 <apputils>APK 9.2.7 release Publish. 2025-01-23 02:17:32 +08:00
ZhanGSKen
a96ba362b4 应用类重构 2025-01-23 02:16:53 +08:00
ZhanGSKen
6447bcf924 <libapputils>Library Release 9.2.6 2025-01-23 01:54:40 +08:00
ZhanGSKen
18ed325731 <apputils>APK 9.2.6 release Publish. 2025-01-23 01:54:23 +08:00
ZhanGSKen
16e3d10b63 吐司框架分离初始化步骤 2025-01-23 01:53:06 +08:00
ZhanGSKen
8b0e8b00ae <libapputils>Library Release 9.2.5 2025-01-23 01:34:24 +08:00
ZhanGSKen
7f61ff1470 <apputils>APK 9.2.5 release Publish. 2025-01-23 01:34:03 +08:00
ZhanGSKen
c4e0c23a0c 应用介绍页添加 Gitea APP 子项目文件夹直接链接方式 2025-01-23 01:33:10 +08:00
ZhanGSKen
c7d26bbc3d 清理应用提示信息 2025-01-23 01:14:06 +08:00
ZhanGSKen
4968bbaeae <apputils>APK 9.2.4 release Publish. 2025-01-22 21:22:05 +08:00
ZhanGSKen
8e6b06e366 <apputils>APK 9.2.3 release Publish. 2025-01-22 21:17:58 +08:00
ZhanGSKen
ae7fb2984a 介绍页调试中 2025-01-22 21:16:35 +08:00
ZhanGSKen
a4d009f8fb 重构 WinBoll 框架应用类 2025-01-22 19:36:11 +08:00
ZhanGSKen
5a549e9652 <libapputils>Library Release 9.2.2 2025-01-22 17:20:01 +08:00
ZhanGSKen
e2d71ae088 <apputils>APK 9.2.2 release Publish. 2025-01-22 17:19:38 +08:00
ZhanGSKen
506d2619f2 应用介绍页测试完成 2025-01-20 14:51:10 +08:00
ZhanGSKen
17fa805a7f 源码整理 2025-01-20 13:17:58 +08:00
ZhanGSKen
1dcf8cd007 代码整理 2025-01-20 13:00:52 +08:00
ZhanGSKen
d86d50212e 优化Log UI 2025-01-20 12:57:59 +08:00
ZhanGSKen
af2e09c02a 应用退出按钮调试完成,添加日志窗口调动响应。 2025-01-20 12:50:22 +08:00
ZhanGSKen
de6361b19b APPUtils编译调试 2025-01-20 11:07:17 +08:00
516 changed files with 8791 additions and 46876 deletions

View File

@@ -1,4 +1,4 @@
## WinBoll 主机编译事项提醒 ## WinBoLL 主机编译事项提醒
## 类库类型源码发布 ## 类库类型源码发布
# 类库发布使用以下面命令 # 类库发布使用以下面命令

View File

@@ -37,7 +37,7 @@ fi
# 使用grep找到包含"publishVersion="的那一行然后用awk提取其后的值 # 使用grep找到包含"publishVersion="的那一行然后用awk提取其后的值
PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}') PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}')
echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >" echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >"
## 设新的 WinBoll 标签 ## 设新的 WinBoLL 标签
# 脚本调试时使用 # 脚本调试时使用
#tag="v7.6.4-test1" #tag="v7.6.4-test1"
# 正式设置标签时使用 # 正式设置标签时使用

View File

@@ -38,24 +38,24 @@ function askAddWorkflowsTag {
fi fi
} }
function addWinBollTag { function addWinBoLLTag {
# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。 # 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。
# 如果文件中有 publishVersion 这一项, # 如果文件中有 publishVersion 这一项,
# 使用grep找到包含"publishVersion="的那一行然后用awk提取其后的值 # 使用grep找到包含"publishVersion="的那一行然后用awk提取其后的值
PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}') PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}')
echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >" echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >"
## 设新的 WinBoll 标签 ## 设新的 WinBoLL 标签
# 脚本调试时使用 # 脚本调试时使用
#tag="projectname-v7.6.4-test1" #tag="projectname-v7.6.4-test1"
# 正式设置标签时使用 # 正式设置标签时使用
tag=$1"-v"${PUBLISH_VERSION} tag=$1"-v"${PUBLISH_VERSION}
echo "< WinBoll Tag To: $tag >"; echo "< WinBoLL Tag To: $tag >";
# 检查是否已经添加了 WinBoll Tag # 检查是否已经添加了 WinBoLL Tag
if [ "$(git tag -l ${tag})" == "${tag}" ]; then if [ "$(git tag -l ${tag})" == "${tag}" ]; then
echo -e "< WinBoll Tag ${tag} exist! >" echo -e "< WinBoLL Tag ${tag} exist! >"
return 1 # WinBoll标签重复 return 1 # WinBoLL标签重复
fi fi
# 添加WinBoll标签 # 添加WinBoLL标签
git tag -a ${tag} -F $1/app_update_description.txt git tag -a ${tag} -F $1/app_update_description.txt
return 0 return 0
} }
@@ -119,22 +119,22 @@ if [[ $? -eq 0 ]]; then
echo $result echo $result
# 发布应用 # 发布应用
echo "Publishing WinBoll APK ..." echo "Publishing WinBoLL APK ..."
# 脚本调试时使用 # 脚本调试时使用
#bash gradlew :$1:assembleBetaDebug #bash gradlew :$1:assembleBetaDebug
# 正式发布 # 正式发布
bash gradlew :$1:assembleStageRelease bash gradlew :$1:assembleStageRelease
echo "Publishing WinBoll APK OK." echo "Publishing WinBoLL APK OK."
# 添加 WinBoll 标签 # 添加 WinBoLL 标签
result=$(addWinBollTag $1) result=$(addWinBoLLTag $1)
echo $result echo $result
if [[ $? -eq 0 ]]; then if [[ $? -eq 0 ]]; then
echo $result echo $result
# WinBoll 标签添加成功 # WinBoLL 标签添加成功
else else
echo -e "${0}: addWinBollTag $1\n${result}\nAdd WinBoll tag cancel." echo -e "${0}: addWinBoLLTag $1\n${result}\nAdd WinBoLL tag cancel."
exit 1 # addWinBollTag 异常 exit 1 # addWinBoLLTag 异常
fi fi
# 添加 GitHub 工作流标签 # 添加 GitHub 工作流标签

View File

@@ -38,24 +38,24 @@ function askAddWorkflowsTag {
fi fi
} }
function addWinBollTag { function addWinBoLLTag {
# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。 # 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。
# 如果文件中有 publishVersion 这一项, # 如果文件中有 publishVersion 这一项,
# 使用grep找到包含"publishVersion="的那一行然后用awk提取其后的值 # 使用grep找到包含"publishVersion="的那一行然后用awk提取其后的值
PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}') PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}')
echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >" echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >"
## 设新的 WinBoll 标签 ## 设新的 WinBoLL 标签
# 脚本调试时使用 # 脚本调试时使用
#tag="v7.6.4-test1" #tag="v7.6.4-test1"
# 正式调试版设置标签时使用 # 正式调试版设置标签时使用
tag=$1"-v"${PUBLISH_VERSION}"-debug" tag=$1"-v"${PUBLISH_VERSION}"-debug"
echo "< WinBoll Tag To: $tag >"; echo "< WinBoLL Tag To: $tag >";
# 检查是否已经添加了 WinBoll Tag # 检查是否已经添加了 WinBoLL Tag
if [ "$(git tag -l ${tag})" == "${tag}" ]; then if [ "$(git tag -l ${tag})" == "${tag}" ]; then
echo -e "< WinBoll Tag ${tag} exist! >" echo -e "< WinBoLL Tag ${tag} exist! >"
return 1 # WinBoll标签重复 return 1 # WinBoLL标签重复
fi fi
# 添加WinBoll标签 # 添加WinBoLL标签
git tag -a ${tag} -F $1/app_update_description.txt git tag -a ${tag} -F $1/app_update_description.txt
return 0 return 0
} }
@@ -119,22 +119,22 @@ if [[ $? -eq 0 ]]; then
echo $result echo $result
# 发布应用 # 发布应用
echo "Publishing WinBoll Debug APK ..." echo "Publishing WinBoLL Debug APK ..."
# 脚本调试时使用 # 脚本调试时使用
#bash gradlew :$1:assembleBetaDebug #bash gradlew :$1:assembleBetaDebug
# 正式发布调试版 # 正式发布调试版
bash gradlew :$1:assembleStageDebug bash gradlew :$1:assembleStageDebug
echo "Publishing WinBoll Debug APK OK." echo "Publishing WinBoLL Debug APK OK."
# 添加 WinBoll 标签 # 添加 WinBoLL 标签
result=$(addWinBollTag $1) result=$(addWinBoLLTag $1)
echo $result echo $result
if [[ $? -eq 0 ]]; then if [[ $? -eq 0 ]]; then
echo $result echo $result
# WinBoll 标签添加成功 # WinBoLL 标签添加成功
else else
echo -e "${0}: addWinBollTag $1\n${result}\nAdd WinBoll tag cancel." echo -e "${0}: addWinBoLLTag $1\n${result}\nAdd WinBoLL tag cancel."
exit 1 # addWinBollTag 异常 exit 1 # addWinBoLLTag 异常
fi fi
# 添加 GitHub 工作流标签 # 添加 GitHub 工作流标签

View File

@@ -8,7 +8,7 @@ if [ -z "$1" ]; then
fi fi
## 正式发布使用 ## 正式发布使用
git pull && bash gradlew :$1:publishReleasePublicationToWinBollReleaseRepository && bash .winboll/bashCommitLibReleaseBuildFlagInfo.sh $1 git pull && bash gradlew :$1:publishReleasePublicationToWinBoLLReleaseRepository && bash .winboll/bashCommitLibReleaseBuildFlagInfo.sh $1
## 调试使用 ## 调试使用
#bash gradlew :$1:publishSnapshotWinBollPublicationToWinBollSnapshotRepository && bash .winboll/bashCommitLibReleaseBuildFlagInfo.sh $1 #bash gradlew :$1:publishSnapshotWinBoLLPublicationToWinBoLLSnapshotRepository && bash .winboll/bashCommitLibReleaseBuildFlagInfo.sh $1

View File

@@ -1,4 +1,4 @@
// WinBoll 应用签名配置 // WinBoLL 应用签名配置
// //
android { android {
@@ -31,18 +31,18 @@ android {
} }
} }
flavorDimensions "WinBollApp" flavorDimensions "WinBoLLApp"
productFlavors { productFlavors {
beta { beta {
// 检查编译标志位配置 // 检查编译标志位配置
assert (winbollBuildProps['buildCount'] != null) assert (winbollBuildProps['buildCount'] != null)
dimension "WinBollApp" dimension "WinBoLLApp"
applicationIdSuffix ".beta" applicationIdSuffix ".beta"
LocalDateTime localDateTimeNow = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); LocalDateTime localDateTimeNow = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
versionNameSuffix "-beta" + winbollBuildProps['buildCount'] + "_" + localDateTimeNow.format('mmss') versionNameSuffix "-beta" + winbollBuildProps['buildCount'] + "_" + localDateTimeNow.format('mmss')
} }
stage { stage {
dimension "WinBollApp" dimension "WinBoLLApp"
} }
} }
@@ -61,7 +61,7 @@ android {
} }
// //
// WinBoll 应用包输出配置 // WinBoLL 应用包输出配置
// 1. 配置 Stage Release 版应用包输出 // 1. 配置 Stage Release 版应用包输出
// 2. 配置 Beta Debug 版应用包输出 // 2. 配置 Beta Debug 版应用包输出
// //
@@ -74,13 +74,13 @@ android {
//def outputFileName="${rootProject.name}_${versionName}.apk" //def outputFileName="${rootProject.name}_${versionName}.apk"
def outputFileName=project.rootDir.name + "_${versionName}.apk" def outputFileName=project.rootDir.name + "_${versionName}.apk"
// 创建 WinBoll Studio 发布接口文件夹 // 创建 WinBoLL Studio 发布接口文件夹
File fWinBollStudioDir = file("/sdcard/WinBollStudio/APKs"); File fWinBoLLStudioDir = file("/sdcard/WinBoLLStudio/APKs");
if(!fWinBollStudioDir.exists()) { if(!fWinBoLLStudioDir.exists()) {
//fWinBollStudioDir.mkdirs(); //fWinBoLLStudioDir.mkdirs();
// 如果没有发布接口文件就不用进行APK发布和源码管理操作 // 如果没有发布接口文件就不用进行APK发布和源码管理操作
// 当前编译环境不是 WinBoll 主机, 以下将忽略APK发布和源码管理操作。 // 当前编译环境不是 WinBoLL 主机, 以下将忽略APK发布和源码管理操作。
println 'The current compilation environment is not in WinBoll host, and the following APK publishing and source management operations will be ignore.' println 'The current compilation environment is not in WinBoLL host, and the following APK publishing and source management operations will be ignore.'
} else { } else {
/// WINBOLL 主机的 APK 发布和源码管理操作 /// /// WINBOLL 主机的 APK 发布和源码管理操作 ///
variant.getAssembleProvider().get().doFirst { variant.getAssembleProvider().get().doFirst {
@@ -91,15 +91,15 @@ android {
// //
variant.getAssembleProvider().get().doLast { variant.getAssembleProvider().get().doLast {
variant.outputs.forEach{ file-> variant.outputs.forEach{ file->
// 如果正在调试,就拷贝到 WinBoll 备份管理文件夹 // 如果正在调试,就拷贝到 WinBoLL 备份管理文件夹
// //
if(variant.flavorName == "beta"&&variant.buildType.name == "debug"){ if(variant.flavorName == "beta"&&variant.buildType.name == "debug"){
//File outBuildBckDir = new File(fWinBollStudioDir, "/${rootProject.name}/${variant.buildType.name}") //File outBuildBckDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/${variant.buildType.name}")
File outBuildBckDir = new File(fWinBollStudioDir, "/" + project.rootDir.name + "/${variant.buildType.name}") File outBuildBckDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/${variant.buildType.name}")
// 创建目标路径目录 // 创建目标路径目录
if(!outBuildBckDir.exists()) { if(!outBuildBckDir.exists()) {
outBuildBckDir.mkdirs(); outBuildBckDir.mkdirs();
println "Output Folder Created.(WinBollStudio) : " + outBuildBckDir.getAbsolutePath() println "Output Folder Created.(WinBoLLStudio) : " + outBuildBckDir.getAbsolutePath()
} }
if(outBuildBckDir.exists()) { if(outBuildBckDir.exists()) {
copy{ copy{
@@ -108,7 +108,7 @@ android {
rename { rename {
String fileName -> "${outputFileName}" String fileName -> "${outputFileName}"
} }
println "Output APK (WinBollStudio): " + outBuildBckDir.getAbsolutePath() + "/${outputFileName}" println "Output APK (WinBoLLStudio): " + outBuildBckDir.getAbsolutePath() + "/${outputFileName}"
} }
// 检查编译标志位配置 // 检查编译标志位配置
assert (winbollBuildProps['buildCount'] != null) assert (winbollBuildProps['buildCount'] != null)
@@ -137,7 +137,7 @@ android {
} }
} }
// 如果正在发布,就拷贝到 WinBoll 标签管理文件夹 // 如果正在发布,就拷贝到 WinBoLL 标签管理文件夹
// //
if((variant.flavorName == "stage"&&variant.buildType.name == "debug") if((variant.flavorName == "stage"&&variant.buildType.name == "debug")
|| (variant.flavorName == "stage"&&variant.buildType.name == "release")){ || (variant.flavorName == "stage"&&variant.buildType.name == "release")){
@@ -151,8 +151,8 @@ android {
String szCommonTagAPKName = project.rootDir.name + "_" + szShortVersionName + ".apk" String szCommonTagAPKName = project.rootDir.name + "_" + szShortVersionName + ".apk"
println "CommonTagAPKName is : " + szCommonTagAPKName println "CommonTagAPKName is : " + szCommonTagAPKName
//File outTagDir = new File(fWinBollStudioDir, "/${rootProject.name}/tag/") //File outTagDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/tag/")
File outTagDir = new File(fWinBollStudioDir, "/" + project.rootDir.name + "/tag/") File outTagDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/tag/")
// 创建目标路径目录 // 创建目标路径目录
if(!outTagDir.exists()) { if(!outTagDir.exists()) {
outTagDir.mkdirs(); outTagDir.mkdirs();

View File

@@ -1,4 +1,4 @@
// 本机和 WinBoll Maven 仓库传输配置。 // 本机和 WinBoLL Maven 仓库传输配置。
// //
def getDefaultVersion(){ def getDefaultVersion(){
@@ -9,12 +9,12 @@ def getDefaultVersion(){
} }
def siteUrl = 'https://winboll.cc/?page=studio/details.php&app=${rootProject.name}' // 项目主页 def siteUrl = 'https://winboll.cc/?page=studio/details.php&app=${rootProject.name}' // 项目主页
def gitUrl = 'https://gitea.winboll.cc/WinBoll/${rootProject.name}' // 项目的git地址 def gitUrl = 'https://gitea.winboll.cc/WinBoLL/${rootProject.name}' // 项目的git地址
def DefaultGroupId = 'cc.winboll.studio' // 类库所有者groupId def DefaultGroupId = 'cc.winboll.studio' // 类库所有者groupId
def DefaultVersion = getDefaultVersion() // 版本号 def DefaultVersion = getDefaultVersion() // 版本号
def DeveloperId='zhangsken' // 开发者账号 def DeveloperId='zhangsken' // 开发者账号
def DeveloperName='ZhanGSKen' // 开发者名称 def DeveloperName='ZhanGSKen' // 开发者名称
def DeveloperEMail='ZhanGSKen@QQ.COM' // 开发者邮箱地址 def DeveloperEMail='zhangsken@188.com' // 开发者邮箱地址
def LicenseName='The Apache Software License, Version 2.0' def LicenseName='The Apache Software License, Version 2.0'
def LicenseUrl='http://www.apache.org/licenses/LICENSE-2.0.txt' def LicenseUrl='http://www.apache.org/licenses/LICENSE-2.0.txt'
@@ -27,10 +27,10 @@ afterEvaluate {
properties.load(file("${RootProjectDir}/${winbollFilePath}").newDataInputStream()) properties.load(file("${RootProjectDir}/${winbollFilePath}").newDataInputStream())
def NexusUserName = properties.getProperty("Nexus.name") def NexusUserName = properties.getProperty("Nexus.name")
def NexusPassword = properties.getProperty("Nexus.password") def NexusPassword = properties.getProperty("Nexus.password")
// WinBoll Release 仓库 // WinBoLL Release 仓库
maven{ maven{
//仓库的名字和地址 //仓库的名字和地址
name = "WinBollRelease" name = "WinBoLLRelease"
url="https://nexus.winboll.cc/repository/maven-releases/" url="https://nexus.winboll.cc/repository/maven-releases/"
// 仓库用户名密码 // 仓库用户名密码
credentials { credentials {
@@ -38,10 +38,10 @@ afterEvaluate {
password = NexusPassword password = NexusPassword
} }
} }
// WinBoll Snapshot 仓库 // WinBoLL Snapshot 仓库
maven{ maven{
//仓库的名字和地址 //仓库的名字和地址
name = "WinBollSnapshot" name = "WinBoLLSnapshot"
url="https://nexus.winboll.cc/repository/maven-snapshots/" url="https://nexus.winboll.cc/repository/maven-snapshots/"
// 仓库用户名密码 // 仓库用户名密码
credentials { credentials {
@@ -101,9 +101,9 @@ afterEvaluate {
} }
} }
// WinBoll Maven Release 仓库传输任务 // WinBoLL Maven Release 仓库传输任务
// //
releaseWinBoll(MavenPublication) { releaseWinBoLL(MavenPublication) {
// 需要使用的变体假设有free和pay两个变体可以选择一个 // 需要使用的变体假设有free和pay两个变体可以选择一个
//from components.free //from components.free
@@ -154,9 +154,9 @@ afterEvaluate {
} // 创建名为 release 的任务结束 } // 创建名为 release 的任务结束
// WinBoll Maven Snapshot 仓库传输任务 // WinBoLL Maven Snapshot 仓库传输任务
// //
snapshotWinBoll(MavenPublication) { snapshotWinBoLL(MavenPublication) {
// 需要使用的变体假设有free和pay两个变体可以选择一个 // 需要使用的变体假设有free和pay两个变体可以选择一个
//from components.free //from components.free

127
README.md
View File

@@ -1,23 +1,23 @@
# ☁ ☁ ☁ WinBoll APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ 这是 WinBoll 系列 APP 汇总项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ WinBoll 网站地址 https://www.winboll.cc/studio/app/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
## WinBoll 提问 ## WinBoLL 提问
同样是 /sdcard 目录,在开发 Android 应用时, 同样是 /sdcard 目录,在开发 Android 应用时,
能否实现手机编译与电脑编译的源码同步。 能否实现手机编译与电脑编译的源码同步。
☁因而 WinBoll 项目组诞生了。 ☁因而 WinBoLL 项目组诞生了。
## WinBoll 项目组研发计划 ## WinBoLL 项目组研发计划
致力于把 WinBoll-APP 应用在手机端 Android 项目开发。 致力于把 WinBoLL-APP 应用在手机端 Android 项目开发。
也在探索 https://gitea.winboll.cc/<WinBoll 项目组>/WinBoll-APP.git 应用于 WinBoll-APP APK 分发。 也在探索 https://gitea.winboll.cc/<WinBoLL 项目组>/APP.git 应用于 WinBoLL-APP APK 分发。
更想进阶 https://github.com/<WinBoll 项目组>/WinBoll-APP.git 应用于 WinBoll-APP Beta APK 分发。 更想进阶 https://github.com/<WinBoLL 项目组>/APP.git 应用于 WinBoLL-APP Beta APK 分发。
## WinBoll-APP 汗下... ## WinBoLL-APP 汗下...
#### ☁应用何置如此呢。且观用户云云。 #### ☁应用何置如此呢。且观用户云云。
#### ☁ 正当下 ☁ ### #### ☁ 正当下 ☁ ###
#### ☁ 且容傻家叙说 ☁ WinBoll-APP 应用场景 #### ☁ 且容傻家叙说 ☁ WinBoLL-APP 应用场景
### ☁ WinBoll 设备资源概述 ### ☁ WinBoLL 设备资源概述
#### ☁ 1. Raid Disk. #### ☁ 1. Raid Disk.
概述:这是一个矩阵存储类设备。 概述:这是一个矩阵存储类设备。
优点:该设备具有数据容错存储功能, 优点:该设备具有数据容错存储功能,
@@ -40,74 +40,79 @@
设备位于操作系统内部文件系统。 设备位于操作系统内部文件系统。
数据持久性与操作系统挂钩。 数据持久性与操作系统挂钩。
#### ☁ 4. WinBoll 用户资源概述。 #### ☁ 4. WinBoLL 用户资源概述。
1> /home/<用户名> 位于 WinBoll 操作系统目录下。 1> /home/<用户名> 位于 WinBoLL 操作系统目录下。
2> /rdisk/<用户名> 挂载用户 Raid Disk. 2> /rdisk/<用户名> 挂载用户 Raid Disk.
3> /data/<用户名> 挂载用户 Data Disk. 3> /data/<用户名> 挂载用户 Data Disk.
4> /sdcard/<用户名> 挂载用户 SSD Disk. 4> /sdcard/<用户名> 挂载用户 SSD Disk.
#### ☁ 5. WinBoll-APP 用户资源概述。 #### ☁ 5. WinBoLL-APP 用户资源概述。
1> /sdcard 挂载用户手机 SD 存储/storage/emulated/0 1> /sdcard 挂载用户手机 SD 存储/storage/emulated/0
### ☁ 稍稍歇 ☁ ### ### ☁ 稍稍歇 ☁ ###
### ☁ 急急停 ☁ WinBoll 应用前置条件 ### ☁ 急急停 ☁ WinBoLL 应用前置条件
☁ WinBoll 主机建立 1Panel MySQL 应用。 ☁ WinBoLL 主机建立 1Panel MySQL 应用。
☁ WinBoll 主机建立 1Panel Gitea 应用。 ☁ WinBoLL 主机建立 1Panel Gitea 应用。
☁ WinBoll 主机设置 WinBoll 应用为非登录状态。 ☁ WinBoLL 主机设置 WinBoLL 应用为非登录状态。
☁ WinBoll 主机建立 WinBoll 账户与 WinBoll 用户组。 ☁ WinBoLL 主机建立 WinBoLL 账户与 WinBoLL 用户组。
☁ WinBoll 账户 User ID 为: winboll ☁ WinBoLL 账户 User ID 为: J
☁ WinBoll 用户组 Group ID 为: winboll ☁ WinBoLL 用户组 Group ID 为: Studio
☁ WinBoll 主机 WinBoll 1Panel Gitea 建立 WinBoll 工作组。 ☁ WinBoLL 主机 WinBoLL 1Panel Gitea 建立 WinBoLL 工作组。
☁ WinBoll 主机 WinBoll 1Panel Gitea 用户项目 APK 编译输出目录为 /sdcard/<用户名>/WinBoll/app/ ☁ WinBoLL 主机 WinBoLL 1Panel Gitea 用户项目 APK 编译输出目录为 /sdcard/WinBoLLStudio/<用户名>/APKs/
☁ WinBoll 项目配置文件示例为 "<WinBoll 项目根目录>/.winboll/winboll.properties-demo"(WinBoll 项目已设置) ☁ WinBoLL 项目配置文件示例为 "<WinBoLL 项目根目录>/.winboll/winboll.properties-demo"(WinBoLL 项目已设置)
☁ WinBoll 项目配置文件为 "<WinBoll 项目根目录>/.winboll/winboll.properties" ☁ WinBoLL 项目配置文件为 "<WinBoLL 项目根目录>/.winboll/winboll.properties"
☁ WinBoll 项目配置文件设定为源码提交时忽略。(WinBoll 项目已设置) ☁ WinBoLL 项目配置文件设定为源码提交时忽略。(WinBoLL 项目已设置)
☁ Gradle 项目配置文件示例为 "<WinBoll 项目根目录>/.winboll/local.properties-demo"(WinBoll 项目已设置) ☁ Gradle 项目配置文件示例为 "<WinBoLL 项目根目录>/.winboll/local.properties-demo"(WinBoLL 项目已设置)
☁ Gradle 项目配置文件为 "<WinBoll 项目根目录>/local.properties"(WinBoll 项目已设置) ☁ Gradle 项目配置文件为 "<WinBoLL 项目根目录>/local.properties"(WinBoLL 项目已设置)
☁ Gradle 项目配置文件设定为源码提交时忽略。(WinBoll 项目已设置) ☁ Gradle 项目配置文件设定为源码提交时忽略。(WinBoLL 项目已设置)
### ☁ 登高处 ☁ WinBoll 应用需求规划 ### ☁ 登高处 ☁ WinBoLL 应用需求规划
☁ WinBoll 主机建立 WinBoll 客户端用户数据库为 MySQL winbollclient 数据库。 ☁ WinBoLL 主机建立 WinBoLL 客户端用户数据库为 MySQL winbollclient 数据库。
☁ WinBoll 主机设置 WinBoll 客户端用户信息存储在 winbollclient 数据库中。 ☁ WinBoLL 主机设置 WinBoLL 客户端用户信息存储在 winbollclient 数据库中。
☁ MySQL winbollclient 数据库中 ☁ MySQL winbollclient 数据库中
WinBoll 客户端用户信息设定为: WinBoLL 客户端用户信息设定为:
<用户名, 验证密码, 验证邮箱, 验证手机, 唯一存储令牌Token, 备用验证邮箱> <用户名, 验证密码, 验证邮箱, 验证手机, 唯一存储令牌Token, 备用验证邮箱>
☁ WinBoll 项目源码仓库托管在 WinBoll 1Panel Gitea 目录 /opt/1panel/apps/gitea/gitea/data/git/repositories/winboll/winboll.git中。 ☁ WinBoLL 项目源码仓库托管在 WinBoLL 1Panel Gitea 目录 /opt/1panel/apps/gitea/gitea/data/git/repositories/studio/app.git中。
☁ WinBoll 主机提供 WinBoll 1Panel Gitea 应用的 WinBoll 项目源码仓库存取功能。Gitea 应用已提供) ☁ WinBoLL 主机提供 WinBoLL 1Panel Gitea 应用的 WinBoLL 项目源码仓库存取功能。Gitea 应用已提供)
☁ WinBoll 主机提供 WinBoll Gitea 项目仓库存档功能。Gitea 应用已提供) ☁ WinBoLL 主机提供 WinBoLL Gitea 项目仓库存档功能。Gitea 应用已提供)
☁ 提供 WinBoll 客户端用户登录功能。Gitea 应用已提供) ☁ 提供 WinBoLL 客户端用户登录功能。Gitea 应用已提供)
### ☁ 看远方 ☁ ### ### ☁ 看远方 ☁ ###
### ☁ 心忧虑 ☁ WinBoll-APP 应用前置需求 ### ☁ 心忧虑 ☁ WinBoLL-APP 应用前置需求
☁ WinBoll-APP WinBoll 项目根目录设定为手机的 /sdcard/WinBoll 目录。(需要用户手动建立文件夹) ☁ WinBoLL-APP WinBoLL 项目根目录设定为手机的 /sdcard/WinBoLLStudio/Sources 目录。(需要用户手动建立文件夹)
☁ WinBoll-APP 具有手机 /sdcard/WinBoll 目录的存储权限。(需要手机操作系统授权) ☁ WinBoLL-APP 具有手机 /sdcard/WinBoLL 目录的存储权限。(需要手机操作系统授权)
☁ WinBoll-APP WinBoll 项目仓库源码存储路径为 /sdcard/WinBoll/repositories/winboll.git需要用户手动建立文件夹 ☁ WinBoLL-APP WinBoLL 项目仓库源码存储路径为 /sdcard/WinBoLLStudio/Sources/APP.git需要用户手动建立文件夹
☁ WinBoll-APP 项目 APK 编译输出目录为 /sdcard/WinBoll/app/ ☁ WinBoLL-APP 项目 APK 编译输出目录为 /sdcard/WinBoLLStudio/APKs/
☁ WinBoll-APP 应用签名验证可定制化。WinBoll 项目已提供) ☁ WinBoLL-APP 应用签名验证可定制化。WinBoLL 项目已提供)
☁ WinBoll-APP 与系列衍生 APP 应用共享 cc.winboll.studio 命名空间资源。WinBoll 项目已提供) ☁ WinBoLL-APP 与系列衍生 APP 应用共享 cc.winboll.studio 命名空间资源。WinBoLL 项目已提供)
☁ WinBoll-APP 用户客户端信息存储在命名空间为 WinBoll APP MySQLLite 应用的 winbollappclient 数据库中。 ☁ WinBoLL-APP 用户客户端信息存储在命名空间为 WinBoLL APP MySQLLite 应用的 winbollappclient 数据库中。
☁ WinBoll-APP MySQLLite 应用的 winbollappclient 数据库中, ☁ WinBoLL-APP MySQLLite 应用的 winbollappclient 数据库中,
WinBoll 用户客户端信息设定为: WinBoLL 用户客户端信息设定为:
<用户名, 唯一存储令牌Token> <用户名, 唯一存储令牌Token>
### ☁ 云游四方 ☁ ### ### ☁ 云游四方 ☁ ###
### ☁ 呔! ☁ WinBoll-APP 应用需求规划 ### ☁ 呔! ☁ WinBoLL-APP 应用需求规划
WinBoll-APP 提供手机目录 /sdcard/WinBoll 的 WinBoll 项目源码管理功能。 如要使用 WinBoLL Android 项目的 Gradle 编译功能,则需要设置以下两个文件夹。
☁ 1. 则需要建立数据存储目录 /sdcard/WinBoLLStudio/APKs。
WinBoLL 项目源码编译出来的安装包会拷贝一份到 /sdcard/WinBoLLStudio/APKs 目录下。
☁ 2. 则需要建立数据存储目录 /sdcard/AppProjects。
WinBoLL 项目源码编译出来的安装包会拷贝一份并命名 "app.apk" 的安装文件为到 /sdcard/AppProjects 目录下。
### ☁ 吁! ☁ WinBoll-APP 共享计划前景
☁ WinBoll-APP 将会实现 https://winboll.cc/api 访问功能。
☁ WinBoll-APP 将会实现手机端 Android 应用的开发与管理功能。
## ☁ WinBoll ☁ WinBoll 主机忧虑 ###吁! ☁ WinBoLL-APP 共享计划前景
☁ WinBoll 将会提供 gitea.winboll.cc 域名用户注册登录功能。 ☁ WinBoLL-APP 将会实现 https://winboll.cc/api 访问功能。
☁ WinBoll 将会提供 WinBoll-APP 及其衍生应用的 Gitea 仓库管理服务 ☁ WinBoLL-APP 将会实现手机端 Android 应用的开发与管理功能
☁ WinBoll 将会提供 winboll.cc 域名 WinBoll 项目组注册登录功能。
## ☁ WinBoLL ☁ WinBoLL 主机忧虑
☁ WinBoLL 将会提供 gitea.winboll.cc 域名用户注册登录功能。
☁ WinBoLL 将会提供 WinBoLL-APP 及其衍生应用的 Gitea 仓库管理服务。
☁ WinBoLL 将会提供 winboll.cc 域名 WinBoLL 项目组注册登录功能。
# 本项目要实际运用需要注意以下几个步骤: # 本项目要实际运用需要注意以下几个步骤:
# 在项目根目录下: # 在项目根目录下:
## 1. 项目模块编译环境设置(必须)settings.gradle-demo 要复制为 settings.gradle并取消相应项目模块的注释。 ## 1. 项目模块编译环境设置(必须)settings.gradle-demo 要复制为 settings.gradle并取消相应项目模块的注释。
## 2. 项目 Android SDK 编译环境设置(可选)local.properties-demo 要复制为 local.properties并按需要设置 Android SDK 目录。 ## 2. 项目 Android SDK 编译环境设置(可选)local.properties-demo 要复制为 local.properties并按需要设置 Android SDK 目录。
## 3. 类库型模块编译环境设置(可选)winboll.properties-demo 要复制为 winboll.properties并按需要设置 WinBoll Maven 库登录用户信息。 ## 3. 类库型模块编译环境设置(可选)winboll.properties-demo 要复制为 winboll.properties并按需要设置 WinBoLL Maven 库登录用户信息。
# ☆类库型项目编译方法 # ☆类库型项目编译方法
@@ -116,12 +121,12 @@
设置属性 libraryProject=<类库项目模块文件夹名称> 设置属性 libraryProject=<类库项目模块文件夹名称>
### 再编译测试项目 ### 再编译测试项目
$ bash .winboll/bashPublishAPKAddTag.sh <应用项目模块文件夹名称> $ bash .winboll/bashPublishAPKAddTag.sh <应用项目模块文件夹名称>
#### 测试项目编译后,编译器会复制一份 APK 到以下路径:"/sdcard/WinBollStudio/APKs/<项目根目录名称>/tag/" 文件夹。 #### 测试项目编译后,编译器会复制一份 APK 到以下路径:"/sdcard/WinBoLLStudio/APKs/<项目根目录名称>/tag/" 文件夹。
### 最后编译类库项目 ### 最后编译类库项目
$ bash .winboll/bashPublishLIBAddTag.sh <类库项目模块文件夹名称> $ bash .winboll/bashPublishLIBAddTag.sh <类库项目模块文件夹名称>
#### 类库模块编译命令执行后,编译器会发布到 WinBoll Nexus Maven 库Maven 库地址可以参阅根项目目录配置 build.gradle 文件。 #### 类库模块编译命令执行后,编译器会发布到 WinBoLL Nexus Maven 库Maven 库地址可以参阅根项目目录配置 build.gradle 文件。
# ☆应用型项目编译方法 # ☆应用型项目编译方法
## 直接调用以下命令编译应用型项目 ## 直接调用以下命令编译应用型项目
$ bash .winboll/bashPublishAPKAddTag.sh <应用项目模块文件夹名称> $ bash .winboll/bashPublishAPKAddTag.sh <应用项目模块文件夹名称>
#### 应用模块编译命令执行后,编译器会复制一份 APK 到以下路径:"/sdcard/WinBollStudio/APKs/<项目根目录名称>/tag/" 文件夹。 #### 应用模块编译命令执行后,编译器会复制一份 APK 到以下路径:"/sdcard/WinBoLLStudio/APKs/<项目根目录名称>/tag/" 文件夹。

View File

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

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat Mar 29 08:53:46 HKT 2025 #Thu Apr 03 11:14:05 HKT 2025
stageCount=10 stageCount=7
libraryProject=libaes libraryProject=libaes
baseVersion=15.0 baseVersion=15.2
publishVersion=15.0.9 publishVersion=15.2.6
buildCount=0 buildCount=0
baseBetaVersion=15.0.10 baseBetaVersion=15.2.7

View File

@@ -10,7 +10,8 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/MyAESTheme" android:theme="@style/MyAESTheme"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"
android:supportsRtl="true"> android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"

View File

@@ -5,23 +5,25 @@ package cc.winboll.studio.aes;
* @Date 2025/03/24 23:52:29 * @Date 2025/03/24 23:52:29
* @Describe AES应用介绍窗口 * @Describe AES应用介绍窗口
*/ */
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libaes.winboll.APPInfo; import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libaes.winboll.AboutView; import cc.winboll.studio.libaes.winboll.AboutView;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import android.app.Activity;
public class AboutActivity extends AppCompatActivity implements IWinBollActivity { public class AboutActivity extends WinBollActivity implements IWinBollActivity {
public static final String TAG = "AboutActivity"; public static final String TAG = "AboutActivity";
Context mContext; Context mContext;
Toolbar mToolbar;
@Override @Override
public Activity getActivity() { public Activity getActivity() {
return this; return this;
@@ -36,17 +38,31 @@ public class AboutActivity extends AppCompatActivity implements IWinBollActivity
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mContext = this; mContext = this;
setContentView(R.layout.activity_about);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mToolbar.setSubtitle(TAG);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
AboutView aboutView = CreateAboutView(); AboutView aboutView = CreateAboutView();
// 在 Activity 的 onCreate 或其他生命周期方法中调用 // 在 Activity 的 onCreate 或其他生命周期方法中调用
LinearLayout layout = new LinearLayout(this); // LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL); // layout.setOrientation(LinearLayout.VERTICAL);
// // 创建布局参数(宽度和高度)
// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
// ViewGroup.LayoutParams.MATCH_PARENT,
// ViewGroup.LayoutParams.MATCH_PARENT
// );
// addContentView(aboutView, params);
LinearLayout layout = findViewById(R.id.aboutviewroot_ll);
// 创建布局参数(宽度和高度) // 创建布局参数(宽度和高度)
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT ViewGroup.LayoutParams.MATCH_PARENT
); );
addContentView(aboutView, params); layout.addView(aboutView, params);
GlobalApplication.getWinBollActivityManager().add(this); GlobalApplication.getWinBollActivityManager().add(this);
} }
@@ -70,6 +86,8 @@ public class AboutActivity extends AppCompatActivity implements IWinBollActivity
appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=AES"); appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=AES");
appInfo.setAppAPKName("AES"); appInfo.setAppAPKName("AES");
appInfo.setAppAPKFolderName("AES"); appInfo.setAppAPKFolderName("AES");
//appInfo.setIsAddDebugTools(false);
appInfo.setIsAddDebugTools(BuildConfig.DEBUG);
return new AboutView(mContext, appInfo); return new AboutView(mContext, appInfo);
} }
} }

View File

@@ -5,19 +5,26 @@ package cc.winboll.studio.aes;
* @Date 2024/06/13 19:03:58 * @Date 2024/06/13 19:03:58
* @Describe AES应用类 * @Describe AES应用类
*/ */
import android.view.Gravity;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
public class App extends GlobalApplication { public class App extends GlobalApplication {
public static final String TAG = "App"; public static final String TAG = "App";
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
// 初始化 Toast 框架
ToastUtils.init(this); ToastUtils.init(this);
ToastUtils.show("App onCreate"); // 设置 Toast 布局样式
ToastUtils.setView(R.layout.view_toast);
//ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
} }
} }

View File

@@ -57,7 +57,7 @@ public class MainActivity extends DrawerFragmentActivity implements IWinBollActi
} }
showFragment(mTestAButtonFragment); showFragment(mTestAButtonFragment);
//setSubtitle(TAG); //setSubtitle(TAG);
ToastUtils.show("onCreate"); //ToastUtils.show("onCreate");
} }
@Override @Override

View File

@@ -0,0 +1,60 @@
package cc.winboll.studio.aes;
import android.app.Activity;
import android.os.Bundle;
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 android.view.MenuItem;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/30 00:34:02
* @Describe WinBoll 活动窗口通用基类
*/
public class WinBollActivity extends AppCompatActivity implements IWinBollActivity {
public static final String TAG = "WinBollActivity";
protected volatile AESThemeBean.ThemeType mThemeType;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
mThemeType = getThemeType();
setThemeStyle();
super.onCreate(savedInstanceState);
}
AESThemeBean.ThemeType getThemeType() {
/*SharedPreferences sharedPreferences = getSharedPreferences(
SHAREDPREFERENCES_NAME, MODE_PRIVATE);
return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))];
*/
return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext()));
}
void setThemeStyle() {
//setTheme(AESThemeBean.getThemeStyle(getThemeType()));
setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@@ -6,16 +6,17 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar <cc.winboll.studio.libaes.views.ASupportToolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/activityassetshtmlToolbar1"/> android:id="@+id/toolbar"/>
<cc.winboll.studio.libapputils.view.SimpleWebView <LinearLayout
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1.0" android:layout_weight="1.0"
android:id="@+id/activityassetshtmlSimpleWebView1"/> android:id="@+id/aboutviewroot_ll"/>
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">winboll.cc</domain>
</domain-config>
</network-security-config>

View File

@@ -18,25 +18,18 @@ def genVersionName(def versionName){
} }
android { android {
productFlavors { compileSdkVersion 32
beta { buildToolsVersion "32.0.0"
}
stage {
}
}
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.androiddemo" applicationId "cc.winboll.studio.androiddemo"
minSdkVersion 26 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 29
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0 // .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "1.0" versionName "15.0"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@@ -53,22 +46,27 @@ android {
dependencies { dependencies {
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
// 吐司类库
implementation 'com.github.getActivity:ToastUtils:10.5'
// Android 类库 // Android 类库
// https://mvnrepository.com/artifact/com.android.support/support-v4 //api 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0' api('com.android.support:appcompat-v7:28.0.0'){
//exclude group: "com.android.support", module: "support-vector-drawable"
exclude group: "com.android.support:animated-vector-drawable:28.0.0"
}
// https://mvnrepository.com/artifact/com.android.support/support-compat // https://mvnrepository.com/artifact/com.android.support/support-compat
implementation 'com.android.support:support-compat:28.0.0' api 'com.android.support:support-compat:28.0.0' // 保留原有依赖(可选)
// https://mvnrepository.com/artifact/com.android.support/support-v4
api 'com.android.support:support-v4:28.0.0'
// https://mvnrepository.com/artifact/com.android.support/support-media-compat // https://mvnrepository.com/artifact/com.android.support/support-media-compat
implementation 'com.android.support:support-media-compat:28.0.0' api 'com.android.support:support-media-compat:28.0.0'
// https://mvnrepository.com/artifact/com.android.support/support-core-utils // https://mvnrepository.com/artifact/com.android.support/support-core-utils
implementation 'com.android.support:support-core-utils:28.0.0' api 'com.android.support:support-core-utils:28.0.0'
// https://mvnrepository.com/artifact/com.android.support/support-core-ui // https://mvnrepository.com/artifact/com.android.support/support-core-ui
implementation 'com.android.support:support-core-ui:28.0.0' api 'com.android.support:support-core-ui:28.0.0'
// https://mvnrepository.com/artifact/com.android.support/support-fragment // https://mvnrepository.com/artifact/com.android.support/support-fragment
implementation 'com.android.support:support-fragment:28.0.0' api 'com.android.support:support-fragment:28.0.0'
// https://mvnrepository.com/artifact/com.android.support/recyclerview-v7 // https://mvnrepository.com/artifact/com.android.support/recyclerview-v7
implementation 'com.android.support:recyclerview-v7:28.0.0' api 'com.android.support:recyclerview-v7:28.0.0'
api 'cc.winboll.studio:libapputils:15.2.2'
api 'cc.winboll.studio:libappbase:15.2.2'
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue Mar 11 18:02:14 GMT 2025 #Thu Apr 03 03:17:18 GMT 2025
stageCount=0 stageCount=0
libraryProject= libraryProject=
baseVersion=1.0 baseVersion=15.0
publishVersion=1.0.0 publishVersion=15.0.0
buildCount=1 buildCount=21
baseBetaVersion=1.0.1 baseBetaVersion=15.0.1

View File

@@ -11,7 +11,7 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:resizeableActivity="true" android:resizeableActivity="true"
android:name=".GlobalApplication"> android:name=".App">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"

View File

@@ -1,7 +1,6 @@
package cc.winboll.studio.androiddemo; package cc.winboll.studio.androiddemo;
import android.app.Activity; import android.app.Activity;
import android.app.Application;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
@@ -22,6 +21,7 @@ import android.widget.HorizontalScrollView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import cc.winboll.studio.libappbase.GlobalApplication;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.Closeable; import java.io.Closeable;
@@ -39,15 +39,15 @@ import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
public class GlobalApplication extends Application { public class App extends GlobalApplication {
private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
CrashHandler.getInstance().registerGlobal(this); //CrashHandler.getInstance().registerGlobal(this);
CrashHandler.getInstance().registerPart(this); //CrashHandler.getInstance().registerPart(this);
} }
public static void write(InputStream input, OutputStream output) throws IOException { public static void write(InputStream input, OutputStream output) throws IOException {
@@ -252,7 +252,7 @@ public class GlobalApplication extends Application {
private static String getKernel() { private static String getKernel() {
try { try {
return GlobalApplication.toString(new FileInputStream("/proc/version")).trim(); return App.toString(new FileInputStream("/proc/version")).trim();
} catch (Throwable e) { } catch (Throwable e) {
return e.getMessage(); return e.getMessage();
} }
@@ -331,4 +331,4 @@ public class GlobalApplication extends Application {
restart(); restart();
} }
} }
} }

View File

@@ -1,15 +1,25 @@
package cc.winboll.studio.androiddemo; package cc.winboll.studio.androiddemo;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import cc.winboll.studio.libappbase.LogView;
public class MainActivity extends Activity {
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) { LogView mLogView;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); @Override
protected void onCreate(Bundle savedInstanceState) {
} super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
mLogView = findViewById(R.id.logview);
mLogView.start();
}
@Override
protected void onResume() {
super.onResume();
mLogView.start();
}
}

View File

@@ -4,13 +4,34 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"> android:orientation="vertical">
<TextView <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="0dp"
android:text="Android Demo" android:gravity="center_vertical|center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge"/> android:layout_weight="1.0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Demo"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0">
<cc.winboll.studio.libappbase.LogView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Text"
android:id="@+id/logview"/>
</LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -23,7 +23,7 @@ android {
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.androidxdemo" applicationId "cc.winboll.studio.androidxdemo"
minSdkVersion 26 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 29
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
@@ -60,13 +60,14 @@ dependencies {
// 网络连接类库 // 网络连接类库
api 'com.squareup.okhttp3:okhttp:4.4.1' api 'com.squareup.okhttp3:okhttp:4.4.1'
// AndroidX 类库 // AndroidX 类库
api 'androidx.appcompat:appcompat:1.0.0' api 'androidx.appcompat:appcompat:1.1.0'
api 'com.google.android.material:material:1.4.0' api 'com.google.android.material:material:1.4.0'
//api 'androidx.viewpager:viewpager:1.0.0' //api 'androidx.viewpager:viewpager:1.0.0'
//api 'androidx.vectordrawable:vectordrawable:1.1.0' //api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0' //api 'androidx.fragment:fragment:1.1.0'
api 'cc.winboll.studio:libappbase:15.0.9' api 'cc.winboll.studio:libaes:15.2.6'
api 'cc.winboll.studio:libapputils:15.0.11' api 'cc.winboll.studio:libapputils:15.2.2'
api 'cc.winboll.studio:libappbase:15.2.2'
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Mon Mar 24 06:19:57 GMT 2025 #Thu Apr 03 03:15:55 GMT 2025
stageCount=0 stageCount=0
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.0
publishVersion=15.0.0 publishVersion=15.0.0
buildCount=8 buildCount=18
baseBetaVersion=15.0.1 baseBetaVersion=15.0.1

View File

@@ -14,6 +14,7 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.Gravity;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -21,7 +22,9 @@ import android.widget.HorizontalScrollView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import cc.winboll.studio.androidxdemo.R;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import com.hjq.toast.ToastUtils;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.Closeable; import java.io.Closeable;
@@ -46,6 +49,14 @@ public class App extends GlobalApplication {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
// 初始化 Toast 框架
ToastUtils.init(this);
// 设置 Toast 布局样式
ToastUtils.setView(R.layout.view_toast);
//ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
//CrashHandler.getInstance().registerGlobal(this); //CrashHandler.getInstance().registerGlobal(this);
//CrashHandler.getInstance().registerPart(this); //CrashHandler.getInstance().registerPart(this);
} }

View File

@@ -4,6 +4,7 @@ import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.LogView;
import com.hjq.toast.ToastUtils;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
@@ -18,6 +19,8 @@ public class MainActivity extends AppCompatActivity {
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
mLogView = findViewById(R.id.logview); mLogView = findViewById(R.id.logview);
ToastUtils.show("onCreate");
} }
@Override @Override

View File

View File

View File

View File

View File

View File

View File

@@ -1,8 +0,0 @@
#Created by .winboll/winboll_app_build.gradle
#Sun Jan 05 07:55:24 HKT 2025
stageCount=17
libraryProject=winboll-shared
baseVersion=1.8
publishVersion=1.8.16
buildCount=0
baseBetaVersion=1.8.17

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<application
tools:replace="android:icon"
android:icon="@drawable/ic_winbollbeta">
<!-- Put flavor specific code here -->
</application>
</manifest>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">WinBoll-APP+</string>
</resources>

View File

@@ -1,48 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="cc.winboll.studio.app">
<!-- BIND_AUTOFILL_SERVICE -->
<uses-permission android:name="android.permission.BIND_AUTOFILL_SERVICE"/>
<application
android:name=".App"
android:allowBackup="true"
android:icon="@drawable/ic_winboll"
android:label="@string/app_name"
android:theme="@style/WinBoll.SupportThemeNoActionBar"
android:supportsRtl="true">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/studio_provider"/>
</provider>
</application>
</manifest>

View File

@@ -1,24 +0,0 @@
package cc.winboll.studio.app;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2024/12/08 15:10:51
* @Describe 全局应用类
*/
import cc.winboll.studio.shared.app.WinBollApplication;
import cc.winboll.studio.shared.log.LogUtils;
public class App extends WinBollApplication {
public static final String TAG = "App";
@Override
public void onCreate() {
// 必须在调用基类前设置应用调试标志,
// 这样可以预先设置日志与数据的存储根目录。
//setIsDebug(BuildConfig.DEBUG);
super.onCreate();
LogUtils.d(TAG, "onCreate");
}
}

View File

@@ -1,168 +0,0 @@
package cc.winboll.studio.app;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.shared.app.WinBollActivity;
import cc.winboll.studio.shared.app.WinBollActivityManager;
import cc.winboll.studio.shared.app.WinBollApplication;
import cc.winboll.studio.shared.log.LogUtils;
import cc.winboll.studio.shared.util.UriUtils;
import cc.winboll.studio.shared.view.StringToQrCodeView;
import cc.winboll.studio.shared.view.YesNoAlertDialog;
import cc.winboll.studio.unittest.UnitTestActivity;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;
final public class MainActivity extends WinBollActivity {
public static final String TAG = "MainActivity";
public static final int REQUEST_HOME_ACTIVITY = 0;
public static final int REQUEST_ABOUT_ACTIVITY = 1;
@Override
protected boolean isEnableDisplayHomeAsUp() {
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回
if (prosessIntents(getIntent())) return;
// 以下正常创建主窗口
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 设置 WinBoll 应用 UI 类型
WinBollApplication.setWinBollUI_TYPE(WinBollApplication.WinBollUI_TYPE.Aplication);
//ToastUtils.show("WinBollUI_TYPE " + WinBollApplication.getWinBollUI_TYPE());
LogUtils.d(TAG, "BuildConfig.DEBUG : " + Boolean.toString(BuildConfig.DEBUG));
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setSubTitle("");
}
//
// 处理传入的 Intent 数据
//
boolean prosessIntents(Intent intent) {
if (intent == null
|| intent.getAction() == null
|| intent.getAction().equals(""))
return false;
if (intent.getAction().equals(StringToQrCodeView.ACTION_UNITTEST_QRCODE)) {
try {
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);
subIntent.setAction(intent.getAction());
File file = new File(getCacheDir(), UUID.randomUUID().toString());
//取出文件uri
Uri uri = intent.getData();
if (uri == null) {
uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
}
//获取文件真实地址
String szSrcPath = UriUtils.getFileFromUri(getApplication(), uri);
if (TextUtils.isEmpty(szSrcPath)) {
return false;
}
Files.copy(Paths.get(szSrcPath), Paths.get(file.getPath()));
//startWinBollActivity(subIntent, tag);
WinBollActivityManager.getInstance(this).startWinBollActivity(this, subIntent, UnitTestActivity.class);
} catch (IllegalAccessException | InstantiationException | IOException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// 函数处理异常返回失败
return false;
}
} else {
LogUtils.d(TAG, "prosessIntents|" + intent.getAction() + "|yet");
return false;
}
return true;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected boolean isAddWinBollToolBar() {
return true;
}
@Override
public void onBackPressed() {
exit();
}
void exit() {
YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){
@Override
public void onYes() {
WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
}
@Override
public void onNo() {
}
};
YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener);
}
@Override
protected Toolbar initToolBar() {
return findViewById(R.id.activitymainToolbar1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_winboll_app_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.item_unittest) {
WinBollActivityManager.getInstance(this).startWinBollActivity(this, UnitTestActivity.class);
} else if (item.getItemId() == R.id.item_exit) {
exit();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
case REQUEST_HOME_ACTIVITY : {
LogUtils.d(TAG, "REQUEST_HOME_ACTIVITY");
break;
}
case REQUEST_ABOUT_ACTIVITY : {
LogUtils.d(TAG, "REQUEST_ABOUT_ACTIVITY");
break;
}
default : {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
}

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:clickable="true">
<item android:drawable="@drawable/ic_launcher_background"/>
<item
android:left="15dp"
android:top="15dp"
android:right="15dp"
android:bottom="15dp"
android:drawable="@drawable/ic_launcher_foreground"/>
</layer-list>

View File

@@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="@color/colorPrimary"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

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

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/activitymainToolbar1"/>
<LinearLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center"
android:layout_weight="1.0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, WinBoll!"/>
</LinearLayout>
</LinearLayout>

View File

@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_gradient"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@android:id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textColor="#FF000000"
android:textSize="16sp"/>
</LinearLayout>
</LinearLayout>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- WinBoll 默认方案 -->
<color name="colorPrimary">#FF196ABC</color>
<color name="colorPrimaryDark">#FF002B57</color>
<color name="colorAccent">#FF80BFFF</color>
<color name="colorToastFrame">#FFA9A9A9</color>
<color name="colorToastShadow">#FF000000</color>
<color name="colorToastBackgroung">#FFFFFFFF</color>
</resources>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">WinBoll-APP</string>
</resources>

View File

@@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_storage_root"
path="." />
<files-path
name="files_path"
path="." />
<cache-path
name="cache_path"
path="." />
<!--/storage/emulated/0/Android/data/...-->
<external-files-path
name="external_file_path"
path="." />
<!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的目录-->
<external-cache-path
name="external_cache_path"
path="." />
<!--配置root-path。这样子可以读取到sd卡和一些应用分身的目录否则微信分身保存的图片就会导致 java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/999/tencent/MicroMsg/WeiXin/export1544062754693.jpg在小米6的手机上微信分身有这个crash华为没有
-->
<root-path
name="root_path"
path="" />
</paths>

View File

@@ -18,18 +18,19 @@ def genVersionName(def versionName){
} }
android { android {
compileSdkVersion 32 compileSdkVersion 32
buildToolsVersion "32.0.0" buildToolsVersion "32.0.0"
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.appbase" applicationId "cc.winboll.studio.appbase"
minSdkVersion 26 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 29
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0 // .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.0" versionName "15.7"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Mon Mar 24 14:06:25 HKT 2025 #Mon Apr 28 21:17:52 HKT 2025
stageCount=10 stageCount=4
libraryProject=libappbase libraryProject=libappbase
baseVersion=15.0 baseVersion=15.7
publishVersion=15.0.9 publishVersion=15.7.3
buildCount=0 buildCount=0
baseBetaVersion=15.0.10 baseBetaVersion=15.7.4

View File

@@ -8,12 +8,15 @@
android:icon="@drawable/ic_launcher" android:icon="@drawable/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/MyAPPBaseTheme" android:theme="@style/MyAPPBaseTheme"
android:resizeableActivity="true"> android:resizeableActivity="true"
android:process=":App">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:exported="true"> android:exported="true"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation">
<intent-filter> <intent-filter>
@@ -29,10 +32,22 @@
</activity> </activity>
<activity android:name=".GlobalApplication$CrashActivity"/> <activity
android:name=".activities.NewActivity"
android:label="NewActivity"
android:exported="true"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
<activity android:name=".activities.New2Activity"
android:label="New2Activity"
android:exported="true"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
<service <service
android:name=".MyTileService" android:name=".MyTileService"
android:exported="true"
android:label="@string/tileservice_name" android:label="@string/tileservice_name"
android:icon="@drawable/ic_launcher" android:icon="@drawable/ic_launcher"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
@@ -49,15 +64,18 @@
android:name=".services.MainService" android:name=".services.MainService"
android:exported="true"/> android:exported="true"/>
<service android:name="cc.winboll.studio.appbase.services.TestDemoBindService" <service
android:name="cc.winboll.studio.appbase.services.TestDemoBindService"
android:exported="true"/> android:exported="true"/>
<service android:name="cc.winboll.studio.appbase.services.TestDemoService" <service
android:name="cc.winboll.studio.appbase.services.TestDemoService"
android:exported="true"/> android:exported="true"/>
<service android:name=".services.AssistantService"/> <service android:name=".services.AssistantService"/>
<receiver android:name="cc.winboll.studio.appbase.receivers.MainReceiver"> <receiver android:name="cc.winboll.studio.appbase.receivers.MainReceiver"
android:exported="true">
<intent-filter> <intent-filter>
@@ -87,7 +105,8 @@
</receiver> </receiver>
<receiver android:name=".receivers.APPNewsWidgetClickListener"> <receiver android:name=".receivers.APPNewsWidgetClickListener"
android:exported="true">
<intent-filter> <intent-filter>
@@ -103,6 +122,7 @@
android:name="android.max_aspect" android:name="android.max_aspect"
android:value="4.0"/> android:value="4.0"/>
</application> </application>
</manifest> </manifest>

View File

@@ -19,7 +19,6 @@ public class App extends GlobalApplication {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
GlobalApplication.setIsDebuging(this, BuildConfig.DEBUG);
mSOSCenterServiceReceiver = new SOSCenterServiceReceiver(); mSOSCenterServiceReceiver = new SOSCenterServiceReceiver();
IntentFilter intentFilter = new IntentFilter(); IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SOS.ACTION_SOS); intentFilter.addAction(SOS.ACTION_SOS);

View File

@@ -4,25 +4,42 @@ import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.activities.NewActivity;
import cc.winboll.studio.appbase.services.MainService; import cc.winboll.studio.appbase.services.MainService;
import cc.winboll.studio.appbase.services.TestDemoBindService; import cc.winboll.studio.appbase.services.TestDemoBindService;
import cc.winboll.studio.appbase.services.TestDemoService; import cc.winboll.studio.appbase.services.TestDemoService;
import cc.winboll.studio.libappbase.CrashHandler;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.GlobalCrashActivity;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.widgets.StatusWidget; import cc.winboll.studio.libappbase.widgets.StatusWidget;
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
public class MainActivity extends Activity { public class MainActivity extends WinBollActivityBase implements IWinBollActivity {
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
LogView mLogView; @Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
Toolbar mToolbar;
//LogView mLogView;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -30,19 +47,34 @@ public class MainActivity extends Activity {
ToastUtils.show("onCreate"); ToastUtils.show("onCreate");
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.activitymainToolbar1); mToolbar = findViewById(R.id.toolbar);
setActionBar(toolbar); setSupportActionBar(mToolbar);
CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1); CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
cbIsDebugMode.setChecked(GlobalApplication.isDebuging()); cbIsDebugMode.setChecked(GlobalApplication.isDebuging());
mLogView = findViewById(R.id.activitymainLogView1); //mLogView = findViewById(R.id.activitymainLogView1);
if (GlobalApplication.isDebuging()) { // if (GlobalApplication.isDebuging()) {
mLogView.start(); // mLogView.start();
ToastUtils.show("LogView 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) {
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false。
return super.onOptionsItemSelected(item);
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
@@ -51,15 +83,16 @@ public class MainActivity extends Activity {
sendBroadcast(intentAPPWidget); sendBroadcast(intentAPPWidget);
} }
@Override
protected void onResume() {
LogUtils.d(TAG, "onResume");
super.onResume();
mLogView.start();
}
public void onSwitchDebugMode(View view) { public void onSwitchDebugMode(View view) {
GlobalApplication.setIsDebuging(this, ((CheckBox)view).isChecked()); boolean isDebuging = ((CheckBox)view).isChecked();
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...");
startActivity(intent);
} }
public void onStartCenter(View view) { public void onStartCenter(View view) {
@@ -105,6 +138,8 @@ public class MainActivity extends Activity {
startService(intent); startService(intent);
} }
public void onStopTestDemoService(View view) { public void onStopTestDemoService(View view) {
Intent intent = new Intent(this, TestDemoService.class); Intent intent = new Intent(this, TestDemoService.class);
@@ -140,4 +175,10 @@ public class MainActivity extends Activity {
Intent intent = new Intent(this, TestDemoBindService.class); Intent intent = new Intent(this, TestDemoBindService.class);
stopService(intent); stopService(intent);
} }
public void onTestOpenNewActivity(View view) {
GlobalApplication.getWinBollActivityManager().startWinBollActivity(this, NewActivity.class);
}
} }

View File

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

View File

@@ -0,0 +1,83 @@
package cc.winboll.studio.appbase.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/25 11:46:40
* @Describe 测试窗口2
*/
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
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 static final String TAG = "New2Activity";
Toolbar mToolbar;
//LogView mLogView;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new2);
// mLogView = findViewById(R.id.logview);
// mLogView.start();
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
}
@Override
protected void onResume() {
super.onResume();
//mLogView.start();
}
public void onCloseThisActivity(View view) {
GlobalApplication.getWinBollActivityManager().finish(this);
}
public void onCloseAllActivity(View view) {
GlobalApplication.getWinBollActivityManager().finishAll();
}
public void onNewActivity(View view) {
GlobalApplication.getWinBollActivityManager().startWinBollActivity(this, NewActivity.class);
}
@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,81 @@
package cc.winboll.studio.appbase.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/25 05:04:22
*/
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
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 static final String TAG = "NewActivity";
Toolbar mToolbar;
//LogView mLogView;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
// mLogView = findViewById(R.id.logview);
// mLogView.start();
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
}
@Override
protected void onResume() {
super.onResume();
//mLogView.start();
}
public void onCloseThisActivity(View view) {
GlobalApplication.getWinBollActivityManager().finish(this);
}
public void onCloseAllActivity(View view) {
GlobalApplication.getWinBollActivityManager().finishAll();
}
public void onNew2Activity(View view) {
GlobalApplication.getWinBollActivityManager().startWinBollActivity(this, New2Activity.class);
}
@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

@@ -5,10 +5,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.widget.Toolbar <android.support.v7.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/activitymainToolbar1"/> android:id="@+id/toolbar"/>
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -39,28 +39,41 @@
android:layout_height="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="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但可能需要注意兼容性和配置问题。"/>
<LinearLayout <HorizontalScrollView
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:gravity="right|center_vertical">
<CheckBox <LinearLayout
android:layout_width="wrap_content" android:orientation="horizontal"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Debug Mode" android:gravity="right|center_vertical"
android:layout_weight="1.0" android:layout_width="wrap_content">
android:onClick="onSwitchDebugMode"
android:id="@+id/activitymainCheckBox1"/>
<Button <CheckBox
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Test Application CrashReport" android:text="Debug Mode"
android:textAllCaps="false" android:layout_weight="1.0"
android:onClick="onTestApplicationCrashReport"/> android:onClick="onSwitchDebugMode"
android:id="@+id/activitymainCheckBox1"/>
</LinearLayout> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test Application CrashReport"
android:textAllCaps="false"
android:onClick="onTestApplicationCrashReport"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PreviewGlobalCrashActivity"
android:textAllCaps="false"
android:onClick="onPreviewGlobalCrashActivity"/>
</LinearLayout>
</HorizontalScrollView>
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -72,26 +85,27 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="right"> android:gravity="right">
<LinearLayout <LinearLayout
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="StartCenter" android:text="StartCenter"
android:textAllCaps="false" android:textAllCaps="false"
android:onClick="onStartCenter"/> android:onClick="onStartCenter"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StopCenter"
android:textAllCaps="false"
android:onClick="onStopCenter"/>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StopCenter"
android:textAllCaps="false"
android:onClick="onStopCenter"/>
</LinearLayout>
<HorizontalScrollView <HorizontalScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@@ -160,7 +174,6 @@
</HorizontalScrollView> </HorizontalScrollView>
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -182,6 +195,13 @@
android:textAllCaps="false" android:textAllCaps="false"
android:onClick="onTestDemoServiceSOS"/> android:onClick="onTestDemoServiceSOS"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TestOpenNewActivity"
android:textAllCaps="false"
android:onClick="onTestOpenNewActivity"/>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
@@ -192,10 +212,5 @@
</ScrollView> </ScrollView>
<cc.winboll.studio.libappbase.LogView
android:layout_height="300dp"
android:layout_width="match_parent"
android:id="@+id/activitymainLogView1"/>
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NewActivity"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CloseThisActivity"
android:textAllCaps="false"
android:onClick="onCloseThisActivity"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CloseAllActivity"
android:textAllCaps="false"
android:onClick="onCloseAllActivity"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New2Activity"
android:textAllCaps="false"
android:onClick="onNew2Activity"/>
</LinearLayout>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New2Activity"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CloseThisActivity"
android:textAllCaps="false"
android:onClick="onCloseThisActivity"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CloseAllActivity"
android:textAllCaps="false"
android:onClick="onCloseAllActivity"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NewActivity"
android:textAllCaps="false"
android:onClick="onNewActivity"/>
</LinearLayout>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
</menu> </menu>

View File

@@ -19,17 +19,17 @@ def genVersionName(def versionName){
android { android {
compileSdkVersion 32 compileSdkVersion 32
buildToolsVersion "33.0.3" buildToolsVersion "32.0.0"
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.apputils" applicationId "cc.winboll.studio.apputils"
minSdkVersion 21 minSdkVersion 26
targetSdkVersion 30 targetSdkVersion 29
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0 // 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "9.2" versionName "15.2"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@@ -41,15 +41,9 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
} }
dependencies { dependencies {
api project(':libapputils') api project(':libapputils')
api 'cc.winboll.studio:libappbase:1.0.3'
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat Jan 18 13:03:10 HKT 2025 #Sat Mar 29 12:14:55 HKT 2025
stageCount=2 stageCount=2
libraryProject=libapputils libraryProject=libapputils
baseVersion=9.2 baseVersion=15.2
publishVersion=9.2.1 publishVersion=15.2.1
buildCount=0 buildCount=0
baseBetaVersion=9.2.2 baseBetaVersion=15.2.2

View File

@@ -8,7 +8,7 @@
android:allowBackup="true" android:allowBackup="true"
android:icon="@drawable/ic_winboll" android:icon="@drawable/ic_winboll"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/WinBoll.SupportThemeNoActionBar" android:theme="@style/MyUtilsTheme"
android:supportsRtl="true"> android:supportsRtl="true">
<activity <activity
@@ -27,9 +27,13 @@
</activity> </activity>
<activity android:name=".TestWinBollActivity"/> <activity android:name=".TestStringToQRCodeViewActivity"/>
<activity android:name=".TestStringToQrCodeViewActivity"/> <activity android:name=".TestBBMorseCodeActivity"/>
<activity android:name=".AssetsHtmlActivity"/>
<activity android:name=".QRCodeDecodeActivity"/>
</application> </application>

View File

@@ -5,27 +5,16 @@ package cc.winboll.studio.apputils;
* @Date 2024/12/08 15:10:51 * @Date 2024/12/08 15:10:51
* @Describe 全局应用类 * @Describe 全局应用类
*/ */
import android.view.Gravity; import android.app.Application;
import cc.winboll.studio.libapputils.app.WinBollApplication; import android.content.Context;
import com.hjq.toast.ToastUtils; import cc.winboll.studio.libappbase.GlobalApplication;
import com.hjq.toast.style.WhiteToastStyle;
public class App extends WinBollApplication { public class App extends GlobalApplication {
public static final String TAG = "App"; public static final String TAG = "App";
public static final String _ACTION_DEBUGVIEW = WinBollApplication.class.getName() + "_ACTION_DEBUGVIEW";
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
// 初始化 Toast 框架
//
ToastUtils.init(this);
// 设置 Toast 布局样式
//ToastUtils.setView(R.layout.view_toast);
ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
} }
} }

View File

@@ -1,59 +1,53 @@
package cc.winboll.studio.libapputils.activities; package cc.winboll.studio.apputils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen@QQ.COM
* @Date 2025/01/03 11:02:49 * @Date 2025/01/03 11:02:49
* @Describe 一个可以浏览随 APP 附带的 Html 文档的窗口 * @Describe 一个可以浏览随 APP 附带的 Html 文档的窗口
*/ */
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.libapputils.R; import cc.winboll.studio.apputils.R;
import cc.winboll.studio.libapputils.app.WinBollActivity; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libapputils.log.LogUtils; import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import cc.winboll.studio.libapputils.view.SimpleWebView; import cc.winboll.studio.libapputils.views.SimpleWebView;
import com.hjq.toast.ToastUtils;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import android.os.PersistableBundle;
public class AssetsHtmlActivity extends WinBollActivity { public class AssetsHtmlActivity extends WinBollActivityBase implements IWinBollActivity {
public static final String TAG = "AssetsHtmlActivity"; @Override
public Activity getActivity() {
public static final String EXTRA_HTMLFILENAME = "EXTRA_HTMLFILENAME"; return super.getActivity();
}
String mszHelpIndexFilePath = "";
Uri mszHelpIndexFileUri;
Context mContext;
// Assets 文件夹里的 Html 文件的名称
String mszHtmlFileName;
@Override @Override
public String getTag() { public String getTag() {
return TAG; return TAG;
} }
@Override
protected boolean isEnableDisplayHomeAsUp() {
return true;
}
public static final String TAG = "AssetsHtmlActivity";
@Override public static final String EXTRA_HTMLFILENAME = "EXTRA_HTMLFILENAME";
protected boolean isAddWinBollToolBar() {
return false;
}
@Override String mszHelpIndexFilePath = "";
protected Toolbar initToolBar() { Uri mszHelpIndexFileUri;
return findViewById(R.id.activityassetshtmlToolbar1); Context mContext;
}
// Assets 文件夹里的 Html 文件的名称
String mszHtmlFileName;
//
// @Override
// public Activity getActivity() {
// return this;
// }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
@@ -73,6 +67,10 @@ public class AssetsHtmlActivity extends WinBollActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_assetshtml); setContentView(R.layout.activity_assetshtml);
// 初始化工具栏
Toolbar mToolbar = findViewById(R.id.toolbar);
setActionBar(mToolbar);
mszHtmlFileName = "index.html"; mszHtmlFileName = "index.html";
Intent intent = getIntent(); Intent intent = getIntent();
@@ -81,7 +79,7 @@ public class AssetsHtmlActivity extends WinBollActivity {
if (szTemp != null && !szTemp.trim().equals("")) { if (szTemp != null && !szTemp.trim().equals("")) {
mszHtmlFileName = szTemp.trim(); mszHtmlFileName = szTemp.trim();
} }
ToastUtils.show(mszHtmlFileName); //ToastUtils.show(mszHtmlFileName);
} }
// 与其他应用分享 html 帮助 // 与其他应用分享 html 帮助
@@ -107,13 +105,6 @@ public class AssetsHtmlActivity extends WinBollActivity {
// myWebView.loadUrl(mszHelpIndexFileUri.toString()); // myWebView.loadUrl(mszHelpIndexFileUri.toString());
} }
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
setSubTitle(mszHtmlFileName);
//setSubTitle(TAG);
}
// //
void initWebViewFromAssets(String szHtmlFileName) { void initWebViewFromAssets(String szHtmlFileName) {
try { try {

View File

@@ -1,38 +1,60 @@
package cc.winboll.studio.apputils; package cc.winboll.studio.apputils;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity; import cc.winboll.studio.apputils.R;
import cc.winboll.studio.libapputils.activities.QRCodeDecodeActivity; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libapputils.app.WinBollActivity; import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libapputils.app.WinBollActivityManager; import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libapputils.log.LogActivity; import java.util.List;
import cc.winboll.studio.libapputils.log.LogUtils; import java.util.Set;
import com.hjq.toast.ToastUtils;
final public class MainActivity extends WinBollActivity { final public class MainActivity extends Activity {
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
public static final int REQUEST_QRCODEDECODE_ACTIVITY = 0; public static final int REQUEST_QRCODEDECODE_ACTIVITY = 0;
@Override Toolbar mToolbar;
protected boolean isEnableDisplayHomeAsUp() { LogView mLogView;
return false; //
} // @Override
// public Activity getActivity() {
// return this;
// }
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
//Toolbar toolbar = findViewById(R.id.activitymainToolbar1); mLogView = findViewById(R.id.logview);
//setActionBar(toolbar); mLogView.start();
// 初始化工具栏
mToolbar = findViewById(R.id.toolbar);
setActionBar(mToolbar);
// if (isEnableDisplayHomeAsUp()) {
// // 显示后退按钮
// getActionBar().setDisplayHomeAsUpEnabled(true);
// }
// getActionBar().setSubtitle(getTag());
checkResolveActivity();
archiveInstance();
// 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回 // 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回
//if (prosessIntents(getIntent())) return; //if (prosessIntents(getIntent())) return;
@@ -44,44 +66,94 @@ final public class MainActivity extends WinBollActivity {
// LogUtils.d(TAG, "BuildConfig.DEBUG : " + Boolean.toString(BuildConfig.DEBUG)); // LogUtils.d(TAG, "BuildConfig.DEBUG : " + Boolean.toString(BuildConfig.DEBUG));
} }
boolean checkResolveActivity() {
PackageManager packageManager = getPackageManager();
//Intent intent = new Intent("your_action_here");
Intent intent = getIntent();
if (intent != null) {
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfoList.size() > 0) {
// 传入的Intent action在Activity清单的intent-filter的action节点里有定义
if (intent.getAction() != null) {
// if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) {
// App.setIsDebug(true);
// //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction());
//
// }
}
return true;
} else {
// 传入的Intent action在Activity清单的intent-filter的action节点里没有定义
//ToastUtils.show("false : " + intent.getAction());
return false;
}
}
// action在清单文件中没有声明
ToastUtils.show("false");
return false;
}
void archiveInstance() {
Intent intent = getIntent();
StringBuilder sb = new StringBuilder("\n### Archive Instance ###\n");
if (intent != null) {
ComponentName componentName = intent.getComponent();
if (componentName != null) {
String packageName = componentName.getPackageName();
//Log.d("AppStarter", "启动本应用的应用包名: " + packageName);
sb.append("启动本应用的应用包名: \n" + packageName);
}
sb.append("\nImplicit Intent Tracker \n接收到的 Intent 动作: \n" + intent.getAction());
Set<String> categories = intent.getCategories();
if (categories != null) {
for (String category : categories) {
sb.append("\n接收到的 Intent 类别 :\n" + category);
}
}
Uri data = intent.getData();
if (data != null) {
sb.append("\n接收到的 Intent 数据 :\n" + data.toString());
}
} else {
sb.append("Intent is null.");
}
sb.append("\n\n");
LogUtils.d(TAG, sb.toString());
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// 缓存当前 activity
//WinBollActivityManager.getInstance(this).add(this);
}
@Override
public void onDestroy() {
//WinBollActivityManager.getInstance(this).registeRemove(this);
super.onDestroy();
}
public void onTestLogClick(View view) { public void onTestLogClick(View view) {
LogUtils.d(TAG, "onTestLogClick"); LogUtils.d(TAG, "onTestLogClick");
Toast.makeText(getApplication(), "onTestLogClick", Toast.LENGTH_SHORT).show(); Toast.makeText(getApplication(), "onTestLogClick", Toast.LENGTH_SHORT).show();
} }
public void onLogUtilsClick(View view) { public void onTestLogActivity(View view) {
Intent intent = new Intent(this, LogActivity.class); // Intent intent = new Intent(this, LogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); // intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent); // startActivity(intent);
}
@Override //WinBollActivityManager.getInstance().printAvtivityListInfo();
protected void onPostCreate(Bundle savedInstanceState) { //WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class);
super.onPostCreate(savedInstanceState);
// setSubTitle("");
} }
@Override
public void onBackPressed() {
// exit();
}
// void exit() {
// YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){
//
// @Override
// public void onYes() {
// WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
// }
//
// @Override
// public void onNo() {
// }
// };
// YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener);
// }
// //
// 处理传入的 Intent 数据 // 处理传入的 Intent 数据
// //
@@ -125,58 +197,107 @@ final public class MainActivity extends WinBollActivity {
return true; return true;
} }
@Override
public String getTag() {
return TAG;
}
@Override
protected boolean isAddWinBollToolBar() {
return true;
}
@Override
protected Toolbar initToolBar() {
return findViewById(R.id.activitymainToolbar1);
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
//ToastUtils.show("onCreateOptionsMenu");
getMenuInflater().inflate(R.menu.toolbar_main, menu); getMenuInflater().inflate(R.menu.toolbar_main, menu);
// if (isAddWinBollToolBar()) {
// //ToastUtils.show("mIWinBoll.isAddWinBollToolBar()");
// getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu);
// }
if (App.isDebuging()) {
getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu);
}
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.item_testwinboll) { if (item.getItemId() == R.id.item_exit) {
WinBollActivityManager.getInstance(this).startWinBollActivity(this, TestWinBollActivity.class); //exit();
return true;
} else if (item.getItemId() == R.id.item_teststringtoqrcodeview) { } else if (item.getItemId() == R.id.item_teststringtoqrcodeview) {
WinBollActivityManager.getInstance(this).startWinBollActivity(this, TestStringToQrCodeViewActivity.class); 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) { } else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) {
Intent intent = new Intent(this, QRCodeDecodeActivity.class); Intent intent = new Intent(this, QRCodeDecodeActivity.class);
startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);
} else if (item.getItemId() == R.id.item_testcrashreport) {
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
getString(i);
}
return true;
} else if (item.getItemId() == R.id.item_log) {
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class);
return true;
} else if (item.getItemId() == R.id.item_exitdebug) {
//AboutView.setApp2NormalMode(this);
return true;
} else if (item.getItemId() == android.R.id.home) {
//WinBollActivityManager.getInstance(this).finish(this);
return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
public void onTestJavascriptHtmlActivity(View view) { // void exit() {
// YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){
//
// @Override
// public void onYes() {
// //WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
// }
//
// @Override
// public void onNo() {
// }
// };
// YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener);
//
// }
@Override
public void onBackPressed() {
// if (WinBollActivityManager.getInstance(getApplicationContext()).isFirstIWinBollActivity(this)) {
// exit();
// } else {
// WinBollActivityManager.getInstance(this).finish(this);
// super.onBackPressed();
// }
}
public void onTestAssetsHtmlActivity(View view) {
Intent intent = new Intent(this, AssetsHtmlActivity.class); Intent intent = new Intent(this, AssetsHtmlActivity.class);
intent.putExtra(AssetsHtmlActivity.EXTRA_HTMLFILENAME, "javascript_test.html"); intent.putExtra(AssetsHtmlActivity.EXTRA_HTMLFILENAME, "javascript_test.html");
WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AssetsHtmlActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AssetsHtmlActivity.class);
} }
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onResume() {
switch (requestCode) { super.onResume();
case REQUEST_QRCODEDECODE_ACTIVITY : { mLogView.start();
String text = data.getStringExtra(QRCodeDecodeActivity.EXTRA_RESULT);
ToastUtils.show(text);
break;
}
default : {
ToastUtils.show(String.format("%d, %d", requestCode, resultCode));
super.onActivityResult(requestCode, resultCode, data);
}
}
} }
/*@Override
protected void onActivithyResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_QRCODEDECODE_ACTIVITY : {
if (data != null) {
String text = data.getStringExtra(QRCodeDecodeActivity.EXTRA_RESULT);
ToastUtils.show(text);
}
break;
}
default : {
//ToastUtils.show(String.format("%d, %d", requestCode, resultCode));
super.prosessActivityResult(requestCode, resultCode, data);
}
}
}*/
} }

View File

@@ -1,72 +1,59 @@
package cc.winboll.studio.libapputils.activities; package cc.winboll.studio.apputils;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen@QQ.COM
* @Date 2025/01/18 10:32:21 * @Date 2025/01/18 10:32:21
* @Describe 二维码扫码解码窗口 * @Describe 二维码扫码解码窗口
*/ */
import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.widget.Toolbar; import android.widget.Toolbar;
import androidx.core.app.ActivityCompat; import cc.winboll.studio.apputils.R;
import androidx.core.content.ContextCompat;
import cc.winboll.studio.libapputils.R;
import cc.winboll.studio.libapputils.app.WinBollActivity;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback; import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult; import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.DecoratedBarcodeView; import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import java.util.List; import java.util.List;
public class QRCodeDecodeActivity extends WinBollActivity { public class QRCodeDecodeActivity extends Activity {
public static final String TAG = "QRCodeDecodeActivity"; public static final String TAG = "QRCodeDecodeActivity";
public static final String EXTRA_RESULT = "EXTRA_RESULT";
public static final String EXTRA_RESULT = "EXTRA_RESULT";
private static final int REQUEST_CAMERA_PERMISSION = 1; private static final int REQUEST_CAMERA_PERMISSION = 1;
TextView resultTextView; TextView resultTextView;
DecoratedBarcodeView barcodeView; DecoratedBarcodeView barcodeView;
@Override
public String getTag() {
return TAG;
}
@Override // @Override
protected boolean isEnableDisplayHomeAsUp() { // public Activity getActivity() {
return true; // return this;
} // }
@Override
protected boolean isAddWinBollToolBar() {
return false;
}
@Override
protected Toolbar initToolBar() {
return findViewById(R.id.activityqrcodedecodeToolbar1);
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrcodedecode); setContentView(R.layout.activity_qrcodedecode);
resultTextView = findViewById(R.id.activityqrcodedecodeTextView1);
// 初始化工具栏
// Toolbar mToolbar = findViewById(R.id.toolbar);
// setActionBar(mToolbar);
//resultTextView = findViewById(R.id.activityqrcodedecodeTextView1);
barcodeView = findViewById(R.id.activityqrcodedecodeDecoratedBarcodeView1); barcodeView = findViewById(R.id.activityqrcodedecodeDecoratedBarcodeView1);
// 请求相机权限 // 请求相机权限
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) // if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) { // != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, // ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.CAMERA}, // new String[]{android.Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION); // REQUEST_CAMERA_PERMISSION);
} else { // } else {
startScanning(); // startScanning();
} // }
startScanning();
} }
private void startScanning() { private void startScanning() {

View File

@@ -0,0 +1,20 @@
package cc.winboll.studio.apputils;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/23 16:14:45
*/
import android.app.Activity;
import android.os.Bundle;
public class TestBBMorseCodeActivity extends Activity {
public static final String TAG = "TestBBMorseCodeActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testbbmorsecode);
}
}

View File

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

View File

@@ -1,50 +0,0 @@
package cc.winboll.studio.apputils;
import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libapputils.app.WinBollActivity;
import cc.winboll.studio.libapputils.view.StringToQrCodeView;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2025/01/17 19:50:46
*/
public class TestStringToQrCodeViewActivity extends WinBollActivity {
public static final String TAG = "TestStringToQrCodeViewActivity";
StringToQrCodeView mStringToQrCodeView;
@Override
public String getTag() {
return TAG;
}
@Override
protected Toolbar initToolBar() {
return findViewById(R.id.activityteststringtoqrcodeviewToolbar1);
}
@Override
protected boolean isEnableDisplayHomeAsUp() {
return true;
}
@Override
protected boolean isAddWinBollToolBar() {
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_teststringtoqrcodeview);
mStringToQrCodeView = findViewById(R.id.activityteststringtoqrcodeviewStringToQrCodeView1);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setSubTitle(TAG);
}
}

View File

@@ -1,52 +0,0 @@
package cc.winboll.studio.apputils;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity;
import cc.winboll.studio.libapputils.app.WinBollActivity;
import cc.winboll.studio.libapputils.app.WinBollActivityManager;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2025/01/13 15:09:46
*/
public class TestWinBollActivity extends WinBollActivity {
public static final String TAG = "TestWinBollActivity";
@Override
public String getTag() {
return TAG;
}
@Override
protected Toolbar initToolBar() {
return findViewById(R.id.activitytestwinbollToolbar1);
}
@Override
protected boolean isEnableDisplayHomeAsUp() {
return true;
}
@Override
protected boolean isAddWinBollToolBar() {
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testwinboll);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setSubTitle(TAG);
}
}

View File

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

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar"/>
<cc.winboll.studio.libapputils.views.SimpleWebView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:id="@+id/activityassetshtmlSimpleWebView1"/>
</LinearLayout>

View File

@@ -5,10 +5,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar <android.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/activitymainToolbar1"/> android:id="@+id/toolbar"/>
<LinearLayout <LinearLayout
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -27,32 +27,39 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="TestLog" android:text="TestLog"
android:textAllCaps="false" android:textAllCaps="false"
android:onClick="onTestLogClick"/> android:onClick="onTestLogClick"/>
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="LogUtils" android:text="TestLogActivity"
android:textAllCaps="false" android:textAllCaps="false"
android:onClick="onLogUtilsClick"/> android:onClick="onTestLogActivity"/>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="right"> android:gravity="right">
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAllCaps="false" android:textAllCaps="false"
android:text="Test Javascript Html Activity" android:text="TestAssetsHtmlActivity"
android:onClick="onTestJavascriptHtmlActivity"/> android:onClick="onTestAssetsHtmlActivity"/>
</LinearLayout> </LinearLayout>
<cc.winboll.studio.libappbase.LogView
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Button"
android:id="@+id/logview"
android:layout_weight="1.0"/>
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QRCodeDecodeActivity"/>
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/activityqrcodedecodeDecoratedBarcodeView1"/>
</LinearLayout>

View File

@@ -5,11 +5,5 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text"
android:id="@+id/page_text"/>
</LinearLayout> </LinearLayout>

View File

@@ -6,10 +6,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar <android.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/activityteststringtoqrcodeviewToolbar1"/> android:id="@+id/toolbar"/>
<LinearLayout <LinearLayout
android:orientation="vertical" android:orientation="vertical"
@@ -17,7 +17,7 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1.0"> android:layout_weight="1.0">
<cc.winboll.studio.libapputils.view.StringToQrCodeView <cc.winboll.studio.libapputils.views.StringToQrCodeView
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="300dp" android:layout_height="300dp"
android:id="@+id/activityteststringtoqrcodeviewStringToQrCodeView1"/> android:id="@+id/activityteststringtoqrcodeviewStringToQrCodeView1"/>

View File

@@ -7,7 +7,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#FF36B5B3"> android:background="#FF36B5B3">
<androidx.appcompat.widget.Toolbar <android.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/activitytestwinbollToolbar1"/> android:id="@+id/activitytestwinbollToolbar1"/>

View File

@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_gradient"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@android:id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textColor="#FF000000"
android:textSize="16sp"/>
</LinearLayout>
</LinearLayout>

View File

@@ -1,16 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/item_testwinboll"
android:title="TestWinBollActivity"
app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/item_teststringtoqrcodeview" android:id="@+id/item_teststringtoqrcodeview"
android:title="TestStringToQrCodeViewActivity" android:title="TestStringToQRCodeViewActivity"/>
app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/item_testqrcodedecodeactivity" android:id="@+id/item_testqrcodedecodeactivity"
android:title="TestQRCodeDecodeActivity" android:title="TestQRCodeDecodeActivity"/>
app:showAsAction="ifRoom"/> <item
android:id="@+id/item_testcrashreport"
android:title="TestCrashReportActivity"/>
</menu> </menu>

View File

@@ -4,7 +4,4 @@
<color name="colorPrimary">#FF196ABC</color> <color name="colorPrimary">#FF196ABC</color>
<color name="colorPrimaryDark">#FF002B57</color> <color name="colorPrimaryDark">#FF002B57</color>
<color name="colorAccent">#FF80BFFF</color> <color name="colorAccent">#FF80BFFF</color>
<color name="colorToastFrame">#FFA9A9A9</color>
<color name="colorToastShadow">#FF000000</color>
<color name="colorToastBackgroung">#FFFFFFFF</color>
</resources> </resources>

View File

@@ -1,3 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="MyUtilsTheme" parent="UtilsTheme">
<item name="attrColorPrimary">@color/colorPrimary</item>
<item name="themeGlobalCrashActivity">@style/MyUtilsGlobalCrashActivityTheme</item>
</style>
<style name="MyUtilsGlobalCrashActivityTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="colorTittle">#FFF2F2F2</item>
<item name="colorTittleBackgound">#FF55ABF8</item>
<item name="colorText">#FF55ABF8</item>
<item name="colorTextBackgound">#FFF2F2F2</item>
</style>
</resources> </resources>

View File

@@ -1,10 +1,15 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
// 本地 Maven 仓库(默认路径为 ~/.m2/repository
mavenLocal()
// 或自定义本地仓库路径
maven { url "file:///sdcard/.m2/repository" }
// Nexus Maven 库地址 // Nexus Maven 库地址
// "WinBoll Release" // "WinBoLL Release"
maven { url "https://nexus.winboll.cc/repository/maven-public/" } maven { url "https://nexus.winboll.cc/repository/maven-public/" }
// "WinBoll Snapshot" // "WinBoLL Snapshot"
maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" } maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/public/' }
@@ -15,10 +20,10 @@ buildscript {
maven { url "https://jitpack.io" } maven { url "https://jitpack.io" }
mavenCentral() mavenCentral()
google() google()
mavenLocal() //mavenLocal()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.2.1' classpath 'com.android.tools.build:gradle:7.2.1' // 对应 compileSdkVersion 32
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
} }
@@ -27,9 +32,9 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
// Nexus Maven 库地址 // Nexus Maven 库地址
// "WinBoll Release" // "WinBoLL Release"
maven { url "https://nexus.winboll.cc/repository/maven-public/" } maven { url "https://nexus.winboll.cc/repository/maven-public/" }
// "WinBoll Snapshot" // "WinBoLL Snapshot"
maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" } maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/public/' }
@@ -51,7 +56,7 @@ allprojects {
bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh" bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh"
winbollFilePath = "winboll.properties" winbollFilePath = "winboll.properties"
keyPropsFilePath = "winboll-x/current.keystore" keyPropsFilePath = "current.keystore"
// 定义 lint 输出文件 // 定义 lint 输出文件
lintXmlReportFilePath = "build/reports/lint-results.xml" lintXmlReportFilePath = "build/reports/lint-results.xml"
lintHTMLReportFilePath = "build/reports/lint-results.html" lintHTMLReportFilePath = "build/reports/lint-results.html"

View File

@@ -19,17 +19,17 @@ def genVersionName(def versionName){
android { android {
compileSdkVersion 32 compileSdkVersion 32
buildToolsVersion "33.0.3" buildToolsVersion "32.0.0"
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.contacts" applicationId "cc.winboll.studio.contacts"
minSdkVersion 21 minSdkVersion 24
targetSdkVersion 30 targetSdkVersion 29
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0 // 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "1.0" versionName "15.2"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@@ -41,31 +41,48 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
} }
dependencies { dependencies {
// 二维码使用的类库 api fileTree(dir: 'libs', include: ['*.jar'])
// 权限请求框架https://github.com/getActivity/XXPermissions
api 'com.github.getActivity:XXPermissions:18.63'
// 下拉控件
api 'com.baoyz.pullrefreshlayout:library:1.2.0'
// 拼音搜索
// https://mvnrepository.com/artifact/com.github.open-android/pinyin4j
api 'com.github.open-android:pinyin4j:2.5.0'
// SSH
api 'com.jcraft:jsch:0.1.55'
// Html 解析
api 'org.jsoup:jsoup:1.13.1'
// 二维码类库
api 'com.google.zxing:core:3.4.1' api 'com.google.zxing:core:3.4.1'
api 'com.journeyapps:zxing-android-embedded:3.6.0' api 'com.journeyapps:zxing-android-embedded:3.6.0'
// 应用介绍页类库
api 'io.github.medyo:android-about-page:2.0.0' api 'io.github.medyo:android-about-page:2.0.0'
// 吐司类库
api 'com.github.getActivity:ToastUtils:10.5' api 'com.github.getActivity:ToastUtils:10.5'
api 'com.jcraft:jsch:0.1.55' // 网络连接类库
api 'org.jsoup:jsoup:1.13.1'
api 'com.squareup.okhttp3:okhttp:4.4.1' api 'com.squareup.okhttp3:okhttp:4.4.1'
// AndroidX 类库
/*implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.viewpager:viewpager:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
implementation 'androidx.fragment:fragment:1.1.0'
implementation 'com.google.android.material:material:1.4.0'
*/
api 'androidx.appcompat:appcompat:1.1.0' api 'androidx.appcompat:appcompat:1.1.0'
api 'androidx.viewpager:viewpager:1.0.0'
api 'androidx.fragment:fragment:1.1.0'
api 'com.google.android.material:material:1.4.0' api 'com.google.android.material:material:1.4.0'
//api 'androidx.viewpager:viewpager:1.0.0'
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0'
api 'cc.winboll.studio:libapputils:9.3.2' api 'cc.winboll.studio:libaes:15.2.4'
api 'cc.winboll.studio:libappbase:1.5.6' api 'cc.winboll.studio:libapputils:15.2.1'
api 'cc.winboll.studio:libappbase:15.2.2'
api fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue Feb 25 00:17:29 HKT 2025 #Sun Apr 13 02:46:09 HKT 2025
stageCount=2 stageCount=8
libraryProject= libraryProject=
baseVersion=1.0 baseVersion=15.2
publishVersion=1.0.1 publishVersion=15.2.7
buildCount=0 buildCount=0
baseBetaVersion=1.0.2 baseBetaVersion=15.2.8

View File

@@ -29,9 +29,13 @@
<!-- 更改您的音频设置 --> <!-- 更改您的音频设置 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 读取通话记录 -->
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<!-- 录音 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application <application
android:name=".App" android:name=".App"
android:allowBackup="true" android:allowBackup="true"
@@ -65,7 +69,7 @@
<activity <activity
android:name=".phonecallui.PhoneCallActivity" android:name=".phonecallui.PhoneCallActivity"
android:launchMode="singleInstance" android:launchMode="singleTask"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
@@ -182,6 +186,10 @@
</provider> </provider>
<activity android:name="cc.winboll.studio.contacts.activities.UnitTestActivity"/>
<activity android:name="cc.winboll.studio.contacts.activities.AboutActivity"/>
</application> </application>
</manifest> </manifest>

View File

@@ -5,9 +5,10 @@ package cc.winboll.studio.contacts;
* @Date 2024/12/08 15:10:51 * @Date 2024/12/08 15:10:51
* @Describe 全局应用类 * @Describe 全局应用类
*/ */
import android.view.Gravity;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.winboll.WinBollActivityManager;
import cc.winboll.studio.libapputils.app.WinBollActivityManager; import com.hjq.toast.ToastUtils;
public class App extends GlobalApplication { public class App extends GlobalApplication {
@@ -17,12 +18,20 @@ public class App extends GlobalApplication {
public void onCreate() { public void onCreate() {
// 必须在调用基类前设置应用调试标志, // 必须在调用基类前设置应用调试标志,
// 这样可以预先设置日志与数据的存储根目录。 // 这样可以预先设置日志与数据的存储根目录。
setIsDebuging(this, BuildConfig.DEBUG); //setIsDebuging(BuildConfig.DEBUG);
super.onCreate(); super.onCreate();
// 设置 WinBoll 应用 UI 类型 // 设置 WinBoll 应用 UI 类型
WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication); WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication);
LogUtils.d(TAG, "onCreate"); //LogUtils.d(TAG, "onCreate");
// 初始化 Toast 框架
ToastUtils.init(this);
// 设置 Toast 布局样式
//ToastUtils.setView(R.layout.toast_custom_view);
//ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
} }
} }

View File

@@ -1,52 +1,44 @@
package cc.winboll.studio.contacts; package cc.winboll.studio.contacts;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.role.RoleManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.telecom.TelecomManager; import android.telecom.TelecomManager;
import android.view.LayoutInflater; import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat; import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.activities.CallActivity; import cc.winboll.studio.contacts.activities.SettingsActivity;
import cc.winboll.studio.contacts.adapters.MyPagerAdapter;
import cc.winboll.studio.contacts.beans.MainServiceBean; import cc.winboll.studio.contacts.beans.MainServiceBean;
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.contacts.services.MainService;
import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libapputils.app.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import cc.winboll.studio.libapputils.app.WinBollActivityManager;
import cc.winboll.studio.libapputils.bean.APPInfo;
import cc.winboll.studio.libapputils.view.YesNoAlertDialog;
import cc.winboll.studio.contacts.listenphonecall.CallListenerService;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout;
import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import android.content.DialogInterface;
import cc.winboll.studio.contacts.activities.SettingsActivity;
final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener {
@@ -57,11 +49,13 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
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; LogView mLogView;
Toolbar mToolbar; Toolbar mToolbar;
CheckBox cbMainService; CheckBox cbMainService;
MainServiceBean mMainServiceBean; MainServiceBean mMainServiceBean;
ViewPager viewPager; private TabLayout tabLayout;
private ViewPager viewPager;
private List<View> views; //用来存放放进ViewPager里面的布局 private List<View> views; //用来存放放进ViewPager里面的布局
//实例化存储imageView导航原点的集合 //实例化存储imageView导航原点的集合
ImageView[] imageViews; ImageView[] imageViews;
@@ -70,15 +64,20 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
LinearLayout linearLayout;//下标所在在LinearLayout布局里 LinearLayout linearLayout;//下标所在在LinearLayout布局里
int currentPoint = 0;//当前被选中中页面的下标 int currentPoint = 0;//当前被选中中页面的下标
private TelephonyManager telephonyManager;
private MyPhoneStateListener phoneStateListener;
List<Fragment> fragmentList;
List<String> tabTitleList;
private static final int DIALER_REQUEST_CODE = 1; private static final int DIALER_REQUEST_CODE = 1;
@Override @Override
public AppCompatActivity getActivity() { public Activity getActivity() {
return this; return this;
} }
@Override // @Override
public APPInfo getAppInfo() { // public APPInfo getAppInfo() {
// String szBranchName = "contacts"; // String szBranchName = "contacts";
// //
// APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); // APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo();
@@ -93,8 +92,8 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// appInfo.setAppAPKName("Contacts"); // appInfo.setAppAPKName("Contacts");
// appInfo.setAppAPKFolderName("Contacts"); // appInfo.setAppAPKFolderName("Contacts");
// return appInfo; // return appInfo;
return null; // return null;
} // }
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -102,28 +101,51 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
//if (prosessIntents(getIntent())) return; //if (prosessIntents(getIntent())) return;
// 以下正常创建主窗口 // 以下正常创建主窗口
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
_MainActivity = this;
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
// 初始化工具栏 // 初始化工具栏
mToolbar = findViewById(R.id.activitymainToolbar1); mToolbar = findViewById(R.id.activitymainToolbar1);
setSupportActionBar(mToolbar); setSupportActionBar(mToolbar);
if (isEnableDisplayHomeAsUp()) { // if (isEnableDisplayHomeAsUp()) {
// 显示后退按钮 // // 显示后退按钮
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} // }
getSupportActionBar().setSubtitle(getTag()); getSupportActionBar().setSubtitle(getTag());
initData(); tabLayout = findViewById(R.id.tabLayout);
initView(); viewPager = findViewById(R.id.viewPager);
//initPoint();//调用初始化导航原点的方法
viewPager.addOnPageChangeListener(this);//滑动事件
ViewPager viewPager = findViewById(R.id.activitymainViewPager1); // 创建Fragment列表和标题列表
MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); fragmentList = new ArrayList<>();
viewPager.setAdapter(pagerAdapter); tabTitleList = new ArrayList<>();
TabLayout tabLayout = findViewById(R.id.activitymainTabLayout1); fragmentList.add(CallLogFragment.newInstance(0));
fragmentList.add(ContactsFragment.newInstance(1));
fragmentList.add(LogFragment.newInstance(2));
tabTitleList.add("通话记录");
tabTitleList.add("联系人");
tabTitleList.add("应用日志");
// 设置ViewPager的适配器
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList, tabTitleList);
viewPager.setAdapter(adapter);
// 关联TabLayout和ViewPager
tabLayout.setupWithViewPager(viewPager); tabLayout.setupWithViewPager(viewPager);
// initData();
// initView();
// //initPoint();//调用初始化导航原点的方法
// viewPager.addOnPageChangeListener(this);//滑动事件
//ViewPager viewPager = findViewById(R.id.activitymainViewPager1);
//MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
//viewPager.setAdapter(pagerAdapter);
//TabLayout tabLayout = findViewById(R.id.activitymainTabLayout1);
//tabLayout.setupWithViewPager(viewPager);
// mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); // mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class);
// if (mMainServiceBean == null) { // if (mMainServiceBean == null) {
// mMainServiceBean = new MainServiceBean(); // mMainServiceBean = new MainServiceBean();
@@ -140,36 +162,86 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// } // }
// } // }
// }); // });
MainService.startMainService(MainActivity.this);
MainServiceBean mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class);
if (mMainServiceBean == null) {
mMainServiceBean = new MainServiceBean();
MainServiceBean.saveBean(this, mMainServiceBean);
}
if (mMainServiceBean.isEnable()) {
MainService.startMainService(this);
}
// 初始化TelephonyManager和PhoneStateListener
telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
phoneStateListener = new MyPhoneStateListener();
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
// ViewPager的适配器
private class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
private List<String> tabTitleList;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> tabTitleList) {
super(fm);
this.fragmentList = fragmentList;
this.tabTitleList = tabTitleList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return tabTitleList.get(position);
}
}
public static void dialPhoneNumber(String phoneNumber) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(android.net.Uri.parse("tel:" + phoneNumber));
if (ActivityCompat.checkSelfPermission(_MainActivity, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
_MainActivity.startActivity(intent);
} }
//初始化view即显示的图片 //初始化view即显示的图片
void initView() { // void initView() {
viewPager = findViewById(R.id.activitymainViewPager1); // viewPager = findViewById(R.id.activitymainViewPager1);
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); // pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter); // viewPager.setAdapter(pagerAdapter);
//adapter = new MyPagerAdapter(views); // //adapter = new MyPagerAdapter(views);
//viewPager = findViewById(R.id.activitymainViewPager1); // //viewPager = findViewById(R.id.activitymainViewPager1);
//viewPager.setAdapter(adapter); // //viewPager.setAdapter(adapter);
//linearLayout = findViewById(R.id.activitymainLinearLayout1); // //linearLayout = findViewById(R.id.activitymainLinearLayout1);
//initPoint();//初始化页面下方的点 // //initPoint();//初始化页面下方的点
viewPager.setOnPageChangeListener(this); // viewPager.setOnPageChangeListener(this);
//
} // }
//初始化所要显示的布局 //初始化所要显示的布局
void initData() { // void initData() {
ViewPager viewPager = findViewById(R.id.activitymainViewPager1); // LayoutInflater inflater = LayoutInflater.from(getActivity());
LayoutInflater inflater = LayoutInflater.from(getActivity()); // View view1 = inflater.inflate(R.layout.fragment_call_log, viewPager, false);
View view1 = inflater.inflate(R.layout.fragment_call, viewPager, false); // View view2 = inflater.inflate(R.layout.fragment_contacts, viewPager, false);
View view2 = inflater.inflate(R.layout.fragment_contacts, viewPager, false); // View view3 = inflater.inflate(R.layout.fragment_log, viewPager, false);
View view3 = inflater.inflate(R.layout.fragment_log, viewPager, false); //
// views = new ArrayList<>();
views = new ArrayList<>(); // views.add(view1);
views.add(view1); // views.add(view2);
views.add(view2); // views.add(view3);
views.add(view3); // }
}
// void initPoint() { // void initPoint() {
// imageViews = new ImageView[5];//实例化5个图片 // imageViews = new ImageView[5];//实例化5个图片
@@ -231,6 +303,23 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
//setSubTitle(""); //setSubTitle("");
} }
private class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
LogUtils.d(TAG, "电话已挂断");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
LogUtils.d(TAG, "正在通话中");
break;
case TelephonyManager.CALL_STATE_RINGING:
LogUtils.d(TAG, "来电: " + incomingNumber);
break;
}
}
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
@@ -287,40 +376,25 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
return TAG; return TAG;
} }
@Override // @Override
public Toolbar initToolBar() { // public void onBackPressed() {
return findViewById(R.id.activitymainToolbar1); // exit();
} // }
//
@Override // void exit() {
public boolean isAddWinBollToolBar() { // YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){
return true; //
} // @Override
// public void onYes() {
@Override // WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
public boolean isEnableDisplayHomeAsUp() { // }
return false; //
} // @Override
// public void onNo() {
@Override // }
public void onBackPressed() { // };
exit(); // YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener);
} // }
void exit() {
YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){
@Override
public void onYes() {
WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
}
@Override
public void onNo() {
}
};
YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener);
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
@@ -331,11 +405,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.item_call) { if (item.getItemId() == R.id.item_settings) {
Intent intent = new Intent(this, CallActivity.class);
startActivity(intent);
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class);
} else if (item.getItemId() == R.id.item_settings) {
Intent intent = new Intent(this, SettingsActivity.class); Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent); startActivity(intent);
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class); //WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class);

View File

@@ -1,35 +0,0 @@
package cc.winboll.studio.contacts;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/20 21:14:52
* @Describe PhoneCallManager
*/
import android.telecom.Call;
import android.telecom.VideoProfile;
public class PhoneCallManager {
public static final String TAG = "PhoneCallManager";
public static Call call;
/**
* 接听电话
*/
public void answer() {
if (call != null) {
call.answer(VideoProfile.STATE_AUDIO_ONLY);
}
}
/**
* 断开电话,包括来电时的拒接以及接听后的挂断
*/
public void disconnect() {
if (call != null) {
call.disconnect();
}
}
}

View File

@@ -0,0 +1,91 @@
package cc.winboll.studio.contacts.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/31 15:15:54
* @Describe 应用介绍窗口
*/
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
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;
public class AboutActivity extends WinBollActivity implements IWinBollActivity {
public static final String TAG = "AboutActivity";
Context mContext;
Toolbar mToolbar;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.activity_about);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mToolbar.setSubtitle(TAG);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
AboutView aboutView = CreateAboutView();
// 在 Activity 的 onCreate 或其他生命周期方法中调用
// LinearLayout layout = new LinearLayout(this);
// layout.setOrientation(LinearLayout.VERTICAL);
// // 创建布局参数(宽度和高度)
// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
// ViewGroup.LayoutParams.MATCH_PARENT,
// ViewGroup.LayoutParams.MATCH_PARENT
// );
// addContentView(aboutView, params);
LinearLayout layout = findViewById(R.id.aboutviewroot_ll);
// 创建布局参数(宽度和高度)
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);
layout.addView(aboutView, params);
GlobalApplication.getWinBollActivityManager().add(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
GlobalApplication.getWinBollActivityManager().registeRemove(this);
}
public AboutView CreateAboutView() {
String szBranchName = "contacts";
APPInfo appInfo = new APPInfo();
appInfo.setAppName("Contacts");
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
appInfo.setAppDescription("通讯录与拨号");
appInfo.setAppGitName("APP");
appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(szBranchName);
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=Contacts");
appInfo.setAppAPKName("Contacts");
appInfo.setAppAPKFolderName("Contacts");
return new AboutView(mContext, appInfo);
}
}

View File

@@ -34,6 +34,7 @@ public class CallActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main); //setContentView(R.layout.activity_main);
setContentView(R.layout.activity_call); setContentView(R.layout.activity_call);

View File

@@ -4,7 +4,6 @@ package cc.winboll.studio.contacts.activities;
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/21 05:37:42 * @Date 2025/02/21 05:37:42
*/ */
import android.app.NotificationManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@@ -15,17 +14,33 @@ import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Switch; import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter;
import cc.winboll.studio.contacts.beans.MainServiceBean;
import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel;
import cc.winboll.studio.contacts.beans.RingTongBean; import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.libappbase.IWinBollActivity; import cc.winboll.studio.contacts.beans.SettingsModel;
import cc.winboll.studio.libappbase.bean.APPInfo; 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 com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.lang.reflect.Field; 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 {
@@ -33,11 +48,25 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
Toolbar mToolbar; Toolbar mToolbar;
Switch swSilent; Switch swSilent;
SeekBar msbVolume;
TextView mtvVolume;
int mnStreamMaxVolume;
int mnStreamVolume;
Switch mswMainService;
static DuInfoTextView _DuInfoTextView;
@Override // 云盾防御层数量
public APPInfo getAppInfo() { EditText etDunTotalCount;
return null; // 防御层恢复时间间隔(秒钟)
} EditText etDunResumeSecondCount;
// 每次恢复防御层数
EditText etDunResumeCount;
// 是否启用云盾
Switch swIsEnableDun;
private RecyclerView recyclerView;
private PhoneConnectRuleAdapter adapter;
private List<PhoneConnectRuleModel> ruleList;
@Override @Override
public AppCompatActivity getActivity() { public AppCompatActivity getActivity() {
@@ -49,21 +78,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
return TAG; return TAG;
} }
@Override
public Toolbar initToolBar() {
return findViewById(R.id.activitymainToolbar1);
}
@Override
public boolean isAddWinBollToolBar() {
return true;
}
@Override
public boolean isEnableDisplayHomeAsUp() {
return false;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -72,11 +86,136 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
// 初始化工具栏 // 初始化工具栏
mToolbar = findViewById(R.id.activitymainToolbar1); mToolbar = findViewById(R.id.activitymainToolbar1);
setSupportActionBar(mToolbar); setSupportActionBar(mToolbar);
if (isEnableDisplayHomeAsUp()) { // 显示后退按钮
// 显示后退按钮 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
getSupportActionBar().setSubtitle(getTag()); getSupportActionBar().setSubtitle(getTag());
mswMainService = findViewById(R.id.sw_mainservice);
MainServiceBean mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class);
mswMainService.setChecked(mMainServiceBean.isEnable());
mswMainService.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
LogUtils.d(TAG, "mswMainService onClick");
// TODO: Implement this method
if (mswMainService.isChecked()) {
//ToastUtils.show("Is Checked");
MainService.startMainServiceAndSaveStatus(SettingsActivity.this);
} else {
//ToastUtils.show("Not Checked");
MainService.stopMainServiceAndSaveStatus(SettingsActivity.this);
}
}
});
msbVolume = findViewById(R.id.bellvolume);
mtvVolume = findViewById(R.id.tv_volume);
final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 设置SeekBar的最大值为系统铃声音量的最大刻度
mnStreamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
msbVolume.setMax(mnStreamMaxVolume);
// 获取当前铃声音量并设置为SeekBar的初始进度
mnStreamVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
msbVolume.setProgress(mnStreamVolume);
updateStreamVolumeTextView();
msbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
// 设置铃声音量
audioManager.setStreamVolume(AudioManager.STREAM_RING, progress, 0);
RingTongBean bean = RingTongBean.loadBean(SettingsActivity.this, RingTongBean.class);
if (bean == null) {
bean = new RingTongBean();
}
bean.setStreamVolume(progress);
RingTongBean.saveBean(SettingsActivity.this, bean);
mnStreamVolume = progress;
updateStreamVolumeTextView();
//Toast.makeText(SettingsActivity.this, "音量设置为: " + progress, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// 当开始拖动SeekBar时的操作
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// 当停止拖动SeekBar时的操作
}
});
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ruleList = Rules.getInstance(this).getPhoneBlacRuleBeanList();
adapter = new PhoneConnectRuleAdapter(this, ruleList);
recyclerView.setAdapter(adapter);
// 设置参数云盾
_DuInfoTextView = findViewById(R.id.tv_DunInfo);
etDunTotalCount = findViewById(R.id.et_DunTotalCount);
etDunResumeSecondCount = findViewById(R.id.et_DunResumeSecondCount);
etDunResumeCount = findViewById(R.id.et_DunResumeCount);
swIsEnableDun = findViewById(R.id.sw_IsEnableDun);
SettingsModel settingsModel = Rules.getInstance(this).getSettingsModel();
etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
swIsEnableDun.setChecked(settingsModel.isEnableDun());
boolean isEnableDun = settingsModel.isEnableDun();
etDunTotalCount.setEnabled(!isEnableDun);
etDunResumeSecondCount.setEnabled(!isEnableDun);
etDunResumeCount.setEnabled(!isEnableDun);
}
public static void notifyDunInfoUpdate() {
if (_DuInfoTextView != null) {
_DuInfoTextView.notifyInfoUpdate();
}
}
public void onSW_IsEnableDun(View view) {
LogUtils.d(TAG, "onSW_IsEnableDun");
boolean isEnableDun = swIsEnableDun.isChecked();
etDunTotalCount.setEnabled(!isEnableDun);
etDunResumeSecondCount.setEnabled(!isEnableDun);
etDunResumeCount.setEnabled(!isEnableDun);
SettingsModel settingsModel = Rules.getInstance(this).getSettingsModel();
if (isEnableDun) {
settingsModel.setDunTotalCount(Integer.parseInt(etDunTotalCount.getText().toString()));
settingsModel.setDunResumeSecondCount(Integer.parseInt(etDunResumeSecondCount.getText().toString()));
settingsModel.setDunResumeCount(Integer.parseInt(etDunResumeCount.getText().toString()));
}
settingsModel.setIsEnableDun(isEnableDun);
Rules.getInstance(this).saveDun();
Rules.getInstance(this).reload();
}
void updateStreamVolumeTextView() {
mtvVolume.setText(String.format("%d/%d", mnStreamVolume, mnStreamMaxVolume));
}
public void onUnitTest(View view) {
Intent intent = new Intent(this, UnitTestActivity.class);
startActivity(intent);
}
public void onAddNewConnectionRule(View view) {
Rules.getInstance(this).getPhoneBlacRuleBeanList().add(new PhoneConnectRuleModel());
Rules.getInstance(this).saveRules();
adapter.notifyDataSetChanged();
} }
public void onDefaultPhone(View view) { public void onDefaultPhone(View view) {
@@ -94,6 +233,38 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
} }
} }
public void onDownloadBoBullToon(View view) {
final TomCat tomCat = TomCat.getInstance(this);
new Thread(new Runnable() {
@Override
public void run() {
if (tomCat.downloadBoBullToon()) {
ToastUtils.show("BoBullToon downlaod OK!");
MainService.restartMainService(SettingsActivity.this);
Rules.getInstance(SettingsActivity.this).reload();
}
}
}).start();
}
public void onSearchBoBullToonPhone(View view) {
TomCat tomCat = TomCat.getInstance(this);
EditText etPhone = findViewById(R.id.activitysettingsEditText1);
String phone = etPhone.getText().toString().trim();
if (tomCat.loadPhoneBoBullToon()) {
if (tomCat.isPhoneBoBullToon(phone)) {
ToastUtils.show("It is a BoBullToon Phone!");
} else {
ToastUtils.show("Not in BoBullToon.");
}
} else {
ToastUtils.show("没有下载 BoBullToon。");
}
}
private void askForDrawOverlay() { private void askForDrawOverlay() {
AlertDialog alertDialog = new AlertDialog.Builder(this) AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("允许显示悬浮框") .setTitle("允许显示悬浮框")
@@ -140,4 +311,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
} }
} }
} }
public void onAbout(View view) {
App.getWinBollActivityManager().startWinBollActivity(this, AboutActivity.class);
}
} }

View File

@@ -0,0 +1,94 @@
package cc.winboll.studio.contacts.activities;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.contacts.utils.IntUtils;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/02 16:07:04
*/
public class UnitTestActivity extends Activity {
public static final String TAG = "UnitTestActivity";
LogView logView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unittest);
logView = findViewById(R.id.logview);
logView.start();
}
public void onTestPhone(View view) {
// 开始测试数据
EditText etPhone = findViewById(R.id.phone_et);
Rules rules = Rules.getInstance(this);
String phone = etPhone.getText().toString().trim();
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
}
public void onTestMain(View view) {
LogUtils.d(TAG, "IntUtils.unittest_getIntInRange();");
IntUtils.unittest_getIntInRange();
Rules rules = Rules.getInstance(this);
// 如果没有规则就添加测试规则
if (rules.getPhoneBlacRuleBeanList().size() == 0) {
// 手机号码允许
// 中国手机号码正则表达式以1开头第二位可以是3、4、5、6、7、8、9后面跟9位数字
String regex = "^1[3-9]\\d{9}$";
rules.add(regex, true, true);
// 指定区号号码允许
regex = "^0660\\d+$";
rules.add(regex, true, true);
// 指定区号号码允许
regex = "^020\\d+$";
rules.add(regex, true, true);
// 添加默认拒接规则
regex = ".*";
rules.add(regex, false, true);
// 保存规则到文件
rules.saveRules();
}
// 开始测试数据
String phone = "16769764848";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "16856582777";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "17519703124";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "0205658955";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "0108965253";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "+8616769764848";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "4005816769764848";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
phone = "95566";
LogUtils.d(TAG, String.format("Test phone : %s\n%s", phone, rules.isAllowed(phone)));
}
}

View File

@@ -0,0 +1,60 @@
package cc.winboll.studio.contacts.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/31 15:16:45
* @Describe 应用窗口基类
*/
import android.app.Activity;
import android.os.Bundle;
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;
public class WinBollActivity extends AppCompatActivity implements IWinBollActivity {
public static final String TAG = "WinBollActivity";
protected volatile AESThemeBean.ThemeType mThemeType;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
mThemeType = getThemeType();
setThemeStyle();
super.onCreate(savedInstanceState);
}
AESThemeBean.ThemeType getThemeType() {
/*SharedPreferences sharedPreferences = getSharedPreferences(
SHAREDPREFERENCES_NAME, MODE_PRIVATE);
return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))];
*/
return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext()));
}
void setThemeStyle() {
//setTheme(AESThemeBean.getThemeStyle(getThemeType()));
setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@@ -0,0 +1,93 @@
package cc.winboll.studio.contacts.adapters;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/26 13:09:32
* @Describe CallLogAdapter
*/
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.CallLogModel;
import cc.winboll.studio.contacts.utils.ContactUtils;
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
import com.hjq.toast.ToastUtils;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogViewHolder> {
public static final String TAG = "CallLogAdapter";
private List<CallLogModel> callLogList;
ContactUtils mContactUtils;
Context mContext;
public CallLogAdapter(Context context, List<CallLogModel> callLogList) {
mContext = context;
this.mContactUtils = ContactUtils.getInstance(mContext);
this.callLogList = callLogList;
}
@NonNull
@Override
public CallLogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_call_log, parent, false);
return new CallLogViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CallLogViewHolder holder, int position) {
final CallLogModel callLog = callLogList.get(position);
holder.phoneNumber.setText(callLog.getPhoneNumber() + "" + mContactUtils.getContactsName(callLog.getPhoneNumber()));
holder.callStatus.setText(callLog.getCallStatus());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
holder.callDate.setText(dateFormat.format(callLog.getCallDate()));
// 初始化拉动后拨号控件
holder.dialAOHPCTCSeekBar.setThumb(holder.itemView.getContext().getDrawable(R.drawable.ic_call));
holder.dialAOHPCTCSeekBar.setBlurRightDP(80);
holder.dialAOHPCTCSeekBar.setThumbOffset(0);
holder.dialAOHPCTCSeekBar.setOnOHPCListener(
new AOHPCTCSeekBar.OnOHPCListener(){
@Override
public void onOHPCommit() {
String phoneNumber = callLog.getPhoneNumber().replaceAll("\\s", "");
ToastUtils.show(phoneNumber);
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(android.net.Uri.parse("tel:" + phoneNumber));
// 添加 FLAG_ACTIVITY_NEW_TASK 标志
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
holder.itemView.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return callLogList.size();
}
public class CallLogViewHolder extends RecyclerView.ViewHolder {
TextView phoneNumber, callStatus, callDate;
Button dialButton;
AOHPCTCSeekBar dialAOHPCTCSeekBar;
public CallLogViewHolder(@NonNull View itemView) {
super(itemView);
phoneNumber = itemView.findViewById(R.id.phone_number);
callStatus = itemView.findViewById(R.id.call_status);
callDate = itemView.findViewById(R.id.call_date);
dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial);
}
}
}

View File

@@ -0,0 +1,84 @@
package cc.winboll.studio.contacts.adapters;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/26 13:35:44
* @Describe ContactAdapter
*/
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.ContactModel;
import com.hjq.toast.ToastUtils;
import java.util.List;
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
public static final String TAG = "ContactAdapter";
private static final int REQUEST_CALL_PHONE = 1;
private List<ContactModel> contactList;
public ContactAdapter(List<ContactModel> contactList) {
this.contactList = contactList;
}
@NonNull
@Override
public ContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact, parent, false);
return new ContactViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {
final ContactModel contact = contactList.get(position);
holder.contactName.setText(contact.getName());
holder.contactNumber.setText(contact.getNumber());
// 初始化拉动后拨号控件
holder.dialAOHPCTCSeekBar.setThumb(holder.itemView.getContext().getDrawable(R.drawable.ic_call));
holder.dialAOHPCTCSeekBar.setBlurRightDP(80);
holder.dialAOHPCTCSeekBar.setThumbOffset(0);
holder.dialAOHPCTCSeekBar.setOnOHPCListener(
new AOHPCTCSeekBar.OnOHPCListener(){
@Override
public void onOHPCommit() {
String phoneNumber = contact.getNumber().replaceAll("\\s", "");
ToastUtils.show(phoneNumber);
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(android.net.Uri.parse("tel:" + phoneNumber));
// 添加 FLAG_ACTIVITY_NEW_TASK 标志
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
holder.itemView.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return contactList.size();
}
public class ContactViewHolder extends RecyclerView.ViewHolder {
TextView contactName;
TextView contactNumber;
AOHPCTCSeekBar dialAOHPCTCSeekBar;
public ContactViewHolder(@NonNull View itemView) {
super(itemView);
contactName = itemView.findViewById(R.id.contact_name);
contactNumber = itemView.findViewById(R.id.contact_number);
dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial);
}
}
}

View File

@@ -1,42 +0,0 @@
package cc.winboll.studio.contacts.adapters;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/20 13:33:04
* @Describe MyPagerAdapter
*/
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import cc.winboll.studio.contacts.fragments.CallFragment;
import cc.winboll.studio.contacts.fragments.ContactsFragment;
import cc.winboll.studio.contacts.fragments.LogFragment;
public class MyPagerAdapter extends FragmentPagerAdapter {
public static final String TAG = "MyPagerAdapter";
private static final int PAGE_COUNT = 3;
public MyPagerAdapter(@NonNull FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@NonNull
@Override
public Fragment getItem(int position) {
if(position == 1) {
return ContactsFragment.newInstance(position);
} else if(position == 2) {
return LogFragment.newInstance(position);
} else {
return CallFragment.newInstance(position);
}
}
@Override
public int getCount() {
return PAGE_COUNT;
}
}

View File

@@ -0,0 +1,247 @@
package cc.winboll.studio.contacts.adapters;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/02 17:27:41
* @Describe PhoneConnectRuleAdapter
*/
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel;
import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.contacts.views.LeftScrollView;
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
import com.hjq.toast.ToastUtils;
import java.util.ArrayList;
import java.util.List;
public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final String TAG = "PhoneConnectRuleAdapter";
private static final int VIEW_TYPE_SIMPLE = 0;
private static final int VIEW_TYPE_EDIT = 1;
private Context context;
private List<PhoneConnectRuleModel> ruleList;
public PhoneConnectRuleAdapter(Context context, List<PhoneConnectRuleModel> ruleList) {
this.context = context;
this.ruleList = ruleList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if (viewType == VIEW_TYPE_SIMPLE) {
View view = inflater.inflate(R.layout.view_phone_connect_rule_simple, parent, false);
return new SimpleViewHolder(parent, view);
} else {
View view = inflater.inflate(R.layout.view_phone_connect_rule, parent, false);
return new EditViewHolder(parent, view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
final PhoneConnectRuleModel model = ruleList.get(position);
if (holder instanceof SimpleViewHolder) {
final SimpleViewHolder simpleViewHolder = (SimpleViewHolder) holder;
String szView = model.getRuleText().trim().equals("") ?"[NULL]": model.getRuleText();
simpleViewHolder.tvRuleText.setText(szView);
simpleViewHolder.scrollView.setOnActionListener(new LeftScrollView.OnActionListener(){
@Override
public void onUp() {
ArrayList<PhoneConnectRuleModel> list = Rules.getInstance(context).getPhoneBlacRuleBeanList();
if (position > 0) {
ToastUtils.show("onUp");
simpleViewHolder.scrollView.smoothScrollTo(0, 0);
// PhoneConnectRuleModel newBean = new PhoneConnectRuleModel();
// newBean.setRuleText(list.get(position).getRuleText());
// newBean.setIsAllowConnection(list.get(position).isAllowConnection());
// newBean.setIsEnable(list.get(position).isEnable());
// newBean.setIsSimpleView(list.get(position).isSimpleView());
list.add(position - 1, list.get(position));
list.remove(position + 1);
Rules.getInstance(context).saveRules();
notifyDataSetChanged();
}
}
@Override
public void onDown() {
ArrayList<PhoneConnectRuleModel> list = Rules.getInstance(context).getPhoneBlacRuleBeanList();
if (position < list.size() - 1) {
ToastUtils.show("onDown");
simpleViewHolder.scrollView.smoothScrollTo(0, 0);
// PhoneConnectRuleModel newBean = new PhoneConnectRuleModel();
// newBean.setRuleText(list.get(position).getRuleText());
// newBean.setIsAllowConnection(list.get(position).isAllowConnection());
// newBean.setIsEnable(list.get(position).isEnable());
// newBean.setIsSimpleView(list.get(position).isSimpleView());
list.add(position + 2, list.get(position));
list.remove(position);
Rules.getInstance(context).saveRules();
notifyDataSetChanged();
}
}
@Override
public void onEdit() {
simpleViewHolder.scrollView.smoothScrollTo(0, 0);
model.setIsSimpleView(false);
notifyDataSetChanged();
//notifyItemChanged(position);
}
@Override
public void onDelete() {
YesNoAlertDialog.show(simpleViewHolder.scrollView.getContext(), "删除确认", "是否删除该通话规则?", new YesNoAlertDialog.OnDialogResultListener(){
@Override
public void onYes() {
simpleViewHolder.scrollView.smoothScrollTo(0, 0);
model.setIsSimpleView(true);
ArrayList<PhoneConnectRuleModel> list = Rules.getInstance(context).getPhoneBlacRuleBeanList();
list.remove(position);
Rules.getInstance(context).saveRules();
notifyDataSetChanged();
//notifyItemChanged(position);
}
@Override
public void onNo() {
}
});
}
});
// simpleViewHolder.editButton.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// model.setIsSimpleView(false);
// notifyItemChanged(position);
// }
// });
// simpleViewHolder.deleteButton.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// model.setIsSimpleView(false);
// ArrayList<PhoneConnectRuleModel> list = Rules.getInstance(context).getPhoneBlacRuleBeanList();
// list.remove(position);
// Rules.getInstance(context).saveRules();
// notifyItemChanged(position);
// }
// });
// // 触摸事件处理
// simpleViewHolder.contentLayout.setOnTouchListener(new View.OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// switch (event.getAction()) {
// case MotionEvent.ACTION_DOWN:
// simpleViewHolder.startX = event.getX();
// simpleViewHolder.isSwiping = true;
// break;
// case MotionEvent.ACTION_MOVE:
// if (simpleViewHolder.isSwiping) {
// float deltaX = simpleViewHolder.startX - event.getX();
// if (deltaX > 0) { // 左滑
// float translationX = Math.max(-simpleViewHolder.actionLayout.getWidth(), -deltaX);
// simpleViewHolder.contentLayout.setTranslationX(translationX);
// simpleViewHolder.actionLayout.setVisibility(View.VISIBLE);
// }
// }
// break;
// case MotionEvent.ACTION_UP:
// simpleViewHolder.isSwiping = false;
// if (simpleViewHolder.contentLayout.getTranslationX() < -simpleViewHolder.actionLayout.getWidth() / 2) {
// // 保持按钮显示
// simpleViewHolder.contentLayout.setTranslationX(-actionLayout.getWidth());
// } else {
// // 恢复原状
// simpleViewHolder.contentLayout.animate().translationX(0).setDuration(200).start();
// simpleViewHolder.actionLayout.setVisibility(View.INVISIBLE);
// }
// break;
// }
// return true;
// }
// });
} else if (holder instanceof EditViewHolder) {
final EditViewHolder editViewHolder = (EditViewHolder) holder;
editViewHolder.editText.setText(model.getRuleText());
editViewHolder.checkBoxAllow.setChecked(model.isAllowConnection());
editViewHolder.checkBoxEnable.setChecked(model.isEnable());
editViewHolder.buttonConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
model.setRuleText(editViewHolder.editText.getText().toString());
model.setIsAllowConnection(editViewHolder.checkBoxAllow.isChecked());
model.setIsEnable(editViewHolder.checkBoxEnable.isChecked());
model.setIsSimpleView(true);
Rules.getInstance(context).saveRules();
notifyItemChanged(position);
Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public int getItemCount() {
return ruleList.size();
}
@Override
public int getItemViewType(int position) {
PhoneConnectRuleModel model = ruleList.get(position);
// 这里可以根据模型的状态来决定视图类型,简单起见,假设点击按钮后进入编辑视图
return model.isSimpleView() ? VIEW_TYPE_SIMPLE : VIEW_TYPE_EDIT;
}
static class SimpleViewHolder extends RecyclerView.ViewHolder {
private final LeftScrollView scrollView;
private final TextView tvRuleText;
public SimpleViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) {
super(itemView);
scrollView = itemView.findViewById(R.id.scrollView);
//tvRuleText = itemView.findViewById(R.id.ruletext_tv);
tvRuleText = new TextView(itemView.getContext());
scrollView.setContentWidth(parent.getWidth());
//scrollView.setContentWidth(600);
scrollView.addContentLayout(tvRuleText);
}
}
static class EditViewHolder extends RecyclerView.ViewHolder {
EditText editText;
CheckBox checkBoxAllow;
CheckBox checkBoxEnable;
Button buttonConfirm;
public EditViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) {
super(itemView);
editText = itemView.findViewById(R.id.edit_text);
checkBoxAllow = itemView.findViewById(R.id.checkbox_allow);
checkBoxEnable = itemView.findViewById(R.id.checkbox_enable);
buttonConfirm = itemView.findViewById(R.id.button_confirm);
}
}
}

View File

@@ -0,0 +1,36 @@
package cc.winboll.studio.contacts.beans;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/26 13:10:57
* @Describe CallLogModel
*/
import java.util.Date;
public class CallLogModel {
public static final String TAG = "CallLogModel";
private String phoneNumber;
private String callStatus;
private Date callDate;
public CallLogModel(String phoneNumber, String callStatus, Date callDate) {
this.phoneNumber = phoneNumber.replaceAll("\\s", "");
this.callStatus = callStatus;
this.callDate = callDate;
}
public String getPhoneNumber() {
return phoneNumber;
}
public String getCallStatus() {
return callStatus;
}
public Date getCallDate() {
return callDate;
}
}

View File

@@ -0,0 +1,64 @@
package cc.winboll.studio.contacts.beans;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/26 13:37:00
* @Describe ContactModel
*/
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class ContactModel {
public static final String TAG = "ContactModel";
private String name;
private String number;
private String pinyin;
public ContactModel(String name, String number) {
this.name = name;
this.number = number.replaceAll("\\s", "");
this.pinyin = convertToPinyin(name);
}
private String convertToPinyin(String chinese) {
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
StringBuilder pinyin = new StringBuilder();
for (int i = 0; i < chinese.length(); i++) {
char ch = chinese.charAt(i);
if (Character.toString(ch).matches("[\\u4e00-\\u9fa5]")) {
try {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(ch, format);
if (pinyinArray != null) {
pinyin.append(pinyinArray[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyin.append(ch);
}
}
return pinyin.toString();
}
public String getName() {
return name;
}
public String getNumber() {
return number;
}
public String getPinyin() {
return pinyin;
}
}

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