From aac73b17db5fcce7e865f8293ce2bdcc998dc668 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Sun, 21 Nov 2021 15:58:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=87=E6=A1=A3=EF=BC=88=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?GitHub=E7=9A=84wiki=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idormy/sms/forwarder/MainActivity.java | 10 + .../forwarder/sender/SenderDingdingMsg.java | 294 +++++++++--------- app/src/main/res/drawable/ic_help.xml | 10 + app/src/main/res/menu/menu_main.xml | 6 + app/src/main/res/values-en/strings.xml | 1 + app/src/main/res/values/strings.xml | 7 +- 6 files changed, 177 insertions(+), 151 deletions(-) create mode 100644 app/src/main/res/drawable/ic_help.xml 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 d2669696..9d583a31 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java @@ -3,6 +3,7 @@ package com.idormy.sms.forwarder; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -296,6 +297,12 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I startActivity(intent); } + public void toHelp() { + Uri uri = Uri.parse("https://github.com/pppscn/SmsForwarder/wiki"); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + startActivity(intent); + } + public void toRuleSetting(View view) { Intent intent = new Intent(this, RuleActivity.class); startActivity(intent); @@ -352,6 +359,9 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I case R.id.to_about: toAbout(); return true; + case R.id.to_help: + toHelp(); + return true; default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderDingdingMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderDingdingMsg.java index 584272b1..cb66e92a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderDingdingMsg.java +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderDingdingMsg.java @@ -1,148 +1,146 @@ -package com.idormy.sms.forwarder.sender; - -import android.os.Handler; -import android.text.TextUtils; -import android.util.Base64; -import android.util.Log; - -import androidx.annotation.NonNull; - -import com.alibaba.fastjson.JSON; -import com.idormy.sms.forwarder.utils.LogUtil; -import com.idormy.sms.forwarder.utils.SettingUtil; - -import java.io.IOException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.ObservableEmitter; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; - -@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"}) -public class SenderDingdingMsg extends SenderBaseMsg { - - static final String TAG = "SenderDingdingMsg"; - - public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception { - Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " content:" + content); - - if (token == null || token.isEmpty()) { - return; - } - - if (secret != null && !secret.isEmpty()) { - Long timestamp = System.currentTimeMillis(); - String stringToSign = timestamp + "\n" + secret; - Mac mac = Mac.getInstance("HmacSHA256"); - mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); - byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); - String sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8"); - token += "×tamp=" + timestamp + "&sign=" + sign; - Log.i(TAG, "token:" + token); - } - - Map textMsgMap = new HashMap(); - textMsgMap.put("msgtype", "text"); - Map textText = new HashMap(); - textText.put("content", content); - textMsgMap.put("text", textText); - if (atMobiles != null || atAll != null) { - Map AtMap = new HashMap(); - if (atMobiles != null) { - String[] atMobilesArray = atMobiles.split(","); - List atMobilesList = new ArrayList<>(); - for (String atMobile : atMobilesArray - ) { - if (TextUtils.isDigitsOnly(atMobile)) { - atMobilesList.add(atMobile); - } - } - if (!atMobilesList.isEmpty()) { - AtMap.put("atMobiles", atMobilesList); - - } - } - - AtMap.put("isAtAll", false); - if (atAll != null) { - AtMap.put("isAtAll", atAll); - - } - - textMsgMap.put("at", AtMap); - } - - final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + token; - Log.i(TAG, "requestUrl:" + requestUrl); - final String requestMsg = JSON.toJSONString(textMsgMap); - Log.i(TAG, "requestMsg:" + requestMsg); - - Observable - .create((ObservableEmitter emitter) -> { - Toast(handError, TAG, "开始请求接口..."); - - OkHttpClient client = new OkHttpClient(); - RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); - - final Request request = new Request.Builder() - .url(requestUrl) - .addHeader("Content-Type", "application/json; charset=utf-8") - .post(requestBody) - .build(); - Call call = client.newCall(request); - call.enqueue(new Callback() { - @Override - public void onFailure(@NonNull Call call, @NonNull final IOException e) { - LogUtil.updateLog(logId, 0, e.getMessage()); - Toast(handError, TAG, "发送失败:" + e.getMessage()); - emitter.onError(new RuntimeException("请求接口异常...")); - } - - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { - final String responseStr = Objects.requireNonNull(response.body()).string(); - Log.d(TAG, "Response:" + response.code() + "," + responseStr); - Toast(handError, TAG, "发送状态:" + responseStr); - - //TODO:粗略解析是否发送成功 - if (responseStr.contains("\"errcode\":0")) { - LogUtil.updateLog(logId, 1, responseStr); - } else { - LogUtil.updateLog(logId, 0, responseStr); - } - } - }); - - }).retryWhen((Observable errorObservable) -> errorObservable - .zipWith(Observable.just( - SettingUtil.getRetryDelayTime(1), - SettingUtil.getRetryDelayTime(2), - SettingUtil.getRetryDelayTime(3), - SettingUtil.getRetryDelayTime(4), - SettingUtil.getRetryDelayTime(5) - ), (Throwable e, Integer time) -> time) - .flatMap((Integer delay) -> { - Toast(handError, TAG, "请求接口异常," + delay + "秒后重试"); - return Observable.timer(delay, TimeUnit.SECONDS); - })) - .subscribe(System.out::println); - } - - -} +package com.idormy.sms.forwarder.sender; + +import android.os.Handler; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.alibaba.fastjson.JSON; +import com.idormy.sms.forwarder.utils.LogUtil; +import com.idormy.sms.forwarder.utils.SettingUtil; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableEmitter; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"}) +public class SenderDingdingMsg extends SenderBaseMsg { + + static final String TAG = "SenderDingdingMsg"; + + public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception { + Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " content:" + content); + + if (token == null || token.isEmpty()) { + return; + } + + if (secret != null && !secret.isEmpty()) { + Long timestamp = System.currentTimeMillis(); + String stringToSign = timestamp + "\n" + secret; + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); + String sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8"); + token += "×tamp=" + timestamp + "&sign=" + sign; + Log.i(TAG, "token:" + token); + } + + Map textMsgMap = new HashMap(); + textMsgMap.put("msgtype", "text"); + Map textText = new HashMap(); + textText.put("content", content); + textMsgMap.put("text", textText); + if (atMobiles != null || atAll != null) { + Map AtMap = new HashMap(); + if (atMobiles != null) { + String[] atMobilesArray = atMobiles.split(","); + List atMobilesList = new ArrayList<>(); + for (String atMobile : atMobilesArray + ) { + if (TextUtils.isDigitsOnly(atMobile)) { + atMobilesList.add(atMobile); + } + } + if (!atMobilesList.isEmpty()) { + AtMap.put("atMobiles", atMobilesList); + } + } + + AtMap.put("isAtAll", false); + if (atAll != null) { + AtMap.put("isAtAll", atAll); + } + + textMsgMap.put("at", AtMap); + } + + final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + token; + Log.i(TAG, "requestUrl:" + requestUrl); + final String requestMsg = JSON.toJSONString(textMsgMap); + Log.i(TAG, "requestMsg:" + requestMsg); + + Observable + .create((ObservableEmitter emitter) -> { + Toast(handError, TAG, "开始请求接口..."); + + OkHttpClient client = new OkHttpClient(); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); + + final Request request = new Request.Builder() + .url(requestUrl) + .addHeader("Content-Type", "application/json; charset=utf-8") + .post(requestBody) + .build(); + Call call = client.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(@NonNull Call call, @NonNull final IOException e) { + LogUtil.updateLog(logId, 0, e.getMessage()); + Toast(handError, TAG, "发送失败:" + e.getMessage()); + emitter.onError(new RuntimeException("请求接口异常...")); + } + + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + final String responseStr = Objects.requireNonNull(response.body()).string(); + Log.d(TAG, "Response:" + response.code() + "," + responseStr); + Toast(handError, TAG, "发送状态:" + responseStr); + + //TODO:粗略解析是否发送成功 + if (responseStr.contains("\"errcode\":0")) { + LogUtil.updateLog(logId, 1, responseStr); + } else { + LogUtil.updateLog(logId, 0, responseStr); + } + } + }); + + }).retryWhen((Observable errorObservable) -> errorObservable + .zipWith(Observable.just( + SettingUtil.getRetryDelayTime(1), + SettingUtil.getRetryDelayTime(2), + SettingUtil.getRetryDelayTime(3), + SettingUtil.getRetryDelayTime(4), + SettingUtil.getRetryDelayTime(5) + ), (Throwable e, Integer time) -> time) + .flatMap((Integer delay) -> { + Toast(handError, TAG, "请求接口异常," + delay + "秒后重试"); + return Observable.timer(delay, TimeUnit.SECONDS); + })) + .subscribe(System.out::println); + } + + +} diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml new file mode 100644 index 00000000..1f5cba54 --- /dev/null +++ b/app/src/main/res/drawable/ic_help.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index b7f5bb4d..fc7edae6 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -27,4 +27,10 @@ android:title="@string/about" android:icon="@drawable/ic_forwarder" app:showAsAction="never" /> + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 42e1a975..89012d07 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -12,6 +12,7 @@ Clone Settings Settings About + Help Rule Setting Sender Setting App List diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0267b763..cc1ec0fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,7 @@ 一键克隆 通用设置 关于软件 + 使用帮助 转发规则 发送通道 应用列表 @@ -159,11 +160,11 @@ 转发时附加卡槽信息 转发时附加设备名称 转发短信广播 - 总开关,请授予读取短信、通知类短信、发送短信等权限,开启后需添加转发规则 + 总开关,请授予读取短信、通知类短信、发送短信等权限 转发未接来电 - 总开关,请授予读取通话记录、联系人等权限,开启后需添加转发规则 + 总开关,请授予读取通话记录、联系人等权限 转发应用通知 - 总开关,请先授予通知使用权,开启后需添加转发规则 + 总开关,请先授予通知使用权 启用自定义模版 全局自定义模版,如果添加转发规则再次定义,则优先取转发规则的 不在最近任务列表中显示