Compare commits
2 Commits
winboll-v1
...
mymessagem
| Author | SHA1 | Date | |
|---|---|---|---|
| e90f905cd8 | |||
| 090070aa0e |
@@ -1,223 +1,166 @@
|
|||||||
#!/usr/bin/bash
|
#!/usr/bin/bash
|
||||||
# ==============================================================================
|
|
||||||
# WinBoLL 应用发布脚本
|
|
||||||
# 功能:检查Git源码状态 → 编译Stage Release包 → 添加WinBoLL标签 → 提交并推送源码
|
|
||||||
# 依赖:build.properties、app_update_description.txt(项目根目录下)
|
|
||||||
# 使用:./script_name.sh <APP_NAME>
|
|
||||||
# 作者:豆包&ZhanGSKen<zhangsken@qq.com>
|
|
||||||
# ==============================================================================
|
|
||||||
|
|
||||||
# ==================== 常量定义 ====================
|
# 检查是否指定了将要发布的应用名称
|
||||||
# 脚本退出码
|
# 使用 `-z` 命令检查变量是否为空
|
||||||
EXIT_CODE_SUCCESS=0
|
|
||||||
EXIT_CODE_ERR_NO_APP_NAME=2
|
|
||||||
EXIT_CODE_ERR_WORK_DIR=1
|
|
||||||
EXIT_CODE_ERR_GIT_CHECK=1
|
|
||||||
EXIT_CODE_ERR_ADD_WINBOLL_TAG=1
|
|
||||||
|
|
||||||
# Gradle 任务(正式发布)
|
|
||||||
GRADLE_TASK_PUBLISH="assembleStageRelease"
|
|
||||||
# Gradle 任务(调试用,注释备用)
|
|
||||||
# GRADLE_TASK_DEBUG="assembleBetaDebug"
|
|
||||||
|
|
||||||
# ==================== 函数定义 ====================
|
|
||||||
# 检查Git源码是否已完全提交(无未提交变更)
|
|
||||||
# 返回值:0=已完全提交,1=存在未提交变更
|
|
||||||
function checkGitSources() {
|
|
||||||
# 配置Git安全目录(解决权限问题)
|
|
||||||
git config --global --add safe.directory "$(pwd)"
|
|
||||||
|
|
||||||
# 检查是否有未提交的变更
|
|
||||||
if [[ -n $(git diff --stat) ]]; then
|
|
||||||
echo "[ERROR] Git源码存在未提交变更,请先提交所有修改!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[INFO] Git源码检查通过:所有变更已提交。"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# 询问是否添加GitHub Workflows标签(当前逻辑注释,保留扩展能力)
|
|
||||||
# 返回值:1=用户选择是,0=用户选择否
|
|
||||||
function askAddWorkflowsTag() {
|
|
||||||
read -p "是否添加GitHub Workflows标签?(Y/n) " answer
|
|
||||||
if [[ $answer =~ ^[Yy]$ ]]; then
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 添加WinBoLL正式标签
|
|
||||||
# 参数:$1=应用名称(项目根目录名)
|
|
||||||
# 返回值:0=标签添加成功,1=标签已存在/添加失败
|
|
||||||
function addWinBoLLTag() {
|
|
||||||
local app_name=$1
|
|
||||||
local build_prop_path="${app_name}/build.properties"
|
|
||||||
|
|
||||||
# 从build.properties中提取publishVersion
|
|
||||||
local publish_version=$(grep -o "publishVersion=.*" "${build_prop_path}" | awk -F '=' '{print $2}')
|
|
||||||
if [[ -z ${publish_version} ]]; then
|
|
||||||
echo "[ERROR] 未从${build_prop_path}中提取到publishVersion配置!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo "[INFO] 从${build_prop_path}读取到publishVersion:${publish_version}"
|
|
||||||
|
|
||||||
# 构造WinBoLL标签(格式:<APP_NAME>-v<publishVersion>)
|
|
||||||
local tag="${app_name}-v${publish_version}"
|
|
||||||
echo "[INFO] 准备添加WinBoLL标签:${tag}"
|
|
||||||
|
|
||||||
# 检查标签是否已存在
|
|
||||||
if [[ "$(git tag -l ${tag})" == "${tag}" ]]; then
|
|
||||||
echo "[ERROR] WinBoLL标签${tag}已存在!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 添加带注释的标签(注释来自app_update_description.txt)
|
|
||||||
git tag -a "${tag}" -F "${app_name}/app_update_description.txt"
|
|
||||||
echo "[INFO] WinBoLL标签${tag}添加成功!"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# 添加GitHub Workflows Beta标签(当前逻辑注释,保留扩展能力)
|
|
||||||
# 参数:$1=应用名称(项目根目录名)
|
|
||||||
# 返回值:0=标签添加成功,1=标签已存在/添加失败
|
|
||||||
function addWorkflowsTag() {
|
|
||||||
local app_name=$1
|
|
||||||
local build_prop_path="${app_name}/build.properties"
|
|
||||||
|
|
||||||
# 从build.properties中提取baseBetaVersion
|
|
||||||
local base_beta_version=$(grep -o "baseBetaVersion=.*" "${build_prop_path}" | awk -F '=' '{print $2}')
|
|
||||||
if [[ -z ${base_beta_version} ]]; then
|
|
||||||
echo "[ERROR] 未从${build_prop_path}中提取到baseBetaVersion配置!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo "[INFO] 从${build_prop_path}读取到baseBetaVersion:${base_beta_version}"
|
|
||||||
|
|
||||||
# 构造Workflows标签(格式:<APP_NAME>-v<baseBetaVersion>-beta)
|
|
||||||
local tag="${app_name}-v${base_beta_version}-beta"
|
|
||||||
echo "[INFO] 准备添加Workflows标签:${tag}"
|
|
||||||
|
|
||||||
# 检查标签是否已存在
|
|
||||||
if [[ "$(git tag -l ${tag})" == "${tag}" ]]; then
|
|
||||||
echo "[ERROR] Workflows标签${tag}已存在!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 添加带注释的标签(注释来自app_update_description.txt)
|
|
||||||
git tag -a "${tag}" -F "${app_name}/app_update_description.txt"
|
|
||||||
echo "[INFO] Workflows标签${tag}添加成功!"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==================== 主流程开始 ====================
|
|
||||||
echo "============================================="
|
|
||||||
echo " WinBoLL 应用发布脚本"
|
|
||||||
echo "============================================="
|
|
||||||
|
|
||||||
# 1. 检查应用名称参数是否指定
|
|
||||||
if [ -z "$1" ]; then
|
if [ -z "$1" ]; then
|
||||||
echo "[ERROR] 未指定应用名称!使用方式:${0} <APP_NAME>"
|
echo "No APP name specified : $0"
|
||||||
exit ${EXIT_CODE_ERR_NO_APP_NAME}
|
exit 2
|
||||||
fi
|
|
||||||
APP_NAME=$1
|
|
||||||
echo "[INFO] 待发布应用名称:${APP_NAME}"
|
|
||||||
|
|
||||||
# 2. 检查并切换到项目根目录(确保build.properties存在)
|
|
||||||
echo "[INFO] 当前工作目录:$(pwd)"
|
|
||||||
if [[ ! -e "${APP_NAME}/build.properties" ]]; then
|
|
||||||
echo "[WARNING] 当前目录不存在${APP_NAME}/build.properties,尝试切换到上级目录..."
|
|
||||||
cd ..
|
|
||||||
echo "[INFO] 切换后工作目录:$(pwd)"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 验证最终工作目录是否正确
|
## 定义相关函数
|
||||||
if [[ ! -e "${APP_NAME}/build.properties" ]]; then
|
## 检查 Git 源码是否完全提交了,完全提交就返回0
|
||||||
echo "[ERROR] 工作目录错误!${APP_NAME}/build.properties 文件不存在。"
|
function checkGitSources {
|
||||||
exit ${EXIT_CODE_ERR_WORK_DIR}
|
#local input="$1"
|
||||||
fi
|
#echo "The string is: $input"
|
||||||
echo "[INFO] 工作目录验证通过:${APP_NAME}/build.properties 存在。"
|
git config --global --add safe.directory `pwd`
|
||||||
|
if [[ -n $(git diff --stat) ]]
|
||||||
|
then
|
||||||
|
local result="Source is no commit completely."
|
||||||
|
echo $result
|
||||||
|
# 脚本调试时使用
|
||||||
|
#return 0
|
||||||
|
# 正式检查源码时使用
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local result="Git Source Check OK."
|
||||||
|
echo $result
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# 3. 检查Git源码状态
|
function askAddWorkflowsTag {
|
||||||
echo "---------------------------------------------"
|
read answer
|
||||||
echo " 步骤1:检查Git源码状态"
|
if [[ $answer =~ ^[Yy]$ ]]; then
|
||||||
echo "---------------------------------------------"
|
#echo "You chose yes."
|
||||||
checkGitSources
|
return 1
|
||||||
if [[ $? -ne ${EXIT_CODE_SUCCESS} ]]; then
|
else
|
||||||
echo "[ERROR] Git源码检查失败,脚本终止!"
|
#echo "You chose no."
|
||||||
exit ${EXIT_CODE_ERR_GIT_CHECK}
|
return 0
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# 4. 编译Stage Release版本APK
|
function addWinBoLLTag {
|
||||||
echo "---------------------------------------------"
|
# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。
|
||||||
echo " 步骤2:编译Stage Release APK"
|
# 如果文件中有 publishVersion 这一项,
|
||||||
echo "---------------------------------------------"
|
# 使用grep找到包含"publishVersion="的那一行,然后用awk提取其后的值
|
||||||
echo "[INFO] 开始执行Gradle任务:${GRADLE_TASK_PUBLISH}"
|
PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}')
|
||||||
# 调试用(注释正式任务,启用调试任务)
|
echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >"
|
||||||
# bash gradlew :${APP_NAME}:${GRADLE_TASK_DEBUG}
|
## 设新的 WinBoLL 标签
|
||||||
bash gradlew :${APP_NAME}:${GRADLE_TASK_PUBLISH}
|
# 脚本调试时使用
|
||||||
|
#tag="projectname-v7.6.4-test1"
|
||||||
|
# 正式设置标签时使用
|
||||||
|
tag=$1"-v"${PUBLISH_VERSION}
|
||||||
|
echo "< WinBoLL Tag To: $tag >";
|
||||||
|
# 检查是否已经添加了 WinBoLL Tag
|
||||||
|
if [ "$(git tag -l ${tag})" == "${tag}" ]; then
|
||||||
|
echo -e "< WinBoLL Tag ${tag} exist! >"
|
||||||
|
return 1 # WinBoLL标签重复
|
||||||
|
fi
|
||||||
|
# 添加WinBoLL标签
|
||||||
|
git tag -a ${tag} -F $1/app_update_description.txt
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
if [[ $? -ne ${EXIT_CODE_SUCCESS} ]]; then
|
function addWorkflowsTag {
|
||||||
echo "[ERROR] Gradle编译任务失败!"
|
# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 baseBetaVersion。
|
||||||
exit 1
|
# 如果文件中有 baseBetaVersion 这一项,
|
||||||
fi
|
# 使用grep找到包含"baseBetaVersion="的那一行,然后用awk提取其后的值
|
||||||
echo "[INFO] Stage Release APK编译成功!"
|
BASE_BETA_VERSION=$(grep -o "baseBetaVersion=.*" $1/build.properties | awk -F '=' '{print $2}')
|
||||||
|
echo "< $1/build.properties baseBetaVersion : ${BASE_BETA_VERSION} >"
|
||||||
|
## 设新的 workflows 标签
|
||||||
|
# 脚本调试时使用
|
||||||
|
#tag="projectname-v7.6.4-beta"
|
||||||
|
# 正式设置标签时使用
|
||||||
|
tag=$1"-v"${BASE_BETA_VERSION}-beta
|
||||||
|
echo "< Workflows Tag To: $tag >";
|
||||||
|
# 检查是否已经添加了工作流 Tag
|
||||||
|
if [ "$(git tag -l ${tag})" == "${tag}" ]; then
|
||||||
|
echo -e "< Github Workflows Tag ${tag} exist! >"
|
||||||
|
return 1 # 工作流标签重复
|
||||||
|
fi
|
||||||
|
# 添加工作流标签
|
||||||
|
git tag -a ${tag} -F $1/app_update_description.txt
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# 5. 添加WinBoLL正式标签
|
## 开始执行脚本
|
||||||
echo "---------------------------------------------"
|
echo -e "Current dir : \n"`pwd`
|
||||||
echo " 步骤3:添加WinBoLL标签"
|
# 检查当前目录是否是项目根目录
|
||||||
echo "---------------------------------------------"
|
if [[ -e $1/build.properties ]]; then
|
||||||
addWinBoLLTag ${APP_NAME}
|
echo "The $1/build.properties file exists."
|
||||||
if [[ $? -ne ${EXIT_CODE_SUCCESS} ]]; then
|
echo -e "Work dir correctly."
|
||||||
echo "[ERROR] WinBoLL标签添加失败,脚本终止!"
|
|
||||||
exit ${EXIT_CODE_ERR_ADD_WINBOLL_TAG}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 6. (可选)添加GitHub Workflows标签(当前逻辑注释,保留扩展能力)
|
|
||||||
# echo "---------------------------------------------"
|
|
||||||
# echo " 步骤4:添加Workflows标签(可选)"
|
|
||||||
# echo "---------------------------------------------"
|
|
||||||
# echo "是否添加GitHub Workflows Beta标签?(Y/n) "
|
|
||||||
# askAddWorkflowsTag
|
|
||||||
# nAskAddWorkflowsTag=$?
|
|
||||||
# if [[ ${nAskAddWorkflowsTag} -eq 1 ]]; then
|
|
||||||
# addWorkflowsTag ${APP_NAME}
|
|
||||||
# if [[ $? -ne ${EXIT_CODE_SUCCESS} ]]; then
|
|
||||||
# echo "[ERROR] Workflows标签添加失败,脚本终止!"
|
|
||||||
# exit 1
|
|
||||||
# fi
|
|
||||||
# fi
|
|
||||||
|
|
||||||
# 7. 清理更新描述文件
|
|
||||||
echo "---------------------------------------------"
|
|
||||||
echo " 步骤5:清理更新描述文件"
|
|
||||||
echo "---------------------------------------------"
|
|
||||||
echo "" > "${APP_NAME}/app_update_description.txt"
|
|
||||||
echo "[INFO] 已清空${APP_NAME}/app_update_description.txt"
|
|
||||||
|
|
||||||
# 8. 提交并推送源码与标签
|
|
||||||
echo "---------------------------------------------"
|
|
||||||
echo " 步骤6:提交并推送源码"
|
|
||||||
echo "---------------------------------------------"
|
|
||||||
git add .
|
|
||||||
git commit -m "<${APP_NAME}> 开始新的Stage版本开发。"
|
|
||||||
echo "[INFO] 源码提交成功,开始推送..."
|
|
||||||
|
|
||||||
# 推送源码到远程仓库
|
|
||||||
git push origin
|
|
||||||
# 推送标签到远程仓库
|
|
||||||
git push origin --tags
|
|
||||||
|
|
||||||
if [[ $? -eq ${EXIT_CODE_SUCCESS} ]]; then
|
|
||||||
echo "[INFO] 源码与标签推送成功!"
|
|
||||||
else
|
else
|
||||||
echo "[ERROR] 源码与标签推送失败!"
|
echo "The $1/build.properties file does not exist."
|
||||||
|
echo "尝试进入根目录"
|
||||||
|
# 进入项目根目录
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
## 本脚本需要在项目根目录下执行
|
||||||
|
echo -e "Current dir : \n"`pwd`
|
||||||
|
# 检查当前目录是否是项目根目录
|
||||||
|
if [[ -e $1/build.properties ]]; then
|
||||||
|
echo "The $1/build.properties file exists."
|
||||||
|
echo -e "Work dir correctly."
|
||||||
|
else
|
||||||
|
echo "The $1/build.properties file does not exist."
|
||||||
|
echo -e "Work dir error."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ==================== 主流程结束 ====================
|
# 检查源码状态
|
||||||
echo "============================================="
|
result=$(checkGitSources)
|
||||||
echo " WinBoLL 应用发布完成!"
|
if [[ $? -eq 0 ]]; then
|
||||||
echo "============================================="
|
echo $result
|
||||||
exit ${EXIT_CODE_SUCCESS}
|
# 如果Git已经提交了所有代码就执行标签和应用发布操作
|
||||||
|
|
||||||
|
# 预先询问是否添加工作流标签
|
||||||
|
#echo "Add Github Workflows Tag? (yes/No)"
|
||||||
|
#result=$(askAddWorkflowsTag)
|
||||||
|
#nAskAddWorkflowsTag=$?
|
||||||
|
#echo $result
|
||||||
|
|
||||||
|
# 发布应用
|
||||||
|
echo "Publishing WinBoLL APK ..."
|
||||||
|
# 脚本调试时使用
|
||||||
|
#bash gradlew :$1:assembleBetaDebug
|
||||||
|
# 正式发布
|
||||||
|
bash gradlew :$1:assembleStageRelease
|
||||||
|
echo "Publishing WinBoLL APK OK."
|
||||||
|
|
||||||
|
# 添加 WinBoLL 标签
|
||||||
|
result=$(addWinBoLLTag $1)
|
||||||
|
echo $result
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
echo $result
|
||||||
|
# WinBoLL 标签添加成功
|
||||||
|
else
|
||||||
|
echo -e "${0}: addWinBoLLTag $1\n${result}\nAdd WinBoLL tag cancel."
|
||||||
|
exit 1 # addWinBoLLTag 异常
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 添加 GitHub 工作流标签
|
||||||
|
#if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
|
||||||
|
# 如果用户选择添加工作流标签
|
||||||
|
#result=$(addWorkflowsTag $1)
|
||||||
|
#if [[ $? -eq 0 ]]; then
|
||||||
|
# echo $result
|
||||||
|
# 工作流标签添加成功
|
||||||
|
#else
|
||||||
|
#echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
|
||||||
|
#exit 1 # addWorkflowsTag 异常
|
||||||
|
#fi
|
||||||
|
#fi
|
||||||
|
|
||||||
|
## 清理更新描述文件内容
|
||||||
|
echo "" > $1/app_update_description.txt
|
||||||
|
|
||||||
|
# 设置新版本开发参数配置
|
||||||
|
# 提交配置
|
||||||
|
git add .
|
||||||
|
git commit -m "<$1>Start New Stage Version."
|
||||||
|
echo "Push sources to git repositories ..."
|
||||||
|
# 推送源码到所有仓库
|
||||||
|
git push origin && git push origin --tags
|
||||||
|
else
|
||||||
|
echo -e "${0}: checkGitSources\n${result}\nShell cancel."
|
||||||
|
exit 1 # checkGitSources 异常
|
||||||
|
fi
|
||||||
|
|||||||
@@ -155,11 +155,3 @@ $ bash gradlew assembleBetaDebug
|
|||||||
$ bash gradlew assembleStageDebug
|
$ bash gradlew assembleStageDebug
|
||||||
|
|
||||||
### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。
|
### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。
|
||||||
|
|
||||||
# 应用版本号命名方式
|
|
||||||
## statge 渠道
|
|
||||||
V<应用开发环境编号><应用功能变更号><应用调试阶段号>
|
|
||||||
如:APPBase_15.7.0
|
|
||||||
## beta 渠道
|
|
||||||
V<应用开发环境编号><应用功能变更号><应用调试阶段号>-beta<调试编译计数>_<调试编译时间(分钟+秒钟)>
|
|
||||||
如:APPBase_15.9.6-beta8_5413
|
|
||||||
|
|||||||
@@ -29,28 +29,15 @@ android {
|
|||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
versionName "15.3"
|
versionName "15.12"
|
||||||
if(true) {
|
if(true) {
|
||||||
versionName = genVersionName("${versionName}")
|
versionName = genVersionName("${versionName}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
minifyEnabled false
|
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
|
||||||
api 'cc.winboll.studio:libaes:15.9.3'
|
|
||||||
api 'cc.winboll.studio:libapputils:15.8.6'
|
|
||||||
api 'cc.winboll.studio:libappbase:15.9.5'
|
|
||||||
|
|
||||||
api 'io.github.medyo:android-about-page:2.0.0'
|
api 'io.github.medyo:android-about-page:2.0.0'
|
||||||
api 'com.github.getActivity:ToastUtils:10.5'
|
|
||||||
api 'com.jcraft:jsch:0.1.55'
|
api 'com.jcraft:jsch:0.1.55'
|
||||||
api 'org.jsoup:jsoup:1.13.1'
|
api 'org.jsoup:jsoup:1.13.1'
|
||||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
@@ -69,4 +56,14 @@ dependencies {
|
|||||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||||
//api 'androidx.fragment:fragment:1.1.0'
|
//api 'androidx.fragment:fragment:1.1.0'
|
||||||
api 'com.google.android.material:material:1.0.0'
|
api 'com.google.android.material:material:1.0.0'
|
||||||
|
|
||||||
|
// WinBoLL库 nexus.winboll.cc 地址
|
||||||
|
//api 'cc.winboll.studio:libaes:15.12.0'
|
||||||
|
//api 'cc.winboll.studio:libappbase:15.12.2'
|
||||||
|
|
||||||
|
// WinBoLL备用库 jitpack.io 地址
|
||||||
|
api 'com.github.ZhanGSKen:AES:aes-v15.12.3'
|
||||||
|
api 'com.github.ZhanGSKen:APPBase:appbase-v15.12.2'
|
||||||
|
|
||||||
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun Sep 28 12:37:31 HKT 2025
|
#Tue Dec 09 11:23:25 HKT 2025
|
||||||
stageCount=10
|
stageCount=1
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.3
|
baseVersion=15.12
|
||||||
publishVersion=15.3.9
|
publishVersion=15.12.0
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.3.10
|
baseBetaVersion=15.12.1
|
||||||
|
|||||||
138
mymessagemanager/proguard-rules.pro
vendored
138
mymessagemanager/proguard-rules.pro
vendored
@@ -9,9 +9,135 @@
|
|||||||
|
|
||||||
# Add any project specific keep options here:
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
# If your project uses WebView with JS, uncomment the following
|
# ============================== 基础通用规则 ==============================
|
||||||
# and specify the fully qualified class name to the JavaScript interface
|
# 保留系统组件
|
||||||
# class:
|
-keep public class * extends android.app.Activity
|
||||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
-keep public class * extends android.app.Service
|
||||||
# public *;
|
-keep public class * extends android.content.BroadcastReceiver
|
||||||
#}
|
-keep public class * extends android.content.ContentProvider
|
||||||
|
-keep public class * extends android.app.backup.BackupAgentHelper
|
||||||
|
-keep public class * extends android.preference.Preference
|
||||||
|
|
||||||
|
# 保留 WinBoLL 核心包及子类(合并简化规则)
|
||||||
|
-keep class cc.winboll.studio.** { *; }
|
||||||
|
-keepclassmembers class cc.winboll.studio.** { *; }
|
||||||
|
|
||||||
|
# 保留所有类中的 public static final String TAG 字段(便于日志定位)
|
||||||
|
-keepclassmembers class * {
|
||||||
|
public static final java.lang.String TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留序列化类(避免Parcelable/Gson解析异常)
|
||||||
|
-keep class * implements android.os.Parcelable {
|
||||||
|
public static final android.os.Parcelable$Creator *;
|
||||||
|
}
|
||||||
|
-keepclassmembers class * implements java.io.Serializable {
|
||||||
|
static final long serialVersionUID;
|
||||||
|
private static final java.io.ObjectStreamField[] serialPersistentFields;
|
||||||
|
private void writeObject(java.io.ObjectOutputStream);
|
||||||
|
private void readObject(java.io.ObjectInputStream);
|
||||||
|
java.lang.Object writeReplace();
|
||||||
|
java.lang.Object readResolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留 R 文件(避免资源ID混淆)
|
||||||
|
-keepclassmembers class **.R$* {
|
||||||
|
public static <fields>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留 native 方法(避免JNI调用失败)
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
native <methods>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留注解和泛型(避免反射/序列化异常)
|
||||||
|
-keepattributes *Annotation*
|
||||||
|
-keepattributes Signature
|
||||||
|
|
||||||
|
# 屏蔽 Java 8+ 警告(适配 Java 7 语法)
|
||||||
|
-dontwarn java.lang.invoke.*
|
||||||
|
-dontwarn android.support.v8.renderscript.*
|
||||||
|
-dontwarn java.util.function.**
|
||||||
|
|
||||||
|
# ============================== 第三方框架专项规则 ==============================
|
||||||
|
# OkHttp 4.4.1(米盟广告请求依赖,完善Lambda兼容)
|
||||||
|
-keep class okhttp3.** { *; }
|
||||||
|
-keep interface okhttp3.** { *; }
|
||||||
|
-keep class okhttp3.internal.** { *; }
|
||||||
|
-keep class okio.** { *; }
|
||||||
|
-dontwarn okhttp3.internal.platform.**
|
||||||
|
-dontwarn okio.**
|
||||||
|
# ============================== 必要补充规则 ==============================
|
||||||
|
# OkHttp 4.4.1 补充规则(Java 7 兼容)
|
||||||
|
-keep class okhttp3.internal.concurrent.** { *; }
|
||||||
|
-keep class okhttp3.internal.connection.** { *; }
|
||||||
|
-dontwarn okhttp3.internal.concurrent.TaskRunner
|
||||||
|
-dontwarn okhttp3.internal.connection.RealCall
|
||||||
|
|
||||||
|
# Glide 4.9.0(米盟广告图片加载依赖)
|
||||||
|
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||||
|
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
||||||
|
-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType {
|
||||||
|
**[] $VALUES;
|
||||||
|
public *;
|
||||||
|
}
|
||||||
|
-keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule {
|
||||||
|
<init>();
|
||||||
|
}
|
||||||
|
-dontwarn com.bumptech.glide.**
|
||||||
|
|
||||||
|
# Gson 2.8.5(米盟广告数据序列化依赖)
|
||||||
|
-keep class com.google.gson.** { *; }
|
||||||
|
-keep interface com.google.gson.** { *; }
|
||||||
|
-keepclassmembers class * {
|
||||||
|
@com.google.gson.annotations.SerializedName <fields>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 米盟 SDK(核心广告组件,完整保留避免加载失败)
|
||||||
|
-keep class com.miui.zeus.** { *; }
|
||||||
|
-keep interface com.miui.zeus.** { *; }
|
||||||
|
# 保留米盟日志字段(便于广告加载失败排查)
|
||||||
|
-keepclassmembers class com.miui.zeus.mimo.sdk.** {
|
||||||
|
public static final java.lang.String TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
# RecyclerView 1.0.0(米盟广告布局渲染依赖)
|
||||||
|
-keep class androidx.recyclerview.** { *; }
|
||||||
|
-keep interface androidx.recyclerview.** { *; }
|
||||||
|
-keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter {
|
||||||
|
public *;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 其他第三方框架(按引入依赖保留,无则可删除)
|
||||||
|
# XXPermissions 18.63
|
||||||
|
-keep class com.hjq.permissions.** { *; }
|
||||||
|
-keep interface com.hjq.permissions.** { *; }
|
||||||
|
|
||||||
|
# ZXing 二维码(核心解析组件)
|
||||||
|
-keep class com.google.zxing.** { *; }
|
||||||
|
-keep class com.journeyapps.zxing.** { *; }
|
||||||
|
|
||||||
|
# Jsoup HTML解析
|
||||||
|
-keep class org.jsoup.** { *; }
|
||||||
|
|
||||||
|
# Pinyin4j 拼音搜索
|
||||||
|
-keep class net.sourceforge.pinyin4j.** { *; }
|
||||||
|
|
||||||
|
# JSch SSH组件
|
||||||
|
-keep class com.jcraft.jsch.** { *; }
|
||||||
|
|
||||||
|
# AndroidX 基础组件
|
||||||
|
-keep class androidx.appcompat.** { *; }
|
||||||
|
-keep interface androidx.appcompat.** { *; }
|
||||||
|
|
||||||
|
# ============================== 优化与调试配置 ==============================
|
||||||
|
# 优化级别(平衡混淆效果与性能)
|
||||||
|
-optimizationpasses 5
|
||||||
|
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
|
||||||
|
|
||||||
|
# 调试辅助(保留行号便于崩溃定位)
|
||||||
|
-verbose
|
||||||
|
-dontpreverify
|
||||||
|
-dontusemixedcaseclassnames
|
||||||
|
-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ package cc.winboll.studio.mymessagemanager;
|
|||||||
*/
|
*/
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
|
|
||||||
public class App extends GlobalApplication {
|
public class App extends GlobalApplication {
|
||||||
|
|
||||||
@@ -29,18 +30,22 @@ public class App extends GlobalApplication {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
setIsDebugging(BuildConfig.DEBUG);
|
||||||
|
|
||||||
|
// 初始化窗口管理类
|
||||||
|
WinBoLLActivityManager.init(this);
|
||||||
|
|
||||||
// 初始化 Toast 框架
|
// 初始化 Toast 框架
|
||||||
ToastUtils.init(this);
|
ToastUtils.init(this);
|
||||||
// 设置 Toast 布局样式
|
|
||||||
ToastUtils.setView(R.layout.toast_custom_view);
|
|
||||||
//ToastUtils.setStyle(new WhiteToastStyle());
|
|
||||||
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
|
|
||||||
|
|
||||||
//LogUtils.d(TAG, "BuildConfig.DEBUG " + Boolean.toString(BuildConfig.DEBUG));
|
|
||||||
|
|
||||||
_mszAppExternalFilesDir = getExternalFilesDir(TAG).toString();
|
_mszAppExternalFilesDir = getExternalFilesDir(TAG).toString();
|
||||||
_mszConfigUtilPath = _mszAppExternalFilesDir + File.separator + _mszConfigUtilFileName;
|
_mszConfigUtilPath = _mszAppExternalFilesDir + File.separator + _mszConfigUtilFileName;
|
||||||
_mszSMSReceiveRuleUtilPath = _mszAppExternalFilesDir + File.separator + _mszSMSReceiveRuleUtilFileName;
|
_mszSMSReceiveRuleUtilPath = _mszAppExternalFilesDir + File.separator + _mszSMSReceiveRuleUtilFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTerminate() {
|
||||||
|
super.onTerminate();
|
||||||
|
ToastUtils.release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,10 @@ import android.os.Bundle;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import cc.winboll.studio.libaes.winboll.APPInfo;
|
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
||||||
import cc.winboll.studio.libaes.winboll.AboutView;
|
import cc.winboll.studio.libaes.models.APPInfo;
|
||||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
|
import cc.winboll.studio.libaes.views.AboutView;
|
||||||
import cc.winboll.studio.mymessagemanager.App;
|
import cc.winboll.studio.mymessagemanager.App;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
|
|
||||||
@@ -64,13 +65,13 @@ public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
|||||||
);
|
);
|
||||||
layout.addView(aboutView, params);
|
layout.addView(aboutView, params);
|
||||||
|
|
||||||
App.getWinBoLLActivityManager().add(this);
|
WinBoLLActivityManager.getInstance().add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
App.getWinBoLLActivityManager().registeRemove(this);
|
WinBoLLActivityManager.getInstance().registeRemove(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AboutView CreateAboutView() {
|
public AboutView CreateAboutView() {
|
||||||
|
|||||||
@@ -12,13 +12,14 @@ import android.view.View;
|
|||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
||||||
import cc.winboll.studio.libaes.views.AToolbar;
|
import cc.winboll.studio.libaes.views.AToolbar;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
|
import cc.winboll.studio.mymessagemanager.activitys.AppSettingsActivity;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
|
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.mymessagemanager.utils.NotificationHelper;
|
||||||
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
import cc.winboll.studio.mymessagemanager.utils.PermissionUtil;
|
||||||
|
|
||||||
public class AppSettingsActivity extends BaseActivity {
|
public class AppSettingsActivity extends BaseActivity {
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ package cc.winboll.studio.mymessagemanager.activitys;
|
|||||||
* @Date 2025/08/30 14:32
|
* @Date 2025/08/30 14:32
|
||||||
* @Describe 联系人查询与短信发送窗口
|
* @Describe 联系人查询与短信发送窗口
|
||||||
*/
|
*/
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
@@ -16,17 +18,13 @@ import android.widget.RelativeLayout;
|
|||||||
import android.widget.SimpleAdapter;
|
import android.widget.SimpleAdapter;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toolbar;
|
import android.widget.Toolbar;
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.PhoneBean;
|
import cc.winboll.studio.mymessagemanager.beans.PhoneBean;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.PhoneUtil;
|
import cc.winboll.studio.mymessagemanager.utils.PhoneUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import cc.winboll.studio.mymessagemanager.views.ConfirmSwitchView;
|
|||||||
import cc.winboll.studio.mymessagemanager.views.PhoneListViewForScrollView;
|
import cc.winboll.studio.mymessagemanager.views.PhoneListViewForScrollView;
|
||||||
import com.baoyz.widget.PullRefreshLayout;
|
import com.baoyz.widget.PullRefreshLayout;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
|
|
||||||
public class MainActivity extends BaseActivity {
|
public class MainActivity extends BaseActivity {
|
||||||
|
|
||||||
@@ -298,7 +299,7 @@ public class MainActivity extends BaseActivity {
|
|||||||
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
} else if (nItemId == R.id.app_log) {
|
} else if (nItemId == R.id.app_log) {
|
||||||
App.getWinBoLLActivityManager().startLogActivity(this);
|
WinBoLLActivityManager.getInstance().startLogActivity(this);
|
||||||
} else if (nItemId == R.id.app_unittest) {
|
} else if (nItemId == R.id.app_unittest) {
|
||||||
Intent i = new Intent(MainActivity.this, UnitTestActivity.class);
|
Intent i = new Intent(MainActivity.this, UnitTestActivity.class);
|
||||||
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import android.view.MenuItem;
|
|||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.activitys.SMSRecycleActivity;
|
import cc.winboll.studio.mymessagemanager.activitys.SMSRecycleActivity;
|
||||||
import cc.winboll.studio.mymessagemanager.adapters.SMSRecycleAdapter;
|
import cc.winboll.studio.mymessagemanager.adapters.SMSRecycleAdapter;
|
||||||
|
|||||||
@@ -7,10 +7,13 @@ import android.text.TextUtils;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import android.widget.Toolbar;
|
import android.widget.Toolbar;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
|
import cc.winboll.studio.mymessagemanager.activitys.SMSReceiveRuleActivity;
|
||||||
|
import cc.winboll.studio.mymessagemanager.activitys.SharedJSONReceiveActivity;
|
||||||
|
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean;
|
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
|
|
||||||
import cc.winboll.studio.mymessagemanager.utils.UriUtil;
|
import cc.winboll.studio.mymessagemanager.utils.UriUtil;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import android.app.Activity;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import cc.winboll.studio.libaes.beans.AESThemeBean;
|
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
||||||
|
import cc.winboll.studio.libaes.models.AESThemeBean;
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
|
||||||
|
|
||||||
public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity {
|
public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import android.widget.EditText;
|
|||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class SMSAcceptRuleArrayAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
public class SMSAcceptRuleArrayAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|||||||
@@ -14,20 +14,20 @@ import android.widget.LinearLayout;
|
|||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
||||||
|
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
|
||||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
|
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.TTSPlayRuleUtil;
|
import cc.winboll.studio.mymessagemanager.utils.TTSPlayRuleUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.views.DateAgoTextView;
|
import cc.winboll.studio.mymessagemanager.views.DateAgoTextView;
|
||||||
import cc.winboll.studio.mymessagemanager.views.SMSView;
|
import cc.winboll.studio.mymessagemanager.views.SMSView;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
|
||||||
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
|
|
||||||
|
|
||||||
public class SMSArrayAdapter extends BaseAdapter {
|
public class SMSArrayAdapter extends BaseAdapter {
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,13 @@ import android.widget.PopupMenu;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSRecycleBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSRecycleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
|
import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
|
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
|
import cc.winboll.studio.mymessagemanager.utils.SMSUtil;
|
||||||
@@ -32,9 +34,7 @@ import cc.winboll.studio.mymessagemanager.utils.TTSPlayRuleUtil;
|
|||||||
import cc.winboll.studio.mymessagemanager.utils.UserVisionSystemProtectModeUtil;
|
import cc.winboll.studio.mymessagemanager.utils.UserVisionSystemProtectModeUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.views.DateAgoTextView;
|
import cc.winboll.studio.mymessagemanager.views.DateAgoTextView;
|
||||||
import cc.winboll.studio.mymessagemanager.views.SMSView;
|
import cc.winboll.studio.mymessagemanager.views.SMSView;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
|
|
||||||
|
|
||||||
public class SMSRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
public class SMSRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
package cc.winboll.studio.mymessagemanager.dialogs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author ZhanGSKen<zhangsken@qq.com>
|
|
||||||
* @Date 2024/05/30 09:53:26
|
|
||||||
* @Describe 用户确定与否选择框
|
|
||||||
*/
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
|
|
||||||
public class YesNoAlertDialog {
|
|
||||||
|
|
||||||
public static final String TAG = "YesNoAlertDialog";
|
|
||||||
|
|
||||||
public static void show(Context context, String szTitle, String szMessage, final OnDialogResultListener listener) {
|
|
||||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
|
|
||||||
context);
|
|
||||||
|
|
||||||
// set title
|
|
||||||
alertDialogBuilder.setTitle(szTitle);
|
|
||||||
|
|
||||||
// set dialog message
|
|
||||||
alertDialogBuilder
|
|
||||||
.setMessage(szMessage)
|
|
||||||
.setCancelable(true)
|
|
||||||
.setOnCancelListener(new DialogInterface.OnCancelListener(){
|
|
||||||
@Override
|
|
||||||
public void onCancel(DialogInterface dialog) {
|
|
||||||
listener.onNo();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setPositiveButton("YES", new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
|
||||||
// if this button is clicked, close
|
|
||||||
// current activity
|
|
||||||
listener.onYes();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setNegativeButton("NO", new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
|
||||||
// if this button is clicked, just close
|
|
||||||
// the dialog box and do nothing
|
|
||||||
dialog.cancel();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// create alert dialog
|
|
||||||
AlertDialog alertDialog = alertDialogBuilder.create();
|
|
||||||
|
|
||||||
// show it
|
|
||||||
alertDialog.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface OnDialogResultListener {
|
|
||||||
abstract void onYes();
|
|
||||||
abstract void onNo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -14,15 +14,14 @@ import android.content.IntentFilter;
|
|||||||
import android.content.ServiceConnection;
|
import android.content.ServiceConnection;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.activitys.MainActivity;
|
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.receivers.SMSRecevier;
|
||||||
import cc.winboll.studio.mymessagemanager.services.MainService;
|
import cc.winboll.studio.mymessagemanager.services.MainService;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
|
import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
|
import cc.winboll.studio.mymessagemanager.utils.NotificationHelper;
|
||||||
import cc.winboll.studio.mymessagemanager.utils.ServiceUtil;
|
import cc.winboll.studio.mymessagemanager.utils.ServiceUtil;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
|
|
||||||
public class MainService extends Service {
|
public class MainService extends Service {
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import android.database.Cursor;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libapputils.utils.RegexPPiUtils;
|
|
||||||
import cc.winboll.studio.mymessagemanager.beans.PhoneBean;
|
import cc.winboll.studio.mymessagemanager.beans.PhoneBean;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package cc.winboll.studio.mymessagemanager.utils;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
|
||||||
|
* @Date 2025/12/09 11:10
|
||||||
|
* @Describe .* 前置预防针
|
||||||
|
* regex pointer preventive injection
|
||||||
|
* 简称 RegexPPi
|
||||||
|
*/
|
||||||
|
public class RegexPPiUtils {
|
||||||
|
|
||||||
|
public static final String TAG = "RegexPPiUtils";
|
||||||
|
|
||||||
|
//
|
||||||
|
// 检验文本是否满足适合正则表达式模式计算
|
||||||
|
//
|
||||||
|
public static boolean isPPiOK(String text) {
|
||||||
|
//String text = "这里是一些任意的文本内容";
|
||||||
|
String regex = ".*";
|
||||||
|
Pattern pattern = Pattern.compile(regex);
|
||||||
|
Matcher matcher = pattern.matcher(text);
|
||||||
|
/*if (matcher.matches()) {
|
||||||
|
System.out.println("文本满足该正则表达式模式");
|
||||||
|
} else {
|
||||||
|
System.out.println("文本不满足该正则表达式模式");
|
||||||
|
}*/
|
||||||
|
return matcher.matches();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,6 @@ package cc.winboll.studio.mymessagemanager.utils;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.JsonReader;
|
import android.util.JsonReader;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libapputils.utils.RegexPPiUtils;
|
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean_V1;
|
import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean_V1;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ import android.provider.Telephony;
|
|||||||
import android.telephony.gsm.SmsManager;
|
import android.telephony.gsm.SmsManager;
|
||||||
import android.telephony.gsm.SmsMessage;
|
import android.telephony.gsm.SmsMessage;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
|
import cc.winboll.studio.mymessagemanager.beans.SMSBean;
|
||||||
import com.hjq.toast.ToastUtils;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class SMSUtil {
|
public class SMSUtil {
|
||||||
|
|||||||
@@ -10,14 +10,15 @@ import android.content.Intent;
|
|||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.util.JsonReader;
|
import android.util.JsonReader;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean;
|
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean_V1;
|
import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean_V1;
|
||||||
import cc.winboll.studio.mymessagemanager.beans.TTSSpeakTextBean;
|
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.mymessagemanager.services.TTSPlayService;
|
||||||
|
import cc.winboll.studio.mymessagemanager.utils.FileUtil;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import android.content.Context;
|
|||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog;
|
|
||||||
|
|
||||||
public class ConfirmSwitchView extends Switch {
|
public class ConfirmSwitchView extends Switch {
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
android:id="@+id/remoteviewLinearLayout1">
|
android:id="@+id/remoteviewLinearLayout1">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Wed Dec 31 20:28:06 HKT 2025
|
#Sun Dec 07 04:17:43 GMT 2025
|
||||||
stageCount=9
|
stageCount=8
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.11
|
baseVersion=15.11
|
||||||
publishVersion=15.11.8
|
publishVersion=15.11.7
|
||||||
buildCount=0
|
buildCount=1
|
||||||
baseBetaVersion=15.11.9
|
baseBetaVersion=15.11.8
|
||||||
|
|||||||
Reference in New Issue
Block a user