Compare commits
	
		
			135 Commits
		
	
	
		
			aes-v15.8.
			...
			f93b6047a8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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 | ||
| 
						 | 
					c40066ca4d | ||
| 
						 | 
					5348d1ef6d | ||
| 
						 | 
					063c997bbb | ||
| 
						 | 
					1376ca7ebb | ||
| 
						 | 
					92e271b569 | ||
| 
						 | 
					a5083cc52f | ||
| 
						 | 
					0692d4efb2 | ||
| 
						 | 
					f10438d3d3 | ||
| 
						 | 
					1e697bc12d | ||
| 
						 | 
					d5a3c626b3 | ||
| 
						 | 
					56692db142 | ||
| 
						 | 
					934d54963a | ||
| 
						 | 
					c105123e7b | ||
| 
						 | 
					d8c534bbc8 | ||
| 
						 | 
					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 | ||
| 
						 | 
					053b45e87e | ||
| 
						 | 
					58e49ed371 | ||
| 
						 | 
					90a6eb266b | ||
| 
						 | 
					f0a564c9bb | ||
| 
						 | 
					46b21331af | ||
| 
						 | 
					6221cc30ac | ||
| 
						 | 
					8489ee6447 | ||
| 
						 | 
					9205af4aa9 | ||
| 
						 | 
					780e730a38 | ||
| 
						 | 
					429499885b | ||
| 
						 | 
					fcf4ad2fc0 | ||
| 
						 | 
					7635f6f084 | ||
| 
						 | 
					e49935f772 | ||
| 
						 | 
					381ddf9e40 | ||
| 
						 | 
					c687b5513d | ||
| 
						 | 
					7c7554133b | ||
| 
						 | 
					98f6d0019b | ||
| 
						 | 
					fc9c82921d | ||
| 
						 | 
					1ac0ad96e1 | ||
| 
						 | 
					9060cb51ff | ||
| 
						 | 
					7951d0a8d6 | ||
| 
						 | 
					ded775ae01 | ||
| 
						 | 
					82258f1763 | ||
| 
						 | 
					99bf53f27d | ||
| 
						 | 
					ddb6b53189 | ||
| 
						 | 
					ae8da772c0 | ||
| 
						 | 
					b2555ebfd3 | ||
| 
						 | 
					82d9aabf33 | ||
| 
						 | 
					e045bbb71c | ||
| 
						 | 
					d5782da040 | ||
| 
						 | 
					840da14438 | ||
| 
						 | 
					31595fe1ae | ||
| 
						 | 
					2c91d32e41 | ||
| 
						 | 
					58dabb7138 | ||
| 
						 | 
					3432575aa7 | ||
| 
						 | 
					fa43d43110 | ||
| 
						 | 
					8f8e7d98c7 | ||
| 
						 | 
					af39f98a51 | ||
| 
						 | 
					5a1d557683 | ||
| 
						 | 
					39116f0912 | ||
| 
						 | 
					a6b711b38b | ||
| 
						 | 
					d1703551f5 | ||
| 
						 | 
					d63f7d3d83 | ||
| 
						 | 
					06b399846d | ||
| 
						 | 
					e06efea08e | ||
| 
						 | 
					890ff6eda9 | ||
| 
						 | 
					e5a5eda9b6 | ||
| 
						 | 
					174a052088 | ||
| 
						 | 
					fbd8441264 | ||
| 
						 | 
					fb92e9f673 | ||
| 
						 | 
					d34d1e2796 | ||
| 
						 | 
					36fb8b41a4 | ||
| 
						 | 
					fe70a18547 | ||
| 
						 | 
					46e4ee7fb7 | ||
| 
						 | 
					b2b959232c | ||
| 
						 | 
					b11f814c41 | ||
| 
						 | 
					1e991aed7e | ||
| 
						 | 
					f56125f82a | ||
| 
						 | 
					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 ..
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
							
								
								
									
										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/)
 | 
			
		||||
 | 
			
		||||
#### 参考文档
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Tue May 13 11:22:23 HKT 2025
 | 
			
		||||
stageCount=1
 | 
			
		||||
#Tue Jun 03 19:17:05 HKT 2025
 | 
			
		||||
stageCount=2
 | 
			
		||||
libraryProject=libaes
 | 
			
		||||
baseVersion=15.8
 | 
			
		||||
publishVersion=15.8.0
 | 
			
		||||
publishVersion=15.8.1
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=15.8.1
 | 
			
		||||
baseBetaVersion=15.8.2
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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.1'
 | 
			
		||||
    api 'cc.winboll.studio:libappbase:15.8.1'
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Thu Apr 03 03:15:55 GMT 2025
 | 
			
		||||
#Mon May 19 21:43:40 GMT 2025
 | 
			
		||||
stageCount=0
 | 
			
		||||
libraryProject=
 | 
			
		||||
baseVersion=15.0
 | 
			
		||||
publishVersion=15.0.0
 | 
			
		||||
buildCount=18
 | 
			
		||||
buildCount=22
 | 
			
		||||
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
 | 
			
		||||
#Sun May 11 19:36:35 GMT 2025
 | 
			
		||||
stageCount=7
 | 
			
		||||
#Tue Jun 03 13:40:08 HKT 2025
 | 
			
		||||
stageCount=5
 | 
			
		||||
libraryProject=libappbase
 | 
			
		||||
baseVersion=15.7
 | 
			
		||||
publishVersion=15.7.6
 | 
			
		||||
buildCount=15
 | 
			
		||||
baseBetaVersion=15.7.7
 | 
			
		||||
baseVersion=15.8
 | 
			
		||||
publishVersion=15.8.4
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=15.8.5
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Toolbar mToolbar;
 | 
			
		||||
    LogView mLogView;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
@@ -53,14 +52,11 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
 | 
			
		||||
 | 
			
		||||
        CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
 | 
			
		||||
        cbIsDebugMode.setChecked(GlobalApplication.isDebuging());
 | 
			
		||||
        mLogView = findViewById(R.id.logview);
 | 
			
		||||
        mLogView.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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -176,8 +172,7 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onResume() {
 | 
			
		||||
        super.onResume();
 | 
			
		||||
        mLogView.start();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -66,16 +66,11 @@ public class New2Activity extends WinBoLLActivity 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);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -64,16 +64,11 @@ public class NewActivity extends WinBoLLActivity 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);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,12 @@ package cc.winboll.studio.appbase.activities;
 | 
			
		||||
 * @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 {
 | 
			
		||||
@@ -21,4 +27,35 @@ public class WinBoLLActivity extends Activity implements IWinBoLLActivity {
 | 
			
		||||
    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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,13 +32,19 @@
 | 
			
		||||
				<TextView
 | 
			
		||||
					android:layout_width="wrap_content"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
					android:text="Hello, WinBoLL!"/>
 | 
			
		||||
 | 
			
		||||
				<TextView
 | 
			
		||||
					android:layout_width="wrap_content"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
					android:text="Android版本10的代号是“Q”,API级别是29。   Android 10开始谷歌不再公开使用甜品作为版本代号,但内部仍保留了大量与“Q”相关的元素。Android 10本身并没有严格对应某个特定的Java版本,但在开发Android 10应用时,通常可以使用Java 8或更高版本。   Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性,能提高开发效率和代码可读性,与Android 10开发适配良好。Java 9及更高版本也可用于Android 10开发,能使用一些新的语言特性和API,但可能需要注意兼容性和配置问题。"/>
 | 
			
		||||
					android:text="安卓R对应的是Android 11,其API级别是30。以下是Android 11中一些重要的API相关特性:
 | 
			
		||||
 | 
			
		||||
                    \n- 隐私保护方面:引入单次授权,让用户可以选择授予应用对位置信息、麦克风和摄像头的临时访问权限。还增加了数据访问审核功能,能让开发者深入了解应用在何处访问私密数据。
 | 
			
		||||
                    
 | 
			
		||||
                    \n- 系统功能方面:提供了ControlsProviderService API,用于向连接的外部设备提供控件,这些控件显示于Android电源菜单中的设备控件下。媒体控件也得到更新,显示于快捷设置旁,来自多个应用的会话排列在一个可滑动的轮播界面中。
 | 
			
		||||
                    
 | 
			
		||||
                    \n- 硬件支持方面:提供了一些API以支持瀑布屏,通过将窗口布局属性  layoutInDisplayCutoutMode  设为  LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS ,可允许窗口延伸到屏幕各个边缘上的刘海和瀑布区域。对于合页式屏幕配置的设备,提供了具有  TYPE_HINGE_ANGLE  的新传感器以及新的  SensorEvent ,用于监控合页角度。
 | 
			
		||||
                    
 | 
			
		||||
                    \n- 安全方面:对生物识别身份验证机制进行了更新,引入了  BiometricManager.Authenticators  接口,定义了  BIOMETRIC_STRONG 、 BIOMETRIC_WEAK 、 DEVICE_CREDENTIAL  等身份验证类型。还在  BiometricPrompt  类中提供了对“每次使用时进行身份验证”密钥的更多支持。
 | 
			
		||||
                    
 | 
			
		||||
                    \n- 性能和质量方面:支持无线调试,通过Android调试桥(adb)从工作站以无线方式部署和调试应用,避免了常见的USB连接问题。"/>
 | 
			
		||||
                
 | 
			
		||||
                    
 | 
			
		||||
				<HorizontalScrollView
 | 
			
		||||
					android:layout_width="match_parent"
 | 
			
		||||
					android:layout_height="wrap_content">
 | 
			
		||||
@@ -211,11 +217,5 @@
 | 
			
		||||
		</LinearLayout>
 | 
			
		||||
 | 
			
		||||
	</ScrollView>
 | 
			
		||||
 | 
			
		||||
	<cc.winboll.studio.libappbase.LogView
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_height="300dp"
 | 
			
		||||
		android:id="@+id/logview"/>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,12 @@
 | 
			
		||||
<?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_log"
 | 
			
		||||
        android:title="LOG"
 | 
			
		||||
        android:icon="@drawable/ic_winboll_log"/>
 | 
			
		||||
</menu>
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -20,18 +20,7 @@ import cc.winboll.studio.libapputils.views.SimpleWebView;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
 | 
			
		||||
public class AssetsHtmlActivity extends WinBoLLActivityBase implements IWinBoLLActivity {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Activity getActivity() {
 | 
			
		||||
        return super.getActivity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getTag() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public class AssetsHtmlActivity extends WinBoLLActivity implements IWinBoLLActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "AssetsHtmlActivity";
 | 
			
		||||
 | 
			
		||||
@@ -43,12 +32,17 @@ public class AssetsHtmlActivity extends WinBoLLActivityBase implements IWinBoLLA
 | 
			
		||||
 | 
			
		||||
    // Assets 文件夹里的 Html 文件的名称
 | 
			
		||||
    String mszHtmlFileName;
 | 
			
		||||
//
 | 
			
		||||
//    @Override
 | 
			
		||||
//    public Activity getActivity() {
 | 
			
		||||
//        return this;
 | 
			
		||||
//    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Activity getActivity() {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getTag() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCreateOptionsMenu(Menu menu) {
 | 
			
		||||
        return super.onCreateOptionsMenu(menu);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -72,7 +72,7 @@ allprojects {
 | 
			
		||||
        bashCommitAppPublishBuildFlagInfoFilePath = ".winboll/bashCommitAppPublishBuildFlagInfo.sh"
 | 
			
		||||
        
 | 
			
		||||
        winbollFilePath = "winboll.properties"
 | 
			
		||||
        keyPropsFilePath = "current.keystore"
 | 
			
		||||
        keyPropsFilePath = "appkey.keystore"
 | 
			
		||||
        // 定义 lint 输出文件
 | 
			
		||||
        lintXmlReportFilePath = "build/reports/lint-results.xml"
 | 
			
		||||
        lintHTMLReportFilePath = "build/reports/lint-results.html"
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -192,4 +193,4 @@
 | 
			
		||||
 | 
			
		||||
    </application>
 | 
			
		||||
 | 
			
		||||
</manifest>
 | 
			
		||||
</manifest>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ package cc.winboll.studio.contacts;
 | 
			
		||||
 */
 | 
			
		||||
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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import cc.winboll.studio.contacts.App;
 | 
			
		||||
import cc.winboll.studio.contacts.R;
 | 
			
		||||
import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter;
 | 
			
		||||
import cc.winboll.studio.contacts.beans.MainServiceBean;
 | 
			
		||||
@@ -34,15 +35,13 @@ import cc.winboll.studio.contacts.bobulltoon.TomCat;
 | 
			
		||||
import cc.winboll.studio.contacts.dun.Rules;
 | 
			
		||||
import cc.winboll.studio.contacts.services.MainService;
 | 
			
		||||
import cc.winboll.studio.contacts.views.DuInfoTextView;
 | 
			
		||||
import cc.winboll.studio.libaes.winboll.APPInfo;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
 | 
			
		||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import cc.winboll.studio.contacts.App;
 | 
			
		||||
 | 
			
		||||
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity {
 | 
			
		||||
public class SettingsActivity extends AppCompatActivity implements IWinBoLLActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "SettingsActivity";
 | 
			
		||||
 | 
			
		||||
@@ -177,6 +176,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
        etDunResumeSecondCount.setEnabled(!isEnableDun);
 | 
			
		||||
        etDunResumeCount.setEnabled(!isEnableDun);
 | 
			
		||||
 | 
			
		||||
        EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
 | 
			
		||||
        etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void notifyDunInfoUpdate() {
 | 
			
		||||
@@ -201,6 +202,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
        settingsModel.setIsEnableDun(isEnableDun);
 | 
			
		||||
        Rules.getInstance(this).saveDun();
 | 
			
		||||
        Rules.getInstance(this).reload();
 | 
			
		||||
        
 | 
			
		||||
        // 重新加载盾牌参数
 | 
			
		||||
        etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
 | 
			
		||||
        etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
 | 
			
		||||
        etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void updateStreamVolumeTextView() {
 | 
			
		||||
@@ -233,7 +239,18 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onResetBoBullToonURL(View view) {
 | 
			
		||||
        Rules.getInstance(this).resetDefaultBoBullToonURL();
 | 
			
		||||
        EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
 | 
			
		||||
        etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onDownloadBoBullToon(View view) {
 | 
			
		||||
        EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
 | 
			
		||||
        if (!etBoBullToonURL.getText().toString().trim().equals(Rules.getInstance(this).getBoBullToonURL())) {
 | 
			
		||||
            Rules.getInstance(this).setBoBullToonURL(etBoBullToonURL.getText().toString().trim());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final TomCat tomCat = TomCat.getInstance(this);
 | 
			
		||||
        new Thread(new Runnable() {
 | 
			
		||||
                @Override
 | 
			
		||||
@@ -247,8 +264,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
            }).start();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public void onSearchBoBullToonPhone(View view) {
 | 
			
		||||
        TomCat tomCat = TomCat.getInstance(this);
 | 
			
		||||
        EditText etPhone = findViewById(R.id.activitysettingsEditText1);
 | 
			
		||||
@@ -311,8 +326,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public void onAbout(View view) {
 | 
			
		||||
        App.getWinBollActivityManager().startWinBollActivity(this, AboutActivity.class);
 | 
			
		||||
        App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import cc.winboll.studio.contacts.utils.IntUtils;
 | 
			
		||||
public class SettingsModel extends BaseBean {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "SettingsModel";
 | 
			
		||||
    
 | 
			
		||||
    public static final int MAX_INTRANGE = 666666;
 | 
			
		||||
    public static final int MIN_INTRANGE = 1;
 | 
			
		||||
    
 | 
			
		||||
@@ -27,6 +28,8 @@ public class SettingsModel extends BaseBean {
 | 
			
		||||
    int dunResumeCount;
 | 
			
		||||
    // 是否启用云盾
 | 
			
		||||
    boolean isEnableDun;
 | 
			
		||||
    // BoBullToon 应用模块数据请求地址
 | 
			
		||||
    String szBoBullToon_URL;
 | 
			
		||||
 | 
			
		||||
    public SettingsModel() {
 | 
			
		||||
        this.dunTotalCount = 6;
 | 
			
		||||
@@ -34,14 +37,24 @@ public class SettingsModel extends BaseBean {
 | 
			
		||||
        this.dunResumeSecondCount = 60;
 | 
			
		||||
        this.dunResumeCount = 1;
 | 
			
		||||
        this.isEnableDun = false;
 | 
			
		||||
        this.szBoBullToon_URL = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public SettingsModel(int dunTotalCount, int dunCurrentCount, int dunResumeSecondCount, int dunResumeCount, boolean isEnableDun) {
 | 
			
		||||
    public SettingsModel(int dunTotalCount, int dunCurrentCount, int dunResumeSecondCount, int dunResumeCount, boolean isEnableDun, String szBoBullToon_URL) {
 | 
			
		||||
        this.dunTotalCount = getSettingsModelRangeInt(dunTotalCount);
 | 
			
		||||
        this.dunCurrentCount = getSettingsModelRangeInt(dunCurrentCount);
 | 
			
		||||
        this.dunResumeSecondCount = getSettingsModelRangeInt(dunResumeSecondCount);
 | 
			
		||||
        this.dunResumeCount = getSettingsModelRangeInt(dunResumeCount);
 | 
			
		||||
        this.isEnableDun = isEnableDun;
 | 
			
		||||
        this.szBoBullToon_URL = szBoBullToon_URL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBoBullToon_URL(String boBullToon_URL) {
 | 
			
		||||
        this.szBoBullToon_URL = boBullToon_URL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getBoBullToon_URL() {
 | 
			
		||||
        return szBoBullToon_URL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDunTotalCount(int dunTotalCount) {
 | 
			
		||||
@@ -102,7 +115,8 @@ public class SettingsModel extends BaseBean {
 | 
			
		||||
        jsonWriter.name("dunResumeSecondCount").value(getDunResumeSecondCount());
 | 
			
		||||
        jsonWriter.name("dunResumeCount").value(getDunResumeCount());
 | 
			
		||||
        jsonWriter.name("isEnableDun").value(isEnableDun());
 | 
			
		||||
 | 
			
		||||
        jsonWriter.name("szBoBullToon_URL").value(getBoBullToon_URL());
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -118,6 +132,8 @@ public class SettingsModel extends BaseBean {
 | 
			
		||||
                setDunResumeCount(getSettingsModelRangeInt(jsonReader.nextInt()));
 | 
			
		||||
            } else if (name.equals("isEnableDun")) {
 | 
			
		||||
                setIsEnableDun(jsonReader.nextBoolean());
 | 
			
		||||
            } else if (name.equals("szBoBullToon_URL")) {
 | 
			
		||||
                setBoBullToon_URL(jsonReader.nextString());
 | 
			
		||||
            } else {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,8 @@ package cc.winboll.studio.contacts.bobulltoon;
 | 
			
		||||
 * @Describe 汤姆猫管家 :使用 BoBullToon 项目,对通讯地址进行筛选判断的好朋友。
 | 
			
		||||
 */
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import cc.winboll.studio.contacts.R;
 | 
			
		||||
import cc.winboll.studio.contacts.dun.Rules;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
@@ -28,6 +30,7 @@ public class TomCat {
 | 
			
		||||
    public static final String TAG = "TomCat";
 | 
			
		||||
 | 
			
		||||
    List<String> listPhoneBoBullToon = new ArrayList<String>();
 | 
			
		||||
    String mszBoBullToon_URL;
 | 
			
		||||
 | 
			
		||||
    static volatile TomCat _TomCat;
 | 
			
		||||
    Context mContext;
 | 
			
		||||
@@ -41,8 +44,12 @@ public class TomCat {
 | 
			
		||||
        }
 | 
			
		||||
        return _TomCat;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public String getDefaultBobulltoonUrl() {
 | 
			
		||||
        return mContext.getString(R.string.default_bobulltoon_url);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void downloadAndExtractZip(String zipUrl, String destinationFolder) throws IOException {
 | 
			
		||||
    boolean downloadAndExtractZip(String zipUrl, String destinationFolder) throws IOException {
 | 
			
		||||
        OkHttpClient client = new OkHttpClient();
 | 
			
		||||
        Request request = new Request.Builder()
 | 
			
		||||
            .url(zipUrl)
 | 
			
		||||
@@ -95,13 +102,16 @@ public class TomCat {
 | 
			
		||||
            // 删除临时 ZIP 文件
 | 
			
		||||
            tempZipFile.delete();
 | 
			
		||||
            LogUtils.d(TAG, "已更新 BoBullToon 数据");
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            ToastUtils.show(e.getMessage());
 | 
			
		||||
            LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean downloadBoBullToon() {
 | 
			
		||||
        String zipUrl = "http://10.8.0.12:3000/Studio/BoBullToon/archive/main.zip"; // 替换为实际的 ZIP 文件 URL
 | 
			
		||||
        String zipUrl = Rules.getInstance(mContext).getBoBullToonURL(); // 替换为实际的 ZIP 文件 URL
 | 
			
		||||
        String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径
 | 
			
		||||
        try {
 | 
			
		||||
            // 删除旧文件
 | 
			
		||||
@@ -113,9 +123,11 @@ public class TomCat {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 更新新文件
 | 
			
		||||
            downloadAndExtractZip(zipUrl, destinationFolder);
 | 
			
		||||
            LogUtils.d(TAG, "ZIP 文件下载并解压成功。");
 | 
			
		||||
            return true;
 | 
			
		||||
            if(downloadAndExtractZip(zipUrl, destinationFolder)) {
 | 
			
		||||
                LogUtils.d(TAG, "ZIP 文件下载并解压成功。");
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            return false;
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.Timer;
 | 
			
		||||
import java.util.TimerTask;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
import cc.winboll.studio.contacts.bobulltoon.TomCat;
 | 
			
		||||
 | 
			
		||||
public class Rules {
 | 
			
		||||
 | 
			
		||||
@@ -84,6 +85,20 @@ public class Rules {
 | 
			
		||||
        PhoneConnectRuleModel.saveBeanList(mContext, _PhoneConnectRuleModelList, PhoneConnectRuleModel.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void resetDefaultBoBullToonURL() {
 | 
			
		||||
        mSettingsModel.setBoBullToon_URL(TomCat.getInstance(mContext).getDefaultBobulltoonUrl());
 | 
			
		||||
        saveDun();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBoBullToonURL(String szUrl) {
 | 
			
		||||
        mSettingsModel.setBoBullToon_URL(szUrl);
 | 
			
		||||
        saveDun();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getBoBullToonURL() {
 | 
			
		||||
        return mSettingsModel.getBoBullToon_URL();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void loadDun() {
 | 
			
		||||
        mSettingsModel = SettingsModel.loadBean(mContext, SettingsModel.class);
 | 
			
		||||
        if (mSettingsModel == null) {
 | 
			
		||||
@@ -109,8 +124,12 @@ public class Rules {
 | 
			
		||||
        boolean isDefend = false; // 盾牌是否生效
 | 
			
		||||
        boolean isConnect = true; // 防御结果是否连接
 | 
			
		||||
 | 
			
		||||
        // 进行盾牌层数预计缩减计算
 | 
			
		||||
        int nDunCurrentCount = mSettingsModel.getDunCurrentCount() - 1;
 | 
			
		||||
        LogUtils.d(TAG, String.format("nDunCurrentCount : %d", nDunCurrentCount));
 | 
			
		||||
 | 
			
		||||
        // 如果盾值小于1,则解除防御
 | 
			
		||||
        if (!isDefend && mSettingsModel.getDunCurrentCount() < 1) {
 | 
			
		||||
        if (!isDefend && nDunCurrentCount < 1) {
 | 
			
		||||
            // 盾层为1以下,防御解除
 | 
			
		||||
            LogUtils.d(TAG, "盾层为1以下,防御解除");
 | 
			
		||||
            isDefend = true;
 | 
			
		||||
@@ -174,17 +193,17 @@ public class Rules {
 | 
			
		||||
            // 就减少防御盾牌层数。
 | 
			
		||||
            // 每校验一次规则,云盾防御层数减1
 | 
			
		||||
            // 当云盾防御层数为0时,再次进行以下程序段则恢复满值防御。
 | 
			
		||||
            int newDunCount = mSettingsModel.getDunCurrentCount() - 1;
 | 
			
		||||
            int newDunCount = nDunCurrentCount;
 | 
			
		||||
            LogUtils.d(TAG, String.format("新的防御层数预计为 %d", newDunCount));
 | 
			
		||||
 | 
			
		||||
            // 保证盾值在[0,DunTotalCount]之内其他值一律重置为 DunTotalCount。
 | 
			
		||||
            if (newDunCount < 0 || newDunCount > mSettingsModel.getDunTotalCount()) {
 | 
			
		||||
                mSettingsModel.setDunCurrentCount(mSettingsModel.getDunTotalCount());
 | 
			
		||||
                LogUtils.d(TAG, String.format("盾值不在[0,%d]区间,恢复防御最大值%d", mSettingsModel.getDunTotalCount(), mSettingsModel.getDunTotalCount()));
 | 
			
		||||
            } else {
 | 
			
		||||
            // 保证盾值在[1,DunTotalCount]之内其他值一律重置为 DunTotalCount。
 | 
			
		||||
            if (newDunCount > 0 && newDunCount < mSettingsModel.getDunTotalCount()) {
 | 
			
		||||
                mSettingsModel.setDunCurrentCount(newDunCount);
 | 
			
		||||
                LogUtils.d(TAG, String.format("设置防御层数为 %d", newDunCount));
 | 
			
		||||
            }
 | 
			
		||||
            } else {
 | 
			
		||||
                mSettingsModel.setDunCurrentCount(mSettingsModel.getDunTotalCount());
 | 
			
		||||
                LogUtils.d(TAG, String.format("盾值不在[0,%d]区间,恢复防御最大值%d", mSettingsModel.getDunTotalCount(), mSettingsModel.getDunTotalCount()));
 | 
			
		||||
            } 
 | 
			
		||||
 | 
			
		||||
            saveDun();
 | 
			
		||||
            SettingsActivity.notifyDunInfoUpdate();
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ import android.content.ServiceConnection;
 | 
			
		||||
import android.media.AudioManager;
 | 
			
		||||
import android.os.Binder;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
import cc.winboll.studio.contacts.App;
 | 
			
		||||
import cc.winboll.studio.contacts.beans.MainServiceBean;
 | 
			
		||||
import cc.winboll.studio.contacts.beans.RingTongBean;
 | 
			
		||||
import cc.winboll.studio.contacts.bobulltoon.TomCat;
 | 
			
		||||
@@ -29,11 +30,9 @@ import cc.winboll.studio.contacts.services.MainService;
 | 
			
		||||
import cc.winboll.studio.contacts.threads.MainServiceThread;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOS;
 | 
			
		||||
import cc.winboll.studio.libappbase.winboll.WinBoLL;
 | 
			
		||||
import java.util.Timer;
 | 
			
		||||
import java.util.TimerTask;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.WinBoll;
 | 
			
		||||
import cc.winboll.studio.contacts.App;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.APPModel;
 | 
			
		||||
 | 
			
		||||
public class MainService extends Service {
 | 
			
		||||
 | 
			
		||||
@@ -129,11 +128,11 @@ public class MainService extends Service {
 | 
			
		||||
            isServiceRunning = true;
 | 
			
		||||
            // 唤醒守护进程
 | 
			
		||||
            wakeupAndBindAssistant();
 | 
			
		||||
            // 召唤 WinBoll APP 绑定本服务
 | 
			
		||||
            // 召唤 WinBoLL APP 绑定本服务
 | 
			
		||||
            if (App.isDebuging()) {
 | 
			
		||||
                WinBoll.bindToAPPBaseBeta(this, MainService.class.getName());
 | 
			
		||||
                WinBoLL.bindToAPPBaseBeta(this, MainService.class.getName());
 | 
			
		||||
            } else {
 | 
			
		||||
                WinBoll.bindToAPPBase(this, MainService.class.getName());
 | 
			
		||||
                WinBoLL.bindToAPPBase(this, MainService.class.getName());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 初始化服务运行参数
 | 
			
		||||
 
 | 
			
		||||
@@ -195,16 +195,29 @@
 | 
			
		||||
				android:text="拨不通电话记录查询:"/>
 | 
			
		||||
 | 
			
		||||
			<LinearLayout
 | 
			
		||||
				android:orientation="vertical"
 | 
			
		||||
				android:orientation="horizontal"
 | 
			
		||||
				android:layout_width="match_parent"
 | 
			
		||||
				android:layout_height="wrap_content"
 | 
			
		||||
				android:gravity="right"
 | 
			
		||||
				android:layout_margin="10dp">
 | 
			
		||||
 | 
			
		||||
				<EditText
 | 
			
		||||
					android:layout_width="0dp"
 | 
			
		||||
					android:ems="10"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
					android:layout_weight="1.0"
 | 
			
		||||
					android:id="@+id/bobulltoonurl_et"/>
 | 
			
		||||
 | 
			
		||||
				<Button
 | 
			
		||||
					android:layout_width="wrap_content"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
					android:text="下载 BoBullToon"
 | 
			
		||||
					android:text="重置地址"
 | 
			
		||||
					android:onClick="onResetBoBullToonURL"/>
 | 
			
		||||
 | 
			
		||||
				<Button
 | 
			
		||||
					android:layout_width="wrap_content"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
					android:text="下载数据"
 | 
			
		||||
					android:onClick="onDownloadBoBullToon"/>
 | 
			
		||||
 | 
			
		||||
			</LinearLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <!-- WinBoll 默认方案 -->
 | 
			
		||||
    <!-- WinBoLL 默认方案 -->
 | 
			
		||||
    <color name="colorPrimary">#FF196ABC</color>
 | 
			
		||||
    <color name="colorPrimaryDark">#FF002B57</color>
 | 
			
		||||
    <color name="colorAccent">#FF80BFFF</color>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,5 +2,6 @@
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <string name="app_name">Contacts</string>
 | 
			
		||||
    <string name="default_bobulltoon_url">http://10.8.0.12:3000/Studio/BoBullToon/archive/main.zip</string>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <style name="MyAppTheme" parent="APPBaseTheme">
 | 
			
		||||
    <style name="MyAppTheme" parent="AESTheme">
 | 
			
		||||
        <item name="colorPrimary">@color/colorPrimary</item>
 | 
			
		||||
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
 | 
			
		||||
        <item name="colorAccent">@color/colorAccent</item>
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
        <item name="android:windowContentOverlay">@null</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
    <style name="GlobalCrashActivityTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
 | 
			
		||||
    <style name="GlobalCrashActivityTheme" parent="AESTheme">
 | 
			
		||||
        <item name="colorTittle">@color/colorAccent</item>
 | 
			
		||||
        <item name="colorTittleBackgound">@color/colorPrimary</item>
 | 
			
		||||
        <item name="colorText">@color/colorAccent</item>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								contacts/src/main/res/xml/network_security_config.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								contacts/src/main/res/xml/network_security_config.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<network-security-config>
 | 
			
		||||
    <domain-config cleartextTrafficPermitted="true">
 | 
			
		||||
        <domain includeSubdomains="true">winboll.cc</domain>
 | 
			
		||||
    </domain-config>
 | 
			
		||||
    <domain-config cleartextTrafficPermitted="true">
 | 
			
		||||
        <domain includeSubdomains="false">10.8.0.12</domain>
 | 
			
		||||
    </domain-config>
 | 
			
		||||
</network-security-config>
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
keyAlias=WinBoLL.CC
 | 
			
		||||
keyPassword=androiddebugkey
 | 
			
		||||
storeFile=../WinBoLL.CC.jks
 | 
			
		||||
storePassword=androiddebugkey
 | 
			
		||||
							
								
								
									
										1
									
								
								keystore
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								keystore
									
									
									
									
									
										Submodule
									
								
							 Submodule keystore added at e7f70226c1
									
								
							@@ -21,8 +21,8 @@ android {
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    api fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    api 'cc.winboll.studio:libapputils:15.8.1'
 | 
			
		||||
    api 'cc.winboll.studio:libappbase:15.8.0'
 | 
			
		||||
    api 'cc.winboll.studio:libapputils:15.8.2'
 | 
			
		||||
    api 'cc.winboll.studio:libappbase:15.8.2'
 | 
			
		||||
    
 | 
			
		||||
    // 吐司类库
 | 
			
		||||
    api 'com.github.getActivity:ToastUtils:10.5'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Tue May 13 11:22:23 HKT 2025
 | 
			
		||||
stageCount=1
 | 
			
		||||
#Tue Jun 03 19:16:41 HKT 2025
 | 
			
		||||
stageCount=2
 | 
			
		||||
libraryProject=libaes
 | 
			
		||||
baseVersion=15.8
 | 
			
		||||
publishVersion=15.8.0
 | 
			
		||||
publishVersion=15.8.1
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=15.8.1
 | 
			
		||||
baseBetaVersion=15.8.2
 | 
			
		||||
 
 | 
			
		||||
@@ -115,7 +115,8 @@ public class AboutView extends LinearLayout {
 | 
			
		||||
            LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
        }
 | 
			
		||||
        mszCurrentAppPackageName = mszAppAPKName + "_" + mszAppVersionName + ".apk";
 | 
			
		||||
        mszHomePage = mszWinBoLLServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
 | 
			
		||||
        mszHomePage = mAPPInfo.getAppHomePage();
 | 
			
		||||
        //mszHomePage = mszWinBoLLServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
 | 
			
		||||
        if (mAPPInfo.getAppGitAPPBranch().equals("")) {
 | 
			
		||||
            mszGitea = "https://gitea.winboll.cc/" + mAPPInfo.getAppGitOwner() + "/" + mszAppGitName;
 | 
			
		||||
        } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Sun May 11 19:36:35 GMT 2025
 | 
			
		||||
stageCount=7
 | 
			
		||||
#Tue Jun 03 13:40:01 HKT 2025
 | 
			
		||||
stageCount=5
 | 
			
		||||
libraryProject=libappbase
 | 
			
		||||
baseVersion=15.7
 | 
			
		||||
publishVersion=15.7.6
 | 
			
		||||
buildCount=15
 | 
			
		||||
baseBetaVersion=15.7.7
 | 
			
		||||
baseVersion=15.8
 | 
			
		||||
publishVersion=15.8.4
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=15.8.5
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ public class GlobalApplication extends Application {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WinBoLLActivityManager getWinBoLLActivityManager() {
 | 
			
		||||
        return WinBoLLActivityManager.getInstance(_GlobalApplication);
 | 
			
		||||
        return WinBoLLActivityManager.getInstance();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,9 @@ import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class WinBoLLActivityManager {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "IWinBoLLActivityManager";
 | 
			
		||||
    public static final String TAG = "WinBoLLActivityManager";
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_TAG = "EXTRA_TAG";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public enum WinBoLLUI_TYPE { Aplication, Service }
 | 
			
		||||
@@ -39,14 +41,14 @@ public class WinBoLLActivityManager {
 | 
			
		||||
    public static WinBoLLUI_TYPE getWinBoLLUI_TYPE() {
 | 
			
		||||
        return _WinBoLLUI_TYPE;
 | 
			
		||||
    }
 | 
			
		||||
    WinBoLLActivityManager(Context context) {
 | 
			
		||||
        mContext = context;
 | 
			
		||||
    WinBoLLActivityManager() {
 | 
			
		||||
        mContext = GlobalApplication.getInstance();
 | 
			
		||||
        mActivityListMap = new HashMap<String, IWinBoLLActivity>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static synchronized WinBoLLActivityManager getInstance(Context context) {
 | 
			
		||||
    public static synchronized WinBoLLActivityManager getInstance() {
 | 
			
		||||
        if (_mIWinBoLLActivityManager == null) {
 | 
			
		||||
            _mIWinBoLLActivityManager = new WinBoLLActivityManager(context);
 | 
			
		||||
            _mIWinBoLLActivityManager = new WinBoLLActivityManager();
 | 
			
		||||
        }
 | 
			
		||||
        return _mIWinBoLLActivityManager;
 | 
			
		||||
    }
 | 
			
		||||
@@ -55,7 +57,7 @@ public class WinBoLLActivityManager {
 | 
			
		||||
     * 把Activity添加到管理中
 | 
			
		||||
     */
 | 
			
		||||
    public <T extends IWinBoLLActivity> void add(T activity) {
 | 
			
		||||
        if (isActive(activity.getTag())) {
 | 
			
		||||
        if (isActivityActive(activity.getTag())) {
 | 
			
		||||
            LogUtils.d(TAG, String.format("add(...) %s is active.", activity.getTag()));
 | 
			
		||||
        } else {
 | 
			
		||||
            mActivityListMap.put(activity.getTag(), activity);
 | 
			
		||||
@@ -70,104 +72,107 @@ public class WinBoLLActivityManager {
 | 
			
		||||
    // intent.putExtra 函数 "tag" 参数为 activity.getTag()
 | 
			
		||||
    //
 | 
			
		||||
    public <T extends IWinBoLLActivity> void startWinBoLLActivity(Context context, Class<T> clazz) {
 | 
			
		||||
        try {
 | 
			
		||||
            // 如果窗口已存在就重启窗口
 | 
			
		||||
            String tag = clazz.newInstance().getTag();
 | 
			
		||||
            if (isActive(tag)) {
 | 
			
		||||
                resumeActivity(context, tag);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        // 如果窗口已存在就重启窗口
 | 
			
		||||
        if (!resumeActivity(clazz)) {
 | 
			
		||||
            // 新建一个任务窗口
 | 
			
		||||
            Intent intent = new Intent(context, clazz);
 | 
			
		||||
            //打开多任务窗口 flags
 | 
			
		||||
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
 | 
			
		||||
            intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
 | 
			
		||||
            intent.putExtra("tag", tag);
 | 
			
		||||
            mContext.startActivity(intent);
 | 
			
		||||
        } catch (InstantiationException | IllegalAccessException e) {
 | 
			
		||||
            LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
            //intent.putExtra("tag", tag);
 | 
			
		||||
            context.startActivity(intent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public <T extends IWinBoLLActivity> void startWinBoLLActivity(Context context, Intent intent, Class<T> clazz) {
 | 
			
		||||
        try {
 | 
			
		||||
            // 如果窗口已存在就重启窗口
 | 
			
		||||
            String tag = clazz.newInstance().getTag();
 | 
			
		||||
            if (isActive(tag)) {
 | 
			
		||||
                resumeActivity(context, tag);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        // 如果窗口已存在就重启窗口
 | 
			
		||||
        if (!resumeActivity(clazz)) {
 | 
			
		||||
            // 新建一个任务窗口
 | 
			
		||||
            //Intent intent = new Intent(context, clazz);
 | 
			
		||||
            //打开多任务窗口 flags
 | 
			
		||||
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
 | 
			
		||||
            intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
 | 
			
		||||
            intent.putExtra("tag", tag);
 | 
			
		||||
            mContext.startActivity(intent);
 | 
			
		||||
            //intent.putExtra("tag", tag);
 | 
			
		||||
            context.startActivity(intent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public <T extends IWinBoLLActivity> void startLogActivity(Context context) {
 | 
			
		||||
        // 如果窗口已存在就重启窗口
 | 
			
		||||
        //if (!resumeActivity(LogActivity.class)) {
 | 
			
		||||
        // 新建一个任务窗口
 | 
			
		||||
        Intent intent = new Intent(context, LogActivity.class);
 | 
			
		||||
        //打开多任务窗口 flags
 | 
			
		||||
        // Define the bounds.
 | 
			
		||||
//        Rect bounds = new Rect(0, 0, 800, 200);
 | 
			
		||||
//        // Set the bounds as an activity option.
 | 
			
		||||
//        ActivityOptions options = ActivityOptions.makeBasic();
 | 
			
		||||
//        options.setLaunchBounds(bounds);
 | 
			
		||||
        intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
 | 
			
		||||
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
 | 
			
		||||
        intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
 | 
			
		||||
 | 
			
		||||
        //intent.putExtra(EXTRA_TAG, tag);
 | 
			
		||||
 | 
			
		||||
        //context.startActivity(intent, options.toBundle());
 | 
			
		||||
        context.startActivity(intent);
 | 
			
		||||
        //}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // 判断 tag 绑定的 Activity 是否已经创建
 | 
			
		||||
    //
 | 
			
		||||
    public boolean isActivityActive(String tag) {
 | 
			
		||||
        return mActivityListMap.get(tag) != null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Activity getActivityByTag(String tag) {
 | 
			
		||||
        return (mActivityListMap.get(tag) == null) ?null: mActivityListMap.get(tag).getActivity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
 | 
			
		||||
    //
 | 
			
		||||
    public <T extends IWinBoLLActivity> boolean resumeActivity(Class<T> clazz) {
 | 
			
		||||
        try {
 | 
			
		||||
            Activity activity = getActivityByTag(clazz.newInstance().getTag());
 | 
			
		||||
            if (activity != null) {
 | 
			
		||||
                return resumeActivity(activity);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (InstantiationException | IllegalAccessException e) {
 | 
			
		||||
            LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 判断 tag绑定的 MyActivity是否存在
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isActive(String tag) {
 | 
			
		||||
        //printAvtivityListInfo();
 | 
			
		||||
        IWinBoLLActivity iWinBoLLActivity = getIWinBoLLActivity(tag);
 | 
			
		||||
        if (iWinBoLLActivity != null) {
 | 
			
		||||
            Activity activity = iWinBoLLActivity.getActivity();
 | 
			
		||||
            if (activity != null) {
 | 
			
		||||
                LogUtils.d(TAG, "isActive(...) activity != null tag " + tag);
 | 
			
		||||
                //ToastUtils.show("activity != null tag " + tag);
 | 
			
		||||
                //判断是否为 BaseActivity,如果已经销毁,则移除
 | 
			
		||||
                if (activity.isFinishing() || activity.isDestroyed()) {
 | 
			
		||||
                    mActivityListMap.remove(iWinBoLLActivity.getTag());
 | 
			
		||||
                    //_mIWinBoLLActivityList.remove(activity);
 | 
			
		||||
                    LogUtils.d(TAG, String.format("isActive(...) remove activity.\ntag : %s", tag));
 | 
			
		||||
                    return false;
 | 
			
		||||
                } else {
 | 
			
		||||
                    LogUtils.d(TAG, String.format("isActive(...) activity is exist.\ntag : %s", tag));
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
    //
 | 
			
		||||
    // 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
 | 
			
		||||
    //
 | 
			
		||||
    public <T extends IWinBoLLActivity> boolean resumeActivity(String tag) {
 | 
			
		||||
        Activity activity = getActivityByTag(tag);
 | 
			
		||||
        if (activity != null) {
 | 
			
		||||
            return resumeActivity(activity);
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    IWinBoLLActivity getIWinBoLLActivity(String tag) {
 | 
			
		||||
        return mActivityListMap.get(tag);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
 | 
			
		||||
     */
 | 
			
		||||
    public <T extends IWinBoLLActivity> void resumeActivity(Context context, String tag) {
 | 
			
		||||
        LogUtils.d(TAG, "resumeActivty");
 | 
			
		||||
        T iWinBoLLActivity = (T)getIWinBoLLActivity(tag);
 | 
			
		||||
        LogUtils.d(TAG, "activity " + iWinBoLLActivity.getTag());
 | 
			
		||||
        if (iWinBoLLActivity != null && iWinBoLLActivity.getActivity() != null && !iWinBoLLActivity.getActivity().isFinishing() && !iWinBoLLActivity.getActivity().isDestroyed()) {
 | 
			
		||||
            resumeActivity(context, iWinBoLLActivity);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
 | 
			
		||||
     */
 | 
			
		||||
    public <T extends IWinBoLLActivity> void resumeActivity(Context context, T activity) {
 | 
			
		||||
        ActivityManager am = (ActivityManager) activity.getActivity().getSystemService(Context.ACTIVITY_SERVICE);
 | 
			
		||||
    //
 | 
			
		||||
    // 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
 | 
			
		||||
    //
 | 
			
		||||
    public <T extends IWinBoLLActivity> boolean resumeActivity(Activity activity) {
 | 
			
		||||
        ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
 | 
			
		||||
        //返回启动它的根任务(home 或者 MainActivity)
 | 
			
		||||
        Intent intent = new Intent(context, activity.getClass());
 | 
			
		||||
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
 | 
			
		||||
        stackBuilder.addNextIntentWithParentStack(intent);
 | 
			
		||||
        stackBuilder.startActivities();
 | 
			
		||||
        //moveTaskToFront(YourTaskId, 0);
 | 
			
		||||
        LogUtils.d(TAG, "am.moveTaskToFront");
 | 
			
		||||
        //ToastUtils.show("resumeActivity am.moveTaskToFront");
 | 
			
		||||
        am.moveTaskToFront(activity.getActivity().getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);
 | 
			
		||||
        //Intent intent = new Intent(mContext, activity.getClass());
 | 
			
		||||
        //TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
 | 
			
		||||
        //stackBuilder.addNextIntentWithParentStack(intent);
 | 
			
		||||
        //stackBuilder.startActivities();
 | 
			
		||||
        am.moveTaskToFront(activity.getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);
 | 
			
		||||
        //ToastUtils.show("resumeActivity");
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -219,10 +224,10 @@ public class WinBoLLActivityManager {
 | 
			
		||||
                // ★:0 1 2 [3] 4 >> 2
 | 
			
		||||
                // ★:0 1 2 3 [4] >> 3
 | 
			
		||||
                // ★:[0] >> 直接关闭当前窗口
 | 
			
		||||
                IWinBoLLActivity preActivity = getPreActivity(iWinBoLLActivity);
 | 
			
		||||
                Activity preActivity = getPreActivity(iWinBoLLActivity);
 | 
			
		||||
                iWinBoLLActivity.getActivity().finish();
 | 
			
		||||
                if (preActivity != null) {
 | 
			
		||||
                    resumeActivity(mContext, preActivity);
 | 
			
		||||
                    resumeActivity(preActivity);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +236,7 @@ public class WinBoLLActivityManager {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    IWinBoLLActivity getPreActivity(IWinBoLLActivity iWinBoLLActivity) {
 | 
			
		||||
    Activity getPreActivity(IWinBoLLActivity iWinBoLLActivity) {
 | 
			
		||||
        try {
 | 
			
		||||
            boolean bingo = false;
 | 
			
		||||
            IWinBoLLActivity preIWinBoLLActivity = null;
 | 
			
		||||
@@ -245,7 +250,7 @@ public class WinBoLLActivityManager {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (bingo) {
 | 
			
		||||
                return preIWinBoLLActivity;
 | 
			
		||||
                return preIWinBoLLActivity.getActivity();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/item_minimal"
 | 
			
		||||
        android:title="MINIMAL"
 | 
			
		||||
        android:icon="@drawable/ic_winboll_point"/>
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/item_about"
 | 
			
		||||
        android:title="ABOUT"
 | 
			
		||||
        android:icon="@drawable/ic_winboll_logo"/>
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/item_help"
 | 
			
		||||
        android:title="HELP"
 | 
			
		||||
        android:icon="@drawable/ic_winboll_help"/>
 | 
			
		||||
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/item_log"
 | 
			
		||||
        android:title="LOG"
 | 
			
		||||
        android:icon="@drawable/ic_winboll_log"/>
 | 
			
		||||
</menu>
 | 
			
		||||
@@ -21,7 +21,7 @@ android {
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    api fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    api 'cc.winboll.studio:libappbase:15.7.6'
 | 
			
		||||
    api 'cc.winboll.studio:libappbase:15.8.2'
 | 
			
		||||
    
 | 
			
		||||
    // 二维码类库
 | 
			
		||||
    api 'com.google.zxing:core:3.4.1'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Tue Apr 29 15:03:54 HKT 2025
 | 
			
		||||
#Tue Jun 03 15:05:42 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
 | 
			
		||||
 
 | 
			
		||||
@@ -18,18 +18,18 @@ def genVersionName(def versionName){
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
android {
 | 
			
		||||
    compileSdkVersion 30
 | 
			
		||||
    buildToolsVersion "30.0.3"
 | 
			
		||||
    compileSdkVersion 32
 | 
			
		||||
    buildToolsVersion "32.0.0"
 | 
			
		||||
 | 
			
		||||
    defaultConfig {
 | 
			
		||||
        applicationId "cc.winboll.studio.mymessagemanager"
 | 
			
		||||
        minSdkVersion 26
 | 
			
		||||
        targetSdkVersion 29
 | 
			
		||||
        minSdkVersion 24
 | 
			
		||||
        targetSdkVersion 30
 | 
			
		||||
        versionCode 8
 | 
			
		||||
        // versionName 更新后需要手动设置 
 | 
			
		||||
        // .winboll/winbollBuildProps.properties 文件的 stageCount=0
 | 
			
		||||
        // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
 | 
			
		||||
        versionName "4.1" 
 | 
			
		||||
        versionName "15.2" 
 | 
			
		||||
        if(true) {
 | 
			
		||||
            versionName = genVersionName("${versionName}")
 | 
			
		||||
        }
 | 
			
		||||
@@ -44,26 +44,27 @@ android {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
	api 'cc.winboll.studio:winboll-shared:1.6.4'
 | 
			
		||||
    api 'io.github.medyo:android-about-page:2.0.0'
 | 
			
		||||
    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'
 | 
			
		||||
    
 | 
			
		||||
	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'
 | 
			
		||||
    
 | 
			
		||||
    // 权限请求框架:https://github.com/getActivity/XXPermissions
 | 
			
		||||
    api 'com.github.getActivity:XXPermissions:18.63'
 | 
			
		||||
    api 'com.baoyz.pullrefreshlayout:library:1.2.0'
 | 
			
		||||
    
 | 
			
		||||
    api 'androidx.appcompat:appcompat:1.0.0'
 | 
			
		||||
    api 'androidx.fragment:fragment:1.0.0'
 | 
			
		||||
    // 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'
 | 
			
		||||
    api 'com.google.android.material:material:1.0.0'
 | 
			
		||||
    
 | 
			
		||||
    api 'cc.winboll.studio:libaes:7.6.0'
 | 
			
		||||
    
 | 
			
		||||
    api fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Tue Feb 25 10:52:41 GMT 2025
 | 
			
		||||
stageCount=14
 | 
			
		||||
#Tue May 20 20:39:06 HKT 2025
 | 
			
		||||
stageCount=6
 | 
			
		||||
libraryProject=
 | 
			
		||||
baseVersion=4.1
 | 
			
		||||
publishVersion=4.1.13
 | 
			
		||||
buildCount=5
 | 
			
		||||
baseBetaVersion=4.1.14
 | 
			
		||||
baseVersion=15.2
 | 
			
		||||
publishVersion=15.2.5
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=15.2.6
 | 
			
		||||
 
 | 
			
		||||
@@ -53,30 +53,28 @@
 | 
			
		||||
    </queries>
 | 
			
		||||
 | 
			
		||||
    <application
 | 
			
		||||
        android:name=".GlobalApplication"
 | 
			
		||||
        android:name=".App"
 | 
			
		||||
        android:allowBackup="true"
 | 
			
		||||
        android:icon="@drawable/ic_launcher"
 | 
			
		||||
        android:roundIcon="@drawable/ic_launcher"
 | 
			
		||||
        android:label="@string/app_name"
 | 
			
		||||
        android:theme="@style/WinBoll.SupportThemeNoActionBar"
 | 
			
		||||
        android:theme="@style/MyAppTheme"
 | 
			
		||||
        android:persistent="true"
 | 
			
		||||
        android:resizeableActivity="true"
 | 
			
		||||
        android:supportsRtl="true"
 | 
			
		||||
        android:requestLegacyExternalStorage="true">
 | 
			
		||||
        android:requestLegacyExternalStorage="true"
 | 
			
		||||
        android:networkSecurityConfig="@xml/network_security_config">
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.SMSActivity"
 | 
			
		||||
            android:process=":sms"/>
 | 
			
		||||
            android:name=".activitys.SMSActivity"/>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.SMSReceiveRuleActivity"
 | 
			
		||||
            android:process=":smsars">
 | 
			
		||||
            android:name=".activitys.SMSReceiveRuleActivity">
 | 
			
		||||
 | 
			
		||||
        </activity>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.SharedJSONReceiveActivity"
 | 
			
		||||
            android:process=":smssjr"
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
@@ -98,17 +96,14 @@
 | 
			
		||||
        </activity>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.TTSPlayRuleActivity"
 | 
			
		||||
            android:process=":ttsrule"/>
 | 
			
		||||
            android:name=".activitys.TTSPlayRuleActivity"/>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.AboutActivity"
 | 
			
		||||
            android:process=":about"/>
 | 
			
		||||
            android:name=".activitys.AboutActivity"/>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.MainActivity"
 | 
			
		||||
            android:exported="true"
 | 
			
		||||
            android:process=":main">
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
 | 
			
		||||
@@ -122,8 +117,7 @@
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activitys.ComposeSMSActivity"
 | 
			
		||||
            android:exported="true"
 | 
			
		||||
            android:process=":csms">
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
 | 
			
		||||
@@ -226,6 +220,8 @@
 | 
			
		||||
 | 
			
		||||
        <activity android:name="cc.winboll.studio.mymessagemanager.activitys.SMSRecycleActivity"/>
 | 
			
		||||
 | 
			
		||||
        <activity android:name="cc.winboll.studio.mymessagemanager.unittest.UnitTestActivity"/>
 | 
			
		||||
 | 
			
		||||
    </application>
 | 
			
		||||
 | 
			
		||||
</manifest>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,17 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen<zhangsken@188.com>
 | 
			
		||||
 * @Author ZhanGSKen@QQ.COM
 | 
			
		||||
 * @Date 2023/07/24 01:46:59
 | 
			
		||||
 * @Describe 全局应用类
 | 
			
		||||
 */
 | 
			
		||||
import android.view.Gravity;
 | 
			
		||||
import cc.winboll.studio.libappbase.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.shared.app.WinBollApplication;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
public class GlobalApplication extends WinBollApplication {
 | 
			
		||||
public class App extends GlobalApplication {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "GlobalApplication";
 | 
			
		||||
 | 
			
		||||
@@ -30,7 +29,6 @@ public class GlobalApplication extends WinBollApplication {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate() {
 | 
			
		||||
        super.onCreate();
 | 
			
		||||
        //setIsDebug(cc.winboll.studio.mymessagemanager.BuildConfig.DEBUG);
 | 
			
		||||
 | 
			
		||||
        // 初始化 Toast 框架
 | 
			
		||||
        ToastUtils.init(this);
 | 
			
		||||
@@ -45,8 +43,4 @@ public class GlobalApplication extends WinBollApplication {
 | 
			
		||||
        _mszConfigUtilPath = _mszAppExternalFilesDir + File.separator + _mszConfigUtilFileName;
 | 
			
		||||
        _mszSMSReceiveRuleUtilPath = _mszAppExternalFilesDir + File.separator + _mszSMSReceiveRuleUtilFileName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void showApplicationMessage(String szMessage) {
 | 
			
		||||
        LogUtils.i(TAG, szMessage);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,72 +3,89 @@ package cc.winboll.studio.mymessagemanager.activitys;
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen<zhangsken@188.com>
 | 
			
		||||
 * @Date 2024/07/14 13:20:33
 | 
			
		||||
 * @Describe 应用关于对话窗口
 | 
			
		||||
 * @Describe 应用介绍窗口
 | 
			
		||||
 */
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.shared.app.WinBollActivity;
 | 
			
		||||
import cc.winboll.studio.shared.app.WinBollActivityManager;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.libaes.winboll.APPInfo;
 | 
			
		||||
import cc.winboll.studio.libaes.winboll.AboutView;
 | 
			
		||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.App;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
 | 
			
		||||
final public class AboutActivity extends WinBollActivity {
 | 
			
		||||
public class AboutActivity extends WinBollActivity implements IWinBoLLActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "AboutActivity";
 | 
			
		||||
 | 
			
		||||
    Context mContext;
 | 
			
		||||
    
 | 
			
		||||
    Toolbar mToolbar;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Activity getActivity() {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getTag() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected boolean isEnableDisplayHomeAsUp() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        mContext = this;
 | 
			
		||||
        setContentView(R.layout.activity_about);
 | 
			
		||||
        mContext = getApplicationContext();
 | 
			
		||||
 | 
			
		||||
        mToolbar = findViewById(R.id.toolbar);
 | 
			
		||||
        setSupportActionBar(mToolbar);
 | 
			
		||||
        mToolbar.setSubtitle(TAG);
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
 | 
			
		||||
        AboutView aboutView = CreateAboutView();
 | 
			
		||||
        // 在 Activity 的 onCreate 或其他生命周期方法中调用
 | 
			
		||||
//        LinearLayout layout = new LinearLayout(this);
 | 
			
		||||
//        layout.setOrientation(LinearLayout.VERTICAL);
 | 
			
		||||
//        // 创建布局参数(宽度和高度)
 | 
			
		||||
//        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
 | 
			
		||||
//            ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
//            ViewGroup.LayoutParams.MATCH_PARENT
 | 
			
		||||
//        );
 | 
			
		||||
//        addContentView(aboutView, params);
 | 
			
		||||
 | 
			
		||||
        LinearLayout layout = findViewById(R.id.aboutviewroot_ll);
 | 
			
		||||
        // 创建布局参数(宽度和高度)
 | 
			
		||||
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
 | 
			
		||||
            ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
            ViewGroup.LayoutParams.MATCH_PARENT
 | 
			
		||||
        );
 | 
			
		||||
        layout.addView(aboutView, params);
 | 
			
		||||
 | 
			
		||||
        App.getWinBoLLActivityManager().add(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onPostCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onPostCreate(savedInstanceState);
 | 
			
		||||
        setTitle(mContext.getString(R.string.text_about) + mContext.getString(R.string.app_name));
 | 
			
		||||
    protected void onDestroy() {
 | 
			
		||||
        super.onDestroy();
 | 
			
		||||
        App.getWinBoLLActivityManager().registeRemove(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected boolean isAddWinBollToolBar() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected Toolbar initToolBar() {
 | 
			
		||||
        return findViewById(R.id.activityaboutASupportToolbar1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCreateOptionsMenu(Menu menu) {
 | 
			
		||||
        getMenuInflater().inflate(R.menu.toolbar_about, menu);
 | 
			
		||||
        return super.onCreateOptionsMenu(menu);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(MenuItem item) {
 | 
			
		||||
        /*if (item.getItemId() == R.id.item_help) {
 | 
			
		||||
            ToastUtils.show("R.id.item_help");
 | 
			
		||||
        } else */if (item.getItemId() == android.R.id.home) {
 | 
			
		||||
            WinBollActivityManager.getInstance(getApplicationContext()).finish(this);
 | 
			
		||||
        }
 | 
			
		||||
        return super.onOptionsItemSelected(item);
 | 
			
		||||
    public AboutView CreateAboutView() {
 | 
			
		||||
        String szBranchName = "mymessagemanager";
 | 
			
		||||
        APPInfo appInfo = new APPInfo();
 | 
			
		||||
        appInfo.setAppName(getString(R.string.app_name));
 | 
			
		||||
        appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
 | 
			
		||||
        appInfo.setAppDescription(getString(R.string.app_description));
 | 
			
		||||
        appInfo.setAppGitName("APP");
 | 
			
		||||
        appInfo.setAppGitOwner("Studio");
 | 
			
		||||
        appInfo.setAppGitAPPBranch(szBranchName);
 | 
			
		||||
        appInfo.setAppGitAPPSubProjectFolder(szBranchName);
 | 
			
		||||
        appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=MyMessageManager");
 | 
			
		||||
        appInfo.setAppAPKName("MyMessageManager");
 | 
			
		||||
        appInfo.setAppAPKFolderName("MyMessageManager");
 | 
			
		||||
        return new AboutView(mContext, appInfo);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,8 @@ import cc.winboll.studio.libaes.views.AToolbar;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.PermissionUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
 | 
			
		||||
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
 | 
			
		||||
 | 
			
		||||
public class AppSettingsActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
@@ -96,4 +98,18 @@ public class AppSettingsActivity extends BaseActivity {
 | 
			
		||||
            Toast.makeText(getApplication(), "应用已获得所需权限。", Toast.LENGTH_SHORT).show();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void onCleanOldChannels(View view) {
 | 
			
		||||
        YesNoAlertDialog.show(this, "通知设置清理", "是否清理旧的通知设置?", new YesNoAlertDialog.OnDialogResultListener(){
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onNo() {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onYes() {
 | 
			
		||||
                    NotificationHelper notificationHelper = new NotificationHelper(AppSettingsActivity.this);
 | 
			
		||||
                    notificationHelper.cleanOldChannels();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.activitys;
 | 
			
		||||
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.os.Message;
 | 
			
		||||
@@ -8,9 +7,8 @@ import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import cc.winboll.studio.libaes.beans.AESThemeBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
 | 
			
		||||
abstract public class BaseActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
@@ -103,7 +101,7 @@ abstract public class BaseActivity extends AppCompatActivity {
 | 
			
		||||
            AESThemeUtil.saveThemeStyleID(this, R.style.MyTaoAESTheme);
 | 
			
		||||
            recreate();
 | 
			
		||||
        } else if (R.id.item_defaulttheme == item.getItemId()) {
 | 
			
		||||
            AESThemeUtil.saveThemeStyleID(this, R.style.MyDefaultAESTheme);
 | 
			
		||||
            AESThemeUtil.saveThemeStyleID(this, R.style.MyAppTheme);
 | 
			
		||||
            recreate();
 | 
			
		||||
        }
 | 
			
		||||
        //ToastUtils.show("nThemeStyleID " + Integer.toString(nThemeStyleID));
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import android.widget.ListView;
 | 
			
		||||
import android.widget.RelativeLayout;
 | 
			
		||||
import android.widget.SimpleAdapter;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
import android.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,28 +10,25 @@ import android.view.MenuItem;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.Button;
 | 
			
		||||
import android.widget.ScrollView;
 | 
			
		||||
import cc.winboll.studio.libaes.views.AToolbar;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogView;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.App;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.BuildConfig;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.MainActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.adapters.PhoneArrayAdapter;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.services.MainService;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.unittest.UnitTestActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AppGoToSettingsUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.PermissionUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.ThemeUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.ViewUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.views.ConfirmSwitchView;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.views.PhoneListViewForScrollView;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogView;
 | 
			
		||||
import com.baoyz.widget.PullRefreshLayout;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
 | 
			
		||||
import cc.winboll.studio.libaes.views.ASupportToolbar;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
 | 
			
		||||
public class MainActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +42,7 @@ public class MainActivity extends BaseActivity {
 | 
			
		||||
    public static final int MY_PERMISSIONS_REQUEST = 0;
 | 
			
		||||
 | 
			
		||||
    static MainActivity _mMainActivity;
 | 
			
		||||
    LogView mLogView;
 | 
			
		||||
    //LogView mLogView;
 | 
			
		||||
    AppConfigUtil mAppConfigUtil;
 | 
			
		||||
    ConfirmSwitchView msvEnableService;
 | 
			
		||||
    ConfirmSwitchView msvOnlyReceiveContacts;
 | 
			
		||||
@@ -121,8 +118,8 @@ public class MainActivity extends BaseActivity {
 | 
			
		||||
    //
 | 
			
		||||
    void initView() {
 | 
			
		||||
        // 设置调试日志
 | 
			
		||||
        mLogView = findViewById(R.id.logview);
 | 
			
		||||
        mLogView.start();
 | 
			
		||||
//        mLogView = findViewById(R.id.logview);
 | 
			
		||||
//        mLogView.start();
 | 
			
		||||
 | 
			
		||||
        // 设置消息处理函数
 | 
			
		||||
        setOnActivityMessageReceived(mIOnActivityMessageReceived);
 | 
			
		||||
@@ -131,12 +128,7 @@ public class MainActivity extends BaseActivity {
 | 
			
		||||
        mToolbar = findViewById(R.id.activitymainASupportToolbar1);
 | 
			
		||||
        mToolbar.setSubtitle(getString(R.string.activity_name_main));
 | 
			
		||||
        setSupportActionBar(mToolbar);
 | 
			
		||||
 | 
			
		||||
        // 创建通知频道
 | 
			
		||||
        NotificationUtil nu = new NotificationUtil();
 | 
			
		||||
        nu.createServiceNotificationChannel(MainActivity.this);
 | 
			
		||||
        nu.createSMSNotificationChannel(MainActivity.this);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        boolean isEnableService = mAppConfigUtil.mAppConfigBean.isEnableService();
 | 
			
		||||
        msvEnableService = findViewById(R.id.activitymainSwitchView1);
 | 
			
		||||
        msvEnableService.setChecked(isEnableService);
 | 
			
		||||
@@ -270,7 +262,7 @@ public class MainActivity extends BaseActivity {
 | 
			
		||||
    protected void onResume() {
 | 
			
		||||
        super.onResume();
 | 
			
		||||
        reloadSMS();
 | 
			
		||||
        mLogView.start();
 | 
			
		||||
        //mLogView.start();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -303,27 +295,33 @@ public class MainActivity extends BaseActivity {
 | 
			
		||||
		int nItemId = item.getItemId();
 | 
			
		||||
        if (nItemId == R.id.app_ttsrule) {
 | 
			
		||||
			Intent i = new Intent(MainActivity.this, TTSPlayRuleActivity.class);
 | 
			
		||||
			i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
			startActivity(i);
 | 
			
		||||
		} else if (nItemId == R.id.app_smsrule) {
 | 
			
		||||
			Intent i = new Intent(MainActivity.this, SMSReceiveRuleActivity.class);
 | 
			
		||||
			i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
			startActivity(i);
 | 
			
		||||
		} else if (nItemId == R.id.app_appsettings) {
 | 
			
		||||
            Intent i = new Intent(MainActivity.this, AppSettingsActivity.class);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            startActivity(i);
 | 
			
		||||
		} else if (nItemId ==  R.id.app_crashtest) {
 | 
			
		||||
		} else if (nItemId ==  R.id.app_log) {
 | 
			
		||||
            //App.getWinBoLLActivityManager().startLogActivity(this);
 | 
			
		||||
        } else if (nItemId ==  R.id.app_unittest) {
 | 
			
		||||
            Intent i = new Intent(MainActivity.this, UnitTestActivity.class);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
			startActivity(i);
 | 
			
		||||
        } else if (nItemId ==  R.id.app_crashtest) {
 | 
			
		||||
            for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
 | 
			
		||||
                getString(i);
 | 
			
		||||
            }
 | 
			
		||||
        } else if (nItemId ==  R.id.app_about) {
 | 
			
		||||
            Intent i = new Intent(MainActivity.this, AboutActivity.class);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            startActivity(i);
 | 
			
		||||
        } else if (nItemId ==  R.id.app_smsrecycle) {
 | 
			
		||||
            Intent i = new Intent(MainActivity.this, SMSRecycleActivity.class);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
            startActivity(i);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 
 | 
			
		||||
@@ -18,10 +18,10 @@ import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.adapters.SMSArrayAdapter;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.ViewUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.views.SMSListViewForScrollView;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.views.SMSView;
 | 
			
		||||
import java.lang.ref.WeakReference;
 | 
			
		||||
 | 
			
		||||
public class SMSActivity extends BaseActivity {
 | 
			
		||||
@@ -102,7 +102,7 @@ public class SMSActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
        // 初始化标题栏
 | 
			
		||||
        mToolbar = findViewById(R.id.activitysmsASupportToolbar1);
 | 
			
		||||
        mToolbar.setSubtitle(getString(R.string.activity_name_smsinphone) + " < Phone : " + mszPhoneTo + " >");
 | 
			
		||||
        mToolbar.setSubtitle(getString(R.string.activity_name_smsinphone) + " < Phone : " + AddressUtils.getFormattedAddress(mszPhoneTo) + " >");
 | 
			
		||||
        setActionBar(mToolbar);
 | 
			
		||||
 | 
			
		||||
        // 初始化滚动窗口
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ import android.widget.Toast;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.App;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSReceiveRuleActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.adapters.SMSAcceptRuleArrayAdapter;
 | 
			
		||||
@@ -114,7 +114,7 @@ public class SMSReceiveRuleActivity extends BaseActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void initSMSAcceptRuleBeanAdd() {
 | 
			
		||||
        mSMSAcceptRuleBeanAdd = new SMSAcceptRuleBean(GlobalApplication.USER_ID, "", true, SMSAcceptRuleBean.RuleType.REFUSE, true);
 | 
			
		||||
        mSMSAcceptRuleBeanAdd = new SMSAcceptRuleBean(App.USER_ID, "", true, SMSAcceptRuleBean.RuleType.REFUSE, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -8,16 +8,16 @@ package cc.winboll.studio.mymessagemanager.activitys;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSRecycleActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.adapters.SMSRecycleAdapter;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
 | 
			
		||||
import cc.winboll.studio.shared.view.YesNoAlertDialog;
 | 
			
		||||
import com.baoyz.widget.PullRefreshLayout;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
 | 
			
		||||
public class SMSRecycleActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,60 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.activitys;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/03/31 01:31:17
 | 
			
		||||
 * @Describe 应用活动窗口基类
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import cc.winboll.studio.libaes.beans.AESThemeBean;
 | 
			
		||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
 | 
			
		||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
 | 
			
		||||
 | 
			
		||||
public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "WinBollActivity";
 | 
			
		||||
 | 
			
		||||
    protected volatile AESThemeBean.ThemeType mThemeType;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Activity getActivity() {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getTag() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        mThemeType = getThemeType();
 | 
			
		||||
        setThemeStyle();
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    AESThemeBean.ThemeType getThemeType() {
 | 
			
		||||
        /*SharedPreferences sharedPreferences = getSharedPreferences(
 | 
			
		||||
         SHAREDPREFERENCES_NAME, MODE_PRIVATE);
 | 
			
		||||
         return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))];
 | 
			
		||||
         */
 | 
			
		||||
        return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void setThemeStyle() {
 | 
			
		||||
        //setTheme(AESThemeBean.getThemeStyle(getThemeType()));
 | 
			
		||||
        setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(MenuItem item) {
 | 
			
		||||
        if(item.getItemId() == android.R.id.home) {
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return super.onOptionsItemSelected(item);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -9,13 +9,14 @@ import android.view.ViewGroup;
 | 
			
		||||
import android.widget.BaseAdapter;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.PhoneBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.PhoneUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@@ -74,9 +75,9 @@ public class PhoneArrayAdapter extends BaseAdapter {
 | 
			
		||||
            viewHolder = (ViewHolder) convertView.getTag();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		String szAddress = ((SMSBean)getItem(position)).getAddress();
 | 
			
		||||
		final String szAddress = ((SMSBean)getItem(position)).getAddress();
 | 
			
		||||
 | 
			
		||||
		viewHolder.tvAddress.setText(szAddress);
 | 
			
		||||
		viewHolder.tvAddress.setText(AddressUtils.getFormattedAddress(szAddress));
 | 
			
		||||
		viewHolder.tvName.setText(getName(szAddress));
 | 
			
		||||
 | 
			
		||||
        //Drawable drawableFrame = AppCompatResources.getDrawable(mContext, R.drawable.bg_frame);
 | 
			
		||||
@@ -87,7 +88,7 @@ public class PhoneArrayAdapter extends BaseAdapter {
 | 
			
		||||
 | 
			
		||||
                    //Toast.makeText(mContext, tv.getText(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
                    Intent intent = new Intent(mContext, SMSActivity.class);
 | 
			
		||||
                    intent.putExtra(SMSActivity.EXTRA_PHONE, viewHolder.tvAddress.getText());
 | 
			
		||||
                    intent.putExtra(SMSActivity.EXTRA_PHONE, szAddress);
 | 
			
		||||
                    mContext.startActivity(intent);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
 | 
			
		||||
@@ -28,6 +27,7 @@ import cc.winboll.studio.mymessagemanager.views.SMSView;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
 | 
			
		||||
 | 
			
		||||
public class SMSArrayAdapter extends BaseAdapter {
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +54,8 @@ public class SMSArrayAdapter extends BaseAdapter {
 | 
			
		||||
 | 
			
		||||
    public void cancelMessageNotification() {
 | 
			
		||||
        for (SMSBean bean : mData) {
 | 
			
		||||
            NotificationUtil.cancelNotification(mContext, bean.getId());
 | 
			
		||||
            NotificationHelper notificationHelper = new NotificationHelper(mContext);
 | 
			
		||||
            notificationHelper.cancelNotification(bean.getId());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@ import cc.winboll.studio.mymessagemanager.views.DateAgoTextView;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.views.SMSView;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
 | 
			
		||||
 | 
			
		||||
public class SMSRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
 | 
			
		||||
@@ -154,7 +155,7 @@ public class SMSRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 | 
			
		||||
        final SMSRecycleBean item = mDataList.get(position);
 | 
			
		||||
        if (holder.getItemViewType() == 0) {
 | 
			
		||||
            SimpleViewHolder viewHolder = (SimpleViewHolder) holder;
 | 
			
		||||
            viewHolder.mtvAddress.setText(item.getAddress());
 | 
			
		||||
            viewHolder.mtvAddress.setText(AddressUtils.getFormattedAddress(item.getAddress()));
 | 
			
		||||
            viewHolder.mbtnViewBody.setOnClickListener(new View.OnClickListener(){
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onClick(View v) {
 | 
			
		||||
@@ -179,7 +180,7 @@ public class SMSRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 | 
			
		||||
                viewHolder.mvRight.setVisibility(View.GONE);
 | 
			
		||||
                viewHolder.mSMSView.setSMSType(SMSView.SMSType.SEND);
 | 
			
		||||
            }
 | 
			
		||||
            viewHolder.mtvAddress.setText(item.getAddress());
 | 
			
		||||
            viewHolder.mtvAddress.setText(AddressUtils.getFormattedAddress(item.getAddress()));
 | 
			
		||||
            viewHolder.mdatvDeleteDate.setDate(item.getDeleteDate());
 | 
			
		||||
            viewHolder.mdatvDate.setDate(item.getDate());
 | 
			
		||||
            if(mAppConfigUtil.mAppConfigBean.isSMSRecycleProtectMode()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,7 @@ package cc.winboll.studio.mymessagemanager.beans;
 | 
			
		||||
 */
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.ThemeUtil;
 | 
			
		||||
import cc.winboll.studio.shared.app.BaseBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
public class AppConfigBean extends BaseBean {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ package cc.winboll.studio.mymessagemanager.beans;
 | 
			
		||||
 */
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.shared.app.BaseBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
public class SMSAcceptRuleBean extends BaseBean {
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ package cc.winboll.studio.mymessagemanager.beans;
 | 
			
		||||
import android.content.ContentValues;
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.shared.app.BaseBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.text.Collator;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ package cc.winboll.studio.mymessagemanager.beans;
 | 
			
		||||
 */
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.shared.app.BaseBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.text.Collator;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ package cc.winboll.studio.mymessagemanager.beans;
 | 
			
		||||
 */
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.shared.app.BaseBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
public class TTSPlayRuleBean extends BaseBean {
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,8 @@ package cc.winboll.studio.mymessagemanager.beans;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.FileUtil;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.StringReader;
 | 
			
		||||
import java.io.StringWriter;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,9 +10,9 @@ import android.content.BroadcastReceiver;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.services.MainService;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class MainReceiver extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,17 +4,17 @@ import android.content.BroadcastReceiver;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.App;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.PhoneUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.TTSPlayRuleUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.RegexPPiUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
 | 
			
		||||
 | 
			
		||||
public class SMSRecevier extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
@@ -36,34 +36,20 @@ public class SMSRecevier extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
        String szAction = intent.getAction();
 | 
			
		||||
        if (szAction.equals(ACTION_SMS_RECEIVED)) {
 | 
			
		||||
            //LogUtils.d(TAG, "ACTION_SMS_RECEIVED");
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_SMS_RECEIVED");
 | 
			
		||||
            String szSmsBody = SMSUtil.getSmsBody(intent);
 | 
			
		||||
            String szSmsAddress = SMSUtil.getSmsAddress(intent);
 | 
			
		||||
            PhoneUtil phoneUtil = new PhoneUtil(context);
 | 
			
		||||
            boolean isPhoneInContacts = phoneUtil.isPhoneInContacts(szSmsAddress);
 | 
			
		||||
            AppConfigUtil configUtil = AppConfigUtil.getInstance(context);
 | 
			
		||||
            boolean isOnlyReceiveContacts = configUtil.mAppConfigBean.isEnableOnlyReceiveContacts();
 | 
			
		||||
            boolean isEnableTTS = configUtil.mAppConfigBean.isEnableTTS();
 | 
			
		||||
            boolean isEnableTTSAnalyzeMode = configUtil.mAppConfigBean.isEnableTTSRuleMode();
 | 
			
		||||
            boolean isInSMSAcceptRule = SMSReceiveRuleUtil.getInstance(context, false).checkIsSMSAcceptInRule(context, szSmsBody);
 | 
			
		||||
            //LogUtils.d(TAG, "isInSMSAcceptRule is : " + Boolean.toString(isInSMSAcceptRule));
 | 
			
		||||
 | 
			
		||||
            if (!isPhoneInContacts) {
 | 
			
		||||
                GlobalApplication.showApplicationMessage(" The phone number " + szSmsAddress + " is not in contacts.");
 | 
			
		||||
                if (isOnlyReceiveContacts) {
 | 
			
		||||
                    GlobalApplication.showApplicationMessage("Close the \"Only Receive Contacts\" switch will be receive The " + szSmsAddress + "'s message in future.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ((!isOnlyReceiveContacts)
 | 
			
		||||
                || isPhoneInContacts
 | 
			
		||||
                || isInSMSAcceptRule) {
 | 
			
		||||
            if (checkIsSMSOK(context, szSmsBody, szSmsAddress)) {
 | 
			
		||||
                int nResultId = SMSUtil.saveReceiveSms(context, szSmsAddress, szSmsBody, "0", System.currentTimeMillis(), "inbox");
 | 
			
		||||
                if (nResultId >= 0) {
 | 
			
		||||
                    NotificationUtil nu = new NotificationUtil();
 | 
			
		||||
                    nu.sendSMSReceivedMessage(context, nResultId, szSmsAddress, szSmsBody);
 | 
			
		||||
                    NotificationHelper notificationHelper = new NotificationHelper(context);
 | 
			
		||||
                    notificationHelper.sendSMSReceivedMessage(nResultId, szSmsAddress, szSmsBody);
 | 
			
		||||
                    LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(SMSActivity.ACTION_NOTIFY_SMS_CHANGED));
 | 
			
		||||
                    GlobalApplication.showApplicationMessage("<" + szSmsAddress + "> : ( " + szSmsBody + " ) [SAVED]");
 | 
			
		||||
                    LogUtils.d(TAG, "<" + szSmsAddress + "> : ( " + szSmsBody + " ) [SAVED]");
 | 
			
		||||
                    if (isEnableTTS) {
 | 
			
		||||
                        if (isEnableTTSAnalyzeMode) {
 | 
			
		||||
                            TTSPlayRuleUtil ttsPlayRuleUtil = TTSPlayRuleUtil.getInstance(context);
 | 
			
		||||
@@ -81,12 +67,41 @@ public class SMSRecevier extends BroadcastReceiver {
 | 
			
		||||
                SMSRecycleUtil.addSMSRecycleItem(context, bean);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // 检查短信是否在接收设定规则内
 | 
			
		||||
    //
 | 
			
		||||
    public static boolean checkIsSMSOK(Context context, String szSmsBody, String szSmsAddress) {
 | 
			
		||||
        PhoneUtil phoneUtil = new PhoneUtil(context);
 | 
			
		||||
        boolean isPhoneInContacts = phoneUtil.isPhoneInContacts(szSmsAddress);
 | 
			
		||||
        LogUtils.d(TAG, String.format("isPhoneInContacts %s", isPhoneInContacts));
 | 
			
		||||
 | 
			
		||||
        boolean isPhoneByDigit = phoneUtil.isPhoneByDigit(szSmsAddress);
 | 
			
		||||
        LogUtils.d(TAG, String.format("isPhoneByDigit %s", isPhoneByDigit));
 | 
			
		||||
 | 
			
		||||
        AppConfigUtil configUtil = AppConfigUtil.getInstance(context);
 | 
			
		||||
        boolean isOnlyReceiveContacts = configUtil.mAppConfigBean.isEnableOnlyReceiveContacts();
 | 
			
		||||
        LogUtils.d(TAG, String.format("isOnlyReceiveContacts %s", isOnlyReceiveContacts));
 | 
			
		||||
 | 
			
		||||
        boolean isInSMSAcceptRule = SMSReceiveRuleUtil.getInstance(context, false).checkIsSMSAcceptInRule(context, szSmsBody);
 | 
			
		||||
        LogUtils.d(TAG, String.format("isInSMSAcceptRule %s", isInSMSAcceptRule));
 | 
			
		||||
 | 
			
		||||
        // 启用了只接受通讯录,通讯录里有记录
 | 
			
		||||
        if (isOnlyReceiveContacts && isPhoneInContacts) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        // 如果不是数字通讯地址,但是在通讯录内
 | 
			
		||||
        if (!isPhoneByDigit && isPhoneInContacts) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        // 通讯地址是数字,并且在短信接收规则内。
 | 
			
		||||
        if (isPhoneByDigit && isInSMSAcceptRule) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ package cc.winboll.studio.mymessagemanager.services;
 | 
			
		||||
 * @Date 2024/07/19 14:30:57
 | 
			
		||||
 * @Describe 应用主要服务组件类
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Notification;
 | 
			
		||||
import android.app.Service;
 | 
			
		||||
import android.content.ComponentName;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
@@ -12,20 +13,24 @@ import android.content.Intent;
 | 
			
		||||
import android.content.IntentFilter;
 | 
			
		||||
import android.content.ServiceConnection;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.MainActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.receivers.SMSRecevier;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.services.MainService;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationUtil;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.ServiceUtil;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
 | 
			
		||||
public class MainService extends Service {
 | 
			
		||||
 | 
			
		||||
    public static String TAG = "ManagerService";
 | 
			
		||||
 | 
			
		||||
    // 前台服务通知工具
 | 
			
		||||
    NotificationHelper mNotificationHelper;
 | 
			
		||||
    Notification notification;
 | 
			
		||||
    AppConfigUtil mConfigUtil;
 | 
			
		||||
    //MyBinder mMyBinder;
 | 
			
		||||
    MyServiceConnection mMyServiceConnection;
 | 
			
		||||
@@ -73,17 +78,12 @@ public class MainService extends Service {
 | 
			
		||||
                mSMSRecevier = new SMSRecevier();
 | 
			
		||||
                registerReceiver(mSMSRecevier, localIntentFilter);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                // 显示前台通知栏
 | 
			
		||||
                MessageNotificationBean notificationMessage = createNotificationMessage();
 | 
			
		||||
                NotificationUtil nu = new NotificationUtil();
 | 
			
		||||
                nu.sendForegroundNotification(MainService.this, notificationMessage);
 | 
			
		||||
                NotificationHelper helper = new NotificationHelper(this);
 | 
			
		||||
                Intent intent = new Intent(this, MainActivity.class);
 | 
			
		||||
                notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification));
 | 
			
		||||
                startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification);
 | 
			
		||||
 | 
			
		||||
                /*if (mConfigUtil.isEnableTTS()) {
 | 
			
		||||
                 TTSPlayRuleUtil.speakText(ManagerService.this, getString(R.string.text_iamhere), 0);
 | 
			
		||||
                 GlobalApplication.showApplicationMessage(getString(R.string.text_iamhere));
 | 
			
		||||
                 }*/
 | 
			
		||||
                 
 | 
			
		||||
                ToastUtils.show("Service is start.");
 | 
			
		||||
                LogUtils.i(TAG, "Service is start.");
 | 
			
		||||
            }
 | 
			
		||||
@@ -101,13 +101,6 @@ public class MainService extends Service {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MessageNotificationBean createNotificationMessage() {
 | 
			
		||||
        String szTitle = getApplicationContext().getString(R.string.app_name);
 | 
			
		||||
        String szContent = getString(R.string.text_aboutservernotification);
 | 
			
		||||
        return new MessageNotificationBean(NotificationUtil.ID_MSG_SERVICE, "", szTitle, szContent);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int onStartCommand(Intent intent, int flags, int startId) {
 | 
			
		||||
        //return super.onStartCommand(intent, flags, startId);
 | 
			
		||||
@@ -116,12 +109,12 @@ public class MainService extends Service {
 | 
			
		||||
        return mConfigUtil.mAppConfigBean.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   /*private class MyBinder extends IMyAidlInterface.Stub {
 | 
			
		||||
        @Override
 | 
			
		||||
        public String getServiceName() {
 | 
			
		||||
            return MainService.class.getSimpleName();
 | 
			
		||||
        }
 | 
			
		||||
    }*/
 | 
			
		||||
    /*private class MyBinder extends IMyAidlInterface.Stub {
 | 
			
		||||
     @Override
 | 
			
		||||
     public String getServiceName() {
 | 
			
		||||
     return MainService.class.getSimpleName();
 | 
			
		||||
     }
 | 
			
		||||
     }*/
 | 
			
		||||
 | 
			
		||||
    // 主进程与守护进程连接时需要用到此类
 | 
			
		||||
    //
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,28 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.unittest;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/03/01 13:07:32
 | 
			
		||||
 * @Describe AddressUtils Test
 | 
			
		||||
 */
 | 
			
		||||
public class AddressUtils_Test {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "AddressUtils_Test";
 | 
			
		||||
 | 
			
		||||
    public static void main(Context context) {
 | 
			
		||||
        String szSmsBody = "无影无迹";
 | 
			
		||||
        String szSmsAddress = "无名小辈";
 | 
			
		||||
        LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress)));
 | 
			
		||||
        szSmsAddress = "13172887736";
 | 
			
		||||
        LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress)));
 | 
			
		||||
        szSmsAddress = "+8613172887736";
 | 
			
		||||
        LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress)));
 | 
			
		||||
        szSmsAddress = "8613172887736";
 | 
			
		||||
        LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress)));
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,56 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.unittest;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/25 19:02:15
 | 
			
		||||
 * @Describe SMSRecevier 测试类
 | 
			
		||||
 */
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.receivers.SMSRecevier;
 | 
			
		||||
 | 
			
		||||
public class SMSRecevier_Test {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "SMSRecevier_Test";
 | 
			
		||||
 | 
			
		||||
    public static void main(Context context) {
 | 
			
		||||
        String szSmsBody = "无影无迹";
 | 
			
		||||
        String szSmsAddress = "无名小辈";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "无影无迹";
 | 
			
		||||
        szSmsAddress = "淘宝物流";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "无影无迹";
 | 
			
		||||
        szSmsAddress = "1?0";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "无影无迹";
 | 
			
		||||
        szSmsAddress = "10000";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "【UC】无影无迹";
 | 
			
		||||
        szSmsAddress = "无名小辈";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "【UC】无影无迹";
 | 
			
		||||
        szSmsAddress = "10000";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "【UC】无影无迹";
 | 
			
		||||
        szSmsAddress = "13172887736";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
        szSmsBody = "【UC】无影无迹";
 | 
			
		||||
        szSmsAddress = "+8613172887736";
 | 
			
		||||
        test1(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static void test1(Context context, String szSmsBody, String szSmsAddress) {
 | 
			
		||||
        
 | 
			
		||||
        boolean isSMSOK = SMSRecevier.checkIsSMSOK(context, szSmsBody, szSmsAddress);
 | 
			
		||||
        LogUtils.d(TAG, String.format("szSmsBody : %s\nszSmsAddress : %s\nisSMSOK : %s", szSmsBody, szSmsAddress, isSMSOK));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.unittest;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/25 19:00:10
 | 
			
		||||
 * @Describe 应用单元测试窗口
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogView;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
 | 
			
		||||
public class UnitTestActivity extends Activity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "UnitTestActivity";
 | 
			
		||||
 | 
			
		||||
    LogView mLogView;
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setContentView(R.layout.activity_unittest);
 | 
			
		||||
        
 | 
			
		||||
        mLogView = findViewById(R.id.logview);
 | 
			
		||||
        mLogView.start();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onMain(View view) {
 | 
			
		||||
        LogUtils.d(TAG, "SMSRecevier_Test");
 | 
			
		||||
        SMSRecevier_Test.main(this);
 | 
			
		||||
        LogUtils.d(TAG, "AddressUtils_Test");
 | 
			
		||||
        AddressUtils_Test.main(this);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.utils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/03/01 13:03:16
 | 
			
		||||
 * @Describe 通信录地址工具
 | 
			
		||||
 */
 | 
			
		||||
public class AddressUtils {
 | 
			
		||||
    
 | 
			
		||||
    public static final String TAG = "AddressUtils";
 | 
			
		||||
    
 | 
			
		||||
    public static String getFormattedAddress(String address) {
 | 
			
		||||
        if (address != null && address.matches("[+]?\\d+")) {
 | 
			
		||||
            return address;
 | 
			
		||||
        } else {
 | 
			
		||||
            return "【" + address + "】";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
@@ -10,7 +10,7 @@ import android.content.Intent;
 | 
			
		||||
import android.content.res.AssetManager;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import androidx.core.content.FileProvider;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,202 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.utils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/04/01 14:10:35
 | 
			
		||||
 * @Describe 应用通知工具类
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Notification;
 | 
			
		||||
import android.app.NotificationChannel;
 | 
			
		||||
import android.app.NotificationManager;
 | 
			
		||||
import android.app.PendingIntent;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.widget.RemoteViews;
 | 
			
		||||
import androidx.annotation.RequiresApi;
 | 
			
		||||
import androidx.core.app.NotificationCompat;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSActivity;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class NotificationHelper {
 | 
			
		||||
    public static final String TAG = "NotificationHelper";
 | 
			
		||||
 | 
			
		||||
    // 渠道ID和名称
 | 
			
		||||
    private static final String CHANNEL_ID_FOREGROUND = "foreground_channel";
 | 
			
		||||
    private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service";
 | 
			
		||||
    private static final String CHANNEL_ID_TEMPORARY = "temporary_channel";
 | 
			
		||||
    private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications";
 | 
			
		||||
 | 
			
		||||
    // 通知ID
 | 
			
		||||
    public static final int FOREGROUND_NOTIFICATION_ID = 1001;
 | 
			
		||||
    public static final int TEMPORARY_NOTIFICATION_ID = 2001;
 | 
			
		||||
 | 
			
		||||
    private final Context mContext;
 | 
			
		||||
    private final NotificationManager mNotificationManager;
 | 
			
		||||
 | 
			
		||||
    // 示例:维护当前使用的渠道ID列表
 | 
			
		||||
    // 键:渠道ID,值:渠道重要性级别
 | 
			
		||||
    Map<String, Integer> activeChannelConfigs = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    public NotificationHelper(Context context) {
 | 
			
		||||
        mContext = context;
 | 
			
		||||
        mNotificationManager = context.getSystemService(NotificationManager.class);
 | 
			
		||||
 | 
			
		||||
        // 初始化配置
 | 
			
		||||
        activeChannelConfigs.put(
 | 
			
		||||
            CHANNEL_ID_FOREGROUND,
 | 
			
		||||
            NotificationManager.IMPORTANCE_HIGH
 | 
			
		||||
        );
 | 
			
		||||
        activeChannelConfigs.put(
 | 
			
		||||
            CHANNEL_ID_TEMPORARY,
 | 
			
		||||
            NotificationManager.IMPORTANCE_DEFAULT
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        createNotificationChannels();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(api = Build.VERSION_CODES.O)
 | 
			
		||||
    private void createNotificationChannels() {
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
			
		||||
            createForegroundChannel();
 | 
			
		||||
            createTemporaryChannel();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(api = Build.VERSION_CODES.O)
 | 
			
		||||
    private void createForegroundChannel() {
 | 
			
		||||
        NotificationChannel channel = new NotificationChannel(
 | 
			
		||||
            CHANNEL_ID_FOREGROUND,
 | 
			
		||||
            CHANNEL_NAME_FOREGROUND,
 | 
			
		||||
            NotificationManager.IMPORTANCE_LOW
 | 
			
		||||
        );
 | 
			
		||||
        channel.setDescription("Persistent service notifications");
 | 
			
		||||
        channel.setSound(null, null);
 | 
			
		||||
        channel.enableVibration(false);
 | 
			
		||||
        mNotificationManager.createNotificationChannel(channel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(api = Build.VERSION_CODES.O)
 | 
			
		||||
    private void createTemporaryChannel() {
 | 
			
		||||
        NotificationChannel channel = new NotificationChannel(
 | 
			
		||||
            CHANNEL_ID_TEMPORARY,
 | 
			
		||||
            CHANNEL_NAME_TEMPORARY,
 | 
			
		||||
            NotificationManager.IMPORTANCE_HIGH
 | 
			
		||||
        );
 | 
			
		||||
        channel.setDescription("Temporary alert notifications");
 | 
			
		||||
        channel.setSound(null, null);
 | 
			
		||||
        channel.enableVibration(true);
 | 
			
		||||
        channel.setVibrationPattern(new long[]{100, 200, 300, 400});
 | 
			
		||||
        channel.setBypassDnd(true);
 | 
			
		||||
        mNotificationManager.createNotificationChannel(channel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 显示常驻通知(通常用于前台服务)
 | 
			
		||||
    public Notification showForegroundNotification(Intent intent, String title, String content) {
 | 
			
		||||
        PendingIntent pendingIntent = createPendingIntent(intent);
 | 
			
		||||
 | 
			
		||||
        Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND)
 | 
			
		||||
            .setSmallIcon(R.drawable.ic_launcher)
 | 
			
		||||
            .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
 | 
			
		||||
            //.setContentTitle(title)
 | 
			
		||||
            .setContentTitle(content)
 | 
			
		||||
            //.setContentText(content)
 | 
			
		||||
            .setContentIntent(pendingIntent)
 | 
			
		||||
            .setPriority(NotificationCompat.PRIORITY_LOW)
 | 
			
		||||
            .setOngoing(true)
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification);
 | 
			
		||||
        return notification;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 显示临时通知(自动消失)
 | 
			
		||||
    public void showTemporaryNotification(Intent intent, String title, String content) {
 | 
			
		||||
        showTemporaryNotification(intent, TEMPORARY_NOTIFICATION_ID, title, content);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 显示临时通知(自动消失)
 | 
			
		||||
    public void showTemporaryNotification(Intent intent, int notificationID, String title, String content) {
 | 
			
		||||
        PendingIntent pendingIntent = createPendingIntent(intent);
 | 
			
		||||
 | 
			
		||||
        Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
 | 
			
		||||
            .setSmallIcon(R.drawable.ic_launcher)
 | 
			
		||||
            .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
 | 
			
		||||
            .setContentTitle(title)
 | 
			
		||||
            .setContentText(content)
 | 
			
		||||
            .setContentIntent(pendingIntent)
 | 
			
		||||
            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
			
		||||
            .setAutoCancel(true)
 | 
			
		||||
            .setVibrate(new long[]{100, 200, 300, 400})
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        mNotificationManager.notify(notificationID, notification);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 创建自定义布局通知(可扩展)
 | 
			
		||||
    public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) {
 | 
			
		||||
        PendingIntent pendingIntent = createPendingIntent(intent);
 | 
			
		||||
 | 
			
		||||
        Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
 | 
			
		||||
            .setSmallIcon(R.drawable.ic_launcher)
 | 
			
		||||
            .setContentIntent(pendingIntent)
 | 
			
		||||
            .setContent(contentView)
 | 
			
		||||
            .setCustomBigContentView(bigContentView)
 | 
			
		||||
            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
			
		||||
            .setAutoCancel(true)
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 取消所有通知
 | 
			
		||||
    public void cancelAllNotifications() {
 | 
			
		||||
        mNotificationManager.cancelAll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 取消指定通知
 | 
			
		||||
    public void cancelNotification(int notificationID) {
 | 
			
		||||
        mNotificationManager.cancel(notificationID);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 创建PendingIntent(兼容不同API版本)
 | 
			
		||||
    private PendingIntent createPendingIntent(Intent intent) {
 | 
			
		||||
        int flags = PendingIntent.FLAG_UPDATE_CURRENT;
 | 
			
		||||
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
 | 
			
		||||
//            flags |= PendingIntent.FLAG_IMMUTABLE;
 | 
			
		||||
//        }
 | 
			
		||||
        return PendingIntent.getActivity(
 | 
			
		||||
            mContext,
 | 
			
		||||
            0,
 | 
			
		||||
            intent,
 | 
			
		||||
            flags
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void sendSMSReceivedMessage(int notificationID, String szPhone, String szBody) {
 | 
			
		||||
        Intent intent = new Intent(mContext, SMSActivity.class);
 | 
			
		||||
		intent.putExtra(SMSActivity.EXTRA_PHONE, szPhone);
 | 
			
		||||
        String szTitle = mContext.getString(R.string.text_smsfrom)  + "<" + szPhone + ">";
 | 
			
		||||
        String szContent = "[ " + szBody + " ]";
 | 
			
		||||
        showTemporaryNotification(intent, notificationID, szTitle, szContent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void cleanOldChannels() {
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
			
		||||
            List<NotificationChannel> allChannels = mNotificationManager.getNotificationChannels();
 | 
			
		||||
            for (NotificationChannel channel : allChannels) {
 | 
			
		||||
                LogUtils.d(TAG, "Clean channel : " + channel.getId());
 | 
			
		||||
                if (!activeChannelConfigs.containsKey(channel.getId())) {
 | 
			
		||||
                    // 安全删除渠道
 | 
			
		||||
                    mNotificationManager.deleteNotificationChannel(channel.getId());
 | 
			
		||||
                    LogUtils.d(TAG, String.format("Deleted Channel %s", channel.getId()));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -15,12 +15,12 @@ import android.graphics.BitmapFactory;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.media.RingtoneManager;
 | 
			
		||||
import android.widget.RemoteViews;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.MainActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.services.MainService;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class NotificationUtil {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,168 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.utils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@QQ.COM
 | 
			
		||||
 * @Date 2024/07/19 14:30:57
 | 
			
		||||
 * @Describe 应用通知栏工具类
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Notification;
 | 
			
		||||
import android.app.NotificationChannel;
 | 
			
		||||
import android.app.NotificationManager;
 | 
			
		||||
import android.app.PendingIntent;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.media.RingtoneManager;
 | 
			
		||||
import android.widget.RemoteViews;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.MainActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.SMSActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.services.MainService;
 | 
			
		||||
 | 
			
		||||
public class NotificationUtil_Bck {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "NotificationUtil";
 | 
			
		||||
    public static final int ID_MSG_SERVICE = 10000;
 | 
			
		||||
 | 
			
		||||
    static final String szSMSChannelID = "1";
 | 
			
		||||
 | 
			
		||||
    static final String szServiceChannelID = "0";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //static int mNumSendForegroundNotification = 10000;
 | 
			
		||||
    //static int mNumSendSMSNotification = 20000;
 | 
			
		||||
 | 
			
		||||
    public NotificationManager createServiceNotificationChannel(Context context) {
 | 
			
		||||
        //创建通知渠道ID
 | 
			
		||||
		String channelId = szServiceChannelID;
 | 
			
		||||
		//创建通知渠道名称
 | 
			
		||||
		String channelName = "Service Message";
 | 
			
		||||
		//创建通知渠道重要性
 | 
			
		||||
		int importance = NotificationManager.IMPORTANCE_MIN;
 | 
			
		||||
		NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
 | 
			
		||||
		channel.setSound(null, null);
 | 
			
		||||
		NotificationManager notificationManager = (NotificationManager) context.getSystemService(
 | 
			
		||||
			Context.NOTIFICATION_SERVICE);
 | 
			
		||||
		notificationManager.createNotificationChannel(channel);
 | 
			
		||||
		return notificationManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NotificationManager createSMSNotificationChannel(Context context) {
 | 
			
		||||
        //创建通知渠道ID
 | 
			
		||||
		String channelId = szSMSChannelID;
 | 
			
		||||
		//创建通知渠道名称
 | 
			
		||||
		String channelName = "SMS Message";
 | 
			
		||||
		//创建通知渠道重要性
 | 
			
		||||
		int importance = NotificationManager.IMPORTANCE_HIGH;
 | 
			
		||||
		NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
 | 
			
		||||
		channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), Notification.AUDIO_ATTRIBUTES_DEFAULT);
 | 
			
		||||
		NotificationManager notificationManager = (NotificationManager) context.getSystemService(
 | 
			
		||||
			Context.NOTIFICATION_SERVICE);
 | 
			
		||||
		notificationManager.createNotificationChannel(channel);
 | 
			
		||||
		return notificationManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 创建通知
 | 
			
		||||
    //
 | 
			
		||||
    public void sendForegroundNotification(MainService service, MessageNotificationBean nessageNotificationBean) {
 | 
			
		||||
		//创建Notification,传入Context和channelId
 | 
			
		||||
		Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
 | 
			
		||||
		intent.setClass(service, MainActivity.class);
 | 
			
		||||
 | 
			
		||||
		//这里放一个count用来区分每一个通知
 | 
			
		||||
		//intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去
 | 
			
		||||
 | 
			
		||||
		//参数1:context 上下文对象
 | 
			
		||||
		//参数2:发送者私有的请求码(Private request code for the sender)
 | 
			
		||||
		//参数3:intent 意图对象
 | 
			
		||||
		//参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
 | 
			
		||||
		PendingIntent mForegroundPendingIntent = PendingIntent.getActivity(service, nessageNotificationBean.getMessageId(), intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
 | 
			
		||||
 | 
			
		||||
		Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID)
 | 
			
		||||
			.setAutoCancel(true)
 | 
			
		||||
			.setContentTitle(nessageNotificationBean.getTitle())
 | 
			
		||||
			.setContentText(nessageNotificationBean.getContent())
 | 
			
		||||
			.setWhen(System.currentTimeMillis())
 | 
			
		||||
			.setSmallIcon(R.drawable.ic_launcher)
 | 
			
		||||
			//设置红色
 | 
			
		||||
			.setColor(Color.parseColor("#F00606"))
 | 
			
		||||
			.setLargeIcon(BitmapFactory.decodeResource(service.getResources(), R.drawable.ic_launcher))
 | 
			
		||||
			.setContentIntent(mForegroundPendingIntent)
 | 
			
		||||
			.build();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		RemoteViews mrvForegroundNotificationView = new RemoteViews(service.getPackageName(), R.layout.remoteview);
 | 
			
		||||
		mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView1, nessageNotificationBean.getTitle());
 | 
			
		||||
		mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView2, nessageNotificationBean.getContent());
 | 
			
		||||
		mrvForegroundNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher);
 | 
			
		||||
		mForegroundNotification.contentView = mrvForegroundNotificationView;
 | 
			
		||||
		mForegroundNotification.bigContentView = mrvForegroundNotificationView;
 | 
			
		||||
 | 
			
		||||
		service.startForeground(nessageNotificationBean.getMessageId(), mForegroundNotification);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void sendSMSNotification(Context context, MessageNotificationBean messageNotificationBean) {
 | 
			
		||||
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(
 | 
			
		||||
			Context.NOTIFICATION_SERVICE);
 | 
			
		||||
		/*NotificationManager notificationManager = createSMSNotificationChannel(context);
 | 
			
		||||
		 if (notificationManager == null) {
 | 
			
		||||
		 LogUtils.d(TAG, "createSMSNotificationChannel failed.");
 | 
			
		||||
		 return;
 | 
			
		||||
		 }*/
 | 
			
		||||
 | 
			
		||||
		//创建Notification,传入Context和channelId
 | 
			
		||||
		Intent intent = new Intent(context, SMSActivity.class);
 | 
			
		||||
		intent.putExtra(SMSActivity.EXTRA_PHONE, messageNotificationBean.getPhone());
 | 
			
		||||
		LogUtils.d(TAG, "sendSMSNotification(...) message.getPhone() is : " + messageNotificationBean.getPhone());
 | 
			
		||||
		//Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
 | 
			
		||||
		//intent.setClass(context, MainActivity.class);
 | 
			
		||||
		//这里放一个count用来区分每一个通知
 | 
			
		||||
		//intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去
 | 
			
		||||
 | 
			
		||||
		//参数1:context 上下文对象
 | 
			
		||||
		//参数2:发送者私有的请求码(Private request code for the sender)
 | 
			
		||||
		//参数3:intent 意图对象
 | 
			
		||||
		//参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
 | 
			
		||||
		PendingIntent mRemindPendingIntent = PendingIntent.getActivity(context, messageNotificationBean.getMessageId(), intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
 | 
			
		||||
		Notification mSMSNotification = new Notification.Builder(context, szSMSChannelID)
 | 
			
		||||
			.setAutoCancel(true)
 | 
			
		||||
			.setContentTitle(messageNotificationBean.getTitle())
 | 
			
		||||
			.setContentText(messageNotificationBean.getContent())
 | 
			
		||||
			.setWhen(System.currentTimeMillis())
 | 
			
		||||
			.setSmallIcon(R.drawable.ic_launcher)
 | 
			
		||||
			//设置红色
 | 
			
		||||
			.setColor(Color.parseColor("#F00606"))
 | 
			
		||||
			.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher))
 | 
			
		||||
			.setContentIntent(mRemindPendingIntent)
 | 
			
		||||
			.build();
 | 
			
		||||
 | 
			
		||||
		RemoteViews mrvSMSNotificationView = new RemoteViews(context.getPackageName(), R.layout.remoteview);
 | 
			
		||||
		mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView1, messageNotificationBean.getTitle());
 | 
			
		||||
		mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView2, messageNotificationBean.getContent());
 | 
			
		||||
		mrvSMSNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher);
 | 
			
		||||
		mSMSNotification.contentView = mrvSMSNotificationView;
 | 
			
		||||
		mSMSNotification.bigContentView = mrvSMSNotificationView;
 | 
			
		||||
		notificationManager.notify(messageNotificationBean.getMessageId(), mSMSNotification);
 | 
			
		||||
        LogUtils.d(TAG, "getMessageId is : " + Integer.toString(messageNotificationBean.getMessageId()));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void sendSMSReceivedMessage(Context context, int nMessageId, String szPhone, String szBody) {
 | 
			
		||||
        String szTitle = context.getString(R.string.text_smsfrom)  + "<" + szPhone + ">";
 | 
			
		||||
        String szContent = "[ " + szBody + " ]";
 | 
			
		||||
        sendSMSNotification(context, new MessageNotificationBean(nMessageId, szPhone, szTitle, szContent));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void cancelNotification(Context context, int notificationId) {
 | 
			
		||||
        // 获取 NotificationManager 实例
 | 
			
		||||
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
 | 
			
		||||
        // 撤回指定 ID 的通知栏消息
 | 
			
		||||
        notificationManager.cancel(notificationId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -10,9 +10,9 @@ import android.content.Context;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.BaseActivity;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import com.hjq.permissions.OnPermissionCallback;
 | 
			
		||||
import com.hjq.permissions.Permission;
 | 
			
		||||
import com.hjq.permissions.XXPermissions;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,11 +10,14 @@ import android.content.Context;
 | 
			
		||||
import android.database.Cursor;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.provider.ContactsContract;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.PhoneBean;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.regex.Matcher;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
public class PhoneUtil {
 | 
			
		||||
 | 
			
		||||
@@ -59,12 +62,57 @@ public class PhoneUtil {
 | 
			
		||||
 | 
			
		||||
    public boolean isPhoneInContacts(String szPhone) {
 | 
			
		||||
        List<PhoneBean> listPhoneDto = getPhoneList();
 | 
			
		||||
        LogUtils.d(TAG, String.format("isPhoneInContacts(...) listPhoneDto.size() %d", listPhoneDto.size()));
 | 
			
		||||
        for (int i = 0; i < listPhoneDto.size(); i++) {
 | 
			
		||||
            if (listPhoneDto.get(i).getTelPhone().equals(szPhone)) {
 | 
			
		||||
            if (isTheSamePhoneNumber(listPhoneDto.get(i).getTelPhone(), szPhone)) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    boolean isTheSamePhoneNumber(String szNum1, String szNum2) {
 | 
			
		||||
        //LogUtils.d(TAG, String.format("szNum1 %s\nszNum2 %s", szNum1, szNum2));
 | 
			
		||||
        if(szNum1.equals(szNum2)) {
 | 
			
		||||
            LogUtils.d(TAG, "szNum1.equals(szNum2)");
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if(UnitAreaUtils.getInstance(mContext).isCurrentUnitAreaNumber(szNum1)) {
 | 
			
		||||
            if(szNum1.equals(UnitAreaUtils.getInstance(mContext).genCurrentUnitAreaNumber(szNum2))) {
 | 
			
		||||
                LogUtils.d(TAG, "szNum1.equals(UnitAreaUtils.genCurrentUnitAreaNumber(szNum2))");
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if(UnitAreaUtils.getInstance(mContext).isCurrentUnitAreaNumber(szNum2)) {
 | 
			
		||||
            if(szNum2.equals(UnitAreaUtils.getInstance(mContext).genCurrentUnitAreaNumber(szNum1))) {
 | 
			
		||||
                LogUtils.d(TAG, "szNum2.equals(UnitAreaUtils.genCurrentUnitAreaNumber(szNum1))");
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        LogUtils.d(TAG, "isTheSamePhoneNumber(...) return false;");
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // 检验电话号码是否是数字
 | 
			
		||||
    //
 | 
			
		||||
    public static boolean isPhoneByDigit(String szPhone) {
 | 
			
		||||
        if(!RegexPPiUtils.isPPiOK(szPhone)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        //String text = "这里是一些任意的文本内容";
 | 
			
		||||
        String regex = "[+]?\\d+";
 | 
			
		||||
        Pattern pattern = Pattern.compile(regex);
 | 
			
		||||
        Matcher matcher = pattern.matcher(szPhone);
 | 
			
		||||
        LogUtils.d(TAG, String.format("matcher.matches() : %s", matcher.matches()));
 | 
			
		||||
        /*if (matcher.matches()) {
 | 
			
		||||
         System.out.println("文本满足该正则表达式模式");
 | 
			
		||||
         } else {
 | 
			
		||||
         System.out.println("文本不满足该正则表达式模式");
 | 
			
		||||
         }*/
 | 
			
		||||
        return matcher.matches();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,9 @@ package cc.winboll.studio.mymessagemanager.utils;
 | 
			
		||||
 */
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean_V1;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
@@ -18,7 +18,6 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.nio.channels.AcceptPendingException;
 | 
			
		||||
 | 
			
		||||
public class SMSReceiveRuleUtil {
 | 
			
		||||
 | 
			
		||||
@@ -194,9 +193,9 @@ public class SMSReceiveRuleUtil {
 | 
			
		||||
    public ArrayList<SMSAcceptRuleBean> loadConfigData() {
 | 
			
		||||
        ArrayList<SMSAcceptRuleBean> list = new ArrayList<SMSAcceptRuleBean>();
 | 
			
		||||
        SMSAcceptRuleBean.loadBeanList(mContext, list, SMSAcceptRuleBean.class);
 | 
			
		||||
        for (int i = 0; i < list.size(); i++) {
 | 
			
		||||
            LogUtils.d(TAG, "loadConfigData isEnable : " + Boolean.toString(list.get(i).isEnable()));
 | 
			
		||||
        }
 | 
			
		||||
//        for (int i = 0; i < list.size(); i++) {
 | 
			
		||||
//            LogUtils.d(TAG, "loadConfigData isEnable : " + Boolean.toString(list.get(i).isEnable()));
 | 
			
		||||
//        }
 | 
			
		||||
        mDataList.clear();
 | 
			
		||||
        mDataList.addAll(list);
 | 
			
		||||
        return mDataList;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ package cc.winboll.studio.mymessagemanager.utils;
 | 
			
		||||
 * @Describe 短信回收站工具类
 | 
			
		||||
 */
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.App;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSRecycleBean;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,8 @@ import android.os.Bundle;
 | 
			
		||||
import android.provider.Telephony;
 | 
			
		||||
import android.telephony.gsm.SmsManager;
 | 
			
		||||
import android.telephony.gsm.SmsMessage;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import android.content.Intent;
 | 
			
		||||
import android.os.Message;
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean;
 | 
			
		||||
@@ -17,7 +18,6 @@ import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean_V1;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.TTSSpeakTextBean;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.services.TTSPlayService;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,9 +14,9 @@ import android.view.Gravity;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.WindowManager;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.R;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.TTSSpeakTextBean;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class TextToSpeechUtil {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,47 @@
 | 
			
		||||
package cc.winboll.studio.mymessagemanager.utils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/04/14 15:55:36
 | 
			
		||||
 * @Describe 电话号码区域管理辅助类
 | 
			
		||||
 */
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.beans.AppConfigBean;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
 | 
			
		||||
public class UnitAreaUtils {
 | 
			
		||||
    
 | 
			
		||||
    public static final String TAG = "UnitAreaUtils";
 | 
			
		||||
    
 | 
			
		||||
    static UnitAreaUtils _UnitAreaUtils;
 | 
			
		||||
    Context mContext;
 | 
			
		||||
 | 
			
		||||
    UnitAreaUtils(Context context) {
 | 
			
		||||
        mContext = context;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static UnitAreaUtils getInstance(Context context) {
 | 
			
		||||
        if (_UnitAreaUtils == null) {
 | 
			
		||||
            _UnitAreaUtils = new UnitAreaUtils(context);
 | 
			
		||||
        }
 | 
			
		||||
        return _UnitAreaUtils;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean isCurrentUnitAreaNumber(String szPhoneNumer) {
 | 
			
		||||
        String szUnitArea = getUnitArea();
 | 
			
		||||
        LogUtils.d(TAG, String.format("szPhoneNumer.substring(1,3) %s", szPhoneNumer.substring(1,3)));
 | 
			
		||||
        return szPhoneNumer.substring(1,3).equals(szUnitArea);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public String genCurrentUnitAreaNumber(String szPhoneNumer) {
 | 
			
		||||
        String szUnitArea = getUnitArea();
 | 
			
		||||
        LogUtils.d(TAG, String.format("szUnitArea %s", szUnitArea));
 | 
			
		||||
        return "+" + szUnitArea + szPhoneNumer;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    String getUnitArea() {
 | 
			
		||||
        String szUnitArea = AppConfigUtil.getInstance(mContext).mAppConfigBean.getCountryCode();
 | 
			
		||||
        LogUtils.d(TAG, String.format("szUnitArea %s", szUnitArea));
 | 
			
		||||
        return szUnitArea;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -8,8 +8,8 @@ import android.content.Context;
 | 
			
		||||
import android.util.AttributeSet;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.Switch;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
 | 
			
		||||
import cc.winboll.studio.shared.log.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class ConfirmSwitchView extends Switch {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,21 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout
 | 
			
		||||
	xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
	xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
	android:orientation="vertical"
 | 
			
		||||
	android:layout_width="match_parent"
 | 
			
		||||
	android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
   <!--<androidx.appcompat.widget.Toolbar
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:id="@+id/activityaboutToolbar1"/>-->
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
    <cc.winboll.studio.libaes.views.ASupportToolbar
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="@dimen/toolbar_height"
 | 
			
		||||
		android:id="@+id/activityaboutASupportToolbar1"/>
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:id="@+id/toolbar"/>
 | 
			
		||||
 | 
			
		||||
    <cc.winboll.studio.shared.view.AboutView
 | 
			
		||||
        app:appname="MyMessageManager"
 | 
			
		||||
        app:appprojectname="MyMessageManager"
 | 
			
		||||
        app:appdescription="用正则表达式方法自定义短信过滤和语音播报的短信应用。"
 | 
			
		||||
        app:appicon="@drawable/ic_winboll"
 | 
			
		||||
    <LinearLayout
 | 
			
		||||
        android:orientation="vertical"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:id="@+id/activityaboutAboutView1"/>
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:layout_weight="1.0"
 | 
			
		||||
        android:id="@+id/aboutviewroot_ll"/>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -213,6 +213,12 @@
 | 
			
		||||
						android:text="检查应用权限"
 | 
			
		||||
						android:onClick="onCheckAndGetAppPermission"/>
 | 
			
		||||
 | 
			
		||||
                    <Button
 | 
			
		||||
                        android:layout_width="wrap_content"
 | 
			
		||||
                        android:layout_height="wrap_content"
 | 
			
		||||
                        android:text="清理通知设置"
 | 
			
		||||
                        android:onClick="onCleanOldChannels"/>
 | 
			
		||||
                    
 | 
			
		||||
				</LinearLayout>
 | 
			
		||||
 | 
			
		||||
			</LinearLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -72,11 +72,5 @@
 | 
			
		||||
 | 
			
		||||
	</com.baoyz.widget.PullRefreshLayout>
 | 
			
		||||
 | 
			
		||||
	<cc.winboll.studio.shared.log.LogView
 | 
			
		||||
		android:orientation="horizontal"
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_height="120dp"
 | 
			
		||||
		android:id="@+id/logview"/>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								mymessagemanager/src/main/res/layout/activity_unittest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								mymessagemanager/src/main/res/layout/activity_unittest.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout
 | 
			
		||||
	xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
	xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
	android:orientation="vertical"
 | 
			
		||||
	android:layout_width="match_parent"
 | 
			
		||||
	android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
	<ScrollView
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_height="500dp">
 | 
			
		||||
 | 
			
		||||
		<LinearLayout
 | 
			
		||||
			android:orientation="vertical"
 | 
			
		||||
			android:layout_width="match_parent"
 | 
			
		||||
			android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
			<LinearLayout
 | 
			
		||||
				android:orientation="horizontal"
 | 
			
		||||
				android:layout_width="match_parent"
 | 
			
		||||
				android:layout_height="wrap_content"
 | 
			
		||||
				android:gravity="right">
 | 
			
		||||
 | 
			
		||||
				<Button
 | 
			
		||||
					android:layout_width="wrap_content"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
					android:text="Test Main"
 | 
			
		||||
					android:onClick="onMain"
 | 
			
		||||
					android:textAllCaps="false"/>
 | 
			
		||||
 | 
			
		||||
			</LinearLayout>
 | 
			
		||||
 | 
			
		||||
		</LinearLayout>
 | 
			
		||||
 | 
			
		||||
	</ScrollView>
 | 
			
		||||
 | 
			
		||||
	<cc.winboll.studio.shared.log.LogView
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_height="0dp"
 | 
			
		||||
		android:layout_weight="1.0"
 | 
			
		||||
		android:id="@+id/logview"/>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user