From 8b72d2f84a9fab6041b3518468dcfff9d46d145b Mon Sep 17 00:00:00 2001 From: dss886 Date: Fri, 22 Sep 2017 23:02:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=92=89=E9=92=89=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=9C=BA=E5=99=A8=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 39 ++++++++----- app/build.gradle | 1 + .../com/dss886/transmis/MainActivity.java | 39 ++++++++++++- .../dss886/transmis/call/CallActivity.java | 12 ++-- .../dss886/transmis/call/CallListener.java | 13 +++-- .../transmis/sender/DingDingSender.java | 56 +++++++++++++++++++ .../transmis/{mail => sender}/MailSender.java | 2 +- .../com/dss886/transmis/sms/SmsActivity.java | 16 ++++-- .../com/dss886/transmis/sms/SmsListener.java | 17 ++++-- .../java/com/dss886/transmis/utils/Tags.java | 8 ++- .../main/res/layout/view_dialog_edit_text.xml | 1 + 11 files changed, 164 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/dss886/transmis/sender/DingDingSender.java rename app/src/main/java/com/dss886/transmis/{mail => sender}/MailSender.java (98%) diff --git a/README.md b/README.md index a8cf3c4..897a2eb 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,6 @@ 备用机通知提醒转发程序,会在收到短信或者未接电话时自动发送提醒内容至指定邮箱。 -### 快速上手 - -首先需要在【首页- 邮件参数设置】中填入邮箱的相关信息: - -1. SMTP服务器:邮箱的发件服务器地址,如 smtp.qq.com -2. 端口号:SMTP服务器的端口号,注意本程序默认启用了SSL加密,一般SMTP服务器的端口号为 465 -3. 发件人昵称:默认为 Transmis,若收件人和发件人地址相同,收到提醒时可能不会显示自定义的昵称,而显示 “我” -4. 发件人邮箱:用于发送提醒邮件的邮箱,例如 xxxx@qq.com -5. 发件人密码/授权码:用于发送提醒邮件的密码,QQ邮箱可在邮箱设置中生成一组三方邮件服务专用的授权码,其他邮箱可能需要输入登录密码 -6. 收件人邮箱:用于接收提醒的邮箱,例如 yyyy@qq.com - -然后打开主界面的主开关即可 - ### 权限说明 由于显而易见的原因,本程序需要以下权限才能正常工作 @@ -27,7 +14,7 @@ 在某些系统上(如小米、华为等)可能需要手动在启动管理中将本程序设置为【允许被系统唤醒】 -### 邮件提醒模板 +### 提醒内容设置 短信提醒: @@ -39,6 +26,28 @@ 1. 标题:默认为【你的备用机有一个未接电话】,可进行设置,暂不支持通配符 2. 内容:默认为【电话:%s \n时间:%s \n响铃:%s 秒】,通配符【%s】分别代表电话号码、呼入时间和响铃时间 +### 提醒方式设置 + +本程序支持「邮件提醒」和「钉钉提醒」两种方式,可同时启用。 + +使用邮件提醒时,首先需要在【首页- 邮件参数设置】中填入邮箱的相关信息: + +1. SMTP服务器:邮箱的发件服务器地址,如 smtp.qq.com +2. 端口号:SMTP服务器的端口号,注意本程序默认启用了SSL加密,一般SMTP服务器的端口号为 465 +3. 发件人昵称:默认为 Transmis,若收件人和发件人地址相同,收到提醒时可能不会显示自定义的昵称,而显示 “我” +4. 发件人邮箱:用于发送提醒邮件的邮箱,例如 xxxx@qq.com +5. 发件人密码/授权码:用于发送提醒邮件的密码,QQ邮箱可在邮箱设置中生成一组三方邮件服务专用的授权码,其他邮箱可能需要输入登录密码 +6. 收件人邮箱:用于接收提醒的邮箱,例如 yyyy@qq.com + +使用钉钉提醒时,需要执行下列步骤: + +1. 任意拉两个人成立一个群组,然后将其他人踢出群。 +2. 在群设置->群机器人中添加一个新的「自定义机器人」 +3. 复制自定义机器人的链接中的“access_token=”后面的内容 +4. 点击Transmis首页的钉钉机器人设置,输入复制的Token + +然后打开主界面的主开关,以及短信和电话相应提醒开关即可 + ### 其他可选项 1. 合并长短信:收到同一发信人的连续多条短信时会自动将内容进行合并,不会多次提醒 @@ -46,7 +55,7 @@ # License Copyright (C) 2017 dss886 - + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or diff --git a/app/build.gradle b/app/build.gradle index 0d491e0..302feea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,4 +27,5 @@ dependencies { implementation 'com.android.support:appcompat-v7:25.3.1' implementation 'com.sun.mail:android-mail:1.5.5' implementation 'com.sun.mail:android-activation:1.5.5' + implementation 'com.squareup.okhttp3:okhttp:3.9.0' } diff --git a/app/src/main/java/com/dss886/transmis/MainActivity.java b/app/src/main/java/com/dss886/transmis/MainActivity.java index 60f7201..f90f534 100644 --- a/app/src/main/java/com/dss886/transmis/MainActivity.java +++ b/app/src/main/java/com/dss886/transmis/MainActivity.java @@ -1,11 +1,15 @@ package com.dss886.transmis; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; +import android.text.TextUtils; +import com.dss886.transmis.base.App; import com.dss886.transmis.base.BaseActivity; import com.dss886.transmis.call.CallActivity; import com.dss886.transmis.mail.MailActivity; import com.dss886.transmis.sms.SmsActivity; +import com.dss886.transmis.utils.DialogBuilder; import com.dss886.transmis.utils.Tags; import com.dss886.transmis.view.SectionItem; import com.dss886.transmis.view.SwitchItem; @@ -17,6 +21,7 @@ public class MainActivity extends BaseActivity { private TextItem mSmsItem; private TextItem mCallItem; private TextItem mMailItem; + private TextItem mDingDingItem; private TextItem mHelpItem; private TextItem mVersionItem; private TextItem mLicenseItem; @@ -35,9 +40,25 @@ protected boolean showToolbarBackIcon() { protected void addViews() { mGlobalSwitch = new SwitchItem(this, "总开关", Tags.SP_GLOBAL_ENABLE, false); mSmsItem = new TextItem(this, "短信提醒").showRightArrow() - .setCallback(sp -> sp.getBoolean(Tags.SP_SMS_ENABLE, true) ? "开" : "关"); + .setCallback(sp -> { + if (sp.getBoolean(Tags.SP_SMS_MAIL_ENABLE, true) || + sp.getBoolean(Tags.SP_SMS_DING_ENABLE, false)) { + return "开"; + } + return "关"; + }); mCallItem = new TextItem(this, "未接电话提醒").showRightArrow() - .setCallback(sp -> sp.getBoolean(Tags.SP_MISSED_CALL_ENABLE, true) ? "开" : "关"); + .setCallback(sp -> { + if (sp.getBoolean(Tags.SP_MISSED_CALL_MAIL_ENABLE, true) || + sp.getBoolean(Tags.SP_MISSED_CALL_DING_ENABLE, false)) { + return "开"; + } + return "关"; + }); + mDingDingItem = new TextItem(this, "钉钉机器人设置").setCallback(sp -> { + String value = sp.getString(Tags.SP_DING_TOKEN, null); + return TextUtils.isEmpty(value) ? "未设置" : "已设置"; + }); mMailItem = new TextItem(this, "邮件参数设置").showRightArrow(); mHelpItem = new TextItem(this, "使用帮助"); mVersionItem = new TextItem(this, "检查更新", "当前版本 v" + BuildConfig.VERSION_NAME); @@ -49,6 +70,7 @@ protected void addViews() { addView(mCallItem); addView(new SectionItem(this, "参数设置")); addView(mMailItem); + addView(mDingDingItem); addView(new SectionItem(this, "关于")); addView(mHelpItem); addView(mVersionItem); @@ -61,6 +83,19 @@ protected void setListeners() { mSmsItem.setOnClickListener(v -> startActivity(new Intent(this, SmsActivity.class))); mCallItem.setOnClickListener(v -> startActivity(new Intent(this, CallActivity.class))); mMailItem.setOnClickListener(v -> startActivity(new Intent(this, MailActivity.class))); + mDingDingItem.setOnClickListener(v -> { + String value = App.sp.getString(Tags.SP_DING_TOKEN, null); + DialogBuilder.showEditTextDialog(this, "请设置钉钉机器人的Token", value, false, content -> { + SharedPreferences.Editor editor = App.sp.edit(); + if (TextUtils.isEmpty(content)) { + editor.remove(Tags.SP_DING_TOKEN); + } else { + editor.putString(Tags.SP_DING_TOKEN, content); + } + editor.apply(); + mDingDingItem.onResume(); + }); + }); mHelpItem.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Tags.URL_README)))); mVersionItem.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Tags.URL_RELEASE)))); mLicenseItem.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Tags.URL_LICENSE)))); diff --git a/app/src/main/java/com/dss886/transmis/call/CallActivity.java b/app/src/main/java/com/dss886/transmis/call/CallActivity.java index c4963a3..43a61ad 100644 --- a/app/src/main/java/com/dss886/transmis/call/CallActivity.java +++ b/app/src/main/java/com/dss886/transmis/call/CallActivity.java @@ -14,7 +14,8 @@ public class CallActivity extends BaseActivity { - private SwitchItem mCallSwitch; + private SwitchItem mMailSwitch; + private SwitchItem mDingSwitch; private TextItem mTitleItem; private TextItem mContentItem; @@ -30,7 +31,8 @@ protected boolean showToolbarBackIcon() { @Override protected void addViews() { - mCallSwitch = new SwitchItem(this, "未接电话提醒", Tags.SP_MISSED_CALL_ENABLE, true); + mMailSwitch = new SwitchItem(this, "邮件提醒", Tags.SP_MISSED_CALL_MAIL_ENABLE, true); + mDingSwitch = new SwitchItem(this, "钉钉提醒", Tags.SP_MISSED_CALL_DING_ENABLE, false); mTitleItem = new TextItem(this, "邮件标题").setCallback(sp -> { String value = sp.getString(Tags.SP_CALL_TITLE_REGEX, "默认"); return TextUtils.isEmpty(value) ? "未设置" : value; @@ -40,7 +42,8 @@ protected void addViews() { return TextUtils.isEmpty(value) ? "未设置" : value; }); - addView(mCallSwitch); + addView(mMailSwitch); + addView(mDingSwitch); addView(new SectionItem(this, "提醒模版设置")); addView(mTitleItem); addView(mContentItem); @@ -49,7 +52,8 @@ protected void addViews() { @Override protected void setListeners() { - mCallSwitch.setOnClickListener(v -> {}); + mMailSwitch.setOnClickListener(v -> {}); + mDingSwitch.setOnClickListener(v -> {}); setTextItemListener(mTitleItem, Tags.SP_CALL_TITLE_REGEX, "设置标题"); setTextItemListener(mContentItem, Tags.SP_CALL_CONTENT_REGEX, "设置内容模版"); } diff --git a/app/src/main/java/com/dss886/transmis/call/CallListener.java b/app/src/main/java/com/dss886/transmis/call/CallListener.java index 145b20b..6407552 100644 --- a/app/src/main/java/com/dss886/transmis/call/CallListener.java +++ b/app/src/main/java/com/dss886/transmis/call/CallListener.java @@ -7,8 +7,9 @@ import android.telephony.TelephonyManager; import com.dss886.transmis.R; import com.dss886.transmis.base.App; +import com.dss886.transmis.sender.DingDingSender; import com.dss886.transmis.utils.Settings; -import com.dss886.transmis.mail.MailSender; +import com.dss886.transmis.sender.MailSender; import com.dss886.transmis.utils.Logger; import com.dss886.transmis.utils.Tags; @@ -32,8 +33,7 @@ public class CallListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Logger.d("Phone State Received."); - if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false) || - !Settings.is(Tags.SP_MISSED_CALL_ENABLE, true)) { + if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false)) { Logger.d("Call Transmis has been disable!"); return; } @@ -72,7 +72,12 @@ private void sendMail() { String contentRegex = App.sp.getString(Tags.SP_CALL_CONTENT_REGEX, App.me().getString(R.string.call_content_default)); String content = String.format(Locale.CHINA, contentRegex, sCallNumber, sdf.format(new Date(sRingTime)), ringTime); Logger.d("mail content: " + content); - new MailSender().send(titleRegex, content); + if (Settings.is(Tags.SP_MISSED_CALL_MAIL_ENABLE, false)) { + new MailSender().send(titleRegex, content); + } + if (Settings.is(Tags.SP_MISSED_CALL_DING_ENABLE, false)) { + new DingDingSender().send(titleRegex, content); + } } } diff --git a/app/src/main/java/com/dss886/transmis/sender/DingDingSender.java b/app/src/main/java/com/dss886/transmis/sender/DingDingSender.java new file mode 100644 index 0000000..d1c1f3b --- /dev/null +++ b/app/src/main/java/com/dss886/transmis/sender/DingDingSender.java @@ -0,0 +1,56 @@ +package com.dss886.transmis.sender; + +import android.text.TextUtils; +import android.util.Log; +import android.widget.Toast; +import com.dss886.transmis.base.App; +import com.dss886.transmis.utils.Tags; +import okhttp3.*; +import org.json.JSONObject; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +/** + * Created by dss886 on 2017/9/22. + */ + +public class DingDingSender { + + private static final String URL = "https://oapi.dingtalk.com/robot/send?access_token="; + + private MediaType mMediaType = MediaType.parse("application/json; charset=utf-8"); + private OkHttpClient mClient = new OkHttpClient(); + private Executor mExecutor = Executors.newSingleThreadExecutor(); + + public void send(String title, String content) { + if (TextUtils.isEmpty(title) || TextUtils.isEmpty(content)) { + return; + } + mExecutor.execute(() -> { + try { + String url = URL + App.sp.getString(Tags.SP_DING_TOKEN, null); + StringBuilder sb = new StringBuilder(); + sb.append(title).append("\n\n"); + for (String line : content.split("\n")) { + sb.append("> ").append(line).append("\n\n"); + } + JSONObject message = new JSONObject(); + message.put("msgtype", "markdown"); + JSONObject markdown = new JSONObject(); + markdown.put("title", title); + markdown.put("text", sb.toString().trim()); + message.put("markdown", markdown); + + RequestBody body = RequestBody.create(mMediaType, message.toString()); + Request request = new Request.Builder().url(url).post(body).build(); + Response response = mClient.newCall(request).execute(); + Log.d("DingDingSender", response.body().string()); + } catch (Exception e) { + Toast.makeText(App.me(), e.getMessage(), Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } + }); + } + +} diff --git a/app/src/main/java/com/dss886/transmis/mail/MailSender.java b/app/src/main/java/com/dss886/transmis/sender/MailSender.java similarity index 98% rename from app/src/main/java/com/dss886/transmis/mail/MailSender.java rename to app/src/main/java/com/dss886/transmis/sender/MailSender.java index 2a10ae3..a3fe097 100644 --- a/app/src/main/java/com/dss886/transmis/mail/MailSender.java +++ b/app/src/main/java/com/dss886/transmis/sender/MailSender.java @@ -1,4 +1,4 @@ -package com.dss886.transmis.mail; +package com.dss886.transmis.sender; import android.widget.Toast; import com.dss886.transmis.R; diff --git a/app/src/main/java/com/dss886/transmis/sms/SmsActivity.java b/app/src/main/java/com/dss886/transmis/sms/SmsActivity.java index 1185a71..2d7a7b2 100644 --- a/app/src/main/java/com/dss886/transmis/sms/SmsActivity.java +++ b/app/src/main/java/com/dss886/transmis/sms/SmsActivity.java @@ -14,7 +14,8 @@ public class SmsActivity extends BaseActivity { - private SwitchItem mSmsSwitch; + private SwitchItem mMailSwitch; + private SwitchItem mDingSwitch; private SwitchItem mMergeSwitch; private TextItem mTitleItem; private TextItem mContentItem; @@ -31,18 +32,20 @@ protected boolean showToolbarBackIcon() { @Override protected void addViews() { - mSmsSwitch = new SwitchItem(this, "短信提醒", Tags.SP_SMS_ENABLE, true); + mMailSwitch = new SwitchItem(this, "邮件提醒", Tags.SP_SMS_MAIL_ENABLE, true); + mDingSwitch = new SwitchItem(this, "钉钉提醒", Tags.SP_SMS_DING_ENABLE, false); mMergeSwitch = new SwitchItem(this, "合并长短信", Tags.SP_SMS_MERGE_LONG_TEXT, true); - mTitleItem = new TextItem(this, "邮件标题").setCallback(sp -> { + mTitleItem = new TextItem(this, "提醒标题").setCallback(sp -> { String value = sp.getString(Tags.SP_SMS_TITLE_REGEX, "默认"); return TextUtils.isEmpty(value) ? "未设置" : value; }); - mContentItem = new TextItem(this, "邮件内容模版").setCallback(sp -> { + mContentItem = new TextItem(this, "提醒内容模版").setCallback(sp -> { String value = sp.getString(Tags.SP_SMS_CONTENT_REGEX, "默认"); return TextUtils.isEmpty(value) ? "未设置" : value; }); - addView(mSmsSwitch); + addView(mMailSwitch); + addView(mDingSwitch); addView(new SectionItem(this, "可选项")); addView(mMergeSwitch); addView(new SectionItem(this, "提醒模版设置")); @@ -53,7 +56,8 @@ protected void addViews() { @Override protected void setListeners() { - mSmsSwitch.setOnClickListener(v -> {}); + mMailSwitch.setOnClickListener(v -> {}); + mDingSwitch.setOnClickListener(v -> {}); mMergeSwitch.setOnClickListener(v -> {}); setTextItemListener(mTitleItem, Tags.SP_SMS_TITLE_REGEX, "设置标题"); setTextItemListener(mContentItem, Tags.SP_SMS_CONTENT_REGEX, "设置内容模版"); diff --git a/app/src/main/java/com/dss886/transmis/sms/SmsListener.java b/app/src/main/java/com/dss886/transmis/sms/SmsListener.java index 23c4369..e109bc2 100644 --- a/app/src/main/java/com/dss886/transmis/sms/SmsListener.java +++ b/app/src/main/java/com/dss886/transmis/sms/SmsListener.java @@ -7,7 +7,8 @@ import android.telephony.SmsMessage; import com.dss886.transmis.R; import com.dss886.transmis.base.App; -import com.dss886.transmis.mail.MailSender; +import com.dss886.transmis.sender.DingDingSender; +import com.dss886.transmis.sender.MailSender; import com.dss886.transmis.utils.Logger; import com.dss886.transmis.utils.Settings; import com.dss886.transmis.utils.Tags; @@ -25,8 +26,7 @@ public class SmsListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Logger.d("SMS Received."); - if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false) || - !Settings.is(Tags.SP_SMS_ENABLE, true)) { + if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false)) { Logger.d("SMS Transmis has been disable!"); return; } @@ -40,7 +40,7 @@ public void onReceive(Context context, Intent intent) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } Logger.d("Try To Send Mail."); - sendMail(messages); + doNotify(messages); } catch (Exception e) { Logger.e(e.getMessage()); e.printStackTrace(); @@ -49,7 +49,7 @@ public void onReceive(Context context, Intent intent) { } } - private void sendMail(SmsMessage[] messages) { + private void doNotify(SmsMessage[] messages) { if (messages == null || messages.length == 0) { return; } @@ -68,6 +68,11 @@ private void sendMail(SmsMessage[] messages) { } content = sb.toString(); } - new MailSender().send(titleRegex, content); + if (Settings.is(Tags.SP_SMS_MAIL_ENABLE, false)) { + new MailSender().send(titleRegex, content); + } + if (Settings.is(Tags.SP_SMS_DING_ENABLE, false)) { + new DingDingSender().send(titleRegex, content); + } } } diff --git a/app/src/main/java/com/dss886/transmis/utils/Tags.java b/app/src/main/java/com/dss886/transmis/utils/Tags.java index b78158b..2af1017 100644 --- a/app/src/main/java/com/dss886/transmis/utils/Tags.java +++ b/app/src/main/java/com/dss886/transmis/utils/Tags.java @@ -10,8 +10,10 @@ public class Tags { public static final String URL_RELEASE = "https://github.com/dss886/Transmis/releases"; public static final String SP_GLOBAL_ENABLE = "global_enable"; - public static final String SP_SMS_ENABLE = "sms_enable"; - public static final String SP_MISSED_CALL_ENABLE = "missed_call_enable"; + public static final String SP_SMS_MAIL_ENABLE = "sms_enable"; + public static final String SP_SMS_DING_ENABLE = "sms_ding_enable"; + public static final String SP_MISSED_CALL_MAIL_ENABLE = "missed_call_enable"; + public static final String SP_MISSED_CALL_DING_ENABLE = "missed_call_ding_enable"; public static final String SP_MAIL_HOST = "mail_host"; public static final String SP_MAIL_PORT = "mail_port"; @@ -20,6 +22,8 @@ public class Tags { public static final String SP_MAIL_SEND_NAME = "mail_send_name"; public static final String SP_MAIL_RECEIVE_MAIL = "mail_receive_mail"; + public static final String SP_DING_TOKEN = "ding_ding_token"; + public static final String SP_SMS_TITLE_REGEX = "sms_title_regex"; public static final String SP_SMS_CONTENT_REGEX = "sms_content_regex"; public static final String SP_SMS_MERGE_LONG_TEXT = "sms_merge_long_text"; diff --git a/app/src/main/res/layout/view_dialog_edit_text.xml b/app/src/main/res/layout/view_dialog_edit_text.xml index b6a5b21..2b173e0 100644 --- a/app/src/main/res/layout/view_dialog_edit_text.xml +++ b/app/src/main/res/layout/view_dialog_edit_text.xml @@ -11,6 +11,7 @@ android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" + android:singleLine="true" android:maxLines="1"/> \ No newline at end of file