From 658ee0b512fb0a64260577683550eb7417b28d15 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Thu, 30 Sep 2021 11:56:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=88=E7=9B=AE=E5=89=8D=EF=BC=9A=E4=B8=AD=E6=96=87=E3=80=81?= =?UTF-8?q?=E8=8B=B1=E6=96=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/auto_build.yml | 79 +++++++++ .gitignore | 1 + README.md | 55 +++--- app/build.gradle | 4 +- app/proguard-rules.pro | 13 ++ app/src/main/AndroidManifest.xml | 9 +- .../idormy/sms/forwarder/AboutActivity.java | 8 +- .../idormy/sms/forwarder/MainActivity.java | 28 ++- .../idormy/sms/forwarder/RefreshListView.java | 6 +- .../idormy/sms/forwarder/RuleActivity.java | 19 +- .../idormy/sms/forwarder/SenderActivity.java | 83 ++++----- app/src/main/res/layout/activity_about.xml | 26 +-- app/src/main/res/layout/activity_main.xml | 10 +- app/src/main/res/layout/activity_rule.xml | 2 +- app/src/main/res/layout/activity_sender.xml | 2 +- app/src/main/res/layout/activity_setting.xml | 57 +++--- .../res/layout/alert_dialog_setview_bark.xml | 4 +- .../layout/alert_dialog_setview_dingding.xml | 10 +- .../res/layout/alert_dialog_setview_email.xml | 16 +- .../layout/alert_dialog_setview_feishu.xml | 6 +- .../layout/alert_dialog_setview_qywxapp.xml | 20 +-- .../alert_dialog_setview_qywxgrouprobot.xml | 4 +- .../res/layout/alert_dialog_setview_rule.xml | 37 ++-- .../layout/alert_dialog_setview_rule_test.xml | 7 +- .../alert_dialog_setview_serverchan.xml | 4 +- .../res/layout/alert_dialog_setview_sms.xml | 10 +- .../layout/alert_dialog_setview_telegram.xml | 6 +- .../layout/alert_dialog_setview_webnotify.xml | 10 +- app/src/main/res/menu/menu_main.xml | 4 +- app/src/main/res/values-en/array.xml | 15 ++ app/src/main/res/values-en/colors.xml | 17 ++ .../res/values-en/ic_launcher_background.xml | 4 + app/src/main/res/values-en/strings.xml | 167 ++++++++++++++++++ app/src/main/res/values-en/styles.xml | 22 +++ app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/strings.xml | 158 +++++++++++++++-- 36 files changed, 678 insertions(+), 251 deletions(-) create mode 100644 .github/workflows/auto_build.yml create mode 100644 app/src/main/res/values-en/array.xml create mode 100644 app/src/main/res/values-en/colors.xml create mode 100644 app/src/main/res/values-en/ic_launcher_background.xml create mode 100644 app/src/main/res/values-en/strings.xml create mode 100644 app/src/main/res/values-en/styles.xml diff --git a/.github/workflows/auto_build.yml b/.github/workflows/auto_build.yml new file mode 100644 index 00000000..a3561ee6 --- /dev/null +++ b/.github/workflows/auto_build.yml @@ -0,0 +1,79 @@ +name: Android CI + +# 触发器 +on: + push: + tags: + - v* + pull_request: + tags: + - v* + +jobs: + build: + + runs-on: ubuntu-latest + # if: github.event.repository.owner.id == github.event.sender.id + + # 设置jdk环境为1.8 + steps: + - uses: actions/checkout@v2 + - name: set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + # ref: dev + # 获取打包秘钥 + - name: Checkout Android Keystore + uses: actions/checkout@v2 + with: + repository: pppscn/keystore + token: ${{ secrets.TOKEN }} # 连接仓库的token,需要单独配置 + path: keystore # 仓库的根目录名 + # 打包release + - name: Build with Gradle + run: bash ./gradlew assembleRelease + # 创建release + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + #GitHub 会自动创建 GITHUB_TOKEN 密码以在工作流程中使用。 + #您可以使用 GITHUB_TOKEN 在工作流程运行中进行身份验证。 + #当您启用 GitHub Actions 时,GitHub 在您的仓库中安装 GitHub 应用程序。 + #GITHUB_TOKEN 密码是一种 GitHub 应用程序 安装访问令牌。 + #您可以使用安装访问令牌代表仓库中安装的 GitHub 应用程序 进行身份验证。 + #令牌的权限仅限于包含您的工作流程的仓库。 更多信息请参阅“GITHUB_TOKEN 的权限”。 + #在每个作业开始之前, GitHub 将为作业提取安装访问令牌。 令牌在作业完成后过期。 + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false + # 获取apk版本号 + - name: Get Version Name + uses: actions/github-script@v3 + id: get-version + with: + script: | + const str=process.env.GITHUB_REF; + return str.substring(str.indexOf("v")); + result-encoding: string + # 上传至release的资源 + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # 上传网址,无需改动 + asset_path: app/build/outputs/apk/release/app-release.apk # 上传路径 + asset_name: SmsForwarder-${{steps.get-version.outputs.result}}.apk # 资源名 + asset_content_type: application/vnd.android.package-archiv #资源类型 + # 存档打包的文件 + - name: Archive production artifacts + uses: actions/upload-artifact@v2 + with: + name: build + path: app/build/outputs #将打包之后的文件全部上传(里面会有混淆的map文件) diff --git a/.gitignore b/.gitignore index e98267e5..52a04b14 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ gradle.properties /psd /keystore/keystore.properties /app/release +/keystore diff --git a/README.md b/README.md index 743b8950..5bf16114 100644 --- a/README.md +++ b/README.md @@ -57,11 +57,12 @@ - [x] 支持标注卡槽号码(优先使用)、设备信息;自定义转发信息模版 - [x] 支持正则匹配规则 - [x] 支持卡槽匹配规则 -- [x] 来电提醒转发 +- [x] 转发未接来电提醒 - [x] 接口请求失败后延时重试5次(可配置间隔时间) - [x] 转发到飞书机器人 - [x] 自定义 Scheme(forwarder://main)用于唤起App - [x] 低电量预警 +- [x] 多语言支持(目前:中文、英文) ### 使用流程: @@ -192,32 +193,32 @@ ## 更新记录:(PS.点击版本号下载对应的版本) -+ [v1.0.0](app/release/SmsForwarder_release_20210213_1.0.0.apk) 优化后第一版 -+ [v1.1.0](app/release/SmsForwarder_release_20210214_1.1.0.apk) 新增在线升级、缓存清理、加入QQ群功能 - + [v1.1.1](app/release/SmsForwarder_release_20210215_1.1.1.apk) 更新应用/通知栏图标 - + [v1.1.2](app/release/SmsForwarder_release_20210218_1.1.2.apk) 获取系统(ROM)类别及版本号,MIUI通知栏显示标题 - + [v1.1.3](app/release/SmsForwarder_release_20210218_1.1.3.apk) AlertDialog增加滚动条,避免参数过长时无法点击按钮 -+ [v1.2.0](app/release/SmsForwarder_release_20210219_1.2.0.apk) 重写SMTP邮件发送(推荐升级) - + [v1.2.1](app/release/SmsForwarder_release_20210226_1.2.1.apk) 修复bark-server升级到2.0后的兼容性问题 - + [v1.2.2](app/release/SmsForwarder_release_20210302_1.2.2.apk) 【预发布】短信模板增加卡槽标识(SIM1_中国联通_Unknown 或 SIM2_中国移动_+8615866666666) - + [v1.2.3](app/release/SmsForwarder_release_20210302_1.2.3.apk) 【预发布】转发日志列表/详情增加卡槽标识(SIM1 或 SIM2) -+ [v1.3.0](app/release/SmsForwarder_release_20210303_1.3.0.apk) 支持双卡手机,增加卡槽标识/运营商/手机号(如果能获取的话) -+ [v1.4.0](app/release/SmsForwarder_release_20210304_1.4.0.apk) 支持多重匹配规则 - + [v1.4.1](app/release/SmsForwarder_release_20210304_1.4.1.apk) 设置中允许关闭页面帮助/表单填写提示 -+ [v1.5.0](app/release/SmsForwarder_release_20210305_1.5.0.apk) 新增转发到企业微信应用消息 - + [v1.5.1](app/release/SmsForwarder_release_20210310_1.5.1.apk) 解决Android 9.xx、10.xx收不到广播问题 - + [v1.5.2](app/release/SmsForwarder_release_20210311_1.5.2.apk) 支持标注卡槽号码(优先使用)、设备信息;自定义转发信息模版 -+ [v1.6.0](app/release/SmsForwarder_release_20210312_1.6.0.apk) 优化获取SIM信息(兼容高版本Android) & 自动填写设备备注 & 自动填充卡槽信息到SIM1备注/SIM2备注 & 支持卡槽匹配规则 & 支持正则匹配规则 - + [v1.6.1](app/release/SmsForwarder_release_20210312_1.6.1.apk) 新增转发到Server酱·Turbo版 - + [v1.6.2](app/release/SmsForwarder_release_20210312_1.6.2.apk) 新增转发到Telegram机器人 - + [v1.6.3](app/release/SmsForwarder_release_20210313_1.6.3.apk) 转发到webhook支持GET方式(节点改变,原配置要重新编辑);兼容Android5.0(待验证,仅minSdkVersion改为21);修复钉钉机器人没启用加签时url拼接错误问题 - + [v1.6.4](app/release/SmsForwarder_release_20210313_1.6.4.apk) Android8.1以下手机重启后尝试启动主界面,以便动态获取权限(修复开机自启后无法转发短信,要打开软件后才会转发短信的问题) -+ [v1.7.0](app/release/SmsForwarder_release_20210318_1.7.0.apk) 新增转发到其他手机短信 & 避免热插卡时FC & 规则展示优化 & 获取多卡信息&获取卡槽备注优化 & 新增恢复初始化配置 - + [v1.7.1](app/release/SmsForwarder_release_20210321_1.7.1.apk) 新增转发记录的转发状态(成功/失败&应答信息) - + [v1.7.2](app/release/SmsForwarder_release_20210325_1.7.2.apk) 新增V1版证书签名,避免部分低版本系统(Android 6.x)无证书错误 & 发送方邮箱允许自定义发件人昵称 - + [v1.7.3](app/release/SmsForwarder_release_20210331_1.7.3.apk) 修复“设置匹配模式”默认选择BUG & 转发到webhook时返回http状态200即为成功 & 转发到其他手机短信支持长短信合并 - + [v1.7.4](app/release/SmsForwarder_release_20210715_1.7.4.apk) 修复转发企业微信群机器人碰到"被截断问题 & 转发到webhook时忽略ssl证书校验(提高自建服务端兼容性) & 转发telegram时将 # 替换为 井,避免被当作标签 & 隐私保护,发送方设置中敏感信息(密码/token/secret等)用星号显示 & 更新友盟基础组件库 & 解决“设置页面关闭卡槽信息,同时使用默认模板时,发送消息卡槽信息仍显示” -+ [v2.0.0](app/release/SmsForwarder_release_20210930_2.0.0.apk) 来电提醒转发 & 接口请求失败后延时重试5次(可配置间隔时间) & 转发到飞书机器人 & 自定义 Scheme(forwarder://main)用于唤起App & 低电量预警 & 重新梳理代码(消灭waring)& Bark增加支持分组 & 引入Lombok & 升级gradle版本 & 增加电池优化白名单设置和权限 & 转发到webhook增加支持自定义post数据,并支持Json数据提交 ++ [v1.0.0] 优化后第一版 ++ [v1.1.0] 新增在线升级、缓存清理、加入QQ群功能 + + [v1.1.1] 更新应用/通知栏图标 + + [v1.1.2] 获取系统(ROM)类别及版本号,MIUI通知栏显示标题 + + [v1.1.3] AlertDialog增加滚动条,避免参数过长时无法点击按钮 ++ [v1.2.0] 重写SMTP邮件发送(推荐升级) + + [v1.2.1] 修复bark-server升级到2.0后的兼容性问题 + + [v1.2.2] 【预发布】短信模板增加卡槽标识(SIM1_中国联通_Unknown 或 SIM2_中国移动_+8615866666666) + + [v1.2.3] 【预发布】转发日志列表/详情增加卡槽标识(SIM1 或 SIM2) ++ [v1.3.0] 支持双卡手机,增加卡槽标识/运营商/手机号(如果能获取的话) ++ [v1.4.0] 支持多重匹配规则 + + [v1.4.1] 设置中允许关闭页面帮助/表单填写提示 ++ [v1.5.0] 新增转发到企业微信应用消息 + + [v1.5.1] 解决Android 9.xx、10.xx收不到广播问题 + + [v1.5.2] 支持标注卡槽号码(优先使用)、设备信息;自定义转发信息模版 ++ [v1.6.0] 优化获取SIM信息(兼容高版本Android) & 自动填写设备备注 & 自动填充卡槽信息到SIM1备注/SIM2备注 & 支持卡槽匹配规则 & 支持正则匹配规则 + + [v1.6.1] 新增转发到Server酱·Turbo版 + + [v1.6.2] 新增转发到Telegram机器人 + + [v1.6.3] 转发到webhook支持GET方式(节点改变,原配置要重新编辑);兼容Android5.0(待验证,仅minSdkVersion改为21);修复钉钉机器人没启用加签时url拼接错误问题 + + [v1.6.4] Android8.1以下手机重启后尝试启动主界面,以便动态获取权限(修复开机自启后无法转发短信,要打开软件后才会转发短信的问题) ++ [v1.7.0] 新增转发到其他手机短信 & 避免热插卡时FC & 规则展示优化 & 获取多卡信息&获取卡槽备注优化 & 新增恢复初始化配置 + + [v1.7.1] 新增转发记录的转发状态(成功/失败&应答信息) + + [v1.7.2] 新增V1版证书签名,避免部分低版本系统(Android 6.x)无证书错误 & 发送方邮箱允许自定义发件人昵称 + + [v1.7.3] 修复“设置匹配模式”默认选择BUG & 转发到webhook时返回http状态200即为成功 & 转发到其他手机短信支持长短信合并 + + [v1.7.4] 修复转发企业微信群机器人碰到"被截断问题 & 转发到webhook时忽略ssl证书校验(提高自建服务端兼容性) & 转发telegram时将 # 替换为 井,避免被当作标签 & 隐私保护,发送方设置中敏感信息(密码/token/secret等)用星号显示 & 更新友盟基础组件库 & 解决“设置页面关闭卡槽信息,同时使用默认模板时,发送消息卡槽信息仍显示” ++ [v2.0.0] 来电提醒转发 & 接口请求失败后延时重试5次(可配置间隔时间)& 转发到飞书机器人 & 自定义 Scheme(forwarder://main)用于唤起App & 低电量预警 & 重新梳理代码(消灭waring)& Bark增加支持分组 & 引入Lombok & 升级gradle版本 & 增加电池优化白名单设置和权限 & 转发到webhook增加支持自定义post数据,并支持Json数据提交 -------- diff --git a/app/build.gradle b/app/build.gradle index a50e455b..5172cac9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,7 +58,7 @@ android { } } //apk file name - android.applicationVariants.all { variant -> + /*android.applicationVariants.all { variant -> variant.outputs.all { //def date = new Date().format("yyyyMMdd" , TimeZone.getTimeZone("Asia/Shanghai")) def date = new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+08")) @@ -69,7 +69,7 @@ android { outputFileName = "SmsForwarder_release_${date}_${versionName}.apk" } } - } + }*/ } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index fe3bab2e..8618a2fb 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -19,6 +19,7 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile + -keep class com.idormy.sms.forwarder.model.**{*;} -keep class com.umeng.** {*;} -keepclassmembers class * { @@ -28,3 +29,15 @@ public static **[] values(); public static ** valueOf(java.lang.String); } + +-dontwarn com.sun.** +-dontwarn javax.mail.** +-dontwarn javax.activation.** +-keep class com.sun.** { *;} +-keep class javax.mail.** { *;} +-keep class javax.activation.** { *;} +-keep class com.smailnet.emailkit.** { *;} + +-keep class com.xuexiang.xupdate.entity.** { *; } +-keep class com.xuexiang.xupdatedemo.entity.** { *; } + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 423e295d..3c9a6d17 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -61,7 +61,7 @@ + android:label="@string/about"> + android:label="@string/setting" /> + android:label="@string/rule_setting" /> + android:label="@string/sender_setting" /> - \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/AboutActivity.java b/app/src/main/java/com/idormy/sms/forwarder/AboutActivity.java index 1066fc7a..03e60bb0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/AboutActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/AboutActivity.java @@ -63,14 +63,14 @@ public class AboutActivity extends AppCompatActivity { @Override public void onBeforeCheck() { super.onBeforeCheck(); - Toast.makeText(AboutActivity.this, "查询中...", Toast.LENGTH_LONG).show(); + Toast.makeText(AboutActivity.this, R.string.checking, Toast.LENGTH_LONG).show(); } @Override public void noNewVersion(Throwable throwable) { super.noNewVersion(throwable); // 没有最新版本的处理 - Toast.makeText(AboutActivity.this, "已是最新版本!", Toast.LENGTH_LONG).show(); + Toast.makeText(AboutActivity.this, R.string.up_to_date, Toast.LENGTH_LONG).show(); } }) .update(); @@ -94,7 +94,7 @@ public class AboutActivity extends AppCompatActivity { } catch (Exception e) { e.printStackTrace(); } - Toast.makeText(AboutActivity.this, "缓存清理完成", Toast.LENGTH_LONG).show(); + Toast.makeText(AboutActivity.this, R.string.cache_purged, Toast.LENGTH_LONG).show(); }); Button join_qq_group1 = findViewById(R.id.join_qq_group1); @@ -150,7 +150,7 @@ public class AboutActivity extends AppCompatActivity { startActivity(intent); } catch (Exception e) { // 未安装手Q或安装的版本不支持 - Toast.makeText(AboutActivity.this, "未安装手Q或安装的版本不支持!", Toast.LENGTH_LONG).show(); + Toast.makeText(AboutActivity.this, R.string.unknown_qq_version, Toast.LENGTH_LONG).show(); } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java index f7b30189..abd4c590 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java @@ -83,21 +83,21 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I //定义AlertDialog.Builder对象,当长按列表项的时候弹出确认删除对话框 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); - builder.setMessage("确定删除?"); - builder.setTitle("提示"); + builder.setTitle(R.string.delete_log_title); + builder.setMessage(R.string.delete_log_tips); //添加AlertDialog.Builder对象的setPositiveButton()方法 - builder.setPositiveButton("确定", (dialog, which) -> { + builder.setPositiveButton(R.string.confirm, (dialog, which) -> { Long id1 = logVos.get(position - 1).getId(); Log.d(TAG, "id = " + id1); LogUtil.delLog(id1, null); initTLogs(); //初始化数据 showList(logVos); - Toast.makeText(getBaseContext(), "删除列表项", Toast.LENGTH_SHORT).show(); + Toast.makeText(getBaseContext(), R.string.delete_log_toast, Toast.LENGTH_SHORT).show(); }); //添加AlertDialog.Builder对象的setNegativeButton()方法 - builder.setNegativeButton("取消", (dialog, which) -> { + builder.setNegativeButton(R.string.cancel, (dialog, which) -> { }); builder.create().show(); @@ -151,29 +151,21 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I public void logDetail(LogVo logVo) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); - builder.setTitle("详情"); + builder.setTitle(R.string.details); String simInfo = logVo.getSimInfo(); if (simInfo != null) { builder.setMessage(logVo.getFrom() + "\n\n" + logVo.getContent() + "\n\n" + logVo.getSimInfo() + "\n\n" + logVo.getRule() + "\n\n" + aUtil.utc2Local(logVo.getTime()) + "\n\nResponse:" + logVo.getForwardResponse()); } else { builder.setMessage(logVo.getFrom() + "\n\n" + logVo.getContent() + "\n\n" + logVo.getRule() + "\n\n" + aUtil.utc2Local(logVo.getTime()) + "\n\nResponse:" + logVo.getForwardResponse()); } - //重发 - /*builder.setPositiveButton("重发", (dialog, which) -> { - Long id = logVo.getId(); - Log.d(TAG, "id = " + id); - Log.d(TAG, logVo.toString()); - Toast.makeText(MainActivity.this, "你确定要重发吗?", Toast.LENGTH_SHORT).show(); - dialog.dismiss(); - });*/ //删除 - builder.setNegativeButton("删除", (dialog, which) -> { + builder.setNegativeButton(R.string.del, (dialog, which) -> { Long id = logVo.getId(); Log.d(TAG, "id = " + id); LogUtil.delLog(id, null); initTLogs(); //初始化数据 showList(logVos); - Toast.makeText(MainActivity.this, "已删除该条记录", Toast.LENGTH_SHORT).show(); + Toast.makeText(MainActivity.this, R.string.delete_log_toast, Toast.LENGTH_SHORT).show(); dialog.dismiss(); }); builder.show(); @@ -201,8 +193,8 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I public void cleanLog(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); - builder.setTitle("确定要清空转发记录吗?") - .setPositiveButton("清空", (dialog, which) -> { + builder.setTitle(R.string.clear_logs_tips) + .setPositiveButton(R.string.confirm, (dialog, which) -> { // TODO Auto-generated method stub LogUtil.delLog(null, null); initTLogs(); diff --git a/app/src/main/java/com/idormy/sms/forwarder/RefreshListView.java b/app/src/main/java/com/idormy/sms/forwarder/RefreshListView.java index c84e3e89..74d37928 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/RefreshListView.java +++ b/app/src/main/java/com/idormy/sms/forwarder/RefreshListView.java @@ -217,14 +217,14 @@ public class RefreshListView extends ListView implements AbsListView.OnScrollLis case PULL: arrow.setVisibility(View.VISIBLE); progress.setVisibility(View.GONE); - tip.setText("下拉可以刷新!"); + tip.setText(R.string.pull_tips); arrow.clearAnimation(); arrow.setAnimation(anim1); break; case RELEASE: arrow.setVisibility(View.VISIBLE); progress.setVisibility(View.GONE); - tip.setText("松开可以刷新!"); + tip.setText(R.string.release_tips); arrow.clearAnimation(); arrow.setAnimation(anim); break; @@ -232,7 +232,7 @@ public class RefreshListView extends ListView implements AbsListView.OnScrollLis topPadding(50); arrow.setVisibility(View.GONE); progress.setVisibility(View.VISIBLE); - tip.setText("正在刷新..."); + tip.setText(R.string.reflashing_tips); arrow.clearAnimation(); break; } diff --git a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java index d9357510..2f5dcfa6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java @@ -88,20 +88,19 @@ public class RuleActivity extends AppCompatActivity { listView.setOnItemLongClickListener((parent, view, position, id) -> { //定义AlertDialog.Builder对象,当长按列表项的时候弹出确认删除对话框 AlertDialog.Builder builder = new AlertDialog.Builder(RuleActivity.this); - - builder.setMessage("确定删除?"); - builder.setTitle("提示"); + builder.setTitle(R.string.delete_rule_title); + builder.setMessage(R.string.delete_rule_tips); //添加AlertDialog.Builder对象的setPositiveButton()方法 - builder.setPositiveButton("确定", (dialog, which) -> { + builder.setPositiveButton(R.string.confirm, (dialog, which) -> { RuleUtil.delRule(ruleModels.get(position).getId()); initRules(); adapter.del(ruleModels); - Toast.makeText(getBaseContext(), "删除列表项", Toast.LENGTH_SHORT).show(); + Toast.makeText(getBaseContext(), R.string.delete_rule_toast, Toast.LENGTH_SHORT).show(); }); //添加AlertDialog.Builder对象的setNegativeButton()方法 - builder.setNegativeButton("取消", (dialog, which) -> { + builder.setNegativeButton(R.string.cancel, (dialog, which) -> { }); @@ -219,7 +218,7 @@ public class RuleActivity extends AppCompatActivity { buttonRuleTest.setOnClickListener(view -> { Object senderId = ruleSenderTv.getTag(); if (senderId == null) { - Toast.makeText(RuleActivity.this, "请先创建选择发送方", Toast.LENGTH_LONG).show(); + Toast.makeText(RuleActivity.this, R.string.new_sender_first, Toast.LENGTH_LONG).show(); } else { int radioGroupRuleCheckId = Math.max(radioGroupRuleCheck.getCheckedRadioButtonId(), radioGroupRuleCheck2.getCheckedRadioButtonId()); if (ruleModel == null) { @@ -331,7 +330,7 @@ public class RuleActivity extends AppCompatActivity { public void selectSender(final TextView showTv) { final List senderModels = SenderUtil.getSender(null, null); if (senderModels.isEmpty()) { - Toast.makeText(RuleActivity.this, "请先去设置发送方页面添加", Toast.LENGTH_SHORT).show(); + Toast.makeText(RuleActivity.this, R.string.add_sender_first, Toast.LENGTH_SHORT).show(); return; } final CharSequence[] senderNames = new CharSequence[senderModels.size()]; @@ -339,7 +338,7 @@ public class RuleActivity extends AppCompatActivity { senderNames[i] = senderModels.get(i).getName(); } AlertDialog.Builder builder = new AlertDialog.Builder(RuleActivity.this); - builder.setTitle("选择发送方"); + builder.setTitle(R.string.select_sender); //添加列表 builder.setItems(senderNames, (dialogInterface, which) -> { Toast.makeText(RuleActivity.this, senderNames[which], Toast.LENGTH_LONG).show(); @@ -356,7 +355,7 @@ public class RuleActivity extends AppCompatActivity { final EditText editTextTestMsgContent = view.findViewById(R.id.editTextTestMsgContent); Button buttonRuleTest = view.findViewById(R.id.buttonRuleTest); AlertDialog.Builder ad1 = new AlertDialog.Builder(RuleActivity.this); - ad1.setTitle("测试规则"); + ad1.setTitle(R.string.rule_tester); ad1.setIcon(android.R.drawable.ic_dialog_email); ad1.setView(view); buttonRuleTest.setOnClickListener(v -> { diff --git a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java index 5a751973..c2d0cfb0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java @@ -143,7 +143,7 @@ public class SenderActivity extends AppCompatActivity { setFeiShu(senderModel); break; default: - Toast.makeText(SenderActivity.this, "异常的发送方类型,自动删除!", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_sender, Toast.LENGTH_LONG).show(); SenderUtil.delSender(senderModel.getId()); initSenders(); adapter.del(senderModels); @@ -155,20 +155,19 @@ public class SenderActivity extends AppCompatActivity { listView.setOnItemLongClickListener((parent, view, position, id) -> { //定义AlertDialog.Builder对象,当长按列表项的时候弹出确认删除对话框 AlertDialog.Builder builder = new AlertDialog.Builder(SenderActivity.this); - - builder.setMessage("确定删除?"); - builder.setTitle("提示"); + builder.setTitle(R.string.delete_sender_title); + builder.setMessage(R.string.delete_sender_tips); //添加AlertDialog.Builder对象的setPositiveButton()方法 - builder.setPositiveButton("确定", (dialog, which) -> { + builder.setPositiveButton(R.string.confirm, (dialog, which) -> { SenderUtil.delSender(senderModels.get(position).getId()); initSenders(); adapter.del(senderModels); - Toast.makeText(getBaseContext(), "删除列表项", Toast.LENGTH_SHORT).show(); + Toast.makeText(getBaseContext(), R.string.delete_sender_toast, Toast.LENGTH_SHORT).show(); }); //添加AlertDialog.Builder对象的setNegativeButton()方法 - builder.setNegativeButton("取消", (dialog, which) -> { + builder.setNegativeButton(R.string.cancel, (dialog, which) -> { }); @@ -184,7 +183,7 @@ public class SenderActivity extends AppCompatActivity { public void addSender(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(SenderActivity.this); - builder.setTitle("选择发送方类型"); + builder.setTitle(R.string.add_sender_title); //添加列表 builder.setItems(R.array.add_sender_menu, (dialogInterface, which) -> { switch (which) { @@ -219,7 +218,7 @@ public class SenderActivity extends AppCompatActivity { setFeiShu(null); break; default: - Toast.makeText(SenderActivity.this, "暂不支持这种转发!", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.not_supported, Toast.LENGTH_LONG).show(); break; } }); @@ -282,7 +281,6 @@ public class SenderActivity extends AppCompatActivity { SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); -// adapter.add(newSenderModel); } else { senderModel.setName(editTextDingdingName.getText().toString()); senderModel.setType(TYPE_DINGDING); @@ -296,7 +294,6 @@ public class SenderActivity extends AppCompatActivity { SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); -// adapter.update(senderModel,position); } @@ -309,8 +306,6 @@ public class SenderActivity extends AppCompatActivity { SenderUtil.delSender(senderModel.getId()); initSenders(); adapter.del(senderModels); -// adapter.del(position); - } show.dismiss(); }); @@ -321,13 +316,13 @@ public class SenderActivity extends AppCompatActivity { Boolean atAll = switchDingdingAtAll.isChecked(); if (!token.isEmpty()) { try { - SenderDingdingMsg.sendMsg(0, handler, token, secret, atMobiles, atAll, "测试内容(content)@" + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + SenderDingdingMsg.sendMsg(0, handler, token, secret, atMobiles, atAll, R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "token 不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show(); } }); } @@ -441,13 +436,13 @@ public class SenderActivity extends AppCompatActivity { if (!host.isEmpty() && !port.isEmpty() && !fromEmail.isEmpty() && !pwd.isEmpty() && !toEmail.isEmpty()) { try { - SenderMailMsg.sendEmail(0, handler, host, port, ssl, fromEmail, nickname, pwd, toEmail, "SmsForwarder Title", "测试内容(content)@" + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + SenderMailMsg.sendEmail(0, handler, host, port, ssl, fromEmail, nickname, pwd, toEmail, "SmsForwarder Title", R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "邮箱参数不完整", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_email, Toast.LENGTH_LONG).show(); } }); } @@ -523,13 +518,13 @@ public class SenderActivity extends AppCompatActivity { String barkServer = editTextBarkServer.getText().toString(); if (!barkServer.isEmpty()) { try { - SenderBarkMsg.sendMsg(0, handler, barkServer, "19999999999", "【京东】验证码为387481(切勿将验证码告知他人),请在页面中输入完成验证,如有问题请点击 ihelp.jd.com 联系京东客服", "测试分组"); + SenderBarkMsg.sendMsg(0, handler, barkServer, getString(R.string.test_phone_num), getString(R.string.test_sms), getString(R.string.test_group_name)); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "bark-server 不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_bark_server, Toast.LENGTH_LONG).show(); } }); } @@ -606,13 +601,13 @@ public class SenderActivity extends AppCompatActivity { String serverChanServer = editTextServerChanSendKey.getText().toString(); if (!serverChanServer.isEmpty()) { try { - SenderServerChanMsg.sendMsg(0, handler, serverChanServer, "19999999999", "【京东】验证码为387481(切勿将验证码告知他人),请在页面中输入完成验证,如有问题请点击 ihelp.jd.com 联系京东客服"); + SenderServerChanMsg.sendMsg(0, handler, serverChanServer, getString(R.string.test_phone_num), getString(R.string.test_sms)); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "Server酱·Turbo版的 SendKey 不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_sendkey, Toast.LENGTH_LONG).show(); } }); } @@ -693,13 +688,13 @@ public class SenderActivity extends AppCompatActivity { String method = radioGroupWebNotifyMethod.getCheckedRadioButtonId() == R.id.radioWebNotifyMethodGet ? "GET" : "POST"; if (!webServer.isEmpty()) { try { - SenderWebNotifyMsg.sendMsg(0, handler, webServer, webParams, secret, method, "SmsForwarder Title", "测试内容(content)@" + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + SenderWebNotifyMsg.sendMsg(0, handler, webServer, webParams, secret, method, "SmsForwarder Title", R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "WebServer 不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); } }); } @@ -777,13 +772,13 @@ public class SenderActivity extends AppCompatActivity { String webHook = editTextQYWXGroupRobotWebHook.getText().toString(); if (!webHook.isEmpty()) { try { - SenderQyWxGroupRobotMsg.sendMsg(0, handler, webHook, "SmsForwarder Title", "测试内容(content)@" + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + SenderQyWxGroupRobotMsg.sendMsg(0, handler, webHook, "SmsForwarder Title", R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "webHook 不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_webhook, Toast.LENGTH_LONG).show(); } }); } @@ -842,7 +837,7 @@ public class SenderActivity extends AppCompatActivity { buttonQYWXAppOk.setOnClickListener(view -> { String toUser = editTextQYWXAppToUser.getText().toString(); if (toUser.isEmpty()) { - Toast.makeText(SenderActivity.this, "指定成员 不能为空 或者 选择@all", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_at_mobiles, Toast.LENGTH_LONG).show(); editTextQYWXAppToUser.setFocusable(true); editTextQYWXAppToUser.requestFocus(); return; @@ -897,13 +892,13 @@ public class SenderActivity extends AppCompatActivity { //Boolean atAll = switchQYWXAppAtAll.isChecked(); if (!toUser.isEmpty()) { try { - SenderQyWxAppMsg.sendMsg(0, handler, cropID, agentID, secret, toUser, "测试内容(content)@" + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())), true); + SenderQyWxAppMsg.sendMsg(0, handler, cropID, agentID, secret, toUser, R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())), true); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "指定成员 不能为空 或者 选择@all", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_at_mobiles, Toast.LENGTH_LONG).show(); } }); } @@ -986,13 +981,13 @@ public class SenderActivity extends AppCompatActivity { String chatId = editTextTelegramChatId.getText().toString(); if (!apiToken.isEmpty() && !chatId.isEmpty()) { try { - SenderTelegramMsg.sendMsg(0, handler, apiToken, chatId, "19999999999", "【京东】验证码为387481(切勿将验证码告知他人),请在页面中输入完成验证,如有问题请点击 ihelp.jd.com 联系京东客服"); + SenderTelegramMsg.sendMsg(0, handler, apiToken, chatId, getString(R.string.test_phone_num), getString(R.string.test_sms)); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "机器人的ApiToken 和 被通知人的ChatId 都不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_apiToken_or_chatId, Toast.LENGTH_LONG).show(); } }); } @@ -1082,13 +1077,13 @@ public class SenderActivity extends AppCompatActivity { Boolean onlyNoNetwork = switchSmsOnlyNoNetwork.isChecked(); if (!mobiles.isEmpty()) { try { - SenderSmsMsg.sendMsg(0, handler, simSlot, mobiles, onlyNoNetwork, "19999999999", "【京东】验证码为387481(切勿将验证码告知他人),请在页面中输入完成验证,如有问题请点击 ihelp.jd.com 联系京东客服"); + SenderSmsMsg.sendMsg(0, handler, simSlot, mobiles, onlyNoNetwork, getString(R.string.test_phone_num), getString(R.string.test_sms)); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "接收手机号不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_phone_num, Toast.LENGTH_LONG).show(); } }); } @@ -1169,13 +1164,13 @@ public class SenderActivity extends AppCompatActivity { String secret = editTextFeishuSecret.getText().toString(); if (!token.isEmpty()) { try { - SenderFeishuMsg.sendMsg(0, handler, token, secret, "测试内容(content)@" + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + SenderFeishuMsg.sendMsg(0, handler, token, secret, getString(R.string.test_content) + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); } catch (Exception e) { - Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } else { - Toast.makeText(SenderActivity.this, "token 不能为空", Toast.LENGTH_LONG).show(); + Toast.makeText(SenderActivity.this, R.string.invalid_webhook, Toast.LENGTH_LONG).show(); } }); } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 0cd5c959..62f12984 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -27,7 +27,7 @@ + android:text="@string/version" /> + android:text="@string/check_for_updates" /> @@ -60,7 +60,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" - android:text="开机启动" /> + android:text="@string/auto_startup" /> + android:text="@string/show_tips" /> + android:text="@string/open_source" /> + android:text="@string/synchronize_mirror" /> + android:text="@string/qq_group" /> + android:text="@string/qq_group1" /> + android:text="@string/qq_group2" />