Compare commits
244 Commits
timestamp-
...
appbase
Author | SHA1 | Date | |
---|---|---|---|
c4e88e9593 | |||
08d9d92ae4 | |||
74841c08dc | |||
945bacb825 | |||
0e464495fd | |||
e8682ce410 | |||
2e4003dae0 | |||
198b0975ce | |||
24a578a9d2 | |||
46de24447f | |||
1320984829 | |||
abf1e5ba42 | |||
1cd2f88038 | |||
3f6e583d68 | |||
271456bfcd | |||
ee5458d82c | |||
3a83367f71 | |||
74b9350a6a | |||
d2858f23f7 | |||
40a5b9c339 | |||
fd79113572 | |||
9b911b583c | |||
37817c3e8c | |||
0b5402f5f3 | |||
bea22e3853 | |||
7e2ad0c01d | |||
476ce02fc8 | |||
bc697279ad | |||
dee01f1179 | |||
a500decc7a | |||
5099d00050 | |||
515d14e896 | |||
f630e27ed8 | |||
cd7ed01216 | |||
bb24bbfbd1 | |||
2ba2f88510 | |||
db3a3644a8 | |||
556bfa7024 | |||
4842a1ec30 | |||
b0388a2972 | |||
bd5a1f18ce | |||
99798b4816 | |||
f93b6047a8 | |||
daa3f858a0 | |||
3fded32426 | |||
8f85006040 | |||
e28b0bd75e | |||
af1d6d3439 | |||
470d1ffa1f | |||
49ae869df1 | |||
77e98bafe4 | |||
ff14d0c0c3 | |||
950be3a182 | |||
1f20fca9be | |||
8d29d11078 | |||
7534881f50 | |||
ef992dcd7c | |||
71c1baa4ba | |||
9e149037db | |||
89df24f736 | |||
2118495bc8 | |||
1dd614bd68 | |||
b793c74e81 | |||
8d1872a893 | |||
5c58ee34e7 | |||
e530403af7 | |||
264ab802c5 | |||
7c1832dc05 | |||
9a0ee889ba | |||
c40066ca4d | |||
5348d1ef6d | |||
063c997bbb | |||
1376ca7ebb | |||
92e271b569 | |||
a5083cc52f | |||
0692d4efb2 | |||
f10438d3d3 | |||
1e697bc12d | |||
d5a3c626b3 | |||
56692db142 | |||
934d54963a | |||
c105123e7b | |||
d8c534bbc8 | |||
6cce9c4d3f | |||
df18c34976 | |||
22ca83b5b7 | |||
98233ce148 | |||
41fd9b171b | |||
330e5032df | |||
76420ff5f4 | |||
ee3553716c | |||
02da4c3db9 | |||
d689db61ff | |||
2b090e5c8e | |||
309214ecf3 | |||
d29c9de3b4 | |||
d7efdb6c02 | |||
20b36dd63b | |||
a40450c085 | |||
e7a7a4438c | |||
3e6de13fa3 | |||
af848809e9 | |||
2c7026a635 | |||
6278c3f945 | |||
bc3a320433 | |||
e03b8d4745 | |||
d5fb348134 | |||
5c7437b19c | |||
bf09def10b | |||
8431d7dfa9 | |||
6aadaf87af | |||
6a2943420f | |||
dc704e292a | |||
1087a7837c | |||
59876a2353 | |||
053b45e87e | |||
58e49ed371 | |||
90a6eb266b | |||
f0a564c9bb | |||
46b21331af | |||
6221cc30ac | |||
8489ee6447 | |||
9205af4aa9 | |||
780e730a38 | |||
429499885b | |||
fcf4ad2fc0 | |||
7635f6f084 | |||
e49935f772 | |||
381ddf9e40 | |||
7774317c3b | |||
16f45aabe4 | |||
8190f4818f | |||
f339733d4b | |||
f770ea5aa0 | |||
0a993ccb9b | |||
9d0bdb803b | |||
9bd4c41b75 | |||
af0b8859f0 | |||
275330f553 | |||
42256fd0e4 | |||
fa72983f54 | |||
35825d5ead | |||
577237bc9e | |||
8ef41b9f1b | |||
36733e362b | |||
fbf71e6998 | |||
![]() |
77bdf886e9 | ||
2a11205468 | |||
bb9f46373a | |||
af797743d4 | |||
1b37f1bd11 | |||
00177284c1 | |||
178e00f8b4 | |||
743a5d5299 | |||
30f75f2394 | |||
9d66934694 | |||
bf0a70e056 | |||
c687b5513d | |||
b44e5575b3 | |||
7c7554133b | |||
98f6d0019b | |||
fc9c82921d | |||
1ac0ad96e1 | |||
9060cb51ff | |||
7951d0a8d6 | |||
ded775ae01 | |||
82258f1763 | |||
99bf53f27d | |||
ddb6b53189 | |||
4a4e20a6bd | |||
4c0d825d7b | |||
ae111b3a99 | |||
ae8da772c0 | |||
b2555ebfd3 | |||
82d9aabf33 | |||
640f0c39e9 | |||
38e4deb425 | |||
d06023d023 | |||
cb486bb90c | |||
2cbf9e5669 | |||
e045bbb71c | |||
d5782da040 | |||
![]() |
1a7134711e | ||
![]() |
dabd1271fd | ||
![]() |
0d3d691d8a | ||
![]() |
f3198de003 | ||
![]() |
df179242f0 | ||
![]() |
1ae3fdf2b7 | ||
![]() |
7edc341f15 | ||
![]() |
f1669f9e41 | ||
![]() |
63b1d2dece | ||
![]() |
840da14438 | ||
![]() |
31595fe1ae | ||
![]() |
2c91d32e41 | ||
![]() |
58dabb7138 | ||
![]() |
3432575aa7 | ||
![]() |
c302179960 | ||
![]() |
df55608eb3 | ||
![]() |
b64a229ab1 | ||
![]() |
d507d4ac06 | ||
![]() |
e815c08970 | ||
![]() |
d780116031 | ||
![]() |
fa43d43110 | ||
![]() |
8f8e7d98c7 | ||
![]() |
af39f98a51 | ||
![]() |
5a1d557683 | ||
![]() |
39116f0912 | ||
![]() |
a6b711b38b | ||
![]() |
d1703551f5 | ||
![]() |
d63f7d3d83 | ||
![]() |
06b399846d | ||
![]() |
e06efea08e | ||
![]() |
890ff6eda9 | ||
![]() |
e5a5eda9b6 | ||
![]() |
174a052088 | ||
![]() |
fbd8441264 | ||
![]() |
fb92e9f673 | ||
![]() |
d34d1e2796 | ||
![]() |
36fb8b41a4 | ||
![]() |
fe70a18547 | ||
![]() |
b61c63c426 | ||
![]() |
f02dc215ca | ||
![]() |
1c27d0ccdc | ||
![]() |
803745d12e | ||
![]() |
a66be9cd37 | ||
![]() |
46e4ee7fb7 | ||
![]() |
b2b959232c | ||
![]() |
b11f814c41 | ||
![]() |
1e991aed7e | ||
![]() |
f56125f82a | ||
![]() |
5714aed761 | ||
![]() |
f04f5cf77c | ||
![]() |
6ccbaf8c32 | ||
![]() |
33b7b65239 | ||
![]() |
664d14ad84 | ||
![]() |
47cb393f76 | ||
![]() |
6495f1c66e | ||
![]() |
f0c52d1e02 | ||
![]() |
d948f31331 | ||
![]() |
e1b3087020 | ||
![]() |
03e21ab81c | ||
![]() |
ac72132969 | ||
![]() |
cedb5f521b | ||
![]() |
396df6713c |
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +1,6 @@
|
||||
[submodule "libjc/jcc/libs"]
|
||||
path = libjc/jcc/libs
|
||||
url = https://gitea.winboll.cc/Studio/APP_libjc_jcc_libs.git
|
||||
[submodule "keystore"]
|
||||
path = keystore
|
||||
url = https://gitea.winboll.cc/Studio/keystore.git
|
||||
|
@ -1,3 +0,0 @@
|
||||
#!/bin/usr/bash
|
||||
## Change Back To Beta KeyStore in keystore module.
|
||||
cd keystore;git reset --hard f5bc75ff45fcb8894b5bd3f49b91bdd8fe3c317e;cd ..
|
@ -1,3 +0,0 @@
|
||||
#!/bin/usr/bash
|
||||
## Change Back To StageMG KeyStore in keystore module.
|
||||
cd keystore;git reset --hard d22519b11253f85f495400b01b6373e9657defb4;cd ..
|
@ -113,10 +113,10 @@ if [[ $? -eq 0 ]]; then
|
||||
# 如果Git已经提交了所有代码就执行标签和应用发布操作
|
||||
|
||||
# 预先询问是否添加工作流标签
|
||||
echo "Add Github Workflows Tag? (yes/No)"
|
||||
result=$(askAddWorkflowsTag)
|
||||
nAskAddWorkflowsTag=$?
|
||||
echo $result
|
||||
#echo "Add Github Workflows Tag? (yes/No)"
|
||||
#result=$(askAddWorkflowsTag)
|
||||
#nAskAddWorkflowsTag=$?
|
||||
#echo $result
|
||||
|
||||
# 发布应用
|
||||
echo "Publishing WinBoLL APK ..."
|
||||
@ -138,17 +138,17 @@ if [[ $? -eq 0 ]]; then
|
||||
fi
|
||||
|
||||
# 添加 GitHub 工作流标签
|
||||
if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
|
||||
#if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
|
||||
# 如果用户选择添加工作流标签
|
||||
result=$(addWorkflowsTag $1)
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo $result
|
||||
#result=$(addWorkflowsTag $1)
|
||||
#if [[ $? -eq 0 ]]; then
|
||||
# echo $result
|
||||
# 工作流标签添加成功
|
||||
else
|
||||
echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
|
||||
exit 1 # addWorkflowsTag 异常
|
||||
fi
|
||||
fi
|
||||
#else
|
||||
#echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
|
||||
#exit 1 # addWorkflowsTag 异常
|
||||
#fi
|
||||
#fi
|
||||
|
||||
## 清理更新描述文件内容
|
||||
echo "" > $1/app_update_description.txt
|
||||
|
49
GenKeyStore/gen_debug_keystore.sh
Normal file
49
GenKeyStore/gen_debug_keystore.sh
Normal file
@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
# 应用秘钥创建脚本
|
||||
# Linux 命令行创建JKS秘钥,alias和keyAlias可配置,文件名含时间戳
|
||||
|
||||
# 可配置参数(按需修改)
|
||||
ALIAS="WinBoLL.CC_Debug" # 别名(与keyAlias一致)
|
||||
STORE_PASS="androiddebugkey"
|
||||
KEY_PASS="androiddebugkey"
|
||||
COUNTRY="CN" # 国家代码
|
||||
|
||||
# 获取当前时间戳
|
||||
TIMESTAMP=$(date +%Y%m%d%H%M%S)
|
||||
FILENAME="${ALIAS}_${TIMESTAMP}.jks"
|
||||
STORENAME="${ALIAS}_${TIMESTAMP}.keystore"
|
||||
|
||||
# 生成JKS文件(alias与keyAlias同步)
|
||||
keytool -genkeypair \
|
||||
-alias "${ALIAS}" \
|
||||
-keyalg RSA \
|
||||
-keysize 2048 \
|
||||
-validity 1 \
|
||||
-keystore "${FILENAME}" \
|
||||
-dname "CN=WBFans, OU=Studio, O=WinBoLL, L=Shanwei, ST=Guangdong, C=${COUNTRY}" \
|
||||
-storepass "${STORE_PASS}" \
|
||||
-keypass "${KEY_PASS}"
|
||||
|
||||
# 写入配置文件
|
||||
cat <<EOF > ${STORENAME}
|
||||
keyAlias=${ALIAS}
|
||||
keyPassword=${KEY_PASS}
|
||||
storeFile=../appkey.jks
|
||||
storePassword=${STORE_PASS}
|
||||
EOF
|
||||
|
||||
echo "已生成秘钥:${FILENAME}"
|
||||
echo "配置已写入 ${STORENAME}(keyAlias=${ALIAS})"
|
||||
|
||||
# 询问是否复制文件
|
||||
read -p "是否需要将文件复制为 appkey.jks 和 appkey.keystore?(y/n): " CONFIRM
|
||||
|
||||
if [[ $CONFIRM =~ ^[Yy]$ ]]; then
|
||||
# 复制 jks 文件为 appkey.jks
|
||||
cp -v ${FILENAME} ../appkey.jks
|
||||
# 复制 keystore 文件为 appkey.keystore
|
||||
cp -v ${STORENAME} ../appkey.keystore
|
||||
echo "文件复制完成"
|
||||
else
|
||||
echo "已取消文件复制"
|
||||
fi
|
178
LICENSE
178
LICENSE
@ -6,59 +6,187 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2024 ZhanGSKen
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
14
README.md
14
README.md
@ -1,4 +1,8 @@
|
||||
# ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
|
||||
# OriginMaster
|
||||
【OriginMaster】WinBoLL 源生态计划。正如话,我需要一个 Point, 去撬动成个地球。
|
||||
|
||||
########
|
||||
## ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
|
||||
# ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
|
||||
# ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
|
||||
|
||||
@ -110,9 +114,11 @@
|
||||
|
||||
# 本项目要实际运用需要注意以下几个步骤:
|
||||
# 在项目根目录下:
|
||||
## 1. 项目模块编译环境设置(必须),settings.gradle-demo 要复制为 settings.gradle,并取消相应项目模块的注释。
|
||||
## 2. 项目 Android SDK 编译环境设置(可选),local.properties-demo 要复制为 local.properties,并按需要设置 Android SDK 目录。
|
||||
## 3. 类库型模块编译环境设置(可选),winboll.properties-demo 要复制为 winboll.properties,并按需要设置 WinBoLL Maven 库登录用户信息。
|
||||
## ★. 项目模块编译环境设置(必须),settings.gradle-demo 要复制为 settings.gradle,并取消相应项目模块的注释。
|
||||
## ★. 项目 Android SDK 编译环境设置(可选),local.properties-demo 要复制为 local.properties,并按需要设置 Android SDK 目录。
|
||||
## ★. 应用签名密钥 keystore 设置问题。一般调试编译只需用【Termux】cd 进 GenKeyStore 目录执行 $ bash gen_debug_keystore.sh 命令即可完成设置。
|
||||
## ☆. 应用 WiBoLL 签名密钥配置问题<非必须考虑>。设置时需要 clone 【keystore】模块源码并拷贝模块目录的 appkey.jks 与 appkey.keystore 到项目根目录即可。
|
||||
## ☆. 类库型模块编译环境设置(可选),winboll.properties-demo 要复制为 winboll.properties,并按需要设置 WinBoLL Maven 库登录用户信息。
|
||||
|
||||
|
||||
# ☆类库型项目编译方法
|
||||
|
35
aes/README.md
Normal file
35
aes/README.md
Normal file
@ -0,0 +1,35 @@
|
||||
# AES
|
||||
|
||||
#### 介绍
|
||||
安卓视图元素类库
|
||||
|
||||
#### 软件架构
|
||||
适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
|
||||
也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。
|
||||
|
||||
|
||||
#### Gradle 编译说明
|
||||
调试版编译命令 :gradle assembleBetaDebug
|
||||
阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh aes
|
||||
阶段版类库发布命令 :git pull &&bash .winboll/bashPublishLIBAddTag.sh libaes
|
||||
|
||||
#### 使用说明
|
||||
|
||||
#### 参与贡献
|
||||
|
||||
1. Fork 本仓库
|
||||
2. 新建 Feat_xxx 分支
|
||||
3. 提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
|
||||
4. 新建 Pull Request
|
||||
|
||||
|
||||
#### 特技
|
||||
|
||||
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
|
||||
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
|
||||
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
|
||||
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
|
||||
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
|
||||
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
||||
|
||||
#### 参考文档
|
@ -29,7 +29,7 @@ android {
|
||||
// versionName 更新后需要手动设置
|
||||
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||
versionName "15.6"
|
||||
versionName "15.9"
|
||||
if(true) {
|
||||
versionName = genVersionName("${versionName}")
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Sun May 04 06:42:28 GMT 2025
|
||||
stageCount=1
|
||||
#Thu Jun 19 20:42:40 HKT 2025
|
||||
stageCount=2
|
||||
libraryProject=libaes
|
||||
baseVersion=15.6
|
||||
publishVersion=15.6.0
|
||||
buildCount=10
|
||||
baseBetaVersion=15.6.1
|
||||
baseVersion=15.9
|
||||
publishVersion=15.9.1
|
||||
buildCount=0
|
||||
baseBetaVersion=15.9.2
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.aes;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/24 23:52:29
|
||||
* @Describe AES应用介绍窗口
|
||||
*/
|
||||
@ -79,11 +79,11 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity
|
||||
appInfo.setAppName("AES");
|
||||
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
|
||||
appInfo.setAppDescription("AES Description");
|
||||
appInfo.setAppGitName("APP");
|
||||
appInfo.setAppGitName("APPBase");
|
||||
appInfo.setAppGitOwner("Studio");
|
||||
appInfo.setAppGitAPPBranch(szBranchName);
|
||||
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
|
||||
appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=AES");
|
||||
appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=2&fromuid=1");
|
||||
appInfo.setAppAPKName("AES");
|
||||
appInfo.setAppAPKFolderName("AES");
|
||||
//appInfo.setIsAddDebugTools(false);
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.aes;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/06/13 19:03:58
|
||||
* @Describe AES应用类
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.aes;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/06/13 19:05:52
|
||||
* @Describe 应用主窗口
|
||||
*/
|
||||
|
@ -24,7 +24,7 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "cc.winboll.studio.androiddemo"
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 29
|
||||
targetSdkVersion 30
|
||||
versionCode 1
|
||||
// versionName 更新后需要手动设置
|
||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||
@ -67,6 +67,6 @@ dependencies {
|
||||
// https://mvnrepository.com/artifact/com.android.support/recyclerview-v7
|
||||
api 'com.android.support:recyclerview-v7:28.0.0'
|
||||
|
||||
api 'cc.winboll.studio:libapputils:15.2.2'
|
||||
api 'cc.winboll.studio:libappbase:15.2.2'
|
||||
api 'cc.winboll.studio:libapputils:15.8.2'
|
||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Thu Apr 03 03:17:18 GMT 2025
|
||||
#Sun Jun 01 08:02:46 GMT 2025
|
||||
stageCount=0
|
||||
libraryProject=
|
||||
baseVersion=15.0
|
||||
publishVersion=15.0.0
|
||||
buildCount=21
|
||||
buildCount=27
|
||||
baseBetaVersion=15.0.1
|
||||
|
@ -24,7 +24,7 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "cc.winboll.studio.androidxdemo"
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 29
|
||||
targetSdkVersion 30
|
||||
versionCode 1
|
||||
// versionName 更新后需要手动设置
|
||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||
@ -67,7 +67,7 @@ dependencies {
|
||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||
//api 'androidx.fragment:fragment:1.1.0'
|
||||
|
||||
api 'cc.winboll.studio:libaes:15.2.6'
|
||||
api 'cc.winboll.studio:libapputils:15.2.2'
|
||||
api 'cc.winboll.studio:libappbase:15.2.2'
|
||||
api 'cc.winboll.studio:libaes:15.8.0'
|
||||
api 'cc.winboll.studio:libapputils:15.8.2'
|
||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Thu Apr 03 03:15:55 GMT 2025
|
||||
#Thu Jun 19 12:49:47 GMT 2025
|
||||
stageCount=0
|
||||
libraryProject=
|
||||
baseVersion=15.0
|
||||
publishVersion=15.0.0
|
||||
buildCount=18
|
||||
buildCount=26
|
||||
baseBetaVersion=15.0.1
|
||||
|
@ -22,9 +22,9 @@ import android.widget.HorizontalScrollView;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import cc.winboll.studio.androidxdemo.R;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import com.hjq.toast.style.WhiteToastStyle;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.Closeable;
|
||||
@ -53,8 +53,8 @@ public class App extends GlobalApplication {
|
||||
// 初始化 Toast 框架
|
||||
ToastUtils.init(this);
|
||||
// 设置 Toast 布局样式
|
||||
ToastUtils.setView(R.layout.view_toast);
|
||||
//ToastUtils.setStyle(new WhiteToastStyle());
|
||||
//ToastUtils.setView(R.layout.view_toast);
|
||||
ToastUtils.setStyle(new WhiteToastStyle());
|
||||
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
|
||||
|
||||
//CrashHandler.getInstance().registerGlobal(this);
|
||||
|
@ -30,7 +30,7 @@ android {
|
||||
// versionName 更新后需要手动设置
|
||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||
versionName "15.7"
|
||||
versionName "15.8"
|
||||
if(true) {
|
||||
versionName = genVersionName("${versionName}")
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Sat May 03 10:32:21 GMT 2025
|
||||
stageCount=7
|
||||
#Mon Jun 09 09:38:19 HKT 2025
|
||||
stageCount=9
|
||||
libraryProject=libappbase
|
||||
baseVersion=15.7
|
||||
publishVersion=15.7.6
|
||||
buildCount=4
|
||||
baseBetaVersion=15.7.7
|
||||
baseVersion=15.8
|
||||
publishVersion=15.8.8
|
||||
buildCount=0
|
||||
baseBetaVersion=15.8.9
|
||||
|
@ -9,7 +9,8 @@
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/MyAPPBaseTheme"
|
||||
android:resizeableActivity="true"
|
||||
android:process=":App">
|
||||
android:process=":App"
|
||||
android:networkSecurityConfig="@xml/network_security_config">
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
@ -39,7 +40,8 @@
|
||||
android:resizeableActivity="true"
|
||||
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
|
||||
|
||||
<activity android:name=".activities.New2Activity"
|
||||
<activity
|
||||
android:name=".activities.New2Activity"
|
||||
android:label="New2Activity"
|
||||
android:exported="true"
|
||||
android:resizeableActivity="true"
|
||||
@ -74,7 +76,8 @@
|
||||
|
||||
<service android:name=".services.AssistantService"/>
|
||||
|
||||
<receiver android:name="cc.winboll.studio.appbase.receivers.MainReceiver"
|
||||
<receiver
|
||||
android:name="cc.winboll.studio.appbase.receivers.MainReceiver"
|
||||
android:exported="true">
|
||||
|
||||
<intent-filter>
|
||||
@ -105,7 +108,8 @@
|
||||
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".receivers.APPNewsWidgetClickListener"
|
||||
<receiver
|
||||
android:name=".receivers.APPNewsWidgetClickListener"
|
||||
android:exported="true">
|
||||
|
||||
<intent-filter>
|
||||
@ -122,7 +126,6 @@
|
||||
android:name="android.max_aspect"
|
||||
android:value="4.0"/>
|
||||
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/01/05 09:54:42
|
||||
* @Describe APPbase 应用类
|
||||
*/
|
||||
|
@ -11,6 +11,7 @@ import android.widget.CheckBox;
|
||||
import android.widget.Toolbar;
|
||||
import cc.winboll.studio.appbase.R;
|
||||
import cc.winboll.studio.appbase.activities.NewActivity;
|
||||
import cc.winboll.studio.appbase.activities.WinBoLLActivity;
|
||||
import cc.winboll.studio.appbase.services.MainService;
|
||||
import cc.winboll.studio.appbase.services.TestDemoBindService;
|
||||
import cc.winboll.studio.appbase.services.TestDemoService;
|
||||
@ -18,12 +19,13 @@ import cc.winboll.studio.libappbase.CrashHandler;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.GlobalCrashActivity;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.LogView;
|
||||
import cc.winboll.studio.libappbase.sos.SOS;
|
||||
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||
import cc.winboll.studio.libappbase.widgets.StatusWidget;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivity {
|
||||
public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "MainActivity";
|
||||
|
||||
@ -38,7 +40,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
|
||||
}
|
||||
|
||||
Toolbar mToolbar;
|
||||
//LogView mLogView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@ -51,29 +52,25 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
|
||||
|
||||
CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
|
||||
cbIsDebugMode.setChecked(GlobalApplication.isDebuging());
|
||||
//mLogView = findViewById(R.id.activitymainLogView1);
|
||||
|
||||
// if (GlobalApplication.isDebuging()) {
|
||||
// mLogView.start();
|
||||
// ToastUtils.show("LogView start.");
|
||||
// }
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.toolbar_main, menu);
|
||||
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if(item.getItemId() == R.id.item_yun) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, cc.winboll.studio.libappbase.activities.YunActivity.class);
|
||||
} else if(item.getItemId() == R.id.item_logon) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, cc.winboll.studio.libappbase.activities.LogonActivity.class);
|
||||
}
|
||||
// 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
@ -138,8 +135,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void onStopTestDemoService(View view) {
|
||||
Intent intent = new Intent(this, TestDemoService.class);
|
||||
intent.setAction(TestDemoService.ACTION_DISABLE);
|
||||
@ -179,5 +174,10 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
|
||||
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/13 19:30:10
|
||||
*/
|
||||
import android.content.Context;
|
||||
|
@ -1,81 +0,0 @@
|
||||
package cc.winboll.studio.appbase;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Date 2025/03/28 15:34:16
|
||||
* @Describe 应用活动窗口基类
|
||||
*/
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.os.PersistableBundle;
|
||||
import android.view.MenuItem;
|
||||
import cc.winboll.studio.appbase.App;
|
||||
import cc.winboll.studio.appbase.R;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
|
||||
|
||||
public class WinBoLLActivityBase extends Activity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "WinBoLLActivityBase";
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
WinBoLLActivityManager getWinBoLLActivityManager() {
|
||||
return WinBoLLActivityManager.getInstance(GlobalApplication.getInstance());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
getWinBoLLActivityManager().add(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
|
||||
super.onPostCreate(savedInstanceState, persistentState);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
|
||||
return true;
|
||||
} else if(item.getItemId() == cc.winboll.studio.appbase.R.id.item_minimal) {
|
||||
//moveTaskToBack(true);
|
||||
exit();
|
||||
}
|
||||
// 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
void exit() {
|
||||
YesNoAlertDialog.show(this, "Exit " + getString(R.string.app_name), "Close all activity and exit?", new YesNoAlertDialog.OnDialogResultListener(){
|
||||
|
||||
@Override
|
||||
public void onYes() {
|
||||
App.getWinBoLLActivityManager().finishAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNo() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
getWinBoLLActivityManager().registeRemove(this);
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/25 11:46:40
|
||||
* @Describe 测试窗口2
|
||||
*/
|
||||
@ -12,11 +12,10 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Toolbar;
|
||||
import cc.winboll.studio.appbase.R;
|
||||
import cc.winboll.studio.appbase.WinBoLLActivityBase;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivity {
|
||||
public class New2Activity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "New2Activity";
|
||||
|
||||
@ -67,16 +66,11 @@ public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivit
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.toolbar_main, menu);
|
||||
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
|
||||
return true;
|
||||
}
|
||||
// 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/25 05:04:22
|
||||
*/
|
||||
import android.app.Activity;
|
||||
@ -11,11 +11,10 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Toolbar;
|
||||
import cc.winboll.studio.appbase.R;
|
||||
import cc.winboll.studio.appbase.WinBoLLActivityBase;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity {
|
||||
public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "NewActivity";
|
||||
|
||||
@ -65,16 +64,11 @@ public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.toolbar_main, menu);
|
||||
getMenuInflater().inflate(R.menu.toolbar_appbase, menu);
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
|
||||
return true;
|
||||
}
|
||||
// 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
@ -0,0 +1,61 @@
|
||||
package cc.winboll.studio.appbase.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/05/10 09:48
|
||||
* @Describe WinBoLL 窗口基础类
|
||||
*/
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import cc.winboll.studio.appbase.MainActivity;
|
||||
import cc.winboll.studio.appbase.R;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class WinBoLLActivity extends Activity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "WinBoLLActivity";
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
LogUtils.d(TAG, String.format("onResume %s", getTag()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == R.id.item_log) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.item_home) {
|
||||
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class);
|
||||
return true;
|
||||
}
|
||||
// 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostCreate(Bundle savedInstanceState) {
|
||||
super.onPostCreate(savedInstanceState);
|
||||
GlobalApplication.getWinBoLLActivityManager().add(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.handlers;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/14 03:51:40
|
||||
*/
|
||||
import android.os.Handler;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.models;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/13 07:06:13
|
||||
*/
|
||||
import android.util.JsonReader;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.models;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/07 12:47:22
|
||||
* @Describe TestServiceBean
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.models;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/07 12:49:21
|
||||
* @Describe TestDemoServiceBean
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.receivers;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/24 07:11:44
|
||||
*/
|
||||
import android.content.BroadcastReceiver;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.receivers;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/13 06:58:04
|
||||
* @Describe 主要广播接收器
|
||||
*/
|
||||
@ -10,16 +10,18 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import cc.winboll.studio.appbase.models.WinBoLLNewsBean;
|
||||
import cc.winboll.studio.appbase.services.MainService;
|
||||
import cc.winboll.studio.appbase.widgets.APPNewsWidget;
|
||||
import cc.winboll.studio.libappbase.AppUtils;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.sos.APPModel;
|
||||
import cc.winboll.studio.libappbase.models.APPModel;
|
||||
import cc.winboll.studio.libappbase.models.WinBoLLModel;
|
||||
import cc.winboll.studio.libappbase.models.WinBoLLNewsBean;
|
||||
import cc.winboll.studio.libappbase.sos.SOS;
|
||||
import cc.winboll.studio.libappbase.sos.SOSObject;
|
||||
import cc.winboll.studio.libappbase.sos.WinBoLL;
|
||||
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
import cc.winboll.studio.libappbase.winboll.WinBoLL;
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.text.SimpleDateFormat;
|
||||
@ -42,21 +44,21 @@ public class MainReceiver extends BroadcastReceiver {
|
||||
String szAction = intent.getAction();
|
||||
if (szAction.equals(ACTION_BOOT_COMPLETED)) {
|
||||
ToastUtils.show("ACTION_BOOT_COMPLETED");
|
||||
} else if (szAction.equals(WinBoLL.ACTION_BIND)) {
|
||||
} else if (szAction.equals(IWinBoLLActivity.ACTION_BIND)) {
|
||||
LogUtils.d(TAG, "ACTION_BIND");
|
||||
LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName()));
|
||||
LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction()));
|
||||
String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL);
|
||||
LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel));
|
||||
if (szAPPModel != null && !szAPPModel.equals("")) {
|
||||
String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
|
||||
LogUtils.d(TAG, String.format("szAPPModel %s", szWinBoLLModel));
|
||||
if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
|
||||
try {
|
||||
APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class);
|
||||
WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
|
||||
if (bean != null) {
|
||||
String szAppPackageName = bean.getAppPackageName();
|
||||
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
|
||||
String szAppMainServiveName = bean.getAppMainServiveName();
|
||||
LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
|
||||
mwrService.get().bindAPPModelConnection(bean);
|
||||
mwrService.get().bindWinBoLLModelConnection(bean);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.services;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/14 03:38:31
|
||||
* @Describe 守护进程服务
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.services;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/13 06:56:41
|
||||
* @Describe 拨号主服务
|
||||
* 参考:
|
||||
@ -18,15 +18,16 @@ import android.content.ServiceConnection;
|
||||
import android.os.Binder;
|
||||
import android.os.IBinder;
|
||||
import cc.winboll.studio.appbase.MyTileService;
|
||||
import cc.winboll.studio.appbase.models.MainServiceBean;
|
||||
import cc.winboll.studio.appbase.handlers.MainServiceHandler;
|
||||
import cc.winboll.studio.appbase.models.MainServiceBean;
|
||||
import cc.winboll.studio.appbase.receivers.MainReceiver;
|
||||
import cc.winboll.studio.appbase.services.AssistantService;
|
||||
import cc.winboll.studio.appbase.threads.MainServiceThread;
|
||||
import cc.winboll.studio.appbase.widgets.APPNewsWidget;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.models.APPModel;
|
||||
import cc.winboll.studio.libappbase.models.WinBoLLModel;
|
||||
import java.util.ArrayList;
|
||||
import cc.winboll.studio.libappbase.sos.APPModel;
|
||||
|
||||
public class MainService extends Service {
|
||||
|
||||
@ -182,7 +183,7 @@ public class MainService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
public void bindAPPModelConnection(APPModel bean) {
|
||||
public void bindWinBoLLModelConnection(WinBoLLModel bean) {
|
||||
LogUtils.d(TAG, "bindAPPModelConnection(...)");
|
||||
// 清理旧的绑定链接
|
||||
for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) {
|
||||
@ -203,7 +204,7 @@ public class MainService extends Service {
|
||||
|
||||
Intent intentWidget = new Intent(this, APPNewsWidget.class);
|
||||
intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE);
|
||||
APPModel appSOSBean = new APPModel(bean.getAppPackageName(), bean.getAppMainServiveName());
|
||||
WinBoLLModel appSOSBean = new WinBoLLModel(bean.getAppPackageName(), bean.getAppMainServiveName());
|
||||
intentWidget.putExtra("APPSOSBean", appSOSBean.toString());
|
||||
sendBroadcast(intentWidget);
|
||||
}
|
||||
@ -212,7 +213,7 @@ public class MainService extends Service {
|
||||
|
||||
ComponentName mComponentName;
|
||||
|
||||
boolean isBindToAPP(APPModel bean) {
|
||||
boolean isBindToAPP(WinBoLLModel bean) {
|
||||
return mComponentName != null
|
||||
&& mComponentName.getClassName().equals(bean.getAppMainServiveName())
|
||||
&& mComponentName.getPackageName().equals(bean.getAppPackageName());
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.services;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/07 12:45:49
|
||||
* @Describe 启动时申请绑定到APPBase主服务的服务示例
|
||||
*/
|
||||
@ -10,11 +10,12 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Binder;
|
||||
import android.os.IBinder;
|
||||
import cc.winboll.studio.appbase.models.TestDemoBindServiceBean;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.sos.WinBoLL;
|
||||
import cc.winboll.studio.appbase.App;
|
||||
import cc.winboll.studio.appbase.models.TestDemoBindServiceBean;
|
||||
import cc.winboll.studio.appbase.services.TestDemoBindService;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.sos.SOS;
|
||||
import cc.winboll.studio.libappbase.winboll.WinBoLL;
|
||||
|
||||
public class TestDemoBindService extends Service {
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.services;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/07 12:39:24
|
||||
* @Describe 普通服务示例
|
||||
*/
|
||||
@ -12,7 +12,6 @@ import android.os.Binder;
|
||||
import android.os.IBinder;
|
||||
import cc.winboll.studio.appbase.models.TestDemoServiceBean;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.sos.WinBoLL;
|
||||
|
||||
public class TestDemoService extends Service {
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.appbase.threads;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/14 03:46:44
|
||||
*/
|
||||
import android.content.Context;
|
||||
|
@ -1,6 +1,6 @@
|
||||
package cc.winboll.studio.appbase.widgets;
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/15 14:41:25
|
||||
* @Describe TimeWidget
|
||||
*/
|
||||
@ -12,16 +12,17 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.widget.RemoteViews;
|
||||
import cc.winboll.studio.appbase.R;
|
||||
import cc.winboll.studio.appbase.models.WinBoLLNewsBean;
|
||||
import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener;
|
||||
import cc.winboll.studio.libappbase.AppUtils;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.sos.APPModel;
|
||||
import cc.winboll.studio.libappbase.sos.WinBoLL;
|
||||
import cc.winboll.studio.libappbase.models.APPModel;
|
||||
import cc.winboll.studio.libappbase.models.WinBoLLNewsBean;
|
||||
import cc.winboll.studio.libappbase.winboll.WinBoLL;
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import cc.winboll.studio.libappbase.models.WinBoLLModel;
|
||||
|
||||
public class APPNewsWidget extends AppWidgetProvider {
|
||||
|
||||
@ -57,11 +58,11 @@ public class APPNewsWidget extends AppWidgetProvider {
|
||||
}
|
||||
}else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) {
|
||||
LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE");
|
||||
String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL);
|
||||
LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel));
|
||||
if (szAPPModel != null && !szAPPModel.equals("")) {
|
||||
String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
|
||||
LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel));
|
||||
if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
|
||||
try {
|
||||
APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class);
|
||||
WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
|
||||
if (bean != null) {
|
||||
String szAppPackageName = bean.getAppPackageName();
|
||||
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
|
||||
|
@ -32,12 +32,18 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Hello, WinBoLL!"/>
|
||||
android:text="安卓R对应的是Android 11,其API级别是30。以下是Android 11中一些重要的API相关特性:
|
||||
|
||||
\n- 隐私保护方面:引入单次授权,让用户可以选择授予应用对位置信息、麦克风和摄像头的临时访问权限。还增加了数据访问审核功能,能让开发者深入了解应用在何处访问私密数据。
|
||||
|
||||
\n- 系统功能方面:提供了ControlsProviderService API,用于向连接的外部设备提供控件,这些控件显示于Android电源菜单中的设备控件下。媒体控件也得到更新,显示于快捷设置旁,来自多个应用的会话排列在一个可滑动的轮播界面中。
|
||||
|
||||
\n- 硬件支持方面:提供了一些API以支持瀑布屏,通过将窗口布局属性 layoutInDisplayCutoutMode 设为 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS ,可允许窗口延伸到屏幕各个边缘上的刘海和瀑布区域。对于合页式屏幕配置的设备,提供了具有 TYPE_HINGE_ANGLE 的新传感器以及新的 SensorEvent ,用于监控合页角度。
|
||||
|
||||
\n- 安全方面:对生物识别身份验证机制进行了更新,引入了 BiometricManager.Authenticators 接口,定义了 BIOMETRIC_STRONG 、 BIOMETRIC_WEAK 、 DEVICE_CREDENTIAL 等身份验证类型。还在 BiometricPrompt 类中提供了对“每次使用时进行身份验证”密钥的更多支持。
|
||||
|
||||
\n- 性能和质量方面:支持无线调试,通过Android调试桥(adb)从工作站以无线方式部署和调试应用,避免了常见的USB连接问题。"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Android版本10的代号是“Q”,API级别是29。 Android 10开始谷歌不再公开使用甜品作为版本代号,但内部仍保留了大量与“Q”相关的元素。Android 10本身并没有严格对应某个特定的Java版本,但在开发Android 10应用时,通常可以使用Java 8或更高版本。 Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性,能提高开发效率和代码可读性,与Android 10开发适配良好。Java 9及更高版本也可用于Android 10开发,能使用一些新的语言特性和API,但可能需要注意兼容性和配置问题。"/>
|
||||
|
||||
<HorizontalScrollView
|
||||
android:layout_width="match_parent"
|
||||
@ -211,6 +217,5 @@
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -1,6 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
|
||||
<item
|
||||
android:id="@+id/item_home"
|
||||
android:title="HOME"
|
||||
android:icon="@drawable/ic_winboll"/>
|
||||
<item
|
||||
android:id="@+id/item_yun"
|
||||
android:title="YUN"
|
||||
android:icon="@drawable/ic_winboll"/>
|
||||
<item
|
||||
android:id="@+id/item_logon"
|
||||
android:title="Logon"
|
||||
android:icon="@drawable/ic_winboll"/>
|
||||
<item
|
||||
android:id="@+id/item_log"
|
||||
android:title="LOG"
|
||||
android:icon="@drawable/ic_winboll_log"/>
|
||||
</menu>
|
||||
|
12
appbase/src/main/res/xml/network_security_config.xml
Normal file
12
appbase/src/main/res/xml/network_security_config.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<!-- 允许访问 winboll.cc 及其子域名(原配置) -->
|
||||
<domain-config cleartextTrafficPermitted="true">
|
||||
<domain includeSubdomains="true">winboll.cc</domain>
|
||||
</domain-config>
|
||||
|
||||
<!-- **新增:允许访问 IP 地址 10.8.0.250** -->
|
||||
<domain-config cleartextTrafficPermitted="true">
|
||||
<domain includeSubdomains="false">10.8.0.250</domain> <!-- 不包含子域名 -->
|
||||
</domain-config>
|
||||
</network-security-config>
|
@ -29,7 +29,7 @@ android {
|
||||
// versionName 更新后需要手动设置
|
||||
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||
versionName "15.3"
|
||||
versionName "15.8"
|
||||
if(true) {
|
||||
versionName = genVersionName("${versionName}")
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Tue Apr 29 15:04:17 HKT 2025
|
||||
#Tue Jun 03 15:05:48 HKT 2025
|
||||
stageCount=5
|
||||
libraryProject=libapputils
|
||||
baseVersion=15.3
|
||||
publishVersion=15.3.4
|
||||
baseVersion=15.8
|
||||
publishVersion=15.8.4
|
||||
buildCount=0
|
||||
baseBetaVersion=15.3.5
|
||||
baseBetaVersion=15.8.5
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.apputils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/12/08 15:10:51
|
||||
* @Describe 全局应用类
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.apputils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/01/03 11:02:49
|
||||
* @Describe 一个可以浏览随 APP 附带的 Html 文档的窗口
|
||||
*/
|
||||
@ -20,18 +20,7 @@ import cc.winboll.studio.libapputils.views.SimpleWebView;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class AssetsHtmlActivity extends WinBoLLActivityBase implements IWinBoLLActivity {
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return super.getActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
public class AssetsHtmlActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "AssetsHtmlActivity";
|
||||
|
||||
@ -43,11 +32,16 @@ public class AssetsHtmlActivity extends WinBoLLActivityBase implements IWinBoLLA
|
||||
|
||||
// Assets 文件夹里的 Html 文件的名称
|
||||
String mszHtmlFileName;
|
||||
//
|
||||
// @Override
|
||||
// public Activity getActivity() {
|
||||
// return this;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
|
@ -217,10 +217,10 @@ final public class MainActivity extends Activity {
|
||||
if (item.getItemId() == R.id.item_exit) {
|
||||
//exit();
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.item_teststringtoqrcodeview) {
|
||||
Intent intent = new Intent(this, TestStringToQRCodeViewActivity.class);
|
||||
startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);
|
||||
//WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, TestStringToQrCodeViewActivity.class);
|
||||
// } else if (item.getItemId() == R.id.item_teststringtoqrcodeview) {
|
||||
// Intent intent = new Intent(this, TestStringToQRCodeViewActivity.class);
|
||||
// startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);
|
||||
// //WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, TestStringToQrCodeViewActivity.class);
|
||||
} else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) {
|
||||
Intent intent = new Intent(this, QRCodeDecodeActivity.class);
|
||||
startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.apputils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/01/18 10:32:21
|
||||
* @Describe 二维码扫码解码窗口
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.apputils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/23 16:14:45
|
||||
*/
|
||||
import android.app.Activity;
|
||||
|
@ -1,36 +0,0 @@
|
||||
package cc.winboll.studio.apputils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Date 2025/01/17 19:50:46
|
||||
*/
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.widget.Toolbar;
|
||||
import cc.winboll.studio.apputils.R;
|
||||
import cc.winboll.studio.libapputils.views.StringToQrCodeView;
|
||||
|
||||
public class TestStringToQRCodeViewActivity extends Activity {
|
||||
|
||||
public static final String TAG = "TestStringToQrCodeViewActivity";
|
||||
|
||||
StringToQrCodeView mStringToQrCodeView;
|
||||
//
|
||||
// @Override
|
||||
// public Activity getActivity() {
|
||||
// return this;
|
||||
// }
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_teststringtoqrcodeview);
|
||||
|
||||
// 初始化工具栏
|
||||
Toolbar mToolbar = findViewById(R.id.toolbar);
|
||||
mToolbar.setSubtitle(TAG);
|
||||
setActionBar(mToolbar);
|
||||
|
||||
mStringToQrCodeView = findViewById(R.id.activityteststringtoqrcodeviewStringToQrCodeView1);
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package cc.winboll.studio.apputils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/05/13 11:15
|
||||
* @Describe WinBoLLActivity
|
||||
*/
|
||||
import android.app.Activity;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class WinBoLLActivity extends Activity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "WinBoLLActivity";
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
}
|
@ -19,7 +19,7 @@ def genVersionName(def versionName){
|
||||
|
||||
android {
|
||||
compileSdkVersion 32
|
||||
buildToolsVersion "33.0.3"
|
||||
buildToolsVersion "32.0.0"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "cc.winboll.studio.autoinstaller"
|
||||
@ -29,7 +29,7 @@ android {
|
||||
// versionName 更新后需要手动设置
|
||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||
versionName "5.0"
|
||||
versionName "15.2"
|
||||
if(true) {
|
||||
versionName = genVersionName("${versionName}")
|
||||
}
|
||||
@ -41,30 +41,33 @@ android {
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api 'cc.winboll.studio:winboll-shared:1.1.0'
|
||||
api 'io.github.medyo:android-about-page:2.0.0'
|
||||
api 'com.github.getActivity:ToastUtils:10.5'
|
||||
api 'com.jcraft:jsch:0.1.55'
|
||||
api 'org.jsoup:jsoup:1.13.1'
|
||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||
|
||||
api 'androidx.appcompat:appcompat:1.0.0'
|
||||
api 'androidx.fragment:fragment:1.0.0'
|
||||
api 'com.google.android.material:material:1.0.0'
|
||||
|
||||
api 'androidx.vectordrawable:vectordrawable-animated:1.0.0'
|
||||
api 'androidx.lifecycle:lifecycle-livedata:1.0.0'
|
||||
|
||||
//api 'cc.winboll.studio:libaes:6.3.2'
|
||||
//api 'cc.winboll.studio:libapputils:8.3.8'
|
||||
|
||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||
api 'cc.winboll.studio:libaes:15.6.0'
|
||||
api 'cc.winboll.studio:libapputils:15.3.4'
|
||||
api 'cc.winboll.studio:libappbase:15.7.6'
|
||||
|
||||
// SSH
|
||||
api 'com.jcraft:jsch:0.1.55'
|
||||
// Html 解析
|
||||
api 'org.jsoup:jsoup:1.13.1'
|
||||
// 二维码类库
|
||||
api 'com.google.zxing:core:3.4.1'
|
||||
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
||||
// 应用介绍页类库
|
||||
api 'io.github.medyo:android-about-page:2.0.0'
|
||||
// 吐司类库
|
||||
api 'com.github.getActivity:ToastUtils:10.5'
|
||||
// 网络连接类库
|
||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||
// AndroidX 类库
|
||||
api 'androidx.appcompat:appcompat:1.1.0'
|
||||
api 'com.google.android.material:material:1.4.0'
|
||||
//api 'androidx.viewpager:viewpager:1.0.0'
|
||||
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||
//api 'androidx.fragment:fragment:1.1.0'
|
||||
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Thu Jan 02 02:39:56 HKT 2025
|
||||
stageCount=4
|
||||
#Tue Jun 24 09:54:47 HKT 2025
|
||||
stageCount=3
|
||||
libraryProject=
|
||||
baseVersion=5.0
|
||||
publishVersion=5.0.3
|
||||
baseVersion=15.2
|
||||
publishVersion=15.2.2
|
||||
buildCount=0
|
||||
baseBetaVersion=5.0.4
|
||||
baseBetaVersion=15.2.3
|
||||
|
@ -24,6 +24,8 @@
|
||||
<!-- MANAGE_EXTERNAL_STORAGE -->
|
||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
|
||||
<application
|
||||
android:name=".App"
|
||||
android:allowBackup="true"
|
||||
@ -33,7 +35,7 @@
|
||||
android:persistent="true"
|
||||
android:supportsRtl="true"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:theme="@style/Theme.Application">
|
||||
android:theme="@style/MyAppTheme">
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
@ -54,6 +56,21 @@
|
||||
|
||||
<service android:name=".services.AssistantService"/>
|
||||
|
||||
<service
|
||||
android:name=".AppBaseTileService"
|
||||
android:exported="true"
|
||||
android:label="@string/tileservice_name"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
|
||||
<intent-filter>
|
||||
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE"/>
|
||||
|
||||
</intent-filter>
|
||||
|
||||
</service>
|
||||
|
||||
<receiver
|
||||
android:name=".receivers.MainReceiver"
|
||||
android:enabled="true"
|
||||
|
@ -1,27 +1,28 @@
|
||||
package cc.winboll.studio.autoinstaller;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/04/28 02:39:58
|
||||
* @Describe 全局应用类
|
||||
*/
|
||||
import android.view.Gravity;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import cc.winboll.studio.shared.app.WinBollApplication;
|
||||
import com.hjq.toast.style.WhiteToastStyle;
|
||||
|
||||
public class App extends WinBollApplication {
|
||||
public class App extends GlobalApplication {
|
||||
|
||||
public static final String TAG = "App";
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
setIsDebug(BuildConfig.DEBUG);
|
||||
|
||||
// 初始化 Toast 框架
|
||||
ToastUtils.init(this);
|
||||
// 设置 Toast 布局样式
|
||||
ToastUtils.setView(R.layout.toast_custom_view);
|
||||
//ToastUtils.setStyle(new WhiteToastStyle());
|
||||
//ToastUtils.setView(R.layout.view_toast);
|
||||
ToastUtils.setStyle(new WhiteToastStyle());
|
||||
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,12 @@
|
||||
package cc.winboll.studio.autoinstaller;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/04/15 09:24:46
|
||||
* @Describe 磁贴工具服务类
|
||||
*/
|
||||
import android.service.quicksettings.Tile;
|
||||
import android.service.quicksettings.TileService;
|
||||
import cc.winboll.studio.autoinstaller.models.AppConfigs;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.autoinstaller;
|
||||
|
||||
import android.os.FileObserver;
|
||||
import cc.winboll.studio.shared.log.LogUtils;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
|
||||
public class FileListener extends FileObserver {
|
||||
public final static String TAG = "FileListener";
|
||||
|
@ -6,21 +6,24 @@ import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.SimpleAdapter;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextClock;
|
||||
import android.widget.Toast;
|
||||
import androidx.core.content.FileProvider;
|
||||
import cc.winboll.studio.shared.log.LogUtils;
|
||||
import cc.winboll.studio.shared.log.LogView;
|
||||
import cc.winboll.studio.autoinstaller.MainActivity;
|
||||
import cc.winboll.studio.autoinstaller.beans.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.models.APKModel;
|
||||
import cc.winboll.studio.autoinstaller.models.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.services.MainService;
|
||||
import cc.winboll.studio.autoinstaller.utils.NotificationUtil;
|
||||
import cc.winboll.studio.autoinstaller.utils.PackageUtil;
|
||||
import cc.winboll.studio.autoinstaller.views.ListViewForScrollView;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.LogView;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
@ -30,8 +33,13 @@ import java.util.Map;
|
||||
public class MainActivity extends Activity {
|
||||
public static final String TAG = "MainActivity";
|
||||
|
||||
public static final int MSG_UPDATE_STATUS = 0;
|
||||
|
||||
private static final int INSTALL_PERMISSION_CODE = 1;
|
||||
|
||||
static MainActivity _MainActivity;
|
||||
|
||||
ArrayList<APKModel> _APKModelList = new ArrayList<APKModel>();
|
||||
LogView mLogView;
|
||||
TextClock mTextClock;
|
||||
EditText mEditText;
|
||||
@ -60,9 +68,11 @@ public class MainActivity extends Activity {
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
_MainActivity = this;
|
||||
initView();
|
||||
|
||||
if (getIntent().getAction().equals(ACTION_NEW_INSTALLTASK)) {
|
||||
String action = getIntent().getAction();
|
||||
if ((action != null) && action.equals(ACTION_NEW_INSTALLTASK)) {
|
||||
mszInstalledPackageName = getIntent().getStringExtra(EXTRA_INSTALLED_PACKAGENAME);
|
||||
mszInstalledAPKFilePath = getIntent().getStringExtra(EXTRA_INSTALLED_APKFILEPATH);
|
||||
installAPK();
|
||||
@ -76,11 +86,7 @@ public class MainActivity extends Activity {
|
||||
mLogView = findViewById(R.id.logview);
|
||||
mLogView.start();
|
||||
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(this);
|
||||
if (appConfigs == null) {
|
||||
appConfigs = new AppConfigs();
|
||||
AppConfigs.saveAppConfigs(this, appConfigs);
|
||||
}
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(this).loadAppConfigs(this);
|
||||
|
||||
if (appConfigs.getSetupMode() == AppConfigs.SetupMode.WATCHOUTPUTINSTALLER) {
|
||||
((RadioButton)findViewById(R.id.activitymainRadioButton1)).setChecked(true);
|
||||
@ -131,23 +137,44 @@ public class MainActivity extends Activity {
|
||||
|
||||
}
|
||||
|
||||
String getLastApkPackageName() {
|
||||
APKModel.loadBeanList(this, _APKModelList, APKModel.class);
|
||||
if (_APKModelList.size() > 0) {
|
||||
return _APKModelList.get(_APKModelList.size() - 1).getApkPackageName();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public void onOpenAPP(View view) {
|
||||
if (mszInstalledPackageName.trim().equals("")) {
|
||||
String szInstalledPackageName = getLastApkPackageName();
|
||||
LogUtils.d(TAG, "szInstalledPackageName : " + szInstalledPackageName);
|
||||
if (szInstalledPackageName.trim().equals("")) {
|
||||
ToastUtils.show("Installed APP package name is null.");
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = getPackageManager().getLaunchIntentForPackage(mszInstalledPackageName);
|
||||
if (intent != null) {
|
||||
startActivity(intent);
|
||||
} else {
|
||||
// 若没能获取到启动意图,可进行相应提示等操作,比如跳转到应用商店让用户下载该应用(示例)
|
||||
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
|
||||
marketIntent.setData(Uri.parse("market://details?id=" + mszInstalledPackageName));
|
||||
startActivity(marketIntent);
|
||||
}
|
||||
PackageUtil.openAPP(this, szInstalledPackageName);
|
||||
}
|
||||
|
||||
// public void onOpenAPP(View view) {
|
||||
// String szInstalledPackageName = getLastApkPackageName();
|
||||
// if (szInstalledPackageName.trim().equals("")) {
|
||||
// ToastUtils.show("Installed APP package name is null.");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// Intent intent = getPackageManager().getLaunchIntentForPackage(mszInstalledPackageName);
|
||||
// if (intent != null) {
|
||||
// //ToastUtils.show("startActivity");
|
||||
// startActivity(intent);
|
||||
// } else {
|
||||
// // 若没能获取到启动意图,可进行相应提示等操作,比如跳转到应用商店让用户下载该应用(示例)
|
||||
// Intent marketIntent = new Intent(Intent.ACTION_VIEW);
|
||||
// marketIntent.setData(Uri.parse("market://details?id=" + mszInstalledPackageName));
|
||||
// startActivity(marketIntent);
|
||||
// }
|
||||
// }
|
||||
|
||||
public void onInstallAPK(View view) {
|
||||
installAPK();
|
||||
}
|
||||
@ -185,17 +212,22 @@ public class MainActivity extends Activity {
|
||||
}
|
||||
|
||||
public void onLockPath(View view) {
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(this);
|
||||
|
||||
Switch sw = (Switch)view;
|
||||
if (sw.isChecked()) {
|
||||
setMainServiceStatus(sw.isChecked());
|
||||
}
|
||||
|
||||
public void setMainServiceStatus(boolean isEnable) {
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(this).loadAppConfigs(this);
|
||||
|
||||
Switch sw = (Switch)findViewById(R.id.activitymainSwitch1);
|
||||
if (isEnable) {
|
||||
String szFilePath = mEditText.getText().toString();
|
||||
|
||||
// 设置空路径时退出
|
||||
//
|
||||
if (szFilePath.trim().equals("")) {
|
||||
sw.setChecked(false);
|
||||
Toast.makeText(getApplication(), "监控路径为空。", Toast.LENGTH_SHORT).show();
|
||||
ToastUtils.show("监控路径为空。");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -236,7 +268,7 @@ public class MainActivity extends Activity {
|
||||
stopWatchingFile();
|
||||
|
||||
}
|
||||
AppConfigs.saveAppConfigs(this, appConfigs);
|
||||
AppConfigs.getInstance(this).saveAppConfigs(this, appConfigs);
|
||||
}
|
||||
|
||||
void stopWatchingFile() {
|
||||
@ -251,8 +283,6 @@ public class MainActivity extends Activity {
|
||||
Intent intentService = new Intent(MainActivity.this, MainService.class);
|
||||
//intentService.putExtra(MainService.EXTRA_APKFILEPATH, szAPKFilePath);
|
||||
startService(intentService);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -298,7 +328,7 @@ public class MainActivity extends Activity {
|
||||
}*/
|
||||
|
||||
public void onChangeSetupMode(View view) {
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(this).loadAppConfigs(this);
|
||||
|
||||
if (view.getId() == R.id.activitymainRadioButton1) {
|
||||
appConfigs.setSetupMode(AppConfigs.SetupMode.WATCHOUTPUTINSTALLER);
|
||||
@ -307,6 +337,42 @@ public class MainActivity extends Activity {
|
||||
appConfigs.setSetupMode(AppConfigs.SetupMode.NEWAPKINFONEWAPKINFO);
|
||||
((RadioButton)findViewById(R.id.activitymainRadioButton1)).setChecked(false);
|
||||
}
|
||||
AppConfigs.saveAppConfigs(this, appConfigs);
|
||||
AppConfigs.getInstance(this).saveAppConfigs(this, appConfigs);
|
||||
}
|
||||
|
||||
// 定义Handler
|
||||
static Handler _Handler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
super.handleMessage(msg);
|
||||
if (msg.what == MSG_UPDATE_STATUS) {
|
||||
if (_MainActivity != null) {
|
||||
boolean isEnableMainService = (boolean)msg.obj;
|
||||
// 处理消息,这里更新 MainService 的状态
|
||||
_MainActivity.setMainServiceStatus(isEnableMainService);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static void updateMainServiceStatus(boolean isEnable) {
|
||||
if (_Handler != null) {
|
||||
Message msg = new Message();
|
||||
msg.obj = isEnable;
|
||||
msg.what = MSG_UPDATE_STATUS;
|
||||
_Handler.sendMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void stopMainService() {
|
||||
if (_MainActivity != null && _Handler != null) {
|
||||
updateMainServiceStatus(false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void startMainService() {
|
||||
if (_MainActivity != null && _Handler != null) {
|
||||
updateMainServiceStatus(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,54 +1,57 @@
|
||||
package cc.winboll.studio.appbase.models;
|
||||
package cc.winboll.studio.autoinstaller.models;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Date 2025/02/17 10:05:09
|
||||
* @Describe APPSOSReportBean
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/04/02 20:50:29
|
||||
* @Describe 监控的 APK 安装文件对应的应用信息数据模型
|
||||
*/
|
||||
import android.util.JsonReader;
|
||||
import android.util.JsonWriter;
|
||||
import cc.winboll.studio.libappbase.BaseBean;
|
||||
import java.io.IOException;
|
||||
|
||||
public class WinBollNewsBean extends BaseBean {
|
||||
public class APKModel extends BaseBean {
|
||||
|
||||
public static final String TAG = "WinBollNewsBean";
|
||||
public static final String TAG = "APPModel";
|
||||
|
||||
protected String message;
|
||||
// 每次更新的 APK 文件对应的应用包名称
|
||||
String apkPackageName;
|
||||
|
||||
public WinBollNewsBean() {
|
||||
this.message = "";
|
||||
public APKModel() {
|
||||
this.apkPackageName = "";
|
||||
}
|
||||
|
||||
public WinBollNewsBean(String message) {
|
||||
this.message = message;
|
||||
public APKModel(String apkPackageName) {
|
||||
this.apkPackageName = apkPackageName;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
public void setApkPackageName(String apkPackageName) {
|
||||
this.apkPackageName = apkPackageName;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
public String getApkPackageName() {
|
||||
return apkPackageName;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return WinBollNewsBean.class.getName();
|
||||
return APKModel.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
|
||||
super.writeThisToJsonWriter(jsonWriter);
|
||||
jsonWriter.name("message").value(getMessage());
|
||||
jsonWriter.name("appPackageName").value(getApkPackageName());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
|
||||
if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
|
||||
if (name.equals("message")) {
|
||||
setMessage(jsonReader.nextString());
|
||||
if (name.equals("appPackageName")) {
|
||||
setApkPackageName(jsonReader.nextString());
|
||||
} else {
|
||||
return false;
|
||||
}
|
@ -1,20 +1,21 @@
|
||||
package cc.winboll.studio.autoinstaller.beans;
|
||||
package cc.winboll.studio.autoinstaller.models;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/05/27 17:36:01
|
||||
* @Describe 应用配置数据类
|
||||
*/
|
||||
import android.content.Context;
|
||||
import android.util.JsonReader;
|
||||
import android.util.JsonWriter;
|
||||
import cc.winboll.studio.autoinstaller.beans.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.models.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.utils.FileUtil;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import cc.winboll.studio.shared.log.LogUtils;
|
||||
|
||||
public class AppConfigs implements Serializable {
|
||||
|
||||
@ -26,6 +27,21 @@ public class AppConfigs implements Serializable {
|
||||
NEWAPKINFONEWAPKINFO // 调用[应用信息查看器]打开应用包
|
||||
};
|
||||
|
||||
static volatile AppConfigs _AppConfigs;
|
||||
Context mContext;
|
||||
|
||||
AppConfigs(Context context) {
|
||||
mContext = context.getApplicationContext();
|
||||
}
|
||||
|
||||
public static synchronized AppConfigs getInstance(Context context) {
|
||||
if (_AppConfigs == null) {
|
||||
_AppConfigs = new AppConfigs(context);
|
||||
_AppConfigs.loadAppConfigs(_AppConfigs.mContext);
|
||||
}
|
||||
return _AppConfigs;
|
||||
}
|
||||
|
||||
// 监控文件路径
|
||||
private String watchingFilePath = "";
|
||||
|
||||
@ -85,8 +101,8 @@ public class AppConfigs implements Serializable {
|
||||
return "";
|
||||
}
|
||||
|
||||
public static AppConfigs parseAppConfigs(String szAppConfigs) {
|
||||
AppConfigs appConfigs = new AppConfigs();
|
||||
public AppConfigs parseAppConfigs(String szAppConfigs) {
|
||||
AppConfigs appConfigs = new AppConfigs(mContext);
|
||||
// 创建 JsonWriter 对象
|
||||
StringReader stringReader = new StringReader(szAppConfigs);
|
||||
JsonReader jsonReader = new
|
||||
@ -122,19 +138,34 @@ public class AppConfigs implements Serializable {
|
||||
return context.getExternalFilesDir(TAG) + "/" + TAG + ".json";
|
||||
}
|
||||
|
||||
public static AppConfigs loadAppConfigs(Context context) {
|
||||
public AppConfigs loadAppConfigs() {
|
||||
AppConfigs appConfigs = null;
|
||||
try {
|
||||
String szJson = FileUtil.readFile(getDataPath(context));
|
||||
appConfigs = AppConfigs.parseAppConfigs(szJson);
|
||||
String szJson = FileUtil.readFile(getDataPath(mContext));
|
||||
appConfigs = AppConfigs.getInstance(mContext).parseAppConfigs(szJson);
|
||||
} catch (IOException e) {
|
||||
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace());
|
||||
}
|
||||
return appConfigs;
|
||||
}
|
||||
|
||||
public static void saveAppConfigs(Context context, AppConfigs appConfigs) {
|
||||
public AppConfigs loadAppConfigs(Context context) {
|
||||
AppConfigs appConfigs = null;
|
||||
try {
|
||||
String szJson = FileUtil.readFile(getDataPath(context.getApplicationContext()));
|
||||
appConfigs = AppConfigs.getInstance(mContext).parseAppConfigs(szJson);
|
||||
if(appConfigs != null) {
|
||||
_AppConfigs = appConfigs;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace());
|
||||
}
|
||||
return _AppConfigs;
|
||||
}
|
||||
|
||||
public void saveAppConfigs(Context context, AppConfigs appConfigs) {
|
||||
try {
|
||||
ToastUtils.show(String.format("AppConfigs set enable service to %s", appConfigs.isEnableService()));
|
||||
//LogUtils.d(TAG, "appConfigs is : " + appConfigs.toString());
|
||||
String szJson = appConfigs.toString();
|
||||
FileUtil.writeFile(getDataPath(context), szJson);
|
||||
@ -142,4 +173,8 @@ public class AppConfigs implements Serializable {
|
||||
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace());
|
||||
}
|
||||
}
|
||||
|
||||
public void saveAppConfigs() {
|
||||
saveAppConfigs(mContext, this);
|
||||
}
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
package cc.winboll.studio.appbase.models;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Date 2025/02/13 07:06:13
|
||||
*/
|
||||
package cc.winboll.studio.autoinstaller.models;
|
||||
import android.util.JsonReader;
|
||||
import android.util.JsonWriter;
|
||||
import cc.winboll.studio.libappbase.BaseBean;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/04/15 09:27:39
|
||||
* @Describe MainServiceBean
|
||||
*/
|
||||
public class MainServiceBean extends BaseBean {
|
||||
|
||||
public static final String TAG = "MainServiceBean";
|
@ -4,12 +4,12 @@ import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import cc.winboll.studio.autoinstaller.beans.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.models.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.services.MainService;
|
||||
import cc.winboll.studio.shared.log.LogUtils;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/06/06 13:19:38
|
||||
* @Describe 应用消息接收类
|
||||
*/
|
||||
@ -23,7 +23,7 @@ public class MainReceiver extends BroadcastReceiver {
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String szAction = intent.getAction();
|
||||
if (szAction.equals(ACTION_BOOT_COMPLETED)) {
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(context);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(context).loadAppConfigs(context);
|
||||
if (appConfigs.isEnableService()) {
|
||||
Intent intentService = new Intent(context, MainService.class);
|
||||
//intentService.putExtra(MainService.EXTRA_APKFILEPATH, appConfigs.getWatchingFilePath());
|
||||
|
@ -6,11 +6,11 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.IBinder;
|
||||
import cc.winboll.studio.autoinstaller.beans.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.models.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.utils.ServiceUtil;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/05/27 20:16:00
|
||||
* @Describe MainService 守护进程服务
|
||||
*/
|
||||
@ -46,7 +46,7 @@ public class AssistantService extends Service {
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
//LogUtils.d(TAG, "call onStartCommand(...)");
|
||||
run();
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(AssistantService.this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(AssistantService.this);
|
||||
return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ public class AssistantService extends Service {
|
||||
//
|
||||
void run() {
|
||||
//LogUtils.d(TAG, "call run()");
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(AssistantService.this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(AssistantService.this);
|
||||
if (appConfigs.isEnableService()) {
|
||||
if (mIsThreadAlive == false) {
|
||||
// 设置运行状态
|
||||
@ -101,7 +101,7 @@ public class AssistantService extends Service {
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
//LogUtils.d(TAG, "call onServiceDisconnected(...)");
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(AssistantService.this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(AssistantService.this);
|
||||
if (appConfigs.isEnableService()) {
|
||||
wakeupAndBindMain();
|
||||
}
|
||||
|
@ -10,25 +10,32 @@ import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.service.quicksettings.Tile;
|
||||
import android.service.quicksettings.TileService;
|
||||
import android.widget.Toast;
|
||||
import androidx.core.content.FileProvider;
|
||||
import cc.winboll.studio.shared.log.LogUtils;
|
||||
import cc.winboll.studio.autoinstaller.FileListener;
|
||||
import cc.winboll.studio.autoinstaller.MainActivity;
|
||||
import cc.winboll.studio.autoinstaller.beans.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.R;
|
||||
import cc.winboll.studio.autoinstaller.models.APKModel;
|
||||
import cc.winboll.studio.autoinstaller.models.AppConfigs;
|
||||
import cc.winboll.studio.autoinstaller.services.AssistantService;
|
||||
import cc.winboll.studio.autoinstaller.services.MainService;
|
||||
import cc.winboll.studio.autoinstaller.utils.NotificationUtil;
|
||||
import cc.winboll.studio.autoinstaller.utils.PackageUtil;
|
||||
import cc.winboll.studio.autoinstaller.utils.ServiceUtil;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import java.io.File;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class MainService extends Service {
|
||||
|
||||
public static String TAG = "MainService";
|
||||
|
||||
Context mContext;
|
||||
|
||||
ArrayList<APKModel> _APKModelList = new ArrayList<APKModel>();
|
||||
private static boolean _mIsServiceAlive;
|
||||
//String mszAPKFilePath;
|
||||
//String mszAPKFileName;
|
||||
@ -47,6 +54,7 @@ public class MainService extends Service {
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
mContext = this;
|
||||
LogUtils.d(TAG, "onCreate()");
|
||||
_mIsServiceAlive = false;
|
||||
mHandler = new MyHandler(MainService.this);
|
||||
@ -55,11 +63,14 @@ public class MainService extends Service {
|
||||
}
|
||||
|
||||
run();
|
||||
|
||||
// 初始化磁贴工具服务
|
||||
MainTileService mainTileService = new MainTileService(this);
|
||||
}
|
||||
|
||||
private void run() {
|
||||
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(MainService.this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(MainService.this);
|
||||
if (appConfigs.isEnableService()) {
|
||||
if (_mIsServiceAlive == false) {
|
||||
// 设置运行状态
|
||||
@ -74,7 +85,8 @@ public class MainService extends Service {
|
||||
|
||||
startWatchingFile(appConfigs.getWatchingFilePath());
|
||||
|
||||
LogUtils.d(TAG, "running...");
|
||||
//LogUtils.d(TAG, "running...");
|
||||
//ToastUtils.show("running...");
|
||||
|
||||
} else {
|
||||
LogUtils.d(TAG, "_mIsServiceAlive is " + Boolean.toString(_mIsServiceAlive));
|
||||
@ -94,6 +106,7 @@ public class MainService extends Service {
|
||||
}
|
||||
_mIsServiceAlive = false;
|
||||
LogUtils.d(TAG, "onDestroy()");
|
||||
mContext = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -101,7 +114,7 @@ public class MainService extends Service {
|
||||
LogUtils.d(TAG, "onStartCommand");
|
||||
|
||||
run();
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(MainService.this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(MainService.this);
|
||||
|
||||
return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
|
||||
}
|
||||
@ -118,7 +131,7 @@ public class MainService extends Service {
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
//LogUtils.d(TAG, "call onServiceConnected(...)");
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(MainService.this);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(MainService.this);
|
||||
if (appConfigs.isEnableService()) {
|
||||
// 唤醒守护进程
|
||||
wakeupAndBindAssistant();
|
||||
@ -160,7 +173,7 @@ public class MainService extends Service {
|
||||
|
||||
});
|
||||
mFileListener.startWatching();
|
||||
ToastUtils.show("Start watching.");
|
||||
//ToastUtils.show("Start watching.");
|
||||
} else {
|
||||
// 父级文件夹不存在,就提示用户
|
||||
Toast.makeText(getApplication(), fParentDir.toString() + " no exist.", Toast.LENGTH_SHORT).show();
|
||||
@ -176,6 +189,9 @@ public class MainService extends Service {
|
||||
// 调用[应用信息查看器]打开应用包
|
||||
//
|
||||
private void installAPK(String szAPKFilePath) {
|
||||
String szAPKPackageName = PackageUtil.getPackageNameFromApk(this, szAPKFilePath);
|
||||
saveAPKInfo(szAPKPackageName);
|
||||
|
||||
long nTimeNow = System.currentTimeMillis();
|
||||
/*SimpleDateFormat dateFormat = new SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm:ss", Locale.getDefault());
|
||||
@ -210,15 +226,24 @@ public class MainService extends Service {
|
||||
//
|
||||
void installAPK2(String szAPKFilePath) {
|
||||
LogUtils.d(TAG, "installAPK2()");
|
||||
String szAPKPackageName = PackageUtil.getPackageNameFromApk(this, szAPKFilePath);
|
||||
saveAPKInfo(szAPKPackageName);
|
||||
|
||||
Intent intent = new Intent(this, MainActivity.class);
|
||||
intent.setAction(MainActivity.ACTION_NEW_INSTALLTASK);
|
||||
intent.putExtra(MainActivity.EXTRA_INSTALLED_PACKAGENAME, PackageUtil.getPackageNameFromApk(this, szAPKFilePath));
|
||||
intent.putExtra(MainActivity.EXTRA_INSTALLED_PACKAGENAME, szAPKPackageName);
|
||||
intent.putExtra(MainActivity.EXTRA_INSTALLED_APKFILEPATH, szAPKFilePath);
|
||||
// Intent.ACTION_VIEW);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
this.startActivity(intent);
|
||||
}
|
||||
|
||||
void saveAPKInfo(String szApkPackageName) {
|
||||
APKModel.loadBeanList(this, _APKModelList, APKModel.class);
|
||||
_APKModelList.add(new APKModel(szApkPackageName));
|
||||
APKModel.saveBeanList(this, _APKModelList, APKModel.class);
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
static class MyHandler extends Handler {
|
||||
@ -231,7 +256,7 @@ public class MainService extends Service {
|
||||
switch (message.what) {
|
||||
case MSG_INSTALL_APK:
|
||||
{
|
||||
AppConfigs appConfigs = AppConfigs.loadAppConfigs(theActivity);
|
||||
AppConfigs appConfigs = AppConfigs.getInstance(theActivity).loadAppConfigs(theActivity);
|
||||
if (appConfigs.getSetupMode() == AppConfigs.SetupMode.WATCHOUTPUTINSTALLER) {
|
||||
theActivity.installAPK2((String)message.obj);
|
||||
} else if (appConfigs.getSetupMode() == AppConfigs.SetupMode.NEWAPKINFONEWAPKINFO) {
|
||||
@ -245,4 +270,21 @@ public class MainService extends Service {
|
||||
super.handleMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
static class MainTileService extends TileService {
|
||||
Context mContext;
|
||||
MainTileService(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartListening() {
|
||||
super.onStartListening();
|
||||
Tile tile = getQsTile();
|
||||
tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_android));
|
||||
// 更新磁贴状态
|
||||
tile.setState((mContext == null || mContext.getApplicationContext() == null )?Tile.STATE_INACTIVE: Tile.STATE_ACTIVE);
|
||||
tile.updateTile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.autoinstaller.utils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/05/27 17:56:31
|
||||
* @Describe 文件管理类
|
||||
*/
|
||||
|
@ -55,8 +55,9 @@ public class NotificationUtil {
|
||||
|
||||
Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID)
|
||||
.setAutoCancel(true)
|
||||
.setContentTitle(service.getString(R.string.app_name))
|
||||
.setContentText(service.TAG + " is started.")
|
||||
//.setContentTitle(service.getString(R.string.app_name))
|
||||
.setContentTitle(service.TAG + " is started.")
|
||||
//.setContentText(service.TAG + " is started.")
|
||||
.setWhen(System.currentTimeMillis())
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
//设置红色
|
||||
|
@ -1,14 +1,16 @@
|
||||
package cc.winboll.studio.autoinstaller.utils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/12/11 06:28:50
|
||||
* @Describe 一个获取安卓APK安装文件的应用包名的函数
|
||||
*/
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import cc.winboll.studio.shared.log.LogUtils;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
|
||||
public class PackageUtil {
|
||||
|
||||
@ -27,4 +29,20 @@ public class PackageUtil {
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static void openAPP(Context context, String packageName) {
|
||||
// 这里假设要打开微信,微信的包名是com.tencent.mm
|
||||
//String packageName = "com.tencent.mm";
|
||||
LogUtils.d(TAG, "packageName : " + packageName);
|
||||
PackageManager packageManager = context.getPackageManager();
|
||||
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
|
||||
if (intent != null) {
|
||||
ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
|
||||
if (resolveInfo != null) {
|
||||
LogUtils.d(TAG, "startActivity...");
|
||||
context.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.autoinstaller.utils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/05/27 20:20:03
|
||||
* @Describe 服务类工具
|
||||
*/
|
||||
|
11
autoinstaller/src/main/res/drawable/ic_android.xml
Normal file
11
autoinstaller/src/main/res/drawable/ic_android.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.61,15.15C16.15,15.15 15.77,14.78 15.77,14.32S16.15,13.5 16.61,13.5H16.61C17.07,13.5 17.45,13.86 17.45,14.32C17.45,14.78 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,14.78 6.57,14.32C6.57,13.86 6.95,13.5 7.41,13.5H7.41C7.87,13.5 8.24,13.86 8.24,14.32C8.24,14.78 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14H16.91Z"/>
|
||||
|
||||
</vector>
|
@ -132,7 +132,7 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<cc.winboll.studio.shared.log.LogView
|
||||
<cc.winboll.studio.libappbase.LogView
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
|
@ -1,3 +1,4 @@
|
||||
<resources>
|
||||
<string name="app_name">AutoInstaller</string>
|
||||
<string name="tileservice_name">AutoInstaller</string>
|
||||
</resources>
|
||||
|
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="MyAPPBaseTheme" parent="APPBaseTheme">
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<style name="MyAppTheme" parent="APPBaseTheme">
|
||||
<item name="attrColorPrimary">@color/colorPrimary</item>
|
||||
<item name="themeGlobalCrashActivity">@style/MyGlobalCrashActivityTheme</item>
|
||||
</style>
|
@ -1,14 +0,0 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Application" parent="android:Theme.Material.Light.DarkActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="android:colorPrimary">@color/purple_500</item>
|
||||
|
||||
<!-- Secondary brand color. -->
|
||||
<item name="android:colorSecondary">@color/teal_200</item>
|
||||
|
||||
<!-- Status bar color. -->
|
||||
<item name="android:statusBarColor" tools:targetApi="l">@color/purple_700</item>
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
</resources>
|
29
build.gradle
29
build.gradle
@ -1,8 +1,10 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
buildscript {
|
||||
repositories {
|
||||
//本地 maven 库
|
||||
maven { url "file:///sdcard/.aide/maven/" }
|
||||
mavenLocal {
|
||||
// 设置本地Maven仓库路径
|
||||
url 'file:///sdcard/.m2/repository/'
|
||||
}
|
||||
// Nexus Maven 库地址
|
||||
// "WinBoLL Release"
|
||||
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
||||
@ -17,7 +19,13 @@ buildscript {
|
||||
maven { url "https://jitpack.io" }
|
||||
mavenCentral()
|
||||
google()
|
||||
//println "mavenLocal : ==========="
|
||||
//println mavenLocal().url
|
||||
//println "mavenLocal : ==========="
|
||||
//mavenLocal()
|
||||
|
||||
// WinBoLL.CC 紧急备用 Maven 仓库
|
||||
maven { url 'https://spare-maven.winboll.cc/repository/' }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.2.1' // 对应 compileSdkVersion 32
|
||||
@ -28,8 +36,11 @@ buildscript {
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
//本地 maven 库
|
||||
maven { url "file:///sdcard/.aide/maven/" }
|
||||
mavenLocal {
|
||||
// 设置本地Maven仓库路径
|
||||
url 'file:///sdcard/.m2/repository/'
|
||||
}
|
||||
|
||||
// Nexus Maven 库地址
|
||||
// "WinBoLL Release"
|
||||
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
||||
@ -44,7 +55,13 @@ allprojects {
|
||||
maven { url "https://jitpack.io" }
|
||||
mavenCentral()
|
||||
google()
|
||||
mavenLocal()
|
||||
//println "mavenLocal : ==========="
|
||||
//println mavenLocal().url
|
||||
//println "mavenLocal : ==========="
|
||||
//mavenLocal()
|
||||
|
||||
// WinBoLL.CC 紧急备用 Maven 仓库
|
||||
maven { url 'https://spare-maven.winboll.cc/repository/' }
|
||||
}
|
||||
ext {
|
||||
// 定义全局变量,常用于版本管理
|
||||
@ -55,7 +72,7 @@ allprojects {
|
||||
bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh"
|
||||
|
||||
winbollFilePath = "winboll.properties"
|
||||
keyPropsFilePath = "current.keystore"
|
||||
keyPropsFilePath = "appkey.keystore"
|
||||
// 定义 lint 输出文件
|
||||
lintXmlReportFilePath = "build/reports/lint-results.xml"
|
||||
lintHTMLReportFilePath = "build/reports/lint-results.html"
|
||||
|
@ -24,7 +24,7 @@ https://github.com/aJIEw/PhoneCallApp.git
|
||||
|
||||
1. Fork 本仓库
|
||||
2. 新建 Feat_xxx 分支
|
||||
3. 提交代码 : ZhanGSKen(ZhanGSKen@AliYun.Com)
|
||||
3. 提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
|
||||
4. 新建 Pull Request
|
||||
|
||||
|
||||
|
@ -24,12 +24,12 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "cc.winboll.studio.contacts"
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 29
|
||||
targetSdkVersion 30
|
||||
versionCode 1
|
||||
// versionName 更新后需要手动设置
|
||||
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||
versionName "15.2"
|
||||
versionName "15.3"
|
||||
if(true) {
|
||||
versionName = genVersionName("${versionName}")
|
||||
}
|
||||
@ -45,6 +45,9 @@ android {
|
||||
|
||||
dependencies {
|
||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||
api 'cc.winboll.studio:libaes:15.8.0'
|
||||
api 'cc.winboll.studio:libapputils:15.8.1'
|
||||
api 'cc.winboll.studio:libappbase:15.8.1'
|
||||
|
||||
// 权限请求框架:https://github.com/getActivity/XXPermissions
|
||||
api 'com.github.getActivity:XXPermissions:18.63'
|
||||
@ -81,8 +84,4 @@ dependencies {
|
||||
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||
//api 'androidx.fragment:fragment:1.1.0'
|
||||
|
||||
api 'cc.winboll.studio:libaes:15.2.4'
|
||||
api 'cc.winboll.studio:libapputils:15.2.1'
|
||||
api 'cc.winboll.studio:libappbase:15.2.2'
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Sun Apr 13 02:46:09 HKT 2025
|
||||
stageCount=8
|
||||
#Tue May 20 13:02:18 HKT 2025
|
||||
stageCount=3
|
||||
libraryProject=
|
||||
baseVersion=15.2
|
||||
publishVersion=15.2.7
|
||||
baseVersion=15.3
|
||||
publishVersion=15.3.2
|
||||
buildCount=0
|
||||
baseBetaVersion=15.2.8
|
||||
baseBetaVersion=15.3.3
|
||||
|
@ -42,7 +42,8 @@
|
||||
android:icon="@drawable/ic_winboll"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/MyAppTheme"
|
||||
android:supportsRtl="true">
|
||||
android:supportsRtl="true"
|
||||
android:networkSecurityConfig="@xml/network_security_config">
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
|
@ -1,13 +1,13 @@
|
||||
package cc.winboll.studio.contacts;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@QQ.COM
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2024/12/08 15:10:51
|
||||
* @Describe 全局应用类
|
||||
*/
|
||||
import android.view.Gravity;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.winboll.WinBollActivityManager;
|
||||
import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
|
||||
public class App extends GlobalApplication {
|
||||
@ -20,8 +20,8 @@ public class App extends GlobalApplication {
|
||||
// 这样可以预先设置日志与数据的存储根目录。
|
||||
//setIsDebuging(BuildConfig.DEBUG);
|
||||
super.onCreate();
|
||||
// 设置 WinBoll 应用 UI 类型
|
||||
WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication);
|
||||
// 设置 WinBoLL 应用 UI 类型
|
||||
getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Aplication);
|
||||
|
||||
//LogUtils.d(TAG, "onCreate");
|
||||
|
||||
|
@ -32,22 +32,21 @@ import cc.winboll.studio.contacts.fragments.CallLogFragment;
|
||||
import cc.winboll.studio.contacts.fragments.ContactsFragment;
|
||||
import cc.winboll.studio.contacts.fragments.LogFragment;
|
||||
import cc.winboll.studio.contacts.services.MainService;
|
||||
import cc.winboll.studio.libaes.winboll.APPInfo;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.LogView;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener {
|
||||
final public class MainActivity extends AppCompatActivity implements IWinBoLLActivity, ViewPager.OnPageChangeListener, View.OnClickListener {
|
||||
|
||||
public static final String TAG = "MainActivity";
|
||||
|
||||
public static final int REQUEST_HOME_ACTIVITY = 0;
|
||||
public static final int REQUEST_ABOUT_ACTIVITY = 1;
|
||||
|
||||
public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoll.ACTION_SOS";
|
||||
public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoLL.ACTION_SOS";
|
||||
|
||||
static MainActivity _MainActivity;
|
||||
LogView mLogView;
|
||||
@ -71,10 +70,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
|
||||
private static final int DIALER_REQUEST_CODE = 1;
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return this;
|
||||
}
|
||||
// @Override
|
||||
// public Activity getActivity() {
|
||||
// return this;
|
||||
// }
|
||||
|
||||
// @Override
|
||||
// public APPInfo getAppInfo() {
|
||||
@ -95,6 +94,17 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
// return null;
|
||||
// }
|
||||
|
||||
|
||||
@Override
|
||||
public Activity getActivity() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
// 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回
|
||||
@ -111,7 +121,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
// // 显示后退按钮
|
||||
// getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
// }
|
||||
getSupportActionBar().setSubtitle(getTag());
|
||||
getSupportActionBar().setSubtitle(TAG);
|
||||
|
||||
tabLayout = findViewById(R.id.tabLayout);
|
||||
viewPager = findViewById(R.id.viewPager);
|
||||
@ -339,7 +349,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
//
|
||||
// if (intent.getAction().equals(StringToQrCodeView.ACTION_UNITTEST_QRCODE)) {
|
||||
// try {
|
||||
// WinBollActivity clazzActivity = UnitTestActivity.class.newInstance();
|
||||
// WinBoLLActivity clazzActivity = UnitTestActivity.class.newInstance();
|
||||
// String tag = clazzActivity.getTag();
|
||||
// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag);
|
||||
// Intent subIntent = new Intent(this, UnitTestActivity.class);
|
||||
@ -357,8 +367,8 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
// }
|
||||
//
|
||||
// Files.copy(Paths.get(szSrcPath), Paths.get(file.getPath()));
|
||||
// //startWinBollActivity(subIntent, tag);
|
||||
// WinBollActivityManager.getInstance(this).startWinBollActivity(this, subIntent, UnitTestActivity.class);
|
||||
// //startWinBoLLActivity(subIntent, tag);
|
||||
// WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, subIntent, UnitTestActivity.class);
|
||||
// } catch (IllegalAccessException | InstantiationException | IOException e) {
|
||||
// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||
// // 函数处理异常返回失败
|
||||
@ -371,10 +381,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
// return true;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
// @Override
|
||||
// public String getTag() {
|
||||
// return TAG;
|
||||
// }
|
||||
|
||||
// @Override
|
||||
// public void onBackPressed() {
|
||||
@ -386,7 +396,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
//
|
||||
// @Override
|
||||
// public void onYes() {
|
||||
// WinBollActivityManager.getInstance(getApplicationContext()).finishAll();
|
||||
// WinBoLLActivityManager.getInstance(getApplicationContext()).finishAll();
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
@ -408,7 +418,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
|
||||
if (item.getItemId() == R.id.item_settings) {
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
startActivity(intent);
|
||||
//WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class);
|
||||
//WinBoLLActivityManager.getInstance(this).startWinBoLLActivity(this, CallActivity.class);
|
||||
}
|
||||
// } else
|
||||
// if (item.getItemId() == R.id.item_exit) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/31 15:15:54
|
||||
* @Describe 应用介绍窗口
|
||||
*/
|
||||
@ -10,14 +10,15 @@ import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import cc.winboll.studio.contacts.R;
|
||||
import cc.winboll.studio.libaes.winboll.APPInfo;
|
||||
import cc.winboll.studio.libaes.winboll.AboutView;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class AboutActivity extends WinBollActivity implements IWinBollActivity {
|
||||
public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "AboutActivity";
|
||||
|
||||
@ -64,13 +65,13 @@ public class AboutActivity extends WinBollActivity implements IWinBollActivity {
|
||||
);
|
||||
layout.addView(aboutView, params);
|
||||
|
||||
GlobalApplication.getWinBollActivityManager().add(this);
|
||||
GlobalApplication.getWinBoLLActivityManager().add(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
GlobalApplication.getWinBollActivityManager().registeRemove(this);
|
||||
GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
|
||||
}
|
||||
|
||||
public AboutView CreateAboutView() {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/20 17:15:46
|
||||
* @Describe 拨号窗口
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/20 20:18:26
|
||||
*/
|
||||
import android.content.Intent;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/21 05:37:42
|
||||
*/
|
||||
import android.content.Context;
|
||||
@ -24,6 +24,7 @@ import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import cc.winboll.studio.contacts.App;
|
||||
import cc.winboll.studio.contacts.R;
|
||||
import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter;
|
||||
import cc.winboll.studio.contacts.beans.MainServiceBean;
|
||||
@ -34,15 +35,13 @@ import cc.winboll.studio.contacts.bobulltoon.TomCat;
|
||||
import cc.winboll.studio.contacts.dun.Rules;
|
||||
import cc.winboll.studio.contacts.services.MainService;
|
||||
import cc.winboll.studio.contacts.views.DuInfoTextView;
|
||||
import cc.winboll.studio.libaes.winboll.APPInfo;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.List;
|
||||
import cc.winboll.studio.contacts.App;
|
||||
|
||||
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity {
|
||||
public class SettingsActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "SettingsActivity";
|
||||
|
||||
@ -177,6 +176,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
||||
etDunResumeSecondCount.setEnabled(!isEnableDun);
|
||||
etDunResumeCount.setEnabled(!isEnableDun);
|
||||
|
||||
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
|
||||
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
|
||||
}
|
||||
|
||||
public static void notifyDunInfoUpdate() {
|
||||
@ -201,6 +202,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
||||
settingsModel.setIsEnableDun(isEnableDun);
|
||||
Rules.getInstance(this).saveDun();
|
||||
Rules.getInstance(this).reload();
|
||||
|
||||
// 重新加载盾牌参数
|
||||
etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
|
||||
etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
|
||||
etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
|
||||
}
|
||||
|
||||
void updateStreamVolumeTextView() {
|
||||
@ -233,7 +239,18 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
||||
}
|
||||
}
|
||||
|
||||
public void onResetBoBullToonURL(View view) {
|
||||
Rules.getInstance(this).resetDefaultBoBullToonURL();
|
||||
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
|
||||
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
|
||||
}
|
||||
|
||||
public void onDownloadBoBullToon(View view) {
|
||||
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
|
||||
if (!etBoBullToonURL.getText().toString().trim().equals(Rules.getInstance(this).getBoBullToonURL())) {
|
||||
Rules.getInstance(this).setBoBullToonURL(etBoBullToonURL.getText().toString().trim());
|
||||
}
|
||||
|
||||
final TomCat tomCat = TomCat.getInstance(this);
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
@ -247,8 +264,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
||||
}).start();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void onSearchBoBullToonPhone(View view) {
|
||||
TomCat tomCat = TomCat.getInstance(this);
|
||||
EditText etPhone = findViewById(R.id.activitysettingsEditText1);
|
||||
@ -313,6 +328,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
||||
}
|
||||
|
||||
public void onAbout(View view) {
|
||||
App.getWinBollActivityManager().startWinBollActivity(this, AboutActivity.class);
|
||||
App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class);
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.LogView;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/02 16:07:04
|
||||
*/
|
||||
public class UnitTestActivity extends Activity {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.activities;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/31 15:16:45
|
||||
* @Describe 应用窗口基类
|
||||
*/
|
||||
@ -11,9 +11,9 @@ import android.view.MenuItem;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import cc.winboll.studio.libaes.beans.AESThemeBean;
|
||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||
|
||||
public class WinBollActivity extends AppCompatActivity implements IWinBollActivity {
|
||||
public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||
|
||||
public static final String TAG = "WinBollActivity";
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.adapters;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/26 13:09:32
|
||||
* @Describe CallLogAdapter
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.adapters;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/26 13:35:44
|
||||
* @Describe ContactAdapter
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.adapters;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/20 14:20:38
|
||||
* @Describe ImagePagerAdapter
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.adapters;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/02 17:27:41
|
||||
* @Describe PhoneConnectRuleAdapter
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.beans;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/26 13:10:57
|
||||
* @Describe CallLogModel
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.beans;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/26 13:37:00
|
||||
* @Describe ContactModel
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.beans;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/13 07:06:13
|
||||
*/
|
||||
import android.util.JsonReader;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.beans;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/21 09:52:10
|
||||
* @Describe 电话黑名单规则
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.beans;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/02/24 18:47:11
|
||||
* @Describe 手机铃声设置参数类
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cc.winboll.studio.contacts.beans;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/02 19:51:40
|
||||
* @Describe SettingsModel
|
||||
*/
|
||||
@ -14,6 +14,7 @@ import cc.winboll.studio.contacts.utils.IntUtils;
|
||||
public class SettingsModel extends BaseBean {
|
||||
|
||||
public static final String TAG = "SettingsModel";
|
||||
|
||||
public static final int MAX_INTRANGE = 666666;
|
||||
public static final int MIN_INTRANGE = 1;
|
||||
|
||||
@ -27,6 +28,8 @@ public class SettingsModel extends BaseBean {
|
||||
int dunResumeCount;
|
||||
// 是否启用云盾
|
||||
boolean isEnableDun;
|
||||
// BoBullToon 应用模块数据请求地址
|
||||
String szBoBullToon_URL;
|
||||
|
||||
public SettingsModel() {
|
||||
this.dunTotalCount = 6;
|
||||
@ -34,14 +37,24 @@ public class SettingsModel extends BaseBean {
|
||||
this.dunResumeSecondCount = 60;
|
||||
this.dunResumeCount = 1;
|
||||
this.isEnableDun = false;
|
||||
this.szBoBullToon_URL = "";
|
||||
}
|
||||
|
||||
public SettingsModel(int dunTotalCount, int dunCurrentCount, int dunResumeSecondCount, int dunResumeCount, boolean isEnableDun) {
|
||||
public SettingsModel(int dunTotalCount, int dunCurrentCount, int dunResumeSecondCount, int dunResumeCount, boolean isEnableDun, String szBoBullToon_URL) {
|
||||
this.dunTotalCount = getSettingsModelRangeInt(dunTotalCount);
|
||||
this.dunCurrentCount = getSettingsModelRangeInt(dunCurrentCount);
|
||||
this.dunResumeSecondCount = getSettingsModelRangeInt(dunResumeSecondCount);
|
||||
this.dunResumeCount = getSettingsModelRangeInt(dunResumeCount);
|
||||
this.isEnableDun = isEnableDun;
|
||||
this.szBoBullToon_URL = szBoBullToon_URL;
|
||||
}
|
||||
|
||||
public void setBoBullToon_URL(String boBullToon_URL) {
|
||||
this.szBoBullToon_URL = boBullToon_URL;
|
||||
}
|
||||
|
||||
public String getBoBullToon_URL() {
|
||||
return szBoBullToon_URL;
|
||||
}
|
||||
|
||||
public void setDunTotalCount(int dunTotalCount) {
|
||||
@ -102,6 +115,7 @@ public class SettingsModel extends BaseBean {
|
||||
jsonWriter.name("dunResumeSecondCount").value(getDunResumeSecondCount());
|
||||
jsonWriter.name("dunResumeCount").value(getDunResumeCount());
|
||||
jsonWriter.name("isEnableDun").value(isEnableDun());
|
||||
jsonWriter.name("szBoBullToon_URL").value(getBoBullToon_URL());
|
||||
|
||||
}
|
||||
|
||||
@ -118,6 +132,8 @@ public class SettingsModel extends BaseBean {
|
||||
setDunResumeCount(getSettingsModelRangeInt(jsonReader.nextInt()));
|
||||
} else if (name.equals("isEnableDun")) {
|
||||
setIsEnableDun(jsonReader.nextBoolean());
|
||||
} else if (name.equals("szBoBullToon_URL")) {
|
||||
setBoBullToon_URL(jsonReader.nextString());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -1,11 +1,13 @@
|
||||
package cc.winboll.studio.contacts.bobulltoon;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen@AliYun.Com
|
||||
* @Author ZhanGSKen<zhangsken@188.com>
|
||||
* @Date 2025/03/02 13:47:48
|
||||
* @Describe 汤姆猫管家 :使用 BoBullToon 项目,对通讯地址进行筛选判断的好朋友。
|
||||
*/
|
||||
import android.content.Context;
|
||||
import cc.winboll.studio.contacts.R;
|
||||
import cc.winboll.studio.contacts.dun.Rules;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import java.io.File;
|
||||
@ -28,6 +30,7 @@ public class TomCat {
|
||||
public static final String TAG = "TomCat";
|
||||
|
||||
List<String> listPhoneBoBullToon = new ArrayList<String>();
|
||||
String mszBoBullToon_URL;
|
||||
|
||||
static volatile TomCat _TomCat;
|
||||
Context mContext;
|
||||
@ -42,7 +45,11 @@ public class TomCat {
|
||||
return _TomCat;
|
||||
}
|
||||
|
||||
void downloadAndExtractZip(String zipUrl, String destinationFolder) throws IOException {
|
||||
public String getDefaultBobulltoonUrl() {
|
||||
return mContext.getString(R.string.default_bobulltoon_url);
|
||||
}
|
||||
|
||||
boolean downloadAndExtractZip(String zipUrl, String destinationFolder) throws IOException {
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
Request request = new Request.Builder()
|
||||
.url(zipUrl)
|
||||
@ -95,13 +102,16 @@ public class TomCat {
|
||||
// 删除临时 ZIP 文件
|
||||
tempZipFile.delete();
|
||||
LogUtils.d(TAG, "已更新 BoBullToon 数据");
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
ToastUtils.show(e.getMessage());
|
||||
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean downloadBoBullToon() {
|
||||
String zipUrl = "http://10.8.0.12:3000/Studio/BoBullToon/archive/main.zip"; // 替换为实际的 ZIP 文件 URL
|
||||
String zipUrl = Rules.getInstance(mContext).getBoBullToonURL(); // 替换为实际的 ZIP 文件 URL
|
||||
String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径
|
||||
try {
|
||||
// 删除旧文件
|
||||
@ -113,9 +123,11 @@ public class TomCat {
|
||||
}
|
||||
|
||||
// 更新新文件
|
||||
downloadAndExtractZip(zipUrl, destinationFolder);
|
||||
if(downloadAndExtractZip(zipUrl, destinationFolder)) {
|
||||
LogUtils.d(TAG, "ZIP 文件下载并解压成功。");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} catch (IOException e) {
|
||||
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user