From affac39bedfa7472bc472d24914316b751e2a89f Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Wed, 19 Jan 2022 14:31:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=8F=91=E9=80=81?= =?UTF-8?q?=E9=80=9A=E9=81=93=E5=BF=85=E5=A1=AB=E5=AD=97=E6=AE=B5=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=B8=8E=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 149 +-- README_en.md | 6 +- app/build.gradle | 3 +- .../idormy/sms/forwarder/MainActivity.java | 21 +- .../idormy/sms/forwarder/RuleActivity.java | 33 +- .../idormy/sms/forwarder/SenderActivity.java | 933 +++++++++++------- .../sms/forwarder/adapter/RuleAdapter.java | 3 + .../idormy/sms/forwarder/model/RuleModel.java | 8 + .../forwarder/model/vo/QYWXAppSettingVo.java | 10 + .../idormy/sms/forwarder/sender/SendUtil.java | 5 +- .../sms/forwarder/utils/CommonUtil.java | 22 + .../idormy/sms/forwarder/utils/RuleUtil.java | 6 + app/src/main/res/drawable/ic_add.xml | 5 + app/src/main/res/layout/activity_sender.xml | 58 +- app/src/main/res/layout/activity_setting.xml | 254 +++-- app/src/main/res/layout/alert_dialog_menu.xml | 30 + .../res/layout/alert_dialog_setview_bark.xml | 43 +- .../layout/alert_dialog_setview_dingding.xml | 101 +- .../res/layout/alert_dialog_setview_email.xml | 16 +- .../layout/alert_dialog_setview_feishu.xml | 25 +- .../layout/alert_dialog_setview_gotify.xml | 53 +- .../layout/alert_dialog_setview_pushplus.xml | 61 +- .../layout/alert_dialog_setview_qywxapp.xml | 19 +- .../alert_dialog_setview_qywxgrouprobot.xml | 34 +- .../res/layout/alert_dialog_setview_rule.xml | 28 + .../layout/alert_dialog_setview_rule_app.xml | 28 + .../layout/alert_dialog_setview_rule_call.xml | 28 + .../alert_dialog_setview_serverchan.xml | 18 +- .../res/layout/alert_dialog_setview_sms.xml | 32 +- .../layout/alert_dialog_setview_telegram.xml | 29 +- .../layout/alert_dialog_setview_webnotify.xml | 58 +- ...glayout.xml => diaolog_privacy_policy.xml} | 0 app/src/main/res/layout/item_menu.xml | 23 + app/src/main/res/layout/item_rule.xml | 34 +- app/src/main/res/values-en/array.xml | 17 - app/src/main/res/values-en/strings.xml | 57 +- app/src/main/res/values-en/styles.xml | 5 + app/src/main/res/values/array.xml | 17 - app/src/main/res/values/strings.xml | 67 +- app/src/main/res/values/styles.xml | 5 + pic/sender.jpg | Bin 156424 -> 0 bytes pic/sender.png | Bin 0 -> 220390 bytes 42 files changed, 1353 insertions(+), 991 deletions(-) create mode 100644 app/src/main/res/drawable/ic_add.xml create mode 100644 app/src/main/res/layout/alert_dialog_menu.xml rename app/src/main/res/layout/{diaologlayout.xml => diaolog_privacy_policy.xml} (100%) create mode 100644 app/src/main/res/layout/item_menu.xml delete mode 100644 app/src/main/res/values-en/array.xml delete mode 100644 app/src/main/res/values/array.xml delete mode 100644 pic/sender.jpg create mode 100644 pic/sender.png diff --git a/README.md b/README.md index de1e6e36..6297f074 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![SmsForwarder](pic/SmsForwarder.png) # SmsForwarder-短信转发器 -[English Version](#SmsForwarder) +[English Version](README_en.md) [![GitHub release](https://img.shields.io/github/release/pppscn/SmsForwarder.svg)](https://github.com/pppscn/SmsForwarder/releases) [![GitHub stars](https://img.shields.io/github/stars/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/stargazers) [![GitHub forks](https://img.shields.io/github/forks/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/network/members) [![GitHub issues](https://img.shields.io/github/issues/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/issues) [![GitHub license](https://img.shields.io/github/license/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/blob/main/LICENSE) @@ -94,7 +94,7 @@ | ---- | ---- | ---- | ---- | | ![前台服务常驻状态栏](pic/taskbar.jpg "前台服务常驻状态栏") | ![应用主界面](pic/main.png "应用主界面") | ![转发规则](pic/rule.jpg "转发规则") | ![转发详情](pic/maindetail.jpg "转发详情") | | 添加/编辑转发规则测试 | 多重匹配规则 | 支持以下转发方式(发送通道) | 添加/编辑发送通道钉钉 | -| ![添加/编辑转发规则](pic/ruleset.png "添加/编辑转发规则") | ![多重匹配规则](pic/multimatch.png "多重匹配规则") | ![发送通道](pic/sender.jpg "发送通道") | ![添加/编辑发送通道钉钉](pic/sendersetdingding.jpg "添加/编辑发送通道钉钉") | +| ![添加/编辑转发规则](pic/ruleset.png "添加/编辑转发规则") | ![多重匹配规则](pic/multimatch.png "多重匹配规则") | ![发送通道](pic/sender.png "发送通道") | ![添加/编辑发送通道钉钉](pic/sendersetdingding.jpg "添加/编辑发送通道钉钉") | | 添加/编辑发送通道邮箱 | 添加/编辑发送通道Bark | 添加/编辑发送通道网页通知 | 添加/编辑发送通道企业微信群机器人 | | ![添加/编辑发送通道邮箱](pic/sendersetemail.jpg "添加/编辑发送通道邮箱") | ![添加/编辑发送通道Bark](pic/sendersetbark.png "添加/编辑发送通道Bark") | ![添加/编辑发送通道网页通知](pic/sendersetwebnotify.jpg "添加/编辑发送通道网页通知") | ![添加/编辑发送通道企业微信群机器人](pic/sendersetqywechat.jpg "添加/编辑发送通道企业微信群机器人") | | 添加/编辑发送通道Telegram机器人 | 添加/编辑发送通道Server酱·Turbo版 | 添加/编辑发送通道企业微信应用 | 应用设置 | @@ -138,148 +138,3 @@ ## LICENSE BSD - --------- - -![SmsForwarder](pic/SmsForwarder.png) - -# SmsForwarder -[中文版](#SmsForwarder-短信转发器) - -[![GitHub release](https://img.shields.io/github/release/pppscn/SmsForwarder.svg)](https://github.com/pppscn/SmsForwarder/releases) [![GitHub stars](https://img.shields.io/github/stars/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/stargazers) [![GitHub forks](https://img.shields.io/github/forks/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/network/members) [![GitHub issues](https://img.shields.io/github/issues/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/issues) [![GitHub license](https://img.shields.io/github/license/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/blob/main/LICENSE) - -SmsForwarder - listens to SMS, incoming calls, and App notifications on Android mobile devices, and forward according to user defined rules to another App/device, including DingTalk, WeCom and WeCom Group Bot, Feishi Bot, E-mail, Bark, Webhook, Telegram Bot, ServerChan, PushPlus, SMS, etc. - -### Download - -> ⚠ Repo address: https://github.com/pppscn/SmsForwarder/releases - -> ⚠ Repo mirror in China: https://gitee.com/pp/SmsForwarder/releases - -> ⚠ Internet storage: https://wws.lanzoui.com/b025yl86h, access password: `pppscn` - -> ⚠ CoolAPK.com: https://www.coolapk.com/apk/com.idormy.sms.forwarder - -### Manual - -> ⚠ GitHub: https://github.com/pppscn/SmsForwarder/wiki - -> ⚠ Gitee: https://gitee.com/pp/SmsForwarder/wikis/pages - --------- - -## NOTE - -* Any code/APK of `SmsForwarder` related to the this repository is for test, study, and research only, commercial use is **prohibited**. Legality, accuracy, completeness and validity of any code/APK of this repo is guaranteed by **NOBODY**, and shall only be determined by User. - -* `pppscn` and/or any other Contributor to this repo is **NOT** responsible for any consequences (including but not limited to privacy leakage) arising from any user's direct or indirect use or dissemination of any code or APK of `SmsForwarder`, regardless of whether such use is in accordance with the laws of the country or territory where such user locates or such use or dissemination occurs. - -* Should any entity finds the code/APK of this repo infringing their rights, please provide notice and identity and proprietorship document, and we will delete relating code/APK after examining such document. - -* Privacy: `SmsForwarder` collects absolutely **NO** any of your personal data!! Except 1) version information to umeng.com for stats as the App starts, and 2) version number when manually check for update, `SmsForwarder` is **NOT** sending any data without users' knowledge. - --------- - -## Features and standards - -**Simplicity** - `SmsForwarder` does two things only: Listen to "SMS service/Incoming calls/App notifications", and forward according to rules specified by user. - -Benefit by simplicity: - -* **E**fficient: (It's inconvenient to read the security codes such as OTP on a mobile phone, when you are using another device; and no solution satisfices our needs) - - > + AirDroid: Too many functionalities, power consuming, requiring to many permissions, data relayed by a 3rd party, paid premium service... - > + IFTTT: Too many functionalities, power consuming, requiring to many permissions, data relayed by a 3rd party, paid premium service... - > + And other Apps (e.g. Tasker) with similar features. - -* **E**nergy friendly: listens to broadcast only when running, and forwards message only when texts are received and logs recent forwarding contents and status. -* **E**ndurance: "Simplicity is the Ultimate Sophistication." The simpler the code is, the less it errs or crashes; that is what make the app runs longer. - -### Workflow: - -![Workflow](pic/working_principle_en.png "Workflow") - -### Features: - -- [x] Listen to SMS service, and forward according to user-defined rules (SMS contents to destination); -- [x] Forward to DingTalk Bot (to a group chat and @SOMBODY); -- [x] Forward to E-mail (SMTP with SSL encryption); -- [x] Forward to Bark; -- [x] Forward to webhook (a single web page [sending POST/GET requests to a designated URL](doc/POST_WEB.md)); -- [x] Forward to WeCom Bots; -- [x] Forward to WeCom enterprise channels; -- [x] Forward to ServerChan·Turbo; -- [x] Forward to Telegram Bots (Proxy support ready); -- [x] Forward to another mobile phone via SMS [Note: Paid service, carriers may charge for SMS forwarding. SMS forwarding should apply with filtered rules when device has no Internet access.] -- [x] Check for new version and upgrade; -- [x] Cache purge; -- [x] Compatible with Android 5.xx, 6.xx, 7.xx, 8.xx, 9.xx, and 10.xx; -- [x] Support for dual SIM slots smartphones and label different slots/carrier/phone number (if available); -- [x] Support for multi-level rules; -- [x] Support for customized labeling of SIM slots and device, and customized forwarding templates; -- [x] Support for rules with regular expression -- [x] Support for rules for different SIM slots; -- [x] Forward missed call information (forwarded by SIM1 slot by default); -- [x] Retry 5 times after a failed request (customized interval time, stop retrying once successfully request); -- [x] Forward to FeiShu Bot; -- [x] Customized scheme (forwarder://main) wake up other Apps; -- [x] Monitor of battery status changes; -- [x] I18n support (Chinese and English currently); -- [x] Support for setting import and export functions (One-key cloning); -- [x] Listen to notifications of other Apps and forward; -- [x] Forward to PushPlus; -- [x] Support for customized template of forwarding rules (default template overrides if left blank); -- [x] Support for variables in regular expression of forwarding rules; - --------- - -### Screenshots : - -| Docking in Ntf. screen | Main screen | Fwding rules | Fwding details | -| ---- | ---- | ---- | ---- | -| ![Docking in Ntf. screen](pic/taskbar.jpg "Docking in Ntf. screen") | ![Main screen](pic/main.png "Main screen") | ![Forwarding rules](pic/rule.jpg "Forwarding rules") | ![Fwding details](pic/maindetail.jpg "Fwding details") | -| Test of a Fw. rule | Multiple filters | Supported senders | Add/Edit DingTalk sender | -| ![Test of a Fw. rule](pic/ruleset.png "Test of a Fw. rule") | ![Multiple filters](pic/multimatch.png "Multiple filters") | ![Supported senders](pic/sender.jpg "Supported senders") | ![Add/Edit DingTalk sender](pic/sendersetdingding.jpg "Add/Edit DingTalk sender") | -| Add/Edit E-mail sender | Add/Edit Bark sender | Add/Edit Webhook | Add/Edit WeCom Group Bot sender | -| ![Add/Edit E-mail sender](pic/sendersetemail.jpg "Add/Edit E-mail sender") | ![Add/Edit Bark sender](pic/sendersetbark.png "Add/Edit Bark sender") | ![Add/Edit Webhook sender](pic/sendersetwebnotify.jpg "Add/Edit Webhook sender") | ![Add/Edit WeCom group bot](pic/sendersetqywechat.jpg "Add/Edit WeCom group bot") | -| Add/Edit Telegram Bot sender | Add/Edit ServerChan Turbo sender | Add/Edit WeCom Group sender | Settings | -| ![Add/Edit Telegram bot](pic/sendertelegram.jpg "Add/Edit Telegram bot") | ![Add/Edit ServerChan Tubo sender](pic/senderserverchan.jpg "Add/Edit ServerChan Tubo sender") | ![Add/Edit WeCom Enterprise channel sender](pic/sendersetqywxapp.jpg "Add/Edit WeCom Enterprise channel sender") | ![Settings](pic/setting.jpg "Settings") | -| About/Update | RegEx & SIM filters | SMS fwding template w/ SIM label | Add/Edit an SMS fwding rule | -| ![Online update](pic/update.jpg "Online update") | ![RegEx & SIM filters](pic/regex.jpg "RegEx & SIM filters") | ![SMS fwding template w/ SIM label](pic/siminfo.jpg "SMS fwding template w/ SIM label") | ![Add/Edit SMS fwder.](pic/sendersetsms.jpg "Add/Edit SMS fwder.") | -| Add/Edit FeiShu Bot sender | Import and export (One-key Cloning) | Listen to ntf. of other Apps and fw. | Get App pkg name(s) | -| ![Add/Edit FeiShu sender](pic/senderfeishu.png "Add/Edit FeiShu sender") | ![New setting import & export function (One-key Clone)](pic/clone.png "New setting import & export function (One-key Cloning)") | ![Listen to notifications of other Apps and forward](pic/app_notify.png "Listen to notifications of other Apps and forward") | ![Getting list of all Apps (to get App package name)](pic/app_list.png "Getting list of all Apps (to get App package name)") | - --------- - -## Feedback and suggestions: - -+ Submit an issue or Pull Request. -+ Join group chat (only Chinese groups/channels available currently) - -| DingTalk | QQ user group #1: 562854376 | QQ user group #2: 31330492 | WeCom | -| ---- | ---- | ---- | ---- | -| ![钉钉客户群](pic/dingtalk.png "钉钉客户群") | ![QQ交流群:562854376](pic/qqgroup_1.jpg "QQ交流群:562854376") | ![QQ交流群:31330492](pic/qqgroup_2.jpg "QQ交流群:31330492") | ![企业微信群](pic/qywechat.png "企业微信群") | - -## Acknowledgements - -> Thanks to the projects below, `SmsForwarder` won't exists without them! - -+ https://github.com/xiaoyuanhost/TranspondSms (Foundation of `SmsForwarder`) -+ https://github.com/square/okhttp (http communications) -+ https://github.com/xuexiangjys/XUpdateAPI (online update) -+ https://github.com/mailhu/emailkit (email sending) -+ https://github.com/alibaba/fastjson (json parsing) -+ https://github.com/getActivity/XXPermissions (permission requiring) -+ [![GitHub license](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg?_ga=2.126618957.1361252949.1638261367-1417196221.1635638144&_gl=1*1pfl3dq*_ga*MTQxNzE5NjIyMS4xNjM1NjM4MTQ0*_ga_V0XZL7QHEB*MTYzODMzMjA4OC43LjAuMTYzODMzMjA5Ny4w)](https://jb.gg/OpenSourceSupport) (License Certificate for JetBrains All Products Pack) - --------- - -## Star this repo if you find this application useful! - -[![starcharts stargazers over time](https://starchart.cc/pppscn/SmsForwarder.svg)](https://github.com/pppscn/SmsForwarder) - --------- - -## LICENSE - -BSD diff --git a/README_en.md b/README_en.md index 6d5da09c..a9351319 100644 --- a/README_en.md +++ b/README_en.md @@ -1,6 +1,8 @@ + ![SmsForwarder](pic/SmsForwarder.png) # SmsForwarder +[中文版](README.md) [![GitHub release](https://img.shields.io/github/release/pppscn/SmsForwarder.svg)](https://github.com/pppscn/SmsForwarder/releases) [![GitHub stars](https://img.shields.io/github/stars/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/stargazers) [![GitHub forks](https://img.shields.io/github/forks/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/network/members) [![GitHub issues](https://img.shields.io/github/issues/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/issues) [![GitHub license](https://img.shields.io/github/license/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/blob/main/LICENSE) @@ -53,7 +55,7 @@ Benefit by simplicity: ### Workflow: -![工作流程](pic/working_principle.png "工作流程") +![Workflow](pic/working_principle_en.png "Workflow") ### Features: @@ -95,7 +97,7 @@ Benefit by simplicity: | ---- | ---- | ---- | ---- | | ![Docking in Ntf. screen](pic/taskbar.jpg "Docking in Ntf. screen") | ![Main screen](pic/main.png "Main screen") | ![Forwarding rules](pic/rule.jpg "Forwarding rules") | ![Fwding details](pic/maindetail.jpg "Fwding details") | | Test of a Fw. rule | Multiple filters | Supported senders | Add/Edit DingTalk sender | -| ![Test of a Fw. rule](pic/ruleset.png "Test of a Fw. rule") | ![Multiple filters](pic/multimatch.png "Multiple filters") | ![Supported senders](pic/sender.jpg "Supported senders") | ![Add/Edit DingTalk sender](pic/sendersetdingding.jpg "Add/Edit DingTalk sender") | +| ![Test of a Fw. rule](pic/ruleset.png "Test of a Fw. rule") | ![Multiple filters](pic/multimatch.png "Multiple filters") | ![Supported senders](pic/sender.png "Supported senders") | ![Add/Edit DingTalk sender](pic/sendersetdingding.jpg "Add/Edit DingTalk sender") | | Add/Edit E-mail sender | Add/Edit Bark sender | Add/Edit Webhook | Add/Edit WeCom Group Bot sender | | ![Add/Edit E-mail sender](pic/sendersetemail.jpg "Add/Edit E-mail sender") | ![Add/Edit Bark sender](pic/sendersetbark.png "Add/Edit Bark sender") | ![Add/Edit Webhook sender](pic/sendersetwebnotify.jpg "Add/Edit Webhook sender") | ![Add/Edit WeCom group bot](pic/sendersetqywechat.jpg "Add/Edit WeCom group bot") | | Add/Edit Telegram Bot sender | Add/Edit ServerChan Turbo sender | Add/Edit WeCom Group sender | Settings | diff --git a/app/build.gradle b/app/build.gradle index b458f358..c96b3ea1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -129,9 +129,10 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //noinspection GradleDependency implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' //noinspection GradleDependency implementation 'com.google.firebase:firebase-crashlytics-buildtools:2.5.2' + implementation 'com.google.android.material:material:1.3.0' //noinspection GradleDynamicVersion testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' 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 4636c494..0ef97ec0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java @@ -5,7 +5,10 @@ import android.app.Dialog; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; -import android.os.*; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; @@ -29,12 +32,22 @@ import com.idormy.sms.forwarder.sender.SendUtil; import com.idormy.sms.forwarder.sender.SmsHubApiTask; import com.idormy.sms.forwarder.service.BatteryService; import com.idormy.sms.forwarder.service.FrontService; -import com.idormy.sms.forwarder.utils.*; +import com.idormy.sms.forwarder.utils.CommonUtil; +import com.idormy.sms.forwarder.utils.HttpUtil; +import com.idormy.sms.forwarder.utils.KeepAliveUtils; +import com.idormy.sms.forwarder.utils.LogUtil; +import com.idormy.sms.forwarder.utils.NetUtil; +import com.idormy.sms.forwarder.utils.PhoneUtils; +import com.idormy.sms.forwarder.utils.SettingUtil; +import com.idormy.sms.forwarder.utils.SharedPreferencesHelper; +import com.idormy.sms.forwarder.utils.SmsUtil; +import com.idormy.sms.forwarder.utils.TimeUtil; import com.umeng.analytics.MobclickAgent; import com.umeng.commonsdk.UMConfigure; import java.lang.reflect.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class MainActivity extends AppCompatActivity implements RefreshListView.IRefreshListener { @@ -436,7 +449,7 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I @SuppressLint({"ResourceType", "InflateParams"}) public void dialog() { dialog = new Dialog(this, R.style.dialog); - inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.diaologlayout, null); + inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.diaolog_privacy_policy, null); TextView succsebtn = (TextView) inflate.findViewById(R.id.succsebtn); TextView canclebtn = (TextView) inflate.findViewById(R.id.caclebtn); 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 0048efcd..0add6c92 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java @@ -1,6 +1,8 @@ package com.idormy.sms.forwarder; import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; +import static com.idormy.sms.forwarder.model.RuleModel.STATUS_OFF; +import static com.idormy.sms.forwarder.model.RuleModel.STATUS_ON; import android.annotation.SuppressLint; import android.os.Bundle; @@ -27,6 +29,7 @@ import com.idormy.sms.forwarder.model.SenderModel; import com.idormy.sms.forwarder.model.vo.SmsVo; import com.idormy.sms.forwarder.sender.SendUtil; import com.idormy.sms.forwarder.sender.SenderUtil; +import com.idormy.sms.forwarder.utils.CommonUtil; import com.idormy.sms.forwarder.utils.RuleUtil; import com.idormy.sms.forwarder.utils.SettingUtil; import com.umeng.analytics.MobclickAgent; @@ -231,6 +234,11 @@ public class RuleActivity extends AppCompatActivity { final LinearLayout matchValueLayout = view1.findViewById(R.id.matchValueLayout); refreshSelectRadioGroupRuleFiled(radioGroupRuleFiled, radioGroupRuleCheck, radioGroupRuleCheck2, editTextRuleValue, tv_mu_rule_tips, matchTypeLayout, matchValueLayout); + //是否启用该规则 + @SuppressLint("UseSwitchCompatOrMaterialCode") Switch switchRuleStatus = view1.findViewById(R.id.switch_rule_status); + if (ruleModel != null) { + switchRuleStatus.setChecked(ruleModel.getStatusChecked()); + } //自定义模板 @SuppressLint("UseSwitchCompatOrMaterialCode") Switch switchSmsTemplate = view1.findViewById(R.id.switch_sms_template); EditText textSmsTemplate = view1.findViewById(R.id.text_sms_template); @@ -284,6 +292,7 @@ public class RuleActivity extends AppCompatActivity { newRuleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); newRuleModel.setRegexReplace(regexReplace); newRuleModel.setSenderId(Long.valueOf(senderId.toString())); + newRuleModel.setStatus(switchRuleStatus.isChecked() ? STATUS_ON : STATUS_OFF); RuleUtil.addRule(newRuleModel); initRules(); adapter.add(ruleModels); @@ -297,11 +306,11 @@ public class RuleActivity extends AppCompatActivity { ruleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); ruleModel.setRegexReplace(regexReplace); ruleModel.setSenderId(Long.valueOf(senderId.toString())); + ruleModel.setStatus(switchRuleStatus.isChecked() ? STATUS_ON : STATUS_OFF); RuleUtil.updateRule(ruleModel); initRules(); adapter.update(ruleModels); } - show.dismiss(); }); @@ -341,6 +350,7 @@ public class RuleActivity extends AppCompatActivity { newRuleModel.setSmsTemplate(textSmsTemplate.getText().toString().trim()); newRuleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); newRuleModel.setRegexReplace(regexReplace); + newRuleModel.setStatus(switchRuleStatus.isChecked() ? STATUS_ON : STATUS_OFF); testRule(newRuleModel, Long.valueOf(senderId.toString())); } else { @@ -353,6 +363,7 @@ public class RuleActivity extends AppCompatActivity { ruleModel.setSmsTemplate(textSmsTemplate.getText().toString().trim()); ruleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); ruleModel.setRegexReplace(regexReplace); + ruleModel.setStatus(switchRuleStatus.isChecked() ? STATUS_ON : STATUS_OFF); testRule(ruleModel, Long.valueOf(senderId.toString())); } @@ -374,49 +385,49 @@ public class RuleActivity extends AppCompatActivity { buttonInsertSender.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{来源号码}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{来源号码}}"); }); Button buttonInsertContent = view1.findViewById(R.id.bt_insert_content); buttonInsertContent.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{短信内容}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{短信内容}}"); }); Button buttonInsertSenderApp = view1.findViewById(R.id.bt_insert_sender_app); buttonInsertSenderApp.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{APP包名}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{APP包名}}"); }); Button buttonInsertContentApp = view1.findViewById(R.id.bt_insert_content_app); buttonInsertContentApp.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{通知内容}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{通知内容}}"); }); Button buttonInsertExtra = view1.findViewById(R.id.bt_insert_extra); buttonInsertExtra.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{卡槽信息}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{卡槽信息}}"); }); Button buttonInsertTime = view1.findViewById(R.id.bt_insert_time); buttonInsertTime.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{接收时间}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{接收时间}}"); }); Button buttonInsertDeviceName = view1.findViewById(R.id.bt_insert_device_name); buttonInsertDeviceName.setOnClickListener(view -> { textSmsTemplate.setFocusable(true); textSmsTemplate.requestFocus(); - insertOrReplaceText2Cursor(textSmsTemplate, "{{设备名称}}"); + CommonUtil.insertOrReplaceText2Cursor(textSmsTemplate, "{{设备名称}}"); }); //正则替换 @@ -433,12 +444,6 @@ public class RuleActivity extends AppCompatActivity { } - private void insertOrReplaceText2Cursor(EditText editText, String str) { - int start = Math.max(editText.getSelectionStart(), 0); - int end = Math.max(editText.getSelectionEnd(), 0); - editText.getText().replace(Math.min(start, end), Math.max(start, end), str, 0, str.length()); - } - //当更新选择的字段的时候,更新之下各个选项的状态 // 如果设置了转发全部,禁用选择模式和匹配值输入 // 如果设置了多重规则,选择模式置为是 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 8f12091b..5e833fae 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java @@ -16,16 +16,21 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_TELEGRAM; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_WEB_NOTIFY; import android.annotation.SuppressLint; +import android.app.Dialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.text.TextUtils; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.GridView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RadioGroup; +import android.widget.SimpleAdapter; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; @@ -61,6 +66,7 @@ import com.idormy.sms.forwarder.sender.SenderSmsMsg; import com.idormy.sms.forwarder.sender.SenderTelegramMsg; import com.idormy.sms.forwarder.sender.SenderUtil; import com.idormy.sms.forwarder.sender.SenderWebNotifyMsg; +import com.idormy.sms.forwarder.utils.CommonUtil; import com.idormy.sms.forwarder.view.ClearEditText; import com.umeng.analytics.MobclickAgent; @@ -68,6 +74,7 @@ import java.net.Proxy; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; @SuppressWarnings("deprecation") @@ -239,17 +246,92 @@ public class SenderActivity extends AppCompatActivity { }); } + @Override + protected void onDestroy() { + Log.d(TAG, "onDestroy"); + super.onDestroy(); + } + + @Override + protected void onResume() { + super.onResume(); + MobclickAgent.onPageStart(TAG); + MobclickAgent.onResume(this); + } + + @Override + protected void onPause() { + super.onPause(); + MobclickAgent.onPageEnd(TAG); + MobclickAgent.onPause(this); + } + // 初始化数据 private void initSenders() { senderModels = SenderUtil.getSender(null, null); } + // 获取发送通道菜单 + private List> getMenuData() { + //定义图标数组 + int[] imageRes = { + R.mipmap.dingding, + R.mipmap.email, + R.mipmap.bark, + R.mipmap.webhook, + R.mipmap.qywx, + R.mipmap.qywxapp, + R.mipmap.serverchan, + R.mipmap.telegram, + R.mipmap.sms, + R.mipmap.feishu, + R.mipmap.pushplus, + R.mipmap.gotify, + }; + //定义标题数组 + String[] itemName = { + getString(R.string.dingding), + getString(R.string.email), + getString(R.string.bark), + getString(R.string.webhook), + getString(R.string.qywx), + getString(R.string.qywxapp), + getString(R.string.serverchan), + getString(R.string.telegram), + getString(R.string.sms_menu), + getString(R.string.feishu), + getString(R.string.pushplus), + getString(R.string.gotify), + }; + List> data = new ArrayList<>(); + int length = itemName.length; + for (int i = 0; i < length; i++) { + HashMap map = new HashMap<>(); + map.put("ItemImageView", imageRes[i]); + map.put("ItemTextView", itemName[i]); + data.add(map); + } + return data; + } + + // 添加发送通道 public void addSender(View view) { - AlertDialog.Builder builder = new AlertDialog.Builder(SenderActivity.this); - builder.setTitle(R.string.add_sender_title); - //添加列表 - builder.setItems(R.array.add_sender_menu, (dialogInterface, which) -> { - switch (which) { + @SuppressLint("InflateParams") View dialog_menu = LayoutInflater.from(SenderActivity.this).inflate(R.layout.alert_dialog_menu, null); + // 设置style 控制默认dialog带来的边距问题 + final Dialog dialog = new Dialog(this, R.style.dialog_menu); + dialog.setContentView(dialog_menu); + dialog.show(); + + GridView gridview = dialog.findViewById(R.id.MemuGridView); + final List> item = getMenuData(); + SimpleAdapter simpleAdapter = new SimpleAdapter(this, item, R.layout.item_menu, new String[]{"ItemImageView", "ItemTextView"}, new int[]{R.id.ItemImageView, R.id.ItemTextView}); + gridview.setAdapter(simpleAdapter); + + // 添加点击事件 + gridview.setOnItemClickListener((arg0, arg1, position, arg3) -> { + dialog.dismiss(); + + switch (position) { case TYPE_DINGDING: setDingDing(null, false); break; @@ -291,15 +373,12 @@ public class SenderActivity extends AppCompatActivity { break; } }); - builder.show(); - Log.d(TAG, "setDingDing show" + senderModels.size()); } //钉钉机器人 - @SuppressLint("SimpleDateFormat") + @SuppressLint({"SimpleDateFormat", "SetTextI18n"}) private void setDingDing(final SenderModel senderModel, final boolean isClone) { DingDingSettingVo dingDingSettingVo = null; - //try phrase json setting if (senderModel != null) { String jsonSettingStr = senderModel.getJsonSetting(); if (jsonSettingStr != null) { @@ -315,18 +394,32 @@ public class SenderActivity extends AppCompatActivity { editTextDingdingName.setText(senderModel.getName()); switchDingdingEnable.setChecked(senderModel.getStatusChecked()); } + final ClearEditText editTextDingdingToken = view1.findViewById(R.id.editTextDingdingToken); - if (dingDingSettingVo != null) - editTextDingdingToken.setText(dingDingSettingVo.getToken()); final ClearEditText editTextDingdingSecret = view1.findViewById(R.id.editTextDingdingSecret); - if (dingDingSettingVo != null) - editTextDingdingSecret.setText(dingDingSettingVo.getSecret()); final EditText editTextDingdingAtMobiles = view1.findViewById(R.id.editTextDingdingAtMobiles); - if (dingDingSettingVo != null && dingDingSettingVo.getAtMobiles() != null) - editTextDingdingAtMobiles.setText(dingDingSettingVo.getAtMobiles()); @SuppressLint("UseSwitchCompatOrMaterialCode") final Switch switchDingdingAtAll = view1.findViewById(R.id.switchDingdingAtAll); - if (dingDingSettingVo != null && dingDingSettingVo.getAtAll() != null) - switchDingdingAtAll.setChecked(dingDingSettingVo.getAtAll()); + final LinearLayout linearLayoutDingdingAtMobiles = view1.findViewById(R.id.linearLayoutDingdingAtMobiles); + if (dingDingSettingVo != null) { + editTextDingdingToken.setText(dingDingSettingVo.getToken()); + editTextDingdingSecret.setText(dingDingSettingVo.getSecret()); + editTextDingdingAtMobiles.setText(dingDingSettingVo.getAtMobiles()); + if (dingDingSettingVo.getAtAll() != null) { + switchDingdingAtAll.setChecked(dingDingSettingVo.getAtAll()); + linearLayoutDingdingAtMobiles.setVisibility(dingDingSettingVo.getAtAll() ? View.GONE : View.VISIBLE); + } + } + + switchDingdingAtAll.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + linearLayoutDingdingAtMobiles.setVisibility(View.GONE); + editTextDingdingAtMobiles.setText("@all"); + } else { + linearLayoutDingdingAtMobiles.setVisibility(View.VISIBLE); + editTextDingdingAtMobiles.setText(""); + } + Log.d(TAG, "onCheckedChanged:" + isChecked); + }); Button buttonDingdingOk = view1.findViewById(R.id.buttonDingdingOk); Button buttonDingdingDel = view1.findViewById(R.id.buttonDingdingDel); @@ -338,41 +431,44 @@ public class SenderActivity extends AppCompatActivity { .create(); final AlertDialog show = alertDialog71.show(); buttonDingdingOk.setOnClickListener(view -> { + String senderName = editTextDingdingName.getText().toString().trim(); + int senderStatus = switchDingdingEnable.isChecked() ? STATUS_ON : STATUS_OFF; + String token = editTextDingdingToken.getText().toString().trim(); + String secret = editTextDingdingSecret.getText().toString().trim(); + String atMobiles = editTextDingdingAtMobiles.getText().toString().trim(); + Boolean atAll = switchDingdingAtAll.isChecked(); + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + if (CommonUtil.checkUrl(token, true)) { + Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show(); + return; + } + + DingDingSettingVo dingDingSettingVoNew = new DingDingSettingVo(token, secret, atMobiles, atAll); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextDingdingName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_DINGDING); - newSenderModel.setStatus(switchDingdingEnable.isChecked() ? STATUS_ON : STATUS_OFF); - DingDingSettingVo dingDingSettingVoNew = new DingDingSettingVo( - editTextDingdingToken.getText().toString().trim(), - editTextDingdingSecret.getText().toString().trim(), - editTextDingdingAtMobiles.getText().toString().trim(), - switchDingdingAtAll.isChecked()); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(dingDingSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextDingdingName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_DINGDING); - senderModel.setStatus(switchDingdingEnable.isChecked() ? STATUS_ON : STATUS_OFF); - DingDingSettingVo dingDingSettingVoNew = new DingDingSettingVo( - editTextDingdingToken.getText().toString().trim(), - editTextDingdingSecret.getText().toString().trim(), - editTextDingdingAtMobiles.getText().toString().trim(), - switchDingdingAtAll.isChecked()); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(dingDingSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - - show.dismiss(); - - }); + buttonDingdingDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -381,20 +477,22 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonDingdingTest.setOnClickListener(view -> { String token = editTextDingdingToken.getText().toString().trim(); + if (CommonUtil.checkUrl(token, true)) { + Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show(); + return; + } + String secret = editTextDingdingSecret.getText().toString().trim(); String atMobiles = editTextDingdingAtMobiles.getText().toString().trim(); Boolean atAll = switchDingdingAtAll.isChecked(); - if (!token.isEmpty()) { - try { - 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { - Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show(); + try { + 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -453,6 +551,13 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonEmailOk.setOnClickListener(view -> { + String senderName = editTextEmailName.getText().toString().trim(); + int senderStatus = switchEmailEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + String protocol = radioGroupEmailProtocol.getCheckedRadioButtonId() == R.id.radioEmailProtocolSmtp ? "SMTP" : "IMAP"; String host = editTextEmailHost.getText().toString().trim(); String port = editTextEmailPort.getText().toString().trim(); @@ -472,28 +577,27 @@ public class SenderActivity extends AppCompatActivity { } EmailSettingVo emailSettingVoNew = new EmailSettingVo(protocol, host, port, ssl, fromEmail, nickname, pwd, toEmail, title); - if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextEmailName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_EMAIL); - newSenderModel.setStatus(switchEmailEnable.isChecked() ? STATUS_ON : STATUS_OFF); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(emailSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextEmailName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_EMAIL); - senderModel.setStatus(switchEmailEnable.isChecked() ? STATUS_ON : STATUS_OFF); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(emailSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); }); + buttonEmailDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -502,6 +606,7 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonEmailTest.setOnClickListener(view -> { String protocol = radioGroupEmailProtocol.getCheckedRadioButtonId() == R.id.radioEmailProtocolSmtp ? "SMTP" : "IMAP"; String host = editTextEmailHost.getText().toString().trim(); @@ -517,15 +622,16 @@ public class SenderActivity extends AppCompatActivity { String nickname = editTextEmailNickname.getText().toString().trim(); if (nickname.isEmpty()) nickname = "SmsForwarder"; - if (!host.isEmpty() && !port.isEmpty() && !fromEmail.isEmpty() && !pwd.isEmpty() && !toEmail.isEmpty()) { - try { - SenderMailMsg.sendEmail(0, handler, protocol, host, port, ssl, fromEmail, nickname, pwd, toEmail, title, R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); - } catch (Exception e) { - Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + if (host.isEmpty() || port.isEmpty() || fromEmail.isEmpty() || pwd.isEmpty() || toEmail.isEmpty()) { Toast.makeText(SenderActivity.this, R.string.invalid_email, Toast.LENGTH_LONG).show(); + return; + } + + try { + SenderMailMsg.sendEmail(0, handler, protocol, host, port, ssl, fromEmail, nickname, pwd, toEmail, title, R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); @@ -534,28 +640,28 @@ public class SenderActivity extends AppCompatActivity { buttonInsertSender.setOnClickListener(view -> { editTextEmailTitle.setFocusable(true); editTextEmailTitle.requestFocus(); - editTextEmailTitle.append("{{来源号码}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextEmailTitle, "{{来源号码}}"); }); Button buttonInsertExtra = view1.findViewById(R.id.bt_insert_extra); buttonInsertExtra.setOnClickListener(view -> { editTextEmailTitle.setFocusable(true); editTextEmailTitle.requestFocus(); - editTextEmailTitle.append("{{卡槽信息}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextEmailTitle, "{{卡槽信息}}"); }); Button buttonInsertTime = view1.findViewById(R.id.bt_insert_time); buttonInsertTime.setOnClickListener(view -> { editTextEmailTitle.setFocusable(true); editTextEmailTitle.requestFocus(); - editTextEmailTitle.append("{{接收时间}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextEmailTitle, "{{接收时间}}"); }); Button buttonInsertDeviceName = view1.findViewById(R.id.bt_insert_device_name); buttonInsertDeviceName.setOnClickListener(view -> { editTextEmailTitle.setFocusable(true); editTextEmailTitle.requestFocus(); - editTextEmailTitle.append("{{设备名称}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextEmailTitle, "{{设备名称}}"); }); } @@ -597,37 +703,42 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonBarkOk.setOnClickListener(view -> { + String senderName = editTextBarkName.getText().toString().trim(); + int senderStatus = switchBarkEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + String barkServer = editTextBarkServer.getText().toString().trim(); + if (!CommonUtil.checkUrl(barkServer, false)) { + Toast.makeText(SenderActivity.this, R.string.invalid_bark_server, Toast.LENGTH_LONG).show(); + return; + } + + String barkIcon = editTextBarkIcon.getText().toString().trim(); + BarkSettingVo barkSettingVoNew = new BarkSettingVo(barkServer, barkIcon); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextBarkName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_BARK); - newSenderModel.setStatus(switchBarkEnable.isChecked() ? STATUS_ON : STATUS_OFF); - BarkSettingVo barkSettingVoNew = new BarkSettingVo( - editTextBarkServer.getText().toString().trim(), - editTextBarkIcon.getText().toString().trim() - ); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(barkSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextBarkName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_BARK); - senderModel.setStatus(switchBarkEnable.isChecked() ? STATUS_ON : STATUS_OFF); - BarkSettingVo barkSettingVoNew = new BarkSettingVo( - editTextBarkServer.getText().toString().trim(), - editTextBarkIcon.getText().toString().trim() - ); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(barkSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); - }); + buttonBarkDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -636,10 +747,11 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonBarkTest.setOnClickListener(view -> { String barkServer = editTextBarkServer.getText().toString().trim(); String barkIcon = editTextBarkIcon.getText().toString().trim(); - if (!barkServer.isEmpty()) { + if (CommonUtil.checkUrl(barkServer, false)) { try { SenderBarkMsg.sendMsg(0, handler, barkServer, barkIcon, getString(R.string.test_phone_num), getString(R.string.test_sms), getString(R.string.test_group_name)); } catch (Exception e) { @@ -652,94 +764,6 @@ public class SenderActivity extends AppCompatActivity { }); } - //Server酱·Turbo版 - private void setServerChan(final SenderModel senderModel, final boolean isClone) { - ServerChanSettingVo serverchanSettingVo = null; - //try phrase json setting - if (senderModel != null) { - String jsonSettingStr = senderModel.getJsonSetting(); - if (jsonSettingStr != null) { - serverchanSettingVo = JSON.parseObject(jsonSettingStr, ServerChanSettingVo.class); - } - } - - final AlertDialog.Builder alertDialog71 = new AlertDialog.Builder(SenderActivity.this); - View view1 = View.inflate(SenderActivity.this, R.layout.alert_dialog_setview_serverchan, null); - - final EditText editTextServerChanName = view1.findViewById(R.id.editTextServerChanName); - @SuppressLint("UseSwitchCompatOrMaterialCode") final Switch switchServerChanEnable = view1.findViewById(R.id.switchServerChanEnable); - if (senderModel != null) { - editTextServerChanName.setText(senderModel.getName()); - switchServerChanEnable.setChecked(senderModel.getStatusChecked()); - } - - final ClearEditText editTextServerChanSendKey = view1.findViewById(R.id.editTextServerChanSendKey); - if (serverchanSettingVo != null) - editTextServerChanSendKey.setText(serverchanSettingVo.getSendKey()); - - Button buttonServerChanOk = view1.findViewById(R.id.buttonServerChanOk); - Button buttonServerChanDel = view1.findViewById(R.id.buttonServerChanDel); - Button buttonServerChanTest = view1.findViewById(R.id.buttonServerChanTest); - alertDialog71 - .setTitle(R.string.setserverchantitle) - .setIcon(R.mipmap.serverchan) - .setView(view1) - .create(); - final AlertDialog show = alertDialog71.show(); - - buttonServerChanOk.setOnClickListener(view -> { - - if (isClone || senderModel == null) { - SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextServerChanName.getText().toString().trim()); - newSenderModel.setType(TYPE_SERVER_CHAN); - newSenderModel.setStatus(switchServerChanEnable.isChecked() ? STATUS_ON : STATUS_OFF); - ServerChanSettingVo serverChanSettingVoNew = new ServerChanSettingVo( - editTextServerChanSendKey.getText().toString().trim() - ); - newSenderModel.setJsonSetting(JSON.toJSONString(serverChanSettingVoNew)); - SenderUtil.addSender(newSenderModel); - initSenders(); - adapter.add(senderModels); - } else { - senderModel.setName(editTextServerChanName.getText().toString().trim()); - senderModel.setType(TYPE_SERVER_CHAN); - senderModel.setStatus(switchServerChanEnable.isChecked() ? STATUS_ON : STATUS_OFF); - ServerChanSettingVo serverChanSettingVoNew = new ServerChanSettingVo( - editTextServerChanSendKey.getText().toString().trim() - ); - senderModel.setJsonSetting(JSON.toJSONString(serverChanSettingVoNew)); - SenderUtil.updateSender(senderModel); - initSenders(); - adapter.update(senderModels); - } - - show.dismiss(); - - }); - buttonServerChanDel.setOnClickListener(view -> { - if (senderModel != null) { - SenderUtil.delSender(senderModel.getId()); - initSenders(); - adapter.del(senderModels); - } - show.dismiss(); - }); - buttonServerChanTest.setOnClickListener(view -> { - String serverChanServer = editTextServerChanSendKey.getText().toString().trim(); - if (!serverChanServer.isEmpty()) { - try { - SenderServerChanMsg.sendMsg(0, handler, serverChanServer, getString(R.string.test_phone_num), getString(R.string.test_sms)); - } catch (Exception e) { - Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { - Toast.makeText(SenderActivity.this, R.string.invalid_sendkey, Toast.LENGTH_LONG).show(); - } - }); - } - //webhook @SuppressLint("SimpleDateFormat") private void setWebNotify(final SenderModel senderModel, final boolean isClone) { @@ -784,23 +808,35 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonWebNotifyOk.setOnClickListener(view -> { - WebNotifySettingVo webNotifySettingVoNew = new WebNotifySettingVo( - editTextWebNotifyWebServer.getText().toString().trim(), - editTextWebNotifySecret.getText().toString().trim(), - (radioGroupWebNotifyMethod.getCheckedRadioButtonId() == R.id.radioWebNotifyMethodGet ? "GET" : "POST"), - editTextWebNotifyWebParams.getText().toString().trim() - ); + String senderName = editTextWebNotifyName.getText().toString().trim(); + int senderStatus = switchWebNotifyEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + + String webServer = editTextWebNotifyWebServer.getText().toString().trim(); + String secret = editTextWebNotifySecret.getText().toString().trim(); + String method = radioGroupWebNotifyMethod.getCheckedRadioButtonId() == R.id.radioWebNotifyMethodGet ? "GET" : "POST"; + String webParams = editTextWebNotifyWebParams.getText().toString().trim(); + + if (!CommonUtil.checkUrl(webServer, false)) { + Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); + return; + } + + WebNotifySettingVo webNotifySettingVoNew = new WebNotifySettingVo(webServer, secret, method, webParams); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextWebNotifyName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_WEB_NOTIFY); - newSenderModel.setStatus(switchWebNotifyEnable.isChecked() ? STATUS_ON : STATUS_OFF); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(webNotifySettingVoNew)); SenderUtil.addSender(newSenderModel); } else { - senderModel.setName(editTextWebNotifyName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_WEB_NOTIFY); - senderModel.setStatus(switchWebNotifyEnable.isChecked() ? STATUS_ON : STATUS_OFF); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(webNotifySettingVoNew)); SenderUtil.updateSender(senderModel); } @@ -808,6 +844,7 @@ public class SenderActivity extends AppCompatActivity { adapter.update(senderModels); show.dismiss(); }); + buttonWebNotifyDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -816,20 +853,23 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonWebNotifyTest.setOnClickListener(view -> { String webServer = editTextWebNotifyWebServer.getText().toString().trim(); - String webParams = editTextWebNotifyWebParams.getText().toString().trim(); String secret = editTextWebNotifySecret.getText().toString().trim(); String method = radioGroupWebNotifyMethod.getCheckedRadioButtonId() == R.id.radioWebNotifyMethodGet ? "GET" : "POST"; - if (!webServer.isEmpty()) { - try { - 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + String webParams = editTextWebNotifyWebParams.getText().toString().trim(); + + if (!CommonUtil.checkUrl(webServer, false)) { Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); + return; + } + + try { + 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -872,35 +912,41 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonQyWxGroupRobotOk.setOnClickListener(view -> { + String senderName = editTextQYWXGroupRobotName.getText().toString().trim(); + int senderStatus = switchQYWXGroupRobotEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + String webHook = editTextQYWXGroupRobotWebHook.getText().toString().trim(); + if (!CommonUtil.checkUrl(webHook, false)) { + Toast.makeText(SenderActivity.this, R.string.invalid_webhook, Toast.LENGTH_LONG).show(); + return; + } + + QYWXGroupRobotSettingVo qywxGroupRobotSettingVoNew = new QYWXGroupRobotSettingVo(webHook); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextQYWXGroupRobotName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_QYWX_GROUP_ROBOT); - newSenderModel.setStatus(switchQYWXGroupRobotEnable.isChecked() ? STATUS_ON : STATUS_OFF); - QYWXGroupRobotSettingVo qywxGroupRobotSettingVoNew = new QYWXGroupRobotSettingVo( - editTextQYWXGroupRobotWebHook.getText().toString().trim() - ); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(qywxGroupRobotSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextQYWXGroupRobotName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_QYWX_GROUP_ROBOT); - senderModel.setStatus(switchQYWXGroupRobotEnable.isChecked() ? STATUS_ON : STATUS_OFF); - QYWXGroupRobotSettingVo qywxGroupRobotSettingVoNew = new QYWXGroupRobotSettingVo( - editTextQYWXGroupRobotWebHook.getText().toString().trim() - ); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(qywxGroupRobotSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); - }); + buttonQyWxGroupRobotDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -909,17 +955,19 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonQyWxGroupRobotTest.setOnClickListener(view -> { String webHook = editTextQYWXGroupRobotWebHook.getText().toString().trim(); - if (!webHook.isEmpty()) { - try { - 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + if (!CommonUtil.checkUrl(webHook, false)) { Toast.makeText(SenderActivity.this, R.string.invalid_webhook, Toast.LENGTH_LONG).show(); + return; + } + + try { + 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -980,6 +1028,13 @@ public class SenderActivity extends AppCompatActivity { .create(); final AlertDialog show = alertDialog71.show(); buttonQYWXAppOk.setOnClickListener(view -> { + String senderName = editTextQYWXAppName.getText().toString().trim(); + int senderStatus = switchQYWXAppEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + String toUser = editTextQYWXAppToUser.getText().toString().trim(); if (toUser.isEmpty()) { Toast.makeText(SenderActivity.this, R.string.invalid_at_mobiles, Toast.LENGTH_LONG).show(); @@ -988,39 +1043,38 @@ public class SenderActivity extends AppCompatActivity { return; } + QYWXAppSettingVo QYWXAppSettingVoNew = new QYWXAppSettingVo( + editTextQYWXAppCorpID.getText().toString().trim(), + editTextQYWXAppAgentID.getText().toString().trim(), + editTextQYWXAppSecret.getText().toString().trim(), + editTextQYWXAppToUser.getText().toString().trim(), + switchQYWXAppAtAll.isChecked()); + if (!QYWXAppSettingVoNew.checkParms()) { + Toast.makeText(SenderActivity.this, R.string.invalid_webcom_app_parm, Toast.LENGTH_LONG).show(); + return; + } + if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextQYWXAppName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_QYWX_APP); - newSenderModel.setStatus(switchQYWXAppEnable.isChecked() ? STATUS_ON : STATUS_OFF); - QYWXAppSettingVo QYWXAppSettingVoNew = new QYWXAppSettingVo( - editTextQYWXAppCorpID.getText().toString().trim(), - editTextQYWXAppAgentID.getText().toString().trim(), - editTextQYWXAppSecret.getText().toString().trim(), - editTextQYWXAppToUser.getText().toString().trim(), - switchQYWXAppAtAll.isChecked()); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(QYWXAppSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextQYWXAppName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_QYWX_APP); - senderModel.setStatus(switchQYWXAppEnable.isChecked() ? STATUS_ON : STATUS_OFF); - QYWXAppSettingVo QYWXAppSettingVoNew = new QYWXAppSettingVo( - editTextQYWXAppCorpID.getText().toString().trim(), - editTextQYWXAppAgentID.getText().toString().trim(), - editTextQYWXAppSecret.getText().toString().trim(), - editTextQYWXAppToUser.getText().toString().trim(), - switchQYWXAppAtAll.isChecked()); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(QYWXAppSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); }); + buttonQYWXAppDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -1029,14 +1083,18 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); - buttonQYWXAppTest.setOnClickListener(view -> { + buttonQYWXAppTest.setOnClickListener(view -> { QYWXAppSettingVo QYWXAppSettingVoNew = new QYWXAppSettingVo( editTextQYWXAppCorpID.getText().toString().trim(), editTextQYWXAppAgentID.getText().toString().trim(), editTextQYWXAppSecret.getText().toString().trim(), editTextQYWXAppToUser.getText().toString().trim(), switchQYWXAppAtAll.isChecked()); + if (!QYWXAppSettingVoNew.checkParms()) { + Toast.makeText(SenderActivity.this, R.string.invalid_webcom_app_parm, Toast.LENGTH_LONG).show(); + return; + } if (QYWXAppSettingVoNew.getToUser().isEmpty()) { Toast.makeText(SenderActivity.this, R.string.invalid_at_mobiles, Toast.LENGTH_LONG).show(); return; @@ -1051,6 +1109,102 @@ public class SenderActivity extends AppCompatActivity { }); } + //Server酱·Turbo版 + private void setServerChan(final SenderModel senderModel, final boolean isClone) { + ServerChanSettingVo serverchanSettingVo = null; + //try phrase json setting + if (senderModel != null) { + String jsonSettingStr = senderModel.getJsonSetting(); + if (jsonSettingStr != null) { + serverchanSettingVo = JSON.parseObject(jsonSettingStr, ServerChanSettingVo.class); + } + } + + final AlertDialog.Builder alertDialog71 = new AlertDialog.Builder(SenderActivity.this); + View view1 = View.inflate(SenderActivity.this, R.layout.alert_dialog_setview_serverchan, null); + + final EditText editTextServerChanName = view1.findViewById(R.id.editTextServerChanName); + @SuppressLint("UseSwitchCompatOrMaterialCode") final Switch switchServerChanEnable = view1.findViewById(R.id.switchServerChanEnable); + if (senderModel != null) { + editTextServerChanName.setText(senderModel.getName()); + switchServerChanEnable.setChecked(senderModel.getStatusChecked()); + } + + final ClearEditText editTextServerChanSendKey = view1.findViewById(R.id.editTextServerChanSendKey); + if (serverchanSettingVo != null) + editTextServerChanSendKey.setText(serverchanSettingVo.getSendKey()); + + Button buttonServerChanOk = view1.findViewById(R.id.buttonServerChanOk); + Button buttonServerChanDel = view1.findViewById(R.id.buttonServerChanDel); + Button buttonServerChanTest = view1.findViewById(R.id.buttonServerChanTest); + alertDialog71 + .setTitle(R.string.setserverchantitle) + .setIcon(R.mipmap.serverchan) + .setView(view1) + .create(); + final AlertDialog show = alertDialog71.show(); + + buttonServerChanOk.setOnClickListener(view -> { + String senderName = editTextServerChanName.getText().toString().trim(); + int senderStatus = switchServerChanEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + + String serverChanServer = editTextServerChanSendKey.getText().toString().trim(); + if (TextUtils.isEmpty(serverChanServer)) { + Toast.makeText(SenderActivity.this, R.string.invalid_sendkey, Toast.LENGTH_LONG).show(); + return; + } + ServerChanSettingVo serverChanSettingVoNew = new ServerChanSettingVo(serverChanServer); + + if (isClone || senderModel == null) { + SenderModel newSenderModel = new SenderModel(); + newSenderModel.setName(senderName); + newSenderModel.setType(TYPE_SERVER_CHAN); + newSenderModel.setStatus(senderStatus); + newSenderModel.setJsonSetting(JSON.toJSONString(serverChanSettingVoNew)); + SenderUtil.addSender(newSenderModel); + initSenders(); + adapter.add(senderModels); + } else { + senderModel.setName(senderName); + senderModel.setType(TYPE_SERVER_CHAN); + senderModel.setStatus(senderStatus); + senderModel.setJsonSetting(JSON.toJSONString(serverChanSettingVoNew)); + SenderUtil.updateSender(senderModel); + initSenders(); + adapter.update(senderModels); + } + show.dismiss(); + }); + + buttonServerChanDel.setOnClickListener(view -> { + if (senderModel != null) { + SenderUtil.delSender(senderModel.getId()); + initSenders(); + adapter.del(senderModels); + } + show.dismiss(); + }); + + buttonServerChanTest.setOnClickListener(view -> { + String serverChanServer = editTextServerChanSendKey.getText().toString().trim(); + if (TextUtils.isEmpty(serverChanServer)) { + Toast.makeText(SenderActivity.this, R.string.invalid_sendkey, Toast.LENGTH_LONG).show(); + return; + } + + try { + SenderServerChanMsg.sendMsg(0, handler, serverChanServer, getString(R.string.test_phone_num), getString(R.string.test_sms)); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + }); + } + //Telegram机器人 private void setTelegram(final SenderModel senderModel, final boolean isClone) { TelegramSettingVo telegramSettingVo = null; @@ -1142,52 +1296,60 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonTelegramOk.setOnClickListener(view -> { + String senderName = editTextTelegramName.getText().toString().trim(); + int senderStatus = switchTelegramEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + + String apiToken = editTextTelegramApiToken.getText().toString().trim(); + String chatId = editTextTelegramChatId.getText().toString().trim(); + if (apiToken.isEmpty() || chatId.isEmpty()) { + Toast.makeText(SenderActivity.this, R.string.invalid_apiToken_or_chatId, Toast.LENGTH_LONG).show(); + return; + } + + int proxyTypeId = radioGroupProxyType.getCheckedRadioButtonId(); + String proxyHost = editTextProxyHost.getText().toString().trim(); + String proxyPort = editTextProxyPort.getText().toString().trim(); + if (proxyTypeId != R.id.btnProxyNone && (TextUtils.isEmpty(proxyHost) || TextUtils.isEmpty(proxyPort))) { + Toast.makeText(SenderActivity.this, R.string.invalid_host_or_port, Toast.LENGTH_LONG).show(); + return; + } + + boolean proxyAuthenticator = switchProxyAuthenticator.isChecked(); + String proxyUsername = editTextProxyUsername.getText().toString().trim(); + String proxyPassword = editTextProxyPassword.getText().toString().trim(); + if (proxyAuthenticator && TextUtils.isEmpty(proxyUsername) && TextUtils.isEmpty(proxyPassword)) { + Toast.makeText(SenderActivity.this, R.string.invalid_username_or_password, Toast.LENGTH_LONG).show(); + return; + } + + String method = radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST"; + TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo(apiToken, chatId, proxyTypeId, proxyHost, proxyPort, proxyAuthenticator, proxyUsername, proxyPassword, method); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextTelegramName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_TELEGRAM); - newSenderModel.setStatus(switchTelegramEnable.isChecked() ? STATUS_ON : STATUS_OFF); - TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo( - editTextTelegramApiToken.getText().toString().trim(), - editTextTelegramChatId.getText().toString().trim(), - radioGroupProxyType.getCheckedRadioButtonId(), - editTextProxyHost.getText().toString().trim(), - editTextProxyPort.getText().toString().trim(), - switchProxyAuthenticator.isChecked(), - editTextProxyUsername.getText().toString().trim(), - editTextProxyPassword.getText().toString().trim(), - (radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST") - - ); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(telegramSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextTelegramName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_TELEGRAM); - senderModel.setStatus(switchTelegramEnable.isChecked() ? STATUS_ON : STATUS_OFF); - TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo( - editTextTelegramApiToken.getText().toString().trim(), - editTextTelegramChatId.getText().toString().trim(), - radioGroupProxyType.getCheckedRadioButtonId(), - editTextProxyHost.getText().toString().trim(), - editTextProxyPort.getText().toString().trim(), - switchProxyAuthenticator.isChecked(), - editTextProxyUsername.getText().toString().trim(), - editTextProxyPassword.getText().toString().trim(), - (radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST") - ); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(telegramSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); - }); + buttonTelegramDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -1196,29 +1358,39 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonTelegramTest.setOnClickListener(view -> { String apiToken = editTextTelegramApiToken.getText().toString().trim(); String chatId = editTextTelegramChatId.getText().toString().trim(); - if (!apiToken.isEmpty() && !chatId.isEmpty()) { - try { - TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo( - apiToken, - chatId, - radioGroupProxyType.getCheckedRadioButtonId(), - editTextProxyHost.getText().toString().trim(), - editTextProxyPort.getText().toString().trim(), - switchProxyAuthenticator.isChecked(), - editTextProxyUsername.getText().toString().trim(), - editTextProxyPassword.getText().toString().trim(), - (radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST") - ); - SenderTelegramMsg.sendMsg(0, handler, telegramSettingVoNew, getString(R.string.test_phone_num), getString(R.string.test_sms), telegramSettingVoNew.getMethod()); - } catch (Exception e) { - Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + if (apiToken.isEmpty() || chatId.isEmpty()) { Toast.makeText(SenderActivity.this, R.string.invalid_apiToken_or_chatId, Toast.LENGTH_LONG).show(); + return; + } + + int proxyTypeId = radioGroupProxyType.getCheckedRadioButtonId(); + String proxyHost = editTextProxyHost.getText().toString().trim(); + String proxyPort = editTextProxyPort.getText().toString().trim(); + if (proxyTypeId != R.id.btnProxyNone && (TextUtils.isEmpty(proxyHost) || TextUtils.isEmpty(proxyPort))) { + Toast.makeText(SenderActivity.this, R.string.invalid_host_or_port, Toast.LENGTH_LONG).show(); + return; + } + + boolean proxyAuthenticator = switchProxyAuthenticator.isChecked(); + String proxyUsername = editTextProxyUsername.getText().toString().trim(); + String proxyPassword = editTextProxyPassword.getText().toString().trim(); + if (proxyAuthenticator && TextUtils.isEmpty(proxyUsername) && TextUtils.isEmpty(proxyPassword)) { + Toast.makeText(SenderActivity.this, R.string.invalid_username_or_password, Toast.LENGTH_LONG).show(); + return; + } + + String method = radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST"; + + try { + TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo(apiToken, chatId, proxyTypeId, proxyHost, proxyPort, proxyAuthenticator, proxyUsername, proxyPassword, method); + SenderTelegramMsg.sendMsg(0, handler, telegramSettingVoNew, getString(R.string.test_phone_num), getString(R.string.test_sms), telegramSettingVoNew.getMethod()); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -1265,39 +1437,51 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonSmsOk.setOnClickListener(view -> { + String senderName = editTextSmsName.getText().toString().trim(); + int senderStatus = switchSmsEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + + Boolean onlyNoNetwork = switchSmsOnlyNoNetwork.isChecked(); + String mobiles = editTextSmsMobiles.getText().toString().trim(); + if (TextUtils.isEmpty(mobiles)) { + Toast.makeText(SenderActivity.this, R.string.invalid_phone_num, Toast.LENGTH_LONG).show(); + return; + } if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextSmsName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_SMS); - newSenderModel.setStatus(switchSmsEnable.isChecked() ? STATUS_ON : STATUS_OFF); + newSenderModel.setStatus(senderStatus); SmsSettingVo smsSettingVoNew = new SmsSettingVo( newSenderModel.getSmsSimSlotId(radioGroupSmsSimSlot.getCheckedRadioButtonId()), - editTextSmsMobiles.getText().toString().trim(), - switchSmsOnlyNoNetwork.isChecked() + mobiles, + onlyNoNetwork ); newSenderModel.setJsonSetting(JSON.toJSONString(smsSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextSmsName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_SMS); - senderModel.setStatus(switchSmsEnable.isChecked() ? STATUS_ON : STATUS_OFF); + senderModel.setStatus(senderStatus); SmsSettingVo smsSettingVoNew = new SmsSettingVo( senderModel.getSmsSimSlotId(radioGroupSmsSimSlot.getCheckedRadioButtonId()), - editTextSmsMobiles.getText().toString().trim(), - switchSmsOnlyNoNetwork.isChecked() + mobiles, + onlyNoNetwork ); senderModel.setJsonSetting(JSON.toJSONString(smsSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); - }); + buttonSmsDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -1306,22 +1490,21 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonSmsTest.setOnClickListener(view -> { - int simSlot = 0; - if (R.id.btnSmsSimSlot2 == radioGroupSmsSimSlot.getCheckedRadioButtonId()) { - simSlot = 1; - } - String mobiles = editTextSmsMobiles.getText().toString().trim(); + int simSlot = R.id.btnSmsSimSlot2 == radioGroupSmsSimSlot.getCheckedRadioButtonId() ? 1 : 0; Boolean onlyNoNetwork = switchSmsOnlyNoNetwork.isChecked(); - if (!mobiles.isEmpty()) { - try { - 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + String mobiles = editTextSmsMobiles.getText().toString().trim(); + if (TextUtils.isEmpty(mobiles)) { Toast.makeText(SenderActivity.this, R.string.invalid_phone_num, Toast.LENGTH_LONG).show(); + return; + } + + try { + 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, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -1364,26 +1547,34 @@ public class SenderActivity extends AppCompatActivity { .create(); final AlertDialog show = alertDialog71.show(); buttonFeishuOk.setOnClickListener(view -> { + String senderName = editTextFeishuName.getText().toString().trim(); + int senderStatus = switchFeishuEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + String webHook = editTextFeishuWebhook.getText().toString().trim(); + String secret = editTextFeishuSecret.getText().toString().trim(); + if (!CommonUtil.checkUrl(webHook, false)) { + Toast.makeText(SenderActivity.this, R.string.invalid_webhook, Toast.LENGTH_LONG).show(); + return; + } + + FeiShuSettingVo feiShuSettingVoNew = new FeiShuSettingVo(webHook, secret); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextFeishuName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_FEISHU); - newSenderModel.setStatus(switchFeishuEnable.isChecked() ? STATUS_ON : STATUS_OFF); - FeiShuSettingVo feiShuSettingVoNew = new FeiShuSettingVo( - editTextFeishuWebhook.getText().toString().trim(), - editTextFeishuSecret.getText().toString().trim()); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(feiShuSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextFeishuName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_FEISHU); - senderModel.setStatus(switchFeishuEnable.isChecked() ? STATUS_ON : STATUS_OFF); - FeiShuSettingVo feiShuSettingVoNew = new FeiShuSettingVo( - editTextFeishuWebhook.getText().toString().trim(), - editTextFeishuSecret.getText().toString().trim()); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(feiShuSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); @@ -1402,17 +1593,18 @@ public class SenderActivity extends AppCompatActivity { }); buttonFeishuTest.setOnClickListener(view -> { - String token = editTextFeishuWebhook.getText().toString().trim(); + String webHook = editTextFeishuWebhook.getText().toString().trim(); String secret = editTextFeishuSecret.getText().toString().trim(); - if (!token.isEmpty()) { - try { - SenderFeishuMsg.sendMsg(0, handler, token, secret, getString(R.string.test_phone_num), new Date(), getString(R.string.test_sms)); - } catch (Exception e) { - Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + if (!CommonUtil.checkUrl(webHook, false)) { Toast.makeText(SenderActivity.this, R.string.invalid_webhook, Toast.LENGTH_LONG).show(); + return; + } + + try { + SenderFeishuMsg.sendMsg(0, handler, webHook, secret, getString(R.string.test_phone_num), new Date(), getString(R.string.test_sms)); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -1466,38 +1658,41 @@ public class SenderActivity extends AppCompatActivity { .create(); final AlertDialog show = alertDialog71.show(); buttonPushPlusOk.setOnClickListener(view -> { + String senderName = editTextPushPlusName.getText().toString().trim(); + int senderStatus = switchPushPlusEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + + PushPlusSettingVo pushPlusSettingVoNew = new PushPlusSettingVo( + editTextPushPlusToken.getText().toString().trim(), + editTextPushPlusTopic.getText().toString().trim(), + editTextPushPlusTemplate.getText().toString().trim(), + editTextPushPlusChannel.getText().toString().trim(), + editTextPushPlusWebhook.getText().toString().trim(), + editTextPushPlusCallbackUrl.getText().toString().trim(), + editTextPushPlusValidTime.getText().toString().trim() + ); + if (TextUtils.isEmpty(pushPlusSettingVoNew.getToken())) { + Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show(); + return; + } if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextPushPlusName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_PUSHPLUS); - newSenderModel.setStatus(switchPushPlusEnable.isChecked() ? STATUS_ON : STATUS_OFF); - PushPlusSettingVo pushPlusSettingVoNew = new PushPlusSettingVo( - editTextPushPlusToken.getText().toString().trim(), - editTextPushPlusTopic.getText().toString().trim(), - editTextPushPlusTemplate.getText().toString().trim(), - editTextPushPlusChannel.getText().toString().trim(), - editTextPushPlusWebhook.getText().toString().trim(), - editTextPushPlusCallbackUrl.getText().toString().trim(), - editTextPushPlusValidTime.getText().toString().trim() - ); + newSenderModel.setStatus(senderStatus); + newSenderModel.setJsonSetting(JSON.toJSONString(pushPlusSettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextPushPlusName.getText().toString()); + senderModel.setName(senderName); senderModel.setType(TYPE_PUSHPLUS); - senderModel.setStatus(switchPushPlusEnable.isChecked() ? STATUS_ON : STATUS_OFF); - PushPlusSettingVo pushPlusSettingVoNew = new PushPlusSettingVo( - editTextPushPlusToken.getText().toString().trim(), - editTextPushPlusTopic.getText().toString().trim(), - editTextPushPlusTemplate.getText().toString().trim(), - editTextPushPlusChannel.getText().toString().trim(), - editTextPushPlusWebhook.getText().toString().trim(), - editTextPushPlusCallbackUrl.getText().toString().trim(), - editTextPushPlusValidTime.getText().toString().trim() - ); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(pushPlusSettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); @@ -1526,16 +1721,16 @@ public class SenderActivity extends AppCompatActivity { editTextPushPlusValidTime.getText().toString().trim() ); - String token = pushPlusSettingVoNew.getToken(); - if (token != null && !token.isEmpty()) { - try { - SenderPushPlusMsg.sendMsg(0, handler, pushPlusSettingVoNew, "SmsForwarder", getString(R.string.test_content) + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); - } catch (Exception e) { - Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - } else { + if (TextUtils.isEmpty(pushPlusSettingVoNew.getToken())) { Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show(); + return; + } + + try { + SenderPushPlusMsg.sendMsg(0, handler, pushPlusSettingVoNew, "SmsForwarder", getString(R.string.test_content) + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); } }); } @@ -1582,8 +1777,15 @@ public class SenderActivity extends AppCompatActivity { final AlertDialog show = alertDialog71.show(); buttonGotifyOk.setOnClickListener(view -> { + String senderName = editTextGotifyName.getText().toString().trim(); + int senderStatus = switchGotifyEnable.isChecked() ? STATUS_ON : STATUS_OFF; + if (TextUtils.isEmpty(senderName)) { + Toast.makeText(SenderActivity.this, R.string.invalid_name, Toast.LENGTH_LONG).show(); + return; + } + String webServer = editTextGotifyWebServer.getText().toString().trim(); - if (webServer.isEmpty()) { + if (!CommonUtil.checkUrl(webServer, false)) { Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); return; } @@ -1597,25 +1799,25 @@ public class SenderActivity extends AppCompatActivity { if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); - newSenderModel.setName(editTextGotifyName.getText().toString().trim()); + newSenderModel.setName(senderName); newSenderModel.setType(TYPE_GOTIFY); - newSenderModel.setStatus(switchGotifyEnable.isChecked() ? STATUS_ON : STATUS_OFF); + newSenderModel.setStatus(senderStatus); newSenderModel.setJsonSetting(JSON.toJSONString(gotifySettingVoNew)); SenderUtil.addSender(newSenderModel); initSenders(); adapter.add(senderModels); } else { - senderModel.setName(editTextGotifyName.getText().toString().trim()); + senderModel.setName(senderName); senderModel.setType(TYPE_GOTIFY); - senderModel.setStatus(switchGotifyEnable.isChecked() ? STATUS_ON : STATUS_OFF); + senderModel.setStatus(senderStatus); senderModel.setJsonSetting(JSON.toJSONString(gotifySettingVoNew)); SenderUtil.updateSender(senderModel); initSenders(); adapter.update(senderModels); } - show.dismiss(); }); + buttonGotifyDel.setOnClickListener(view -> { if (senderModel != null) { SenderUtil.delSender(senderModel.getId()); @@ -1624,9 +1826,10 @@ public class SenderActivity extends AppCompatActivity { } show.dismiss(); }); + buttonGotifyTest.setOnClickListener(view -> { String webServer = editTextGotifyWebServer.getText().toString().trim(); - if (webServer.isEmpty()) { + if (!CommonUtil.checkUrl(webServer, false)) { Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); return; } @@ -1647,55 +1850,33 @@ public class SenderActivity extends AppCompatActivity { }); - Button buttonInsertSender = view1.findViewById(R.id.bt_insert_sender); buttonInsertSender.setOnClickListener(view -> { editTextGotifyTitle.setFocusable(true); editTextGotifyTitle.requestFocus(); - editTextGotifyTitle.append("{{来源号码}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextGotifyTitle, "{{来源号码}}"); }); Button buttonInsertExtra = view1.findViewById(R.id.bt_insert_extra); buttonInsertExtra.setOnClickListener(view -> { editTextGotifyTitle.setFocusable(true); editTextGotifyTitle.requestFocus(); - editTextGotifyTitle.append("{{卡槽信息}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextGotifyTitle, "{{卡槽信息}}"); }); Button buttonInsertTime = view1.findViewById(R.id.bt_insert_time); buttonInsertTime.setOnClickListener(view -> { editTextGotifyTitle.setFocusable(true); editTextGotifyTitle.requestFocus(); - editTextGotifyTitle.append("{{接收时间}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextGotifyTitle, "{{接收时间}}"); }); Button buttonInsertDeviceName = view1.findViewById(R.id.bt_insert_device_name); buttonInsertDeviceName.setOnClickListener(view -> { editTextGotifyTitle.setFocusable(true); editTextGotifyTitle.requestFocus(); - editTextGotifyTitle.append("{{设备名称}}"); + CommonUtil.insertOrReplaceText2Cursor(editTextGotifyTitle, "{{设备名称}}"); }); } - - @Override - protected void onDestroy() { - Log.d(TAG, "onDestroy"); - super.onDestroy(); - } - - @Override - protected void onResume() { - super.onResume(); - MobclickAgent.onPageStart(TAG); - MobclickAgent.onResume(this); - } - - @Override - protected void onPause() { - super.onPause(); - MobclickAgent.onPageEnd(TAG); - MobclickAgent.onPause(this); - } - } diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/RuleAdapter.java b/app/src/main/java/com/idormy/sms/forwarder/adapter/RuleAdapter.java index 07b24606..6b16ceb2 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/adapter/RuleAdapter.java +++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/RuleAdapter.java @@ -63,6 +63,7 @@ public class RuleAdapter extends ArrayAdapter { viewHolder.ruleMatch = view.findViewById(R.id.rule_match); viewHolder.ruleSender = view.findViewById(R.id.rule_sender); viewHolder.ruleSenderImage = view.findViewById(R.id.rule_sender_image); + viewHolder.ruleSenderStatus = view.findViewById(R.id.rule_sender_status); // 将ViewHolder存储在View中(即将控件的实例存储在其中) view.setTag(viewHolder); @@ -78,6 +79,7 @@ public class RuleAdapter extends ArrayAdapter { if (!senderModel.isEmpty()) { viewHolder.ruleSender.setText(senderModel.get(0).getName()); viewHolder.ruleSenderImage.setImageResource(senderModel.get(0).getImageId()); + viewHolder.ruleSenderStatus.setImageResource(senderModel.get(0).getStatusImageId()); } else { viewHolder.ruleSender.setText(""); } @@ -112,6 +114,7 @@ public class RuleAdapter extends ArrayAdapter { TextView ruleMatch; TextView ruleSender; ImageView ruleSenderImage; + ImageView ruleSenderStatus; } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java b/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java index 69395194..146d7d4f 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java @@ -20,6 +20,8 @@ import lombok.Data; @SuppressWarnings({"unused"}) @Data public class RuleModel { + public static final int STATUS_ON = 1; + public static final int STATUS_OFF = 0; public static final String FILED_TRANSPOND_ALL = "transpond_all"; public static final String FILED_PHONE_NUM = "phone_num"; public static final String FILED_PACKAGE_NAME = "package_name"; @@ -305,6 +307,11 @@ public class RuleModel { return switchRegexReplace; } + + public boolean getStatusChecked() { + return !(status == STATUS_OFF); + } + @NonNull @Override public String toString() { @@ -315,6 +322,7 @@ public class RuleModel { ", value='" + value + '\'' + ", senderId=" + senderId + ", time=" + time + + ", status=" + status + '}'; } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/QYWXAppSettingVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/QYWXAppSettingVo.java index 9a801909..d5dbea2c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/vo/QYWXAppSettingVo.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/QYWXAppSettingVo.java @@ -1,5 +1,7 @@ package com.idormy.sms.forwarder.model.vo; +import android.text.TextUtils; + import java.io.Serializable; import lombok.Data; @@ -32,4 +34,12 @@ public class QYWXAppSettingVo implements Serializable { return accessToken; } + public boolean checkParms() { + if (TextUtils.isEmpty(corpID)) return false; + if (TextUtils.isEmpty(agentID)) return false; + if (TextUtils.isEmpty(secret)) return false; + + return true; + } + } diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java index c8529ee5..9fafbde9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java @@ -13,6 +13,7 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_SMS; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_TELEGRAM; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_WEB_NOTIFY; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.util.Log; @@ -86,13 +87,13 @@ public class SendUtil { * 从日志获取消息内容并尝试重发 * 根据当前rule和sender来重发,而不是失败时设置的规则 * - * @param context + * @param context 上下文 * @param handler 回调,用于刷新日志列表 * @param logVo 日志 */ public static void resendMsgByLog(Context context, Handler handler, LogVo logVo) { Log.d(TAG, logVo.toString()); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); try { date = sdf.parse(logVo.getTime()); diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java index 0659118d..c1ca7b52 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java @@ -8,6 +8,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.text.TextUtils; +import android.widget.EditText; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationManagerCompat; @@ -17,6 +19,8 @@ import com.idormy.sms.forwarder.service.NotifyService; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 常用工具类 @@ -140,4 +144,22 @@ public class CommonUtil { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } + + //是否合法的url + public static boolean checkUrl(String urls, boolean emptyResult) { + if (TextUtils.isEmpty(urls)) return emptyResult; + + String regex = "(ht|f)tp(s?)\\:\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\&%\\+\\$#_=]*)?"; + Pattern pat = Pattern.compile(regex); + Matcher mat = pat.matcher(urls.trim()); + boolean result = mat.matches(); + return result; + } + + //焦点位置插入文本 + public static void insertOrReplaceText2Cursor(EditText editText, String str) { + int start = Math.max(editText.getSelectionStart(), 0); + int end = Math.max(editText.getSelectionEnd(), 0); + editText.getText().replace(Math.min(start, end), Math.max(start, end), str, 0, str.length()); + } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java index 759d04dc..1d34628c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java @@ -46,6 +46,7 @@ public class RuleUtil { values.put(RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT, ruleModel.getSimSlot()); values.put(RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE, ruleModel.getSmsTemplate()); values.put(RuleTable.RuleEntry.COLUMN_REGEX_REPLACE, ruleModel.getRegexReplace()); + values.put(RuleTable.RuleEntry.COLUMN_NAME_STATUS, ruleModel.getStatus()); // Insert the new row, returning the primary key value of the new row @@ -64,6 +65,7 @@ public class RuleUtil { values.put(RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT, ruleModel.getSimSlot()); values.put(RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE, ruleModel.getSmsTemplate()); values.put(RuleTable.RuleEntry.COLUMN_REGEX_REPLACE, ruleModel.getRegexReplace()); + values.put(RuleTable.RuleEntry.COLUMN_NAME_STATUS, ruleModel.getStatus()); String selection = RuleTable.RuleEntry._ID + " = ? "; String[] whereArgs = {String.valueOf(ruleModel.getId())}; @@ -103,6 +105,7 @@ public class RuleUtil { RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT, RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE, RuleTable.RuleEntry.COLUMN_REGEX_REPLACE, + RuleTable.RuleEntry.COLUMN_NAME_STATUS, }; // Define 'where' part of query. String selection = " 1 = 1 "; @@ -168,6 +171,8 @@ public class RuleUtil { cursor.getColumnIndexOrThrow(RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE)); String regexReplace = cursor.getString( cursor.getColumnIndexOrThrow(RuleTable.RuleEntry.COLUMN_REGEX_REPLACE)); + int itemStatus = cursor.getInt( + cursor.getColumnIndexOrThrow(RuleTable.RuleEntry.COLUMN_NAME_STATUS)); Log.d(TAG, "getRule: itemId" + itemId); RuleModel ruleModel = new RuleModel(); @@ -183,6 +188,7 @@ public class RuleUtil { ruleModel.setSmsTemplate(smsTemplate); ruleModel.setSwitchRegexReplace(!regexReplace.trim().isEmpty()); ruleModel.setRegexReplace(regexReplace); + ruleModel.setStatus(itemStatus); tRules.add(ruleModel); } diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml new file mode 100644 index 00000000..70046c48 --- /dev/null +++ b/app/src/main/res/drawable/ic_add.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_sender.xml b/app/src/main/res/layout/activity_sender.xml index 9643857d..64173eea 100644 --- a/app/src/main/res/layout/activity_sender.xml +++ b/app/src/main/res/layout/activity_sender.xml @@ -1,39 +1,37 @@ - + android:layout_height="match_parent"> + + + + - - - - -